]> git.proxmox.com Git - mirror_qemu.git/blame - target/i386/cpu.c
target/i386: Restrict 'qapi-commands-machine.h' to system emulation
[mirror_qemu.git] / target / i386 / cpu.c
CommitLineData
c6dc6f63 1/*
79f1a68a 2 * i386 CPUID, CPU class, definitions, models
c6dc6f63
AP
3 *
4 * Copyright (c) 2003 Fabrice Bellard
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
d9ff33ad 9 * version 2.1 of the License, or (at your option) any later version.
c6dc6f63
AP
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 */
e688df6b 19
1ef26b1f 20#include "qemu/osdep.h"
6a4e0614 21#include "qemu/units.h"
f348b6d1 22#include "qemu/cutils.h"
0442428a 23#include "qemu/qemu-print.h"
15e09912 24#include "qemu/hw-version.h"
c6dc6f63 25#include "cpu.h"
ed69e831 26#include "tcg/helper-tcg.h"
71e8a915 27#include "sysemu/reset.h"
d6dcc558 28#include "sysemu/hvf.h"
a9dc68d9 29#include "kvm/kvm_i386.h"
93777de3 30#include "sev.h"
f83aeeae 31#include "qapi/error.h"
8ac25c84 32#include "qapi/qapi-visit-machine.h"
7b1b5d19 33#include "qapi/qmp/qerror.h"
1814eab6 34#include "standard-headers/asm-x86/kvm_para.h"
53a89e26 35#include "hw/qdev-properties.h"
5232d00a 36#include "hw/i386/topology.h"
bdeec802 37#ifndef CONFIG_USER_ONLY
390dbc6e 38#include "qapi/qapi-commands-machine-target.h"
2001d0cd 39#include "exec/address-spaces.h"
0e11fc69 40#include "hw/boards.h"
1dec2e1f 41#include "hw/i386/sgx-epc.h"
bdeec802
IM
42#endif
43
b666d2a4 44#include "disas/capstone.h"
79f1a68a 45#include "cpu-internal.h"
b666d2a4 46
7e3482f8
EH
47/* Helpers for building CPUID[2] descriptors: */
48
49struct CPUID2CacheDescriptorInfo {
50 enum CacheType type;
51 int level;
52 int size;
53 int line_size;
54 int associativity;
55};
5e891bf8 56
7e3482f8
EH
57/*
58 * Known CPUID 2 cache descriptors.
59 * From Intel SDM Volume 2A, CPUID instruction
60 */
61struct CPUID2CacheDescriptorInfo cpuid2_cache_descriptors[] = {
5f00335a 62 [0x06] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 8 * KiB,
7e3482f8 63 .associativity = 4, .line_size = 32, },
5f00335a 64 [0x08] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 16 * KiB,
7e3482f8 65 .associativity = 4, .line_size = 32, },
5f00335a 66 [0x09] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 32 * KiB,
7e3482f8 67 .associativity = 4, .line_size = 64, },
5f00335a 68 [0x0A] = { .level = 1, .type = DATA_CACHE, .size = 8 * KiB,
7e3482f8 69 .associativity = 2, .line_size = 32, },
5f00335a 70 [0x0C] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
7e3482f8 71 .associativity = 4, .line_size = 32, },
5f00335a 72 [0x0D] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
7e3482f8 73 .associativity = 4, .line_size = 64, },
5f00335a 74 [0x0E] = { .level = 1, .type = DATA_CACHE, .size = 24 * KiB,
7e3482f8 75 .associativity = 6, .line_size = 64, },
5f00335a 76 [0x1D] = { .level = 2, .type = UNIFIED_CACHE, .size = 128 * KiB,
7e3482f8 77 .associativity = 2, .line_size = 64, },
5f00335a 78 [0x21] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
7e3482f8
EH
79 .associativity = 8, .line_size = 64, },
80 /* lines per sector is not supported cpuid2_cache_descriptor(),
81 * so descriptors 0x22, 0x23 are not included
82 */
5f00335a 83 [0x24] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
7e3482f8
EH
84 .associativity = 16, .line_size = 64, },
85 /* lines per sector is not supported cpuid2_cache_descriptor(),
86 * so descriptors 0x25, 0x20 are not included
87 */
5f00335a 88 [0x2C] = { .level = 1, .type = DATA_CACHE, .size = 32 * KiB,
7e3482f8 89 .associativity = 8, .line_size = 64, },
5f00335a 90 [0x30] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 32 * KiB,
7e3482f8 91 .associativity = 8, .line_size = 64, },
5f00335a 92 [0x41] = { .level = 2, .type = UNIFIED_CACHE, .size = 128 * KiB,
7e3482f8 93 .associativity = 4, .line_size = 32, },
5f00335a 94 [0x42] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
7e3482f8 95 .associativity = 4, .line_size = 32, },
5f00335a 96 [0x43] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
7e3482f8 97 .associativity = 4, .line_size = 32, },
5f00335a 98 [0x44] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
7e3482f8 99 .associativity = 4, .line_size = 32, },
5f00335a 100 [0x45] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
7e3482f8 101 .associativity = 4, .line_size = 32, },
5f00335a 102 [0x46] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
7e3482f8 103 .associativity = 4, .line_size = 64, },
5f00335a 104 [0x47] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
7e3482f8 105 .associativity = 8, .line_size = 64, },
5f00335a 106 [0x48] = { .level = 2, .type = UNIFIED_CACHE, .size = 3 * MiB,
7e3482f8
EH
107 .associativity = 12, .line_size = 64, },
108 /* Descriptor 0x49 depends on CPU family/model, so it is not included */
5f00335a 109 [0x4A] = { .level = 3, .type = UNIFIED_CACHE, .size = 6 * MiB,
7e3482f8 110 .associativity = 12, .line_size = 64, },
5f00335a 111 [0x4B] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
7e3482f8 112 .associativity = 16, .line_size = 64, },
5f00335a 113 [0x4C] = { .level = 3, .type = UNIFIED_CACHE, .size = 12 * MiB,
7e3482f8 114 .associativity = 12, .line_size = 64, },
5f00335a 115 [0x4D] = { .level = 3, .type = UNIFIED_CACHE, .size = 16 * MiB,
7e3482f8 116 .associativity = 16, .line_size = 64, },
5f00335a 117 [0x4E] = { .level = 2, .type = UNIFIED_CACHE, .size = 6 * MiB,
7e3482f8 118 .associativity = 24, .line_size = 64, },
5f00335a 119 [0x60] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
7e3482f8 120 .associativity = 8, .line_size = 64, },
5f00335a 121 [0x66] = { .level = 1, .type = DATA_CACHE, .size = 8 * KiB,
7e3482f8 122 .associativity = 4, .line_size = 64, },
5f00335a 123 [0x67] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
7e3482f8 124 .associativity = 4, .line_size = 64, },
5f00335a 125 [0x68] = { .level = 1, .type = DATA_CACHE, .size = 32 * KiB,
7e3482f8 126 .associativity = 4, .line_size = 64, },
5f00335a 127 [0x78] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
7e3482f8
EH
128 .associativity = 4, .line_size = 64, },
129 /* lines per sector is not supported cpuid2_cache_descriptor(),
130 * so descriptors 0x79, 0x7A, 0x7B, 0x7C are not included.
131 */
5f00335a 132 [0x7D] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
7e3482f8 133 .associativity = 8, .line_size = 64, },
5f00335a 134 [0x7F] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
7e3482f8 135 .associativity = 2, .line_size = 64, },
5f00335a 136 [0x80] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
7e3482f8 137 .associativity = 8, .line_size = 64, },
5f00335a 138 [0x82] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
7e3482f8 139 .associativity = 8, .line_size = 32, },
5f00335a 140 [0x83] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
7e3482f8 141 .associativity = 8, .line_size = 32, },
5f00335a 142 [0x84] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
7e3482f8 143 .associativity = 8, .line_size = 32, },
5f00335a 144 [0x85] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
7e3482f8 145 .associativity = 8, .line_size = 32, },
5f00335a 146 [0x86] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
7e3482f8 147 .associativity = 4, .line_size = 64, },
5f00335a 148 [0x87] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
7e3482f8 149 .associativity = 8, .line_size = 64, },
5f00335a 150 [0xD0] = { .level = 3, .type = UNIFIED_CACHE, .size = 512 * KiB,
7e3482f8 151 .associativity = 4, .line_size = 64, },
5f00335a 152 [0xD1] = { .level = 3, .type = UNIFIED_CACHE, .size = 1 * MiB,
7e3482f8 153 .associativity = 4, .line_size = 64, },
5f00335a 154 [0xD2] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
7e3482f8 155 .associativity = 4, .line_size = 64, },
5f00335a 156 [0xD6] = { .level = 3, .type = UNIFIED_CACHE, .size = 1 * MiB,
7e3482f8 157 .associativity = 8, .line_size = 64, },
5f00335a 158 [0xD7] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
7e3482f8 159 .associativity = 8, .line_size = 64, },
5f00335a 160 [0xD8] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
7e3482f8 161 .associativity = 8, .line_size = 64, },
5f00335a 162 [0xDC] = { .level = 3, .type = UNIFIED_CACHE, .size = 1.5 * MiB,
7e3482f8 163 .associativity = 12, .line_size = 64, },
5f00335a 164 [0xDD] = { .level = 3, .type = UNIFIED_CACHE, .size = 3 * MiB,
7e3482f8 165 .associativity = 12, .line_size = 64, },
5f00335a 166 [0xDE] = { .level = 3, .type = UNIFIED_CACHE, .size = 6 * MiB,
7e3482f8 167 .associativity = 12, .line_size = 64, },
5f00335a 168 [0xE2] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
7e3482f8 169 .associativity = 16, .line_size = 64, },
5f00335a 170 [0xE3] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
7e3482f8 171 .associativity = 16, .line_size = 64, },
5f00335a 172 [0xE4] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
7e3482f8 173 .associativity = 16, .line_size = 64, },
5f00335a 174 [0xEA] = { .level = 3, .type = UNIFIED_CACHE, .size = 12 * MiB,
7e3482f8 175 .associativity = 24, .line_size = 64, },
5f00335a 176 [0xEB] = { .level = 3, .type = UNIFIED_CACHE, .size = 18 * MiB,
7e3482f8 177 .associativity = 24, .line_size = 64, },
5f00335a 178 [0xEC] = { .level = 3, .type = UNIFIED_CACHE, .size = 24 * MiB,
7e3482f8
EH
179 .associativity = 24, .line_size = 64, },
180};
181
182/*
183 * "CPUID leaf 2 does not report cache descriptor information,
184 * use CPUID leaf 4 to query cache parameters"
185 */
186#define CACHE_DESCRIPTOR_UNAVAILABLE 0xFF
5e891bf8 187
7e3482f8
EH
188/*
189 * Return a CPUID 2 cache descriptor for a given cache.
190 * If no known descriptor is found, return CACHE_DESCRIPTOR_UNAVAILABLE
191 */
192static uint8_t cpuid2_cache_descriptor(CPUCacheInfo *cache)
193{
194 int i;
195
196 assert(cache->size > 0);
197 assert(cache->level > 0);
198 assert(cache->line_size > 0);
199 assert(cache->associativity > 0);
200 for (i = 0; i < ARRAY_SIZE(cpuid2_cache_descriptors); i++) {
201 struct CPUID2CacheDescriptorInfo *d = &cpuid2_cache_descriptors[i];
202 if (d->level == cache->level && d->type == cache->type &&
203 d->size == cache->size && d->line_size == cache->line_size &&
204 d->associativity == cache->associativity) {
205 return i;
206 }
207 }
5e891bf8 208
7e3482f8
EH
209 return CACHE_DESCRIPTOR_UNAVAILABLE;
210}
5e891bf8
EH
211
212/* CPUID Leaf 4 constants: */
213
214/* EAX: */
7e3482f8
EH
215#define CACHE_TYPE_D 1
216#define CACHE_TYPE_I 2
217#define CACHE_TYPE_UNIFIED 3
5e891bf8 218
7e3482f8 219#define CACHE_LEVEL(l) (l << 5)
5e891bf8 220
7e3482f8 221#define CACHE_SELF_INIT_LEVEL (1 << 8)
5e891bf8
EH
222
223/* EDX: */
7e3482f8
EH
224#define CACHE_NO_INVD_SHARING (1 << 0)
225#define CACHE_INCLUSIVE (1 << 1)
226#define CACHE_COMPLEX_IDX (1 << 2)
227
228/* Encode CacheType for CPUID[4].EAX */
5f00335a
EH
229#define CACHE_TYPE(t) (((t) == DATA_CACHE) ? CACHE_TYPE_D : \
230 ((t) == INSTRUCTION_CACHE) ? CACHE_TYPE_I : \
231 ((t) == UNIFIED_CACHE) ? CACHE_TYPE_UNIFIED : \
232 0 /* Invalid value */)
7e3482f8
EH
233
234
235/* Encode cache info for CPUID[4] */
236static void encode_cache_cpuid4(CPUCacheInfo *cache,
237 int num_apic_ids, int num_cores,
238 uint32_t *eax, uint32_t *ebx,
239 uint32_t *ecx, uint32_t *edx)
240{
241 assert(cache->size == cache->line_size * cache->associativity *
242 cache->partitions * cache->sets);
243
244 assert(num_apic_ids > 0);
245 *eax = CACHE_TYPE(cache->type) |
246 CACHE_LEVEL(cache->level) |
247 (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0) |
248 ((num_cores - 1) << 26) |
249 ((num_apic_ids - 1) << 14);
250
251 assert(cache->line_size > 0);
252 assert(cache->partitions > 0);
253 assert(cache->associativity > 0);
254 /* We don't implement fully-associative caches */
255 assert(cache->associativity < cache->sets);
256 *ebx = (cache->line_size - 1) |
257 ((cache->partitions - 1) << 12) |
258 ((cache->associativity - 1) << 22);
259
260 assert(cache->sets > 0);
261 *ecx = cache->sets - 1;
262
263 *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
264 (cache->inclusive ? CACHE_INCLUSIVE : 0) |
265 (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
266}
267
268/* Encode cache info for CPUID[0x80000005].ECX or CPUID[0x80000005].EDX */
269static uint32_t encode_cache_cpuid80000005(CPUCacheInfo *cache)
270{
271 assert(cache->size % 1024 == 0);
272 assert(cache->lines_per_tag > 0);
273 assert(cache->associativity > 0);
274 assert(cache->line_size > 0);
275 return ((cache->size / 1024) << 24) | (cache->associativity << 16) |
276 (cache->lines_per_tag << 8) | (cache->line_size);
277}
5e891bf8
EH
278
279#define ASSOC_FULL 0xFF
280
281/* AMD associativity encoding used on CPUID Leaf 0x80000006: */
282#define AMD_ENC_ASSOC(a) (a <= 1 ? a : \
283 a == 2 ? 0x2 : \
284 a == 4 ? 0x4 : \
285 a == 8 ? 0x6 : \
286 a == 16 ? 0x8 : \
287 a == 32 ? 0xA : \
288 a == 48 ? 0xB : \
289 a == 64 ? 0xC : \
290 a == 96 ? 0xD : \
291 a == 128 ? 0xE : \
292 a == ASSOC_FULL ? 0xF : \
293 0 /* invalid value */)
294
7e3482f8
EH
295/*
296 * Encode cache info for CPUID[0x80000006].ECX and CPUID[0x80000006].EDX
297 * @l3 can be NULL.
298 */
299static void encode_cache_cpuid80000006(CPUCacheInfo *l2,
300 CPUCacheInfo *l3,
301 uint32_t *ecx, uint32_t *edx)
302{
303 assert(l2->size % 1024 == 0);
304 assert(l2->associativity > 0);
305 assert(l2->lines_per_tag > 0);
306 assert(l2->line_size > 0);
307 *ecx = ((l2->size / 1024) << 16) |
308 (AMD_ENC_ASSOC(l2->associativity) << 12) |
309 (l2->lines_per_tag << 8) | (l2->line_size);
310
311 if (l3) {
312 assert(l3->size % (512 * 1024) == 0);
313 assert(l3->associativity > 0);
314 assert(l3->lines_per_tag > 0);
315 assert(l3->line_size > 0);
316 *edx = ((l3->size / (512 * 1024)) << 18) |
317 (AMD_ENC_ASSOC(l3->associativity) << 12) |
318 (l3->lines_per_tag << 8) | (l3->line_size);
319 } else {
320 *edx = 0;
321 }
322}
5e891bf8 323
8f4202fb 324/* Encode cache info for CPUID[8000001D] */
2f084d1e
BM
325static void encode_cache_cpuid8000001d(CPUCacheInfo *cache,
326 X86CPUTopoInfo *topo_info,
327 uint32_t *eax, uint32_t *ebx,
328 uint32_t *ecx, uint32_t *edx)
8f4202fb 329{
2f084d1e 330 uint32_t l3_threads;
8f4202fb
BM
331 assert(cache->size == cache->line_size * cache->associativity *
332 cache->partitions * cache->sets);
333
334 *eax = CACHE_TYPE(cache->type) | CACHE_LEVEL(cache->level) |
335 (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0);
336
337 /* L3 is shared among multiple cores */
338 if (cache->level == 3) {
2f084d1e
BM
339 l3_threads = topo_info->cores_per_die * topo_info->threads_per_core;
340 *eax |= (l3_threads - 1) << 14;
8f4202fb 341 } else {
2f084d1e 342 *eax |= ((topo_info->threads_per_core - 1) << 14);
8f4202fb
BM
343 }
344
345 assert(cache->line_size > 0);
346 assert(cache->partitions > 0);
347 assert(cache->associativity > 0);
348 /* We don't implement fully-associative caches */
349 assert(cache->associativity < cache->sets);
350 *ebx = (cache->line_size - 1) |
351 ((cache->partitions - 1) << 12) |
352 ((cache->associativity - 1) << 22);
353
354 assert(cache->sets > 0);
355 *ecx = cache->sets - 1;
356
357 *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
358 (cache->inclusive ? CACHE_INCLUSIVE : 0) |
359 (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
360}
361
ed78467a 362/* Encode cache info for CPUID[8000001E] */
31ada106
BM
363static void encode_topo_cpuid8000001e(X86CPU *cpu, X86CPUTopoInfo *topo_info,
364 uint32_t *eax, uint32_t *ebx,
365 uint32_t *ecx, uint32_t *edx)
ed78467a 366{
31ada106
BM
367 X86CPUTopoIDs topo_ids;
368
369 x86_topo_ids_from_apicid(cpu->apic_id, topo_info, &topo_ids);
ed78467a 370
ed78467a 371 *eax = cpu->apic_id;
31ada106 372
ed78467a 373 /*
31ada106
BM
374 * CPUID_Fn8000001E_EBX [Core Identifiers] (CoreId)
375 * Read-only. Reset: 0000_XXXXh.
376 * See Core::X86::Cpuid::ExtApicId.
377 * Core::X86::Cpuid::CoreId_lthree[1:0]_core[3:0]_thread[1:0];
378 * Bits Description
379 * 31:16 Reserved.
380 * 15:8 ThreadsPerCore: threads per core. Read-only. Reset: XXh.
381 * The number of threads per core is ThreadsPerCore+1.
382 * 7:0 CoreId: core ID. Read-only. Reset: XXh.
383 *
384 * NOTE: CoreId is already part of apic_id. Just use it. We can
385 * use all the 8 bits to represent the core_id here.
ed78467a 386 */
31ada106
BM
387 *ebx = ((topo_info->threads_per_core - 1) << 8) | (topo_ids.core_id & 0xFF);
388
ed78467a 389 /*
31ada106
BM
390 * CPUID_Fn8000001E_ECX [Node Identifiers] (NodeId)
391 * Read-only. Reset: 0000_0XXXh.
392 * Core::X86::Cpuid::NodeId_lthree[1:0]_core[3:0]_thread[1:0];
393 * Bits Description
394 * 31:11 Reserved.
395 * 10:8 NodesPerProcessor: Node per processor. Read-only. Reset: XXXb.
396 * ValidValues:
397 * Value Description
398 * 000b 1 node per processor.
399 * 001b 2 nodes per processor.
400 * 010b Reserved.
401 * 011b 4 nodes per processor.
402 * 111b-100b Reserved.
403 * 7:0 NodeId: Node ID. Read-only. Reset: XXh.
404 *
405 * NOTE: Hardware reserves 3 bits for number of nodes per processor.
406 * But users can create more nodes than the actual hardware can
407 * support. To genaralize we can use all the upper 8 bits for nodes.
408 * NodeId is combination of node and socket_id which is already decoded
409 * in apic_id. Just use it by shifting.
ed78467a 410 */
31ada106
BM
411 *ecx = ((topo_info->dies_per_pkg - 1) << 8) |
412 ((cpu->apic_id >> apicid_die_offset(topo_info)) & 0xFF);
413
ed78467a
BM
414 *edx = 0;
415}
416
ab8f992e
BM
417/*
418 * Definitions of the hardcoded cache entries we expose:
419 * These are legacy cache values. If there is a need to change any
420 * of these values please use builtin_x86_defs
421 */
5e891bf8
EH
422
423/* L1 data cache: */
ab8f992e 424static CPUCacheInfo legacy_l1d_cache = {
5f00335a 425 .type = DATA_CACHE,
7e3482f8
EH
426 .level = 1,
427 .size = 32 * KiB,
428 .self_init = 1,
429 .line_size = 64,
430 .associativity = 8,
431 .sets = 64,
432 .partitions = 1,
433 .no_invd_sharing = true,
434};
435
5e891bf8 436/*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
ab8f992e 437static CPUCacheInfo legacy_l1d_cache_amd = {
5f00335a 438 .type = DATA_CACHE,
7e3482f8
EH
439 .level = 1,
440 .size = 64 * KiB,
441 .self_init = 1,
442 .line_size = 64,
443 .associativity = 2,
444 .sets = 512,
445 .partitions = 1,
446 .lines_per_tag = 1,
447 .no_invd_sharing = true,
448};
5e891bf8
EH
449
450/* L1 instruction cache: */
ab8f992e 451static CPUCacheInfo legacy_l1i_cache = {
5f00335a 452 .type = INSTRUCTION_CACHE,
7e3482f8
EH
453 .level = 1,
454 .size = 32 * KiB,
455 .self_init = 1,
456 .line_size = 64,
457 .associativity = 8,
458 .sets = 64,
459 .partitions = 1,
460 .no_invd_sharing = true,
461};
462
5e891bf8 463/*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
ab8f992e 464static CPUCacheInfo legacy_l1i_cache_amd = {
5f00335a 465 .type = INSTRUCTION_CACHE,
7e3482f8
EH
466 .level = 1,
467 .size = 64 * KiB,
468 .self_init = 1,
469 .line_size = 64,
470 .associativity = 2,
471 .sets = 512,
472 .partitions = 1,
473 .lines_per_tag = 1,
474 .no_invd_sharing = true,
475};
5e891bf8
EH
476
477/* Level 2 unified cache: */
ab8f992e 478static CPUCacheInfo legacy_l2_cache = {
7e3482f8
EH
479 .type = UNIFIED_CACHE,
480 .level = 2,
481 .size = 4 * MiB,
482 .self_init = 1,
483 .line_size = 64,
484 .associativity = 16,
485 .sets = 4096,
486 .partitions = 1,
487 .no_invd_sharing = true,
488};
489
5e891bf8 490/*FIXME: CPUID leaf 2 descriptor is inconsistent with CPUID leaf 4 */
ab8f992e 491static CPUCacheInfo legacy_l2_cache_cpuid2 = {
7e3482f8
EH
492 .type = UNIFIED_CACHE,
493 .level = 2,
494 .size = 2 * MiB,
495 .line_size = 64,
496 .associativity = 8,
497};
498
499
5e891bf8 500/*FIXME: CPUID leaf 0x80000006 is inconsistent with leaves 2 & 4 */
ab8f992e 501static CPUCacheInfo legacy_l2_cache_amd = {
7e3482f8
EH
502 .type = UNIFIED_CACHE,
503 .level = 2,
504 .size = 512 * KiB,
505 .line_size = 64,
506 .lines_per_tag = 1,
507 .associativity = 16,
508 .sets = 512,
509 .partitions = 1,
510};
5e891bf8 511
14c985cf 512/* Level 3 unified cache: */
ab8f992e 513static CPUCacheInfo legacy_l3_cache = {
7e3482f8
EH
514 .type = UNIFIED_CACHE,
515 .level = 3,
516 .size = 16 * MiB,
517 .line_size = 64,
518 .associativity = 16,
519 .sets = 16384,
520 .partitions = 1,
521 .lines_per_tag = 1,
522 .self_init = true,
523 .inclusive = true,
524 .complex_indexing = true,
525};
5e891bf8
EH
526
527/* TLB definitions: */
528
529#define L1_DTLB_2M_ASSOC 1
530#define L1_DTLB_2M_ENTRIES 255
531#define L1_DTLB_4K_ASSOC 1
532#define L1_DTLB_4K_ENTRIES 255
533
534#define L1_ITLB_2M_ASSOC 1
535#define L1_ITLB_2M_ENTRIES 255
536#define L1_ITLB_4K_ASSOC 1
537#define L1_ITLB_4K_ENTRIES 255
538
539#define L2_DTLB_2M_ASSOC 0 /* disabled */
540#define L2_DTLB_2M_ENTRIES 0 /* disabled */
541#define L2_DTLB_4K_ASSOC 4
542#define L2_DTLB_4K_ENTRIES 512
543
544#define L2_ITLB_2M_ASSOC 0 /* disabled */
545#define L2_ITLB_2M_ENTRIES 0 /* disabled */
546#define L2_ITLB_4K_ASSOC 4
547#define L2_ITLB_4K_ENTRIES 512
548
e37a5c7f
CP
549/* CPUID Leaf 0x14 constants: */
550#define INTEL_PT_MAX_SUBLEAF 0x1
551/*
552 * bit[00]: IA32_RTIT_CTL.CR3 filter can be set to 1 and IA32_RTIT_CR3_MATCH
553 * MSR can be accessed;
554 * bit[01]: Support Configurable PSB and Cycle-Accurate Mode;
555 * bit[02]: Support IP Filtering, TraceStop filtering, and preservation
556 * of Intel PT MSRs across warm reset;
557 * bit[03]: Support MTC timing packet and suppression of COFI-based packets;
558 */
559#define INTEL_PT_MINIMAL_EBX 0xf
560/*
561 * bit[00]: Tracing can be enabled with IA32_RTIT_CTL.ToPA = 1 and
562 * IA32_RTIT_OUTPUT_BASE and IA32_RTIT_OUTPUT_MASK_PTRS MSRs can be
563 * accessed;
564 * bit[01]: ToPA tables can hold any number of output entries, up to the
565 * maximum allowed by the MaskOrTableOffset field of
566 * IA32_RTIT_OUTPUT_MASK_PTRS;
567 * bit[02]: Support Single-Range Output scheme;
568 */
569#define INTEL_PT_MINIMAL_ECX 0x7
c078ca96
LK
570/* generated packets which contain IP payloads have LIP values */
571#define INTEL_PT_IP_LIP (1 << 31)
e37a5c7f
CP
572#define INTEL_PT_ADDR_RANGES_NUM 0x2 /* Number of configurable address ranges */
573#define INTEL_PT_ADDR_RANGES_NUM_MASK 0x3
574#define INTEL_PT_MTC_BITMAP (0x0249 << 16) /* Support ART(0,3,6,9) */
575#define INTEL_PT_CYCLE_BITMAP 0x1fff /* Support 0,2^(0~11) */
576#define INTEL_PT_PSB_BITMAP (0x003f << 16) /* Support 2K,4K,8K,16K,32K,64K */
5e891bf8 577
f21a4817
JL
578/* CPUID Leaf 0x1D constants: */
579#define INTEL_AMX_TILE_MAX_SUBLEAF 0x1
580#define INTEL_AMX_TOTAL_TILE_BYTES 0x2000
581#define INTEL_AMX_BYTES_PER_TILE 0x400
582#define INTEL_AMX_BYTES_PER_ROW 0x40
583#define INTEL_AMX_TILE_MAX_NAMES 0x8
584#define INTEL_AMX_TILE_MAX_ROWS 0x10
585
586/* CPUID Leaf 0x1E constants: */
587#define INTEL_AMX_TMUL_MAX_K 0x10
588#define INTEL_AMX_TMUL_MAX_N 0x40
589
f5cc5a5c
CF
590void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1,
591 uint32_t vendor2, uint32_t vendor3)
99b88a17
IM
592{
593 int i;
594 for (i = 0; i < 4; i++) {
595 dst[i] = vendor1 >> (8 * i);
596 dst[i + 4] = vendor2 >> (8 * i);
597 dst[i + 8] = vendor3 >> (8 * i);
598 }
599 dst[CPUID_VENDOR_SZ] = '\0';
600}
601
621626ce
EH
602#define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
603#define PENTIUM_FEATURES (I486_FEATURES | CPUID_DE | CPUID_TSC | \
604 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_MMX | CPUID_APIC)
605#define PENTIUM2_FEATURES (PENTIUM_FEATURES | CPUID_PAE | CPUID_SEP | \
606 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
607 CPUID_PSE36 | CPUID_FXSR)
608#define PENTIUM3_FEATURES (PENTIUM2_FEATURES | CPUID_SSE)
609#define PPRO_FEATURES (CPUID_FP87 | CPUID_DE | CPUID_PSE | CPUID_TSC | \
610 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_PGE | CPUID_CMOV | \
611 CPUID_PAT | CPUID_FXSR | CPUID_MMX | CPUID_SSE | CPUID_SSE2 | \
612 CPUID_PAE | CPUID_SEP | CPUID_APIC)
613
614#define TCG_FEATURES (CPUID_FP87 | CPUID_PSE | CPUID_TSC | CPUID_MSR | \
615 CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | CPUID_SEP | \
616 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
617 CPUID_PSE36 | CPUID_CLFLUSH | CPUID_ACPI | CPUID_MMX | \
b6c5a6f0 618 CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS | CPUID_DE)
621626ce
EH
619 /* partly implemented:
620 CPUID_MTRR, CPUID_MCA, CPUID_CLFLUSH (needed for Win64) */
621 /* missing:
622 CPUID_VME, CPUID_DTS, CPUID_SS, CPUID_HT, CPUID_TM, CPUID_PBE */
623#define TCG_EXT_FEATURES (CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | \
624 CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | \
625 CPUID_EXT_SSE41 | CPUID_EXT_SSE42 | CPUID_EXT_POPCNT | \
19dc85db 626 CPUID_EXT_XSAVE | /* CPUID_EXT_OSXSAVE is dynamic */ \
369fd5ca 627 CPUID_EXT_MOVBE | CPUID_EXT_AES | CPUID_EXT_HYPERVISOR | \
2872b0f3
PB
628 CPUID_EXT_RDRAND | CPUID_EXT_AVX | CPUID_EXT_F16C | \
629 CPUID_EXT_FMA)
621626ce
EH
630 /* missing:
631 CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_SMX,
2872b0f3 632 CPUID_EXT_EST, CPUID_EXT_TM2, CPUID_EXT_CID,
621626ce 633 CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_PCID, CPUID_EXT_DCA,
cf5ec664 634 CPUID_EXT_X2APIC, CPUID_EXT_TSC_DEADLINE_TIMER */
621626ce
EH
635
636#ifdef TARGET_X86_64
637#define TCG_EXT2_X86_64_FEATURES (CPUID_EXT2_SYSCALL | CPUID_EXT2_LM)
638#else
639#define TCG_EXT2_X86_64_FEATURES 0
640#endif
641
642#define TCG_EXT2_FEATURES ((TCG_FEATURES & CPUID_EXT2_AMD_ALIASES) | \
643 CPUID_EXT2_NX | CPUID_EXT2_MMXEXT | CPUID_EXT2_RDTSCP | \
644 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_PDPE1GB | \
645 TCG_EXT2_X86_64_FEATURES)
646#define TCG_EXT3_FEATURES (CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | \
647 CPUID_EXT3_CR8LEG | CPUID_EXT3_ABM | CPUID_EXT3_SSE4A)
648#define TCG_EXT4_FEATURES 0
900eeca5
LL
649#define TCG_SVM_FEATURES (CPUID_SVM_NPT | CPUID_SVM_VGIF | \
650 CPUID_SVM_SVME_ADDR_CHK)
621626ce
EH
651#define TCG_KVM_FEATURES 0
652#define TCG_7_0_EBX_FEATURES (CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_SMAP | \
0c47242b
XG
653 CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX | \
654 CPUID_7_0_EBX_PCOMMIT | CPUID_7_0_EBX_CLFLUSHOPT | \
7eb24386 655 CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_FSGSBASE | \
2f8a21d8 656 CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_AVX2)
621626ce 657 /* missing:
2f8a21d8 658 CPUID_7_0_EBX_HLE
7eb24386 659 CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM,
621626ce 660 CPUID_7_0_EBX_RDSEED */
637f1ee3 661#define TCG_7_0_ECX_FEATURES (CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | \
9ccb9784 662 /* CPUID_7_0_ECX_OSPKE is dynamic */ \
2f8a21d8 663 CPUID_7_0_ECX_LA57 | CPUID_7_0_ECX_PKS | CPUID_7_0_ECX_VAES)
c0728d4e 664#define TCG_7_0_EDX_FEATURES CPUID_7_0_EDX_FSRM
58794f64
PB
665#define TCG_7_1_EAX_FEATURES (CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | \
666 CPUID_7_1_EAX_FSRC)
303752a9 667#define TCG_APM_FEATURES 0
28b8e4d0 668#define TCG_6_EAX_FEATURES CPUID_6_EAX_ARAT
c9cfe8f9
RH
669#define TCG_XSAVE_FEATURES (CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XGETBV1)
670 /* missing:
671 CPUID_XSAVE_XSAVEC, CPUID_XSAVE_XSAVES */
d1615ea5 672#define TCG_14_0_ECX_FEATURES 0
4b841a79 673#define TCG_SGX_12_0_EAX_FEATURES 0
120ca112 674#define TCG_SGX_12_0_EBX_FEATURES 0
165981a5 675#define TCG_SGX_12_1_EAX_FEATURES 0
621626ce 676
79f1a68a 677FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
bffd67b0 678 [FEAT_1_EDX] = {
07585923 679 .type = CPUID_FEATURE_WORD,
2d5312da
EH
680 .feat_names = {
681 "fpu", "vme", "de", "pse",
682 "tsc", "msr", "pae", "mce",
683 "cx8", "apic", NULL, "sep",
684 "mtrr", "pge", "mca", "cmov",
685 "pat", "pse36", "pn" /* Intel psn */, "clflush" /* Intel clfsh */,
686 NULL, "ds" /* Intel dts */, "acpi", "mmx",
687 "fxsr", "sse", "sse2", "ss",
688 "ht" /* Intel htt */, "tm", "ia64", "pbe",
689 },
07585923 690 .cpuid = {.eax = 1, .reg = R_EDX, },
37ce3522 691 .tcg_features = TCG_FEATURES,
bffd67b0
EH
692 },
693 [FEAT_1_ECX] = {
07585923 694 .type = CPUID_FEATURE_WORD,
2d5312da 695 .feat_names = {
16d2fcaa 696 "pni" /* Intel,AMD sse3 */, "pclmulqdq", "dtes64", "monitor",
fc7dfd20 697 "ds-cpl", "vmx", "smx", "est",
2d5312da
EH
698 "tm2", "ssse3", "cid", NULL,
699 "fma", "cx16", "xtpr", "pdcm",
16d2fcaa
EH
700 NULL, "pcid", "dca", "sse4.1",
701 "sse4.2", "x2apic", "movbe", "popcnt",
f1a23522 702 "tsc-deadline", "aes", "xsave", NULL /* osxsave */,
2d5312da
EH
703 "avx", "f16c", "rdrand", "hypervisor",
704 },
07585923 705 .cpuid = { .eax = 1, .reg = R_ECX, },
37ce3522 706 .tcg_features = TCG_EXT_FEATURES,
bffd67b0 707 },
2d5312da
EH
708 /* Feature names that are already defined on feature_name[] but
709 * are set on CPUID[8000_0001].EDX on AMD CPUs don't have their
710 * names on feat_names below. They are copied automatically
711 * to features[FEAT_8000_0001_EDX] if and only if CPU vendor is AMD.
712 */
bffd67b0 713 [FEAT_8000_0001_EDX] = {
07585923 714 .type = CPUID_FEATURE_WORD,
2d5312da
EH
715 .feat_names = {
716 NULL /* fpu */, NULL /* vme */, NULL /* de */, NULL /* pse */,
717 NULL /* tsc */, NULL /* msr */, NULL /* pae */, NULL /* mce */,
718 NULL /* cx8 */, NULL /* apic */, NULL, "syscall",
719 NULL /* mtrr */, NULL /* pge */, NULL /* mca */, NULL /* cmov */,
720 NULL /* pat */, NULL /* pse36 */, NULL, NULL /* Linux mp */,
16d2fcaa
EH
721 "nx", NULL, "mmxext", NULL /* mmx */,
722 NULL /* fxsr */, "fxsr-opt", "pdpe1gb", "rdtscp",
723 NULL, "lm", "3dnowext", "3dnow",
2d5312da 724 },
07585923 725 .cpuid = { .eax = 0x80000001, .reg = R_EDX, },
37ce3522 726 .tcg_features = TCG_EXT2_FEATURES,
bffd67b0
EH
727 },
728 [FEAT_8000_0001_ECX] = {
07585923 729 .type = CPUID_FEATURE_WORD,
2d5312da 730 .feat_names = {
fc7dfd20 731 "lahf-lm", "cmp-legacy", "svm", "extapic",
2d5312da
EH
732 "cr8legacy", "abm", "sse4a", "misalignsse",
733 "3dnowprefetch", "osvw", "ibs", "xop",
734 "skinit", "wdt", NULL, "lwp",
fc7dfd20
EH
735 "fma4", "tce", NULL, "nodeid-msr",
736 NULL, "tbm", "topoext", "perfctr-core",
737 "perfctr-nb", NULL, NULL, NULL,
2d5312da
EH
738 NULL, NULL, NULL, NULL,
739 },
07585923 740 .cpuid = { .eax = 0x80000001, .reg = R_ECX, },
37ce3522 741 .tcg_features = TCG_EXT3_FEATURES,
7210a02c
EH
742 /*
743 * TOPOEXT is always allowed but can't be enabled blindly by
744 * "-cpu host", as it requires consistent cache topology info
745 * to be provided so it doesn't confuse guests.
746 */
747 .no_autoenable_flags = CPUID_EXT3_TOPOEXT,
bffd67b0 748 },
89e49c8b 749 [FEAT_C000_0001_EDX] = {
07585923 750 .type = CPUID_FEATURE_WORD,
2d5312da
EH
751 .feat_names = {
752 NULL, NULL, "xstore", "xstore-en",
753 NULL, NULL, "xcrypt", "xcrypt-en",
754 "ace2", "ace2-en", "phe", "phe-en",
755 "pmm", "pmm-en", NULL, NULL,
756 NULL, NULL, NULL, NULL,
757 NULL, NULL, NULL, NULL,
758 NULL, NULL, NULL, NULL,
759 NULL, NULL, NULL, NULL,
760 },
07585923 761 .cpuid = { .eax = 0xC0000001, .reg = R_EDX, },
37ce3522 762 .tcg_features = TCG_EXT4_FEATURES,
89e49c8b 763 },
bffd67b0 764 [FEAT_KVM] = {
07585923 765 .type = CPUID_FEATURE_WORD,
2d5312da 766 .feat_names = {
fc7dfd20
EH
767 "kvmclock", "kvm-nopiodelay", "kvm-mmu", "kvmclock",
768 "kvm-asyncpf", "kvm-steal-time", "kvm-pv-eoi", "kvm-pv-unhalt",
7f710c32 769 NULL, "kvm-pv-tlb-flush", NULL, "kvm-pv-ipi",
c1bb5418 770 "kvm-poll-control", "kvm-pv-sched-yield", "kvm-asyncpf-int", "kvm-msi-ext-dest-id",
2d5312da
EH
771 NULL, NULL, NULL, NULL,
772 NULL, NULL, NULL, NULL,
773 "kvmclock-stable-bit", NULL, NULL, NULL,
774 NULL, NULL, NULL, NULL,
775 },
07585923 776 .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EAX, },
37ce3522 777 .tcg_features = TCG_KVM_FEATURES,
bffd67b0 778 },
be777326 779 [FEAT_KVM_HINTS] = {
07585923 780 .type = CPUID_FEATURE_WORD,
be777326
WL
781 .feat_names = {
782 "kvm-hint-dedicated", NULL, NULL, NULL,
783 NULL, NULL, NULL, NULL,
784 NULL, NULL, NULL, NULL,
785 NULL, NULL, NULL, NULL,
786 NULL, NULL, NULL, NULL,
787 NULL, NULL, NULL, NULL,
788 NULL, NULL, NULL, NULL,
789 NULL, NULL, NULL, NULL,
790 },
07585923 791 .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EDX, },
be777326 792 .tcg_features = TCG_KVM_FEATURES,
0d914f39
EH
793 /*
794 * KVM hints aren't auto-enabled by -cpu host, they need to be
795 * explicitly enabled in the command-line.
796 */
797 .no_autoenable_flags = ~0U,
be777326 798 },
bffd67b0 799 [FEAT_SVM] = {
07585923 800 .type = CPUID_FEATURE_WORD,
2d5312da 801 .feat_names = {
fc7dfd20
EH
802 "npt", "lbrv", "svm-lock", "nrip-save",
803 "tsc-scale", "vmcb-clean", "flushbyasid", "decodeassists",
804 NULL, NULL, "pause-filter", NULL,
5447089c
WH
805 "pfthreshold", "avic", NULL, "v-vmsave-vmload",
806 "vgif", NULL, NULL, NULL,
2d5312da
EH
807 NULL, NULL, NULL, NULL,
808 NULL, NULL, NULL, NULL,
5447089c 809 "svme-addr-chk", NULL, NULL, NULL,
2d5312da 810 },
07585923 811 .cpuid = { .eax = 0x8000000A, .reg = R_EDX, },
37ce3522 812 .tcg_features = TCG_SVM_FEATURES,
bffd67b0
EH
813 },
814 [FEAT_7_0_EBX] = {
07585923 815 .type = CPUID_FEATURE_WORD,
2d5312da 816 .feat_names = {
5c76b651 817 "fsgsbase", "tsc-adjust", "sgx", "bmi1",
2d5312da
EH
818 "hle", "avx2", NULL, "smep",
819 "bmi2", "erms", "invpcid", "rtm",
820 NULL, NULL, "mpx", NULL,
821 "avx512f", "avx512dq", "rdseed", "adx",
822 "smap", "avx512ifma", "pcommit", "clflushopt",
e37a5c7f 823 "clwb", "intel-pt", "avx512pf", "avx512er",
638cbd45 824 "avx512cd", "sha-ni", "avx512bw", "avx512vl",
2d5312da 825 },
07585923
RH
826 .cpuid = {
827 .eax = 7,
828 .needs_ecx = true, .ecx = 0,
829 .reg = R_EBX,
830 },
37ce3522 831 .tcg_features = TCG_7_0_EBX_FEATURES,
bffd67b0 832 },
f74eefe0 833 [FEAT_7_0_ECX] = {
07585923 834 .type = CPUID_FEATURE_WORD,
2d5312da
EH
835 .feat_names = {
836 NULL, "avx512vbmi", "umip", "pku",
67192a29 837 NULL /* ospke */, "waitpkg", "avx512vbmi2", NULL,
aff9e6e4
YZ
838 "gfni", "vaes", "vpclmulqdq", "avx512vnni",
839 "avx512bitalg", NULL, "avx512-vpopcntdq", NULL,
6c7c3c21 840 "la57", NULL, NULL, NULL,
2d5312da 841 NULL, NULL, "rdpid", NULL,
06e878b4 842 "bus-lock-detect", "cldemote", NULL, "movdiri",
5c76b651 843 "movdir64b", NULL, "sgxlc", "pks",
2d5312da 844 },
07585923
RH
845 .cpuid = {
846 .eax = 7,
847 .needs_ecx = true, .ecx = 0,
848 .reg = R_ECX,
849 },
f74eefe0
HH
850 .tcg_features = TCG_7_0_ECX_FEATURES,
851 },
95ea69fb 852 [FEAT_7_0_EDX] = {
07585923 853 .type = CPUID_FEATURE_WORD,
95ea69fb
LK
854 .feat_names = {
855 NULL, NULL, "avx512-4vnniw", "avx512-4fmaps",
5cb287d2 856 "fsrm", NULL, NULL, NULL,
353f98c9 857 "avx512-vp2intersect", NULL, "md-clear", NULL,
5dd13f2a 858 NULL, NULL, "serialize", NULL,
c3c67679 859 "tsx-ldtrk", NULL, NULL /* pconfig */, "arch-lbr",
f21a4817
JL
860 NULL, NULL, "amx-bf16", "avx512-fp16",
861 "amx-tile", "amx-int8", "spec-ctrl", "stibp",
597360c0 862 NULL, "arch-capabilities", "core-capability", "ssbd",
95ea69fb 863 },
07585923
RH
864 .cpuid = {
865 .eax = 7,
866 .needs_ecx = true, .ecx = 0,
867 .reg = R_EDX,
868 },
95ea69fb
LK
869 .tcg_features = TCG_7_0_EDX_FEATURES,
870 },
80db491d
JL
871 [FEAT_7_1_EAX] = {
872 .type = CPUID_FEATURE_WORD,
873 .feat_names = {
874 NULL, NULL, NULL, NULL,
c1826ea6 875 "avx-vnni", "avx512-bf16", NULL, NULL,
58794f64
PB
876 NULL, NULL, "fzrm", "fsrs",
877 "fsrc", NULL, NULL, NULL,
80db491d
JL
878 NULL, NULL, NULL, NULL,
879 NULL, NULL, NULL, NULL,
880 NULL, NULL, NULL, NULL,
881 NULL, NULL, NULL, NULL,
882 },
883 .cpuid = {
884 .eax = 7,
885 .needs_ecx = true, .ecx = 1,
886 .reg = R_EAX,
887 },
888 .tcg_features = TCG_7_1_EAX_FEATURES,
889 },
303752a9 890 [FEAT_8000_0007_EDX] = {
07585923 891 .type = CPUID_FEATURE_WORD,
2d5312da
EH
892 .feat_names = {
893 NULL, NULL, NULL, NULL,
894 NULL, NULL, NULL, NULL,
895 "invtsc", NULL, NULL, NULL,
896 NULL, NULL, NULL, NULL,
897 NULL, NULL, NULL, NULL,
898 NULL, NULL, NULL, NULL,
899 NULL, NULL, NULL, NULL,
900 NULL, NULL, NULL, NULL,
901 },
07585923 902 .cpuid = { .eax = 0x80000007, .reg = R_EDX, },
303752a9
MT
903 .tcg_features = TCG_APM_FEATURES,
904 .unmigratable_flags = CPUID_APM_INVTSC,
905 },
1b3420e1 906 [FEAT_8000_0008_EBX] = {
07585923 907 .type = CPUID_FEATURE_WORD,
1b3420e1 908 .feat_names = {
e900135d 909 "clzero", NULL, "xsaveerptr", NULL,
1b3420e1 910 NULL, NULL, NULL, NULL,
59a80a19 911 NULL, "wbnoinvd", NULL, NULL,
623972ce 912 "ibpb", NULL, "ibrs", "amd-stibp",
1b3420e1
EH
913 NULL, NULL, NULL, NULL,
914 NULL, NULL, NULL, NULL,
254790a9 915 "amd-ssbd", "virt-ssbd", "amd-no-ssb", NULL,
1b3420e1
EH
916 NULL, NULL, NULL, NULL,
917 },
07585923 918 .cpuid = { .eax = 0x80000008, .reg = R_EBX, },
1b3420e1
EH
919 .tcg_features = 0,
920 .unmigratable_flags = 0,
921 },
0bb0b2d2 922 [FEAT_XSAVE] = {
07585923 923 .type = CPUID_FEATURE_WORD,
2d5312da
EH
924 .feat_names = {
925 "xsaveopt", "xsavec", "xgetbv1", "xsaves",
f21a4817 926 "xfd", NULL, NULL, NULL,
2d5312da
EH
927 NULL, NULL, NULL, NULL,
928 NULL, NULL, NULL, NULL,
929 NULL, NULL, NULL, NULL,
930 NULL, NULL, NULL, NULL,
931 NULL, NULL, NULL, NULL,
932 NULL, NULL, NULL, NULL,
933 },
07585923
RH
934 .cpuid = {
935 .eax = 0xd,
936 .needs_ecx = true, .ecx = 1,
937 .reg = R_EAX,
938 },
c9cfe8f9 939 .tcg_features = TCG_XSAVE_FEATURES,
0bb0b2d2 940 },
301e9067
YW
941 [FEAT_XSAVE_XSS_LO] = {
942 .type = CPUID_FEATURE_WORD,
943 .feat_names = {
944 NULL, NULL, NULL, NULL,
945 NULL, NULL, NULL, NULL,
946 NULL, NULL, NULL, NULL,
947 NULL, NULL, NULL, NULL,
948 NULL, NULL, NULL, NULL,
949 NULL, NULL, NULL, NULL,
950 NULL, NULL, NULL, NULL,
951 NULL, NULL, NULL, NULL,
952 },
953 .cpuid = {
954 .eax = 0xD,
955 .needs_ecx = true,
956 .ecx = 1,
957 .reg = R_ECX,
958 },
959 },
960 [FEAT_XSAVE_XSS_HI] = {
961 .type = CPUID_FEATURE_WORD,
962 .cpuid = {
963 .eax = 0xD,
964 .needs_ecx = true,
965 .ecx = 1,
966 .reg = R_EDX
967 },
968 },
28b8e4d0 969 [FEAT_6_EAX] = {
07585923 970 .type = CPUID_FEATURE_WORD,
2d5312da
EH
971 .feat_names = {
972 NULL, NULL, "arat", NULL,
973 NULL, NULL, NULL, NULL,
974 NULL, NULL, NULL, NULL,
975 NULL, NULL, NULL, NULL,
976 NULL, NULL, NULL, NULL,
977 NULL, NULL, NULL, NULL,
978 NULL, NULL, NULL, NULL,
979 NULL, NULL, NULL, NULL,
980 },
07585923 981 .cpuid = { .eax = 6, .reg = R_EAX, },
28b8e4d0
JK
982 .tcg_features = TCG_6_EAX_FEATURES,
983 },
301e9067 984 [FEAT_XSAVE_XCR0_LO] = {
07585923
RH
985 .type = CPUID_FEATURE_WORD,
986 .cpuid = {
987 .eax = 0xD,
988 .needs_ecx = true, .ecx = 0,
989 .reg = R_EAX,
990 },
96193c22 991 .tcg_features = ~0U,
6fb2fff7
EH
992 .migratable_flags = XSTATE_FP_MASK | XSTATE_SSE_MASK |
993 XSTATE_YMM_MASK | XSTATE_BNDREGS_MASK | XSTATE_BNDCSR_MASK |
994 XSTATE_OPMASK_MASK | XSTATE_ZMM_Hi256_MASK | XSTATE_Hi16_ZMM_MASK |
995 XSTATE_PKRU_MASK,
96193c22 996 },
301e9067 997 [FEAT_XSAVE_XCR0_HI] = {
07585923
RH
998 .type = CPUID_FEATURE_WORD,
999 .cpuid = {
1000 .eax = 0xD,
1001 .needs_ecx = true, .ecx = 0,
1002 .reg = R_EDX,
1003 },
96193c22
EH
1004 .tcg_features = ~0U,
1005 },
d86f9636
RH
1006 /*Below are MSR exposed features*/
1007 [FEAT_ARCH_CAPABILITIES] = {
1008 .type = MSR_FEATURE_WORD,
1009 .feat_names = {
1010 "rdctl-no", "ibrs-all", "rsba", "skip-l1dfl-vmentry",
2a9758c5 1011 "ssb-no", "mds-no", "pschange-mc-no", "tsx-ctrl",
7fac3863 1012 "taa-no", NULL, NULL, NULL,
d86f9636
RH
1013 NULL, NULL, NULL, NULL,
1014 NULL, NULL, NULL, NULL,
1015 NULL, NULL, NULL, NULL,
1016 NULL, NULL, NULL, NULL,
1017 NULL, NULL, NULL, NULL,
1018 },
1019 .msr = {
1020 .index = MSR_IA32_ARCH_CAPABILITIES,
d86f9636
RH
1021 },
1022 },
597360c0
XL
1023 [FEAT_CORE_CAPABILITY] = {
1024 .type = MSR_FEATURE_WORD,
1025 .feat_names = {
1026 NULL, NULL, NULL, NULL,
1027 NULL, "split-lock-detect", NULL, NULL,
1028 NULL, NULL, NULL, NULL,
1029 NULL, NULL, NULL, NULL,
1030 NULL, NULL, NULL, NULL,
1031 NULL, NULL, NULL, NULL,
1032 NULL, NULL, NULL, NULL,
1033 NULL, NULL, NULL, NULL,
1034 },
1035 .msr = {
1036 .index = MSR_IA32_CORE_CAPABILITY,
597360c0
XL
1037 },
1038 },
ea39f9b6
LX
1039 [FEAT_PERF_CAPABILITIES] = {
1040 .type = MSR_FEATURE_WORD,
1041 .feat_names = {
1042 NULL, NULL, NULL, NULL,
1043 NULL, NULL, NULL, NULL,
1044 NULL, NULL, NULL, NULL,
1045 NULL, "full-width-write", NULL, NULL,
1046 NULL, NULL, NULL, NULL,
1047 NULL, NULL, NULL, NULL,
1048 NULL, NULL, NULL, NULL,
1049 NULL, NULL, NULL, NULL,
1050 },
1051 .msr = {
1052 .index = MSR_IA32_PERF_CAPABILITIES,
1053 },
1054 },
20a78b02
PB
1055
1056 [FEAT_VMX_PROCBASED_CTLS] = {
1057 .type = MSR_FEATURE_WORD,
1058 .feat_names = {
1059 NULL, NULL, "vmx-vintr-pending", "vmx-tsc-offset",
1060 NULL, NULL, NULL, "vmx-hlt-exit",
1061 NULL, "vmx-invlpg-exit", "vmx-mwait-exit", "vmx-rdpmc-exit",
1062 "vmx-rdtsc-exit", NULL, NULL, "vmx-cr3-load-noexit",
1063 "vmx-cr3-store-noexit", NULL, NULL, "vmx-cr8-load-exit",
1064 "vmx-cr8-store-exit", "vmx-flexpriority", "vmx-vnmi-pending", "vmx-movdr-exit",
1065 "vmx-io-exit", "vmx-io-bitmap", NULL, "vmx-mtf",
1066 "vmx-msr-bitmap", "vmx-monitor-exit", "vmx-pause-exit", "vmx-secondary-ctls",
1067 },
1068 .msr = {
1069 .index = MSR_IA32_VMX_TRUE_PROCBASED_CTLS,
1070 }
1071 },
1072
1073 [FEAT_VMX_SECONDARY_CTLS] = {
1074 .type = MSR_FEATURE_WORD,
1075 .feat_names = {
1076 "vmx-apicv-xapic", "vmx-ept", "vmx-desc-exit", "vmx-rdtscp-exit",
1077 "vmx-apicv-x2apic", "vmx-vpid", "vmx-wbinvd-exit", "vmx-unrestricted-guest",
1078 "vmx-apicv-register", "vmx-apicv-vid", "vmx-ple", "vmx-rdrand-exit",
1079 "vmx-invpcid-exit", "vmx-vmfunc", "vmx-shadow-vmcs", "vmx-encls-exit",
1080 "vmx-rdseed-exit", "vmx-pml", NULL, NULL,
1081 "vmx-xsaves", NULL, NULL, NULL,
9ce8af4d 1082 NULL, "vmx-tsc-scaling", NULL, NULL,
20a78b02
PB
1083 NULL, NULL, NULL, NULL,
1084 },
1085 .msr = {
1086 .index = MSR_IA32_VMX_PROCBASED_CTLS2,
1087 }
1088 },
1089
1090 [FEAT_VMX_PINBASED_CTLS] = {
1091 .type = MSR_FEATURE_WORD,
1092 .feat_names = {
1093 "vmx-intr-exit", NULL, NULL, "vmx-nmi-exit",
1094 NULL, "vmx-vnmi", "vmx-preemption-timer", "vmx-posted-intr",
1095 NULL, NULL, NULL, NULL,
1096 NULL, NULL, NULL, NULL,
1097 NULL, NULL, NULL, NULL,
1098 NULL, NULL, NULL, NULL,
1099 NULL, NULL, NULL, NULL,
1100 NULL, NULL, NULL, NULL,
1101 },
1102 .msr = {
1103 .index = MSR_IA32_VMX_TRUE_PINBASED_CTLS,
1104 }
1105 },
1106
1107 [FEAT_VMX_EXIT_CTLS] = {
1108 .type = MSR_FEATURE_WORD,
1109 /*
1110 * VMX_VM_EXIT_HOST_ADDR_SPACE_SIZE is copied from
1111 * the LM CPUID bit.
1112 */
1113 .feat_names = {
1114 NULL, NULL, "vmx-exit-nosave-debugctl", NULL,
1115 NULL, NULL, NULL, NULL,
1116 NULL, NULL /* vmx-exit-host-addr-space-size */, NULL, NULL,
1117 "vmx-exit-load-perf-global-ctrl", NULL, NULL, "vmx-exit-ack-intr",
1118 NULL, NULL, "vmx-exit-save-pat", "vmx-exit-load-pat",
1119 "vmx-exit-save-efer", "vmx-exit-load-efer",
1120 "vmx-exit-save-preemption-timer", "vmx-exit-clear-bndcfgs",
1121 NULL, "vmx-exit-clear-rtit-ctl", NULL, NULL,
52a44ad2 1122 NULL, "vmx-exit-load-pkrs", NULL, NULL,
20a78b02
PB
1123 },
1124 .msr = {
1125 .index = MSR_IA32_VMX_TRUE_EXIT_CTLS,
1126 }
1127 },
1128
1129 [FEAT_VMX_ENTRY_CTLS] = {
1130 .type = MSR_FEATURE_WORD,
1131 .feat_names = {
1132 NULL, NULL, "vmx-entry-noload-debugctl", NULL,
1133 NULL, NULL, NULL, NULL,
1134 NULL, "vmx-entry-ia32e-mode", NULL, NULL,
1135 NULL, "vmx-entry-load-perf-global-ctrl", "vmx-entry-load-pat", "vmx-entry-load-efer",
1136 "vmx-entry-load-bndcfgs", NULL, "vmx-entry-load-rtit-ctl", NULL,
52a44ad2 1137 NULL, NULL, "vmx-entry-load-pkrs", NULL,
20a78b02
PB
1138 NULL, NULL, NULL, NULL,
1139 NULL, NULL, NULL, NULL,
1140 },
1141 .msr = {
1142 .index = MSR_IA32_VMX_TRUE_ENTRY_CTLS,
1143 }
1144 },
1145
1146 [FEAT_VMX_MISC] = {
1147 .type = MSR_FEATURE_WORD,
1148 .feat_names = {
1149 NULL, NULL, NULL, NULL,
1150 NULL, "vmx-store-lma", "vmx-activity-hlt", "vmx-activity-shutdown",
1151 "vmx-activity-wait-sipi", NULL, NULL, NULL,
1152 NULL, NULL, NULL, NULL,
1153 NULL, NULL, NULL, NULL,
1154 NULL, NULL, NULL, NULL,
1155 NULL, NULL, NULL, NULL,
1156 NULL, "vmx-vmwrite-vmexit-fields", "vmx-zero-len-inject", NULL,
1157 },
1158 .msr = {
1159 .index = MSR_IA32_VMX_MISC,
1160 }
1161 },
1162
1163 [FEAT_VMX_EPT_VPID_CAPS] = {
1164 .type = MSR_FEATURE_WORD,
1165 .feat_names = {
1166 "vmx-ept-execonly", NULL, NULL, NULL,
1167 NULL, NULL, "vmx-page-walk-4", "vmx-page-walk-5",
1168 NULL, NULL, NULL, NULL,
1169 NULL, NULL, NULL, NULL,
1170 "vmx-ept-2mb", "vmx-ept-1gb", NULL, NULL,
1171 "vmx-invept", "vmx-eptad", "vmx-ept-advanced-exitinfo", NULL,
1172 NULL, "vmx-invept-single-context", "vmx-invept-all-context", NULL,
1173 NULL, NULL, NULL, NULL,
1174 "vmx-invvpid", NULL, NULL, NULL,
1175 NULL, NULL, NULL, NULL,
1176 "vmx-invvpid-single-addr", "vmx-invept-single-context",
1177 "vmx-invvpid-all-context", "vmx-invept-single-context-noglobals",
1178 NULL, NULL, NULL, NULL,
1179 NULL, NULL, NULL, NULL,
1180 NULL, NULL, NULL, NULL,
1181 NULL, NULL, NULL, NULL,
1182 NULL, NULL, NULL, NULL,
1183 },
1184 .msr = {
1185 .index = MSR_IA32_VMX_EPT_VPID_CAP,
1186 }
1187 },
1188
1189 [FEAT_VMX_BASIC] = {
1190 .type = MSR_FEATURE_WORD,
1191 .feat_names = {
1192 [54] = "vmx-ins-outs",
1193 [55] = "vmx-true-ctls",
1194 },
1195 .msr = {
1196 .index = MSR_IA32_VMX_BASIC,
1197 },
1198 /* Just to be safe - we don't support setting the MSEG version field. */
1199 .no_autoenable_flags = MSR_VMX_BASIC_DUAL_MONITOR,
1200 },
1201
1202 [FEAT_VMX_VMFUNC] = {
1203 .type = MSR_FEATURE_WORD,
1204 .feat_names = {
1205 [0] = "vmx-eptp-switching",
1206 },
1207 .msr = {
1208 .index = MSR_IA32_VMX_VMFUNC,
1209 }
1210 },
1211
d1615ea5
LK
1212 [FEAT_14_0_ECX] = {
1213 .type = CPUID_FEATURE_WORD,
1214 .feat_names = {
1215 NULL, NULL, NULL, NULL,
1216 NULL, NULL, NULL, NULL,
1217 NULL, NULL, NULL, NULL,
1218 NULL, NULL, NULL, NULL,
1219 NULL, NULL, NULL, NULL,
1220 NULL, NULL, NULL, NULL,
1221 NULL, NULL, NULL, NULL,
1222 NULL, NULL, NULL, "intel-pt-lip",
1223 },
1224 .cpuid = {
1225 .eax = 0x14,
1226 .needs_ecx = true, .ecx = 0,
1227 .reg = R_ECX,
1228 },
1229 .tcg_features = TCG_14_0_ECX_FEATURES,
1230 },
1231
4b841a79
SC
1232 [FEAT_SGX_12_0_EAX] = {
1233 .type = CPUID_FEATURE_WORD,
1234 .feat_names = {
1235 "sgx1", "sgx2", NULL, NULL,
1236 NULL, NULL, NULL, NULL,
d45f24fe 1237 NULL, NULL, NULL, "sgx-edeccssa",
4b841a79
SC
1238 NULL, NULL, NULL, NULL,
1239 NULL, NULL, NULL, NULL,
1240 NULL, NULL, NULL, NULL,
1241 NULL, NULL, NULL, NULL,
1242 NULL, NULL, NULL, NULL,
1243 },
1244 .cpuid = {
1245 .eax = 0x12,
1246 .needs_ecx = true, .ecx = 0,
1247 .reg = R_EAX,
1248 },
1249 .tcg_features = TCG_SGX_12_0_EAX_FEATURES,
1250 },
120ca112
SC
1251
1252 [FEAT_SGX_12_0_EBX] = {
1253 .type = CPUID_FEATURE_WORD,
1254 .feat_names = {
1255 "sgx-exinfo" , NULL, NULL, NULL,
1256 NULL, NULL, NULL, NULL,
1257 NULL, NULL, NULL, NULL,
1258 NULL, NULL, NULL, NULL,
1259 NULL, NULL, NULL, NULL,
1260 NULL, NULL, NULL, NULL,
1261 NULL, NULL, NULL, NULL,
1262 NULL, NULL, NULL, NULL,
1263 },
1264 .cpuid = {
1265 .eax = 0x12,
1266 .needs_ecx = true, .ecx = 0,
1267 .reg = R_EBX,
1268 },
1269 .tcg_features = TCG_SGX_12_0_EBX_FEATURES,
1270 },
165981a5
SC
1271
1272 [FEAT_SGX_12_1_EAX] = {
1273 .type = CPUID_FEATURE_WORD,
1274 .feat_names = {
1275 NULL, "sgx-debug", "sgx-mode64", NULL,
1276 "sgx-provisionkey", "sgx-tokenkey", NULL, "sgx-kss",
d45f24fe 1277 NULL, NULL, "sgx-aex-notify", NULL,
165981a5
SC
1278 NULL, NULL, NULL, NULL,
1279 NULL, NULL, NULL, NULL,
1280 NULL, NULL, NULL, NULL,
1281 NULL, NULL, NULL, NULL,
1282 NULL, NULL, NULL, NULL,
1283 },
1284 .cpuid = {
1285 .eax = 0x12,
1286 .needs_ecx = true, .ecx = 1,
1287 .reg = R_EAX,
1288 },
1289 .tcg_features = TCG_SGX_12_1_EAX_FEATURES,
1290 },
5ef57876
EH
1291};
1292
99e24dbd
PB
1293typedef struct FeatureMask {
1294 FeatureWord index;
ede146c2 1295 uint64_t mask;
99e24dbd
PB
1296} FeatureMask;
1297
1298typedef struct FeatureDep {
1299 FeatureMask from, to;
1300} FeatureDep;
1301
1302static FeatureDep feature_dependencies[] = {
1303 {
1304 .from = { FEAT_7_0_EDX, CPUID_7_0_EDX_ARCH_CAPABILITIES },
ede146c2 1305 .to = { FEAT_ARCH_CAPABILITIES, ~0ull },
99e24dbd
PB
1306 },
1307 {
1308 .from = { FEAT_7_0_EDX, CPUID_7_0_EDX_CORE_CAPABILITY },
ede146c2 1309 .to = { FEAT_CORE_CAPABILITY, ~0ull },
99e24dbd 1310 },
ea39f9b6
LX
1311 {
1312 .from = { FEAT_1_ECX, CPUID_EXT_PDCM },
1313 .to = { FEAT_PERF_CAPABILITIES, ~0ull },
1314 },
20a78b02
PB
1315 {
1316 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1317 .to = { FEAT_VMX_PROCBASED_CTLS, ~0ull },
1318 },
1319 {
1320 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1321 .to = { FEAT_VMX_PINBASED_CTLS, ~0ull },
1322 },
1323 {
1324 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1325 .to = { FEAT_VMX_EXIT_CTLS, ~0ull },
1326 },
1327 {
1328 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1329 .to = { FEAT_VMX_ENTRY_CTLS, ~0ull },
1330 },
1331 {
1332 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1333 .to = { FEAT_VMX_MISC, ~0ull },
1334 },
1335 {
1336 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1337 .to = { FEAT_VMX_BASIC, ~0ull },
1338 },
1339 {
1340 .from = { FEAT_8000_0001_EDX, CPUID_EXT2_LM },
1341 .to = { FEAT_VMX_ENTRY_CTLS, VMX_VM_ENTRY_IA32E_MODE },
1342 },
1343 {
1344 .from = { FEAT_VMX_PROCBASED_CTLS, VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS },
1345 .to = { FEAT_VMX_SECONDARY_CTLS, ~0ull },
1346 },
1347 {
1348 .from = { FEAT_XSAVE, CPUID_XSAVE_XSAVES },
1349 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_XSAVES },
1350 },
1351 {
1352 .from = { FEAT_1_ECX, CPUID_EXT_RDRAND },
1353 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDRAND_EXITING },
1354 },
1355 {
1356 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_INVPCID },
1357 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_INVPCID },
1358 },
267b5e7e
MS
1359 {
1360 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_MPX },
1361 .to = { FEAT_VMX_EXIT_CTLS, VMX_VM_EXIT_CLEAR_BNDCFGS },
1362 },
1363 {
1364 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_MPX },
1365 .to = { FEAT_VMX_ENTRY_CTLS, VMX_VM_ENTRY_LOAD_BNDCFGS },
1366 },
20a78b02
PB
1367 {
1368 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_RDSEED },
1369 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDSEED_EXITING },
1370 },
d1615ea5
LK
1371 {
1372 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_INTEL_PT },
1373 .to = { FEAT_14_0_ECX, ~0ull },
1374 },
20a78b02
PB
1375 {
1376 .from = { FEAT_8000_0001_EDX, CPUID_EXT2_RDTSCP },
1377 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDTSCP },
1378 },
1379 {
1380 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_EPT },
1381 .to = { FEAT_VMX_EPT_VPID_CAPS, 0xffffffffull },
1382 },
1383 {
1384 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_EPT },
1385 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST },
1386 },
1387 {
1388 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_VPID },
1389 .to = { FEAT_VMX_EPT_VPID_CAPS, 0xffffffffull << 32 },
1390 },
1391 {
1392 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_VMFUNC },
1393 .to = { FEAT_VMX_VMFUNC, ~0ull },
1394 },
730319ae
EH
1395 {
1396 .from = { FEAT_8000_0001_ECX, CPUID_EXT3_SVM },
1397 .to = { FEAT_SVM, ~0ull },
1398 },
99e24dbd
PB
1399};
1400
8e8aba50
EH
1401typedef struct X86RegisterInfo32 {
1402 /* Name of register */
1403 const char *name;
1404 /* QAPI enum value register */
1405 X86CPURegister32 qapi_enum;
1406} X86RegisterInfo32;
1407
1408#define REGISTER(reg) \
5d371f41 1409 [R_##reg] = { .name = #reg, .qapi_enum = X86_CPU_REGISTER32_##reg }
a443bc34 1410static const X86RegisterInfo32 x86_reg_info_32[CPU_NB_REGS32] = {
8e8aba50
EH
1411 REGISTER(EAX),
1412 REGISTER(ECX),
1413 REGISTER(EDX),
1414 REGISTER(EBX),
1415 REGISTER(ESP),
1416 REGISTER(EBP),
1417 REGISTER(ESI),
1418 REGISTER(EDI),
1419};
1420#undef REGISTER
1421
301e9067 1422/* CPUID feature bits available in XSS */
10f0abcb 1423#define CPUID_XSTATE_XSS_MASK (XSTATE_ARCH_LBR_MASK)
301e9067 1424
fea45008 1425ExtSaveArea x86_ext_save_areas[XSAVE_STATE_AREA_COUNT] = {
e3c9022b
EH
1426 [XSTATE_FP_BIT] = {
1427 /* x87 FP state component is always enabled if XSAVE is supported */
1428 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
e3c9022b
EH
1429 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1430 },
1431 [XSTATE_SSE_BIT] = {
1432 /* SSE state component is always enabled if XSAVE is supported */
1433 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
e3c9022b
EH
1434 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1435 },
cfc3b074
PB
1436 [XSTATE_YMM_BIT] =
1437 { .feature = FEAT_1_ECX, .bits = CPUID_EXT_AVX,
ee1b09f6 1438 .size = sizeof(XSaveAVX) },
cfc3b074
PB
1439 [XSTATE_BNDREGS_BIT] =
1440 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
ee1b09f6 1441 .size = sizeof(XSaveBNDREG) },
cfc3b074
PB
1442 [XSTATE_BNDCSR_BIT] =
1443 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
ee1b09f6 1444 .size = sizeof(XSaveBNDCSR) },
cfc3b074
PB
1445 [XSTATE_OPMASK_BIT] =
1446 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
ee1b09f6 1447 .size = sizeof(XSaveOpmask) },
cfc3b074
PB
1448 [XSTATE_ZMM_Hi256_BIT] =
1449 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
ee1b09f6 1450 .size = sizeof(XSaveZMM_Hi256) },
cfc3b074
PB
1451 [XSTATE_Hi16_ZMM_BIT] =
1452 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
ee1b09f6 1453 .size = sizeof(XSaveHi16_ZMM) },
cfc3b074
PB
1454 [XSTATE_PKRU_BIT] =
1455 { .feature = FEAT_7_0_ECX, .bits = CPUID_7_0_ECX_PKU,
ee1b09f6 1456 .size = sizeof(XSavePKRU) },
10f0abcb
YW
1457 [XSTATE_ARCH_LBR_BIT] = {
1458 .feature = FEAT_7_0_EDX, .bits = CPUID_7_0_EDX_ARCH_LBR,
1459 .offset = 0 /*supervisor mode component, offset = 0 */,
1460 .size = sizeof(XSavesArchLBR) },
1f16764f
JL
1461 [XSTATE_XTILE_CFG_BIT] = {
1462 .feature = FEAT_7_0_EDX, .bits = CPUID_7_0_EDX_AMX_TILE,
1463 .size = sizeof(XSaveXTILECFG),
1464 },
1465 [XSTATE_XTILE_DATA_BIT] = {
1466 .feature = FEAT_7_0_EDX, .bits = CPUID_7_0_EDX_AMX_TILE,
1467 .size = sizeof(XSaveXTILEDATA)
1468 },
2560f19f 1469};
8e8aba50 1470
5d245678 1471uint32_t xsave_area_size(uint64_t mask, bool compacted)
1fda6198 1472{
301e9067
YW
1473 uint64_t ret = x86_ext_save_areas[0].size;
1474 const ExtSaveArea *esa;
1475 uint32_t offset = 0;
1fda6198 1476 int i;
1fda6198 1477
301e9067
YW
1478 for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
1479 esa = &x86_ext_save_areas[i];
1fda6198 1480 if ((mask >> i) & 1) {
301e9067
YW
1481 offset = compacted ? ret : esa->offset;
1482 ret = MAX(ret, offset + esa->size);
1fda6198
EH
1483 }
1484 }
1485 return ret;
1486}
1487
d6dcc558
SAGDR
1488static inline bool accel_uses_host_cpuid(void)
1489{
1490 return kvm_enabled() || hvf_enabled();
1491}
1492
301e9067 1493static inline uint64_t x86_cpu_xsave_xcr0_components(X86CPU *cpu)
96193c22 1494{
301e9067
YW
1495 return ((uint64_t)cpu->env.features[FEAT_XSAVE_XCR0_HI]) << 32 |
1496 cpu->env.features[FEAT_XSAVE_XCR0_LO];
96193c22
EH
1497}
1498
ed69e831
CF
1499/* Return name of 32-bit register, from a R_* constant */
1500static const char *get_register_name_32(unsigned int reg)
8b4beddc 1501{
31ccdde2 1502 if (reg >= CPU_NB_REGS32) {
8b4beddc
EH
1503 return NULL;
1504 }
8e8aba50 1505 return x86_reg_info_32[reg].name;
8b4beddc
EH
1506}
1507
301e9067
YW
1508static inline uint64_t x86_cpu_xsave_xss_components(X86CPU *cpu)
1509{
1510 return ((uint64_t)cpu->env.features[FEAT_XSAVE_XSS_HI]) << 32 |
1511 cpu->env.features[FEAT_XSAVE_XSS_LO];
1512}
1513
84f1b92f
EH
1514/*
1515 * Returns the set of feature flags that are supported and migratable by
1516 * QEMU, for a given FeatureWord.
1517 */
ede146c2 1518static uint64_t x86_cpu_get_migratable_flags(FeatureWord w)
84f1b92f
EH
1519{
1520 FeatureWordInfo *wi = &feature_word_info[w];
ede146c2 1521 uint64_t r = 0;
84f1b92f
EH
1522 int i;
1523
ede146c2
PB
1524 for (i = 0; i < 64; i++) {
1525 uint64_t f = 1ULL << i;
6fb2fff7
EH
1526
1527 /* If the feature name is known, it is implicitly considered migratable,
1528 * unless it is explicitly set in unmigratable_flags */
1529 if ((wi->migratable_flags & f) ||
1530 (wi->feat_names[i] && !(wi->unmigratable_flags & f))) {
1531 r |= f;
84f1b92f 1532 }
84f1b92f
EH
1533 }
1534 return r;
1535}
1536
bb44e0d1
JK
1537void host_cpuid(uint32_t function, uint32_t count,
1538 uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
bdde476a 1539{
a1fd24af
AL
1540 uint32_t vec[4];
1541
1542#ifdef __x86_64__
1543 asm volatile("cpuid"
1544 : "=a"(vec[0]), "=b"(vec[1]),
1545 "=c"(vec[2]), "=d"(vec[3])
1546 : "0"(function), "c"(count) : "cc");
c1f41226 1547#elif defined(__i386__)
a1fd24af
AL
1548 asm volatile("pusha \n\t"
1549 "cpuid \n\t"
1550 "mov %%eax, 0(%2) \n\t"
1551 "mov %%ebx, 4(%2) \n\t"
1552 "mov %%ecx, 8(%2) \n\t"
1553 "mov %%edx, 12(%2) \n\t"
1554 "popa"
1555 : : "a"(function), "c"(count), "S"(vec)
1556 : "memory", "cc");
c1f41226
EH
1557#else
1558 abort();
a1fd24af
AL
1559#endif
1560
bdde476a 1561 if (eax)
a1fd24af 1562 *eax = vec[0];
bdde476a 1563 if (ebx)
a1fd24af 1564 *ebx = vec[1];
bdde476a 1565 if (ecx)
a1fd24af 1566 *ecx = vec[2];
bdde476a 1567 if (edx)
a1fd24af 1568 *edx = vec[3];
bdde476a 1569}
c6dc6f63 1570
d940ee9b
EH
1571/* CPU class name definitions: */
1572
d940ee9b
EH
1573/* Return type name for a given CPU model name
1574 * Caller is responsible for freeing the returned string.
1575 */
1576static char *x86_cpu_type_name(const char *model_name)
1577{
1578 return g_strdup_printf(X86_CPU_TYPE_NAME("%s"), model_name);
1579}
1580
500050d1
AF
1581static ObjectClass *x86_cpu_class_by_name(const char *cpu_model)
1582{
88703ce2
EH
1583 g_autofree char *typename = x86_cpu_type_name(cpu_model);
1584 return object_class_by_name(typename);
500050d1
AF
1585}
1586
104494ea
IM
1587static char *x86_cpu_class_get_model_name(X86CPUClass *cc)
1588{
1589 const char *class_name = object_class_get_name(OBJECT_CLASS(cc));
1590 assert(g_str_has_suffix(class_name, X86_CPU_TYPE_SUFFIX));
1591 return g_strndup(class_name,
1592 strlen(class_name) - strlen(X86_CPU_TYPE_SUFFIX));
1593}
1594
dcafd1ef
EH
1595typedef struct X86CPUVersionDefinition {
1596 X86CPUVersion version;
53db89d9 1597 const char *alias;
c63938df 1598 const char *note;
dcafd1ef
EH
1599 PropValue *props;
1600} X86CPUVersionDefinition;
1601
1602/* Base definition for a CPU model */
1603typedef struct X86CPUDefinition {
c6dc6f63
AP
1604 const char *name;
1605 uint32_t level;
90e4b0c3 1606 uint32_t xlevel;
99b88a17
IM
1607 /* vendor is zero-terminated, 12 character ASCII string */
1608 char vendor[CPUID_VENDOR_SZ + 1];
c6dc6f63
AP
1609 int family;
1610 int model;
1611 int stepping;
0514ef2f 1612 FeatureWordArray features;
807e9869 1613 const char *model_id;
e845de38 1614 const CPUCaches *const cache_info;
dcafd1ef
EH
1615 /*
1616 * Definitions for alternative versions of CPU model.
1617 * List is terminated by item with version == 0.
1618 * If NULL, version 1 will be registered automatically.
1619 */
1620 const X86CPUVersionDefinition *versions;
61ad65d0 1621 const char *deprecation_note;
dcafd1ef
EH
1622} X86CPUDefinition;
1623
1624/* Reference to a specific CPU model version */
1625struct X86CPUModel {
1626 /* Base CPU definition */
e11fd689 1627 const X86CPUDefinition *cpudef;
dcafd1ef
EH
1628 /* CPU model version */
1629 X86CPUVersion version;
c63938df 1630 const char *note;
0788a56b
EH
1631 /*
1632 * If true, this is an alias CPU model.
1633 * This matters only for "-cpu help" and query-cpu-definitions
1634 */
1635 bool is_alias;
d940ee9b 1636};
c6dc6f63 1637
dcafd1ef 1638/* Get full model name for CPU version */
e11fd689 1639static char *x86_cpu_versioned_model_name(const X86CPUDefinition *cpudef,
dcafd1ef
EH
1640 X86CPUVersion version)
1641{
1642 assert(version > 0);
1643 return g_strdup_printf("%s-v%d", cpudef->name, (int)version);
1644}
1645
e11fd689
PMD
1646static const X86CPUVersionDefinition *
1647x86_cpu_def_get_versions(const X86CPUDefinition *def)
dcafd1ef
EH
1648{
1649 /* When X86CPUDefinition::versions is NULL, we register only v1 */
1650 static const X86CPUVersionDefinition default_version_list[] = {
1651 { 1 },
1652 { /* end of list */ }
1653 };
1654
1655 return def->versions ?: default_version_list;
1656}
1657
e845de38 1658static const CPUCaches epyc_cache_info = {
a9f27ea9 1659 .l1d_cache = &(CPUCacheInfo) {
5f00335a 1660 .type = DATA_CACHE,
fe52acd2
BM
1661 .level = 1,
1662 .size = 32 * KiB,
1663 .line_size = 64,
1664 .associativity = 8,
1665 .partitions = 1,
1666 .sets = 64,
1667 .lines_per_tag = 1,
1668 .self_init = 1,
1669 .no_invd_sharing = true,
1670 },
a9f27ea9 1671 .l1i_cache = &(CPUCacheInfo) {
5f00335a 1672 .type = INSTRUCTION_CACHE,
fe52acd2
BM
1673 .level = 1,
1674 .size = 64 * KiB,
1675 .line_size = 64,
1676 .associativity = 4,
1677 .partitions = 1,
1678 .sets = 256,
1679 .lines_per_tag = 1,
1680 .self_init = 1,
1681 .no_invd_sharing = true,
1682 },
a9f27ea9 1683 .l2_cache = &(CPUCacheInfo) {
fe52acd2
BM
1684 .type = UNIFIED_CACHE,
1685 .level = 2,
1686 .size = 512 * KiB,
1687 .line_size = 64,
1688 .associativity = 8,
1689 .partitions = 1,
1690 .sets = 1024,
1691 .lines_per_tag = 1,
1692 },
a9f27ea9 1693 .l3_cache = &(CPUCacheInfo) {
fe52acd2
BM
1694 .type = UNIFIED_CACHE,
1695 .level = 3,
1696 .size = 8 * MiB,
1697 .line_size = 64,
1698 .associativity = 16,
1699 .partitions = 1,
1700 .sets = 8192,
1701 .lines_per_tag = 1,
1702 .self_init = true,
1703 .inclusive = true,
1704 .complex_indexing = true,
1705 },
1706};
1707
e845de38 1708static const CPUCaches epyc_rome_cache_info = {
143c30d4
MB
1709 .l1d_cache = &(CPUCacheInfo) {
1710 .type = DATA_CACHE,
1711 .level = 1,
1712 .size = 32 * KiB,
1713 .line_size = 64,
1714 .associativity = 8,
1715 .partitions = 1,
1716 .sets = 64,
1717 .lines_per_tag = 1,
1718 .self_init = 1,
1719 .no_invd_sharing = true,
1720 },
1721 .l1i_cache = &(CPUCacheInfo) {
1722 .type = INSTRUCTION_CACHE,
1723 .level = 1,
1724 .size = 32 * KiB,
1725 .line_size = 64,
1726 .associativity = 8,
1727 .partitions = 1,
1728 .sets = 64,
1729 .lines_per_tag = 1,
1730 .self_init = 1,
1731 .no_invd_sharing = true,
1732 },
1733 .l2_cache = &(CPUCacheInfo) {
1734 .type = UNIFIED_CACHE,
1735 .level = 2,
1736 .size = 512 * KiB,
1737 .line_size = 64,
1738 .associativity = 8,
1739 .partitions = 1,
1740 .sets = 1024,
1741 .lines_per_tag = 1,
1742 },
1743 .l3_cache = &(CPUCacheInfo) {
1744 .type = UNIFIED_CACHE,
1745 .level = 3,
1746 .size = 16 * MiB,
1747 .line_size = 64,
1748 .associativity = 16,
1749 .partitions = 1,
1750 .sets = 16384,
1751 .lines_per_tag = 1,
1752 .self_init = true,
1753 .inclusive = true,
1754 .complex_indexing = true,
1755 },
1756};
1757
e845de38 1758static const CPUCaches epyc_milan_cache_info = {
623972ce
BM
1759 .l1d_cache = &(CPUCacheInfo) {
1760 .type = DATA_CACHE,
1761 .level = 1,
1762 .size = 32 * KiB,
1763 .line_size = 64,
1764 .associativity = 8,
1765 .partitions = 1,
1766 .sets = 64,
1767 .lines_per_tag = 1,
1768 .self_init = 1,
1769 .no_invd_sharing = true,
1770 },
1771 .l1i_cache = &(CPUCacheInfo) {
1772 .type = INSTRUCTION_CACHE,
1773 .level = 1,
1774 .size = 32 * KiB,
1775 .line_size = 64,
1776 .associativity = 8,
1777 .partitions = 1,
1778 .sets = 64,
1779 .lines_per_tag = 1,
1780 .self_init = 1,
1781 .no_invd_sharing = true,
1782 },
1783 .l2_cache = &(CPUCacheInfo) {
1784 .type = UNIFIED_CACHE,
1785 .level = 2,
1786 .size = 512 * KiB,
1787 .line_size = 64,
1788 .associativity = 8,
1789 .partitions = 1,
1790 .sets = 1024,
1791 .lines_per_tag = 1,
1792 },
1793 .l3_cache = &(CPUCacheInfo) {
1794 .type = UNIFIED_CACHE,
1795 .level = 3,
1796 .size = 32 * MiB,
1797 .line_size = 64,
1798 .associativity = 16,
1799 .partitions = 1,
1800 .sets = 32768,
1801 .lines_per_tag = 1,
1802 .self_init = true,
1803 .inclusive = true,
1804 .complex_indexing = true,
1805 },
1806};
1807
0723cc8a
PB
1808/* The following VMX features are not supported by KVM and are left out in the
1809 * CPU definitions:
1810 *
1811 * Dual-monitor support (all processors)
1812 * Entry to SMM
1813 * Deactivate dual-monitor treatment
1814 * Number of CR3-target values
1815 * Shutdown activity state
1816 * Wait-for-SIPI activity state
1817 * PAUSE-loop exiting (Westmere and newer)
1818 * EPT-violation #VE (Broadwell and newer)
1819 * Inject event with insn length=0 (Skylake and newer)
1820 * Conceal non-root operation from PT
1821 * Conceal VM exits from PT
1822 * Conceal VM entries from PT
1823 * Enable ENCLS exiting
1824 * Mode-based execute control (XS/XU)
1825 s TSC scaling (Skylake Server and newer)
1826 * GPA translation for PT (IceLake and newer)
1827 * User wait and pause
1828 * ENCLV exiting
1829 * Load IA32_RTIT_CTL
1830 * Clear IA32_RTIT_CTL
1831 * Advanced VM-exit information for EPT violations
1832 * Sub-page write permissions
1833 * PT in VMX operation
1834 */
1835
e11fd689 1836static const X86CPUDefinition builtin_x86_defs[] = {
c6dc6f63
AP
1837 {
1838 .name = "qemu64",
3046bb5d 1839 .level = 0xd,
99b88a17 1840 .vendor = CPUID_VENDOR_AMD,
b7c29017
DB
1841 .family = 15,
1842 .model = 107,
1843 .stepping = 1,
0514ef2f 1844 .features[FEAT_1_EDX] =
27861ecc 1845 PPRO_FEATURES |
c6dc6f63 1846 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
c6dc6f63 1847 CPUID_PSE36,
0514ef2f 1848 .features[FEAT_1_ECX] =
6aa91e4a 1849 CPUID_EXT_SSE3 | CPUID_EXT_CX16,
0514ef2f 1850 .features[FEAT_8000_0001_EDX] =
c6dc6f63 1851 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
0514ef2f 1852 .features[FEAT_8000_0001_ECX] =
71195672 1853 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM,
c6dc6f63 1854 .xlevel = 0x8000000A,
9cf2cc3d 1855 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
c6dc6f63
AP
1856 },
1857 {
1858 .name = "phenom",
1859 .level = 5,
99b88a17 1860 .vendor = CPUID_VENDOR_AMD,
c6dc6f63
AP
1861 .family = 16,
1862 .model = 2,
1863 .stepping = 3,
b9fc20bc 1864 /* Missing: CPUID_HT */
0514ef2f 1865 .features[FEAT_1_EDX] =
27861ecc 1866 PPRO_FEATURES |
c6dc6f63 1867 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
b9fc20bc 1868 CPUID_PSE36 | CPUID_VME,
0514ef2f 1869 .features[FEAT_1_ECX] =
27861ecc 1870 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_CX16 |
c6dc6f63 1871 CPUID_EXT_POPCNT,
0514ef2f 1872 .features[FEAT_8000_0001_EDX] =
c6dc6f63
AP
1873 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX |
1874 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_MMXEXT |
8560efed 1875 CPUID_EXT2_FFXSR | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP,
c6dc6f63
AP
1876 /* Missing: CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
1877 CPUID_EXT3_CR8LEG,
1878 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
1879 CPUID_EXT3_OSVW, CPUID_EXT3_IBS */
0514ef2f 1880 .features[FEAT_8000_0001_ECX] =
27861ecc 1881 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM |
c6dc6f63 1882 CPUID_EXT3_ABM | CPUID_EXT3_SSE4A,
b9fc20bc 1883 /* Missing: CPUID_SVM_LBRV */
0514ef2f 1884 .features[FEAT_SVM] =
b9fc20bc 1885 CPUID_SVM_NPT,
c6dc6f63
AP
1886 .xlevel = 0x8000001A,
1887 .model_id = "AMD Phenom(tm) 9550 Quad-Core Processor"
1888 },
1889 {
1890 .name = "core2duo",
1891 .level = 10,
99b88a17 1892 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
1893 .family = 6,
1894 .model = 15,
1895 .stepping = 11,
b9fc20bc 1896 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
0514ef2f 1897 .features[FEAT_1_EDX] =
27861ecc 1898 PPRO_FEATURES |
c6dc6f63 1899 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
b9fc20bc
EH
1900 CPUID_PSE36 | CPUID_VME | CPUID_ACPI | CPUID_SS,
1901 /* Missing: CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_EST,
e93abc14 1902 * CPUID_EXT_TM2, CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_VMX */
0514ef2f 1903 .features[FEAT_1_ECX] =
27861ecc 1904 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
e93abc14 1905 CPUID_EXT_CX16,
0514ef2f 1906 .features[FEAT_8000_0001_EDX] =
27861ecc 1907 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
0514ef2f 1908 .features[FEAT_8000_0001_ECX] =
27861ecc 1909 CPUID_EXT3_LAHF_LM,
0723cc8a
PB
1910 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
1911 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
1912 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
1913 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
1914 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
1915 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
1916 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
1917 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
1918 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
1919 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
1920 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
1921 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
1922 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
1923 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
1924 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
1925 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
1926 .features[FEAT_VMX_SECONDARY_CTLS] =
1927 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES,
c6dc6f63
AP
1928 .xlevel = 0x80000008,
1929 .model_id = "Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz",
1930 },
1931 {
1932 .name = "kvm64",
3046bb5d 1933 .level = 0xd,
99b88a17 1934 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
1935 .family = 15,
1936 .model = 6,
1937 .stepping = 1,
b3a4f0b1 1938 /* Missing: CPUID_HT */
0514ef2f 1939 .features[FEAT_1_EDX] =
b3a4f0b1 1940 PPRO_FEATURES | CPUID_VME |
c6dc6f63
AP
1941 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1942 CPUID_PSE36,
1943 /* Missing: CPUID_EXT_POPCNT, CPUID_EXT_MONITOR */
0514ef2f 1944 .features[FEAT_1_ECX] =
27861ecc 1945 CPUID_EXT_SSE3 | CPUID_EXT_CX16,
c6dc6f63 1946 /* Missing: CPUID_EXT2_PDPE1GB, CPUID_EXT2_RDTSCP */
0514ef2f 1947 .features[FEAT_8000_0001_EDX] =
c6dc6f63
AP
1948 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1949 /* Missing: CPUID_EXT3_LAHF_LM, CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
1950 CPUID_EXT3_CR8LEG, CPUID_EXT3_ABM, CPUID_EXT3_SSE4A,
1951 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
1952 CPUID_EXT3_OSVW, CPUID_EXT3_IBS, CPUID_EXT3_SVM */
0514ef2f 1953 .features[FEAT_8000_0001_ECX] =
27861ecc 1954 0,
0723cc8a
PB
1955 /* VMX features from Cedar Mill/Prescott */
1956 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
1957 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
1958 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
1959 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
1960 VMX_PIN_BASED_NMI_EXITING,
1961 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
1962 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
1963 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
1964 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
1965 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
1966 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
1967 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
1968 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING,
c6dc6f63
AP
1969 .xlevel = 0x80000008,
1970 .model_id = "Common KVM processor"
1971 },
c6dc6f63
AP
1972 {
1973 .name = "qemu32",
1974 .level = 4,
99b88a17 1975 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63 1976 .family = 6,
f8e6a11a 1977 .model = 6,
c6dc6f63 1978 .stepping = 3,
0514ef2f 1979 .features[FEAT_1_EDX] =
27861ecc 1980 PPRO_FEATURES,
0514ef2f 1981 .features[FEAT_1_ECX] =
6aa91e4a 1982 CPUID_EXT_SSE3,
58012d66 1983 .xlevel = 0x80000004,
9cf2cc3d 1984 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
c6dc6f63 1985 },
eafaf1e5
AP
1986 {
1987 .name = "kvm32",
1988 .level = 5,
99b88a17 1989 .vendor = CPUID_VENDOR_INTEL,
eafaf1e5
AP
1990 .family = 15,
1991 .model = 6,
1992 .stepping = 1,
0514ef2f 1993 .features[FEAT_1_EDX] =
b3a4f0b1 1994 PPRO_FEATURES | CPUID_VME |
eafaf1e5 1995 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_PSE36,
0514ef2f 1996 .features[FEAT_1_ECX] =
27861ecc 1997 CPUID_EXT_SSE3,
0514ef2f 1998 .features[FEAT_8000_0001_ECX] =
27861ecc 1999 0,
0723cc8a
PB
2000 /* VMX features from Yonah */
2001 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
2002 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
2003 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2004 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2005 VMX_PIN_BASED_NMI_EXITING,
2006 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2007 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2008 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2009 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2010 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
2011 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
2012 VMX_CPU_BASED_PAUSE_EXITING | VMX_CPU_BASED_USE_MSR_BITMAPS,
eafaf1e5
AP
2013 .xlevel = 0x80000008,
2014 .model_id = "Common 32-bit KVM processor"
2015 },
c6dc6f63
AP
2016 {
2017 .name = "coreduo",
2018 .level = 10,
99b88a17 2019 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
2020 .family = 6,
2021 .model = 14,
2022 .stepping = 8,
b9fc20bc 2023 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
0514ef2f 2024 .features[FEAT_1_EDX] =
27861ecc 2025 PPRO_FEATURES | CPUID_VME |
b9fc20bc
EH
2026 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_ACPI |
2027 CPUID_SS,
2028 /* Missing: CPUID_EXT_EST, CPUID_EXT_TM2 , CPUID_EXT_XTPR,
e93abc14 2029 * CPUID_EXT_PDCM, CPUID_EXT_VMX */
0514ef2f 2030 .features[FEAT_1_ECX] =
e93abc14 2031 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR,
0514ef2f 2032 .features[FEAT_8000_0001_EDX] =
27861ecc 2033 CPUID_EXT2_NX,
0723cc8a
PB
2034 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
2035 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
2036 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2037 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2038 VMX_PIN_BASED_NMI_EXITING,
2039 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2040 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2041 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2042 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2043 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
2044 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
2045 VMX_CPU_BASED_PAUSE_EXITING | VMX_CPU_BASED_USE_MSR_BITMAPS,
c6dc6f63
AP
2046 .xlevel = 0x80000008,
2047 .model_id = "Genuine Intel(R) CPU T2600 @ 2.16GHz",
2048 },
2049 {
2050 .name = "486",
58012d66 2051 .level = 1,
99b88a17 2052 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63 2053 .family = 4,
b2a856d9 2054 .model = 8,
c6dc6f63 2055 .stepping = 0,
0514ef2f 2056 .features[FEAT_1_EDX] =
27861ecc 2057 I486_FEATURES,
c6dc6f63 2058 .xlevel = 0,
807e9869 2059 .model_id = "",
c6dc6f63
AP
2060 },
2061 {
2062 .name = "pentium",
2063 .level = 1,
99b88a17 2064 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
2065 .family = 5,
2066 .model = 4,
2067 .stepping = 3,
0514ef2f 2068 .features[FEAT_1_EDX] =
27861ecc 2069 PENTIUM_FEATURES,
c6dc6f63 2070 .xlevel = 0,
807e9869 2071 .model_id = "",
c6dc6f63
AP
2072 },
2073 {
2074 .name = "pentium2",
2075 .level = 2,
99b88a17 2076 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
2077 .family = 6,
2078 .model = 5,
2079 .stepping = 2,
0514ef2f 2080 .features[FEAT_1_EDX] =
27861ecc 2081 PENTIUM2_FEATURES,
c6dc6f63 2082 .xlevel = 0,
807e9869 2083 .model_id = "",
c6dc6f63
AP
2084 },
2085 {
2086 .name = "pentium3",
3046bb5d 2087 .level = 3,
99b88a17 2088 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
2089 .family = 6,
2090 .model = 7,
2091 .stepping = 3,
0514ef2f 2092 .features[FEAT_1_EDX] =
27861ecc 2093 PENTIUM3_FEATURES,
c6dc6f63 2094 .xlevel = 0,
807e9869 2095 .model_id = "",
c6dc6f63
AP
2096 },
2097 {
2098 .name = "athlon",
2099 .level = 2,
99b88a17 2100 .vendor = CPUID_VENDOR_AMD,
c6dc6f63
AP
2101 .family = 6,
2102 .model = 2,
2103 .stepping = 3,
0514ef2f 2104 .features[FEAT_1_EDX] =
27861ecc 2105 PPRO_FEATURES | CPUID_PSE36 | CPUID_VME | CPUID_MTRR |
60032ac0 2106 CPUID_MCA,
0514ef2f 2107 .features[FEAT_8000_0001_EDX] =
60032ac0 2108 CPUID_EXT2_MMXEXT | CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT,
c6dc6f63 2109 .xlevel = 0x80000008,
9cf2cc3d 2110 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
c6dc6f63
AP
2111 },
2112 {
2113 .name = "n270",
3046bb5d 2114 .level = 10,
99b88a17 2115 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
2116 .family = 6,
2117 .model = 28,
2118 .stepping = 2,
b9fc20bc 2119 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
0514ef2f 2120 .features[FEAT_1_EDX] =
27861ecc 2121 PPRO_FEATURES |
b9fc20bc
EH
2122 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_VME |
2123 CPUID_ACPI | CPUID_SS,
c6dc6f63 2124 /* Some CPUs got no CPUID_SEP */
b9fc20bc
EH
2125 /* Missing: CPUID_EXT_DSCPL, CPUID_EXT_EST, CPUID_EXT_TM2,
2126 * CPUID_EXT_XTPR */
0514ef2f 2127 .features[FEAT_1_ECX] =
27861ecc 2128 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
4458c236 2129 CPUID_EXT_MOVBE,
0514ef2f 2130 .features[FEAT_8000_0001_EDX] =
60032ac0 2131 CPUID_EXT2_NX,
0514ef2f 2132 .features[FEAT_8000_0001_ECX] =
27861ecc 2133 CPUID_EXT3_LAHF_LM,
3046bb5d 2134 .xlevel = 0x80000008,
c6dc6f63
AP
2135 .model_id = "Intel(R) Atom(TM) CPU N270 @ 1.60GHz",
2136 },
3eca4642
EH
2137 {
2138 .name = "Conroe",
3046bb5d 2139 .level = 10,
99b88a17 2140 .vendor = CPUID_VENDOR_INTEL,
3eca4642 2141 .family = 6,
ffce9ebb 2142 .model = 15,
3eca4642 2143 .stepping = 3,
0514ef2f 2144 .features[FEAT_1_EDX] =
b3a4f0b1 2145 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
2146 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2147 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2148 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2149 CPUID_DE | CPUID_FP87,
0514ef2f 2150 .features[FEAT_1_ECX] =
27861ecc 2151 CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
0514ef2f 2152 .features[FEAT_8000_0001_EDX] =
27861ecc 2153 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
0514ef2f 2154 .features[FEAT_8000_0001_ECX] =
27861ecc 2155 CPUID_EXT3_LAHF_LM,
0723cc8a
PB
2156 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
2157 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
2158 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
2159 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2160 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2161 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
2162 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2163 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2164 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2165 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2166 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2167 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2168 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2169 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2170 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2171 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2172 .features[FEAT_VMX_SECONDARY_CTLS] =
2173 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES,
3046bb5d 2174 .xlevel = 0x80000008,
3eca4642
EH
2175 .model_id = "Intel Celeron_4x0 (Conroe/Merom Class Core 2)",
2176 },
2177 {
2178 .name = "Penryn",
3046bb5d 2179 .level = 10,
99b88a17 2180 .vendor = CPUID_VENDOR_INTEL,
3eca4642 2181 .family = 6,
ffce9ebb 2182 .model = 23,
3eca4642 2183 .stepping = 3,
0514ef2f 2184 .features[FEAT_1_EDX] =
b3a4f0b1 2185 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
2186 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2187 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2188 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2189 CPUID_DE | CPUID_FP87,
0514ef2f 2190 .features[FEAT_1_ECX] =
27861ecc 2191 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
b3fb3a20 2192 CPUID_EXT_SSE3,
0514ef2f 2193 .features[FEAT_8000_0001_EDX] =
27861ecc 2194 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
0514ef2f 2195 .features[FEAT_8000_0001_ECX] =
27861ecc 2196 CPUID_EXT3_LAHF_LM,
0723cc8a
PB
2197 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
2198 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2199 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL,
2200 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT |
2201 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL,
2202 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2203 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2204 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
2205 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2206 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2207 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2208 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2209 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2210 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2211 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2212 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2213 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2214 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2215 .features[FEAT_VMX_SECONDARY_CTLS] =
2216 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2217 VMX_SECONDARY_EXEC_WBINVD_EXITING,
3046bb5d 2218 .xlevel = 0x80000008,
3eca4642
EH
2219 .model_id = "Intel Core 2 Duo P9xxx (Penryn Class Core 2)",
2220 },
2221 {
2222 .name = "Nehalem",
3046bb5d 2223 .level = 11,
99b88a17 2224 .vendor = CPUID_VENDOR_INTEL,
3eca4642 2225 .family = 6,
ffce9ebb 2226 .model = 26,
3eca4642 2227 .stepping = 3,
0514ef2f 2228 .features[FEAT_1_EDX] =
b3a4f0b1 2229 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
2230 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2231 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2232 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2233 CPUID_DE | CPUID_FP87,
0514ef2f 2234 .features[FEAT_1_ECX] =
27861ecc 2235 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
b3fb3a20 2236 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
0514ef2f 2237 .features[FEAT_8000_0001_EDX] =
27861ecc 2238 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
0514ef2f 2239 .features[FEAT_8000_0001_ECX] =
27861ecc 2240 CPUID_EXT3_LAHF_LM,
0723cc8a
PB
2241 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2242 MSR_VMX_BASIC_TRUE_CTLS,
2243 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2244 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2245 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2246 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2247 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2248 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2249 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2250 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2251 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2252 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
2253 .features[FEAT_VMX_EXIT_CTLS] =
2254 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2255 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2256 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2257 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2258 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2259 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2260 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2261 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2262 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
2263 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2264 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2265 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2266 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2267 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2268 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2269 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2270 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2271 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2272 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2273 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2274 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2275 .features[FEAT_VMX_SECONDARY_CTLS] =
2276 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2277 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2278 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2279 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2280 VMX_SECONDARY_EXEC_ENABLE_VPID,
3046bb5d 2281 .xlevel = 0x80000008,
3eca4642 2282 .model_id = "Intel Core i7 9xx (Nehalem Class Core i7)",
d86a7088
EH
2283 .versions = (X86CPUVersionDefinition[]) {
2284 { .version = 1 },
2285 {
2286 .version = 2,
53db89d9 2287 .alias = "Nehalem-IBRS",
d86a7088
EH
2288 .props = (PropValue[]) {
2289 { "spec-ctrl", "on" },
2290 { "model-id",
2291 "Intel Core i7 9xx (Nehalem Core i7, IBRS update)" },
2292 { /* end of list */ }
2293 }
2294 },
2295 { /* end of list */ }
2296 }
3eca4642
EH
2297 },
2298 {
2299 .name = "Westmere",
2300 .level = 11,
99b88a17 2301 .vendor = CPUID_VENDOR_INTEL,
3eca4642
EH
2302 .family = 6,
2303 .model = 44,
2304 .stepping = 1,
0514ef2f 2305 .features[FEAT_1_EDX] =
b3a4f0b1 2306 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
2307 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2308 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2309 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2310 CPUID_DE | CPUID_FP87,
0514ef2f 2311 .features[FEAT_1_ECX] =
27861ecc 2312 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
b3fb3a20
EH
2313 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2314 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
0514ef2f 2315 .features[FEAT_8000_0001_EDX] =
27861ecc 2316 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
0514ef2f 2317 .features[FEAT_8000_0001_ECX] =
27861ecc 2318 CPUID_EXT3_LAHF_LM,
28b8e4d0
JK
2319 .features[FEAT_6_EAX] =
2320 CPUID_6_EAX_ARAT,
0723cc8a
PB
2321 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2322 MSR_VMX_BASIC_TRUE_CTLS,
2323 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2324 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2325 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2326 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2327 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2328 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2329 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2330 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2331 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2332 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
2333 .features[FEAT_VMX_EXIT_CTLS] =
2334 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2335 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2336 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2337 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2338 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2339 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2340 MSR_VMX_MISC_STORE_LMA,
2341 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2342 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2343 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
2344 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2345 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2346 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2347 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2348 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2349 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2350 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2351 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2352 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2353 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2354 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2355 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2356 .features[FEAT_VMX_SECONDARY_CTLS] =
2357 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2358 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2359 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2360 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2361 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST,
3046bb5d 2362 .xlevel = 0x80000008,
3eca4642 2363 .model_id = "Westmere E56xx/L56xx/X56xx (Nehalem-C)",
d86a7088
EH
2364 .versions = (X86CPUVersionDefinition[]) {
2365 { .version = 1 },
2366 {
2367 .version = 2,
53db89d9 2368 .alias = "Westmere-IBRS",
d86a7088
EH
2369 .props = (PropValue[]) {
2370 { "spec-ctrl", "on" },
2371 { "model-id",
2372 "Westmere E56xx/L56xx/X56xx (IBRS update)" },
2373 { /* end of list */ }
2374 }
2375 },
2376 { /* end of list */ }
2377 }
3eca4642
EH
2378 },
2379 {
2380 .name = "SandyBridge",
2381 .level = 0xd,
99b88a17 2382 .vendor = CPUID_VENDOR_INTEL,
3eca4642
EH
2383 .family = 6,
2384 .model = 42,
2385 .stepping = 1,
0514ef2f 2386 .features[FEAT_1_EDX] =
b3a4f0b1 2387 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
2388 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2389 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2390 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2391 CPUID_DE | CPUID_FP87,
0514ef2f 2392 .features[FEAT_1_ECX] =
27861ecc 2393 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
b3fb3a20
EH
2394 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
2395 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2396 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
2397 CPUID_EXT_SSE3,
0514ef2f 2398 .features[FEAT_8000_0001_EDX] =
27861ecc 2399 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
b3fb3a20 2400 CPUID_EXT2_SYSCALL,
0514ef2f 2401 .features[FEAT_8000_0001_ECX] =
27861ecc 2402 CPUID_EXT3_LAHF_LM,
0bb0b2d2
PB
2403 .features[FEAT_XSAVE] =
2404 CPUID_XSAVE_XSAVEOPT,
28b8e4d0
JK
2405 .features[FEAT_6_EAX] =
2406 CPUID_6_EAX_ARAT,
0723cc8a
PB
2407 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2408 MSR_VMX_BASIC_TRUE_CTLS,
2409 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2410 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2411 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2412 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2413 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2414 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2415 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2416 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2417 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2418 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
2419 .features[FEAT_VMX_EXIT_CTLS] =
2420 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2421 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2422 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2423 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2424 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2425 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2426 MSR_VMX_MISC_STORE_LMA,
2427 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2428 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2429 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
2430 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2431 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2432 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2433 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2434 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2435 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2436 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2437 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2438 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2439 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2440 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2441 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2442 .features[FEAT_VMX_SECONDARY_CTLS] =
2443 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2444 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2445 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2446 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2447 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST,
3046bb5d 2448 .xlevel = 0x80000008,
3eca4642 2449 .model_id = "Intel Xeon E312xx (Sandy Bridge)",
d86a7088
EH
2450 .versions = (X86CPUVersionDefinition[]) {
2451 { .version = 1 },
2452 {
2453 .version = 2,
53db89d9 2454 .alias = "SandyBridge-IBRS",
d86a7088
EH
2455 .props = (PropValue[]) {
2456 { "spec-ctrl", "on" },
2457 { "model-id",
2458 "Intel Xeon E312xx (Sandy Bridge, IBRS update)" },
2459 { /* end of list */ }
2460 }
2461 },
2462 { /* end of list */ }
2463 }
3eca4642 2464 },
2f9ac42a
PB
2465 {
2466 .name = "IvyBridge",
2467 .level = 0xd,
2468 .vendor = CPUID_VENDOR_INTEL,
2469 .family = 6,
2470 .model = 58,
2471 .stepping = 9,
2472 .features[FEAT_1_EDX] =
2473 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2474 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2475 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2476 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2477 CPUID_DE | CPUID_FP87,
2478 .features[FEAT_1_ECX] =
2479 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2480 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
2481 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2482 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
2483 CPUID_EXT_SSE3 | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2484 .features[FEAT_7_0_EBX] =
2485 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP |
2486 CPUID_7_0_EBX_ERMS,
2487 .features[FEAT_8000_0001_EDX] =
2488 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2489 CPUID_EXT2_SYSCALL,
2490 .features[FEAT_8000_0001_ECX] =
2491 CPUID_EXT3_LAHF_LM,
2492 .features[FEAT_XSAVE] =
2493 CPUID_XSAVE_XSAVEOPT,
28b8e4d0
JK
2494 .features[FEAT_6_EAX] =
2495 CPUID_6_EAX_ARAT,
0723cc8a
PB
2496 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2497 MSR_VMX_BASIC_TRUE_CTLS,
2498 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2499 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2500 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2501 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2502 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2503 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2504 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2505 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2506 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2507 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
2508 .features[FEAT_VMX_EXIT_CTLS] =
2509 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2510 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2511 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2512 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2513 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2514 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2515 MSR_VMX_MISC_STORE_LMA,
2516 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2517 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2518 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
2519 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2520 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2521 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2522 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2523 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2524 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2525 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2526 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2527 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2528 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2529 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2530 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2531 .features[FEAT_VMX_SECONDARY_CTLS] =
2532 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2533 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2534 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2535 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2536 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
2537 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
2538 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
2539 VMX_SECONDARY_EXEC_RDRAND_EXITING,
3046bb5d 2540 .xlevel = 0x80000008,
2f9ac42a 2541 .model_id = "Intel Xeon E3-12xx v2 (Ivy Bridge)",
d86a7088
EH
2542 .versions = (X86CPUVersionDefinition[]) {
2543 { .version = 1 },
2544 {
2545 .version = 2,
53db89d9 2546 .alias = "IvyBridge-IBRS",
d86a7088
EH
2547 .props = (PropValue[]) {
2548 { "spec-ctrl", "on" },
2549 { "model-id",
2550 "Intel Xeon E3-12xx v2 (Ivy Bridge, IBRS)" },
2551 { /* end of list */ }
2552 }
2553 },
2554 { /* end of list */ }
2555 }
2f9ac42a 2556 },
ac96c413 2557 {
37507094
EH
2558 .name = "Haswell",
2559 .level = 0xd,
99b88a17 2560 .vendor = CPUID_VENDOR_INTEL,
37507094
EH
2561 .family = 6,
2562 .model = 60,
ec56a4a7 2563 .stepping = 4,
0514ef2f 2564 .features[FEAT_1_EDX] =
b3a4f0b1 2565 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
2566 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2567 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2568 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2569 CPUID_DE | CPUID_FP87,
0514ef2f 2570 .features[FEAT_1_ECX] =
27861ecc 2571 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
b3fb3a20
EH
2572 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2573 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2574 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2575 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
78a611f1 2576 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
0514ef2f 2577 .features[FEAT_8000_0001_EDX] =
27861ecc 2578 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
b3fb3a20 2579 CPUID_EXT2_SYSCALL,
0514ef2f 2580 .features[FEAT_8000_0001_ECX] =
becb6667 2581 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
0514ef2f 2582 .features[FEAT_7_0_EBX] =
27861ecc 2583 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
1ee91598
EH
2584 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2585 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2586 CPUID_7_0_EBX_RTM,
0bb0b2d2
PB
2587 .features[FEAT_XSAVE] =
2588 CPUID_XSAVE_XSAVEOPT,
28b8e4d0
JK
2589 .features[FEAT_6_EAX] =
2590 CPUID_6_EAX_ARAT,
0723cc8a
PB
2591 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2592 MSR_VMX_BASIC_TRUE_CTLS,
2593 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2594 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2595 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2596 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2597 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2598 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2599 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2600 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2601 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2602 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
2603 .features[FEAT_VMX_EXIT_CTLS] =
2604 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2605 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2606 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2607 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2608 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2609 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2610 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
2611 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2612 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2613 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
2614 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2615 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2616 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2617 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2618 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2619 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2620 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2621 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2622 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2623 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2624 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2625 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2626 .features[FEAT_VMX_SECONDARY_CTLS] =
2627 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2628 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2629 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2630 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2631 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
2632 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
2633 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
2634 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
2635 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS,
2636 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3046bb5d 2637 .xlevel = 0x80000008,
37507094 2638 .model_id = "Intel Core Processor (Haswell)",
d86a7088
EH
2639 .versions = (X86CPUVersionDefinition[]) {
2640 { .version = 1 },
2641 {
2642 .version = 2,
53db89d9 2643 .alias = "Haswell-noTSX",
d86a7088
EH
2644 .props = (PropValue[]) {
2645 { "hle", "off" },
2646 { "rtm", "off" },
2647 { "stepping", "1" },
2648 { "model-id", "Intel Core Processor (Haswell, no TSX)", },
2649 { /* end of list */ }
2650 },
2651 },
2652 {
2653 .version = 3,
53db89d9 2654 .alias = "Haswell-IBRS",
d86a7088
EH
2655 .props = (PropValue[]) {
2656 /* Restore TSX features removed by -v2 above */
2657 { "hle", "on" },
2658 { "rtm", "on" },
2659 /*
2660 * Haswell and Haswell-IBRS had stepping=4 in
2661 * QEMU 4.0 and older
2662 */
2663 { "stepping", "4" },
2664 { "spec-ctrl", "on" },
2665 { "model-id",
2666 "Intel Core Processor (Haswell, IBRS)" },
2667 { /* end of list */ }
2668 }
2669 },
2670 {
2671 .version = 4,
53db89d9 2672 .alias = "Haswell-noTSX-IBRS",
d86a7088
EH
2673 .props = (PropValue[]) {
2674 { "hle", "off" },
2675 { "rtm", "off" },
2676 /* spec-ctrl was already enabled by -v3 above */
2677 { "stepping", "1" },
2678 { "model-id",
2679 "Intel Core Processor (Haswell, no TSX, IBRS)" },
2680 { /* end of list */ }
2681 }
2682 },
2683 { /* end of list */ }
2684 }
37507094 2685 },
ece01354
EH
2686 {
2687 .name = "Broadwell",
2688 .level = 0xd,
2689 .vendor = CPUID_VENDOR_INTEL,
2690 .family = 6,
2691 .model = 61,
2692 .stepping = 2,
2693 .features[FEAT_1_EDX] =
b3a4f0b1 2694 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
ece01354
EH
2695 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2696 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2697 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2698 CPUID_DE | CPUID_FP87,
2699 .features[FEAT_1_ECX] =
2700 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2701 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2702 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2703 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2704 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
78a611f1 2705 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
ece01354
EH
2706 .features[FEAT_8000_0001_EDX] =
2707 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2708 CPUID_EXT2_SYSCALL,
2709 .features[FEAT_8000_0001_ECX] =
becb6667 2710 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
ece01354
EH
2711 .features[FEAT_7_0_EBX] =
2712 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
1ee91598 2713 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
ece01354 2714 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
1ee91598 2715 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
ece01354 2716 CPUID_7_0_EBX_SMAP,
0bb0b2d2
PB
2717 .features[FEAT_XSAVE] =
2718 CPUID_XSAVE_XSAVEOPT,
28b8e4d0
JK
2719 .features[FEAT_6_EAX] =
2720 CPUID_6_EAX_ARAT,
0723cc8a
PB
2721 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2722 MSR_VMX_BASIC_TRUE_CTLS,
2723 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2724 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2725 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2726 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2727 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2728 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2729 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2730 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2731 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2732 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
2733 .features[FEAT_VMX_EXIT_CTLS] =
2734 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2735 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2736 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2737 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2738 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2739 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2740 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
2741 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2742 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2743 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
2744 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2745 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2746 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2747 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2748 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2749 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2750 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2751 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2752 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2753 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2754 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2755 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2756 .features[FEAT_VMX_SECONDARY_CTLS] =
2757 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2758 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2759 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2760 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2761 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
2762 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
2763 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
2764 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
2765 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
2766 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
2767 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3046bb5d 2768 .xlevel = 0x80000008,
ece01354 2769 .model_id = "Intel Core Processor (Broadwell)",
d86a7088
EH
2770 .versions = (X86CPUVersionDefinition[]) {
2771 { .version = 1 },
2772 {
2773 .version = 2,
53db89d9 2774 .alias = "Broadwell-noTSX",
d86a7088
EH
2775 .props = (PropValue[]) {
2776 { "hle", "off" },
2777 { "rtm", "off" },
2778 { "model-id", "Intel Core Processor (Broadwell, no TSX)", },
2779 { /* end of list */ }
2780 },
2781 },
2782 {
2783 .version = 3,
53db89d9 2784 .alias = "Broadwell-IBRS",
d86a7088
EH
2785 .props = (PropValue[]) {
2786 /* Restore TSX features removed by -v2 above */
2787 { "hle", "on" },
2788 { "rtm", "on" },
2789 { "spec-ctrl", "on" },
2790 { "model-id",
2791 "Intel Core Processor (Broadwell, IBRS)" },
2792 { /* end of list */ }
2793 }
2794 },
2795 {
2796 .version = 4,
53db89d9 2797 .alias = "Broadwell-noTSX-IBRS",
d86a7088
EH
2798 .props = (PropValue[]) {
2799 { "hle", "off" },
2800 { "rtm", "off" },
2801 /* spec-ctrl was already enabled by -v3 above */
2802 { "model-id",
2803 "Intel Core Processor (Broadwell, no TSX, IBRS)" },
2804 { /* end of list */ }
2805 }
2806 },
2807 { /* end of list */ }
2808 }
ece01354 2809 },
f6f949e9
EH
2810 {
2811 .name = "Skylake-Client",
2812 .level = 0xd,
2813 .vendor = CPUID_VENDOR_INTEL,
2814 .family = 6,
2815 .model = 94,
2816 .stepping = 3,
2817 .features[FEAT_1_EDX] =
2818 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2819 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2820 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2821 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2822 CPUID_DE | CPUID_FP87,
2823 .features[FEAT_1_ECX] =
2824 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2825 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2826 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2827 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2828 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2829 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2830 .features[FEAT_8000_0001_EDX] =
2831 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2832 CPUID_EXT2_SYSCALL,
2833 .features[FEAT_8000_0001_ECX] =
2834 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2835 .features[FEAT_7_0_EBX] =
2836 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2837 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2838 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2839 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
ecb85fe4 2840 CPUID_7_0_EBX_SMAP,
7bde6b18 2841 /* XSAVES is added in version 4 */
f6f949e9
EH
2842 .features[FEAT_XSAVE] =
2843 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2844 CPUID_XSAVE_XGETBV1,
2845 .features[FEAT_6_EAX] =
2846 CPUID_6_EAX_ARAT,
0723cc8a
PB
2847 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
2848 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2849 MSR_VMX_BASIC_TRUE_CTLS,
2850 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2851 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2852 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2853 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2854 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2855 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2856 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2857 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2858 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2859 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
2860 .features[FEAT_VMX_EXIT_CTLS] =
2861 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2862 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2863 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2864 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2865 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2866 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2867 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
2868 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2869 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2870 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
2871 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2872 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2873 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2874 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2875 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2876 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2877 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2878 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2879 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2880 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2881 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2882 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2883 .features[FEAT_VMX_SECONDARY_CTLS] =
2884 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2885 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2886 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2887 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
2888 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
2889 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
2890 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
2891 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
f6f949e9
EH
2892 .xlevel = 0x80000008,
2893 .model_id = "Intel Core Processor (Skylake)",
d86a7088
EH
2894 .versions = (X86CPUVersionDefinition[]) {
2895 { .version = 1 },
2896 {
2897 .version = 2,
53db89d9 2898 .alias = "Skylake-Client-IBRS",
d86a7088
EH
2899 .props = (PropValue[]) {
2900 { "spec-ctrl", "on" },
2901 { "model-id",
2902 "Intel Core Processor (Skylake, IBRS)" },
2903 { /* end of list */ }
2904 }
2905 },
9ab2237f
EH
2906 {
2907 .version = 3,
02fa60d1 2908 .alias = "Skylake-Client-noTSX-IBRS",
9ab2237f
EH
2909 .props = (PropValue[]) {
2910 { "hle", "off" },
2911 { "rtm", "off" },
673b0add
KC
2912 { "model-id",
2913 "Intel Core Processor (Skylake, IBRS, no TSX)" },
9ab2237f
EH
2914 { /* end of list */ }
2915 }
2916 },
7bde6b18
VK
2917 {
2918 .version = 4,
2919 .note = "IBRS, XSAVES, no TSX",
2920 .props = (PropValue[]) {
2921 { "xsaves", "on" },
2922 { "vmx-xsaves", "on" },
2923 { /* end of list */ }
2924 }
2925 },
d86a7088
EH
2926 { /* end of list */ }
2927 }
f6f949e9 2928 },
53f9a6f4
BF
2929 {
2930 .name = "Skylake-Server",
2931 .level = 0xd,
2932 .vendor = CPUID_VENDOR_INTEL,
2933 .family = 6,
2934 .model = 85,
2935 .stepping = 4,
2936 .features[FEAT_1_EDX] =
2937 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2938 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2939 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2940 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2941 CPUID_DE | CPUID_FP87,
2942 .features[FEAT_1_ECX] =
2943 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2944 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2945 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2946 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2947 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2948 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2949 .features[FEAT_8000_0001_EDX] =
2950 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
2951 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2952 .features[FEAT_8000_0001_ECX] =
2953 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2954 .features[FEAT_7_0_EBX] =
2955 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2956 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2957 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2958 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
ecb85fe4 2959 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
53f9a6f4
BF
2960 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
2961 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
c68bcb3a 2962 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
09b9ee64
TX
2963 .features[FEAT_7_0_ECX] =
2964 CPUID_7_0_ECX_PKU,
7bde6b18 2965 /* XSAVES is added in version 5 */
53f9a6f4
BF
2966 .features[FEAT_XSAVE] =
2967 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2968 CPUID_XSAVE_XGETBV1,
2969 .features[FEAT_6_EAX] =
2970 CPUID_6_EAX_ARAT,
0723cc8a
PB
2971 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
2972 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2973 MSR_VMX_BASIC_TRUE_CTLS,
2974 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2975 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2976 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2977 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2978 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2979 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2980 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2981 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2982 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2983 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
2984 .features[FEAT_VMX_EXIT_CTLS] =
2985 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2986 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2987 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2988 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2989 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2990 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2991 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
2992 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2993 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2994 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
2995 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2996 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2997 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2998 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2999 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3000 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3001 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3002 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3003 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3004 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3005 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3006 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3007 .features[FEAT_VMX_SECONDARY_CTLS] =
3008 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3009 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3010 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3011 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3012 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3013 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3014 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3015 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
c6f3215f
PB
3016 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3017 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
53f9a6f4
BF
3018 .xlevel = 0x80000008,
3019 .model_id = "Intel Xeon Processor (Skylake)",
d86a7088
EH
3020 .versions = (X86CPUVersionDefinition[]) {
3021 { .version = 1 },
3022 {
3023 .version = 2,
53db89d9 3024 .alias = "Skylake-Server-IBRS",
d86a7088
EH
3025 .props = (PropValue[]) {
3026 /* clflushopt was not added to Skylake-Server-IBRS */
3027 /* TODO: add -v3 including clflushopt */
3028 { "clflushopt", "off" },
3029 { "spec-ctrl", "on" },
3030 { "model-id",
3031 "Intel Xeon Processor (Skylake, IBRS)" },
3032 { /* end of list */ }
3033 }
3034 },
9ab2237f
EH
3035 {
3036 .version = 3,
02fa60d1 3037 .alias = "Skylake-Server-noTSX-IBRS",
9ab2237f
EH
3038 .props = (PropValue[]) {
3039 { "hle", "off" },
3040 { "rtm", "off" },
673b0add
KC
3041 { "model-id",
3042 "Intel Xeon Processor (Skylake, IBRS, no TSX)" },
9ab2237f
EH
3043 { /* end of list */ }
3044 }
3045 },
644e3c5d
CQ
3046 {
3047 .version = 4,
3048 .props = (PropValue[]) {
3049 { "vmx-eptp-switching", "on" },
3050 { /* end of list */ }
3051 }
3052 },
7bde6b18
VK
3053 {
3054 .version = 5,
3055 .note = "IBRS, XSAVES, EPT switching, no TSX",
3056 .props = (PropValue[]) {
3057 { "xsaves", "on" },
3058 { "vmx-xsaves", "on" },
3059 { /* end of list */ }
3060 }
3061 },
d86a7088
EH
3062 { /* end of list */ }
3063 }
53f9a6f4 3064 },
c7a88b52
TX
3065 {
3066 .name = "Cascadelake-Server",
3067 .level = 0xd,
3068 .vendor = CPUID_VENDOR_INTEL,
3069 .family = 6,
3070 .model = 85,
b0a19803 3071 .stepping = 6,
c7a88b52
TX
3072 .features[FEAT_1_EDX] =
3073 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3074 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3075 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3076 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3077 CPUID_DE | CPUID_FP87,
3078 .features[FEAT_1_ECX] =
3079 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3080 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3081 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3082 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3083 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3084 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3085 .features[FEAT_8000_0001_EDX] =
3086 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3087 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3088 .features[FEAT_8000_0001_ECX] =
3089 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3090 .features[FEAT_7_0_EBX] =
3091 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3092 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3093 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3094 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
ecb85fe4 3095 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
c7a88b52
TX
3096 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
3097 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
4c257911 3098 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
c7a88b52 3099 .features[FEAT_7_0_ECX] =
bb4928c7 3100 CPUID_7_0_ECX_PKU |
c7a88b52
TX
3101 CPUID_7_0_ECX_AVX512VNNI,
3102 .features[FEAT_7_0_EDX] =
3103 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
7bde6b18 3104 /* XSAVES is added in version 5 */
c7a88b52
TX
3105 .features[FEAT_XSAVE] =
3106 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3107 CPUID_XSAVE_XGETBV1,
3108 .features[FEAT_6_EAX] =
3109 CPUID_6_EAX_ARAT,
0723cc8a
PB
3110 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3111 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3112 MSR_VMX_BASIC_TRUE_CTLS,
3113 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3114 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3115 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3116 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3117 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3118 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3119 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3120 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3121 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3122 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3123 .features[FEAT_VMX_EXIT_CTLS] =
3124 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3125 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3126 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3127 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3128 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3129 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3130 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3131 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3132 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3133 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3134 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3135 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3136 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3137 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3138 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3139 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3140 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3141 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3142 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3143 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3144 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3145 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3146 .features[FEAT_VMX_SECONDARY_CTLS] =
3147 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3148 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3149 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3150 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3151 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3152 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3153 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3154 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
c6f3215f
PB
3155 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3156 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
c7a88b52
TX
3157 .xlevel = 0x80000008,
3158 .model_id = "Intel Xeon Processor (Cascadelake)",
fd63c6d1
EH
3159 .versions = (X86CPUVersionDefinition[]) {
3160 { .version = 1 },
3161 { .version = 2,
47f0d11d 3162 .note = "ARCH_CAPABILITIES",
fd63c6d1
EH
3163 .props = (PropValue[]) {
3164 { "arch-capabilities", "on" },
3165 { "rdctl-no", "on" },
3166 { "ibrs-all", "on" },
3167 { "skip-l1dfl-vmentry", "on" },
3168 { "mds-no", "on" },
3169 { /* end of list */ }
3170 },
3171 },
9ab2237f 3172 { .version = 3,
02fa60d1 3173 .alias = "Cascadelake-Server-noTSX",
47f0d11d 3174 .note = "ARCH_CAPABILITIES, no TSX",
9ab2237f
EH
3175 .props = (PropValue[]) {
3176 { "hle", "off" },
3177 { "rtm", "off" },
3178 { /* end of list */ }
3179 },
3180 },
644e3c5d
CQ
3181 { .version = 4,
3182 .note = "ARCH_CAPABILITIES, no TSX",
3183 .props = (PropValue[]) {
3184 { "vmx-eptp-switching", "on" },
3185 { /* end of list */ }
3186 },
3187 },
7bde6b18
VK
3188 { .version = 5,
3189 .note = "ARCH_CAPABILITIES, EPT switching, XSAVES, no TSX",
3190 .props = (PropValue[]) {
3191 { "xsaves", "on" },
3192 { "vmx-xsaves", "on" },
3193 { /* end of list */ }
3194 },
3195 },
fd63c6d1
EH
3196 { /* end of list */ }
3197 }
c7a88b52 3198 },
22a866b6
CZ
3199 {
3200 .name = "Cooperlake",
3201 .level = 0xd,
3202 .vendor = CPUID_VENDOR_INTEL,
3203 .family = 6,
3204 .model = 85,
3205 .stepping = 10,
3206 .features[FEAT_1_EDX] =
3207 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3208 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3209 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3210 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3211 CPUID_DE | CPUID_FP87,
3212 .features[FEAT_1_ECX] =
3213 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3214 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3215 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3216 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3217 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3218 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3219 .features[FEAT_8000_0001_EDX] =
3220 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3221 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3222 .features[FEAT_8000_0001_ECX] =
3223 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3224 .features[FEAT_7_0_EBX] =
3225 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3226 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3227 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3228 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3229 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
3230 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
3231 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
3232 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
3233 .features[FEAT_7_0_ECX] =
3234 CPUID_7_0_ECX_PKU |
3235 CPUID_7_0_ECX_AVX512VNNI,
3236 .features[FEAT_7_0_EDX] =
3237 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_STIBP |
3238 CPUID_7_0_EDX_SPEC_CTRL_SSBD | CPUID_7_0_EDX_ARCH_CAPABILITIES,
3239 .features[FEAT_ARCH_CAPABILITIES] =
3240 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
2dea9d9c
XL
3241 MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
3242 MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO,
22a866b6 3243 .features[FEAT_7_1_EAX] =
f429dbf8 3244 CPUID_7_1_EAX_AVX512_BF16,
7bde6b18 3245 /* XSAVES is added in version 2 */
22a866b6
CZ
3246 .features[FEAT_XSAVE] =
3247 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3248 CPUID_XSAVE_XGETBV1,
3249 .features[FEAT_6_EAX] =
3250 CPUID_6_EAX_ARAT,
2dea9d9c
XL
3251 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3252 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3253 MSR_VMX_BASIC_TRUE_CTLS,
3254 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3255 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3256 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3257 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3258 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3259 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3260 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3261 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3262 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3263 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3264 .features[FEAT_VMX_EXIT_CTLS] =
3265 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3266 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3267 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3268 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3269 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3270 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3271 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3272 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3273 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3274 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3275 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3276 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3277 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3278 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3279 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3280 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3281 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3282 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3283 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3284 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3285 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3286 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3287 .features[FEAT_VMX_SECONDARY_CTLS] =
3288 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3289 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3290 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3291 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3292 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3293 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3294 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3295 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3296 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3297 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3298 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
22a866b6
CZ
3299 .xlevel = 0x80000008,
3300 .model_id = "Intel Xeon Processor (Cooperlake)",
7bde6b18
VK
3301 .versions = (X86CPUVersionDefinition[]) {
3302 { .version = 1 },
3303 { .version = 2,
3304 .note = "XSAVES",
3305 .props = (PropValue[]) {
3306 { "xsaves", "on" },
3307 { "vmx-xsaves", "on" },
3308 { /* end of list */ }
3309 },
3310 },
3311 { /* end of list */ }
3312 }
22a866b6 3313 },
8a11c62d
RH
3314 {
3315 .name = "Icelake-Server",
3316 .level = 0xd,
3317 .vendor = CPUID_VENDOR_INTEL,
3318 .family = 6,
3319 .model = 134,
3320 .stepping = 0,
3321 .features[FEAT_1_EDX] =
3322 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3323 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3324 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3325 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3326 CPUID_DE | CPUID_FP87,
3327 .features[FEAT_1_ECX] =
3328 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3329 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3330 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3331 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3332 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3333 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3334 .features[FEAT_8000_0001_EDX] =
3335 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3336 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3337 .features[FEAT_8000_0001_ECX] =
3338 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3339 .features[FEAT_8000_0008_EBX] =
3340 CPUID_8000_0008_EBX_WBNOINVD,
3341 .features[FEAT_7_0_EBX] =
3342 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3343 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3344 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3345 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
ecb85fe4 3346 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
8a11c62d
RH
3347 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
3348 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
4c257911 3349 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
8a11c62d 3350 .features[FEAT_7_0_ECX] =
e7694a5e
TX
3351 CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
3352 CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
8a11c62d
RH
3353 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
3354 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
3355 CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57,
3356 .features[FEAT_7_0_EDX] =
76e5a4d5 3357 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
7bde6b18 3358 /* XSAVES is added in version 5 */
8a11c62d
RH
3359 .features[FEAT_XSAVE] =
3360 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3361 CPUID_XSAVE_XGETBV1,
3362 .features[FEAT_6_EAX] =
3363 CPUID_6_EAX_ARAT,
0723cc8a
PB
3364 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3365 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3366 MSR_VMX_BASIC_TRUE_CTLS,
3367 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3368 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3369 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3370 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3371 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3372 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3373 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3374 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3375 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3376 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3377 .features[FEAT_VMX_EXIT_CTLS] =
3378 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3379 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3380 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3381 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3382 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3383 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3384 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3385 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3386 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3387 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3388 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3389 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3390 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3391 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3392 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3393 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3394 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3395 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3396 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3397 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3398 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3399 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3400 .features[FEAT_VMX_SECONDARY_CTLS] =
3401 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3402 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3403 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3404 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3405 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3406 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3407 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3408 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3409 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS,
8a11c62d
RH
3410 .xlevel = 0x80000008,
3411 .model_id = "Intel Xeon Processor (Icelake)",
9ab2237f
EH
3412 .versions = (X86CPUVersionDefinition[]) {
3413 { .version = 1 },
3414 {
3415 .version = 2,
47f0d11d 3416 .note = "no TSX",
02fa60d1 3417 .alias = "Icelake-Server-noTSX",
9ab2237f
EH
3418 .props = (PropValue[]) {
3419 { "hle", "off" },
3420 { "rtm", "off" },
3421 { /* end of list */ }
3422 },
3423 },
d965dc35
XL
3424 {
3425 .version = 3,
3426 .props = (PropValue[]) {
3427 { "arch-capabilities", "on" },
3428 { "rdctl-no", "on" },
3429 { "ibrs-all", "on" },
3430 { "skip-l1dfl-vmentry", "on" },
3431 { "mds-no", "on" },
3432 { "pschange-mc-no", "on" },
3433 { "taa-no", "on" },
3434 { /* end of list */ }
3435 },
3436 },
e0013791
CQ
3437 {
3438 .version = 4,
3439 .props = (PropValue[]) {
3440 { "sha-ni", "on" },
3441 { "avx512ifma", "on" },
3442 { "rdpid", "on" },
3443 { "fsrm", "on" },
3444 { "vmx-rdseed-exit", "on" },
3445 { "vmx-pml", "on" },
3446 { "vmx-eptp-switching", "on" },
3447 { "model", "106" },
3448 { /* end of list */ }
3449 },
3450 },
7bde6b18
VK
3451 {
3452 .version = 5,
3453 .note = "XSAVES",
3454 .props = (PropValue[]) {
3455 { "xsaves", "on" },
3456 { "vmx-xsaves", "on" },
3457 { /* end of list */ }
3458 },
3459 },
12cab535
VK
3460 {
3461 .version = 6,
3462 .note = "5-level EPT",
3463 .props = (PropValue[]) {
3464 { "vmx-page-walk-5", "on" },
3465 { /* end of list */ }
3466 },
3467 },
9ab2237f
EH
3468 { /* end of list */ }
3469 }
8a11c62d 3470 },
7eb061b0
WL
3471 {
3472 .name = "SapphireRapids",
3473 .level = 0x20,
3474 .vendor = CPUID_VENDOR_INTEL,
3475 .family = 6,
3476 .model = 143,
3477 .stepping = 4,
3478 /*
3479 * please keep the ascending order so that we can have a clear view of
3480 * bit position of each feature.
3481 */
3482 .features[FEAT_1_EDX] =
3483 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
3484 CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
3485 CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
3486 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
3487 CPUID_SSE | CPUID_SSE2,
3488 .features[FEAT_1_ECX] =
3489 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 |
3490 CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 |
3491 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
3492 CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES |
3493 CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3494 .features[FEAT_8000_0001_EDX] =
3495 CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
3496 CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
3497 .features[FEAT_8000_0001_ECX] =
3498 CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH,
3499 .features[FEAT_8000_0008_EBX] =
3500 CPUID_8000_0008_EBX_WBNOINVD,
3501 .features[FEAT_7_0_EBX] =
3502 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_HLE |
3503 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 |
3504 CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_RTM |
3505 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
3506 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP |
3507 CPUID_7_0_EBX_AVX512IFMA | CPUID_7_0_EBX_CLFLUSHOPT |
3508 CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_SHA_NI |
3509 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512VL,
3510 .features[FEAT_7_0_ECX] =
3511 CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
3512 CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
3513 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
3514 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
3515 CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57 |
3516 CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT,
3517 .features[FEAT_7_0_EDX] =
3518 CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE |
3519 CPUID_7_0_EDX_TSX_LDTRK | CPUID_7_0_EDX_AMX_BF16 |
3520 CPUID_7_0_EDX_AVX512_FP16 | CPUID_7_0_EDX_AMX_TILE |
3521 CPUID_7_0_EDX_AMX_INT8 | CPUID_7_0_EDX_SPEC_CTRL |
3522 CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
3523 .features[FEAT_ARCH_CAPABILITIES] =
3524 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
3525 MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
3526 MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO,
3527 .features[FEAT_XSAVE] =
3528 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3529 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES | CPUID_D_1_EAX_XFD,
3530 .features[FEAT_6_EAX] =
3531 CPUID_6_EAX_ARAT,
3532 .features[FEAT_7_1_EAX] =
3533 CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_AVX512_BF16 |
3534 CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_FSRC,
3535 .features[FEAT_VMX_BASIC] =
3536 MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS,
3537 .features[FEAT_VMX_ENTRY_CTLS] =
3538 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE |
3539 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL |
3540 VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER,
3541 .features[FEAT_VMX_EPT_VPID_CAPS] =
3542 MSR_VMX_EPT_EXECONLY |
3543 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_PAGE_WALK_LENGTH_5 |
3544 MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB |
3545 MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS |
3546 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3547 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3548 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT |
3549 MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3550 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
3551 .features[FEAT_VMX_EXIT_CTLS] =
3552 VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3553 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3554 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT |
3555 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3556 VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3557 .features[FEAT_VMX_MISC] =
3558 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT |
3559 MSR_VMX_MISC_VMWRITE_VMEXIT,
3560 .features[FEAT_VMX_PINBASED_CTLS] =
3561 VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING |
3562 VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER |
3563 VMX_PIN_BASED_POSTED_INTR,
3564 .features[FEAT_VMX_PROCBASED_CTLS] =
3565 VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3566 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3567 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3568 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3569 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3570 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3571 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING |
3572 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
3573 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3574 VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
3575 VMX_CPU_BASED_PAUSE_EXITING |
3576 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3577 .features[FEAT_VMX_SECONDARY_CTLS] =
3578 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3579 VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC |
3580 VMX_SECONDARY_EXEC_RDTSCP |
3581 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3582 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING |
3583 VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3584 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3585 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3586 VMX_SECONDARY_EXEC_RDRAND_EXITING |
3587 VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3588 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3589 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML |
3590 VMX_SECONDARY_EXEC_XSAVES,
3591 .features[FEAT_VMX_VMFUNC] =
3592 MSR_VMX_VMFUNC_EPT_SWITCHING,
3593 .xlevel = 0x80000008,
3594 .model_id = "Intel Xeon Processor (SapphireRapids)",
3595 .versions = (X86CPUVersionDefinition[]) {
3596 { .version = 1 },
3597 { /* end of list */ },
3598 },
3599 },
8b44d860
TX
3600 {
3601 .name = "Denverton",
3602 .level = 21,
3603 .vendor = CPUID_VENDOR_INTEL,
3604 .family = 6,
3605 .model = 95,
3606 .stepping = 1,
3607 .features[FEAT_1_EDX] =
3608 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
3609 CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
3610 CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
3611 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
3612 CPUID_SSE | CPUID_SSE2,
3613 .features[FEAT_1_ECX] =
3614 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR |
3615 CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | CPUID_EXT_SSE41 |
3616 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
3617 CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER |
3618 CPUID_EXT_AES | CPUID_EXT_XSAVE | CPUID_EXT_RDRAND,
3619 .features[FEAT_8000_0001_EDX] =
3620 CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
3621 CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
3622 .features[FEAT_8000_0001_ECX] =
3623 CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3624 .features[FEAT_7_0_EBX] =
3625 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_ERMS |
3626 CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_SMAP |
3627 CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_SHA_NI,
3628 .features[FEAT_7_0_EDX] =
3629 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_ARCH_CAPABILITIES |
3630 CPUID_7_0_EDX_SPEC_CTRL_SSBD,
7bde6b18 3631 /* XSAVES is added in version 3 */
8b44d860
TX
3632 .features[FEAT_XSAVE] =
3633 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | CPUID_XSAVE_XGETBV1,
3634 .features[FEAT_6_EAX] =
3635 CPUID_6_EAX_ARAT,
3636 .features[FEAT_ARCH_CAPABILITIES] =
3637 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY,
0723cc8a
PB
3638 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3639 MSR_VMX_BASIC_TRUE_CTLS,
3640 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3641 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3642 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3643 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3644 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3645 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3646 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3647 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3648 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3649 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3650 .features[FEAT_VMX_EXIT_CTLS] =
3651 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3652 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3653 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3654 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3655 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3656 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3657 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3658 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3659 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3660 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3661 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3662 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3663 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3664 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3665 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3666 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3667 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3668 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3669 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3670 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3671 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3672 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3673 .features[FEAT_VMX_SECONDARY_CTLS] =
3674 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3675 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3676 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3677 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3678 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3679 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3680 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3681 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3682 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3683 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3684 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
8b44d860
TX
3685 .xlevel = 0x80000008,
3686 .model_id = "Intel Atom Processor (Denverton)",
ab0c942c
TX
3687 .versions = (X86CPUVersionDefinition[]) {
3688 { .version = 1 },
3689 {
3690 .version = 2,
47f0d11d 3691 .note = "no MPX, no MONITOR",
ab0c942c
TX
3692 .props = (PropValue[]) {
3693 { "monitor", "off" },
3694 { "mpx", "off" },
3695 { /* end of list */ },
3696 },
3697 },
7bde6b18
VK
3698 {
3699 .version = 3,
3700 .note = "XSAVES, no MPX, no MONITOR",
3701 .props = (PropValue[]) {
3702 { "xsaves", "on" },
3703 { "vmx-xsaves", "on" },
3704 { /* end of list */ },
3705 },
3706 },
ab0c942c
TX
3707 { /* end of list */ },
3708 },
8b44d860 3709 },
0b18874b 3710 {
ff656fcd 3711 .name = "Snowridge",
0b18874b
PL
3712 .level = 27,
3713 .vendor = CPUID_VENDOR_INTEL,
3714 .family = 6,
3715 .model = 134,
3716 .stepping = 1,
3717 .features[FEAT_1_EDX] =
3718 /* missing: CPUID_PN CPUID_IA64 */
3719 /* missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
3720 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE |
3721 CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE |
3722 CPUID_CX8 | CPUID_APIC | CPUID_SEP |
3723 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
3724 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH |
3725 CPUID_MMX |
3726 CPUID_FXSR | CPUID_SSE | CPUID_SSE2,
3727 .features[FEAT_1_ECX] =
3728 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR |
0b18874b
PL
3729 CPUID_EXT_SSSE3 |
3730 CPUID_EXT_CX16 |
3731 CPUID_EXT_SSE41 |
3732 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
3733 CPUID_EXT_POPCNT |
3734 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES | CPUID_EXT_XSAVE |
3735 CPUID_EXT_RDRAND,
3736 .features[FEAT_8000_0001_EDX] =
3737 CPUID_EXT2_SYSCALL |
3738 CPUID_EXT2_NX |
3739 CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3740 CPUID_EXT2_LM,
3741 .features[FEAT_8000_0001_ECX] =
3742 CPUID_EXT3_LAHF_LM |
3743 CPUID_EXT3_3DNOWPREFETCH,
3744 .features[FEAT_7_0_EBX] =
3745 CPUID_7_0_EBX_FSGSBASE |
3746 CPUID_7_0_EBX_SMEP |
3747 CPUID_7_0_EBX_ERMS |
3748 CPUID_7_0_EBX_MPX | /* missing bits 13, 15 */
3749 CPUID_7_0_EBX_RDSEED |
3750 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
3751 CPUID_7_0_EBX_CLWB |
3752 CPUID_7_0_EBX_SHA_NI,
3753 .features[FEAT_7_0_ECX] =
3754 CPUID_7_0_ECX_UMIP |
3755 /* missing bit 5 */
3756 CPUID_7_0_ECX_GFNI |
3757 CPUID_7_0_ECX_MOVDIRI | CPUID_7_0_ECX_CLDEMOTE |
3758 CPUID_7_0_ECX_MOVDIR64B,
3759 .features[FEAT_7_0_EDX] =
3760 CPUID_7_0_EDX_SPEC_CTRL |
3761 CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD |
3762 CPUID_7_0_EDX_CORE_CAPABILITY,
3763 .features[FEAT_CORE_CAPABILITY] =
3764 MSR_CORE_CAP_SPLIT_LOCK_DETECT,
7a21bee2 3765 /* XSAVES is added in version 3 */
0b18874b
PL
3766 .features[FEAT_XSAVE] =
3767 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3768 CPUID_XSAVE_XGETBV1,
3769 .features[FEAT_6_EAX] =
3770 CPUID_6_EAX_ARAT,
0723cc8a
PB
3771 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3772 MSR_VMX_BASIC_TRUE_CTLS,
3773 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3774 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3775 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3776 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3777 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3778 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3779 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3780 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3781 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3782 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3783 .features[FEAT_VMX_EXIT_CTLS] =
3784 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3785 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3786 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3787 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3788 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3789 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3790 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3791 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3792 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3793 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3794 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3795 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3796 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3797 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3798 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3799 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3800 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3801 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3802 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3803 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3804 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3805 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3806 .features[FEAT_VMX_SECONDARY_CTLS] =
3807 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3808 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3809 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3810 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3811 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3812 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3813 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3814 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3815 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3816 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3817 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
0b18874b
PL
3818 .xlevel = 0x80000008,
3819 .model_id = "Intel Atom Processor (SnowRidge)",
69edb0f3
XL
3820 .versions = (X86CPUVersionDefinition[]) {
3821 { .version = 1 },
3822 {
3823 .version = 2,
3824 .props = (PropValue[]) {
3825 { "mpx", "off" },
3826 { "model-id", "Intel Atom Processor (Snowridge, no MPX)" },
3827 { /* end of list */ },
3828 },
3829 },
7bde6b18
VK
3830 {
3831 .version = 3,
3832 .note = "XSAVES, no MPX",
3833 .props = (PropValue[]) {
3834 { "xsaves", "on" },
3835 { "vmx-xsaves", "on" },
3836 { /* end of list */ },
3837 },
3838 },
56bb24e5
CQ
3839 {
3840 .version = 4,
07db29f2 3841 .note = "no split lock detect, no core-capability",
56bb24e5
CQ
3842 .props = (PropValue[]) {
3843 { "split-lock-detect", "off" },
07db29f2 3844 { "core-capability", "off" },
56bb24e5
CQ
3845 { /* end of list */ },
3846 },
3847 },
69edb0f3
XL
3848 { /* end of list */ },
3849 },
0b18874b 3850 },
a1849515
BF
3851 {
3852 .name = "KnightsMill",
3853 .level = 0xd,
3854 .vendor = CPUID_VENDOR_INTEL,
3855 .family = 6,
3856 .model = 133,
3857 .stepping = 0,
3858 .features[FEAT_1_EDX] =
3859 CPUID_VME | CPUID_SS | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR |
3860 CPUID_MMX | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV |
3861 CPUID_MCA | CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC |
3862 CPUID_CX8 | CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC |
3863 CPUID_PSE | CPUID_DE | CPUID_FP87,
3864 .features[FEAT_1_ECX] =
3865 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3866 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3867 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3868 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3869 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3870 CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3871 .features[FEAT_8000_0001_EDX] =
3872 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3873 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3874 .features[FEAT_8000_0001_ECX] =
3875 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3876 .features[FEAT_7_0_EBX] =
3877 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
3878 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
3879 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_AVX512F |
3880 CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_AVX512PF |
3881 CPUID_7_0_EBX_AVX512ER,
3882 .features[FEAT_7_0_ECX] =
3883 CPUID_7_0_ECX_AVX512_VPOPCNTDQ,
3884 .features[FEAT_7_0_EDX] =
3885 CPUID_7_0_EDX_AVX512_4VNNIW | CPUID_7_0_EDX_AVX512_4FMAPS,
3886 .features[FEAT_XSAVE] =
3887 CPUID_XSAVE_XSAVEOPT,
3888 .features[FEAT_6_EAX] =
3889 CPUID_6_EAX_ARAT,
3890 .xlevel = 0x80000008,
3891 .model_id = "Intel Xeon Phi Processor (Knights Mill)",
3892 },
3eca4642
EH
3893 {
3894 .name = "Opteron_G1",
3895 .level = 5,
99b88a17 3896 .vendor = CPUID_VENDOR_AMD,
3eca4642
EH
3897 .family = 15,
3898 .model = 6,
3899 .stepping = 1,
0514ef2f 3900 .features[FEAT_1_EDX] =
b3a4f0b1 3901 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
3902 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3903 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3904 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3905 CPUID_DE | CPUID_FP87,
0514ef2f 3906 .features[FEAT_1_ECX] =
27861ecc 3907 CPUID_EXT_SSE3,
0514ef2f 3908 .features[FEAT_8000_0001_EDX] =
2a923a29 3909 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3eca4642
EH
3910 .xlevel = 0x80000008,
3911 .model_id = "AMD Opteron 240 (Gen 1 Class Opteron)",
3912 },
3913 {
3914 .name = "Opteron_G2",
3915 .level = 5,
99b88a17 3916 .vendor = CPUID_VENDOR_AMD,
3eca4642
EH
3917 .family = 15,
3918 .model = 6,
3919 .stepping = 1,
0514ef2f 3920 .features[FEAT_1_EDX] =
b3a4f0b1 3921 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
3922 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3923 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3924 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3925 CPUID_DE | CPUID_FP87,
0514ef2f 3926 .features[FEAT_1_ECX] =
27861ecc 3927 CPUID_EXT_CX16 | CPUID_EXT_SSE3,
0514ef2f 3928 .features[FEAT_8000_0001_EDX] =
2a923a29 3929 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
0514ef2f 3930 .features[FEAT_8000_0001_ECX] =
27861ecc 3931 CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
3eca4642
EH
3932 .xlevel = 0x80000008,
3933 .model_id = "AMD Opteron 22xx (Gen 2 Class Opteron)",
3934 },
3935 {
3936 .name = "Opteron_G3",
3937 .level = 5,
99b88a17 3938 .vendor = CPUID_VENDOR_AMD,
339892d7
EY
3939 .family = 16,
3940 .model = 2,
3941 .stepping = 3,
0514ef2f 3942 .features[FEAT_1_EDX] =
b3a4f0b1 3943 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
3944 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3945 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3946 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3947 CPUID_DE | CPUID_FP87,
0514ef2f 3948 .features[FEAT_1_ECX] =
27861ecc 3949 CPUID_EXT_POPCNT | CPUID_EXT_CX16 | CPUID_EXT_MONITOR |
b3fb3a20 3950 CPUID_EXT_SSE3,
0514ef2f 3951 .features[FEAT_8000_0001_EDX] =
483c6ad4
BP
3952 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL |
3953 CPUID_EXT2_RDTSCP,
0514ef2f 3954 .features[FEAT_8000_0001_ECX] =
27861ecc 3955 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A |
b3fb3a20 3956 CPUID_EXT3_ABM | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
3eca4642
EH
3957 .xlevel = 0x80000008,
3958 .model_id = "AMD Opteron 23xx (Gen 3 Class Opteron)",
3959 },
3960 {
3961 .name = "Opteron_G4",
3962 .level = 0xd,
99b88a17 3963 .vendor = CPUID_VENDOR_AMD,
3eca4642
EH
3964 .family = 21,
3965 .model = 1,
3966 .stepping = 2,
0514ef2f 3967 .features[FEAT_1_EDX] =
b3a4f0b1 3968 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
3969 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3970 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3971 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3972 CPUID_DE | CPUID_FP87,
0514ef2f 3973 .features[FEAT_1_ECX] =
27861ecc 3974 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
b3fb3a20
EH
3975 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
3976 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
3977 CPUID_EXT_SSE3,
0514ef2f 3978 .features[FEAT_8000_0001_EDX] =
2a923a29 3979 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
483c6ad4 3980 CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
0514ef2f 3981 .features[FEAT_8000_0001_ECX] =
27861ecc 3982 CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
b3fb3a20
EH
3983 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
3984 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
3985 CPUID_EXT3_LAHF_LM,
9fe8b7be
VK
3986 .features[FEAT_SVM] =
3987 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
0bb0b2d2 3988 /* no xsaveopt! */
3eca4642
EH
3989 .xlevel = 0x8000001A,
3990 .model_id = "AMD Opteron 62xx class CPU",
3991 },
021941b9
AP
3992 {
3993 .name = "Opteron_G5",
3994 .level = 0xd,
99b88a17 3995 .vendor = CPUID_VENDOR_AMD,
021941b9
AP
3996 .family = 21,
3997 .model = 2,
3998 .stepping = 0,
0514ef2f 3999 .features[FEAT_1_EDX] =
b3a4f0b1 4000 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
4001 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4002 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4003 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4004 CPUID_DE | CPUID_FP87,
0514ef2f 4005 .features[FEAT_1_ECX] =
27861ecc 4006 CPUID_EXT_F16C | CPUID_EXT_AVX | CPUID_EXT_XSAVE |
b3fb3a20
EH
4007 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
4008 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_FMA |
4009 CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
0514ef2f 4010 .features[FEAT_8000_0001_EDX] =
2a923a29 4011 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
483c6ad4 4012 CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
0514ef2f 4013 .features[FEAT_8000_0001_ECX] =
27861ecc 4014 CPUID_EXT3_TBM | CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
b3fb3a20
EH
4015 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
4016 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
4017 CPUID_EXT3_LAHF_LM,
9fe8b7be
VK
4018 .features[FEAT_SVM] =
4019 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
0bb0b2d2 4020 /* no xsaveopt! */
021941b9
AP
4021 .xlevel = 0x8000001A,
4022 .model_id = "AMD Opteron 63xx class CPU",
4023 },
2e2efc7d
BS
4024 {
4025 .name = "EPYC",
4026 .level = 0xd,
4027 .vendor = CPUID_VENDOR_AMD,
4028 .family = 23,
4029 .model = 1,
4030 .stepping = 2,
4031 .features[FEAT_1_EDX] =
4032 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
4033 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
4034 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
4035 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
4036 CPUID_VME | CPUID_FP87,
4037 .features[FEAT_1_ECX] =
4038 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
4039 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
4040 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4041 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
4042 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
4043 .features[FEAT_8000_0001_EDX] =
4044 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
4045 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
4046 CPUID_EXT2_SYSCALL,
4047 .features[FEAT_8000_0001_ECX] =
4048 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
4049 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
e0051647
BM
4050 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
4051 CPUID_EXT3_TOPOEXT,
2e2efc7d
BS
4052 .features[FEAT_7_0_EBX] =
4053 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4054 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
4055 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
4056 CPUID_7_0_EBX_SHA_NI,
2e2efc7d
BS
4057 .features[FEAT_XSAVE] =
4058 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4059 CPUID_XSAVE_XGETBV1,
4060 .features[FEAT_6_EAX] =
4061 CPUID_6_EAX_ARAT,
9fe8b7be
VK
4062 .features[FEAT_SVM] =
4063 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
e0051647 4064 .xlevel = 0x8000001E,
2e2efc7d 4065 .model_id = "AMD EPYC Processor",
fe52acd2 4066 .cache_info = &epyc_cache_info,
d86a7088
EH
4067 .versions = (X86CPUVersionDefinition[]) {
4068 { .version = 1 },
4069 {
4070 .version = 2,
53db89d9 4071 .alias = "EPYC-IBPB",
d86a7088
EH
4072 .props = (PropValue[]) {
4073 { "ibpb", "on" },
4074 { "model-id",
4075 "AMD EPYC Processor (with IBPB)" },
4076 { /* end of list */ }
4077 }
4078 },
a16e8dbc
MB
4079 {
4080 .version = 3,
4081 .props = (PropValue[]) {
4082 { "ibpb", "on" },
4083 { "perfctr-core", "on" },
4084 { "clzero", "on" },
4085 { "xsaveerptr", "on" },
4086 { "xsaves", "on" },
4087 { "model-id",
4088 "AMD EPYC Processor" },
4089 { /* end of list */ }
4090 }
4091 },
d86a7088
EH
4092 { /* end of list */ }
4093 }
2e2efc7d 4094 },
8d031cec
PW
4095 {
4096 .name = "Dhyana",
4097 .level = 0xd,
4098 .vendor = CPUID_VENDOR_HYGON,
4099 .family = 24,
4100 .model = 0,
4101 .stepping = 1,
4102 .features[FEAT_1_EDX] =
4103 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
4104 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
4105 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
4106 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
4107 CPUID_VME | CPUID_FP87,
4108 .features[FEAT_1_ECX] =
4109 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
4110 CPUID_EXT_XSAVE | CPUID_EXT_POPCNT |
4111 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4112 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
4113 CPUID_EXT_MONITOR | CPUID_EXT_SSE3,
4114 .features[FEAT_8000_0001_EDX] =
4115 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
4116 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
4117 CPUID_EXT2_SYSCALL,
4118 .features[FEAT_8000_0001_ECX] =
4119 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
4120 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
4121 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
4122 CPUID_EXT3_TOPOEXT,
4123 .features[FEAT_8000_0008_EBX] =
4124 CPUID_8000_0008_EBX_IBPB,
4125 .features[FEAT_7_0_EBX] =
4126 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4127 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
4128 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT,
7bde6b18 4129 /* XSAVES is added in version 2 */
8d031cec
PW
4130 .features[FEAT_XSAVE] =
4131 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4132 CPUID_XSAVE_XGETBV1,
4133 .features[FEAT_6_EAX] =
4134 CPUID_6_EAX_ARAT,
4135 .features[FEAT_SVM] =
4136 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4137 .xlevel = 0x8000001E,
4138 .model_id = "Hygon Dhyana Processor",
4139 .cache_info = &epyc_cache_info,
7bde6b18
VK
4140 .versions = (X86CPUVersionDefinition[]) {
4141 { .version = 1 },
4142 { .version = 2,
4143 .note = "XSAVES",
4144 .props = (PropValue[]) {
4145 { "xsaves", "on" },
4146 { /* end of list */ }
4147 },
4148 },
4149 { /* end of list */ }
4150 }
8d031cec 4151 },
143c30d4
MB
4152 {
4153 .name = "EPYC-Rome",
4154 .level = 0xd,
4155 .vendor = CPUID_VENDOR_AMD,
4156 .family = 23,
4157 .model = 49,
4158 .stepping = 0,
4159 .features[FEAT_1_EDX] =
4160 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
4161 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
4162 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
4163 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
4164 CPUID_VME | CPUID_FP87,
4165 .features[FEAT_1_ECX] =
4166 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
4167 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
4168 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4169 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
4170 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
4171 .features[FEAT_8000_0001_EDX] =
4172 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
4173 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
4174 CPUID_EXT2_SYSCALL,
4175 .features[FEAT_8000_0001_ECX] =
4176 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
4177 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
4178 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
4179 CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
4180 .features[FEAT_8000_0008_EBX] =
4181 CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
4182 CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
4183 CPUID_8000_0008_EBX_STIBP,
4184 .features[FEAT_7_0_EBX] =
4185 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4186 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
4187 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
4188 CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_CLWB,
4189 .features[FEAT_7_0_ECX] =
4190 CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_RDPID,
4191 .features[FEAT_XSAVE] =
4192 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4193 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
4194 .features[FEAT_6_EAX] =
4195 CPUID_6_EAX_ARAT,
4196 .features[FEAT_SVM] =
4197 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4198 .xlevel = 0x8000001E,
4199 .model_id = "AMD EPYC-Rome Processor",
4200 .cache_info = &epyc_rome_cache_info,
cdeaed27
BM
4201 .versions = (X86CPUVersionDefinition[]) {
4202 { .version = 1 },
4203 {
4204 .version = 2,
4205 .props = (PropValue[]) {
4206 { "ibrs", "on" },
4207 { "amd-ssbd", "on" },
4208 { /* end of list */ }
4209 }
4210 },
4211 { /* end of list */ }
4212 }
143c30d4 4213 },
623972ce
BM
4214 {
4215 .name = "EPYC-Milan",
4216 .level = 0xd,
4217 .vendor = CPUID_VENDOR_AMD,
4218 .family = 25,
4219 .model = 1,
4220 .stepping = 1,
4221 .features[FEAT_1_EDX] =
4222 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
4223 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
4224 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
4225 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
4226 CPUID_VME | CPUID_FP87,
4227 .features[FEAT_1_ECX] =
4228 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
4229 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
4230 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4231 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
4232 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
4233 CPUID_EXT_PCID,
4234 .features[FEAT_8000_0001_EDX] =
4235 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
4236 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
4237 CPUID_EXT2_SYSCALL,
4238 .features[FEAT_8000_0001_ECX] =
4239 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
4240 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
4241 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
4242 CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
4243 .features[FEAT_8000_0008_EBX] =
4244 CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
4245 CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
4246 CPUID_8000_0008_EBX_IBRS | CPUID_8000_0008_EBX_STIBP |
4247 CPUID_8000_0008_EBX_AMD_SSBD,
4248 .features[FEAT_7_0_EBX] =
4249 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4250 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
4251 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
4252 CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_ERMS |
4253 CPUID_7_0_EBX_INVPCID,
4254 .features[FEAT_7_0_ECX] =
4255 CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_PKU,
4256 .features[FEAT_7_0_EDX] =
4257 CPUID_7_0_EDX_FSRM,
4258 .features[FEAT_XSAVE] =
4259 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4260 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
4261 .features[FEAT_6_EAX] =
4262 CPUID_6_EAX_ARAT,
4263 .features[FEAT_SVM] =
4264 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE | CPUID_SVM_SVME_ADDR_CHK,
4265 .xlevel = 0x8000001E,
4266 .model_id = "AMD EPYC-Milan Processor",
4267 .cache_info = &epyc_milan_cache_info,
4268 },
c6dc6f63
AP
4269};
4270
ad183928
EH
4271/*
4272 * We resolve CPU model aliases using -v1 when using "-machine
4273 * none", but this is just for compatibility while libvirt isn't
4274 * adapted to resolve CPU model versions before creating VMs.
32048d72 4275 * See "Runnability guarantee of CPU models" at
a476b216 4276 * docs/about/deprecated.rst.
ad183928
EH
4277 */
4278X86CPUVersion default_cpu_version = 1;
0788a56b
EH
4279
4280void x86_cpu_set_default_version(X86CPUVersion version)
4281{
4282 /* Translating CPU_VERSION_AUTO to CPU_VERSION_AUTO doesn't make sense */
4283 assert(version != CPU_VERSION_AUTO);
4284 default_cpu_version = version;
4285}
4286
dcafd1ef
EH
4287static X86CPUVersion x86_cpu_model_last_version(const X86CPUModel *model)
4288{
4289 int v = 0;
4290 const X86CPUVersionDefinition *vdef =
4291 x86_cpu_def_get_versions(model->cpudef);
4292 while (vdef->version) {
4293 v = vdef->version;
4294 vdef++;
4295 }
4296 return v;
4297}
4298
4299/* Return the actual version being used for a specific CPU model */
4300static X86CPUVersion x86_cpu_model_resolve_version(const X86CPUModel *model)
4301{
4302 X86CPUVersion v = model->version;
0788a56b
EH
4303 if (v == CPU_VERSION_AUTO) {
4304 v = default_cpu_version;
4305 }
dcafd1ef
EH
4306 if (v == CPU_VERSION_LATEST) {
4307 return x86_cpu_model_last_version(model);
4308 }
4309 return v;
4310}
4311
c62f2630 4312static Property max_x86_cpu_properties[] = {
120eee7d 4313 DEFINE_PROP_BOOL("migratable", X86CPU, migratable, true),
e265e3e4 4314 DEFINE_PROP_BOOL("host-cache-info", X86CPU, cache_info_passthrough, false),
84f1b92f
EH
4315 DEFINE_PROP_END_OF_LIST()
4316};
4317
c62f2630 4318static void max_x86_cpu_class_init(ObjectClass *oc, void *data)
c6dc6f63 4319{
84f1b92f 4320 DeviceClass *dc = DEVICE_CLASS(oc);
d940ee9b 4321 X86CPUClass *xcc = X86_CPU_CLASS(oc);
c6dc6f63 4322
f48c8837 4323 xcc->ordering = 9;
6e746f30 4324
ee465a3e 4325 xcc->model_description =
c62f2630 4326 "Enables all features supported by the accelerator in the current host";
d940ee9b 4327
4f67d30b 4328 device_class_set_props(dc, max_x86_cpu_properties);
d940ee9b
EH
4329}
4330
c62f2630 4331static void max_x86_cpu_initfn(Object *obj)
d940ee9b
EH
4332{
4333 X86CPU *cpu = X86_CPU(obj);
d940ee9b 4334
4d1b279b
EH
4335 /* We can't fill the features array here because we don't know yet if
4336 * "migratable" is true or false.
4337 */
44bd8e53 4338 cpu->max_features = true;
5325cc34 4339 object_property_set_bool(OBJECT(cpu), "pmu", true, &error_abort);
f5cc5a5c
CF
4340
4341 /*
4342 * these defaults are used for TCG and all other accelerators
4343 * besides KVM and HVF, which overwrite these values
4344 */
4345 object_property_set_str(OBJECT(cpu), "vendor", CPUID_VENDOR_AMD,
4346 &error_abort);
40b3cc35
DB
4347#ifdef TARGET_X86_64
4348 object_property_set_int(OBJECT(cpu), "family", 15, &error_abort);
4349 object_property_set_int(OBJECT(cpu), "model", 107, &error_abort);
4350 object_property_set_int(OBJECT(cpu), "stepping", 1, &error_abort);
4351#else
f5cc5a5c
CF
4352 object_property_set_int(OBJECT(cpu), "family", 6, &error_abort);
4353 object_property_set_int(OBJECT(cpu), "model", 6, &error_abort);
4354 object_property_set_int(OBJECT(cpu), "stepping", 3, &error_abort);
40b3cc35 4355#endif
f5cc5a5c
CF
4356 object_property_set_str(OBJECT(cpu), "model-id",
4357 "QEMU TCG CPU version " QEMU_HW_VERSION,
4358 &error_abort);
c6dc6f63
AP
4359}
4360
c62f2630
EH
4361static const TypeInfo max_x86_cpu_type_info = {
4362 .name = X86_CPU_TYPE_NAME("max"),
4363 .parent = TYPE_X86_CPU,
4364 .instance_init = max_x86_cpu_initfn,
4365 .class_init = max_x86_cpu_class_init,
4366};
4367
07585923
RH
4368static char *feature_word_description(FeatureWordInfo *f, uint32_t bit)
4369{
4370 assert(f->type == CPUID_FEATURE_WORD || f->type == MSR_FEATURE_WORD);
4371
4372 switch (f->type) {
4373 case CPUID_FEATURE_WORD:
4374 {
4375 const char *reg = get_register_name_32(f->cpuid.reg);
4376 assert(reg);
4377 return g_strdup_printf("CPUID.%02XH:%s",
4378 f->cpuid.eax, reg);
4379 }
4380 case MSR_FEATURE_WORD:
4381 return g_strdup_printf("MSR(%02XH)",
4382 f->msr.index);
4383 }
4384
4385 return NULL;
4386}
4387
245edd0c 4388static bool x86_cpu_have_filtered_features(X86CPU *cpu)
c6dc6f63 4389{
245edd0c
PB
4390 FeatureWord w;
4391
4392 for (w = 0; w < FEATURE_WORDS; w++) {
4393 if (cpu->filtered_features[w]) {
4394 return true;
4395 }
4396 }
4397
4398 return false;
4399}
4400
ede146c2 4401static void mark_unavailable_features(X86CPU *cpu, FeatureWord w, uint64_t mask,
245edd0c
PB
4402 const char *verbose_prefix)
4403{
4404 CPUX86State *env = &cpu->env;
8459e396 4405 FeatureWordInfo *f = &feature_word_info[w];
c6dc6f63
AP
4406 int i;
4407
245edd0c
PB
4408 if (!cpu->force_features) {
4409 env->features[w] &= ~mask;
4410 }
4411 cpu->filtered_features[w] |= mask;
4412
4413 if (!verbose_prefix) {
4414 return;
4415 }
4416
ede146c2
PB
4417 for (i = 0; i < 64; ++i) {
4418 if ((1ULL << i) & mask) {
88703ce2 4419 g_autofree char *feat_word_str = feature_word_description(f, i);
245edd0c
PB
4420 warn_report("%s: %s%s%s [bit %d]",
4421 verbose_prefix,
07585923 4422 feat_word_str,
8297be80
AF
4423 f->feat_names[i] ? "." : "",
4424 f->feat_names[i] ? f->feat_names[i] : "", i);
c6dc6f63 4425 }
857aee33 4426 }
c6dc6f63
AP
4427}
4428
d7bce999
EB
4429static void x86_cpuid_version_get_family(Object *obj, Visitor *v,
4430 const char *name, void *opaque,
4431 Error **errp)
95b8519d
AF
4432{
4433 X86CPU *cpu = X86_CPU(obj);
4434 CPUX86State *env = &cpu->env;
4435 int64_t value;
4436
4437 value = (env->cpuid_version >> 8) & 0xf;
4438 if (value == 0xf) {
4439 value += (env->cpuid_version >> 20) & 0xff;
4440 }
51e72bc1 4441 visit_type_int(v, name, &value, errp);
95b8519d
AF
4442}
4443
d7bce999
EB
4444static void x86_cpuid_version_set_family(Object *obj, Visitor *v,
4445 const char *name, void *opaque,
4446 Error **errp)
ed5e1ec3 4447{
71ad61d3
AF
4448 X86CPU *cpu = X86_CPU(obj);
4449 CPUX86State *env = &cpu->env;
4450 const int64_t min = 0;
4451 const int64_t max = 0xff + 0xf;
4452 int64_t value;
4453
668f62ec 4454 if (!visit_type_int(v, name, &value, errp)) {
71ad61d3
AF
4455 return;
4456 }
4457 if (value < min || value > max) {
c6bd8c70
MA
4458 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
4459 name ? name : "null", value, min, max);
71ad61d3
AF
4460 return;
4461 }
4462
ed5e1ec3 4463 env->cpuid_version &= ~0xff00f00;
71ad61d3
AF
4464 if (value > 0x0f) {
4465 env->cpuid_version |= 0xf00 | ((value - 0x0f) << 20);
ed5e1ec3 4466 } else {
71ad61d3 4467 env->cpuid_version |= value << 8;
ed5e1ec3
AF
4468 }
4469}
4470
d7bce999
EB
4471static void x86_cpuid_version_get_model(Object *obj, Visitor *v,
4472 const char *name, void *opaque,
4473 Error **errp)
67e30c83
AF
4474{
4475 X86CPU *cpu = X86_CPU(obj);
4476 CPUX86State *env = &cpu->env;
4477 int64_t value;
4478
4479 value = (env->cpuid_version >> 4) & 0xf;
4480 value |= ((env->cpuid_version >> 16) & 0xf) << 4;
51e72bc1 4481 visit_type_int(v, name, &value, errp);
67e30c83
AF
4482}
4483
d7bce999
EB
4484static void x86_cpuid_version_set_model(Object *obj, Visitor *v,
4485 const char *name, void *opaque,
4486 Error **errp)
b0704cbd 4487{
c5291a4f
AF
4488 X86CPU *cpu = X86_CPU(obj);
4489 CPUX86State *env = &cpu->env;
4490 const int64_t min = 0;
4491 const int64_t max = 0xff;
4492 int64_t value;
4493
668f62ec 4494 if (!visit_type_int(v, name, &value, errp)) {
c5291a4f
AF
4495 return;
4496 }
4497 if (value < min || value > max) {
c6bd8c70
MA
4498 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
4499 name ? name : "null", value, min, max);
c5291a4f
AF
4500 return;
4501 }
4502
b0704cbd 4503 env->cpuid_version &= ~0xf00f0;
c5291a4f 4504 env->cpuid_version |= ((value & 0xf) << 4) | ((value >> 4) << 16);
b0704cbd
AF
4505}
4506
35112e41 4507static void x86_cpuid_version_get_stepping(Object *obj, Visitor *v,
d7bce999 4508 const char *name, void *opaque,
35112e41
AF
4509 Error **errp)
4510{
4511 X86CPU *cpu = X86_CPU(obj);
4512 CPUX86State *env = &cpu->env;
4513 int64_t value;
4514
4515 value = env->cpuid_version & 0xf;
51e72bc1 4516 visit_type_int(v, name, &value, errp);
35112e41
AF
4517}
4518
036e2222 4519static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v,
d7bce999 4520 const char *name, void *opaque,
036e2222 4521 Error **errp)
38c3dc46 4522{
036e2222
AF
4523 X86CPU *cpu = X86_CPU(obj);
4524 CPUX86State *env = &cpu->env;
4525 const int64_t min = 0;
4526 const int64_t max = 0xf;
4527 int64_t value;
4528
668f62ec 4529 if (!visit_type_int(v, name, &value, errp)) {
036e2222
AF
4530 return;
4531 }
4532 if (value < min || value > max) {
c6bd8c70
MA
4533 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
4534 name ? name : "null", value, min, max);
036e2222
AF
4535 return;
4536 }
4537
38c3dc46 4538 env->cpuid_version &= ~0xf;
036e2222 4539 env->cpuid_version |= value & 0xf;
38c3dc46
AF
4540}
4541
d480e1af
AF
4542static char *x86_cpuid_get_vendor(Object *obj, Error **errp)
4543{
4544 X86CPU *cpu = X86_CPU(obj);
4545 CPUX86State *env = &cpu->env;
4546 char *value;
d480e1af 4547
e42a92ae 4548 value = g_malloc(CPUID_VENDOR_SZ + 1);
99b88a17
IM
4549 x86_cpu_vendor_words2str(value, env->cpuid_vendor1, env->cpuid_vendor2,
4550 env->cpuid_vendor3);
d480e1af
AF
4551 return value;
4552}
4553
4554static void x86_cpuid_set_vendor(Object *obj, const char *value,
4555 Error **errp)
4556{
4557 X86CPU *cpu = X86_CPU(obj);
4558 CPUX86State *env = &cpu->env;
4559 int i;
4560
9df694ee 4561 if (strlen(value) != CPUID_VENDOR_SZ) {
c6bd8c70 4562 error_setg(errp, QERR_PROPERTY_VALUE_BAD, "", "vendor", value);
d480e1af
AF
4563 return;
4564 }
4565
4566 env->cpuid_vendor1 = 0;
4567 env->cpuid_vendor2 = 0;
4568 env->cpuid_vendor3 = 0;
4569 for (i = 0; i < 4; i++) {
4570 env->cpuid_vendor1 |= ((uint8_t)value[i ]) << (8 * i);
4571 env->cpuid_vendor2 |= ((uint8_t)value[i + 4]) << (8 * i);
4572 env->cpuid_vendor3 |= ((uint8_t)value[i + 8]) << (8 * i);
4573 }
d480e1af
AF
4574}
4575
63e886eb
AF
4576static char *x86_cpuid_get_model_id(Object *obj, Error **errp)
4577{
4578 X86CPU *cpu = X86_CPU(obj);
4579 CPUX86State *env = &cpu->env;
4580 char *value;
4581 int i;
4582
4583 value = g_malloc(48 + 1);
4584 for (i = 0; i < 48; i++) {
4585 value[i] = env->cpuid_model[i >> 2] >> (8 * (i & 3));
4586 }
4587 value[48] = '\0';
4588 return value;
4589}
4590
938d4c25
AF
4591static void x86_cpuid_set_model_id(Object *obj, const char *model_id,
4592 Error **errp)
dcce6675 4593{
938d4c25
AF
4594 X86CPU *cpu = X86_CPU(obj);
4595 CPUX86State *env = &cpu->env;
dcce6675
AF
4596 int c, len, i;
4597
4598 if (model_id == NULL) {
4599 model_id = "";
4600 }
4601 len = strlen(model_id);
d0a6acf4 4602 memset(env->cpuid_model, 0, 48);
dcce6675
AF
4603 for (i = 0; i < 48; i++) {
4604 if (i >= len) {
4605 c = '\0';
4606 } else {
4607 c = (uint8_t)model_id[i];
4608 }
4609 env->cpuid_model[i >> 2] |= c << (8 * (i & 3));
4610 }
4611}
4612
d7bce999
EB
4613static void x86_cpuid_get_tsc_freq(Object *obj, Visitor *v, const char *name,
4614 void *opaque, Error **errp)
89e48965
AF
4615{
4616 X86CPU *cpu = X86_CPU(obj);
4617 int64_t value;
4618
4619 value = cpu->env.tsc_khz * 1000;
51e72bc1 4620 visit_type_int(v, name, &value, errp);
89e48965
AF
4621}
4622
d7bce999
EB
4623static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name,
4624 void *opaque, Error **errp)
89e48965
AF
4625{
4626 X86CPU *cpu = X86_CPU(obj);
4627 const int64_t min = 0;
2e84849a 4628 const int64_t max = INT64_MAX;
89e48965
AF
4629 int64_t value;
4630
668f62ec 4631 if (!visit_type_int(v, name, &value, errp)) {
89e48965
AF
4632 return;
4633 }
4634 if (value < min || value > max) {
c6bd8c70
MA
4635 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
4636 name ? name : "null", value, min, max);
89e48965
AF
4637 return;
4638 }
4639
36f96c4b 4640 cpu->env.tsc_khz = cpu->env.user_tsc_khz = value / 1000;
89e48965
AF
4641}
4642
7e5292b5 4643/* Generic getter for "feature-words" and "filtered-features" properties */
d7bce999
EB
4644static void x86_cpu_get_feature_words(Object *obj, Visitor *v,
4645 const char *name, void *opaque,
4646 Error **errp)
8e8aba50 4647{
ede146c2 4648 uint64_t *array = (uint64_t *)opaque;
8e8aba50 4649 FeatureWord w;
8e8aba50
EH
4650 X86CPUFeatureWordInfo word_infos[FEATURE_WORDS] = { };
4651 X86CPUFeatureWordInfoList list_entries[FEATURE_WORDS] = { };
4652 X86CPUFeatureWordInfoList *list = NULL;
4653
4654 for (w = 0; w < FEATURE_WORDS; w++) {
4655 FeatureWordInfo *wi = &feature_word_info[w];
07585923
RH
4656 /*
4657 * We didn't have MSR features when "feature-words" was
4658 * introduced. Therefore skipped other type entries.
4659 */
4660 if (wi->type != CPUID_FEATURE_WORD) {
4661 continue;
4662 }
8e8aba50 4663 X86CPUFeatureWordInfo *qwi = &word_infos[w];
07585923
RH
4664 qwi->cpuid_input_eax = wi->cpuid.eax;
4665 qwi->has_cpuid_input_ecx = wi->cpuid.needs_ecx;
4666 qwi->cpuid_input_ecx = wi->cpuid.ecx;
4667 qwi->cpuid_register = x86_reg_info_32[wi->cpuid.reg].qapi_enum;
7e5292b5 4668 qwi->features = array[w];
8e8aba50
EH
4669
4670 /* List will be in reverse order, but order shouldn't matter */
4671 list_entries[w].next = list;
4672 list_entries[w].value = &word_infos[w];
4673 list = &list_entries[w];
4674 }
4675
6b62d961 4676 visit_type_X86CPUFeatureWordInfoList(v, "feature-words", &list, errp);
8e8aba50
EH
4677}
4678
72ac2e87
IM
4679/* Convert all '_' in a feature string option name to '-', to make feature
4680 * name conform to QOM property naming rule, which uses '-' instead of '_'.
4681 */
4682static inline void feat2prop(char *s)
4683{
4684 while ((s = strchr(s, '_'))) {
4685 *s = '-';
4686 }
4687}
4688
b54c9377
EH
4689/* Return the feature property name for a feature flag bit */
4690static const char *x86_cpu_feature_name(FeatureWord w, int bitnr)
4691{
ede146c2 4692 const char *name;
b54c9377
EH
4693 /* XSAVE components are automatically enabled by other features,
4694 * so return the original feature name instead
4695 */
301e9067
YW
4696 if (w == FEAT_XSAVE_XCR0_LO || w == FEAT_XSAVE_XCR0_HI) {
4697 int comp = (w == FEAT_XSAVE_XCR0_HI) ? bitnr + 32 : bitnr;
b54c9377
EH
4698
4699 if (comp < ARRAY_SIZE(x86_ext_save_areas) &&
4700 x86_ext_save_areas[comp].bits) {
4701 w = x86_ext_save_areas[comp].feature;
4702 bitnr = ctz32(x86_ext_save_areas[comp].bits);
4703 }
4704 }
4705
ede146c2 4706 assert(bitnr < 64);
b54c9377 4707 assert(w < FEATURE_WORDS);
ede146c2
PB
4708 name = feature_word_info[w].feat_names[bitnr];
4709 assert(bitnr < 32 || !(name && feature_word_info[w].type == CPUID_FEATURE_WORD));
4710 return name;
b54c9377
EH
4711}
4712
dc15c051
IM
4713/* Compatibily hack to maintain legacy +-feat semantic,
4714 * where +-feat overwrites any feature set by
4715 * feat=on|feat even if the later is parsed after +-feat
4716 * (i.e. "-x2apic,x2apic=on" will result in x2apic disabled)
4717 */
2fae0d96 4718static GList *plus_features, *minus_features;
dc15c051 4719
83a00f60
EH
4720static gint compare_string(gconstpointer a, gconstpointer b)
4721{
4722 return g_strcmp0(a, b);
4723}
4724
8f961357
EH
4725/* Parse "+feature,-feature,feature=foo" CPU feature string
4726 */
62a48a2a 4727static void x86_cpu_parse_featurestr(const char *typename, char *features,
94a444b2 4728 Error **errp)
8f961357 4729{
8f961357 4730 char *featurestr; /* Single 'key=value" string being parsed */
62a48a2a 4731 static bool cpu_globals_initialized;
83a00f60 4732 bool ambiguous = false;
62a48a2a
IM
4733
4734 if (cpu_globals_initialized) {
4735 return;
4736 }
4737 cpu_globals_initialized = true;
8f961357 4738
f6750e95
EH
4739 if (!features) {
4740 return;
4741 }
4742
4743 for (featurestr = strtok(features, ",");
685479bd 4744 featurestr;
f6750e95
EH
4745 featurestr = strtok(NULL, ",")) {
4746 const char *name;
4747 const char *val = NULL;
4748 char *eq = NULL;
cf2887c9 4749 char num[32];
62a48a2a 4750 GlobalProperty *prop;
c6dc6f63 4751
f6750e95 4752 /* Compatibility syntax: */
c6dc6f63 4753 if (featurestr[0] == '+') {
2fae0d96
EH
4754 plus_features = g_list_append(plus_features,
4755 g_strdup(featurestr + 1));
f6750e95 4756 continue;
c6dc6f63 4757 } else if (featurestr[0] == '-') {
2fae0d96
EH
4758 minus_features = g_list_append(minus_features,
4759 g_strdup(featurestr + 1));
f6750e95
EH
4760 continue;
4761 }
4762
4763 eq = strchr(featurestr, '=');
4764 if (eq) {
4765 *eq++ = 0;
4766 val = eq;
c6dc6f63 4767 } else {
f6750e95 4768 val = "on";
a91987c2 4769 }
f6750e95
EH
4770
4771 feat2prop(featurestr);
4772 name = featurestr;
4773
83a00f60 4774 if (g_list_find_custom(plus_features, name, compare_string)) {
3dc6f869
AF
4775 warn_report("Ambiguous CPU model string. "
4776 "Don't mix both \"+%s\" and \"%s=%s\"",
4777 name, name, val);
83a00f60
EH
4778 ambiguous = true;
4779 }
4780 if (g_list_find_custom(minus_features, name, compare_string)) {
3dc6f869
AF
4781 warn_report("Ambiguous CPU model string. "
4782 "Don't mix both \"-%s\" and \"%s=%s\"",
4783 name, name, val);
83a00f60
EH
4784 ambiguous = true;
4785 }
4786
f6750e95
EH
4787 /* Special case: */
4788 if (!strcmp(name, "tsc-freq")) {
f17fd4fd 4789 int ret;
f46bfdbf 4790 uint64_t tsc_freq;
f6750e95 4791
f17fd4fd 4792 ret = qemu_strtosz_metric(val, NULL, &tsc_freq);
f46bfdbf 4793 if (ret < 0 || tsc_freq > INT64_MAX) {
f6750e95
EH
4794 error_setg(errp, "bad numerical value %s", val);
4795 return;
4796 }
4797 snprintf(num, sizeof(num), "%" PRId64, tsc_freq);
4798 val = num;
4799 name = "tsc-frequency";
c6dc6f63 4800 }
f6750e95 4801
62a48a2a
IM
4802 prop = g_new0(typeof(*prop), 1);
4803 prop->driver = typename;
4804 prop->property = g_strdup(name);
4805 prop->value = g_strdup(val);
62a48a2a 4806 qdev_prop_register_global(prop);
f6750e95
EH
4807 }
4808
83a00f60 4809 if (ambiguous) {
3dc6f869
AF
4810 warn_report("Compatibility of ambiguous CPU model "
4811 "strings won't be kept on future QEMU versions");
83a00f60 4812 }
c6dc6f63
AP
4813}
4814
245edd0c 4815static void x86_cpu_filter_features(X86CPU *cpu, bool verbose);
b54c9377 4816
5a853fc5
EH
4817/* Build a list with the name of all features on a feature word array */
4818static void x86_cpu_list_feature_names(FeatureWordArray features,
c3033fd3 4819 strList **list)
5a853fc5 4820{
c3033fd3 4821 strList **tail = list;
5a853fc5 4822 FeatureWord w;
5a853fc5
EH
4823
4824 for (w = 0; w < FEATURE_WORDS; w++) {
ede146c2 4825 uint64_t filtered = features[w];
5a853fc5 4826 int i;
ede146c2
PB
4827 for (i = 0; i < 64; i++) {
4828 if (filtered & (1ULL << i)) {
c3033fd3 4829 QAPI_LIST_APPEND(tail, g_strdup(x86_cpu_feature_name(w, i)));
5a853fc5
EH
4830 }
4831 }
4832 }
4833}
4834
506174bf
EH
4835static void x86_cpu_get_unavailable_features(Object *obj, Visitor *v,
4836 const char *name, void *opaque,
4837 Error **errp)
4838{
4839 X86CPU *xc = X86_CPU(obj);
4840 strList *result = NULL;
4841
4842 x86_cpu_list_feature_names(xc->filtered_features, &result);
4843 visit_type_strList(v, "unavailable-features", &result, errp);
4844}
4845
8c3329e5 4846/* Print all cpuid feature names in featureset
c6dc6f63 4847 */
0442428a 4848static void listflags(GList *features)
0856579c 4849{
cc643b1e
DB
4850 size_t len = 0;
4851 GList *tmp;
4852
4853 for (tmp = features; tmp; tmp = tmp->next) {
4854 const char *name = tmp->data;
4855 if ((len + strlen(name) + 1) >= 75) {
0442428a 4856 qemu_printf("\n");
cc643b1e 4857 len = 0;
c6dc6f63 4858 }
0442428a 4859 qemu_printf("%s%s", len == 0 ? " " : " ", name);
cc643b1e 4860 len += strlen(name) + 1;
8c3329e5 4861 }
0442428a 4862 qemu_printf("\n");
c6dc6f63
AP
4863}
4864
f48c8837 4865/* Sort alphabetically by type name, respecting X86CPUClass::ordering. */
ee465a3e
EH
4866static gint x86_cpu_list_compare(gconstpointer a, gconstpointer b)
4867{
4868 ObjectClass *class_a = (ObjectClass *)a;
4869 ObjectClass *class_b = (ObjectClass *)b;
4870 X86CPUClass *cc_a = X86_CPU_CLASS(class_a);
4871 X86CPUClass *cc_b = X86_CPU_CLASS(class_b);
c7dbff4b 4872 int ret;
ee465a3e 4873
f48c8837 4874 if (cc_a->ordering != cc_b->ordering) {
c7dbff4b 4875 ret = cc_a->ordering - cc_b->ordering;
ee465a3e 4876 } else {
88703ce2
EH
4877 g_autofree char *name_a = x86_cpu_class_get_model_name(cc_a);
4878 g_autofree char *name_b = x86_cpu_class_get_model_name(cc_b);
c7dbff4b 4879 ret = strcmp(name_a, name_b);
ee465a3e 4880 }
c7dbff4b 4881 return ret;
ee465a3e
EH
4882}
4883
4884static GSList *get_sorted_cpu_model_list(void)
4885{
4886 GSList *list = object_class_get_list(TYPE_X86_CPU, false);
4887 list = g_slist_sort(list, x86_cpu_list_compare);
4888 return list;
4889}
4890
164e779c
EH
4891static char *x86_cpu_class_get_model_id(X86CPUClass *xc)
4892{
3c75e12e 4893 Object *obj = object_new_with_class(OBJECT_CLASS(xc));
164e779c
EH
4894 char *r = object_property_get_str(obj, "model-id", &error_abort);
4895 object_unref(obj);
4896 return r;
4897}
4898
0788a56b
EH
4899static char *x86_cpu_class_get_alias_of(X86CPUClass *cc)
4900{
4901 X86CPUVersion version;
4902
4903 if (!cc->model || !cc->model->is_alias) {
4904 return NULL;
4905 }
4906 version = x86_cpu_model_resolve_version(cc->model);
4907 if (version <= 0) {
4908 return NULL;
4909 }
4910 return x86_cpu_versioned_model_name(cc->model->cpudef, version);
4911}
4912
ee465a3e
EH
4913static void x86_cpu_list_entry(gpointer data, gpointer user_data)
4914{
4915 ObjectClass *oc = data;
4916 X86CPUClass *cc = X86_CPU_CLASS(oc);
88703ce2
EH
4917 g_autofree char *name = x86_cpu_class_get_model_name(cc);
4918 g_autofree char *desc = g_strdup(cc->model_description);
4919 g_autofree char *alias_of = x86_cpu_class_get_alias_of(cc);
c63938df 4920 g_autofree char *model_id = x86_cpu_class_get_model_id(cc);
164e779c 4921
0788a56b
EH
4922 if (!desc && alias_of) {
4923 if (cc->model && cc->model->version == CPU_VERSION_AUTO) {
4924 desc = g_strdup("(alias configured by machine type)");
4925 } else {
4926 desc = g_strdup_printf("(alias of %s)", alias_of);
4927 }
4928 }
c63938df
TX
4929 if (!desc && cc->model && cc->model->note) {
4930 desc = g_strdup_printf("%s [%s]", model_id, cc->model->note);
4931 }
164e779c 4932 if (!desc) {
c63938df 4933 desc = g_strdup_printf("%s", model_id);
ee465a3e
EH
4934 }
4935
5dfa9e86
DB
4936 if (cc->model && cc->model->cpudef->deprecation_note) {
4937 g_autofree char *olddesc = desc;
4938 desc = g_strdup_printf("%s (deprecated)", olddesc);
4939 }
4940
61848717 4941 qemu_printf("x86 %-20s %s\n", name, desc);
ee465a3e
EH
4942}
4943
4944/* list available CPU models and flags */
0442428a 4945void x86_cpu_list(void)
c6dc6f63 4946{
cc643b1e 4947 int i, j;
ee465a3e 4948 GSList *list;
cc643b1e 4949 GList *names = NULL;
c6dc6f63 4950
0442428a 4951 qemu_printf("Available CPUs:\n");
ee465a3e 4952 list = get_sorted_cpu_model_list();
0442428a 4953 g_slist_foreach(list, x86_cpu_list_entry, NULL);
ee465a3e 4954 g_slist_free(list);
21ad7789 4955
cc643b1e 4956 names = NULL;
3af60be2
JK
4957 for (i = 0; i < ARRAY_SIZE(feature_word_info); i++) {
4958 FeatureWordInfo *fw = &feature_word_info[i];
ede146c2 4959 for (j = 0; j < 64; j++) {
cc643b1e
DB
4960 if (fw->feat_names[j]) {
4961 names = g_list_append(names, (gpointer)fw->feat_names[j]);
4962 }
4963 }
3af60be2 4964 }
cc643b1e
DB
4965
4966 names = g_list_sort(names, (GCompareFunc)strcmp);
4967
0442428a
MA
4968 qemu_printf("\nRecognized CPUID flags:\n");
4969 listflags(names);
4970 qemu_printf("\n");
cc643b1e 4971 g_list_free(names);
c6dc6f63
AP
4972}
4973
390dbc6e
PMD
4974#ifndef CONFIG_USER_ONLY
4975
4976/* Check for missing features that may prevent the CPU class from
4977 * running using the current machine and accelerator.
4978 */
4979static void x86_cpu_class_check_missing_features(X86CPUClass *xcc,
4980 strList **list)
4981{
4982 strList **tail = list;
4983 X86CPU *xc;
4984 Error *err = NULL;
4985
4986 if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
4987 QAPI_LIST_APPEND(tail, g_strdup("kvm"));
4988 return;
4989 }
4990
4991 xc = X86_CPU(object_new_with_class(OBJECT_CLASS(xcc)));
4992
4993 x86_cpu_expand_features(xc, &err);
4994 if (err) {
4995 /* Errors at x86_cpu_expand_features should never happen,
4996 * but in case it does, just report the model as not
4997 * runnable at all using the "type" property.
4998 */
4999 QAPI_LIST_APPEND(tail, g_strdup("type"));
5000 error_free(err);
5001 }
5002
5003 x86_cpu_filter_features(xc, false);
5004
5005 x86_cpu_list_feature_names(xc->filtered_features, tail);
5006
5007 object_unref(OBJECT(xc));
5008}
5009
ee465a3e
EH
5010static void x86_cpu_definition_entry(gpointer data, gpointer user_data)
5011{
5012 ObjectClass *oc = data;
5013 X86CPUClass *cc = X86_CPU_CLASS(oc);
5014 CpuDefinitionInfoList **cpu_list = user_data;
ee465a3e
EH
5015 CpuDefinitionInfo *info;
5016
5017 info = g_malloc0(sizeof(*info));
5018 info->name = x86_cpu_class_get_model_name(cc);
b54c9377
EH
5019 x86_cpu_class_check_missing_features(cc, &info->unavailable_features);
5020 info->has_unavailable_features = true;
8ed877b7 5021 info->q_typename = g_strdup(object_class_get_name(oc));
bd72159d
EH
5022 info->migration_safe = cc->migration_safe;
5023 info->has_migration_safe = true;
5adbed30 5024 info->q_static = cc->static_model;
61ad65d0
RH
5025 if (cc->model && cc->model->cpudef->deprecation_note) {
5026 info->deprecated = true;
5027 } else {
5028 info->deprecated = false;
5029 }
0788a56b
EH
5030 /*
5031 * Old machine types won't report aliases, so that alias translation
5032 * doesn't break compatibility with previous QEMU versions.
5033 */
5034 if (default_cpu_version != CPU_VERSION_LEGACY) {
5035 info->alias_of = x86_cpu_class_get_alias_of(cc);
0788a56b 5036 }
ee465a3e 5037
54aa3de7 5038 QAPI_LIST_PREPEND(*cpu_list, info);
ee465a3e
EH
5039}
5040
25a9d6ca 5041CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
e3966126
AL
5042{
5043 CpuDefinitionInfoList *cpu_list = NULL;
ee465a3e
EH
5044 GSList *list = get_sorted_cpu_model_list();
5045 g_slist_foreach(list, x86_cpu_definition_entry, &cpu_list);
5046 g_slist_free(list);
e3966126
AL
5047 return cpu_list;
5048}
5049
390dbc6e
PMD
5050#endif /* !CONFIG_USER_ONLY */
5051
58f7db26
PB
5052uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
5053 bool migratable_only)
27418adf
EH
5054{
5055 FeatureWordInfo *wi = &feature_word_info[w];
ede146c2 5056 uint64_t r = 0;
27418adf 5057
fefb41bf 5058 if (kvm_enabled()) {
07585923
RH
5059 switch (wi->type) {
5060 case CPUID_FEATURE_WORD:
5061 r = kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid.eax,
5062 wi->cpuid.ecx,
5063 wi->cpuid.reg);
5064 break;
5065 case MSR_FEATURE_WORD:
d86f9636
RH
5066 r = kvm_arch_get_supported_msr_feature(kvm_state,
5067 wi->msr.index);
07585923
RH
5068 break;
5069 }
d6dcc558 5070 } else if (hvf_enabled()) {
07585923
RH
5071 if (wi->type != CPUID_FEATURE_WORD) {
5072 return 0;
5073 }
5074 r = hvf_get_supported_cpuid(wi->cpuid.eax,
5075 wi->cpuid.ecx,
5076 wi->cpuid.reg);
fefb41bf 5077 } else if (tcg_enabled()) {
84f1b92f 5078 r = wi->tcg_features;
fefb41bf
EH
5079 } else {
5080 return ~0;
5081 }
5ea9e9e2
PB
5082#ifndef TARGET_X86_64
5083 if (w == FEAT_8000_0001_EDX) {
5084 r &= ~CPUID_EXT2_LM;
5085 }
5086#endif
84f1b92f
EH
5087 if (migratable_only) {
5088 r &= x86_cpu_get_migratable_flags(w);
5089 }
5090 return r;
27418adf
EH
5091}
5092
d19d6ffa
PB
5093static void x86_cpu_get_supported_cpuid(uint32_t func, uint32_t index,
5094 uint32_t *eax, uint32_t *ebx,
5095 uint32_t *ecx, uint32_t *edx)
5096{
5097 if (kvm_enabled()) {
5098 *eax = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EAX);
5099 *ebx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EBX);
5100 *ecx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_ECX);
5101 *edx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EDX);
5102 } else if (hvf_enabled()) {
5103 *eax = hvf_get_supported_cpuid(func, index, R_EAX);
5104 *ebx = hvf_get_supported_cpuid(func, index, R_EBX);
5105 *ecx = hvf_get_supported_cpuid(func, index, R_ECX);
5106 *edx = hvf_get_supported_cpuid(func, index, R_EDX);
5107 } else {
5108 *eax = 0;
5109 *ebx = 0;
5110 *ecx = 0;
5111 *edx = 0;
5112 }
5113}
5114
798d8ec0
PB
5115static void x86_cpu_get_cache_cpuid(uint32_t func, uint32_t index,
5116 uint32_t *eax, uint32_t *ebx,
5117 uint32_t *ecx, uint32_t *edx)
5118{
5119 uint32_t level, unused;
5120
5121 /* Only return valid host leaves. */
5122 switch (func) {
5123 case 2:
5124 case 4:
5125 host_cpuid(0, 0, &level, &unused, &unused, &unused);
5126 break;
5127 case 0x80000005:
5128 case 0x80000006:
5129 case 0x8000001d:
5130 host_cpuid(0x80000000, 0, &level, &unused, &unused, &unused);
5131 break;
5132 default:
5133 return;
5134 }
5135
5136 if (func > level) {
5137 *eax = 0;
5138 *ebx = 0;
5139 *ecx = 0;
5140 *edx = 0;
5141 } else {
5142 host_cpuid(func, index, eax, ebx, ecx, edx);
5143 }
5144}
5145
5b8978d8
CF
5146/*
5147 * Only for builtin_x86_defs models initialized with x86_register_cpudef_types.
5148 */
f5cc5a5c 5149void x86_cpu_apply_props(X86CPU *cpu, PropValue *props)
5114e842
EH
5150{
5151 PropValue *pv;
5152 for (pv = props; pv->prop; pv++) {
5153 if (!pv->value) {
5154 continue;
5155 }
5325cc34 5156 object_property_parse(OBJECT(cpu), pv->prop, pv->value,
5114e842
EH
5157 &error_abort);
5158 }
5159}
5160
5b8978d8
CF
5161/*
5162 * Apply properties for the CPU model version specified in model.
5163 * Only for builtin_x86_defs models initialized with x86_register_cpudef_types.
5164 */
5165
dcafd1ef
EH
5166static void x86_cpu_apply_version_props(X86CPU *cpu, X86CPUModel *model)
5167{
5168 const X86CPUVersionDefinition *vdef;
5169 X86CPUVersion version = x86_cpu_model_resolve_version(model);
5170
5171 if (version == CPU_VERSION_LEGACY) {
5172 return;
5173 }
5174
5175 for (vdef = x86_cpu_def_get_versions(model->cpudef); vdef->version; vdef++) {
5176 PropValue *p;
5177
5178 for (p = vdef->props; p && p->prop; p++) {
5325cc34 5179 object_property_parse(OBJECT(cpu), p->prop, p->value,
dcafd1ef
EH
5180 &error_abort);
5181 }
5182
5183 if (vdef->version == version) {
5184 break;
5185 }
5186 }
5187
5188 /*
5189 * If we reached the end of the list, version number was invalid
5190 */
5191 assert(vdef->version == version);
5192}
5193
5b8978d8
CF
5194/*
5195 * Load data from X86CPUDefinition into a X86CPU object.
5196 * Only for builtin_x86_defs models initialized with x86_register_cpudef_types.
c080e30e 5197 */
49e2fa85 5198static void x86_cpu_load_model(X86CPU *cpu, X86CPUModel *model)
c6dc6f63 5199{
e11fd689 5200 const X86CPUDefinition *def = model->cpudef;
61dcd775 5201 CPUX86State *env = &cpu->env;
e1c224b4 5202 FeatureWord w;
c6dc6f63 5203
f99fd7ca
EH
5204 /*NOTE: any property set by this function should be returned by
5205 * x86_cpu_static_props(), so static expansion of
5206 * query-cpu-model-expansion is always complete.
5207 */
5208
c39c0edf 5209 /* CPU models only set _minimum_ values for level/xlevel: */
5325cc34 5210 object_property_set_uint(OBJECT(cpu), "min-level", def->level,
49e2fa85 5211 &error_abort);
5325cc34 5212 object_property_set_uint(OBJECT(cpu), "min-xlevel", def->xlevel,
49e2fa85
MA
5213 &error_abort);
5214
5325cc34
MA
5215 object_property_set_int(OBJECT(cpu), "family", def->family, &error_abort);
5216 object_property_set_int(OBJECT(cpu), "model", def->model, &error_abort);
5217 object_property_set_int(OBJECT(cpu), "stepping", def->stepping,
49e2fa85 5218 &error_abort);
5325cc34 5219 object_property_set_str(OBJECT(cpu), "model-id", def->model_id,
49e2fa85 5220 &error_abort);
e1c224b4
EH
5221 for (w = 0; w < FEATURE_WORDS; w++) {
5222 env->features[w] = def->features[w];
5223 }
82beb536 5224
a9f27ea9
EH
5225 /* legacy-cache defaults to 'off' if CPU model provides cache info */
5226 cpu->legacy_cache = !def->cache_info;
ab8f992e 5227
82beb536 5228 env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR;
7c08db30
EH
5229
5230 /* sysenter isn't supported in compatibility mode on AMD,
5231 * syscall isn't supported in compatibility mode on Intel.
5232 * Normally we advertise the actual CPU vendor, but you can
5233 * override this using the 'vendor' property if you want to use
5234 * KVM's sysenter/syscall emulation in compatibility mode and
5235 * when doing cross vendor migration
5236 */
7c08db30 5237
f5cc5a5c
CF
5238 /*
5239 * vendor property is set here but then overloaded with the
5240 * host cpu vendor for KVM and HVF.
5241 */
5242 object_property_set_str(OBJECT(cpu), "vendor", def->vendor, &error_abort);
7c08db30 5243
dcafd1ef 5244 x86_cpu_apply_version_props(cpu, model);
1f43671a
XL
5245
5246 /*
5247 * Properties in versioned CPU model are not user specified features.
5248 * We can simply clear env->user_features here since it will be filled later
5249 * in x86_cpu_expand_features() based on plus_features and minus_features.
5250 */
5251 memset(&env->user_features, 0, sizeof(env->user_features));
c6dc6f63
AP
5252}
5253
00fcd100
AB
5254static gchar *x86_gdb_arch_name(CPUState *cs)
5255{
5256#ifdef TARGET_X86_64
5257 return g_strdup("i386:x86-64");
5258#else
5259 return g_strdup("i386");
5260#endif
5261}
5262
d940ee9b
EH
5263static void x86_cpu_cpudef_class_init(ObjectClass *oc, void *data)
5264{
dcafd1ef 5265 X86CPUModel *model = data;
d940ee9b 5266 X86CPUClass *xcc = X86_CPU_CLASS(oc);
61ad65d0 5267 CPUClass *cc = CPU_CLASS(oc);
d940ee9b 5268
dcafd1ef 5269 xcc->model = model;
bd72159d 5270 xcc->migration_safe = true;
61ad65d0 5271 cc->deprecation_note = model->cpudef->deprecation_note;
d940ee9b
EH
5272}
5273
dcafd1ef 5274static void x86_register_cpu_model_type(const char *name, X86CPUModel *model)
d940ee9b 5275{
88703ce2 5276 g_autofree char *typename = x86_cpu_type_name(name);
d940ee9b
EH
5277 TypeInfo ti = {
5278 .name = typename,
5279 .parent = TYPE_X86_CPU,
5280 .class_init = x86_cpu_cpudef_class_init,
dcafd1ef 5281 .class_data = model,
d940ee9b
EH
5282 };
5283
dcafd1ef 5284 type_register(&ti);
dcafd1ef
EH
5285}
5286
5b8978d8
CF
5287
5288/*
5289 * register builtin_x86_defs;
5290 * "max", "base" and subclasses ("host") are not registered here.
5291 * See x86_cpu_register_types for all model registrations.
5292 */
e11fd689 5293static void x86_register_cpudef_types(const X86CPUDefinition *def)
dcafd1ef
EH
5294{
5295 X86CPUModel *m;
5296 const X86CPUVersionDefinition *vdef;
dcafd1ef 5297
2a923a29
EH
5298 /* AMD aliases are handled at runtime based on CPUID vendor, so
5299 * they shouldn't be set on the CPU model table.
5300 */
5301 assert(!(def->features[FEAT_8000_0001_EDX] & CPUID_EXT2_AMD_ALIASES));
807e9869
EH
5302 /* catch mistakes instead of silently truncating model_id when too long */
5303 assert(def->model_id && strlen(def->model_id) <= 48);
5304
dcafd1ef
EH
5305 /* Unversioned model: */
5306 m = g_new0(X86CPUModel, 1);
5307 m->cpudef = def;
0788a56b
EH
5308 m->version = CPU_VERSION_AUTO;
5309 m->is_alias = true;
dcafd1ef
EH
5310 x86_register_cpu_model_type(def->name, m);
5311
5312 /* Versioned models: */
5313
5314 for (vdef = x86_cpu_def_get_versions(def); vdef->version; vdef++) {
5315 X86CPUModel *m = g_new0(X86CPUModel, 1);
88703ce2
EH
5316 g_autofree char *name =
5317 x86_cpu_versioned_model_name(def, vdef->version);
dcafd1ef
EH
5318 m->cpudef = def;
5319 m->version = vdef->version;
c63938df 5320 m->note = vdef->note;
dcafd1ef 5321 x86_register_cpu_model_type(name, m);
53db89d9
EH
5322
5323 if (vdef->alias) {
5324 X86CPUModel *am = g_new0(X86CPUModel, 1);
5325 am->cpudef = def;
5326 am->version = vdef->version;
0788a56b 5327 am->is_alias = true;
53db89d9
EH
5328 x86_register_cpu_model_type(vdef->alias, am);
5329 }
dcafd1ef 5330 }
2a923a29 5331
d940ee9b
EH
5332}
5333
97afb47e
LL
5334uint32_t cpu_x86_virtual_addr_width(CPUX86State *env)
5335{
5336 if (env->features[FEAT_7_0_ECX] & CPUID_7_0_ECX_LA57) {
5337 return 57; /* 57 bits virtual */
5338 } else {
5339 return 48; /* 48 bits virtual */
5340 }
5341}
5342
c6dc6f63
AP
5343void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
5344 uint32_t *eax, uint32_t *ebx,
5345 uint32_t *ecx, uint32_t *edx)
5346{
6aa9e42f
RH
5347 X86CPU *cpu = env_archcpu(env);
5348 CPUState *cs = env_cpu(env);
d65af288 5349 uint32_t die_offset;
4ed3d478 5350 uint32_t limit;
1ce36bfe 5351 uint32_t signature[3];
f20dec0b
BM
5352 X86CPUTopoInfo topo_info;
5353
5354 topo_info.dies_per_pkg = env->nr_dies;
5355 topo_info.cores_per_die = cs->nr_cores;
5356 topo_info.threads_per_core = cs->nr_threads;
a60f24b5 5357
4ed3d478
DB
5358 /* Calculate & apply limits for different index ranges */
5359 if (index >= 0xC0000000) {
5360 limit = env->cpuid_xlevel2;
5361 } else if (index >= 0x80000000) {
5362 limit = env->cpuid_xlevel;
1ce36bfe
DB
5363 } else if (index >= 0x40000000) {
5364 limit = 0x40000001;
c6dc6f63 5365 } else {
4ed3d478
DB
5366 limit = env->cpuid_level;
5367 }
5368
5369 if (index > limit) {
5370 /* Intel documentation states that invalid EAX input will
5371 * return the same information as EAX=cpuid_level
5372 * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID)
5373 */
5374 index = env->cpuid_level;
c6dc6f63
AP
5375 }
5376
5377 switch(index) {
5378 case 0:
5379 *eax = env->cpuid_level;
5eb2f7a4
EH
5380 *ebx = env->cpuid_vendor1;
5381 *edx = env->cpuid_vendor2;
5382 *ecx = env->cpuid_vendor3;
c6dc6f63
AP
5383 break;
5384 case 1:
5385 *eax = env->cpuid_version;
7e72a45c
EH
5386 *ebx = (cpu->apic_id << 24) |
5387 8 << 8; /* CLFLUSH size in quad words, Linux wants it. */
0514ef2f 5388 *ecx = env->features[FEAT_1_ECX];
19dc85db
RH
5389 if ((*ecx & CPUID_EXT_XSAVE) && (env->cr[4] & CR4_OSXSAVE_MASK)) {
5390 *ecx |= CPUID_EXT_OSXSAVE;
5391 }
0514ef2f 5392 *edx = env->features[FEAT_1_EDX];
ce3960eb
AF
5393 if (cs->nr_cores * cs->nr_threads > 1) {
5394 *ebx |= (cs->nr_cores * cs->nr_threads) << 16;
19dc85db 5395 *edx |= CPUID_HT;
c6dc6f63 5396 }
ea39f9b6
LX
5397 if (!cpu->enable_pmu) {
5398 *ecx &= ~CPUID_EXT_PDCM;
5399 }
c6dc6f63
AP
5400 break;
5401 case 2:
5402 /* cache info: needed for Pentium Pro compatibility */
787aaf57 5403 if (cpu->cache_info_passthrough) {
798d8ec0 5404 x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
787aaf57 5405 break;
a7a0da84
MR
5406 } else if (cpu->vendor_cpuid_only && IS_AMD_CPU(env)) {
5407 *eax = *ebx = *ecx = *edx = 0;
5408 break;
787aaf57 5409 }
5e891bf8 5410 *eax = 1; /* Number of CPUID[EAX=2] calls required */
c6dc6f63 5411 *ebx = 0;
14c985cf
LM
5412 if (!cpu->enable_l3_cache) {
5413 *ecx = 0;
5414 } else {
a9f27ea9 5415 *ecx = cpuid2_cache_descriptor(env->cache_info_cpuid2.l3_cache);
14c985cf 5416 }
a9f27ea9
EH
5417 *edx = (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1d_cache) << 16) |
5418 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1i_cache) << 8) |
5419 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l2_cache));
c6dc6f63
AP
5420 break;
5421 case 4:
5422 /* cache info: needed for Core compatibility */
787aaf57 5423 if (cpu->cache_info_passthrough) {
798d8ec0 5424 x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx);
d7caf13b
IM
5425 /*
5426 * QEMU has its own number of cores/logical cpus,
5427 * set 24..14, 31..26 bit to configured values
5428 */
5429 if (*eax & 31) {
5430 int host_vcpus_per_cache = 1 + ((*eax & 0x3FFC000) >> 14);
5431 int vcpus_per_socket = env->nr_dies * cs->nr_cores *
5432 cs->nr_threads;
5433 if (cs->nr_cores > 1) {
5434 *eax &= ~0xFC000000;
5435 *eax |= (pow2ceil(cs->nr_cores) - 1) << 26;
5436 }
5437 if (host_vcpus_per_cache > vcpus_per_socket) {
5438 *eax &= ~0x3FFC000;
5439 *eax |= (pow2ceil(vcpus_per_socket) - 1) << 14;
5440 }
7e3482f8 5441 }
a7a0da84
MR
5442 } else if (cpu->vendor_cpuid_only && IS_AMD_CPU(env)) {
5443 *eax = *ebx = *ecx = *edx = 0;
c6dc6f63 5444 } else {
2f7a21c4 5445 *eax = 0;
76c2975a 5446 switch (count) {
c6dc6f63 5447 case 0: /* L1 dcache info */
a9f27ea9
EH
5448 encode_cache_cpuid4(env->cache_info_cpuid4.l1d_cache,
5449 1, cs->nr_cores,
7e3482f8 5450 eax, ebx, ecx, edx);
c6dc6f63
AP
5451 break;
5452 case 1: /* L1 icache info */
a9f27ea9
EH
5453 encode_cache_cpuid4(env->cache_info_cpuid4.l1i_cache,
5454 1, cs->nr_cores,
7e3482f8 5455 eax, ebx, ecx, edx);
c6dc6f63
AP
5456 break;
5457 case 2: /* L2 cache info */
a9f27ea9
EH
5458 encode_cache_cpuid4(env->cache_info_cpuid4.l2_cache,
5459 cs->nr_threads, cs->nr_cores,
7e3482f8 5460 eax, ebx, ecx, edx);
c6dc6f63 5461 break;
14c985cf 5462 case 3: /* L3 cache info */
f20dec0b 5463 die_offset = apicid_die_offset(&topo_info);
7e3482f8 5464 if (cpu->enable_l3_cache) {
a9f27ea9 5465 encode_cache_cpuid4(env->cache_info_cpuid4.l3_cache,
d65af288 5466 (1 << die_offset), cs->nr_cores,
7e3482f8 5467 eax, ebx, ecx, edx);
14c985cf
LM
5468 break;
5469 }
7e3482f8 5470 /* fall through */
c6dc6f63 5471 default: /* end of info */
7e3482f8 5472 *eax = *ebx = *ecx = *edx = 0;
c6dc6f63 5473 break;
76c2975a
PB
5474 }
5475 }
c6dc6f63
AP
5476 break;
5477 case 5:
2266d443
MT
5478 /* MONITOR/MWAIT Leaf */
5479 *eax = cpu->mwait.eax; /* Smallest monitor-line size in bytes */
5480 *ebx = cpu->mwait.ebx; /* Largest monitor-line size in bytes */
5481 *ecx = cpu->mwait.ecx; /* flags */
5482 *edx = cpu->mwait.edx; /* mwait substates */
c6dc6f63
AP
5483 break;
5484 case 6:
5485 /* Thermal and Power Leaf */
28b8e4d0 5486 *eax = env->features[FEAT_6_EAX];
c6dc6f63
AP
5487 *ebx = 0;
5488 *ecx = 0;
5489 *edx = 0;
5490 break;
f7911686 5491 case 7:
13526728
EH
5492 /* Structured Extended Feature Flags Enumeration Leaf */
5493 if (count == 0) {
80db491d
JL
5494 /* Maximum ECX value for sub-leaves */
5495 *eax = env->cpuid_level_func7;
0514ef2f 5496 *ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */
f74eefe0 5497 *ecx = env->features[FEAT_7_0_ECX]; /* Feature flags */
0f70ed47
PB
5498 if ((*ecx & CPUID_7_0_ECX_PKU) && env->cr[4] & CR4_PKE_MASK) {
5499 *ecx |= CPUID_7_0_ECX_OSPKE;
5500 }
95ea69fb 5501 *edx = env->features[FEAT_7_0_EDX]; /* Feature flags */
1dec2e1f
SC
5502
5503 /*
5504 * SGX cannot be emulated in software. If hardware does not
5505 * support enabling SGX and/or SGX flexible launch control,
5506 * then we need to update the VM's CPUID values accordingly.
5507 */
5508 if ((*ebx & CPUID_7_0_EBX_SGX) &&
5509 (!kvm_enabled() ||
5510 !(kvm_arch_get_supported_cpuid(cs->kvm_state, 0x7, 0, R_EBX) &
5511 CPUID_7_0_EBX_SGX))) {
5512 *ebx &= ~CPUID_7_0_EBX_SGX;
5513 }
5514
5515 if ((*ecx & CPUID_7_0_ECX_SGX_LC) &&
5516 (!(*ebx & CPUID_7_0_EBX_SGX) || !kvm_enabled() ||
5517 !(kvm_arch_get_supported_cpuid(cs->kvm_state, 0x7, 0, R_ECX) &
5518 CPUID_7_0_ECX_SGX_LC))) {
5519 *ecx &= ~CPUID_7_0_ECX_SGX_LC;
5520 }
80db491d
JL
5521 } else if (count == 1) {
5522 *eax = env->features[FEAT_7_1_EAX];
5523 *ebx = 0;
5524 *ecx = 0;
5525 *edx = 0;
f7911686
YW
5526 } else {
5527 *eax = 0;
5528 *ebx = 0;
5529 *ecx = 0;
5530 *edx = 0;
5531 }
5532 break;
c6dc6f63
AP
5533 case 9:
5534 /* Direct Cache Access Information Leaf */
5535 *eax = 0; /* Bits 0-31 in DCA_CAP MSR */
5536 *ebx = 0;
5537 *ecx = 0;
5538 *edx = 0;
5539 break;
5540 case 0xA:
5541 /* Architectural Performance Monitoring Leaf */
d19d6ffa
PB
5542 if (accel_uses_host_cpuid() && cpu->enable_pmu) {
5543 x86_cpu_get_supported_cpuid(0xA, count, eax, ebx, ecx, edx);
a0fa8208
GN
5544 } else {
5545 *eax = 0;
5546 *ebx = 0;
5547 *ecx = 0;
5548 *edx = 0;
5549 }
c6dc6f63 5550 break;
5232d00a
RK
5551 case 0xB:
5552 /* Extended Topology Enumeration Leaf */
5553 if (!cpu->enable_cpuid_0xb) {
5554 *eax = *ebx = *ecx = *edx = 0;
5555 break;
5556 }
5557
5558 *ecx = count & 0xff;
5559 *edx = cpu->apic_id;
5560
5561 switch (count) {
5562 case 0:
f20dec0b 5563 *eax = apicid_core_offset(&topo_info);
eab60fb9 5564 *ebx = cs->nr_threads;
5232d00a
RK
5565 *ecx |= CPUID_TOPOLOGY_LEVEL_SMT;
5566 break;
5567 case 1:
fb49865d 5568 *eax = apicid_pkg_offset(&topo_info);
eab60fb9 5569 *ebx = cs->nr_cores * cs->nr_threads;
5232d00a
RK
5570 *ecx |= CPUID_TOPOLOGY_LEVEL_CORE;
5571 break;
5572 default:
5573 *eax = 0;
5574 *ebx = 0;
5575 *ecx |= CPUID_TOPOLOGY_LEVEL_INVALID;
5576 }
5577
a94e1428
LX
5578 assert(!(*eax & ~0x1f));
5579 *ebx &= 0xffff; /* The count doesn't need to be reliable. */
5580 break;
c3c67679
YW
5581 case 0x1C:
5582 if (accel_uses_host_cpuid() && cpu->enable_pmu &&
5583 (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR)) {
5584 x86_cpu_get_supported_cpuid(0x1C, 0, eax, ebx, ecx, edx);
5585 *edx = 0;
5586 }
5587 break;
a94e1428
LX
5588 case 0x1F:
5589 /* V2 Extended Topology Enumeration Leaf */
5590 if (env->nr_dies < 2) {
5591 *eax = *ebx = *ecx = *edx = 0;
5592 break;
5593 }
5594
5595 *ecx = count & 0xff;
5596 *edx = cpu->apic_id;
5597 switch (count) {
5598 case 0:
f20dec0b 5599 *eax = apicid_core_offset(&topo_info);
a94e1428
LX
5600 *ebx = cs->nr_threads;
5601 *ecx |= CPUID_TOPOLOGY_LEVEL_SMT;
5602 break;
5603 case 1:
f20dec0b 5604 *eax = apicid_die_offset(&topo_info);
a94e1428
LX
5605 *ebx = cs->nr_cores * cs->nr_threads;
5606 *ecx |= CPUID_TOPOLOGY_LEVEL_CORE;
5607 break;
5608 case 2:
fb49865d 5609 *eax = apicid_pkg_offset(&topo_info);
a94e1428
LX
5610 *ebx = env->nr_dies * cs->nr_cores * cs->nr_threads;
5611 *ecx |= CPUID_TOPOLOGY_LEVEL_DIE;
5612 break;
5613 default:
5614 *eax = 0;
5615 *ebx = 0;
5616 *ecx |= CPUID_TOPOLOGY_LEVEL_INVALID;
5617 }
5232d00a
RK
5618 assert(!(*eax & ~0x1f));
5619 *ebx &= 0xffff; /* The count doesn't need to be reliable. */
5620 break;
2560f19f 5621 case 0xD: {
51e49430 5622 /* Processor Extended State */
2560f19f
PB
5623 *eax = 0;
5624 *ebx = 0;
5625 *ecx = 0;
5626 *edx = 0;
19dc85db 5627 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
51e49430
SY
5628 break;
5629 }
4928cd6d 5630
2560f19f 5631 if (count == 0) {
301e9067
YW
5632 *ecx = xsave_area_size(x86_cpu_xsave_xcr0_components(cpu), false);
5633 *eax = env->features[FEAT_XSAVE_XCR0_LO];
5634 *edx = env->features[FEAT_XSAVE_XCR0_HI];
76ecd7a5
BS
5635 /*
5636 * The initial value of xcr0 and ebx == 0, On host without kvm
5637 * commit 412a3c41(e.g., CentOS 6), the ebx's value always == 0
5638 * even through guest update xcr0, this will crash some legacy guest
5639 * (e.g., CentOS 6), So set ebx == ecx to workaroud it.
5640 */
301e9067 5641 *ebx = kvm_enabled() ? *ecx : xsave_area_size(env->xcr0, false);
2560f19f 5642 } else if (count == 1) {
301e9067
YW
5643 uint64_t xstate = x86_cpu_xsave_xcr0_components(cpu) |
5644 x86_cpu_xsave_xss_components(cpu);
5645
0bb0b2d2 5646 *eax = env->features[FEAT_XSAVE];
301e9067
YW
5647 *ebx = xsave_area_size(xstate, true);
5648 *ecx = env->features[FEAT_XSAVE_XSS_LO];
5649 *edx = env->features[FEAT_XSAVE_XSS_HI];
c3c67679
YW
5650 if (kvm_enabled() && cpu->enable_pmu &&
5651 (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR) &&
5652 (*eax & CPUID_XSAVE_XSAVES)) {
5653 *ecx |= XSTATE_ARCH_LBR_MASK;
5654 } else {
5655 *ecx &= ~XSTATE_ARCH_LBR_MASK;
5656 }
5657 } else if (count == 0xf &&
5658 accel_uses_host_cpuid() && cpu->enable_pmu &&
5659 (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR)) {
5660 x86_cpu_get_supported_cpuid(0xD, count, eax, ebx, ecx, edx);
f4f1110e 5661 } else if (count < ARRAY_SIZE(x86_ext_save_areas)) {
301e9067
YW
5662 const ExtSaveArea *esa = &x86_ext_save_areas[count];
5663
5664 if (x86_cpu_xsave_xcr0_components(cpu) & (1ULL << count)) {
33f373d7
LJ
5665 *eax = esa->size;
5666 *ebx = esa->offset;
0f17f6b3
JL
5667 *ecx = esa->ecx &
5668 (ESA_FEATURE_ALIGN64_MASK | ESA_FEATURE_XFD_MASK);
301e9067
YW
5669 } else if (x86_cpu_xsave_xss_components(cpu) & (1ULL << count)) {
5670 *eax = esa->size;
5671 *ebx = 0;
5672 *ecx = 1;
2560f19f 5673 }
51e49430
SY
5674 }
5675 break;
2560f19f 5676 }
1dec2e1f
SC
5677 case 0x12:
5678#ifndef CONFIG_USER_ONLY
5679 if (!kvm_enabled() ||
5680 !(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_SGX)) {
5681 *eax = *ebx = *ecx = *edx = 0;
5682 break;
5683 }
5684
5685 /*
5686 * SGX sub-leafs CPUID.0x12.{0x2..N} enumerate EPC sections. Retrieve
5687 * the EPC properties, e.g. confidentiality and integrity, from the
5688 * host's first EPC section, i.e. assume there is one EPC section or
5689 * that all EPC sections have the same security properties.
5690 */
5691 if (count > 1) {
5692 uint64_t epc_addr, epc_size;
5693
5694 if (sgx_epc_get_section(count - 2, &epc_addr, &epc_size)) {
5695 *eax = *ebx = *ecx = *edx = 0;
5696 break;
5697 }
5698 host_cpuid(index, 2, eax, ebx, ecx, edx);
5699 *eax = (uint32_t)(epc_addr & 0xfffff000) | 0x1;
5700 *ebx = (uint32_t)(epc_addr >> 32);
5701 *ecx = (uint32_t)(epc_size & 0xfffff000) | (*ecx & 0xf);
5702 *edx = (uint32_t)(epc_size >> 32);
5703 break;
5704 }
5705
5706 /*
5707 * SGX sub-leafs CPUID.0x12.{0x0,0x1} are heavily dependent on hardware
5708 * and KVM, i.e. QEMU cannot emulate features to override what KVM
5709 * supports. Features can be further restricted by userspace, but not
5710 * made more permissive.
5711 */
b0f3184e 5712 x86_cpu_get_supported_cpuid(0x12, count, eax, ebx, ecx, edx);
1dec2e1f
SC
5713
5714 if (count == 0) {
5715 *eax &= env->features[FEAT_SGX_12_0_EAX];
5716 *ebx &= env->features[FEAT_SGX_12_0_EBX];
5717 } else {
5718 *eax &= env->features[FEAT_SGX_12_1_EAX];
5719 *ebx &= 0; /* ebx reserve */
301e9067
YW
5720 *ecx &= env->features[FEAT_XSAVE_XSS_LO];
5721 *edx &= env->features[FEAT_XSAVE_XSS_HI];
1dec2e1f
SC
5722
5723 /* FP and SSE are always allowed regardless of XSAVE/XCR0. */
5724 *ecx |= XSTATE_FP_MASK | XSTATE_SSE_MASK;
5725
5726 /* Access to PROVISIONKEY requires additional credentials. */
c22f5467
SC
5727 if ((*eax & (1U << 4)) &&
5728 !kvm_enable_sgx_provisioning(cs->kvm_state)) {
5729 *eax &= ~(1U << 4);
5730 }
1dec2e1f
SC
5731 }
5732#endif
5733 break;
e37a5c7f
CP
5734 case 0x14: {
5735 /* Intel Processor Trace Enumeration */
5736 *eax = 0;
5737 *ebx = 0;
5738 *ecx = 0;
5739 *edx = 0;
5740 if (!(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) ||
5741 !kvm_enabled()) {
5742 break;
5743 }
5744
5745 if (count == 0) {
5746 *eax = INTEL_PT_MAX_SUBLEAF;
5747 *ebx = INTEL_PT_MINIMAL_EBX;
5748 *ecx = INTEL_PT_MINIMAL_ECX;
d1615ea5
LK
5749 if (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP) {
5750 *ecx |= CPUID_14_0_ECX_LIP;
5751 }
e37a5c7f
CP
5752 } else if (count == 1) {
5753 *eax = INTEL_PT_MTC_BITMAP | INTEL_PT_ADDR_RANGES_NUM;
5754 *ebx = INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP;
5755 }
5756 break;
5757 }
f21a4817 5758 case 0x1D: {
7eb061b0 5759 /* AMX TILE, for now hardcoded for Sapphire Rapids*/
f21a4817
JL
5760 *eax = 0;
5761 *ebx = 0;
5762 *ecx = 0;
5763 *edx = 0;
5764 if (!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE)) {
5765 break;
5766 }
5767
5768 if (count == 0) {
5769 /* Highest numbered palette subleaf */
5770 *eax = INTEL_AMX_TILE_MAX_SUBLEAF;
5771 } else if (count == 1) {
5772 *eax = INTEL_AMX_TOTAL_TILE_BYTES |
5773 (INTEL_AMX_BYTES_PER_TILE << 16);
5774 *ebx = INTEL_AMX_BYTES_PER_ROW | (INTEL_AMX_TILE_MAX_NAMES << 16);
5775 *ecx = INTEL_AMX_TILE_MAX_ROWS;
5776 }
5777 break;
5778 }
5779 case 0x1E: {
7eb061b0 5780 /* AMX TMUL, for now hardcoded for Sapphire Rapids */
f21a4817
JL
5781 *eax = 0;
5782 *ebx = 0;
5783 *ecx = 0;
5784 *edx = 0;
5785 if (!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE)) {
5786 break;
5787 }
5788
5789 if (count == 0) {
5790 /* Highest numbered palette subleaf */
5791 *ebx = INTEL_AMX_TMUL_MAX_K | (INTEL_AMX_TMUL_MAX_N << 8);
5792 }
5793 break;
5794 }
1ce36bfe
DB
5795 case 0x40000000:
5796 /*
5797 * CPUID code in kvm_arch_init_vcpu() ignores stuff
5798 * set here, but we restrict to TCG none the less.
5799 */
5800 if (tcg_enabled() && cpu->expose_tcg) {
5801 memcpy(signature, "TCGTCGTCGTCG", 12);
5802 *eax = 0x40000001;
5803 *ebx = signature[0];
5804 *ecx = signature[1];
5805 *edx = signature[2];
5806 } else {
5807 *eax = 0;
5808 *ebx = 0;
5809 *ecx = 0;
5810 *edx = 0;
5811 }
5812 break;
5813 case 0x40000001:
5814 *eax = 0;
5815 *ebx = 0;
5816 *ecx = 0;
5817 *edx = 0;
5818 break;
c6dc6f63
AP
5819 case 0x80000000:
5820 *eax = env->cpuid_xlevel;
5821 *ebx = env->cpuid_vendor1;
5822 *edx = env->cpuid_vendor2;
5823 *ecx = env->cpuid_vendor3;
5824 break;
5825 case 0x80000001:
5826 *eax = env->cpuid_version;
5827 *ebx = 0;
0514ef2f
EH
5828 *ecx = env->features[FEAT_8000_0001_ECX];
5829 *edx = env->features[FEAT_8000_0001_EDX];
c6dc6f63
AP
5830
5831 /* The Linux kernel checks for the CMPLegacy bit and
5832 * discards multiple thread information if it is set.
cb8d4c8f 5833 * So don't set it here for Intel to make Linux guests happy.
c6dc6f63 5834 */
ce3960eb 5835 if (cs->nr_cores * cs->nr_threads > 1) {
5eb2f7a4
EH
5836 if (env->cpuid_vendor1 != CPUID_VENDOR_INTEL_1 ||
5837 env->cpuid_vendor2 != CPUID_VENDOR_INTEL_2 ||
5838 env->cpuid_vendor3 != CPUID_VENDOR_INTEL_3) {
c6dc6f63
AP
5839 *ecx |= 1 << 1; /* CmpLegacy bit */
5840 }
5841 }
c6dc6f63
AP
5842 break;
5843 case 0x80000002:
5844 case 0x80000003:
5845 case 0x80000004:
5846 *eax = env->cpuid_model[(index - 0x80000002) * 4 + 0];
5847 *ebx = env->cpuid_model[(index - 0x80000002) * 4 + 1];
5848 *ecx = env->cpuid_model[(index - 0x80000002) * 4 + 2];
5849 *edx = env->cpuid_model[(index - 0x80000002) * 4 + 3];
5850 break;
5851 case 0x80000005:
5852 /* cache info (L1 cache) */
787aaf57 5853 if (cpu->cache_info_passthrough) {
798d8ec0 5854 x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
787aaf57
BC
5855 break;
5856 }
78ee6bd0 5857 *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) |
5e891bf8 5858 (L1_ITLB_2M_ASSOC << 8) | (L1_ITLB_2M_ENTRIES);
78ee6bd0 5859 *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) |
5e891bf8 5860 (L1_ITLB_4K_ASSOC << 8) | (L1_ITLB_4K_ENTRIES);
a9f27ea9
EH
5861 *ecx = encode_cache_cpuid80000005(env->cache_info_amd.l1d_cache);
5862 *edx = encode_cache_cpuid80000005(env->cache_info_amd.l1i_cache);
c6dc6f63
AP
5863 break;
5864 case 0x80000006:
5865 /* cache info (L2 cache) */
787aaf57 5866 if (cpu->cache_info_passthrough) {
798d8ec0 5867 x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
787aaf57
BC
5868 break;
5869 }
78ee6bd0
PMD
5870 *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) |
5871 (L2_DTLB_2M_ENTRIES << 16) |
5872 (AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) |
5e891bf8 5873 (L2_ITLB_2M_ENTRIES);
78ee6bd0
PMD
5874 *ebx = (AMD_ENC_ASSOC(L2_DTLB_4K_ASSOC) << 28) |
5875 (L2_DTLB_4K_ENTRIES << 16) |
5876 (AMD_ENC_ASSOC(L2_ITLB_4K_ASSOC) << 12) |
5e891bf8 5877 (L2_ITLB_4K_ENTRIES);
a9f27ea9
EH
5878 encode_cache_cpuid80000006(env->cache_info_amd.l2_cache,
5879 cpu->enable_l3_cache ?
5880 env->cache_info_amd.l3_cache : NULL,
5881 ecx, edx);
c6dc6f63 5882 break;
303752a9
MT
5883 case 0x80000007:
5884 *eax = 0;
5885 *ebx = 0;
5886 *ecx = 0;
5887 *edx = env->features[FEAT_8000_0007_EDX];
5888 break;
c6dc6f63
AP
5889 case 0x80000008:
5890 /* virtual & phys address size in low 2 bytes. */
97afb47e 5891 *eax = cpu->phys_bits;
0514ef2f 5892 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
6c7c3c21 5893 /* 64 bit processor */
97afb47e 5894 *eax |= (cpu_x86_virtual_addr_width(env) << 8);
c6dc6f63 5895 }
1b3420e1 5896 *ebx = env->features[FEAT_8000_0008_EBX];
ce3960eb 5897 if (cs->nr_cores * cs->nr_threads > 1) {
cac9edfc
BM
5898 /*
5899 * Bits 15:12 is "The number of bits in the initial
5900 * Core::X86::Apic::ApicId[ApicId] value that indicate
fb49865d 5901 * thread ID within a package".
cac9edfc
BM
5902 * Bits 7:0 is "The number of threads in the package is NC+1"
5903 */
fb49865d 5904 *ecx = (apicid_pkg_offset(&topo_info) << 12) |
cac9edfc
BM
5905 ((cs->nr_cores * cs->nr_threads) - 1);
5906 } else {
5907 *ecx = 0;
c6dc6f63 5908 }
cac9edfc 5909 *edx = 0;
c6dc6f63
AP
5910 break;
5911 case 0x8000000A:
0514ef2f 5912 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
9f3fb565
EH
5913 *eax = 0x00000001; /* SVM Revision */
5914 *ebx = 0x00000010; /* nr of ASIDs */
5915 *ecx = 0;
0514ef2f 5916 *edx = env->features[FEAT_SVM]; /* optional features */
9f3fb565
EH
5917 } else {
5918 *eax = 0;
5919 *ebx = 0;
5920 *ecx = 0;
5921 *edx = 0;
5922 }
c6dc6f63 5923 break;
8f4202fb
BM
5924 case 0x8000001D:
5925 *eax = 0;
a4e0b436 5926 if (cpu->cache_info_passthrough) {
798d8ec0 5927 x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx);
a4e0b436
SL
5928 break;
5929 }
8f4202fb
BM
5930 switch (count) {
5931 case 0: /* L1 dcache info */
2f084d1e
BM
5932 encode_cache_cpuid8000001d(env->cache_info_amd.l1d_cache,
5933 &topo_info, eax, ebx, ecx, edx);
8f4202fb
BM
5934 break;
5935 case 1: /* L1 icache info */
2f084d1e
BM
5936 encode_cache_cpuid8000001d(env->cache_info_amd.l1i_cache,
5937 &topo_info, eax, ebx, ecx, edx);
8f4202fb
BM
5938 break;
5939 case 2: /* L2 cache info */
2f084d1e
BM
5940 encode_cache_cpuid8000001d(env->cache_info_amd.l2_cache,
5941 &topo_info, eax, ebx, ecx, edx);
8f4202fb
BM
5942 break;
5943 case 3: /* L3 cache info */
2f084d1e
BM
5944 encode_cache_cpuid8000001d(env->cache_info_amd.l3_cache,
5945 &topo_info, eax, ebx, ecx, edx);
8f4202fb
BM
5946 break;
5947 default: /* end of info */
5948 *eax = *ebx = *ecx = *edx = 0;
5949 break;
5950 }
5951 break;
ed78467a 5952 case 0x8000001E:
35ac5dfb
BM
5953 if (cpu->core_id <= 255) {
5954 encode_topo_cpuid8000001e(cpu, &topo_info, eax, ebx, ecx, edx);
5955 } else {
5956 *eax = 0;
5957 *ebx = 0;
5958 *ecx = 0;
5959 *edx = 0;
5960 }
ed78467a 5961 break;
b3baa152
BW
5962 case 0xC0000000:
5963 *eax = env->cpuid_xlevel2;
5964 *ebx = 0;
5965 *ecx = 0;
5966 *edx = 0;
5967 break;
5968 case 0xC0000001:
5969 /* Support for VIA CPU's CPUID instruction */
5970 *eax = env->cpuid_version;
5971 *ebx = 0;
5972 *ecx = 0;
0514ef2f 5973 *edx = env->features[FEAT_C000_0001_EDX];
b3baa152
BW
5974 break;
5975 case 0xC0000002:
5976 case 0xC0000003:
5977 case 0xC0000004:
5978 /* Reserved for the future, and now filled with zero */
5979 *eax = 0;
5980 *ebx = 0;
5981 *ecx = 0;
5982 *edx = 0;
5983 break;
6cb8f2a6 5984 case 0x8000001F:
02eacf31
PMD
5985 *eax = *ebx = *ecx = *edx = 0;
5986 if (sev_enabled()) {
5987 *eax = 0x2;
5988 *eax |= sev_es_enabled() ? 0x8 : 0;
5989 *ebx = sev_get_cbit_position();
5990 *ebx |= sev_get_reduced_phys_bits() << 6;
5991 }
6cb8f2a6 5992 break;
c6dc6f63
AP
5993 default:
5994 /* reserved values: zero */
5995 *eax = 0;
5996 *ebx = 0;
5997 *ecx = 0;
5998 *edx = 0;
5999 break;
6000 }
6001}
5fd2087a 6002
db888065
SC
6003static void x86_cpu_set_sgxlepubkeyhash(CPUX86State *env)
6004{
6005#ifndef CONFIG_USER_ONLY
6006 /* Those default values are defined in Skylake HW */
6007 env->msr_ia32_sgxlepubkeyhash[0] = 0xa6053e051270b7acULL;
6008 env->msr_ia32_sgxlepubkeyhash[1] = 0x6cfbe8ba8b3b413dULL;
6009 env->msr_ia32_sgxlepubkeyhash[2] = 0xc4916d99f2b3735dULL;
6010 env->msr_ia32_sgxlepubkeyhash[3] = 0xd4f8c05909f9bb3bULL;
6011#endif
6012}
6013
e86787d3 6014static void x86_cpu_reset_hold(Object *obj)
5fd2087a 6015{
e86787d3 6016 CPUState *s = CPU(obj);
5fd2087a
AF
6017 X86CPU *cpu = X86_CPU(s);
6018 X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu);
6019 CPUX86State *env = &cpu->env;
a114d25d
RH
6020 target_ulong cr4;
6021 uint64_t xcr0;
c1958aea
AF
6022 int i;
6023
e86787d3
PM
6024 if (xcc->parent_phases.hold) {
6025 xcc->parent_phases.hold(obj);
6026 }
5fd2087a 6027
5e992a8e 6028 memset(env, 0, offsetof(CPUX86State, end_reset_fields));
c1958aea 6029
c1958aea
AF
6030 env->old_exception = -1;
6031
6032 /* init to reset state */
e3126a5c 6033 env->int_ctl = 0;
c1958aea 6034 env->hflags2 |= HF2_GIF_MASK;
b67e2796 6035 env->hflags2 |= HF2_VGIF_MASK;
b16c0e20 6036 env->hflags &= ~HF_GUEST_MASK;
c1958aea
AF
6037
6038 cpu_x86_update_cr0(env, 0x60000010);
6039 env->a20_mask = ~0x0;
6040 env->smbase = 0x30000;
e13713db 6041 env->msr_smi_count = 0;
c1958aea
AF
6042
6043 env->idt.limit = 0xffff;
6044 env->gdt.limit = 0xffff;
6045 env->ldt.limit = 0xffff;
6046 env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT);
6047 env->tr.limit = 0xffff;
6048 env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT);
6049
6050 cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff,
6051 DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK |
6052 DESC_R_MASK | DESC_A_MASK);
6053 cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff,
6054 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
6055 DESC_A_MASK);
6056 cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff,
6057 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
6058 DESC_A_MASK);
6059 cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff,
6060 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
6061 DESC_A_MASK);
6062 cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff,
6063 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
6064 DESC_A_MASK);
6065 cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff,
6066 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
6067 DESC_A_MASK);
6068
6069 env->eip = 0xfff0;
6070 env->regs[R_EDX] = env->cpuid_version;
6071
6072 env->eflags = 0x2;
6073
6074 /* FPU init */
6075 for (i = 0; i < 8; i++) {
6076 env->fptags[i] = 1;
6077 }
5bde1407 6078 cpu_set_fpuc(env, 0x37f);
c1958aea
AF
6079
6080 env->mxcsr = 0x1f80;
a114d25d
RH
6081 /* All units are in INIT state. */
6082 env->xstate_bv = 0;
c1958aea
AF
6083
6084 env->pat = 0x0007040600070406ULL;
5286c366
PB
6085
6086 if (kvm_enabled()) {
6087 /*
6088 * KVM handles TSC = 0 specially and thinks we are hot-plugging
6089 * a new CPU, use 1 instead to force a reset.
6090 */
6091 if (env->tsc != 0) {
6092 env->tsc = 1;
6093 }
6094 } else {
6095 env->tsc = 0;
6096 }
6097
c1958aea 6098 env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT;
4cfd7bab
WL
6099 if (env->features[FEAT_1_ECX] & CPUID_EXT_MONITOR) {
6100 env->msr_ia32_misc_enable |= MSR_IA32_MISC_ENABLE_MWAIT;
6101 }
c1958aea
AF
6102
6103 memset(env->dr, 0, sizeof(env->dr));
6104 env->dr[6] = DR6_FIXED_1;
6105 env->dr[7] = DR7_FIXED_1;
b3310ab3 6106 cpu_breakpoint_remove_all(s, BP_CPU);
75a34036 6107 cpu_watchpoint_remove_all(s, BP_CPU);
dd673288 6108
a114d25d 6109 cr4 = 0;
cfc3b074 6110 xcr0 = XSTATE_FP_MASK;
a114d25d
RH
6111
6112#ifdef CONFIG_USER_ONLY
6113 /* Enable all the features for user-mode. */
6114 if (env->features[FEAT_1_EDX] & CPUID_SSE) {
cfc3b074 6115 xcr0 |= XSTATE_SSE_MASK;
a114d25d 6116 }
0f70ed47
PB
6117 for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
6118 const ExtSaveArea *esa = &x86_ext_save_areas[i];
301e9067
YW
6119 if (!((1 << i) & CPUID_XSTATE_XCR0_MASK)) {
6120 continue;
6121 }
9646f492 6122 if (env->features[esa->feature] & esa->bits) {
0f70ed47
PB
6123 xcr0 |= 1ull << i;
6124 }
a114d25d 6125 }
0f70ed47 6126
a114d25d
RH
6127 if (env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE) {
6128 cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK;
6129 }
07929f2a
RH
6130 if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_FSGSBASE) {
6131 cr4 |= CR4_FSGSBASE_MASK;
6132 }
a114d25d
RH
6133#endif
6134
6135 env->xcr0 = xcr0;
6136 cpu_x86_update_cr4(env, cr4);
0522604b 6137
9db2efd9
AW
6138 /*
6139 * SDM 11.11.5 requires:
6140 * - IA32_MTRR_DEF_TYPE MSR.E = 0
6141 * - IA32_MTRR_PHYSMASKn.V = 0
6142 * All other bits are undefined. For simplification, zero it all.
6143 */
6144 env->mtrr_deftype = 0;
6145 memset(env->mtrr_var, 0, sizeof(env->mtrr_var));
6146 memset(env->mtrr_fixed, 0, sizeof(env->mtrr_fixed));
6147
b7394c83 6148 env->interrupt_injected = -1;
fd13f23b
LA
6149 env->exception_nr = -1;
6150 env->exception_pending = 0;
6151 env->exception_injected = 0;
6152 env->exception_has_payload = false;
6153 env->exception_payload = 0;
b7394c83 6154 env->nmi_injected = false;
12f89a39 6155 env->triple_fault_pending = false;
dd673288
IM
6156#if !defined(CONFIG_USER_ONLY)
6157 /* We hard-wire the BSP to the first CPU. */
9cb11fd7 6158 apic_designate_bsp(cpu->apic_state, s->cpu_index == 0);
dd673288 6159
259186a7 6160 s->halted = !cpu_is_bsp(cpu);
50a2c6e5
PB
6161
6162 if (kvm_enabled()) {
6163 kvm_arch_reset_vcpu(cpu);
6164 }
db888065
SC
6165
6166 x86_cpu_set_sgxlepubkeyhash(env);
cabf9862 6167
3e4546d5 6168 env->amd_tsc_scale_msr = MSR_AMD64_TSC_RATIO_DEFAULT;
cabf9862 6169
dd673288 6170#endif
5fd2087a
AF
6171}
6172
ec19444a
MS
6173void x86_cpu_after_reset(X86CPU *cpu)
6174{
6175#ifndef CONFIG_USER_ONLY
6176 if (kvm_enabled()) {
6177 kvm_arch_after_reset_vcpu(cpu);
6178 }
6179
6180 if (cpu->apic_state) {
08c4f4db 6181 device_cold_reset(cpu->apic_state);
ec19444a
MS
6182 }
6183#endif
6184}
6185
de024815
AF
6186static void mce_init(X86CPU *cpu)
6187{
6188 CPUX86State *cenv = &cpu->env;
6189 unsigned int bank;
6190
6191 if (((cenv->cpuid_version >> 8) & 0xf) >= 6
0514ef2f 6192 && (cenv->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) ==
de024815 6193 (CPUID_MCE | CPUID_MCA)) {
87f8b626
AR
6194 cenv->mcg_cap = MCE_CAP_DEF | MCE_BANKS_DEF |
6195 (cpu->enable_lmce ? MCG_LMCE_P : 0);
de024815
AF
6196 cenv->mcg_ctl = ~(uint64_t)0;
6197 for (bank = 0; bank < MCE_BANKS_DEF; bank++) {
6198 cenv->mce_banks[bank * 4] = ~(uint64_t)0;
6199 }
6200 }
6201}
6202
c39c0edf
EH
6203static void x86_cpu_adjust_level(X86CPU *cpu, uint32_t *min, uint32_t value)
6204{
6205 if (*min < value) {
6206 *min = value;
6207 }
6208}
6209
6210/* Increase cpuid_min_{level,xlevel,xlevel2} automatically, if appropriate */
6211static void x86_cpu_adjust_feat_level(X86CPU *cpu, FeatureWord w)
6212{
6213 CPUX86State *env = &cpu->env;
6214 FeatureWordInfo *fi = &feature_word_info[w];
07585923 6215 uint32_t eax = fi->cpuid.eax;
c39c0edf
EH
6216 uint32_t region = eax & 0xF0000000;
6217
07585923 6218 assert(feature_word_info[w].type == CPUID_FEATURE_WORD);
c39c0edf
EH
6219 if (!env->features[w]) {
6220 return;
6221 }
6222
6223 switch (region) {
6224 case 0x00000000:
6225 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, eax);
6226 break;
6227 case 0x80000000:
6228 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, eax);
6229 break;
6230 case 0xC0000000:
6231 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel2, eax);
6232 break;
6233 }
80db491d
JL
6234
6235 if (eax == 7) {
6236 x86_cpu_adjust_level(cpu, &env->cpuid_min_level_func7,
6237 fi->cpuid.ecx);
6238 }
c39c0edf
EH
6239}
6240
2ca8a8be
EH
6241/* Calculate XSAVE components based on the configured CPU feature flags */
6242static void x86_cpu_enable_xsave_components(X86CPU *cpu)
6243{
6244 CPUX86State *env = &cpu->env;
6245 int i;
96193c22 6246 uint64_t mask;
19db68ca 6247 static bool request_perm;
2ca8a8be
EH
6248
6249 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
301e9067
YW
6250 env->features[FEAT_XSAVE_XCR0_LO] = 0;
6251 env->features[FEAT_XSAVE_XCR0_HI] = 0;
2ca8a8be
EH
6252 return;
6253 }
6254
e3c9022b
EH
6255 mask = 0;
6256 for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
2ca8a8be
EH
6257 const ExtSaveArea *esa = &x86_ext_save_areas[i];
6258 if (env->features[esa->feature] & esa->bits) {
96193c22 6259 mask |= (1ULL << i);
2ca8a8be
EH
6260 }
6261 }
6262
19db68ca
YZ
6263 /* Only request permission for first vcpu */
6264 if (kvm_enabled() && !request_perm) {
6265 kvm_request_xsave_components(cpu, mask);
6266 request_perm = true;
6267 }
6268
301e9067
YW
6269 env->features[FEAT_XSAVE_XCR0_LO] = mask & CPUID_XSTATE_XCR0_MASK;
6270 env->features[FEAT_XSAVE_XCR0_HI] = mask >> 32;
6271 env->features[FEAT_XSAVE_XSS_LO] = mask & CPUID_XSTATE_XSS_MASK;
6272 env->features[FEAT_XSAVE_XSS_HI] = mask >> 32;
2ca8a8be
EH
6273}
6274
b8d834a0
EH
6275/***** Steps involved on loading and filtering CPUID data
6276 *
6277 * When initializing and realizing a CPU object, the steps
6278 * involved in setting up CPUID data are:
6279 *
6280 * 1) Loading CPU model definition (X86CPUDefinition). This is
dcafd1ef 6281 * implemented by x86_cpu_load_model() and should be completely
b8d834a0
EH
6282 * transparent, as it is done automatically by instance_init.
6283 * No code should need to look at X86CPUDefinition structs
6284 * outside instance_init.
6285 *
6286 * 2) CPU expansion. This is done by realize before CPUID
6287 * filtering, and will make sure host/accelerator data is
6288 * loaded for CPU models that depend on host capabilities
6289 * (e.g. "host"). Done by x86_cpu_expand_features().
6290 *
6291 * 3) CPUID filtering. This initializes extra data related to
6292 * CPUID, and checks if the host supports all capabilities
6293 * required by the CPU. Runnability of a CPU model is
6294 * determined at this step. Done by x86_cpu_filter_features().
6295 *
6296 * Some operations don't require all steps to be performed.
6297 * More precisely:
6298 *
6299 * - CPU instance creation (instance_init) will run only CPU
6300 * model loading. CPU expansion can't run at instance_init-time
6301 * because host/accelerator data may be not available yet.
6302 * - CPU realization will perform both CPU model expansion and CPUID
6303 * filtering, and return an error in case one of them fails.
6304 * - query-cpu-definitions needs to run all 3 steps. It needs
6305 * to run CPUID filtering, as the 'unavailable-features'
6306 * field is set based on the filtering results.
6307 * - The query-cpu-model-expansion QMP command only needs to run
6308 * CPU model loading and CPU expansion. It should not filter
6309 * any CPUID data based on host capabilities.
6310 */
6311
6312/* Expand CPU configuration data, based on configured features
6313 * and host/accelerator capabilities when appropriate.
6314 */
79f1a68a 6315void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
7a059953 6316{
b34d12d1 6317 CPUX86State *env = &cpu->env;
dc15c051 6318 FeatureWord w;
99e24dbd 6319 int i;
2fae0d96 6320 GList *l;
9886e834 6321
99e24dbd
PB
6322 for (l = plus_features; l; l = l->next) {
6323 const char *prop = l->data;
992861fb
MA
6324 if (!object_property_set_bool(OBJECT(cpu), prop, true, errp)) {
6325 return;
99e24dbd
PB
6326 }
6327 }
6328
6329 for (l = minus_features; l; l = l->next) {
6330 const char *prop = l->data;
992861fb
MA
6331 if (!object_property_set_bool(OBJECT(cpu), prop, false, errp)) {
6332 return;
99e24dbd
PB
6333 }
6334 }
6335
d4a606b3
EH
6336 /*TODO: Now cpu->max_features doesn't overwrite features
6337 * set using QOM properties, and we can convert
dc15c051
IM
6338 * plus_features & minus_features to global properties
6339 * inside x86_cpu_parse_featurestr() too.
6340 */
44bd8e53 6341 if (cpu->max_features) {
dc15c051 6342 for (w = 0; w < FEATURE_WORDS; w++) {
d4a606b3
EH
6343 /* Override only features that weren't set explicitly
6344 * by the user.
6345 */
6346 env->features[w] |=
6347 x86_cpu_get_supported_feature_word(w, cpu->migratable) &
78ee6bd0 6348 ~env->user_features[w] &
0d914f39 6349 ~feature_word_info[w].no_autoenable_flags;
dc15c051
IM
6350 }
6351 }
6352
99e24dbd
PB
6353 for (i = 0; i < ARRAY_SIZE(feature_dependencies); i++) {
6354 FeatureDep *d = &feature_dependencies[i];
6355 if (!(env->features[d->from.index] & d->from.mask)) {
ede146c2 6356 uint64_t unavailable_features = env->features[d->to.index] & d->to.mask;
2fae0d96 6357
99e24dbd
PB
6358 /* Not an error unless the dependent feature was added explicitly. */
6359 mark_unavailable_features(cpu, d->to.index,
6360 unavailable_features & env->user_features[d->to.index],
6361 "This feature depends on other features that were not requested");
6362
99e24dbd 6363 env->features[d->to.index] &= ~unavailable_features;
2fae0d96 6364 }
dc15c051
IM
6365 }
6366
aec661de
EH
6367 if (!kvm_enabled() || !cpu->expose_kvm) {
6368 env->features[FEAT_KVM] = 0;
6369 }
6370
2ca8a8be 6371 x86_cpu_enable_xsave_components(cpu);
c39c0edf
EH
6372
6373 /* CPUID[EAX=7,ECX=0].EBX always increased level automatically: */
6374 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_EBX);
6375 if (cpu->full_cpuid_auto_level) {
6376 x86_cpu_adjust_feat_level(cpu, FEAT_1_EDX);
6377 x86_cpu_adjust_feat_level(cpu, FEAT_1_ECX);
6378 x86_cpu_adjust_feat_level(cpu, FEAT_6_EAX);
6379 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_ECX);
80db491d 6380 x86_cpu_adjust_feat_level(cpu, FEAT_7_1_EAX);
c39c0edf
EH
6381 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_EDX);
6382 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_ECX);
6383 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0007_EDX);
1b3420e1 6384 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0008_EBX);
c39c0edf
EH
6385 x86_cpu_adjust_feat_level(cpu, FEAT_C000_0001_EDX);
6386 x86_cpu_adjust_feat_level(cpu, FEAT_SVM);
6387 x86_cpu_adjust_feat_level(cpu, FEAT_XSAVE);
f24c3a79
LK
6388
6389 /* Intel Processor Trace requires CPUID[0x14] */
ddc2fc9e
LK
6390 if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT)) {
6391 if (cpu->intel_pt_auto_level) {
6392 x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14);
6393 } else if (cpu->env.cpuid_min_level < 0x14) {
6394 mark_unavailable_features(cpu, FEAT_7_0_EBX,
6395 CPUID_7_0_EBX_INTEL_PT,
b7d77f5a 6396 "Intel PT need CPUID leaf 0x14, please set by \"-cpu ...,intel-pt=on,min-level=0x14\"");
ddc2fc9e 6397 }
f24c3a79
LK
6398 }
6399
760746ac
ZP
6400 /*
6401 * Intel CPU topology with multi-dies support requires CPUID[0x1F].
6402 * For AMD Rome/Milan, cpuid level is 0x10, and guest OS should detect
6403 * extended toplogy by leaf 0xB. Only adjust it for Intel CPU, unless
6404 * cpu->vendor_cpuid_only has been unset for compatibility with older
6405 * machine types.
6406 */
6407 if ((env->nr_dies > 1) &&
6408 (IS_INTEL_CPU(env) || !cpu->vendor_cpuid_only)) {
a94e1428
LX
6409 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x1F);
6410 }
6411
0c3d7c00
EH
6412 /* SVM requires CPUID[0x8000000A] */
6413 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
6414 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000000A);
6415 }
6cb8f2a6
BS
6416
6417 /* SEV requires CPUID[0x8000001F] */
6418 if (sev_enabled()) {
6419 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000001F);
6420 }
dca6cffc
SC
6421
6422 /* SGX requires CPUID[0x12] for EPC enumeration */
6423 if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_SGX) {
6424 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x12);
6425 }
c39c0edf
EH
6426 }
6427
6428 /* Set cpuid_*level* based on cpuid_min_*level, if not explicitly set */
80db491d
JL
6429 if (env->cpuid_level_func7 == UINT32_MAX) {
6430 env->cpuid_level_func7 = env->cpuid_min_level_func7;
6431 }
c39c0edf
EH
6432 if (env->cpuid_level == UINT32_MAX) {
6433 env->cpuid_level = env->cpuid_min_level;
6434 }
6435 if (env->cpuid_xlevel == UINT32_MAX) {
6436 env->cpuid_xlevel = env->cpuid_min_xlevel;
6437 }
6438 if (env->cpuid_xlevel2 == UINT32_MAX) {
6439 env->cpuid_xlevel2 = env->cpuid_min_xlevel2;
b34d12d1 6440 }
071ce4b0
VK
6441
6442 if (kvm_enabled()) {
6443 kvm_hyperv_expand_features(cpu, errp);
6444 }
41f3d4d6
EH
6445}
6446
b8d834a0
EH
6447/*
6448 * Finishes initialization of CPUID data, filters CPU feature
6449 * words based on host availability of each feature.
6450 *
6451 * Returns: 0 if all flags are supported by the host, non-zero otherwise.
6452 */
245edd0c 6453static void x86_cpu_filter_features(X86CPU *cpu, bool verbose)
b8d834a0
EH
6454{
6455 CPUX86State *env = &cpu->env;
6456 FeatureWord w;
245edd0c
PB
6457 const char *prefix = NULL;
6458
6459 if (verbose) {
6460 prefix = accel_uses_host_cpuid()
6461 ? "host doesn't support requested feature"
6462 : "TCG doesn't support requested feature";
6463 }
b8d834a0
EH
6464
6465 for (w = 0; w < FEATURE_WORDS; w++) {
ede146c2 6466 uint64_t host_feat =
b8d834a0 6467 x86_cpu_get_supported_feature_word(w, false);
ede146c2
PB
6468 uint64_t requested_features = env->features[w];
6469 uint64_t unavailable_features = requested_features & ~host_feat;
245edd0c 6470 mark_unavailable_features(cpu, w, unavailable_features, prefix);
b8d834a0
EH
6471 }
6472
e37a5c7f
CP
6473 if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) &&
6474 kvm_enabled()) {
6475 KVMState *s = CPU(cpu)->kvm_state;
6476 uint32_t eax_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EAX);
6477 uint32_t ebx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EBX);
6478 uint32_t ecx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_ECX);
6479 uint32_t eax_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EAX);
6480 uint32_t ebx_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EBX);
6481
6482 if (!eax_0 ||
6483 ((ebx_0 & INTEL_PT_MINIMAL_EBX) != INTEL_PT_MINIMAL_EBX) ||
6484 ((ecx_0 & INTEL_PT_MINIMAL_ECX) != INTEL_PT_MINIMAL_ECX) ||
6485 ((eax_1 & INTEL_PT_MTC_BITMAP) != INTEL_PT_MTC_BITMAP) ||
6486 ((eax_1 & INTEL_PT_ADDR_RANGES_NUM_MASK) <
6487 INTEL_PT_ADDR_RANGES_NUM) ||
6488 ((ebx_1 & (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) !=
c078ca96 6489 (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) ||
d1615ea5
LK
6490 ((ecx_0 & CPUID_14_0_ECX_LIP) !=
6491 (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP))) {
e37a5c7f
CP
6492 /*
6493 * Processor Trace capabilities aren't configurable, so if the
6494 * host can't emulate the capabilities we report on
6495 * cpu_x86_cpuid(), intel-pt can't be enabled on the current host.
6496 */
245edd0c 6497 mark_unavailable_features(cpu, FEAT_7_0_EBX, CPUID_7_0_EBX_INTEL_PT, prefix);
e37a5c7f
CP
6498 }
6499 }
b8d834a0
EH
6500}
6501
08856771
VK
6502static void x86_cpu_hyperv_realize(X86CPU *cpu)
6503{
6504 size_t len;
6505
6506 /* Hyper-V vendor id */
6507 if (!cpu->hyperv_vendor) {
4519259a
VK
6508 object_property_set_str(OBJECT(cpu), "hv-vendor-id", "Microsoft Hv",
6509 &error_abort);
6510 }
6511 len = strlen(cpu->hyperv_vendor);
6512 if (len > 12) {
6513 warn_report("hv-vendor-id truncated to 12 characters");
6514 len = 12;
08856771 6515 }
4519259a
VK
6516 memset(cpu->hyperv_vendor_id, 0, 12);
6517 memcpy(cpu->hyperv_vendor_id, cpu->hyperv_vendor, len);
735db465
VK
6518
6519 /* 'Hv#1' interface identification*/
6520 cpu->hyperv_interface_id[0] = 0x31237648;
6521 cpu->hyperv_interface_id[1] = 0;
6522 cpu->hyperv_interface_id[2] = 0;
6523 cpu->hyperv_interface_id[3] = 0;
fb7e31aa 6524
23eb5d03
VK
6525 /* Hypervisor implementation limits */
6526 cpu->hyperv_limits[0] = 64;
6527 cpu->hyperv_limits[1] = 0;
6528 cpu->hyperv_limits[2] = 0;
08856771
VK
6529}
6530
41f3d4d6
EH
6531static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
6532{
6533 CPUState *cs = CPU(dev);
6534 X86CPU *cpu = X86_CPU(dev);
6535 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
6536 CPUX86State *env = &cpu->env;
6537 Error *local_err = NULL;
6538 static bool ht_warned;
f06d8a18 6539 unsigned requested_lbr_fmt;
41f3d4d6 6540
41f3d4d6
EH
6541 if (cpu->apic_id == UNASSIGNED_APIC_ID) {
6542 error_setg(errp, "apic-id property was not initialized properly");
6543 return;
6544 }
6545
662175b9
CF
6546 /*
6547 * Process Hyper-V enlightenments.
6548 * Note: this currently has to happen before the expansion of CPU features.
6549 */
6550 x86_cpu_hyperv_realize(cpu);
6551
b8d834a0 6552 x86_cpu_expand_features(cpu, &local_err);
41f3d4d6
EH
6553 if (local_err) {
6554 goto out;
6555 }
6556
f06d8a18
YW
6557 /*
6558 * Override env->features[FEAT_PERF_CAPABILITIES].LBR_FMT
6559 * with user-provided setting.
6560 */
6561 if (cpu->lbr_fmt != ~PERF_CAP_LBR_FMT) {
6562 if ((cpu->lbr_fmt & PERF_CAP_LBR_FMT) != cpu->lbr_fmt) {
6563 error_setg(errp, "invalid lbr-fmt");
6564 return;
6565 }
6566 env->features[FEAT_PERF_CAPABILITIES] &= ~PERF_CAP_LBR_FMT;
6567 env->features[FEAT_PERF_CAPABILITIES] |= cpu->lbr_fmt;
6568 }
6569
6570 /*
6571 * vPMU LBR is supported when 1) KVM is enabled 2) Option pmu=on and
6572 * 3)vPMU LBR format matches that of host setting.
6573 */
6574 requested_lbr_fmt =
6575 env->features[FEAT_PERF_CAPABILITIES] & PERF_CAP_LBR_FMT;
6576 if (requested_lbr_fmt && kvm_enabled()) {
6577 uint64_t host_perf_cap =
6578 x86_cpu_get_supported_feature_word(FEAT_PERF_CAPABILITIES, false);
6579 unsigned host_lbr_fmt = host_perf_cap & PERF_CAP_LBR_FMT;
6580
6581 if (!cpu->enable_pmu) {
6582 error_setg(errp, "vPMU: LBR is unsupported without pmu=on");
6583 return;
6584 }
6585 if (requested_lbr_fmt != host_lbr_fmt) {
6586 error_setg(errp, "vPMU: the lbr-fmt value (0x%x) does not match "
6587 "the host value (0x%x).",
6588 requested_lbr_fmt, host_lbr_fmt);
6589 return;
6590 }
6591 }
6592
245edd0c
PB
6593 x86_cpu_filter_features(cpu, cpu->check_cpuid || cpu->enforce_cpuid);
6594
6595 if (cpu->enforce_cpuid && x86_cpu_have_filtered_features(cpu)) {
6596 error_setg(&local_err,
6597 accel_uses_host_cpuid() ?
6598 "Host doesn't support requested features" :
6599 "TCG doesn't support requested features");
6600 goto out;
9997cf7b
EH
6601 }
6602
9b15cd9e
IM
6603 /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on
6604 * CPUID[1].EDX.
6605 */
e48638fd 6606 if (IS_AMD_CPU(env)) {
0514ef2f
EH
6607 env->features[FEAT_8000_0001_EDX] &= ~CPUID_EXT2_AMD_ALIASES;
6608 env->features[FEAT_8000_0001_EDX] |= (env->features[FEAT_1_EDX]
9b15cd9e
IM
6609 & CPUID_EXT2_AMD_ALIASES);
6610 }
6611
db888065
SC
6612 x86_cpu_set_sgxlepubkeyhash(env);
6613
662175b9
CF
6614 /*
6615 * note: the call to the framework needs to happen after feature expansion,
6616 * but before the checks/modifications to ucode_rev, mwait, phys_bits.
6617 * These may be set by the accel-specific code,
6618 * and the results are subsequently checked / assumed in this function.
6619 */
6620 cpu_exec_realizefn(cs, &local_err);
6621 if (local_err != NULL) {
6622 error_propagate(errp, local_err);
6623 return;
6624 }
6625
6626 if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
6627 g_autofree char *name = x86_cpu_class_get_model_name(xcc);
6628 error_setg(&local_err, "CPU model '%s' requires KVM or HVF", name);
6629 goto out;
6630 }
6631
6632 if (cpu->ucode_rev == 0) {
6633 /*
6634 * The default is the same as KVM's. Note that this check
6635 * needs to happen after the evenual setting of ucode_rev in
6636 * accel-specific code in cpu_exec_realizefn.
6637 */
6638 if (IS_AMD_CPU(env)) {
6639 cpu->ucode_rev = 0x01000065;
6640 } else {
6641 cpu->ucode_rev = 0x100000000ULL;
6642 }
6643 }
6644
6645 /*
6646 * mwait extended info: needed for Core compatibility
6647 * We always wake on interrupt even if host does not have the capability.
6648 *
6649 * requires the accel-specific code in cpu_exec_realizefn to
6650 * have already acquired the CPUID data into cpu->mwait.
6651 */
6652 cpu->mwait.ecx |= CPUID_MWAIT_EMX | CPUID_MWAIT_IBE;
6653
11f6fee5
DDAG
6654 /* For 64bit systems think about the number of physical bits to present.
6655 * ideally this should be the same as the host; anything other than matching
6656 * the host can cause incorrect guest behaviour.
6657 * QEMU used to pick the magic value of 40 bits that corresponds to
6658 * consumer AMD devices but nothing else.
662175b9
CF
6659 *
6660 * Note that this code assumes features expansion has already been done
6661 * (as it checks for CPUID_EXT2_LM), and also assumes that potential
6662 * phys_bits adjustments to match the host have been already done in
6663 * accel-specific code in cpu_exec_realizefn.
11f6fee5 6664 */
af45907a 6665 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
b8184135
PB
6666 if (cpu->phys_bits &&
6667 (cpu->phys_bits > TARGET_PHYS_ADDR_SPACE_BITS ||
6668 cpu->phys_bits < 32)) {
6669 error_setg(errp, "phys-bits should be between 32 and %u "
6670 " (but is %u)",
6671 TARGET_PHYS_ADDR_SPACE_BITS, cpu->phys_bits);
6672 return;
af45907a 6673 }
f5cc5a5c
CF
6674 /*
6675 * 0 means it was not explicitly set by the user (or by machine
6676 * compat_props or by the host code in host-cpu.c).
6677 * In this case, the default is the value used by TCG (40).
11f6fee5
DDAG
6678 */
6679 if (cpu->phys_bits == 0) {
6680 cpu->phys_bits = TCG_PHYS_ADDR_BITS;
6681 }
af45907a
DDAG
6682 } else {
6683 /* For 32 bit systems don't use the user set value, but keep
6684 * phys_bits consistent with what we tell the guest.
6685 */
6686 if (cpu->phys_bits != 0) {
6687 error_setg(errp, "phys-bits is not user-configurable in 32 bit");
6688 return;
6689 }
fefb41bf 6690
af45907a
DDAG
6691 if (env->features[FEAT_1_EDX] & CPUID_PSE36) {
6692 cpu->phys_bits = 36;
6693 } else {
6694 cpu->phys_bits = 32;
6695 }
6696 }
a9f27ea9
EH
6697
6698 /* Cache information initialization */
6699 if (!cpu->legacy_cache) {
dcafd1ef 6700 if (!xcc->model || !xcc->model->cpudef->cache_info) {
88703ce2 6701 g_autofree char *name = x86_cpu_class_get_model_name(xcc);
a9f27ea9
EH
6702 error_setg(errp,
6703 "CPU model '%s' doesn't support legacy-cache=off", name);
a9f27ea9
EH
6704 return;
6705 }
6706 env->cache_info_cpuid2 = env->cache_info_cpuid4 = env->cache_info_amd =
dcafd1ef 6707 *xcc->model->cpudef->cache_info;
a9f27ea9
EH
6708 } else {
6709 /* Build legacy cache information */
6710 env->cache_info_cpuid2.l1d_cache = &legacy_l1d_cache;
6711 env->cache_info_cpuid2.l1i_cache = &legacy_l1i_cache;
6712 env->cache_info_cpuid2.l2_cache = &legacy_l2_cache_cpuid2;
6713 env->cache_info_cpuid2.l3_cache = &legacy_l3_cache;
6714
6715 env->cache_info_cpuid4.l1d_cache = &legacy_l1d_cache;
6716 env->cache_info_cpuid4.l1i_cache = &legacy_l1i_cache;
6717 env->cache_info_cpuid4.l2_cache = &legacy_l2_cache;
6718 env->cache_info_cpuid4.l3_cache = &legacy_l3_cache;
6719
6720 env->cache_info_amd.l1d_cache = &legacy_l1d_cache_amd;
6721 env->cache_info_amd.l1i_cache = &legacy_l1i_cache_amd;
6722 env->cache_info_amd.l2_cache = &legacy_l2_cache_amd;
6723 env->cache_info_amd.l3_cache = &legacy_l3_cache;
6724 }
6725
65dee380 6726#ifndef CONFIG_USER_ONLY
0e11fc69 6727 MachineState *ms = MACHINE(qdev_get_machine());
65dee380 6728 qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
bdeec802 6729
0e11fc69 6730 if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || ms->smp.cpus > 1) {
d3c64d6a 6731 x86_cpu_apic_create(cpu, &local_err);
2b6f294c 6732 if (local_err != NULL) {
4dc1f449 6733 goto out;
bdeec802
IM
6734 }
6735 }
65dee380
IM
6736#endif
6737
7a059953 6738 mce_init(cpu);
2001d0cd 6739
14a10fc3 6740 qemu_init_vcpu(cs);
d3c64d6a 6741
6b2942f9
BM
6742 /*
6743 * Most Intel and certain AMD CPUs support hyperthreading. Even though QEMU
6744 * fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
6745 * based on inputs (sockets,cores,threads), it is still better to give
e48638fd
WH
6746 * users a warning.
6747 *
6748 * NOTE: the following code has to follow qemu_init_vcpu(). Otherwise
6749 * cs->nr_threads hasn't be populated yet and the checking is incorrect.
6750 */
0765691e
MA
6751 if (IS_AMD_CPU(env) &&
6752 !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
6753 cs->nr_threads > 1 && !ht_warned) {
6754 warn_report("This family of AMD CPU doesn't support "
6755 "hyperthreading(%d)",
6756 cs->nr_threads);
6757 error_printf("Please configure -smp options properly"
6758 " or try enabling topoext feature.\n");
6759 ht_warned = true;
e48638fd
WH
6760 }
6761
79f1a68a 6762#ifndef CONFIG_USER_ONLY
d3c64d6a
IM
6763 x86_cpu_apic_realize(cpu, &local_err);
6764 if (local_err != NULL) {
6765 goto out;
6766 }
79f1a68a 6767#endif /* !CONFIG_USER_ONLY */
14a10fc3 6768 cpu_reset(cs);
2b6f294c 6769
4dc1f449 6770 xcc->parent_realize(dev, &local_err);
2001d0cd 6771
4dc1f449
IM
6772out:
6773 if (local_err != NULL) {
6774 error_propagate(errp, local_err);
6775 return;
6776 }
7a059953
AF
6777}
6778
b69c3c21 6779static void x86_cpu_unrealizefn(DeviceState *dev)
c884776e
IM
6780{
6781 X86CPU *cpu = X86_CPU(dev);
7bbc124e 6782 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
c884776e
IM
6783
6784#ifndef CONFIG_USER_ONLY
6785 cpu_remove_sync(CPU(dev));
6786 qemu_unregister_reset(x86_cpu_machine_reset_cb, dev);
6787#endif
6788
6789 if (cpu->apic_state) {
6790 object_unparent(OBJECT(cpu->apic_state));
6791 cpu->apic_state = NULL;
6792 }
7bbc124e 6793
b69c3c21 6794 xcc->parent_unrealize(dev);
c884776e
IM
6795}
6796
38e5c119 6797typedef struct BitProperty {
a7b0ffac 6798 FeatureWord w;
ede146c2 6799 uint64_t mask;
38e5c119
EH
6800} BitProperty;
6801
d7bce999
EB
6802static void x86_cpu_get_bit_prop(Object *obj, Visitor *v, const char *name,
6803 void *opaque, Error **errp)
38e5c119 6804{
a7b0ffac 6805 X86CPU *cpu = X86_CPU(obj);
38e5c119 6806 BitProperty *fp = opaque;
ede146c2 6807 uint64_t f = cpu->env.features[fp->w];
a7b0ffac 6808 bool value = (f & fp->mask) == fp->mask;
51e72bc1 6809 visit_type_bool(v, name, &value, errp);
38e5c119
EH
6810}
6811
d7bce999
EB
6812static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
6813 void *opaque, Error **errp)
38e5c119
EH
6814{
6815 DeviceState *dev = DEVICE(obj);
a7b0ffac 6816 X86CPU *cpu = X86_CPU(obj);
38e5c119 6817 BitProperty *fp = opaque;
38e5c119
EH
6818 bool value;
6819
6820 if (dev->realized) {
6821 qdev_prop_set_after_realize(dev, name, errp);
6822 return;
6823 }
6824
668f62ec 6825 if (!visit_type_bool(v, name, &value, errp)) {
38e5c119
EH
6826 return;
6827 }
6828
6829 if (value) {
a7b0ffac 6830 cpu->env.features[fp->w] |= fp->mask;
38e5c119 6831 } else {
a7b0ffac 6832 cpu->env.features[fp->w] &= ~fp->mask;
38e5c119 6833 }
d4a606b3 6834 cpu->env.user_features[fp->w] |= fp->mask;
38e5c119
EH
6835}
6836
38e5c119
EH
6837/* Register a boolean property to get/set a single bit in a uint32_t field.
6838 *
6839 * The same property name can be registered multiple times to make it affect
6840 * multiple bits in the same FeatureWord. In that case, the getter will return
6841 * true only if all bits are set.
6842 */
f5730c69 6843static void x86_cpu_register_bit_prop(X86CPUClass *xcc,
38e5c119 6844 const char *prop_name,
a7b0ffac 6845 FeatureWord w,
38e5c119
EH
6846 int bitnr)
6847{
f5730c69 6848 ObjectClass *oc = OBJECT_CLASS(xcc);
38e5c119
EH
6849 BitProperty *fp;
6850 ObjectProperty *op;
ede146c2 6851 uint64_t mask = (1ULL << bitnr);
38e5c119 6852
f5730c69 6853 op = object_class_property_find(oc, prop_name);
38e5c119
EH
6854 if (op) {
6855 fp = op->opaque;
a7b0ffac 6856 assert(fp->w == w);
38e5c119
EH
6857 fp->mask |= mask;
6858 } else {
6859 fp = g_new0(BitProperty, 1);
a7b0ffac 6860 fp->w = w;
38e5c119 6861 fp->mask = mask;
f5730c69
EH
6862 object_class_property_add(oc, prop_name, "bool",
6863 x86_cpu_get_bit_prop,
6864 x86_cpu_set_bit_prop,
6865 NULL, fp);
38e5c119
EH
6866 }
6867}
6868
f5730c69 6869static void x86_cpu_register_feature_bit_props(X86CPUClass *xcc,
38e5c119
EH
6870 FeatureWord w,
6871 int bitnr)
6872{
38e5c119 6873 FeatureWordInfo *fi = &feature_word_info[w];
16d2fcaa 6874 const char *name = fi->feat_names[bitnr];
38e5c119 6875
16d2fcaa 6876 if (!name) {
38e5c119
EH
6877 return;
6878 }
6879
fc7dfd20
EH
6880 /* Property names should use "-" instead of "_".
6881 * Old names containing underscores are registered as aliases
6882 * using object_property_add_alias()
6883 */
16d2fcaa
EH
6884 assert(!strchr(name, '_'));
6885 /* aliases don't use "|" delimiters anymore, they are registered
6886 * manually using object_property_add_alias() */
6887 assert(!strchr(name, '|'));
f5730c69 6888 x86_cpu_register_bit_prop(xcc, name, w, bitnr);
38e5c119
EH
6889}
6890
4db4385a
CF
6891static void x86_cpu_post_initfn(Object *obj)
6892{
6893 accel_cpu_instance_init(CPU(obj));
6894}
6895
de024815
AF
6896static void x86_cpu_initfn(Object *obj)
6897{
6898 X86CPU *cpu = X86_CPU(obj);
d940ee9b 6899 X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
de024815
AF
6900 CPUX86State *env = &cpu->env;
6901
c26ae610 6902 env->nr_dies = 1;
7506ed90 6903 cpu_set_cpustate_pointers(cpu);
71ad61d3 6904
8e8aba50
EH
6905 object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo",
6906 x86_cpu_get_feature_words,
d2623129 6907 NULL, NULL, (void *)env->features);
7e5292b5
EH
6908 object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo",
6909 x86_cpu_get_feature_words,
d2623129 6910 NULL, NULL, (void *)cpu->filtered_features);
d187e08d 6911
d2623129
MA
6912 object_property_add_alias(obj, "sse3", obj, "pni");
6913 object_property_add_alias(obj, "pclmuldq", obj, "pclmulqdq");
6914 object_property_add_alias(obj, "sse4-1", obj, "sse4.1");
6915 object_property_add_alias(obj, "sse4-2", obj, "sse4.2");
6916 object_property_add_alias(obj, "xd", obj, "nx");
6917 object_property_add_alias(obj, "ffxsr", obj, "fxsr-opt");
6918 object_property_add_alias(obj, "i64", obj, "lm");
6919
6920 object_property_add_alias(obj, "ds_cpl", obj, "ds-cpl");
6921 object_property_add_alias(obj, "tsc_adjust", obj, "tsc-adjust");
6922 object_property_add_alias(obj, "fxsr_opt", obj, "fxsr-opt");
6923 object_property_add_alias(obj, "lahf_lm", obj, "lahf-lm");
6924 object_property_add_alias(obj, "cmp_legacy", obj, "cmp-legacy");
6925 object_property_add_alias(obj, "nodeid_msr", obj, "nodeid-msr");
6926 object_property_add_alias(obj, "perfctr_core", obj, "perfctr-core");
6927 object_property_add_alias(obj, "perfctr_nb", obj, "perfctr-nb");
6928 object_property_add_alias(obj, "kvm_nopiodelay", obj, "kvm-nopiodelay");
6929 object_property_add_alias(obj, "kvm_mmu", obj, "kvm-mmu");
6930 object_property_add_alias(obj, "kvm_asyncpf", obj, "kvm-asyncpf");
db5daafa 6931 object_property_add_alias(obj, "kvm_asyncpf_int", obj, "kvm-asyncpf-int");
d2623129
MA
6932 object_property_add_alias(obj, "kvm_steal_time", obj, "kvm-steal-time");
6933 object_property_add_alias(obj, "kvm_pv_eoi", obj, "kvm-pv-eoi");
6934 object_property_add_alias(obj, "kvm_pv_unhalt", obj, "kvm-pv-unhalt");
6935 object_property_add_alias(obj, "kvm_poll_control", obj, "kvm-poll-control");
6936 object_property_add_alias(obj, "svm_lock", obj, "svm-lock");
6937 object_property_add_alias(obj, "nrip_save", obj, "nrip-save");
6938 object_property_add_alias(obj, "tsc_scale", obj, "tsc-scale");
6939 object_property_add_alias(obj, "vmcb_clean", obj, "vmcb-clean");
6940 object_property_add_alias(obj, "pause_filter", obj, "pause-filter");
6941 object_property_add_alias(obj, "sse4_1", obj, "sse4.1");
6942 object_property_add_alias(obj, "sse4_2", obj, "sse4.2");
54b8dc7c 6943
e1f9a8e8 6944 object_property_add_alias(obj, "hv-apicv", obj, "hv-avic");
f06d8a18
YW
6945 cpu->lbr_fmt = ~PERF_CAP_LBR_FMT;
6946 object_property_add_alias(obj, "lbr_fmt", obj, "lbr-fmt");
e1f9a8e8 6947
dcafd1ef 6948 if (xcc->model) {
49e2fa85 6949 x86_cpu_load_model(cpu, xcc->model);
0bacd8b3 6950 }
de024815
AF
6951}
6952
997395d3
IM
6953static int64_t x86_cpu_get_arch_id(CPUState *cs)
6954{
6955 X86CPU *cpu = X86_CPU(cs);
997395d3 6956
7e72a45c 6957 return cpu->apic_id;
997395d3
IM
6958}
6959
6bc0d6a0 6960#if !defined(CONFIG_USER_ONLY)
444d5590
AF
6961static bool x86_cpu_get_paging_enabled(const CPUState *cs)
6962{
6963 X86CPU *cpu = X86_CPU(cs);
6964
6965 return cpu->env.cr[0] & CR0_PG_MASK;
6966}
6bc0d6a0 6967#endif /* !CONFIG_USER_ONLY */
444d5590 6968
f45748f1
AF
6969static void x86_cpu_set_pc(CPUState *cs, vaddr value)
6970{
6971 X86CPU *cpu = X86_CPU(cs);
6972
6973 cpu->env.eip = value;
6974}
6975
e4fdf9df
RH
6976static vaddr x86_cpu_get_pc(CPUState *cs)
6977{
6978 X86CPU *cpu = X86_CPU(cs);
6979
6980 /* Match cpu_get_tb_cpu_state. */
6981 return cpu->env.eip + cpu->env.segs[R_CS].base;
6982}
6983
92d5f1a4 6984int x86_cpu_pending_interrupt(CPUState *cs, int interrupt_request)
8c2e1b00
AF
6985{
6986 X86CPU *cpu = X86_CPU(cs);
6987 CPUX86State *env = &cpu->env;
6988
92d5f1a4
PB
6989#if !defined(CONFIG_USER_ONLY)
6990 if (interrupt_request & CPU_INTERRUPT_POLL) {
6991 return CPU_INTERRUPT_POLL;
6992 }
6993#endif
6994 if (interrupt_request & CPU_INTERRUPT_SIPI) {
6995 return CPU_INTERRUPT_SIPI;
6996 }
6997
6998 if (env->hflags2 & HF2_GIF_MASK) {
6999 if ((interrupt_request & CPU_INTERRUPT_SMI) &&
7000 !(env->hflags & HF_SMM_MASK)) {
7001 return CPU_INTERRUPT_SMI;
7002 } else if ((interrupt_request & CPU_INTERRUPT_NMI) &&
7003 !(env->hflags2 & HF2_NMI_MASK)) {
7004 return CPU_INTERRUPT_NMI;
7005 } else if (interrupt_request & CPU_INTERRUPT_MCE) {
7006 return CPU_INTERRUPT_MCE;
7007 } else if ((interrupt_request & CPU_INTERRUPT_HARD) &&
7008 (((env->hflags2 & HF2_VINTR_MASK) &&
7009 (env->hflags2 & HF2_HIF_MASK)) ||
7010 (!(env->hflags2 & HF2_VINTR_MASK) &&
7011 (env->eflags & IF_MASK &&
7012 !(env->hflags & HF_INHIBIT_IRQ_MASK))))) {
7013 return CPU_INTERRUPT_HARD;
7014#if !defined(CONFIG_USER_ONLY)
b67e2796
LL
7015 } else if (env->hflags2 & HF2_VGIF_MASK) {
7016 if((interrupt_request & CPU_INTERRUPT_VIRQ) &&
92d5f1a4
PB
7017 (env->eflags & IF_MASK) &&
7018 !(env->hflags & HF_INHIBIT_IRQ_MASK)) {
b67e2796
LL
7019 return CPU_INTERRUPT_VIRQ;
7020 }
92d5f1a4
PB
7021#endif
7022 }
7023 }
7024
7025 return 0;
7026}
7027
7028static bool x86_cpu_has_work(CPUState *cs)
7029{
7030 return x86_cpu_pending_interrupt(cs, cs->interrupt_request) != 0;
8c2e1b00
AF
7031}
7032
f50f3dd5
RH
7033static void x86_disas_set_info(CPUState *cs, disassemble_info *info)
7034{
7035 X86CPU *cpu = X86_CPU(cs);
7036 CPUX86State *env = &cpu->env;
7037
7038 info->mach = (env->hflags & HF_CS64_MASK ? bfd_mach_x86_64
7039 : env->hflags & HF_CS32_MASK ? bfd_mach_i386_i386
7040 : bfd_mach_i386_i8086);
b666d2a4
RH
7041
7042 info->cap_arch = CS_ARCH_X86;
7043 info->cap_mode = (env->hflags & HF_CS64_MASK ? CS_MODE_64
7044 : env->hflags & HF_CS32_MASK ? CS_MODE_32
7045 : CS_MODE_16);
15fa1a0a
RH
7046 info->cap_insn_unit = 1;
7047 info->cap_insn_split = 8;
f50f3dd5
RH
7048}
7049
35b1b927
TW
7050void x86_update_hflags(CPUX86State *env)
7051{
7052 uint32_t hflags;
7053#define HFLAG_COPY_MASK \
7054 ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
7055 HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
7056 HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
7057 HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK)
7058
7059 hflags = env->hflags & HFLAG_COPY_MASK;
7060 hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
7061 hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
7062 hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
7063 (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
7064 hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
7065
7066 if (env->cr[4] & CR4_OSFXSR_MASK) {
7067 hflags |= HF_OSFXSR_MASK;
7068 }
7069
7070 if (env->efer & MSR_EFER_LMA) {
7071 hflags |= HF_LMA_MASK;
7072 }
7073
7074 if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
7075 hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
7076 } else {
7077 hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
7078 (DESC_B_SHIFT - HF_CS32_SHIFT);
7079 hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
7080 (DESC_B_SHIFT - HF_SS32_SHIFT);
7081 if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) ||
7082 !(hflags & HF_CS32_MASK)) {
7083 hflags |= HF_ADDSEG_MASK;
7084 } else {
7085 hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base |
7086 env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
7087 }
7088 }
7089 env->hflags = hflags;
7090}
7091
9337e3b6 7092static Property x86_cpu_properties[] = {
2da00e31
IM
7093#ifdef CONFIG_USER_ONLY
7094 /* apic_id = 0 by default for *-user, see commit 9886e834 */
7095 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, 0),
d89c2b8b
IM
7096 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, 0),
7097 DEFINE_PROP_INT32("core-id", X86CPU, core_id, 0),
176d2cda 7098 DEFINE_PROP_INT32("die-id", X86CPU, die_id, 0),
d89c2b8b 7099 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, 0),
2da00e31
IM
7100#else
7101 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, UNASSIGNED_APIC_ID),
d89c2b8b
IM
7102 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, -1),
7103 DEFINE_PROP_INT32("core-id", X86CPU, core_id, -1),
176d2cda 7104 DEFINE_PROP_INT32("die-id", X86CPU, die_id, -1),
d89c2b8b 7105 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, -1),
2da00e31 7106#endif
15f8b142 7107 DEFINE_PROP_INT32("node-id", X86CPU, node_id, CPU_UNSET_NUMA_NODE_ID),
9337e3b6 7108 DEFINE_PROP_BOOL("pmu", X86CPU, enable_pmu, false),
f06d8a18 7109 DEFINE_PROP_UINT64_CHECKMASK("lbr-fmt", X86CPU, lbr_fmt, PERF_CAP_LBR_FMT),
2d384d7c 7110
915aee93 7111 DEFINE_PROP_UINT32("hv-spinlocks", X86CPU, hyperv_spinlock_attempts,
f701c082 7112 HYPERV_SPINLOCK_NEVER_NOTIFY),
2d384d7c
VK
7113 DEFINE_PROP_BIT64("hv-relaxed", X86CPU, hyperv_features,
7114 HYPERV_FEAT_RELAXED, 0),
7115 DEFINE_PROP_BIT64("hv-vapic", X86CPU, hyperv_features,
7116 HYPERV_FEAT_VAPIC, 0),
7117 DEFINE_PROP_BIT64("hv-time", X86CPU, hyperv_features,
7118 HYPERV_FEAT_TIME, 0),
7119 DEFINE_PROP_BIT64("hv-crash", X86CPU, hyperv_features,
7120 HYPERV_FEAT_CRASH, 0),
7121 DEFINE_PROP_BIT64("hv-reset", X86CPU, hyperv_features,
7122 HYPERV_FEAT_RESET, 0),
7123 DEFINE_PROP_BIT64("hv-vpindex", X86CPU, hyperv_features,
7124 HYPERV_FEAT_VPINDEX, 0),
7125 DEFINE_PROP_BIT64("hv-runtime", X86CPU, hyperv_features,
7126 HYPERV_FEAT_RUNTIME, 0),
7127 DEFINE_PROP_BIT64("hv-synic", X86CPU, hyperv_features,
7128 HYPERV_FEAT_SYNIC, 0),
7129 DEFINE_PROP_BIT64("hv-stimer", X86CPU, hyperv_features,
7130 HYPERV_FEAT_STIMER, 0),
7131 DEFINE_PROP_BIT64("hv-frequencies", X86CPU, hyperv_features,
7132 HYPERV_FEAT_FREQUENCIES, 0),
7133 DEFINE_PROP_BIT64("hv-reenlightenment", X86CPU, hyperv_features,
7134 HYPERV_FEAT_REENLIGHTENMENT, 0),
7135 DEFINE_PROP_BIT64("hv-tlbflush", X86CPU, hyperv_features,
7136 HYPERV_FEAT_TLBFLUSH, 0),
7137 DEFINE_PROP_BIT64("hv-evmcs", X86CPU, hyperv_features,
7138 HYPERV_FEAT_EVMCS, 0),
7139 DEFINE_PROP_BIT64("hv-ipi", X86CPU, hyperv_features,
7140 HYPERV_FEAT_IPI, 0),
128531d9
VK
7141 DEFINE_PROP_BIT64("hv-stimer-direct", X86CPU, hyperv_features,
7142 HYPERV_FEAT_STIMER_DIRECT, 0),
e1f9a8e8
VK
7143 DEFINE_PROP_BIT64("hv-avic", X86CPU, hyperv_features,
7144 HYPERV_FEAT_AVIC, 0),
869840d2
VK
7145 DEFINE_PROP_BIT64("hv-emsr-bitmap", X86CPU, hyperv_features,
7146 HYPERV_FEAT_MSR_BITMAP, 0),
9411e8b6
VK
7147 DEFINE_PROP_BIT64("hv-xmm-input", X86CPU, hyperv_features,
7148 HYPERV_FEAT_XMM_INPUT, 0),
aa6bb5fa
VK
7149 DEFINE_PROP_BIT64("hv-tlbflush-ext", X86CPU, hyperv_features,
7150 HYPERV_FEAT_TLBFLUSH_EXT, 0),
3aae0854
VK
7151 DEFINE_PROP_BIT64("hv-tlbflush-direct", X86CPU, hyperv_features,
7152 HYPERV_FEAT_TLBFLUSH_DIRECT, 0),
30d6ff66
VK
7153 DEFINE_PROP_ON_OFF_AUTO("hv-no-nonarch-coresharing", X86CPU,
7154 hyperv_no_nonarch_cs, ON_OFF_AUTO_OFF),
73d24074
JD
7155 DEFINE_PROP_BIT64("hv-syndbg", X86CPU, hyperv_features,
7156 HYPERV_FEAT_SYNDBG, 0),
e48ddcc6 7157 DEFINE_PROP_BOOL("hv-passthrough", X86CPU, hyperv_passthrough, false),
70367f09 7158 DEFINE_PROP_BOOL("hv-enforce-cpuid", X86CPU, hyperv_enforce_cpuid, false),
2d384d7c 7159
af7228b8
VK
7160 /* WS2008R2 identify by default */
7161 DEFINE_PROP_UINT32("hv-version-id-build", X86CPU, hyperv_ver_id_build,
f701ecec 7162 0x3839),
af7228b8 7163 DEFINE_PROP_UINT16("hv-version-id-major", X86CPU, hyperv_ver_id_major,
f701ecec 7164 0x000A),
af7228b8 7165 DEFINE_PROP_UINT16("hv-version-id-minor", X86CPU, hyperv_ver_id_minor,
f701ecec 7166 0x0000),
af7228b8
VK
7167 DEFINE_PROP_UINT32("hv-version-id-spack", X86CPU, hyperv_ver_id_sp, 0),
7168 DEFINE_PROP_UINT8("hv-version-id-sbranch", X86CPU, hyperv_ver_id_sb, 0),
7169 DEFINE_PROP_UINT32("hv-version-id-snumber", X86CPU, hyperv_ver_id_sn, 0),
7170
15e41345 7171 DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true),
912ffc47 7172 DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
dac1deae 7173 DEFINE_PROP_BOOL("x-force-features", X86CPU, force_features, false),
f522d2ac 7174 DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true),
af45907a 7175 DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 0),
11f6fee5 7176 DEFINE_PROP_BOOL("host-phys-bits", X86CPU, host_phys_bits, false),
258fe08b 7177 DEFINE_PROP_UINT8("host-phys-bits-limit", X86CPU, host_phys_bits_limit, 0),
fcc35e7c 7178 DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true),
80db491d
JL
7179 DEFINE_PROP_UINT32("level-func7", X86CPU, env.cpuid_level_func7,
7180 UINT32_MAX),
c39c0edf
EH
7181 DEFINE_PROP_UINT32("level", X86CPU, env.cpuid_level, UINT32_MAX),
7182 DEFINE_PROP_UINT32("xlevel", X86CPU, env.cpuid_xlevel, UINT32_MAX),
7183 DEFINE_PROP_UINT32("xlevel2", X86CPU, env.cpuid_xlevel2, UINT32_MAX),
7184 DEFINE_PROP_UINT32("min-level", X86CPU, env.cpuid_min_level, 0),
7185 DEFINE_PROP_UINT32("min-xlevel", X86CPU, env.cpuid_min_xlevel, 0),
7186 DEFINE_PROP_UINT32("min-xlevel2", X86CPU, env.cpuid_min_xlevel2, 0),
4e45aff3 7187 DEFINE_PROP_UINT64("ucode-rev", X86CPU, ucode_rev, 0),
c39c0edf 7188 DEFINE_PROP_BOOL("full-cpuid-auto-level", X86CPU, full_cpuid_auto_level, true),
08856771 7189 DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor),
5232d00a 7190 DEFINE_PROP_BOOL("cpuid-0xb", X86CPU, enable_cpuid_0xb, true),
a7a0da84 7191 DEFINE_PROP_BOOL("x-vendor-cpuid-only", X86CPU, vendor_cpuid_only, true),
87f8b626 7192 DEFINE_PROP_BOOL("lmce", X86CPU, enable_lmce, false),
14c985cf 7193 DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true),
fc3a1fd7
DDAG
7194 DEFINE_PROP_BOOL("kvm-no-smi-migration", X86CPU, kvm_no_smi_migration,
7195 false),
988f7b8b
VK
7196 DEFINE_PROP_BOOL("kvm-pv-enforce-cpuid", X86CPU, kvm_pv_enforce_cpuid,
7197 false),
0b564e6f 7198 DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true),
1ce36bfe 7199 DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true),
990e0be2
PB
7200 DEFINE_PROP_BOOL("x-migrate-smi-count", X86CPU, migrate_smi_count,
7201 true),
ab8f992e 7202 /*
a9f27ea9
EH
7203 * lecacy_cache defaults to true unless the CPU model provides its
7204 * own cache information (see x86_cpu_load_def()).
ab8f992e 7205 */
a9f27ea9 7206 DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, true),
6c69dfb6
GA
7207
7208 /*
7209 * From "Requirements for Implementing the Microsoft
7210 * Hypervisor Interface":
7211 * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs
7212 *
7213 * "Starting with Windows Server 2012 and Windows 8, if
7214 * CPUID.40000005.EAX contains a value of -1, Windows assumes that
7215 * the hypervisor imposes no specific limit to the number of VPs.
7216 * In this case, Windows Server 2012 guest VMs may use more than
7217 * 64 VPs, up to the maximum supported number of processors applicable
7218 * to the specific Windows version being used."
7219 */
7220 DEFINE_PROP_INT32("x-hv-max-vps", X86CPU, hv_max_vps, -1),
9b4cf107
RK
7221 DEFINE_PROP_BOOL("x-hv-synic-kvm-only", X86CPU, hyperv_synic_kvm_only,
7222 false),
f24c3a79
LK
7223 DEFINE_PROP_BOOL("x-intel-pt-auto-level", X86CPU, intel_pt_auto_level,
7224 true),
9337e3b6
EH
7225 DEFINE_PROP_END_OF_LIST()
7226};
7227
8b80bd28
PMD
7228#ifndef CONFIG_USER_ONLY
7229#include "hw/core/sysemu-cpu-ops.h"
7230
7231static const struct SysemuCPUOps i386_sysemu_ops = {
2b60b62e 7232 .get_memory_mapping = x86_cpu_get_memory_mapping,
6bc0d6a0 7233 .get_paging_enabled = x86_cpu_get_paging_enabled,
08928c6d 7234 .get_phys_page_attrs_debug = x86_cpu_get_phys_page_attrs_debug,
faf39e82 7235 .asidx_from_attrs = x86_asidx_from_attrs,
83ec01b6 7236 .get_crash_info = x86_cpu_get_crash_info,
715e3c1a
PMD
7237 .write_elf32_note = x86_cpu_write_elf32_note,
7238 .write_elf64_note = x86_cpu_write_elf64_note,
7239 .write_elf32_qemunote = x86_cpu_write_elf32_qemunote,
7240 .write_elf64_qemunote = x86_cpu_write_elf64_qemunote,
feece4d0 7241 .legacy_vmsd = &vmstate_x86_cpu,
8b80bd28
PMD
7242};
7243#endif
7244
5fd2087a
AF
7245static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
7246{
7247 X86CPUClass *xcc = X86_CPU_CLASS(oc);
7248 CPUClass *cc = CPU_CLASS(oc);
2b6f294c 7249 DeviceClass *dc = DEVICE_CLASS(oc);
e86787d3 7250 ResettableClass *rc = RESETTABLE_CLASS(oc);
f5730c69 7251 FeatureWord w;
2b6f294c 7252
bf853881
PMD
7253 device_class_set_parent_realize(dc, x86_cpu_realizefn,
7254 &xcc->parent_realize);
7255 device_class_set_parent_unrealize(dc, x86_cpu_unrealizefn,
7256 &xcc->parent_unrealize);
4f67d30b 7257 device_class_set_props(dc, x86_cpu_properties);
5fd2087a 7258
e86787d3
PM
7259 resettable_class_set_parent_phases(rc, NULL, x86_cpu_reset_hold, NULL,
7260 &xcc->parent_phases);
91b1df8c 7261 cc->reset_dump_flags = CPU_DUMP_FPU | CPU_DUMP_CCOP;
f56e3a14 7262
500050d1 7263 cc->class_by_name = x86_cpu_class_by_name;
94a444b2 7264 cc->parse_features = x86_cpu_parse_featurestr;
8c2e1b00 7265 cc->has_work = x86_cpu_has_work;
878096ee 7266 cc->dump_state = x86_cpu_dump_state;
f45748f1 7267 cc->set_pc = x86_cpu_set_pc;
e4fdf9df 7268 cc->get_pc = x86_cpu_get_pc;
5b50e790
AF
7269 cc->gdb_read_register = x86_cpu_gdb_read_register;
7270 cc->gdb_write_register = x86_cpu_gdb_write_register;
444d5590 7271 cc->get_arch_id = x86_cpu_get_arch_id;
ed69e831 7272
5d004421 7273#ifndef CONFIG_USER_ONLY
8b80bd28 7274 cc->sysemu_ops = &i386_sysemu_ops;
ed69e831
CF
7275#endif /* !CONFIG_USER_ONLY */
7276
00fcd100
AB
7277 cc->gdb_arch_name = x86_gdb_arch_name;
7278#ifdef TARGET_X86_64
b8158192 7279 cc->gdb_core_xml_file = "i386-64bit.xml";
7b0f97ba 7280 cc->gdb_num_core_regs = 66;
00fcd100 7281#else
b8158192 7282 cc->gdb_core_xml_file = "i386-32bit.xml";
7b0f97ba 7283 cc->gdb_num_core_regs = 50;
74d7fc7f 7284#endif
f50f3dd5 7285 cc->disas_set_info = x86_disas_set_info;
4c315c27 7286
e90f2a8c 7287 dc->user_creatable = true;
3e0dceaf
EH
7288
7289 object_class_property_add(oc, "family", "int",
7290 x86_cpuid_version_get_family,
7291 x86_cpuid_version_set_family, NULL, NULL);
7292 object_class_property_add(oc, "model", "int",
7293 x86_cpuid_version_get_model,
7294 x86_cpuid_version_set_model, NULL, NULL);
7295 object_class_property_add(oc, "stepping", "int",
7296 x86_cpuid_version_get_stepping,
7297 x86_cpuid_version_set_stepping, NULL, NULL);
7298 object_class_property_add_str(oc, "vendor",
7299 x86_cpuid_get_vendor,
7300 x86_cpuid_set_vendor);
7301 object_class_property_add_str(oc, "model-id",
7302 x86_cpuid_get_model_id,
7303 x86_cpuid_set_model_id);
7304 object_class_property_add(oc, "tsc-frequency", "int",
7305 x86_cpuid_get_tsc_freq,
7306 x86_cpuid_set_tsc_freq, NULL, NULL);
7307 /*
7308 * The "unavailable-features" property has the same semantics as
7309 * CpuDefinitionInfo.unavailable-features on the "query-cpu-definitions"
7310 * QMP command: they list the features that would have prevented the
7311 * CPU from running if the "enforce" flag was set.
7312 */
7313 object_class_property_add(oc, "unavailable-features", "strList",
7314 x86_cpu_get_unavailable_features,
7315 NULL, NULL, NULL);
7316
7317#if !defined(CONFIG_USER_ONLY)
7318 object_class_property_add(oc, "crash-information", "GuestPanicInformation",
7319 x86_cpu_get_crash_info_qom, NULL, NULL, NULL);
7320#endif
7321
f5730c69
EH
7322 for (w = 0; w < FEATURE_WORDS; w++) {
7323 int bitnr;
7324 for (bitnr = 0; bitnr < 64; bitnr++) {
7325 x86_cpu_register_feature_bit_props(xcc, w, bitnr);
7326 }
7327 }
5fd2087a
AF
7328}
7329
7330static const TypeInfo x86_cpu_type_info = {
7331 .name = TYPE_X86_CPU,
7332 .parent = TYPE_CPU,
7333 .instance_size = sizeof(X86CPU),
de024815 7334 .instance_init = x86_cpu_initfn,
4db4385a
CF
7335 .instance_post_init = x86_cpu_post_initfn,
7336
d940ee9b 7337 .abstract = true,
5fd2087a
AF
7338 .class_size = sizeof(X86CPUClass),
7339 .class_init = x86_cpu_common_class_init,
7340};
7341
5adbed30
EH
7342/* "base" CPU model, used by query-cpu-model-expansion */
7343static void x86_cpu_base_class_init(ObjectClass *oc, void *data)
7344{
7345 X86CPUClass *xcc = X86_CPU_CLASS(oc);
7346
7347 xcc->static_model = true;
7348 xcc->migration_safe = true;
7349 xcc->model_description = "base CPU model type with no features enabled";
7350 xcc->ordering = 8;
7351}
7352
7353static const TypeInfo x86_base_cpu_type_info = {
7354 .name = X86_CPU_TYPE_NAME("base"),
7355 .parent = TYPE_X86_CPU,
7356 .class_init = x86_cpu_base_class_init,
7357};
7358
5fd2087a
AF
7359static void x86_cpu_register_types(void)
7360{
d940ee9b
EH
7361 int i;
7362
5fd2087a 7363 type_register_static(&x86_cpu_type_info);
d940ee9b 7364 for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) {
dcafd1ef 7365 x86_register_cpudef_types(&builtin_x86_defs[i]);
d940ee9b 7366 }
c62f2630 7367 type_register_static(&max_x86_cpu_type_info);
5adbed30 7368 type_register_static(&x86_base_cpu_type_info);
5fd2087a
AF
7369}
7370
7371type_init(x86_cpu_register_types)