1 /*
2 * i386 CPUID, CPU class, definitions, models
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
9 * version 2.1 of the License, or (at your option) any later version.
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 */
19
20 #include "qemu/osdep.h"
21 #include "qemu/units.h"
22 #include "qemu/cutils.h"
23 #include "qemu/qemu-print.h"
24 #include "qemu/hw-version.h"
25 #include "cpu.h"
26 #include "tcg/helper-tcg.h"
27 #include "exec/translation-block.h"
28 #include "system/hvf.h"
29 #include "hvf/hvf-i386.h"
30 #include "kvm/kvm_i386.h"
31 #include "sev.h"
32 #include "qapi/error.h"
33 #include "qemu/error-report.h"
34 #include "qapi/qapi-visit-machine.h"
35 #include "standard-headers/asm-x86/kvm_para.h"
36 #include "hw/qdev-properties.h"
37 #include "hw/i386/topology.h"
38 #include "exec/watchpoint.h"
39 #ifndef CONFIG_USER_ONLY
40 #include "confidential-guest.h"
41 #include "system/reset.h"
42 #include "qapi/qapi-commands-machine.h"
43 #include "system/address-spaces.h"
44 #include "hw/boards.h"
45 #include "hw/i386/sgx-epc.h"
46 #endif
47 #include "tcg/tcg-cpu.h"
48
49 #include "disas/capstone.h"
50 #include "cpu-internal.h"
51
52 static void x86_cpu_realizefn(DeviceState *dev, Error **errp);
53 static void x86_cpu_get_supported_cpuid(uint32_t func, uint32_t index,
54 uint32_t *eax, uint32_t *ebx,
55 uint32_t *ecx, uint32_t *edx);
56
57 /* Helpers for building CPUID[2] descriptors: */
58
59 struct CPUID2CacheDescriptorInfo {
60 enum CacheType type;
61 int level;
62 int size;
63 int line_size;
64 int associativity;
65 };
66
67 /*
68 * Known CPUID 2 cache descriptors.
69 * From Intel SDM Volume 2A, CPUID instruction
70 */
71 struct CPUID2CacheDescriptorInfo cpuid2_cache_descriptors[] = {
72 [0x06] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 8 * KiB,
73 .associativity = 4, .line_size = 32, },
74 [0x08] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 16 * KiB,
75 .associativity = 4, .line_size = 32, },
76 [0x09] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 32 * KiB,
77 .associativity = 4, .line_size = 64, },
78 [0x0A] = { .level = 1, .type = DATA_CACHE, .size = 8 * KiB,
79 .associativity = 2, .line_size = 32, },
80 [0x0C] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
81 .associativity = 4, .line_size = 32, },
82 [0x0D] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
83 .associativity = 4, .line_size = 64, },
84 [0x0E] = { .level = 1, .type = DATA_CACHE, .size = 24 * KiB,
85 .associativity = 6, .line_size = 64, },
86 [0x1D] = { .level = 2, .type = UNIFIED_CACHE, .size = 128 * KiB,
87 .associativity = 2, .line_size = 64, },
88 [0x21] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
89 .associativity = 8, .line_size = 64, },
90 /* lines per sector is not supported cpuid2_cache_descriptor(),
91 * so descriptors 0x22, 0x23 are not included
92 */
93 [0x24] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
94 .associativity = 16, .line_size = 64, },
95 /* lines per sector is not supported cpuid2_cache_descriptor(),
96 * so descriptors 0x25, 0x20 are not included
97 */
98 [0x2C] = { .level = 1, .type = DATA_CACHE, .size = 32 * KiB,
99 .associativity = 8, .line_size = 64, },
100 [0x30] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 32 * KiB,
101 .associativity = 8, .line_size = 64, },
102 [0x41] = { .level = 2, .type = UNIFIED_CACHE, .size = 128 * KiB,
103 .associativity = 4, .line_size = 32, },
104 [0x42] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
105 .associativity = 4, .line_size = 32, },
106 [0x43] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
107 .associativity = 4, .line_size = 32, },
108 [0x44] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
109 .associativity = 4, .line_size = 32, },
110 [0x45] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
111 .associativity = 4, .line_size = 32, },
112 [0x46] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
113 .associativity = 4, .line_size = 64, },
114 [0x47] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
115 .associativity = 8, .line_size = 64, },
116 [0x48] = { .level = 2, .type = UNIFIED_CACHE, .size = 3 * MiB,
117 .associativity = 12, .line_size = 64, },
118 /* Descriptor 0x49 depends on CPU family/model, so it is not included */
119 [0x4A] = { .level = 3, .type = UNIFIED_CACHE, .size = 6 * MiB,
120 .associativity = 12, .line_size = 64, },
121 [0x4B] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
122 .associativity = 16, .line_size = 64, },
123 [0x4C] = { .level = 3, .type = UNIFIED_CACHE, .size = 12 * MiB,
124 .associativity = 12, .line_size = 64, },
125 [0x4D] = { .level = 3, .type = UNIFIED_CACHE, .size = 16 * MiB,
126 .associativity = 16, .line_size = 64, },
127 [0x4E] = { .level = 2, .type = UNIFIED_CACHE, .size = 6 * MiB,
128 .associativity = 24, .line_size = 64, },
129 [0x60] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
130 .associativity = 8, .line_size = 64, },
131 [0x66] = { .level = 1, .type = DATA_CACHE, .size = 8 * KiB,
132 .associativity = 4, .line_size = 64, },
133 [0x67] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
134 .associativity = 4, .line_size = 64, },
135 [0x68] = { .level = 1, .type = DATA_CACHE, .size = 32 * KiB,
136 .associativity = 4, .line_size = 64, },
137 [0x78] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
138 .associativity = 4, .line_size = 64, },
139 /* lines per sector is not supported cpuid2_cache_descriptor(),
140 * so descriptors 0x79, 0x7A, 0x7B, 0x7C are not included.
141 */
142 [0x7D] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
143 .associativity = 8, .line_size = 64, },
144 [0x7F] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
145 .associativity = 2, .line_size = 64, },
146 [0x80] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
147 .associativity = 8, .line_size = 64, },
148 [0x82] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
149 .associativity = 8, .line_size = 32, },
150 [0x83] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
151 .associativity = 8, .line_size = 32, },
152 [0x84] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
153 .associativity = 8, .line_size = 32, },
154 [0x85] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
155 .associativity = 8, .line_size = 32, },
156 [0x86] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
157 .associativity = 4, .line_size = 64, },
158 [0x87] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
159 .associativity = 8, .line_size = 64, },
160 [0xD0] = { .level = 3, .type = UNIFIED_CACHE, .size = 512 * KiB,
161 .associativity = 4, .line_size = 64, },
162 [0xD1] = { .level = 3, .type = UNIFIED_CACHE, .size = 1 * MiB,
163 .associativity = 4, .line_size = 64, },
164 [0xD2] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
165 .associativity = 4, .line_size = 64, },
166 [0xD6] = { .level = 3, .type = UNIFIED_CACHE, .size = 1 * MiB,
167 .associativity = 8, .line_size = 64, },
168 [0xD7] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
169 .associativity = 8, .line_size = 64, },
170 [0xD8] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
171 .associativity = 8, .line_size = 64, },
172 [0xDC] = { .level = 3, .type = UNIFIED_CACHE, .size = 1.5 * MiB,
173 .associativity = 12, .line_size = 64, },
174 [0xDD] = { .level = 3, .type = UNIFIED_CACHE, .size = 3 * MiB,
175 .associativity = 12, .line_size = 64, },
176 [0xDE] = { .level = 3, .type = UNIFIED_CACHE, .size = 6 * MiB,
177 .associativity = 12, .line_size = 64, },
178 [0xE2] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
179 .associativity = 16, .line_size = 64, },
180 [0xE3] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
181 .associativity = 16, .line_size = 64, },
182 [0xE4] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
183 .associativity = 16, .line_size = 64, },
184 [0xEA] = { .level = 3, .type = UNIFIED_CACHE, .size = 12 * MiB,
185 .associativity = 24, .line_size = 64, },
186 [0xEB] = { .level = 3, .type = UNIFIED_CACHE, .size = 18 * MiB,
187 .associativity = 24, .line_size = 64, },
188 [0xEC] = { .level = 3, .type = UNIFIED_CACHE, .size = 24 * MiB,
189 .associativity = 24, .line_size = 64, },
190 };
191
192 /*
193 * "CPUID leaf 2 does not report cache descriptor information,
194 * use CPUID leaf 4 to query cache parameters"
195 */
196 #define CACHE_DESCRIPTOR_UNAVAILABLE 0xFF
197
198 /*
199 * Return a CPUID 2 cache descriptor for a given cache.
200 * If no known descriptor is found, return CACHE_DESCRIPTOR_UNAVAILABLE
201 */
cpuid2_cache_descriptor(CPUCacheInfo * cache)202 static uint8_t cpuid2_cache_descriptor(CPUCacheInfo *cache)
203 {
204 int i;
205
206 assert(cache->size > 0);
207 assert(cache->level > 0);
208 assert(cache->line_size > 0);
209 assert(cache->associativity > 0);
210 for (i = 0; i < ARRAY_SIZE(cpuid2_cache_descriptors); i++) {
211 struct CPUID2CacheDescriptorInfo *d = &cpuid2_cache_descriptors[i];
212 if (d->level == cache->level && d->type == cache->type &&
213 d->size == cache->size && d->line_size == cache->line_size &&
214 d->associativity == cache->associativity) {
215 return i;
216 }
217 }
218
219 return CACHE_DESCRIPTOR_UNAVAILABLE;
220 }
221
222 /* CPUID Leaf 4 constants: */
223
224 /* EAX: */
225 #define CACHE_TYPE_D 1
226 #define CACHE_TYPE_I 2
227 #define CACHE_TYPE_UNIFIED 3
228
229 #define CACHE_LEVEL(l) (l << 5)
230
231 #define CACHE_SELF_INIT_LEVEL (1 << 8)
232
233 /* EDX: */
234 #define CACHE_NO_INVD_SHARING (1 << 0)
235 #define CACHE_INCLUSIVE (1 << 1)
236 #define CACHE_COMPLEX_IDX (1 << 2)
237
238 /* Encode CacheType for CPUID[4].EAX */
239 #define CACHE_TYPE(t) (((t) == DATA_CACHE) ? CACHE_TYPE_D : \
240 ((t) == INSTRUCTION_CACHE) ? CACHE_TYPE_I : \
241 ((t) == UNIFIED_CACHE) ? CACHE_TYPE_UNIFIED : \
242 0 /* Invalid value */)
243
max_thread_ids_for_cache(X86CPUTopoInfo * topo_info,enum CpuTopologyLevel share_level)244 static uint32_t max_thread_ids_for_cache(X86CPUTopoInfo *topo_info,
245 enum CpuTopologyLevel share_level)
246 {
247 uint32_t num_ids = 0;
248
249 switch (share_level) {
250 case CPU_TOPOLOGY_LEVEL_CORE:
251 num_ids = 1 << apicid_core_offset(topo_info);
252 break;
253 case CPU_TOPOLOGY_LEVEL_MODULE:
254 num_ids = 1 << apicid_module_offset(topo_info);
255 break;
256 case CPU_TOPOLOGY_LEVEL_DIE:
257 num_ids = 1 << apicid_die_offset(topo_info);
258 break;
259 case CPU_TOPOLOGY_LEVEL_SOCKET:
260 num_ids = 1 << apicid_pkg_offset(topo_info);
261 break;
262 default:
263 /*
264 * Currently there is no use case for THREAD, so use
265 * assert directly to facilitate debugging.
266 */
267 g_assert_not_reached();
268 }
269
270 return num_ids - 1;
271 }
272
max_core_ids_in_package(X86CPUTopoInfo * topo_info)273 static uint32_t max_core_ids_in_package(X86CPUTopoInfo *topo_info)
274 {
275 uint32_t num_cores = 1 << (apicid_pkg_offset(topo_info) -
276 apicid_core_offset(topo_info));
277 return num_cores - 1;
278 }
279
280 /* Encode cache info for CPUID[4] */
encode_cache_cpuid4(CPUCacheInfo * cache,X86CPUTopoInfo * topo_info,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)281 static void encode_cache_cpuid4(CPUCacheInfo *cache,
282 X86CPUTopoInfo *topo_info,
283 uint32_t *eax, uint32_t *ebx,
284 uint32_t *ecx, uint32_t *edx)
285 {
286 assert(cache->size == cache->line_size * cache->associativity *
287 cache->partitions * cache->sets);
288
289 *eax = CACHE_TYPE(cache->type) |
290 CACHE_LEVEL(cache->level) |
291 (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0) |
292 (max_core_ids_in_package(topo_info) << 26) |
293 (max_thread_ids_for_cache(topo_info, cache->share_level) << 14);
294
295 assert(cache->line_size > 0);
296 assert(cache->partitions > 0);
297 assert(cache->associativity > 0);
298 /* We don't implement fully-associative caches */
299 assert(cache->associativity < cache->sets);
300 *ebx = (cache->line_size - 1) |
301 ((cache->partitions - 1) << 12) |
302 ((cache->associativity - 1) << 22);
303
304 assert(cache->sets > 0);
305 *ecx = cache->sets - 1;
306
307 *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
308 (cache->inclusive ? CACHE_INCLUSIVE : 0) |
309 (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
310 }
311
num_threads_by_topo_level(X86CPUTopoInfo * topo_info,enum CpuTopologyLevel topo_level)312 static uint32_t num_threads_by_topo_level(X86CPUTopoInfo *topo_info,
313 enum CpuTopologyLevel topo_level)
314 {
315 switch (topo_level) {
316 case CPU_TOPOLOGY_LEVEL_THREAD:
317 return 1;
318 case CPU_TOPOLOGY_LEVEL_CORE:
319 return topo_info->threads_per_core;
320 case CPU_TOPOLOGY_LEVEL_MODULE:
321 return x86_threads_per_module(topo_info);
322 case CPU_TOPOLOGY_LEVEL_DIE:
323 return x86_threads_per_die(topo_info);
324 case CPU_TOPOLOGY_LEVEL_SOCKET:
325 return x86_threads_per_pkg(topo_info);
326 default:
327 g_assert_not_reached();
328 }
329 return 0;
330 }
331
apicid_offset_by_topo_level(X86CPUTopoInfo * topo_info,enum CpuTopologyLevel topo_level)332 static uint32_t apicid_offset_by_topo_level(X86CPUTopoInfo *topo_info,
333 enum CpuTopologyLevel topo_level)
334 {
335 switch (topo_level) {
336 case CPU_TOPOLOGY_LEVEL_THREAD:
337 return 0;
338 case CPU_TOPOLOGY_LEVEL_CORE:
339 return apicid_core_offset(topo_info);
340 case CPU_TOPOLOGY_LEVEL_MODULE:
341 return apicid_module_offset(topo_info);
342 case CPU_TOPOLOGY_LEVEL_DIE:
343 return apicid_die_offset(topo_info);
344 case CPU_TOPOLOGY_LEVEL_SOCKET:
345 return apicid_pkg_offset(topo_info);
346 default:
347 g_assert_not_reached();
348 }
349 return 0;
350 }
351
cpuid1f_topo_type(enum CpuTopologyLevel topo_level)352 static uint32_t cpuid1f_topo_type(enum CpuTopologyLevel topo_level)
353 {
354 switch (topo_level) {
355 case CPU_TOPOLOGY_LEVEL_INVALID:
356 return CPUID_1F_ECX_TOPO_LEVEL_INVALID;
357 case CPU_TOPOLOGY_LEVEL_THREAD:
358 return CPUID_1F_ECX_TOPO_LEVEL_SMT;
359 case CPU_TOPOLOGY_LEVEL_CORE:
360 return CPUID_1F_ECX_TOPO_LEVEL_CORE;
361 case CPU_TOPOLOGY_LEVEL_MODULE:
362 return CPUID_1F_ECX_TOPO_LEVEL_MODULE;
363 case CPU_TOPOLOGY_LEVEL_DIE:
364 return CPUID_1F_ECX_TOPO_LEVEL_DIE;
365 default:
366 /* Other types are not supported in QEMU. */
367 g_assert_not_reached();
368 }
369 return 0;
370 }
371
encode_topo_cpuid1f(CPUX86State * env,uint32_t count,X86CPUTopoInfo * topo_info,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)372 static void encode_topo_cpuid1f(CPUX86State *env, uint32_t count,
373 X86CPUTopoInfo *topo_info,
374 uint32_t *eax, uint32_t *ebx,
375 uint32_t *ecx, uint32_t *edx)
376 {
377 X86CPU *cpu = env_archcpu(env);
378 unsigned long level, base_level, next_level;
379 uint32_t num_threads_next_level, offset_next_level;
380
381 assert(count <= CPU_TOPOLOGY_LEVEL_SOCKET);
382
383 /*
384 * Find the No.(count + 1) topology level in avail_cpu_topo bitmap.
385 * The search starts from bit 0 (CPU_TOPOLOGY_LEVEL_THREAD).
386 */
387 level = CPU_TOPOLOGY_LEVEL_THREAD;
388 base_level = level;
389 for (int i = 0; i <= count; i++) {
390 level = find_next_bit(env->avail_cpu_topo,
391 CPU_TOPOLOGY_LEVEL_SOCKET,
392 base_level);
393
394 /*
395 * CPUID[0x1f] doesn't explicitly encode the package level,
396 * and it just encodes the invalid level (all fields are 0)
397 * into the last subleaf of 0x1f.
398 */
399 if (level == CPU_TOPOLOGY_LEVEL_SOCKET) {
400 level = CPU_TOPOLOGY_LEVEL_INVALID;
401 break;
402 }
403 /* Search the next level. */
404 base_level = level + 1;
405 }
406
407 if (level == CPU_TOPOLOGY_LEVEL_INVALID) {
408 num_threads_next_level = 0;
409 offset_next_level = 0;
410 } else {
411 next_level = find_next_bit(env->avail_cpu_topo,
412 CPU_TOPOLOGY_LEVEL_SOCKET,
413 level + 1);
414 num_threads_next_level = num_threads_by_topo_level(topo_info,
415 next_level);
416 offset_next_level = apicid_offset_by_topo_level(topo_info,
417 next_level);
418 }
419
420 *eax = offset_next_level;
421 /* The count (bits 15-00) doesn't need to be reliable. */
422 *ebx = num_threads_next_level & 0xffff;
423 *ecx = (count & 0xff) | (cpuid1f_topo_type(level) << 8);
424 *edx = cpu->apic_id;
425
426 assert(!(*eax & ~0x1f));
427 }
428
429 /* Encode cache info for CPUID[0x80000005].ECX or CPUID[0x80000005].EDX */
encode_cache_cpuid80000005(CPUCacheInfo * cache)430 static uint32_t encode_cache_cpuid80000005(CPUCacheInfo *cache)
431 {
432 assert(cache->size % 1024 == 0);
433 assert(cache->lines_per_tag > 0);
434 assert(cache->associativity > 0);
435 assert(cache->line_size > 0);
436 return ((cache->size / 1024) << 24) | (cache->associativity << 16) |
437 (cache->lines_per_tag << 8) | (cache->line_size);
438 }
439
440 #define ASSOC_FULL 0xFF
441
442 /* AMD associativity encoding used on CPUID Leaf 0x80000006: */
443 #define AMD_ENC_ASSOC(a) (a <= 1 ? a : \
444 a == 2 ? 0x2 : \
445 a == 4 ? 0x4 : \
446 a == 8 ? 0x6 : \
447 a == 16 ? 0x8 : \
448 a == 32 ? 0xA : \
449 a == 48 ? 0xB : \
450 a == 64 ? 0xC : \
451 a == 96 ? 0xD : \
452 a == 128 ? 0xE : \
453 a == ASSOC_FULL ? 0xF : \
454 0 /* invalid value */)
455
456 /*
457 * Encode cache info for CPUID[0x80000006].ECX and CPUID[0x80000006].EDX
458 * @l3 can be NULL.
459 */
encode_cache_cpuid80000006(CPUCacheInfo * l2,CPUCacheInfo * l3,uint32_t * ecx,uint32_t * edx)460 static void encode_cache_cpuid80000006(CPUCacheInfo *l2,
461 CPUCacheInfo *l3,
462 uint32_t *ecx, uint32_t *edx)
463 {
464 assert(l2->size % 1024 == 0);
465 assert(l2->associativity > 0);
466 assert(l2->lines_per_tag > 0);
467 assert(l2->line_size > 0);
468 *ecx = ((l2->size / 1024) << 16) |
469 (AMD_ENC_ASSOC(l2->associativity) << 12) |
470 (l2->lines_per_tag << 8) | (l2->line_size);
471
472 if (l3) {
473 assert(l3->size % (512 * 1024) == 0);
474 assert(l3->associativity > 0);
475 assert(l3->lines_per_tag > 0);
476 assert(l3->line_size > 0);
477 *edx = ((l3->size / (512 * 1024)) << 18) |
478 (AMD_ENC_ASSOC(l3->associativity) << 12) |
479 (l3->lines_per_tag << 8) | (l3->line_size);
480 } else {
481 *edx = 0;
482 }
483 }
484
485 /* Encode cache info for CPUID[8000001D] */
encode_cache_cpuid8000001d(CPUCacheInfo * cache,X86CPUTopoInfo * topo_info,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)486 static void encode_cache_cpuid8000001d(CPUCacheInfo *cache,
487 X86CPUTopoInfo *topo_info,
488 uint32_t *eax, uint32_t *ebx,
489 uint32_t *ecx, uint32_t *edx)
490 {
491 assert(cache->size == cache->line_size * cache->associativity *
492 cache->partitions * cache->sets);
493
494 *eax = CACHE_TYPE(cache->type) | CACHE_LEVEL(cache->level) |
495 (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0);
496 *eax |= max_thread_ids_for_cache(topo_info, cache->share_level) << 14;
497
498 assert(cache->line_size > 0);
499 assert(cache->partitions > 0);
500 assert(cache->associativity > 0);
501 /* We don't implement fully-associative caches */
502 assert(cache->associativity < cache->sets);
503 *ebx = (cache->line_size - 1) |
504 ((cache->partitions - 1) << 12) |
505 ((cache->associativity - 1) << 22);
506
507 assert(cache->sets > 0);
508 *ecx = cache->sets - 1;
509
510 *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
511 (cache->inclusive ? CACHE_INCLUSIVE : 0) |
512 (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
513 }
514
515 /* Encode cache info for CPUID[8000001E] */
encode_topo_cpuid8000001e(X86CPU * cpu,X86CPUTopoInfo * topo_info,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)516 static void encode_topo_cpuid8000001e(X86CPU *cpu, X86CPUTopoInfo *topo_info,
517 uint32_t *eax, uint32_t *ebx,
518 uint32_t *ecx, uint32_t *edx)
519 {
520 X86CPUTopoIDs topo_ids;
521
522 x86_topo_ids_from_apicid(cpu->apic_id, topo_info, &topo_ids);
523
524 *eax = cpu->apic_id;
525
526 /*
527 * CPUID_Fn8000001E_EBX [Core Identifiers] (CoreId)
528 * Read-only. Reset: 0000_XXXXh.
529 * See Core::X86::Cpuid::ExtApicId.
530 * Core::X86::Cpuid::CoreId_lthree[1:0]_core[3:0]_thread[1:0];
531 * Bits Description
532 * 31:16 Reserved.
533 * 15:8 ThreadsPerCore: threads per core. Read-only. Reset: XXh.
534 * The number of threads per core is ThreadsPerCore+1.
535 * 7:0 CoreId: core ID. Read-only. Reset: XXh.
536 *
537 * NOTE: CoreId is already part of apic_id. Just use it. We can
538 * use all the 8 bits to represent the core_id here.
539 */
540 *ebx = ((topo_info->threads_per_core - 1) << 8) | (topo_ids.core_id & 0xFF);
541
542 /*
543 * CPUID_Fn8000001E_ECX [Node Identifiers] (NodeId)
544 * Read-only. Reset: 0000_0XXXh.
545 * Core::X86::Cpuid::NodeId_lthree[1:0]_core[3:0]_thread[1:0];
546 * Bits Description
547 * 31:11 Reserved.
548 * 10:8 NodesPerProcessor: Node per processor. Read-only. Reset: XXXb.
549 * ValidValues:
550 * Value Description
551 * 0h 1 node per processor.
552 * 7h-1h Reserved.
553 * 7:0 NodeId: Node ID. Read-only. Reset: XXh.
554 *
555 * NOTE: Hardware reserves 3 bits for number of nodes per processor.
556 * But users can create more nodes than the actual hardware can
557 * support. To genaralize we can use all the upper 8 bits for nodes.
558 * NodeId is combination of node and socket_id which is already decoded
559 * in apic_id. Just use it by shifting.
560 */
561 if (cpu->legacy_multi_node) {
562 *ecx = ((topo_info->dies_per_pkg - 1) << 8) |
563 ((cpu->apic_id >> apicid_die_offset(topo_info)) & 0xFF);
564 } else {
565 *ecx = (cpu->apic_id >> apicid_pkg_offset(topo_info)) & 0xFF;
566 }
567
568 *edx = 0;
569 }
570
571 /*
572 * Definitions of the hardcoded cache entries we expose:
573 * These are legacy cache values. If there is a need to change any
574 * of these values please use builtin_x86_defs
575 */
576
577 /* L1 data cache: */
578 static CPUCacheInfo legacy_l1d_cache = {
579 .type = DATA_CACHE,
580 .level = 1,
581 .size = 32 * KiB,
582 .self_init = 1,
583 .line_size = 64,
584 .associativity = 8,
585 .sets = 64,
586 .partitions = 1,
587 .no_invd_sharing = true,
588 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
589 };
590
591 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
592 static CPUCacheInfo legacy_l1d_cache_amd = {
593 .type = DATA_CACHE,
594 .level = 1,
595 .size = 64 * KiB,
596 .self_init = 1,
597 .line_size = 64,
598 .associativity = 2,
599 .sets = 512,
600 .partitions = 1,
601 .lines_per_tag = 1,
602 .no_invd_sharing = true,
603 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
604 };
605
606 /* L1 instruction cache: */
607 static CPUCacheInfo legacy_l1i_cache = {
608 .type = INSTRUCTION_CACHE,
609 .level = 1,
610 .size = 32 * KiB,
611 .self_init = 1,
612 .line_size = 64,
613 .associativity = 8,
614 .sets = 64,
615 .partitions = 1,
616 .no_invd_sharing = true,
617 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
618 };
619
620 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
621 static CPUCacheInfo legacy_l1i_cache_amd = {
622 .type = INSTRUCTION_CACHE,
623 .level = 1,
624 .size = 64 * KiB,
625 .self_init = 1,
626 .line_size = 64,
627 .associativity = 2,
628 .sets = 512,
629 .partitions = 1,
630 .lines_per_tag = 1,
631 .no_invd_sharing = true,
632 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
633 };
634
635 /* Level 2 unified cache: */
636 static CPUCacheInfo legacy_l2_cache = {
637 .type = UNIFIED_CACHE,
638 .level = 2,
639 .size = 4 * MiB,
640 .self_init = 1,
641 .line_size = 64,
642 .associativity = 16,
643 .sets = 4096,
644 .partitions = 1,
645 .no_invd_sharing = true,
646 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
647 };
648
649 /*FIXME: CPUID leaf 2 descriptor is inconsistent with CPUID leaf 4 */
650 static CPUCacheInfo legacy_l2_cache_cpuid2 = {
651 .type = UNIFIED_CACHE,
652 .level = 2,
653 .size = 2 * MiB,
654 .line_size = 64,
655 .associativity = 8,
656 .share_level = CPU_TOPOLOGY_LEVEL_INVALID,
657 };
658
659
660 /*FIXME: CPUID leaf 0x80000006 is inconsistent with leaves 2 & 4 */
661 static CPUCacheInfo legacy_l2_cache_amd = {
662 .type = UNIFIED_CACHE,
663 .level = 2,
664 .size = 512 * KiB,
665 .line_size = 64,
666 .lines_per_tag = 1,
667 .associativity = 16,
668 .sets = 512,
669 .partitions = 1,
670 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
671 };
672
673 /* Level 3 unified cache: */
674 static CPUCacheInfo legacy_l3_cache = {
675 .type = UNIFIED_CACHE,
676 .level = 3,
677 .size = 16 * MiB,
678 .line_size = 64,
679 .associativity = 16,
680 .sets = 16384,
681 .partitions = 1,
682 .lines_per_tag = 1,
683 .self_init = true,
684 .inclusive = true,
685 .complex_indexing = true,
686 .share_level = CPU_TOPOLOGY_LEVEL_DIE,
687 };
688
689 /* TLB definitions: */
690
691 #define L1_DTLB_2M_ASSOC 1
692 #define L1_DTLB_2M_ENTRIES 255
693 #define L1_DTLB_4K_ASSOC 1
694 #define L1_DTLB_4K_ENTRIES 255
695
696 #define L1_ITLB_2M_ASSOC 1
697 #define L1_ITLB_2M_ENTRIES 255
698 #define L1_ITLB_4K_ASSOC 1
699 #define L1_ITLB_4K_ENTRIES 255
700
701 #define L2_DTLB_2M_ASSOC 0 /* disabled */
702 #define L2_DTLB_2M_ENTRIES 0 /* disabled */
703 #define L2_DTLB_4K_ASSOC 4
704 #define L2_DTLB_4K_ENTRIES 512
705
706 #define L2_ITLB_2M_ASSOC 0 /* disabled */
707 #define L2_ITLB_2M_ENTRIES 0 /* disabled */
708 #define L2_ITLB_4K_ASSOC 4
709 #define L2_ITLB_4K_ENTRIES 512
710
711 /* CPUID Leaf 0x14 constants: */
712 #define INTEL_PT_MAX_SUBLEAF 0x1
713 /*
714 * bit[00]: IA32_RTIT_CTL.CR3 filter can be set to 1 and IA32_RTIT_CR3_MATCH
715 * MSR can be accessed;
716 * bit[01]: Support Configurable PSB and Cycle-Accurate Mode;
717 * bit[02]: Support IP Filtering, TraceStop filtering, and preservation
718 * of Intel PT MSRs across warm reset;
719 * bit[03]: Support MTC timing packet and suppression of COFI-based packets;
720 */
721 #define INTEL_PT_MINIMAL_EBX 0xf
722 /*
723 * bit[00]: Tracing can be enabled with IA32_RTIT_CTL.ToPA = 1 and
724 * IA32_RTIT_OUTPUT_BASE and IA32_RTIT_OUTPUT_MASK_PTRS MSRs can be
725 * accessed;
726 * bit[01]: ToPA tables can hold any number of output entries, up to the
727 * maximum allowed by the MaskOrTableOffset field of
728 * IA32_RTIT_OUTPUT_MASK_PTRS;
729 * bit[02]: Support Single-Range Output scheme;
730 */
731 #define INTEL_PT_MINIMAL_ECX 0x7
732 /* generated packets which contain IP payloads have LIP values */
733 #define INTEL_PT_IP_LIP (1 << 31)
734 #define INTEL_PT_ADDR_RANGES_NUM 0x2 /* Number of configurable address ranges */
735 #define INTEL_PT_ADDR_RANGES_NUM_MASK 0x3
736 #define INTEL_PT_MTC_BITMAP (0x0249 << 16) /* Support ART(0,3,6,9) */
737 #define INTEL_PT_CYCLE_BITMAP 0x1fff /* Support 0,2^(0~11) */
738 #define INTEL_PT_PSB_BITMAP (0x003f << 16) /* Support 2K,4K,8K,16K,32K,64K */
739
740 /* CPUID Leaf 0x1D constants: */
741 #define INTEL_AMX_TILE_MAX_SUBLEAF 0x1
742 #define INTEL_AMX_TOTAL_TILE_BYTES 0x2000
743 #define INTEL_AMX_BYTES_PER_TILE 0x400
744 #define INTEL_AMX_BYTES_PER_ROW 0x40
745 #define INTEL_AMX_TILE_MAX_NAMES 0x8
746 #define INTEL_AMX_TILE_MAX_ROWS 0x10
747
748 /* CPUID Leaf 0x1E constants: */
749 #define INTEL_AMX_TMUL_MAX_K 0x10
750 #define INTEL_AMX_TMUL_MAX_N 0x40
751
x86_cpu_vendor_words2str(char * dst,uint32_t vendor1,uint32_t vendor2,uint32_t vendor3)752 void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1,
753 uint32_t vendor2, uint32_t vendor3)
754 {
755 int i;
756 for (i = 0; i < 4; i++) {
757 dst[i] = vendor1 >> (8 * i);
758 dst[i + 4] = vendor2 >> (8 * i);
759 dst[i + 8] = vendor3 >> (8 * i);
760 }
761 dst[CPUID_VENDOR_SZ] = '\0';
762 }
763
764 #define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
765 #define PENTIUM_FEATURES (I486_FEATURES | CPUID_DE | CPUID_TSC | \
766 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_MMX | CPUID_APIC)
767 #define PENTIUM2_FEATURES (PENTIUM_FEATURES | CPUID_PAE | CPUID_SEP | \
768 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
769 CPUID_PSE36 | CPUID_FXSR)
770 #define PENTIUM3_FEATURES (PENTIUM2_FEATURES | CPUID_SSE)
771 #define PPRO_FEATURES (CPUID_FP87 | CPUID_DE | CPUID_PSE | CPUID_TSC | \
772 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_PGE | CPUID_CMOV | \
773 CPUID_PAT | CPUID_FXSR | CPUID_MMX | CPUID_SSE | CPUID_SSE2 | \
774 CPUID_PAE | CPUID_SEP | CPUID_APIC)
775
776 #define TCG_FEATURES (CPUID_FP87 | CPUID_PSE | CPUID_TSC | CPUID_MSR | \
777 CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | CPUID_SEP | \
778 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
779 CPUID_PSE36 | CPUID_CLFLUSH | CPUID_ACPI | CPUID_MMX | \
780 CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS | CPUID_DE | \
781 CPUID_HT)
782 /* partly implemented:
783 CPUID_MTRR, CPUID_MCA, CPUID_CLFLUSH (needed for Win64) */
784 /* missing:
785 CPUID_VME, CPUID_DTS, CPUID_SS, CPUID_TM, CPUID_PBE */
786
787 /*
788 * Kernel-only features that can be shown to usermode programs even if
789 * they aren't actually supported by TCG, because qemu-user only runs
790 * in CPL=3; remove them if they are ever implemented for system emulation.
791 */
792 #if defined CONFIG_USER_ONLY
793 #define CPUID_EXT_KERNEL_FEATURES \
794 (CPUID_EXT_PCID | CPUID_EXT_TSC_DEADLINE_TIMER)
795 #else
796 #define CPUID_EXT_KERNEL_FEATURES 0
797 #endif
798 #define TCG_EXT_FEATURES (CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | \
799 CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | \
800 CPUID_EXT_SSE41 | CPUID_EXT_SSE42 | CPUID_EXT_POPCNT | \
801 CPUID_EXT_XSAVE | /* CPUID_EXT_OSXSAVE is dynamic */ \
802 CPUID_EXT_MOVBE | CPUID_EXT_AES | CPUID_EXT_HYPERVISOR | \
803 CPUID_EXT_RDRAND | CPUID_EXT_AVX | CPUID_EXT_F16C | \
804 CPUID_EXT_FMA | CPUID_EXT_X2APIC | CPUID_EXT_KERNEL_FEATURES)
805 /* missing:
806 CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_SMX,
807 CPUID_EXT_EST, CPUID_EXT_TM2, CPUID_EXT_CID,
808 CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_PCID, CPUID_EXT_DCA,
809 CPUID_EXT_TSC_DEADLINE_TIMER
810 */
811
812 #ifdef TARGET_X86_64
813 #define TCG_EXT2_X86_64_FEATURES CPUID_EXT2_LM
814 #else
815 #define TCG_EXT2_X86_64_FEATURES 0
816 #endif
817
818 /*
819 * CPUID_*_KERNEL_FEATURES denotes bits and features that are not usable
820 * in usermode or by 32-bit programs. Those are added to supported
821 * TCG features unconditionally in user-mode emulation mode. This may
822 * indeed seem strange or incorrect, but it works because code running
823 * under usermode emulation cannot access them.
824 *
825 * Even for long mode, qemu-i386 is not running "a userspace program on a
826 * 32-bit CPU"; it's running "a userspace program with a 32-bit code segment"
827 * and therefore using the 32-bit ABI; the CPU itself might be 64-bit
828 * but again the difference is only visible in kernel mode.
829 */
830 #if defined CONFIG_LINUX_USER
831 #define CPUID_EXT2_KERNEL_FEATURES (CPUID_EXT2_LM | CPUID_EXT2_FFXSR)
832 #elif defined CONFIG_USER_ONLY
833 /* FIXME: Long mode not yet supported for i386 bsd-user */
834 #define CPUID_EXT2_KERNEL_FEATURES CPUID_EXT2_FFXSR
835 #else
836 #define CPUID_EXT2_KERNEL_FEATURES 0
837 #endif
838
839 #define TCG_EXT2_FEATURES ((TCG_FEATURES & CPUID_EXT2_AMD_ALIASES) | \
840 CPUID_EXT2_NX | CPUID_EXT2_MMXEXT | CPUID_EXT2_RDTSCP | \
841 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_PDPE1GB | \
842 CPUID_EXT2_SYSCALL | TCG_EXT2_X86_64_FEATURES | \
843 CPUID_EXT2_KERNEL_FEATURES)
844
845 #if defined CONFIG_USER_ONLY
846 #define CPUID_EXT3_KERNEL_FEATURES CPUID_EXT3_OSVW
847 #else
848 #define CPUID_EXT3_KERNEL_FEATURES 0
849 #endif
850
851 #define TCG_EXT3_FEATURES (CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | \
852 CPUID_EXT3_CR8LEG | CPUID_EXT3_ABM | CPUID_EXT3_SSE4A | \
853 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_KERNEL_FEATURES | \
854 CPUID_EXT3_CMP_LEG)
855
856 #define TCG_EXT4_FEATURES 0
857
858 #if defined CONFIG_USER_ONLY
859 #define CPUID_SVM_KERNEL_FEATURES (CPUID_SVM_NRIPSAVE | CPUID_SVM_VNMI)
860 #else
861 #define CPUID_SVM_KERNEL_FEATURES 0
862 #endif
863 #define TCG_SVM_FEATURES (CPUID_SVM_NPT | CPUID_SVM_VGIF | \
864 CPUID_SVM_SVME_ADDR_CHK | CPUID_SVM_KERNEL_FEATURES)
865
866 #define TCG_KVM_FEATURES 0
867
868 #if defined CONFIG_USER_ONLY
869 #define CPUID_7_0_EBX_KERNEL_FEATURES CPUID_7_0_EBX_INVPCID
870 #else
871 #define CPUID_7_0_EBX_KERNEL_FEATURES 0
872 #endif
873 #define TCG_7_0_EBX_FEATURES (CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_SMAP | \
874 CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX | \
875 CPUID_7_0_EBX_CLFLUSHOPT | \
876 CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_FSGSBASE | \
877 CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_RDSEED | \
878 CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_KERNEL_FEATURES)
879 /* missing:
880 CPUID_7_0_EBX_HLE
881 CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM */
882
883 #if !defined CONFIG_USER_ONLY || defined CONFIG_LINUX
884 #define TCG_7_0_ECX_RDPID CPUID_7_0_ECX_RDPID
885 #else
886 #define TCG_7_0_ECX_RDPID 0
887 #endif
888 #define TCG_7_0_ECX_FEATURES (CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | \
889 /* CPUID_7_0_ECX_OSPKE is dynamic */ \
890 CPUID_7_0_ECX_LA57 | CPUID_7_0_ECX_PKS | CPUID_7_0_ECX_VAES | \
891 TCG_7_0_ECX_RDPID)
892
893 #if defined CONFIG_USER_ONLY
894 #define CPUID_7_0_EDX_KERNEL_FEATURES (CPUID_7_0_EDX_SPEC_CTRL | \
895 CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD)
896 #else
897 #define CPUID_7_0_EDX_KERNEL_FEATURES 0
898 #endif
899 #define TCG_7_0_EDX_FEATURES (CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_KERNEL_FEATURES)
900
901 #define TCG_7_1_EAX_FEATURES (CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | \
902 CPUID_7_1_EAX_FSRC | CPUID_7_1_EAX_CMPCCXADD)
903 #define TCG_7_1_ECX_FEATURES 0
904 #define TCG_7_1_EDX_FEATURES 0
905 #define TCG_7_2_EDX_FEATURES 0
906 #define TCG_APM_FEATURES 0
907 #define TCG_6_EAX_FEATURES CPUID_6_EAX_ARAT
908 #define TCG_XSAVE_FEATURES (CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XGETBV1)
909 /* missing:
910 CPUID_XSAVE_XSAVEC, CPUID_XSAVE_XSAVES */
911 #define TCG_14_0_ECX_FEATURES 0
912 #define TCG_SGX_12_0_EAX_FEATURES 0
913 #define TCG_SGX_12_0_EBX_FEATURES 0
914 #define TCG_SGX_12_1_EAX_FEATURES 0
915 #define TCG_24_0_EBX_FEATURES 0
916
917 #if defined CONFIG_USER_ONLY
918 #define CPUID_8000_0008_EBX_KERNEL_FEATURES (CPUID_8000_0008_EBX_IBPB | \
919 CPUID_8000_0008_EBX_IBRS | CPUID_8000_0008_EBX_STIBP | \
920 CPUID_8000_0008_EBX_STIBP_ALWAYS_ON | CPUID_8000_0008_EBX_AMD_SSBD | \
921 CPUID_8000_0008_EBX_AMD_PSFD)
922 #else
923 #define CPUID_8000_0008_EBX_KERNEL_FEATURES 0
924 #endif
925
926 #define TCG_8000_0008_EBX (CPUID_8000_0008_EBX_XSAVEERPTR | \
927 CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_KERNEL_FEATURES)
928
929 #if defined CONFIG_USER_ONLY
930 #define CPUID_8000_0021_EAX_KERNEL_FEATURES CPUID_8000_0021_EAX_AUTO_IBRS
931 #else
932 #define CPUID_8000_0021_EAX_KERNEL_FEATURES 0
933 #endif
934
935 #define TCG_8000_0021_EAX_FEATURES ( \
936 CPUID_8000_0021_EAX_NO_NESTED_DATA_BP | \
937 CPUID_8000_0021_EAX_NULL_SEL_CLR_BASE | \
938 CPUID_8000_0021_EAX_KERNEL_FEATURES)
939
940 FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
941 [FEAT_1_EDX] = {
942 .type = CPUID_FEATURE_WORD,
943 .feat_names = {
944 "fpu", "vme", "de", "pse",
945 "tsc", "msr", "pae", "mce",
946 "cx8", "apic", NULL, "sep",
947 "mtrr", "pge", "mca", "cmov",
948 "pat", "pse36", "pn" /* Intel psn */, "clflush" /* Intel clfsh */,
949 NULL, "ds" /* Intel dts */, "acpi", "mmx",
950 "fxsr", "sse", "sse2", "ss",
951 "ht" /* Intel htt */, "tm", "ia64", "pbe",
952 },
953 .cpuid = {.eax = 1, .reg = R_EDX, },
954 .tcg_features = TCG_FEATURES,
955 .no_autoenable_flags = CPUID_HT,
956 },
957 [FEAT_1_ECX] = {
958 .type = CPUID_FEATURE_WORD,
959 .feat_names = {
960 "pni" /* Intel,AMD sse3 */, "pclmulqdq", "dtes64", "monitor",
961 "ds-cpl", "vmx", "smx", "est",
962 "tm2", "ssse3", "cid", NULL,
963 "fma", "cx16", "xtpr", "pdcm",
964 NULL, "pcid", "dca", "sse4.1",
965 "sse4.2", "x2apic", "movbe", "popcnt",
966 "tsc-deadline", "aes", "xsave", NULL /* osxsave */,
967 "avx", "f16c", "rdrand", "hypervisor",
968 },
969 .cpuid = { .eax = 1, .reg = R_ECX, },
970 .tcg_features = TCG_EXT_FEATURES,
971 },
972 /* Feature names that are already defined on feature_name[] but
973 * are set on CPUID[8000_0001].EDX on AMD CPUs don't have their
974 * names on feat_names below. They are copied automatically
975 * to features[FEAT_8000_0001_EDX] if and only if CPU vendor is AMD.
976 */
977 [FEAT_8000_0001_EDX] = {
978 .type = CPUID_FEATURE_WORD,
979 .feat_names = {
980 NULL /* fpu */, NULL /* vme */, NULL /* de */, NULL /* pse */,
981 NULL /* tsc */, NULL /* msr */, NULL /* pae */, NULL /* mce */,
982 NULL /* cx8 */, NULL /* apic */, NULL, "syscall",
983 NULL /* mtrr */, NULL /* pge */, NULL /* mca */, NULL /* cmov */,
984 NULL /* pat */, NULL /* pse36 */, NULL, NULL /* Linux mp */,
985 "nx", NULL, "mmxext", NULL /* mmx */,
986 NULL /* fxsr */, "fxsr-opt", "pdpe1gb", "rdtscp",
987 NULL, "lm", "3dnowext", "3dnow",
988 },
989 .cpuid = { .eax = 0x80000001, .reg = R_EDX, },
990 .tcg_features = TCG_EXT2_FEATURES,
991 },
992 [FEAT_8000_0001_ECX] = {
993 .type = CPUID_FEATURE_WORD,
994 .feat_names = {
995 "lahf-lm", "cmp-legacy", "svm", "extapic",
996 "cr8legacy", "abm", "sse4a", "misalignsse",
997 "3dnowprefetch", "osvw", "ibs", "xop",
998 "skinit", "wdt", NULL, "lwp",
999 "fma4", "tce", NULL, "nodeid-msr",
1000 NULL, "tbm", "topoext", "perfctr-core",
1001 "perfctr-nb", NULL, NULL, NULL,
1002 NULL, NULL, NULL, NULL,
1003 },
1004 .cpuid = { .eax = 0x80000001, .reg = R_ECX, },
1005 .tcg_features = TCG_EXT3_FEATURES,
1006 /*
1007 * TOPOEXT is always allowed but can't be enabled blindly by
1008 * "-cpu host", as it requires consistent cache topology info
1009 * to be provided so it doesn't confuse guests.
1010 */
1011 .no_autoenable_flags = CPUID_EXT3_TOPOEXT,
1012 },
1013 [FEAT_C000_0001_EDX] = {
1014 .type = CPUID_FEATURE_WORD,
1015 .feat_names = {
1016 NULL, NULL, "xstore", "xstore-en",
1017 NULL, NULL, "xcrypt", "xcrypt-en",
1018 "ace2", "ace2-en", "phe", "phe-en",
1019 "pmm", "pmm-en", NULL, NULL,
1020 NULL, NULL, NULL, NULL,
1021 NULL, NULL, NULL, NULL,
1022 NULL, NULL, NULL, NULL,
1023 NULL, NULL, NULL, NULL,
1024 },
1025 .cpuid = { .eax = 0xC0000001, .reg = R_EDX, },
1026 .tcg_features = TCG_EXT4_FEATURES,
1027 },
1028 [FEAT_KVM] = {
1029 .type = CPUID_FEATURE_WORD,
1030 .feat_names = {
1031 "kvmclock", "kvm-nopiodelay", "kvm-mmu", "kvmclock",
1032 "kvm-asyncpf", "kvm-steal-time", "kvm-pv-eoi", "kvm-pv-unhalt",
1033 NULL, "kvm-pv-tlb-flush", "kvm-asyncpf-vmexit", "kvm-pv-ipi",
1034 "kvm-poll-control", "kvm-pv-sched-yield", "kvm-asyncpf-int", "kvm-msi-ext-dest-id",
1035 NULL, NULL, NULL, NULL,
1036 NULL, NULL, NULL, NULL,
1037 "kvmclock-stable-bit", NULL, NULL, NULL,
1038 NULL, NULL, NULL, NULL,
1039 },
1040 .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EAX, },
1041 .tcg_features = TCG_KVM_FEATURES,
1042 },
1043 [FEAT_KVM_HINTS] = {
1044 .type = CPUID_FEATURE_WORD,
1045 .feat_names = {
1046 "kvm-hint-dedicated", NULL, NULL, NULL,
1047 NULL, NULL, NULL, NULL,
1048 NULL, NULL, NULL, NULL,
1049 NULL, NULL, NULL, NULL,
1050 NULL, NULL, NULL, NULL,
1051 NULL, NULL, NULL, NULL,
1052 NULL, NULL, NULL, NULL,
1053 NULL, NULL, NULL, NULL,
1054 },
1055 .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EDX, },
1056 .tcg_features = TCG_KVM_FEATURES,
1057 /*
1058 * KVM hints aren't auto-enabled by -cpu host, they need to be
1059 * explicitly enabled in the command-line.
1060 */
1061 .no_autoenable_flags = ~0U,
1062 },
1063 [FEAT_SVM] = {
1064 .type = CPUID_FEATURE_WORD,
1065 .feat_names = {
1066 "npt", "lbrv", "svm-lock", "nrip-save",
1067 "tsc-scale", "vmcb-clean", "flushbyasid", "decodeassists",
1068 NULL, NULL, "pause-filter", NULL,
1069 "pfthreshold", "avic", NULL, "v-vmsave-vmload",
1070 "vgif", NULL, NULL, NULL,
1071 NULL, NULL, NULL, NULL,
1072 NULL, "vnmi", NULL, NULL,
1073 "svme-addr-chk", NULL, NULL, NULL,
1074 },
1075 .cpuid = { .eax = 0x8000000A, .reg = R_EDX, },
1076 .tcg_features = TCG_SVM_FEATURES,
1077 },
1078 [FEAT_7_0_EBX] = {
1079 .type = CPUID_FEATURE_WORD,
1080 .feat_names = {
1081 "fsgsbase", "tsc-adjust", "sgx", "bmi1",
1082 "hle", "avx2", "fdp-excptn-only", "smep",
1083 "bmi2", "erms", "invpcid", "rtm",
1084 NULL, "zero-fcs-fds", "mpx", NULL,
1085 "avx512f", "avx512dq", "rdseed", "adx",
1086 "smap", "avx512ifma", "pcommit", "clflushopt",
1087 "clwb", "intel-pt", "avx512pf", "avx512er",
1088 "avx512cd", "sha-ni", "avx512bw", "avx512vl",
1089 },
1090 .cpuid = {
1091 .eax = 7,
1092 .needs_ecx = true, .ecx = 0,
1093 .reg = R_EBX,
1094 },
1095 .tcg_features = TCG_7_0_EBX_FEATURES,
1096 },
1097 [FEAT_7_0_ECX] = {
1098 .type = CPUID_FEATURE_WORD,
1099 .feat_names = {
1100 NULL, "avx512vbmi", "umip", "pku",
1101 NULL /* ospke */, "waitpkg", "avx512vbmi2", NULL,
1102 "gfni", "vaes", "vpclmulqdq", "avx512vnni",
1103 "avx512bitalg", NULL, "avx512-vpopcntdq", NULL,
1104 "la57", NULL, NULL, NULL,
1105 NULL, NULL, "rdpid", NULL,
1106 "bus-lock-detect", "cldemote", NULL, "movdiri",
1107 "movdir64b", NULL, "sgxlc", "pks",
1108 },
1109 .cpuid = {
1110 .eax = 7,
1111 .needs_ecx = true, .ecx = 0,
1112 .reg = R_ECX,
1113 },
1114 .tcg_features = TCG_7_0_ECX_FEATURES,
1115 },
1116 [FEAT_7_0_EDX] = {
1117 .type = CPUID_FEATURE_WORD,
1118 .feat_names = {
1119 NULL, NULL, "avx512-4vnniw", "avx512-4fmaps",
1120 "fsrm", NULL, NULL, NULL,
1121 "avx512-vp2intersect", NULL, "md-clear", NULL,
1122 NULL, NULL, "serialize", NULL,
1123 "tsx-ldtrk", NULL, NULL /* pconfig */, "arch-lbr",
1124 NULL, NULL, "amx-bf16", "avx512-fp16",
1125 "amx-tile", "amx-int8", "spec-ctrl", "stibp",
1126 "flush-l1d", "arch-capabilities", "core-capability", "ssbd",
1127 },
1128 .cpuid = {
1129 .eax = 7,
1130 .needs_ecx = true, .ecx = 0,
1131 .reg = R_EDX,
1132 },
1133 .tcg_features = TCG_7_0_EDX_FEATURES,
1134 },
1135 [FEAT_7_1_EAX] = {
1136 .type = CPUID_FEATURE_WORD,
1137 .feat_names = {
1138 "sha512", "sm3", "sm4", NULL,
1139 "avx-vnni", "avx512-bf16", NULL, "cmpccxadd",
1140 NULL, NULL, "fzrm", "fsrs",
1141 "fsrc", NULL, NULL, NULL,
1142 NULL, "fred", "lkgs", "wrmsrns",
1143 NULL, "amx-fp16", NULL, "avx-ifma",
1144 NULL, NULL, "lam", NULL,
1145 NULL, NULL, NULL, NULL,
1146 },
1147 .cpuid = {
1148 .eax = 7,
1149 .needs_ecx = true, .ecx = 1,
1150 .reg = R_EAX,
1151 },
1152 .tcg_features = TCG_7_1_EAX_FEATURES,
1153 },
1154 [FEAT_7_1_ECX] = {
1155 .type = CPUID_FEATURE_WORD,
1156 .feat_names = {
1157 NULL, NULL, NULL, NULL,
1158 NULL, "msr-imm", NULL, NULL,
1159 NULL, NULL, NULL, NULL,
1160 NULL, NULL, NULL, NULL,
1161 NULL, NULL, NULL, NULL,
1162 NULL, NULL, NULL, NULL,
1163 NULL, NULL, NULL, NULL,
1164 NULL, NULL, NULL, NULL,
1165 },
1166 .cpuid = {
1167 .eax = 7,
1168 .needs_ecx = true, .ecx = 1,
1169 .reg = R_ECX,
1170 },
1171 .tcg_features = TCG_7_1_ECX_FEATURES,
1172 },
1173 [FEAT_7_1_EDX] = {
1174 .type = CPUID_FEATURE_WORD,
1175 .feat_names = {
1176 NULL, NULL, NULL, NULL,
1177 "avx-vnni-int8", "avx-ne-convert", NULL, NULL,
1178 "amx-complex", NULL, "avx-vnni-int16", NULL,
1179 NULL, NULL, "prefetchiti", NULL,
1180 NULL, NULL, NULL, "avx10",
1181 NULL, NULL, NULL, NULL,
1182 NULL, NULL, NULL, NULL,
1183 NULL, NULL, NULL, NULL,
1184 },
1185 .cpuid = {
1186 .eax = 7,
1187 .needs_ecx = true, .ecx = 1,
1188 .reg = R_EDX,
1189 },
1190 .tcg_features = TCG_7_1_EDX_FEATURES,
1191 },
1192 [FEAT_7_2_EDX] = {
1193 .type = CPUID_FEATURE_WORD,
1194 .feat_names = {
1195 "intel-psfd", "ipred-ctrl", "rrsba-ctrl", "ddpd-u",
1196 "bhi-ctrl", "mcdt-no", NULL, NULL,
1197 NULL, NULL, NULL, NULL,
1198 NULL, NULL, NULL, NULL,
1199 NULL, NULL, NULL, NULL,
1200 NULL, NULL, NULL, NULL,
1201 NULL, NULL, NULL, NULL,
1202 NULL, NULL, NULL, NULL,
1203 },
1204 .cpuid = {
1205 .eax = 7,
1206 .needs_ecx = true, .ecx = 2,
1207 .reg = R_EDX,
1208 },
1209 .tcg_features = TCG_7_2_EDX_FEATURES,
1210 },
1211 [FEAT_24_0_EBX] = {
1212 .type = CPUID_FEATURE_WORD,
1213 .feat_names = {
1214 [16] = "avx10-128",
1215 [17] = "avx10-256",
1216 [18] = "avx10-512",
1217 },
1218 .cpuid = {
1219 .eax = 0x24,
1220 .needs_ecx = true, .ecx = 0,
1221 .reg = R_EBX,
1222 },
1223 .tcg_features = TCG_24_0_EBX_FEATURES,
1224 },
1225 [FEAT_8000_0007_EDX] = {
1226 .type = CPUID_FEATURE_WORD,
1227 .feat_names = {
1228 NULL, NULL, NULL, NULL,
1229 NULL, NULL, NULL, NULL,
1230 "invtsc", NULL, NULL, NULL,
1231 NULL, NULL, NULL, NULL,
1232 NULL, NULL, NULL, NULL,
1233 NULL, NULL, NULL, NULL,
1234 NULL, NULL, NULL, NULL,
1235 NULL, NULL, NULL, NULL,
1236 },
1237 .cpuid = { .eax = 0x80000007, .reg = R_EDX, },
1238 .tcg_features = TCG_APM_FEATURES,
1239 .unmigratable_flags = CPUID_APM_INVTSC,
1240 },
1241 [FEAT_8000_0007_EBX] = {
1242 .type = CPUID_FEATURE_WORD,
1243 .feat_names = {
1244 "overflow-recov", "succor", NULL, NULL,
1245 NULL, NULL, NULL, NULL,
1246 NULL, NULL, NULL, NULL,
1247 NULL, NULL, NULL, NULL,
1248 NULL, NULL, NULL, NULL,
1249 NULL, NULL, NULL, NULL,
1250 NULL, NULL, NULL, NULL,
1251 NULL, NULL, NULL, NULL,
1252 },
1253 .cpuid = { .eax = 0x80000007, .reg = R_EBX, },
1254 .tcg_features = 0,
1255 .unmigratable_flags = 0,
1256 },
1257 [FEAT_8000_0008_EBX] = {
1258 .type = CPUID_FEATURE_WORD,
1259 .feat_names = {
1260 "clzero", NULL, "xsaveerptr", NULL,
1261 NULL, NULL, NULL, NULL,
1262 NULL, "wbnoinvd", NULL, NULL,
1263 "ibpb", NULL, "ibrs", "amd-stibp",
1264 NULL, "stibp-always-on", NULL, NULL,
1265 NULL, NULL, NULL, NULL,
1266 "amd-ssbd", "virt-ssbd", "amd-no-ssb", NULL,
1267 "amd-psfd", NULL, NULL, NULL,
1268 },
1269 .cpuid = { .eax = 0x80000008, .reg = R_EBX, },
1270 .tcg_features = TCG_8000_0008_EBX,
1271 .unmigratable_flags = 0,
1272 },
1273 [FEAT_8000_0021_EAX] = {
1274 .type = CPUID_FEATURE_WORD,
1275 .feat_names = {
1276 "no-nested-data-bp", "fs-gs-base-ns", "lfence-always-serializing", NULL,
1277 NULL, NULL, "null-sel-clr-base", NULL,
1278 "auto-ibrs", NULL, NULL, NULL,
1279 NULL, NULL, NULL, NULL,
1280 NULL, NULL, NULL, NULL,
1281 "prefetchi", NULL, NULL, NULL,
1282 "eraps", NULL, NULL, "sbpb",
1283 "ibpb-brtype", "srso-no", "srso-user-kernel-no", NULL,
1284 },
1285 .cpuid = { .eax = 0x80000021, .reg = R_EAX, },
1286 .tcg_features = TCG_8000_0021_EAX_FEATURES,
1287 .unmigratable_flags = 0,
1288 },
1289 [FEAT_8000_0021_EBX] = {
1290 .type = CPUID_FEATURE_WORD,
1291 .cpuid = { .eax = 0x80000021, .reg = R_EBX, },
1292 .tcg_features = 0,
1293 .unmigratable_flags = 0,
1294 },
1295 [FEAT_8000_0022_EAX] = {
1296 .type = CPUID_FEATURE_WORD,
1297 .feat_names = {
1298 "perfmon-v2", NULL, NULL, NULL,
1299 NULL, NULL, NULL, NULL,
1300 NULL, NULL, NULL, NULL,
1301 NULL, NULL, NULL, NULL,
1302 NULL, NULL, NULL, NULL,
1303 NULL, NULL, NULL, NULL,
1304 NULL, NULL, NULL, NULL,
1305 NULL, NULL, NULL, NULL,
1306 },
1307 .cpuid = { .eax = 0x80000022, .reg = R_EAX, },
1308 .tcg_features = 0,
1309 .unmigratable_flags = 0,
1310 },
1311 [FEAT_XSAVE] = {
1312 .type = CPUID_FEATURE_WORD,
1313 .feat_names = {
1314 "xsaveopt", "xsavec", "xgetbv1", "xsaves",
1315 "xfd", NULL, NULL, NULL,
1316 NULL, NULL, NULL, NULL,
1317 NULL, NULL, NULL, NULL,
1318 NULL, NULL, NULL, NULL,
1319 NULL, NULL, NULL, NULL,
1320 NULL, NULL, NULL, NULL,
1321 NULL, NULL, NULL, NULL,
1322 },
1323 .cpuid = {
1324 .eax = 0xd,
1325 .needs_ecx = true, .ecx = 1,
1326 .reg = R_EAX,
1327 },
1328 .tcg_features = TCG_XSAVE_FEATURES,
1329 },
1330 [FEAT_XSAVE_XSS_LO] = {
1331 .type = CPUID_FEATURE_WORD,
1332 .feat_names = {
1333 NULL, NULL, NULL, NULL,
1334 NULL, NULL, NULL, NULL,
1335 NULL, NULL, NULL, NULL,
1336 NULL, NULL, NULL, NULL,
1337 NULL, NULL, NULL, NULL,
1338 NULL, NULL, NULL, NULL,
1339 NULL, NULL, NULL, NULL,
1340 NULL, NULL, NULL, NULL,
1341 },
1342 .cpuid = {
1343 .eax = 0xD,
1344 .needs_ecx = true,
1345 .ecx = 1,
1346 .reg = R_ECX,
1347 },
1348 },
1349 [FEAT_XSAVE_XSS_HI] = {
1350 .type = CPUID_FEATURE_WORD,
1351 .cpuid = {
1352 .eax = 0xD,
1353 .needs_ecx = true,
1354 .ecx = 1,
1355 .reg = R_EDX
1356 },
1357 },
1358 [FEAT_6_EAX] = {
1359 .type = CPUID_FEATURE_WORD,
1360 .feat_names = {
1361 NULL, NULL, "arat", NULL,
1362 NULL, NULL, NULL, NULL,
1363 NULL, NULL, NULL, NULL,
1364 NULL, NULL, NULL, NULL,
1365 NULL, NULL, NULL, NULL,
1366 NULL, NULL, NULL, NULL,
1367 NULL, NULL, NULL, NULL,
1368 NULL, NULL, NULL, NULL,
1369 },
1370 .cpuid = { .eax = 6, .reg = R_EAX, },
1371 .tcg_features = TCG_6_EAX_FEATURES,
1372 },
1373 [FEAT_XSAVE_XCR0_LO] = {
1374 .type = CPUID_FEATURE_WORD,
1375 .cpuid = {
1376 .eax = 0xD,
1377 .needs_ecx = true, .ecx = 0,
1378 .reg = R_EAX,
1379 },
1380 .tcg_features = XSTATE_FP_MASK | XSTATE_SSE_MASK |
1381 XSTATE_YMM_MASK | XSTATE_BNDREGS_MASK | XSTATE_BNDCSR_MASK |
1382 XSTATE_PKRU_MASK,
1383 .migratable_flags = XSTATE_FP_MASK | XSTATE_SSE_MASK |
1384 XSTATE_YMM_MASK | XSTATE_BNDREGS_MASK | XSTATE_BNDCSR_MASK |
1385 XSTATE_OPMASK_MASK | XSTATE_ZMM_Hi256_MASK | XSTATE_Hi16_ZMM_MASK |
1386 XSTATE_PKRU_MASK,
1387 },
1388 [FEAT_XSAVE_XCR0_HI] = {
1389 .type = CPUID_FEATURE_WORD,
1390 .cpuid = {
1391 .eax = 0xD,
1392 .needs_ecx = true, .ecx = 0,
1393 .reg = R_EDX,
1394 },
1395 .tcg_features = 0U,
1396 },
1397 /*Below are MSR exposed features*/
1398 [FEAT_ARCH_CAPABILITIES] = {
1399 .type = MSR_FEATURE_WORD,
1400 .feat_names = {
1401 "rdctl-no", "ibrs-all", "rsba", "skip-l1dfl-vmentry",
1402 "ssb-no", "mds-no", "pschange-mc-no", "tsx-ctrl",
1403 "taa-no", NULL, NULL, NULL,
1404 NULL, "sbdr-ssdp-no", "fbsdp-no", "psdp-no",
1405 NULL, "fb-clear", NULL, NULL,
1406 "bhi-no", NULL, NULL, NULL,
1407 "pbrsb-no", NULL, "gds-no", "rfds-no",
1408 "rfds-clear", NULL, NULL, NULL,
1409 NULL, NULL, NULL, NULL,
1410 NULL, NULL, NULL, NULL,
1411 NULL, NULL, NULL, NULL,
1412 NULL, NULL, NULL, NULL,
1413 NULL, NULL, NULL, NULL,
1414 NULL, NULL, NULL, NULL,
1415 NULL, NULL, NULL, NULL,
1416 NULL, NULL, "its-no", NULL,
1417 },
1418 .msr = {
1419 .index = MSR_IA32_ARCH_CAPABILITIES,
1420 },
1421 /*
1422 * FEAT_ARCH_CAPABILITIES only affects a read-only MSR, which
1423 * cannot be read from user mode. Therefore, it has no impact
1424 > on any user-mode operation, and warnings about unsupported
1425 * features do not matter.
1426 */
1427 .tcg_features = ~0U,
1428 },
1429 [FEAT_CORE_CAPABILITY] = {
1430 .type = MSR_FEATURE_WORD,
1431 .feat_names = {
1432 NULL, NULL, NULL, NULL,
1433 NULL, "split-lock-detect", NULL, NULL,
1434 NULL, NULL, NULL, NULL,
1435 NULL, NULL, NULL, NULL,
1436 NULL, NULL, NULL, NULL,
1437 NULL, NULL, NULL, NULL,
1438 NULL, NULL, NULL, NULL,
1439 NULL, NULL, NULL, NULL,
1440 },
1441 .msr = {
1442 .index = MSR_IA32_CORE_CAPABILITY,
1443 },
1444 },
1445 [FEAT_PERF_CAPABILITIES] = {
1446 .type = MSR_FEATURE_WORD,
1447 .feat_names = {
1448 NULL, NULL, NULL, NULL,
1449 NULL, NULL, NULL, NULL,
1450 NULL, NULL, NULL, NULL,
1451 NULL, "full-width-write", NULL, NULL,
1452 NULL, NULL, NULL, NULL,
1453 NULL, NULL, NULL, NULL,
1454 NULL, NULL, NULL, NULL,
1455 NULL, NULL, NULL, NULL,
1456 },
1457 .msr = {
1458 .index = MSR_IA32_PERF_CAPABILITIES,
1459 },
1460 },
1461
1462 [FEAT_VMX_PROCBASED_CTLS] = {
1463 .type = MSR_FEATURE_WORD,
1464 .feat_names = {
1465 NULL, NULL, "vmx-vintr-pending", "vmx-tsc-offset",
1466 NULL, NULL, NULL, "vmx-hlt-exit",
1467 NULL, "vmx-invlpg-exit", "vmx-mwait-exit", "vmx-rdpmc-exit",
1468 "vmx-rdtsc-exit", NULL, NULL, "vmx-cr3-load-noexit",
1469 "vmx-cr3-store-noexit", NULL, NULL, "vmx-cr8-load-exit",
1470 "vmx-cr8-store-exit", "vmx-flexpriority", "vmx-vnmi-pending", "vmx-movdr-exit",
1471 "vmx-io-exit", "vmx-io-bitmap", NULL, "vmx-mtf",
1472 "vmx-msr-bitmap", "vmx-monitor-exit", "vmx-pause-exit", "vmx-secondary-ctls",
1473 },
1474 .msr = {
1475 .index = MSR_IA32_VMX_TRUE_PROCBASED_CTLS,
1476 }
1477 },
1478
1479 [FEAT_VMX_SECONDARY_CTLS] = {
1480 .type = MSR_FEATURE_WORD,
1481 .feat_names = {
1482 "vmx-apicv-xapic", "vmx-ept", "vmx-desc-exit", "vmx-rdtscp-exit",
1483 "vmx-apicv-x2apic", "vmx-vpid", "vmx-wbinvd-exit", "vmx-unrestricted-guest",
1484 "vmx-apicv-register", "vmx-apicv-vid", "vmx-ple", "vmx-rdrand-exit",
1485 "vmx-invpcid-exit", "vmx-vmfunc", "vmx-shadow-vmcs", "vmx-encls-exit",
1486 "vmx-rdseed-exit", "vmx-pml", NULL, NULL,
1487 "vmx-xsaves", NULL, NULL, NULL,
1488 NULL, "vmx-tsc-scaling", "vmx-enable-user-wait-pause", NULL,
1489 NULL, NULL, NULL, NULL,
1490 },
1491 .msr = {
1492 .index = MSR_IA32_VMX_PROCBASED_CTLS2,
1493 }
1494 },
1495
1496 [FEAT_VMX_PINBASED_CTLS] = {
1497 .type = MSR_FEATURE_WORD,
1498 .feat_names = {
1499 "vmx-intr-exit", NULL, NULL, "vmx-nmi-exit",
1500 NULL, "vmx-vnmi", "vmx-preemption-timer", "vmx-posted-intr",
1501 NULL, NULL, NULL, NULL,
1502 NULL, NULL, NULL, NULL,
1503 NULL, NULL, NULL, NULL,
1504 NULL, NULL, NULL, NULL,
1505 NULL, NULL, NULL, NULL,
1506 NULL, NULL, NULL, NULL,
1507 },
1508 .msr = {
1509 .index = MSR_IA32_VMX_TRUE_PINBASED_CTLS,
1510 }
1511 },
1512
1513 [FEAT_VMX_EXIT_CTLS] = {
1514 .type = MSR_FEATURE_WORD,
1515 /*
1516 * VMX_VM_EXIT_HOST_ADDR_SPACE_SIZE is copied from
1517 * the LM CPUID bit.
1518 */
1519 .feat_names = {
1520 NULL, NULL, "vmx-exit-nosave-debugctl", NULL,
1521 NULL, NULL, NULL, NULL,
1522 NULL, NULL /* vmx-exit-host-addr-space-size */, NULL, NULL,
1523 "vmx-exit-load-perf-global-ctrl", NULL, NULL, "vmx-exit-ack-intr",
1524 NULL, NULL, "vmx-exit-save-pat", "vmx-exit-load-pat",
1525 "vmx-exit-save-efer", "vmx-exit-load-efer",
1526 "vmx-exit-save-preemption-timer", "vmx-exit-clear-bndcfgs",
1527 NULL, "vmx-exit-clear-rtit-ctl", NULL, NULL,
1528 NULL, "vmx-exit-load-pkrs", NULL, "vmx-exit-secondary-ctls",
1529 },
1530 .msr = {
1531 .index = MSR_IA32_VMX_TRUE_EXIT_CTLS,
1532 }
1533 },
1534
1535 [FEAT_VMX_ENTRY_CTLS] = {
1536 .type = MSR_FEATURE_WORD,
1537 .feat_names = {
1538 NULL, NULL, "vmx-entry-noload-debugctl", NULL,
1539 NULL, NULL, NULL, NULL,
1540 NULL, "vmx-entry-ia32e-mode", NULL, NULL,
1541 NULL, "vmx-entry-load-perf-global-ctrl", "vmx-entry-load-pat", "vmx-entry-load-efer",
1542 "vmx-entry-load-bndcfgs", NULL, "vmx-entry-load-rtit-ctl", NULL,
1543 NULL, NULL, "vmx-entry-load-pkrs", "vmx-entry-load-fred",
1544 NULL, NULL, NULL, NULL,
1545 NULL, NULL, NULL, NULL,
1546 },
1547 .msr = {
1548 .index = MSR_IA32_VMX_TRUE_ENTRY_CTLS,
1549 }
1550 },
1551
1552 [FEAT_VMX_MISC] = {
1553 .type = MSR_FEATURE_WORD,
1554 .feat_names = {
1555 NULL, NULL, NULL, NULL,
1556 NULL, "vmx-store-lma", "vmx-activity-hlt", "vmx-activity-shutdown",
1557 "vmx-activity-wait-sipi", NULL, NULL, NULL,
1558 NULL, NULL, NULL, NULL,
1559 NULL, NULL, NULL, NULL,
1560 NULL, NULL, NULL, NULL,
1561 NULL, NULL, NULL, NULL,
1562 NULL, "vmx-vmwrite-vmexit-fields", "vmx-zero-len-inject", NULL,
1563 },
1564 .msr = {
1565 .index = MSR_IA32_VMX_MISC,
1566 }
1567 },
1568
1569 [FEAT_VMX_EPT_VPID_CAPS] = {
1570 .type = MSR_FEATURE_WORD,
1571 .feat_names = {
1572 "vmx-ept-execonly", NULL, NULL, NULL,
1573 NULL, NULL, "vmx-page-walk-4", "vmx-page-walk-5",
1574 NULL, NULL, NULL, NULL,
1575 NULL, NULL, NULL, NULL,
1576 "vmx-ept-2mb", "vmx-ept-1gb", NULL, NULL,
1577 "vmx-invept", "vmx-eptad", "vmx-ept-advanced-exitinfo", NULL,
1578 NULL, "vmx-invept-single-context", "vmx-invept-all-context", NULL,
1579 NULL, NULL, NULL, NULL,
1580 "vmx-invvpid", NULL, NULL, NULL,
1581 NULL, NULL, NULL, NULL,
1582 "vmx-invvpid-single-addr", "vmx-invept-single-context",
1583 "vmx-invvpid-all-context", "vmx-invept-single-context-noglobals",
1584 NULL, NULL, NULL, NULL,
1585 NULL, NULL, NULL, NULL,
1586 NULL, NULL, NULL, NULL,
1587 NULL, NULL, NULL, NULL,
1588 NULL, NULL, NULL, NULL,
1589 },
1590 .msr = {
1591 .index = MSR_IA32_VMX_EPT_VPID_CAP,
1592 }
1593 },
1594
1595 [FEAT_VMX_BASIC] = {
1596 .type = MSR_FEATURE_WORD,
1597 .feat_names = {
1598 [54] = "vmx-ins-outs",
1599 [55] = "vmx-true-ctls",
1600 [56] = "vmx-any-errcode",
1601 [58] = "vmx-nested-exception",
1602 },
1603 .msr = {
1604 .index = MSR_IA32_VMX_BASIC,
1605 },
1606 /* Just to be safe - we don't support setting the MSEG version field. */
1607 .no_autoenable_flags = MSR_VMX_BASIC_DUAL_MONITOR,
1608 },
1609
1610 [FEAT_VMX_VMFUNC] = {
1611 .type = MSR_FEATURE_WORD,
1612 .feat_names = {
1613 [0] = "vmx-eptp-switching",
1614 },
1615 .msr = {
1616 .index = MSR_IA32_VMX_VMFUNC,
1617 }
1618 },
1619
1620 [FEAT_14_0_ECX] = {
1621 .type = CPUID_FEATURE_WORD,
1622 .feat_names = {
1623 NULL, NULL, NULL, NULL,
1624 NULL, NULL, NULL, NULL,
1625 NULL, NULL, NULL, NULL,
1626 NULL, NULL, NULL, NULL,
1627 NULL, NULL, NULL, NULL,
1628 NULL, NULL, NULL, NULL,
1629 NULL, NULL, NULL, NULL,
1630 NULL, NULL, NULL, "intel-pt-lip",
1631 },
1632 .cpuid = {
1633 .eax = 0x14,
1634 .needs_ecx = true, .ecx = 0,
1635 .reg = R_ECX,
1636 },
1637 .tcg_features = TCG_14_0_ECX_FEATURES,
1638 },
1639
1640 [FEAT_SGX_12_0_EAX] = {
1641 .type = CPUID_FEATURE_WORD,
1642 .feat_names = {
1643 "sgx1", "sgx2", NULL, NULL,
1644 NULL, NULL, NULL, NULL,
1645 NULL, NULL, NULL, "sgx-edeccssa",
1646 NULL, NULL, NULL, NULL,
1647 NULL, NULL, NULL, NULL,
1648 NULL, NULL, NULL, NULL,
1649 NULL, NULL, NULL, NULL,
1650 NULL, NULL, NULL, NULL,
1651 },
1652 .cpuid = {
1653 .eax = 0x12,
1654 .needs_ecx = true, .ecx = 0,
1655 .reg = R_EAX,
1656 },
1657 .tcg_features = TCG_SGX_12_0_EAX_FEATURES,
1658 },
1659
1660 [FEAT_SGX_12_0_EBX] = {
1661 .type = CPUID_FEATURE_WORD,
1662 .feat_names = {
1663 "sgx-exinfo" , NULL, NULL, NULL,
1664 NULL, NULL, NULL, NULL,
1665 NULL, NULL, NULL, NULL,
1666 NULL, NULL, NULL, NULL,
1667 NULL, NULL, NULL, NULL,
1668 NULL, NULL, NULL, NULL,
1669 NULL, NULL, NULL, NULL,
1670 NULL, NULL, NULL, NULL,
1671 },
1672 .cpuid = {
1673 .eax = 0x12,
1674 .needs_ecx = true, .ecx = 0,
1675 .reg = R_EBX,
1676 },
1677 .tcg_features = TCG_SGX_12_0_EBX_FEATURES,
1678 },
1679
1680 [FEAT_SGX_12_1_EAX] = {
1681 .type = CPUID_FEATURE_WORD,
1682 .feat_names = {
1683 NULL, "sgx-debug", "sgx-mode64", NULL,
1684 "sgx-provisionkey", "sgx-tokenkey", NULL, "sgx-kss",
1685 NULL, NULL, "sgx-aex-notify", NULL,
1686 NULL, NULL, NULL, NULL,
1687 NULL, NULL, NULL, NULL,
1688 NULL, NULL, NULL, NULL,
1689 NULL, NULL, NULL, NULL,
1690 NULL, NULL, NULL, NULL,
1691 },
1692 .cpuid = {
1693 .eax = 0x12,
1694 .needs_ecx = true, .ecx = 1,
1695 .reg = R_EAX,
1696 },
1697 .tcg_features = TCG_SGX_12_1_EAX_FEATURES,
1698 },
1699 };
1700
is_feature_word_cpuid(uint32_t feature,uint32_t index,int reg)1701 bool is_feature_word_cpuid(uint32_t feature, uint32_t index, int reg)
1702 {
1703 FeatureWordInfo *wi;
1704 FeatureWord w;
1705
1706 for (w = 0; w < FEATURE_WORDS; w++) {
1707 wi = &feature_word_info[w];
1708 if (wi->type == CPUID_FEATURE_WORD && wi->cpuid.eax == feature &&
1709 (!wi->cpuid.needs_ecx || wi->cpuid.ecx == index) &&
1710 wi->cpuid.reg == reg) {
1711 return true;
1712 }
1713 }
1714 return false;
1715 }
1716
1717 static FeatureDep feature_dependencies[] = {
1718 {
1719 .from = { FEAT_7_0_EDX, CPUID_7_0_EDX_ARCH_CAPABILITIES },
1720 .to = { FEAT_ARCH_CAPABILITIES, ~0ull },
1721 },
1722 {
1723 .from = { FEAT_7_0_EDX, CPUID_7_0_EDX_CORE_CAPABILITY },
1724 .to = { FEAT_CORE_CAPABILITY, ~0ull },
1725 },
1726 {
1727 .from = { FEAT_1_ECX, CPUID_EXT_PDCM },
1728 .to = { FEAT_PERF_CAPABILITIES, ~0ull },
1729 },
1730 {
1731 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1732 .to = { FEAT_VMX_PROCBASED_CTLS, ~0ull },
1733 },
1734 {
1735 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1736 .to = { FEAT_VMX_PINBASED_CTLS, ~0ull },
1737 },
1738 {
1739 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1740 .to = { FEAT_VMX_EXIT_CTLS, ~0ull },
1741 },
1742 {
1743 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1744 .to = { FEAT_VMX_ENTRY_CTLS, ~0ull },
1745 },
1746 {
1747 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1748 .to = { FEAT_VMX_MISC, ~0ull },
1749 },
1750 {
1751 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1752 .to = { FEAT_VMX_BASIC, ~0ull },
1753 },
1754 {
1755 .from = { FEAT_8000_0001_EDX, CPUID_EXT2_LM },
1756 .to = { FEAT_VMX_ENTRY_CTLS, VMX_VM_ENTRY_IA32E_MODE },
1757 },
1758 {
1759 .from = { FEAT_VMX_PROCBASED_CTLS, VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS },
1760 .to = { FEAT_VMX_SECONDARY_CTLS, ~0ull },
1761 },
1762 {
1763 .from = { FEAT_XSAVE, CPUID_XSAVE_XSAVES },
1764 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_XSAVES },
1765 },
1766 {
1767 .from = { FEAT_1_ECX, CPUID_EXT_RDRAND },
1768 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDRAND_EXITING },
1769 },
1770 {
1771 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_INVPCID },
1772 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_INVPCID },
1773 },
1774 {
1775 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_MPX },
1776 .to = { FEAT_VMX_EXIT_CTLS, VMX_VM_EXIT_CLEAR_BNDCFGS },
1777 },
1778 {
1779 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_MPX },
1780 .to = { FEAT_VMX_ENTRY_CTLS, VMX_VM_ENTRY_LOAD_BNDCFGS },
1781 },
1782 {
1783 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_RDSEED },
1784 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDSEED_EXITING },
1785 },
1786 {
1787 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_INTEL_PT },
1788 .to = { FEAT_14_0_ECX, ~0ull },
1789 },
1790 {
1791 .from = { FEAT_8000_0001_EDX, CPUID_EXT2_RDTSCP },
1792 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDTSCP },
1793 },
1794 {
1795 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_EPT },
1796 .to = { FEAT_VMX_EPT_VPID_CAPS, 0xffffffffull },
1797 },
1798 {
1799 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_EPT },
1800 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST },
1801 },
1802 {
1803 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_VPID },
1804 .to = { FEAT_VMX_EPT_VPID_CAPS, 0xffffffffull << 32 },
1805 },
1806 {
1807 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_VMFUNC },
1808 .to = { FEAT_VMX_VMFUNC, ~0ull },
1809 },
1810 {
1811 .from = { FEAT_8000_0001_ECX, CPUID_EXT3_SVM },
1812 .to = { FEAT_SVM, ~0ull },
1813 },
1814 {
1815 .from = { FEAT_7_0_ECX, CPUID_7_0_ECX_WAITPKG },
1816 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_USER_WAIT_PAUSE },
1817 },
1818 {
1819 .from = { FEAT_8000_0001_EDX, CPUID_EXT2_LM },
1820 .to = { FEAT_7_1_EAX, CPUID_7_1_EAX_FRED },
1821 },
1822 {
1823 .from = { FEAT_7_1_EAX, CPUID_7_1_EAX_LKGS },
1824 .to = { FEAT_7_1_EAX, CPUID_7_1_EAX_FRED },
1825 },
1826 {
1827 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_SGX },
1828 .to = { FEAT_7_0_ECX, CPUID_7_0_ECX_SGX_LC },
1829 },
1830 {
1831 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_SGX },
1832 .to = { FEAT_SGX_12_0_EAX, ~0ull },
1833 },
1834 {
1835 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_SGX },
1836 .to = { FEAT_SGX_12_0_EBX, ~0ull },
1837 },
1838 {
1839 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_SGX },
1840 .to = { FEAT_SGX_12_1_EAX, ~0ull },
1841 },
1842 {
1843 .from = { FEAT_24_0_EBX, CPUID_24_0_EBX_AVX10_128 },
1844 .to = { FEAT_24_0_EBX, CPUID_24_0_EBX_AVX10_256 },
1845 },
1846 {
1847 .from = { FEAT_24_0_EBX, CPUID_24_0_EBX_AVX10_256 },
1848 .to = { FEAT_24_0_EBX, CPUID_24_0_EBX_AVX10_512 },
1849 },
1850 {
1851 .from = { FEAT_24_0_EBX, CPUID_24_0_EBX_AVX10_VL_MASK },
1852 .to = { FEAT_7_1_EDX, CPUID_7_1_EDX_AVX10 },
1853 },
1854 {
1855 .from = { FEAT_7_1_EDX, CPUID_7_1_EDX_AVX10 },
1856 .to = { FEAT_24_0_EBX, ~0ull },
1857 },
1858 };
1859
1860 typedef struct X86RegisterInfo32 {
1861 /* Name of register */
1862 const char *name;
1863 /* QAPI enum value register */
1864 X86CPURegister32 qapi_enum;
1865 } X86RegisterInfo32;
1866
1867 #define REGISTER(reg) \
1868 [R_##reg] = { .name = #reg, .qapi_enum = X86_CPU_REGISTER32_##reg }
1869 static const X86RegisterInfo32 x86_reg_info_32[CPU_NB_REGS32] = {
1870 REGISTER(EAX),
1871 REGISTER(ECX),
1872 REGISTER(EDX),
1873 REGISTER(EBX),
1874 REGISTER(ESP),
1875 REGISTER(EBP),
1876 REGISTER(ESI),
1877 REGISTER(EDI),
1878 };
1879 #undef REGISTER
1880
1881 ExtSaveArea x86_ext_save_areas[XSAVE_STATE_AREA_COUNT] = {
1882 [XSTATE_FP_BIT] = {
1883 /* x87 FP state component is always enabled if XSAVE is supported */
1884 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
1885 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1886 },
1887 [XSTATE_SSE_BIT] = {
1888 /* SSE state component is always enabled if XSAVE is supported */
1889 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
1890 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1891 },
1892 [XSTATE_YMM_BIT] =
1893 { .feature = FEAT_1_ECX, .bits = CPUID_EXT_AVX,
1894 .size = sizeof(XSaveAVX) },
1895 [XSTATE_BNDREGS_BIT] =
1896 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
1897 .size = sizeof(XSaveBNDREG) },
1898 [XSTATE_BNDCSR_BIT] =
1899 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
1900 .size = sizeof(XSaveBNDCSR) },
1901 [XSTATE_OPMASK_BIT] =
1902 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1903 .size = sizeof(XSaveOpmask) },
1904 [XSTATE_ZMM_Hi256_BIT] =
1905 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1906 .size = sizeof(XSaveZMM_Hi256) },
1907 [XSTATE_Hi16_ZMM_BIT] =
1908 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1909 .size = sizeof(XSaveHi16_ZMM) },
1910 [XSTATE_PKRU_BIT] =
1911 { .feature = FEAT_7_0_ECX, .bits = CPUID_7_0_ECX_PKU,
1912 .size = sizeof(XSavePKRU) },
1913 [XSTATE_ARCH_LBR_BIT] = {
1914 .feature = FEAT_7_0_EDX, .bits = CPUID_7_0_EDX_ARCH_LBR,
1915 .offset = 0 /*supervisor mode component, offset = 0 */,
1916 .size = sizeof(XSavesArchLBR) },
1917 [XSTATE_XTILE_CFG_BIT] = {
1918 .feature = FEAT_7_0_EDX, .bits = CPUID_7_0_EDX_AMX_TILE,
1919 .size = sizeof(XSaveXTILECFG),
1920 },
1921 [XSTATE_XTILE_DATA_BIT] = {
1922 .feature = FEAT_7_0_EDX, .bits = CPUID_7_0_EDX_AMX_TILE,
1923 .size = sizeof(XSaveXTILEDATA)
1924 },
1925 };
1926
xsave_area_size(uint64_t mask,bool compacted)1927 uint32_t xsave_area_size(uint64_t mask, bool compacted)
1928 {
1929 uint64_t ret = x86_ext_save_areas[0].size;
1930 const ExtSaveArea *esa;
1931 uint32_t offset = 0;
1932 int i;
1933
1934 for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
1935 esa = &x86_ext_save_areas[i];
1936 if ((mask >> i) & 1) {
1937 offset = compacted ? ret : esa->offset;
1938 ret = MAX(ret, offset + esa->size);
1939 }
1940 }
1941 return ret;
1942 }
1943
accel_uses_host_cpuid(void)1944 static inline bool accel_uses_host_cpuid(void)
1945 {
1946 return kvm_enabled() || hvf_enabled();
1947 }
1948
x86_cpu_xsave_xcr0_components(X86CPU * cpu)1949 static inline uint64_t x86_cpu_xsave_xcr0_components(X86CPU *cpu)
1950 {
1951 return ((uint64_t)cpu->env.features[FEAT_XSAVE_XCR0_HI]) << 32 |
1952 cpu->env.features[FEAT_XSAVE_XCR0_LO];
1953 }
1954
1955 /* Return name of 32-bit register, from a R_* constant */
get_register_name_32(unsigned int reg)1956 static const char *get_register_name_32(unsigned int reg)
1957 {
1958 if (reg >= CPU_NB_REGS32) {
1959 return NULL;
1960 }
1961 return x86_reg_info_32[reg].name;
1962 }
1963
x86_cpu_xsave_xss_components(X86CPU * cpu)1964 static inline uint64_t x86_cpu_xsave_xss_components(X86CPU *cpu)
1965 {
1966 return ((uint64_t)cpu->env.features[FEAT_XSAVE_XSS_HI]) << 32 |
1967 cpu->env.features[FEAT_XSAVE_XSS_LO];
1968 }
1969
1970 /*
1971 * Returns the set of feature flags that are supported and migratable by
1972 * QEMU, for a given FeatureWord.
1973 */
x86_cpu_get_migratable_flags(X86CPU * cpu,FeatureWord w)1974 static uint64_t x86_cpu_get_migratable_flags(X86CPU *cpu, FeatureWord w)
1975 {
1976 FeatureWordInfo *wi = &feature_word_info[w];
1977 CPUX86State *env = &cpu->env;
1978 uint64_t r = 0;
1979 int i;
1980
1981 for (i = 0; i < 64; i++) {
1982 uint64_t f = 1ULL << i;
1983
1984 /* If the feature name is known, it is implicitly considered migratable,
1985 * unless it is explicitly set in unmigratable_flags */
1986 if ((wi->migratable_flags & f) ||
1987 (wi->feat_names[i] && !(wi->unmigratable_flags & f))) {
1988 r |= f;
1989 }
1990 }
1991
1992 /* when tsc-khz is set explicitly, invtsc is migratable */
1993 if ((w == FEAT_8000_0007_EDX) && env->user_tsc_khz) {
1994 r |= CPUID_APM_INVTSC;
1995 }
1996
1997 return r;
1998 }
1999
host_cpuid(uint32_t function,uint32_t count,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)2000 void host_cpuid(uint32_t function, uint32_t count,
2001 uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
2002 {
2003 uint32_t vec[4];
2004
2005 #ifdef __x86_64__
2006 asm volatile("cpuid"
2007 : "=a"(vec[0]), "=b"(vec[1]),
2008 "=c"(vec[2]), "=d"(vec[3])
2009 : "0"(function), "c"(count) : "cc");
2010 #elif defined(__i386__)
2011 asm volatile("pusha \n\t"
2012 "cpuid \n\t"
2013 "mov %%eax, 0(%2) \n\t"
2014 "mov %%ebx, 4(%2) \n\t"
2015 "mov %%ecx, 8(%2) \n\t"
2016 "mov %%edx, 12(%2) \n\t"
2017 "popa"
2018 : : "a"(function), "c"(count), "S"(vec)
2019 : "memory", "cc");
2020 #else
2021 abort();
2022 #endif
2023
2024 if (eax)
2025 *eax = vec[0];
2026 if (ebx)
2027 *ebx = vec[1];
2028 if (ecx)
2029 *ecx = vec[2];
2030 if (edx)
2031 *edx = vec[3];
2032 }
2033
2034 /* CPU class name definitions: */
2035
2036 /* Return type name for a given CPU model name
2037 * Caller is responsible for freeing the returned string.
2038 */
x86_cpu_type_name(const char * model_name)2039 static char *x86_cpu_type_name(const char *model_name)
2040 {
2041 return g_strdup_printf(X86_CPU_TYPE_NAME("%s"), model_name);
2042 }
2043
x86_cpu_class_by_name(const char * cpu_model)2044 static ObjectClass *x86_cpu_class_by_name(const char *cpu_model)
2045 {
2046 g_autofree char *typename = x86_cpu_type_name(cpu_model);
2047 return object_class_by_name(typename);
2048 }
2049
x86_cpu_class_get_model_name(X86CPUClass * cc)2050 static char *x86_cpu_class_get_model_name(X86CPUClass *cc)
2051 {
2052 const char *class_name = object_class_get_name(OBJECT_CLASS(cc));
2053 assert(g_str_has_suffix(class_name, X86_CPU_TYPE_SUFFIX));
2054 return cpu_model_from_type(class_name);
2055 }
2056
2057 typedef struct X86CPUVersionDefinition {
2058 X86CPUVersion version;
2059 const char *alias;
2060 const char *note;
2061 PropValue *props;
2062 const CPUCaches *const cache_info;
2063 } X86CPUVersionDefinition;
2064
2065 /* Base definition for a CPU model */
2066 typedef struct X86CPUDefinition {
2067 const char *name;
2068 uint32_t level;
2069 uint32_t xlevel;
2070 /* vendor is zero-terminated, 12 character ASCII string */
2071 char vendor[CPUID_VENDOR_SZ + 1];
2072 int family;
2073 int model;
2074 int stepping;
2075 uint8_t avx10_version;
2076 FeatureWordArray features;
2077 const char *model_id;
2078 const CPUCaches *const cache_info;
2079 /*
2080 * Definitions for alternative versions of CPU model.
2081 * List is terminated by item with version == 0.
2082 * If NULL, version 1 will be registered automatically.
2083 */
2084 const X86CPUVersionDefinition *versions;
2085 const char *deprecation_note;
2086 } X86CPUDefinition;
2087
2088 /* Reference to a specific CPU model version */
2089 struct X86CPUModel {
2090 /* Base CPU definition */
2091 const X86CPUDefinition *cpudef;
2092 /* CPU model version */
2093 X86CPUVersion version;
2094 const char *note;
2095 /*
2096 * If true, this is an alias CPU model.
2097 * This matters only for "-cpu help" and query-cpu-definitions
2098 */
2099 bool is_alias;
2100 };
2101
2102 /* Get full model name for CPU version */
x86_cpu_versioned_model_name(const X86CPUDefinition * cpudef,X86CPUVersion version)2103 static char *x86_cpu_versioned_model_name(const X86CPUDefinition *cpudef,
2104 X86CPUVersion version)
2105 {
2106 assert(version > 0);
2107 return g_strdup_printf("%s-v%d", cpudef->name, (int)version);
2108 }
2109
2110 static const X86CPUVersionDefinition *
x86_cpu_def_get_versions(const X86CPUDefinition * def)2111 x86_cpu_def_get_versions(const X86CPUDefinition *def)
2112 {
2113 /* When X86CPUDefinition::versions is NULL, we register only v1 */
2114 static const X86CPUVersionDefinition default_version_list[] = {
2115 { 1 },
2116 { /* end of list */ }
2117 };
2118
2119 return def->versions ?: default_version_list;
2120 }
2121
2122 static const CPUCaches epyc_cache_info = {
2123 .l1d_cache = &(CPUCacheInfo) {
2124 .type = DATA_CACHE,
2125 .level = 1,
2126 .size = 32 * KiB,
2127 .line_size = 64,
2128 .associativity = 8,
2129 .partitions = 1,
2130 .sets = 64,
2131 .lines_per_tag = 1,
2132 .self_init = 1,
2133 .no_invd_sharing = true,
2134 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2135 },
2136 .l1i_cache = &(CPUCacheInfo) {
2137 .type = INSTRUCTION_CACHE,
2138 .level = 1,
2139 .size = 64 * KiB,
2140 .line_size = 64,
2141 .associativity = 4,
2142 .partitions = 1,
2143 .sets = 256,
2144 .lines_per_tag = 1,
2145 .self_init = 1,
2146 .no_invd_sharing = true,
2147 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2148 },
2149 .l2_cache = &(CPUCacheInfo) {
2150 .type = UNIFIED_CACHE,
2151 .level = 2,
2152 .size = 512 * KiB,
2153 .line_size = 64,
2154 .associativity = 8,
2155 .partitions = 1,
2156 .sets = 1024,
2157 .lines_per_tag = 1,
2158 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2159 },
2160 .l3_cache = &(CPUCacheInfo) {
2161 .type = UNIFIED_CACHE,
2162 .level = 3,
2163 .size = 8 * MiB,
2164 .line_size = 64,
2165 .associativity = 16,
2166 .partitions = 1,
2167 .sets = 8192,
2168 .lines_per_tag = 1,
2169 .self_init = true,
2170 .inclusive = true,
2171 .complex_indexing = true,
2172 .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2173 },
2174 };
2175
2176 static CPUCaches epyc_v4_cache_info = {
2177 .l1d_cache = &(CPUCacheInfo) {
2178 .type = DATA_CACHE,
2179 .level = 1,
2180 .size = 32 * KiB,
2181 .line_size = 64,
2182 .associativity = 8,
2183 .partitions = 1,
2184 .sets = 64,
2185 .lines_per_tag = 1,
2186 .self_init = 1,
2187 .no_invd_sharing = true,
2188 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2189 },
2190 .l1i_cache = &(CPUCacheInfo) {
2191 .type = INSTRUCTION_CACHE,
2192 .level = 1,
2193 .size = 64 * KiB,
2194 .line_size = 64,
2195 .associativity = 4,
2196 .partitions = 1,
2197 .sets = 256,
2198 .lines_per_tag = 1,
2199 .self_init = 1,
2200 .no_invd_sharing = true,
2201 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2202 },
2203 .l2_cache = &(CPUCacheInfo) {
2204 .type = UNIFIED_CACHE,
2205 .level = 2,
2206 .size = 512 * KiB,
2207 .line_size = 64,
2208 .associativity = 8,
2209 .partitions = 1,
2210 .sets = 1024,
2211 .lines_per_tag = 1,
2212 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2213 },
2214 .l3_cache = &(CPUCacheInfo) {
2215 .type = UNIFIED_CACHE,
2216 .level = 3,
2217 .size = 8 * MiB,
2218 .line_size = 64,
2219 .associativity = 16,
2220 .partitions = 1,
2221 .sets = 8192,
2222 .lines_per_tag = 1,
2223 .self_init = true,
2224 .inclusive = true,
2225 .complex_indexing = false,
2226 .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2227 },
2228 };
2229
2230 static CPUCaches epyc_v5_cache_info = {
2231 .l1d_cache = &(CPUCacheInfo) {
2232 .type = DATA_CACHE,
2233 .level = 1,
2234 .size = 32 * KiB,
2235 .line_size = 64,
2236 .associativity = 8,
2237 .partitions = 1,
2238 .sets = 64,
2239 .lines_per_tag = 1,
2240 .self_init = true,
2241 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2242 },
2243 .l1i_cache = &(CPUCacheInfo) {
2244 .type = INSTRUCTION_CACHE,
2245 .level = 1,
2246 .size = 64 * KiB,
2247 .line_size = 64,
2248 .associativity = 4,
2249 .partitions = 1,
2250 .sets = 256,
2251 .lines_per_tag = 1,
2252 .self_init = true,
2253 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2254 },
2255 .l2_cache = &(CPUCacheInfo) {
2256 .type = UNIFIED_CACHE,
2257 .level = 2,
2258 .size = 512 * KiB,
2259 .line_size = 64,
2260 .associativity = 8,
2261 .partitions = 1,
2262 .sets = 1024,
2263 .lines_per_tag = 1,
2264 .self_init = true,
2265 .inclusive = true,
2266 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2267 },
2268 .l3_cache = &(CPUCacheInfo) {
2269 .type = UNIFIED_CACHE,
2270 .level = 3,
2271 .size = 8 * MiB,
2272 .line_size = 64,
2273 .associativity = 16,
2274 .partitions = 1,
2275 .sets = 8192,
2276 .lines_per_tag = 1,
2277 .self_init = true,
2278 .no_invd_sharing = true,
2279 .complex_indexing = false,
2280 .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2281 },
2282 };
2283
2284 static const CPUCaches epyc_rome_cache_info = {
2285 .l1d_cache = &(CPUCacheInfo) {
2286 .type = DATA_CACHE,
2287 .level = 1,
2288 .size = 32 * KiB,
2289 .line_size = 64,
2290 .associativity = 8,
2291 .partitions = 1,
2292 .sets = 64,
2293 .lines_per_tag = 1,
2294 .self_init = 1,
2295 .no_invd_sharing = true,
2296 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2297 },
2298 .l1i_cache = &(CPUCacheInfo) {
2299 .type = INSTRUCTION_CACHE,
2300 .level = 1,
2301 .size = 32 * KiB,
2302 .line_size = 64,
2303 .associativity = 8,
2304 .partitions = 1,
2305 .sets = 64,
2306 .lines_per_tag = 1,
2307 .self_init = 1,
2308 .no_invd_sharing = true,
2309 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2310 },
2311 .l2_cache = &(CPUCacheInfo) {
2312 .type = UNIFIED_CACHE,
2313 .level = 2,
2314 .size = 512 * KiB,
2315 .line_size = 64,
2316 .associativity = 8,
2317 .partitions = 1,
2318 .sets = 1024,
2319 .lines_per_tag = 1,
2320 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2321 },
2322 .l3_cache = &(CPUCacheInfo) {
2323 .type = UNIFIED_CACHE,
2324 .level = 3,
2325 .size = 16 * MiB,
2326 .line_size = 64,
2327 .associativity = 16,
2328 .partitions = 1,
2329 .sets = 16384,
2330 .lines_per_tag = 1,
2331 .self_init = true,
2332 .inclusive = true,
2333 .complex_indexing = true,
2334 .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2335 },
2336 };
2337
2338 static const CPUCaches epyc_rome_v3_cache_info = {
2339 .l1d_cache = &(CPUCacheInfo) {
2340 .type = DATA_CACHE,
2341 .level = 1,
2342 .size = 32 * KiB,
2343 .line_size = 64,
2344 .associativity = 8,
2345 .partitions = 1,
2346 .sets = 64,
2347 .lines_per_tag = 1,
2348 .self_init = 1,
2349 .no_invd_sharing = true,
2350 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2351 },
2352 .l1i_cache = &(CPUCacheInfo) {
2353 .type = INSTRUCTION_CACHE,
2354 .level = 1,
2355 .size = 32 * KiB,
2356 .line_size = 64,
2357 .associativity = 8,
2358 .partitions = 1,
2359 .sets = 64,
2360 .lines_per_tag = 1,
2361 .self_init = 1,
2362 .no_invd_sharing = true,
2363 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2364 },
2365 .l2_cache = &(CPUCacheInfo) {
2366 .type = UNIFIED_CACHE,
2367 .level = 2,
2368 .size = 512 * KiB,
2369 .line_size = 64,
2370 .associativity = 8,
2371 .partitions = 1,
2372 .sets = 1024,
2373 .lines_per_tag = 1,
2374 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2375 },
2376 .l3_cache = &(CPUCacheInfo) {
2377 .type = UNIFIED_CACHE,
2378 .level = 3,
2379 .size = 16 * MiB,
2380 .line_size = 64,
2381 .associativity = 16,
2382 .partitions = 1,
2383 .sets = 16384,
2384 .lines_per_tag = 1,
2385 .self_init = true,
2386 .inclusive = true,
2387 .complex_indexing = false,
2388 .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2389 },
2390 };
2391
2392 static const CPUCaches epyc_rome_v5_cache_info = {
2393 .l1d_cache = &(CPUCacheInfo) {
2394 .type = DATA_CACHE,
2395 .level = 1,
2396 .size = 32 * KiB,
2397 .line_size = 64,
2398 .associativity = 8,
2399 .partitions = 1,
2400 .sets = 64,
2401 .lines_per_tag = 1,
2402 .self_init = true,
2403 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2404 },
2405 .l1i_cache = &(CPUCacheInfo) {
2406 .type = INSTRUCTION_CACHE,
2407 .level = 1,
2408 .size = 32 * KiB,
2409 .line_size = 64,
2410 .associativity = 8,
2411 .partitions = 1,
2412 .sets = 64,
2413 .lines_per_tag = 1,
2414 .self_init = true,
2415 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2416 },
2417 .l2_cache = &(CPUCacheInfo) {
2418 .type = UNIFIED_CACHE,
2419 .level = 2,
2420 .size = 512 * KiB,
2421 .line_size = 64,
2422 .associativity = 8,
2423 .partitions = 1,
2424 .sets = 1024,
2425 .lines_per_tag = 1,
2426 .self_init = true,
2427 .inclusive = true,
2428 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2429 },
2430 .l3_cache = &(CPUCacheInfo) {
2431 .type = UNIFIED_CACHE,
2432 .level = 3,
2433 .size = 16 * MiB,
2434 .line_size = 64,
2435 .associativity = 16,
2436 .partitions = 1,
2437 .sets = 16384,
2438 .lines_per_tag = 1,
2439 .self_init = true,
2440 .no_invd_sharing = true,
2441 .complex_indexing = false,
2442 .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2443 },
2444 };
2445
2446 static const CPUCaches epyc_milan_cache_info = {
2447 .l1d_cache = &(CPUCacheInfo) {
2448 .type = DATA_CACHE,
2449 .level = 1,
2450 .size = 32 * KiB,
2451 .line_size = 64,
2452 .associativity = 8,
2453 .partitions = 1,
2454 .sets = 64,
2455 .lines_per_tag = 1,
2456 .self_init = 1,
2457 .no_invd_sharing = true,
2458 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2459 },
2460 .l1i_cache = &(CPUCacheInfo) {
2461 .type = INSTRUCTION_CACHE,
2462 .level = 1,
2463 .size = 32 * KiB,
2464 .line_size = 64,
2465 .associativity = 8,
2466 .partitions = 1,
2467 .sets = 64,
2468 .lines_per_tag = 1,
2469 .self_init = 1,
2470 .no_invd_sharing = true,
2471 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2472 },
2473 .l2_cache = &(CPUCacheInfo) {
2474 .type = UNIFIED_CACHE,
2475 .level = 2,
2476 .size = 512 * KiB,
2477 .line_size = 64,
2478 .associativity = 8,
2479 .partitions = 1,
2480 .sets = 1024,
2481 .lines_per_tag = 1,
2482 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2483 },
2484 .l3_cache = &(CPUCacheInfo) {
2485 .type = UNIFIED_CACHE,
2486 .level = 3,
2487 .size = 32 * MiB,
2488 .line_size = 64,
2489 .associativity = 16,
2490 .partitions = 1,
2491 .sets = 32768,
2492 .lines_per_tag = 1,
2493 .self_init = true,
2494 .inclusive = true,
2495 .complex_indexing = true,
2496 .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2497 },
2498 };
2499
2500 static const CPUCaches epyc_milan_v2_cache_info = {
2501 .l1d_cache = &(CPUCacheInfo) {
2502 .type = DATA_CACHE,
2503 .level = 1,
2504 .size = 32 * KiB,
2505 .line_size = 64,
2506 .associativity = 8,
2507 .partitions = 1,
2508 .sets = 64,
2509 .lines_per_tag = 1,
2510 .self_init = 1,
2511 .no_invd_sharing = true,
2512 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2513 },
2514 .l1i_cache = &(CPUCacheInfo) {
2515 .type = INSTRUCTION_CACHE,
2516 .level = 1,
2517 .size = 32 * KiB,
2518 .line_size = 64,
2519 .associativity = 8,
2520 .partitions = 1,
2521 .sets = 64,
2522 .lines_per_tag = 1,
2523 .self_init = 1,
2524 .no_invd_sharing = true,
2525 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2526 },
2527 .l2_cache = &(CPUCacheInfo) {
2528 .type = UNIFIED_CACHE,
2529 .level = 2,
2530 .size = 512 * KiB,
2531 .line_size = 64,
2532 .associativity = 8,
2533 .partitions = 1,
2534 .sets = 1024,
2535 .lines_per_tag = 1,
2536 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2537 },
2538 .l3_cache = &(CPUCacheInfo) {
2539 .type = UNIFIED_CACHE,
2540 .level = 3,
2541 .size = 32 * MiB,
2542 .line_size = 64,
2543 .associativity = 16,
2544 .partitions = 1,
2545 .sets = 32768,
2546 .lines_per_tag = 1,
2547 .self_init = true,
2548 .inclusive = true,
2549 .complex_indexing = false,
2550 .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2551 },
2552 };
2553
2554 static const CPUCaches epyc_milan_v3_cache_info = {
2555 .l1d_cache = &(CPUCacheInfo) {
2556 .type = DATA_CACHE,
2557 .level = 1,
2558 .size = 32 * KiB,
2559 .line_size = 64,
2560 .associativity = 8,
2561 .partitions = 1,
2562 .sets = 64,
2563 .lines_per_tag = 1,
2564 .self_init = true,
2565 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2566 },
2567 .l1i_cache = &(CPUCacheInfo) {
2568 .type = INSTRUCTION_CACHE,
2569 .level = 1,
2570 .size = 32 * KiB,
2571 .line_size = 64,
2572 .associativity = 8,
2573 .partitions = 1,
2574 .sets = 64,
2575 .lines_per_tag = 1,
2576 .self_init = true,
2577 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2578 },
2579 .l2_cache = &(CPUCacheInfo) {
2580 .type = UNIFIED_CACHE,
2581 .level = 2,
2582 .size = 512 * KiB,
2583 .line_size = 64,
2584 .associativity = 8,
2585 .partitions = 1,
2586 .sets = 1024,
2587 .lines_per_tag = 1,
2588 .self_init = true,
2589 .inclusive = true,
2590 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2591 },
2592 .l3_cache = &(CPUCacheInfo) {
2593 .type = UNIFIED_CACHE,
2594 .level = 3,
2595 .size = 32 * MiB,
2596 .line_size = 64,
2597 .associativity = 16,
2598 .partitions = 1,
2599 .sets = 32768,
2600 .lines_per_tag = 1,
2601 .self_init = true,
2602 .no_invd_sharing = true,
2603 .complex_indexing = false,
2604 .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2605 },
2606 };
2607
2608 static const CPUCaches epyc_genoa_cache_info = {
2609 .l1d_cache = &(CPUCacheInfo) {
2610 .type = DATA_CACHE,
2611 .level = 1,
2612 .size = 32 * KiB,
2613 .line_size = 64,
2614 .associativity = 8,
2615 .partitions = 1,
2616 .sets = 64,
2617 .lines_per_tag = 1,
2618 .self_init = 1,
2619 .no_invd_sharing = true,
2620 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2621 },
2622 .l1i_cache = &(CPUCacheInfo) {
2623 .type = INSTRUCTION_CACHE,
2624 .level = 1,
2625 .size = 32 * KiB,
2626 .line_size = 64,
2627 .associativity = 8,
2628 .partitions = 1,
2629 .sets = 64,
2630 .lines_per_tag = 1,
2631 .self_init = 1,
2632 .no_invd_sharing = true,
2633 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2634 },
2635 .l2_cache = &(CPUCacheInfo) {
2636 .type = UNIFIED_CACHE,
2637 .level = 2,
2638 .size = 1 * MiB,
2639 .line_size = 64,
2640 .associativity = 8,
2641 .partitions = 1,
2642 .sets = 2048,
2643 .lines_per_tag = 1,
2644 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2645 },
2646 .l3_cache = &(CPUCacheInfo) {
2647 .type = UNIFIED_CACHE,
2648 .level = 3,
2649 .size = 32 * MiB,
2650 .line_size = 64,
2651 .associativity = 16,
2652 .partitions = 1,
2653 .sets = 32768,
2654 .lines_per_tag = 1,
2655 .self_init = true,
2656 .inclusive = true,
2657 .complex_indexing = false,
2658 .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2659 },
2660 };
2661
2662 static const CPUCaches epyc_genoa_v2_cache_info = {
2663 .l1d_cache = &(CPUCacheInfo) {
2664 .type = DATA_CACHE,
2665 .level = 1,
2666 .size = 32 * KiB,
2667 .line_size = 64,
2668 .associativity = 8,
2669 .partitions = 1,
2670 .sets = 64,
2671 .lines_per_tag = 1,
2672 .self_init = true,
2673 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2674 },
2675 .l1i_cache = &(CPUCacheInfo) {
2676 .type = INSTRUCTION_CACHE,
2677 .level = 1,
2678 .size = 32 * KiB,
2679 .line_size = 64,
2680 .associativity = 8,
2681 .partitions = 1,
2682 .sets = 64,
2683 .lines_per_tag = 1,
2684 .self_init = true,
2685 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2686 },
2687 .l2_cache = &(CPUCacheInfo) {
2688 .type = UNIFIED_CACHE,
2689 .level = 2,
2690 .size = 1 * MiB,
2691 .line_size = 64,
2692 .associativity = 8,
2693 .partitions = 1,
2694 .sets = 2048,
2695 .lines_per_tag = 1,
2696 .self_init = true,
2697 .inclusive = true,
2698 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2699 },
2700 .l3_cache = &(CPUCacheInfo) {
2701 .type = UNIFIED_CACHE,
2702 .level = 3,
2703 .size = 32 * MiB,
2704 .line_size = 64,
2705 .associativity = 16,
2706 .partitions = 1,
2707 .sets = 32768,
2708 .lines_per_tag = 1,
2709 .self_init = true,
2710 .no_invd_sharing = true,
2711 .complex_indexing = false,
2712 .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2713 },
2714 };
2715
2716 static const CPUCaches epyc_turin_cache_info = {
2717 .l1d_cache = &(CPUCacheInfo) {
2718 .type = DATA_CACHE,
2719 .level = 1,
2720 .size = 48 * KiB,
2721 .line_size = 64,
2722 .associativity = 12,
2723 .partitions = 1,
2724 .sets = 64,
2725 .lines_per_tag = 1,
2726 .self_init = true,
2727 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2728 },
2729 .l1i_cache = &(CPUCacheInfo) {
2730 .type = INSTRUCTION_CACHE,
2731 .level = 1,
2732 .size = 32 * KiB,
2733 .line_size = 64,
2734 .associativity = 8,
2735 .partitions = 1,
2736 .sets = 64,
2737 .lines_per_tag = 1,
2738 .self_init = true,
2739 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2740 },
2741 .l2_cache = &(CPUCacheInfo) {
2742 .type = UNIFIED_CACHE,
2743 .level = 2,
2744 .size = 1 * MiB,
2745 .line_size = 64,
2746 .associativity = 16,
2747 .partitions = 1,
2748 .sets = 1024,
2749 .lines_per_tag = 1,
2750 .self_init = true,
2751 .inclusive = true,
2752 .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2753 },
2754 .l3_cache = &(CPUCacheInfo) {
2755 .type = UNIFIED_CACHE,
2756 .level = 3,
2757 .size = 32 * MiB,
2758 .line_size = 64,
2759 .associativity = 16,
2760 .partitions = 1,
2761 .sets = 32768,
2762 .lines_per_tag = 1,
2763 .self_init = true,
2764 .no_invd_sharing = true,
2765 .complex_indexing = false,
2766 .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2767 },
2768 };
2769
2770 /* The following VMX features are not supported by KVM and are left out in the
2771 * CPU definitions:
2772 *
2773 * Dual-monitor support (all processors)
2774 * Entry to SMM
2775 * Deactivate dual-monitor treatment
2776 * Number of CR3-target values
2777 * Shutdown activity state
2778 * Wait-for-SIPI activity state
2779 * PAUSE-loop exiting (Westmere and newer)
2780 * EPT-violation #VE (Broadwell and newer)
2781 * Inject event with insn length=0 (Skylake and newer)
2782 * Conceal non-root operation from PT
2783 * Conceal VM exits from PT
2784 * Conceal VM entries from PT
2785 * Enable ENCLS exiting
2786 * Mode-based execute control (XS/XU)
2787 * TSC scaling (Skylake Server and newer)
2788 * GPA translation for PT (IceLake and newer)
2789 * User wait and pause
2790 * ENCLV exiting
2791 * Load IA32_RTIT_CTL
2792 * Clear IA32_RTIT_CTL
2793 * Advanced VM-exit information for EPT violations
2794 * Sub-page write permissions
2795 * PT in VMX operation
2796 */
2797
2798 static const X86CPUDefinition builtin_x86_defs[] = {
2799 {
2800 .name = "qemu64",
2801 .level = 0xd,
2802 .vendor = CPUID_VENDOR_AMD,
2803 .family = 15,
2804 .model = 107,
2805 .stepping = 1,
2806 .features[FEAT_1_EDX] =
2807 PPRO_FEATURES |
2808 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
2809 CPUID_PSE36,
2810 .features[FEAT_1_ECX] =
2811 CPUID_EXT_SSE3 | CPUID_EXT_CX16,
2812 .features[FEAT_8000_0001_EDX] =
2813 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2814 .features[FEAT_8000_0001_ECX] =
2815 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM,
2816 .xlevel = 0x8000000A,
2817 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
2818 },
2819 {
2820 .name = "phenom",
2821 .level = 5,
2822 .vendor = CPUID_VENDOR_AMD,
2823 .family = 16,
2824 .model = 2,
2825 .stepping = 3,
2826 /* Missing: CPUID_HT */
2827 .features[FEAT_1_EDX] =
2828 PPRO_FEATURES |
2829 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
2830 CPUID_PSE36 | CPUID_VME,
2831 .features[FEAT_1_ECX] =
2832 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_CX16 |
2833 CPUID_EXT_POPCNT,
2834 .features[FEAT_8000_0001_EDX] =
2835 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX |
2836 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_MMXEXT |
2837 CPUID_EXT2_FFXSR | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP,
2838 /* Missing: CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
2839 CPUID_EXT3_CR8LEG,
2840 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
2841 CPUID_EXT3_OSVW, CPUID_EXT3_IBS */
2842 .features[FEAT_8000_0001_ECX] =
2843 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM |
2844 CPUID_EXT3_ABM | CPUID_EXT3_SSE4A,
2845 /* Missing: CPUID_SVM_LBRV */
2846 .features[FEAT_SVM] =
2847 CPUID_SVM_NPT,
2848 .xlevel = 0x8000001A,
2849 .model_id = "AMD Phenom(tm) 9550 Quad-Core Processor"
2850 },
2851 {
2852 .name = "core2duo",
2853 .level = 10,
2854 .vendor = CPUID_VENDOR_INTEL,
2855 .family = 6,
2856 .model = 15,
2857 .stepping = 11,
2858 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
2859 .features[FEAT_1_EDX] =
2860 PPRO_FEATURES |
2861 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
2862 CPUID_PSE36 | CPUID_VME | CPUID_ACPI | CPUID_SS,
2863 /* Missing: CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_EST,
2864 * CPUID_EXT_TM2, CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_VMX */
2865 .features[FEAT_1_ECX] =
2866 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
2867 CPUID_EXT_CX16,
2868 .features[FEAT_8000_0001_EDX] =
2869 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2870 .features[FEAT_8000_0001_ECX] =
2871 CPUID_EXT3_LAHF_LM,
2872 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
2873 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
2874 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
2875 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2876 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2877 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
2878 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2879 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2880 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2881 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2882 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2883 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2884 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2885 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2886 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2887 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2888 .features[FEAT_VMX_SECONDARY_CTLS] =
2889 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES,
2890 .xlevel = 0x80000008,
2891 .model_id = "Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz",
2892 },
2893 {
2894 .name = "kvm64",
2895 .level = 0xd,
2896 .vendor = CPUID_VENDOR_INTEL,
2897 .family = 15,
2898 .model = 6,
2899 .stepping = 1,
2900 /* Missing: CPUID_HT */
2901 .features[FEAT_1_EDX] =
2902 PPRO_FEATURES | CPUID_VME |
2903 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
2904 CPUID_PSE36,
2905 /* Missing: CPUID_EXT_POPCNT, CPUID_EXT_MONITOR */
2906 .features[FEAT_1_ECX] =
2907 CPUID_EXT_SSE3 | CPUID_EXT_CX16,
2908 /* Missing: CPUID_EXT2_PDPE1GB, CPUID_EXT2_RDTSCP */
2909 .features[FEAT_8000_0001_EDX] =
2910 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2911 /* Missing: CPUID_EXT3_LAHF_LM, CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
2912 CPUID_EXT3_CR8LEG, CPUID_EXT3_ABM, CPUID_EXT3_SSE4A,
2913 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
2914 CPUID_EXT3_OSVW, CPUID_EXT3_IBS, CPUID_EXT3_SVM */
2915 .features[FEAT_8000_0001_ECX] =
2916 0,
2917 /* VMX features from Cedar Mill/Prescott */
2918 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
2919 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
2920 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2921 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2922 VMX_PIN_BASED_NMI_EXITING,
2923 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2924 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2925 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2926 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2927 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2928 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2929 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2930 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING,
2931 .xlevel = 0x80000008,
2932 .model_id = "Common KVM processor"
2933 },
2934 {
2935 .name = "qemu32",
2936 .level = 4,
2937 .vendor = CPUID_VENDOR_INTEL,
2938 .family = 6,
2939 .model = 6,
2940 .stepping = 3,
2941 .features[FEAT_1_EDX] =
2942 PPRO_FEATURES,
2943 .features[FEAT_1_ECX] =
2944 CPUID_EXT_SSE3,
2945 .xlevel = 0x80000004,
2946 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
2947 },
2948 {
2949 .name = "kvm32",
2950 .level = 5,
2951 .vendor = CPUID_VENDOR_INTEL,
2952 .family = 15,
2953 .model = 6,
2954 .stepping = 1,
2955 .features[FEAT_1_EDX] =
2956 PPRO_FEATURES | CPUID_VME |
2957 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_PSE36,
2958 .features[FEAT_1_ECX] =
2959 CPUID_EXT_SSE3,
2960 .features[FEAT_8000_0001_ECX] =
2961 0,
2962 /* VMX features from Yonah */
2963 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
2964 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
2965 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2966 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2967 VMX_PIN_BASED_NMI_EXITING,
2968 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2969 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2970 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2971 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2972 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
2973 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
2974 VMX_CPU_BASED_PAUSE_EXITING | VMX_CPU_BASED_USE_MSR_BITMAPS,
2975 .xlevel = 0x80000008,
2976 .model_id = "Common 32-bit KVM processor"
2977 },
2978 {
2979 .name = "coreduo",
2980 .level = 10,
2981 .vendor = CPUID_VENDOR_INTEL,
2982 .family = 6,
2983 .model = 14,
2984 .stepping = 8,
2985 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
2986 .features[FEAT_1_EDX] =
2987 PPRO_FEATURES | CPUID_VME |
2988 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_ACPI |
2989 CPUID_SS,
2990 /* Missing: CPUID_EXT_EST, CPUID_EXT_TM2 , CPUID_EXT_XTPR,
2991 * CPUID_EXT_PDCM, CPUID_EXT_VMX */
2992 .features[FEAT_1_ECX] =
2993 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR,
2994 .features[FEAT_8000_0001_EDX] =
2995 CPUID_EXT2_NX,
2996 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
2997 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
2998 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2999 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3000 VMX_PIN_BASED_NMI_EXITING,
3001 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3002 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3003 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3004 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3005 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
3006 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
3007 VMX_CPU_BASED_PAUSE_EXITING | VMX_CPU_BASED_USE_MSR_BITMAPS,
3008 .xlevel = 0x80000008,
3009 .model_id = "Genuine Intel(R) CPU T2600 @ 2.16GHz",
3010 },
3011 {
3012 .name = "486",
3013 .level = 1,
3014 .vendor = CPUID_VENDOR_INTEL,
3015 .family = 4,
3016 .model = 8,
3017 .stepping = 0,
3018 .features[FEAT_1_EDX] =
3019 I486_FEATURES,
3020 .xlevel = 0,
3021 .model_id = "",
3022 },
3023 {
3024 .name = "pentium",
3025 .level = 1,
3026 .vendor = CPUID_VENDOR_INTEL,
3027 .family = 5,
3028 .model = 4,
3029 .stepping = 3,
3030 .features[FEAT_1_EDX] =
3031 PENTIUM_FEATURES,
3032 .xlevel = 0,
3033 .model_id = "",
3034 },
3035 {
3036 .name = "pentium2",
3037 .level = 2,
3038 .vendor = CPUID_VENDOR_INTEL,
3039 .family = 6,
3040 .model = 5,
3041 .stepping = 2,
3042 .features[FEAT_1_EDX] =
3043 PENTIUM2_FEATURES,
3044 .xlevel = 0,
3045 .model_id = "",
3046 },
3047 {
3048 .name = "pentium3",
3049 .level = 3,
3050 .vendor = CPUID_VENDOR_INTEL,
3051 .family = 6,
3052 .model = 7,
3053 .stepping = 3,
3054 .features[FEAT_1_EDX] =
3055 PENTIUM3_FEATURES,
3056 .xlevel = 0,
3057 .model_id = "",
3058 },
3059 {
3060 .name = "athlon",
3061 .level = 2,
3062 .vendor = CPUID_VENDOR_AMD,
3063 .family = 6,
3064 .model = 2,
3065 .stepping = 3,
3066 .features[FEAT_1_EDX] =
3067 PPRO_FEATURES | CPUID_PSE36 | CPUID_VME | CPUID_MTRR |
3068 CPUID_MCA,
3069 .features[FEAT_8000_0001_EDX] =
3070 CPUID_EXT2_MMXEXT | CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT,
3071 .xlevel = 0x80000008,
3072 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
3073 },
3074 {
3075 .name = "n270",
3076 .level = 10,
3077 .vendor = CPUID_VENDOR_INTEL,
3078 .family = 6,
3079 .model = 28,
3080 .stepping = 2,
3081 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
3082 .features[FEAT_1_EDX] =
3083 PPRO_FEATURES |
3084 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_VME |
3085 CPUID_ACPI | CPUID_SS,
3086 /* Some CPUs got no CPUID_SEP */
3087 /* Missing: CPUID_EXT_DSCPL, CPUID_EXT_EST, CPUID_EXT_TM2,
3088 * CPUID_EXT_XTPR */
3089 .features[FEAT_1_ECX] =
3090 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
3091 CPUID_EXT_MOVBE,
3092 .features[FEAT_8000_0001_EDX] =
3093 CPUID_EXT2_NX,
3094 .features[FEAT_8000_0001_ECX] =
3095 CPUID_EXT3_LAHF_LM,
3096 .xlevel = 0x80000008,
3097 .model_id = "Intel(R) Atom(TM) CPU N270 @ 1.60GHz",
3098 },
3099 {
3100 .name = "Conroe",
3101 .level = 10,
3102 .vendor = CPUID_VENDOR_INTEL,
3103 .family = 6,
3104 .model = 15,
3105 .stepping = 3,
3106 .features[FEAT_1_EDX] =
3107 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3108 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3109 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3110 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3111 CPUID_DE | CPUID_FP87,
3112 .features[FEAT_1_ECX] =
3113 CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
3114 .features[FEAT_8000_0001_EDX] =
3115 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3116 .features[FEAT_8000_0001_ECX] =
3117 CPUID_EXT3_LAHF_LM,
3118 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
3119 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
3120 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
3121 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
3122 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3123 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
3124 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3125 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3126 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3127 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3128 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3129 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3130 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3131 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3132 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3133 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3134 .features[FEAT_VMX_SECONDARY_CTLS] =
3135 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES,
3136 .xlevel = 0x80000008,
3137 .model_id = "Intel Celeron_4x0 (Conroe/Merom Class Core 2)",
3138 },
3139 {
3140 .name = "Penryn",
3141 .level = 10,
3142 .vendor = CPUID_VENDOR_INTEL,
3143 .family = 6,
3144 .model = 23,
3145 .stepping = 3,
3146 .features[FEAT_1_EDX] =
3147 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3148 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3149 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3150 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3151 CPUID_DE | CPUID_FP87,
3152 .features[FEAT_1_ECX] =
3153 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3154 CPUID_EXT_SSE3,
3155 .features[FEAT_8000_0001_EDX] =
3156 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3157 .features[FEAT_8000_0001_ECX] =
3158 CPUID_EXT3_LAHF_LM,
3159 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
3160 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3161 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL,
3162 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT |
3163 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL,
3164 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
3165 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3166 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
3167 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3168 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3169 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3170 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3171 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3172 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3173 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3174 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3175 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3176 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3177 .features[FEAT_VMX_SECONDARY_CTLS] =
3178 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3179 VMX_SECONDARY_EXEC_WBINVD_EXITING,
3180 .xlevel = 0x80000008,
3181 .model_id = "Intel Core 2 Duo P9xxx (Penryn Class Core 2)",
3182 },
3183 {
3184 .name = "Nehalem",
3185 .level = 11,
3186 .vendor = CPUID_VENDOR_INTEL,
3187 .family = 6,
3188 .model = 26,
3189 .stepping = 3,
3190 .features[FEAT_1_EDX] =
3191 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3192 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3193 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3194 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3195 CPUID_DE | CPUID_FP87,
3196 .features[FEAT_1_ECX] =
3197 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
3198 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
3199 .features[FEAT_8000_0001_EDX] =
3200 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
3201 .features[FEAT_8000_0001_ECX] =
3202 CPUID_EXT3_LAHF_LM,
3203 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3204 MSR_VMX_BASIC_TRUE_CTLS,
3205 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3206 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3207 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3208 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3209 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3210 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3211 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3212 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3213 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3214 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
3215 .features[FEAT_VMX_EXIT_CTLS] =
3216 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3217 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3218 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3219 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3220 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3221 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
3222 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3223 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3224 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
3225 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3226 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3227 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3228 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3229 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3230 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3231 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3232 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3233 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3234 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3235 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3236 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3237 .features[FEAT_VMX_SECONDARY_CTLS] =
3238 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3239 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3240 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3241 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3242 VMX_SECONDARY_EXEC_ENABLE_VPID,
3243 .xlevel = 0x80000008,
3244 .model_id = "Intel Core i7 9xx (Nehalem Class Core i7)",
3245 .versions = (X86CPUVersionDefinition[]) {
3246 { .version = 1 },
3247 {
3248 .version = 2,
3249 .alias = "Nehalem-IBRS",
3250 .props = (PropValue[]) {
3251 { "spec-ctrl", "on" },
3252 { "model-id",
3253 "Intel Core i7 9xx (Nehalem Core i7, IBRS update)" },
3254 { /* end of list */ }
3255 }
3256 },
3257 { /* end of list */ }
3258 }
3259 },
3260 {
3261 .name = "Westmere",
3262 .level = 11,
3263 .vendor = CPUID_VENDOR_INTEL,
3264 .family = 6,
3265 .model = 44,
3266 .stepping = 1,
3267 .features[FEAT_1_EDX] =
3268 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3269 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3270 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3271 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3272 CPUID_DE | CPUID_FP87,
3273 .features[FEAT_1_ECX] =
3274 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
3275 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3276 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
3277 .features[FEAT_8000_0001_EDX] =
3278 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
3279 .features[FEAT_8000_0001_ECX] =
3280 CPUID_EXT3_LAHF_LM,
3281 .features[FEAT_6_EAX] =
3282 CPUID_6_EAX_ARAT,
3283 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3284 MSR_VMX_BASIC_TRUE_CTLS,
3285 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3286 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3287 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3288 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3289 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3290 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3291 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3292 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3293 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3294 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
3295 .features[FEAT_VMX_EXIT_CTLS] =
3296 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3297 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3298 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3299 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3300 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3301 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3302 MSR_VMX_MISC_STORE_LMA,
3303 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3304 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3305 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
3306 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3307 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3308 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3309 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3310 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3311 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3312 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3313 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3314 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3315 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3316 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3317 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3318 .features[FEAT_VMX_SECONDARY_CTLS] =
3319 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3320 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3321 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3322 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3323 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST,
3324 .xlevel = 0x80000008,
3325 .model_id = "Westmere E56xx/L56xx/X56xx (Nehalem-C)",
3326 .versions = (X86CPUVersionDefinition[]) {
3327 { .version = 1 },
3328 {
3329 .version = 2,
3330 .alias = "Westmere-IBRS",
3331 .props = (PropValue[]) {
3332 { "spec-ctrl", "on" },
3333 { "model-id",
3334 "Westmere E56xx/L56xx/X56xx (IBRS update)" },
3335 { /* end of list */ }
3336 }
3337 },
3338 { /* end of list */ }
3339 }
3340 },
3341 {
3342 .name = "SandyBridge",
3343 .level = 0xd,
3344 .vendor = CPUID_VENDOR_INTEL,
3345 .family = 6,
3346 .model = 42,
3347 .stepping = 1,
3348 .features[FEAT_1_EDX] =
3349 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3350 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3351 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3352 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3353 CPUID_DE | CPUID_FP87,
3354 .features[FEAT_1_ECX] =
3355 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3356 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
3357 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
3358 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
3359 CPUID_EXT_SSE3,
3360 .features[FEAT_8000_0001_EDX] =
3361 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
3362 CPUID_EXT2_SYSCALL,
3363 .features[FEAT_8000_0001_ECX] =
3364 CPUID_EXT3_LAHF_LM,
3365 .features[FEAT_XSAVE] =
3366 CPUID_XSAVE_XSAVEOPT,
3367 .features[FEAT_6_EAX] =
3368 CPUID_6_EAX_ARAT,
3369 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3370 MSR_VMX_BASIC_TRUE_CTLS,
3371 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3372 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3373 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3374 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3375 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3376 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3377 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3378 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3379 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3380 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
3381 .features[FEAT_VMX_EXIT_CTLS] =
3382 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3383 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3384 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3385 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3386 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3387 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3388 MSR_VMX_MISC_STORE_LMA,
3389 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3390 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3391 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
3392 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3393 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3394 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3395 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3396 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3397 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3398 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3399 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3400 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3401 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3402 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3403 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3404 .features[FEAT_VMX_SECONDARY_CTLS] =
3405 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3406 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3407 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3408 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3409 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST,
3410 .xlevel = 0x80000008,
3411 .model_id = "Intel Xeon E312xx (Sandy Bridge)",
3412 .versions = (X86CPUVersionDefinition[]) {
3413 { .version = 1 },
3414 {
3415 .version = 2,
3416 .alias = "SandyBridge-IBRS",
3417 .props = (PropValue[]) {
3418 { "spec-ctrl", "on" },
3419 { "model-id",
3420 "Intel Xeon E312xx (Sandy Bridge, IBRS update)" },
3421 { /* end of list */ }
3422 }
3423 },
3424 { /* end of list */ }
3425 }
3426 },
3427 {
3428 .name = "IvyBridge",
3429 .level = 0xd,
3430 .vendor = CPUID_VENDOR_INTEL,
3431 .family = 6,
3432 .model = 58,
3433 .stepping = 9,
3434 .features[FEAT_1_EDX] =
3435 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3436 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3437 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3438 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3439 CPUID_DE | CPUID_FP87,
3440 .features[FEAT_1_ECX] =
3441 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3442 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
3443 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
3444 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
3445 CPUID_EXT_SSE3 | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3446 .features[FEAT_7_0_EBX] =
3447 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP |
3448 CPUID_7_0_EBX_ERMS,
3449 .features[FEAT_8000_0001_EDX] =
3450 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
3451 CPUID_EXT2_SYSCALL,
3452 .features[FEAT_8000_0001_ECX] =
3453 CPUID_EXT3_LAHF_LM,
3454 .features[FEAT_XSAVE] =
3455 CPUID_XSAVE_XSAVEOPT,
3456 .features[FEAT_6_EAX] =
3457 CPUID_6_EAX_ARAT,
3458 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3459 MSR_VMX_BASIC_TRUE_CTLS,
3460 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3461 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3462 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3463 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3464 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3465 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3466 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3467 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3468 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3469 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
3470 .features[FEAT_VMX_EXIT_CTLS] =
3471 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3472 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3473 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3474 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3475 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3476 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3477 MSR_VMX_MISC_STORE_LMA,
3478 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3479 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3480 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3481 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3482 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3483 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3484 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3485 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3486 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3487 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3488 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3489 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3490 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3491 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3492 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3493 .features[FEAT_VMX_SECONDARY_CTLS] =
3494 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3495 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3496 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3497 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3498 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3499 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3500 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3501 VMX_SECONDARY_EXEC_RDRAND_EXITING,
3502 .xlevel = 0x80000008,
3503 .model_id = "Intel Xeon E3-12xx v2 (Ivy Bridge)",
3504 .versions = (X86CPUVersionDefinition[]) {
3505 { .version = 1 },
3506 {
3507 .version = 2,
3508 .alias = "IvyBridge-IBRS",
3509 .props = (PropValue[]) {
3510 { "spec-ctrl", "on" },
3511 { "model-id",
3512 "Intel Xeon E3-12xx v2 (Ivy Bridge, IBRS)" },
3513 { /* end of list */ }
3514 }
3515 },
3516 { /* end of list */ }
3517 }
3518 },
3519 {
3520 .name = "Haswell",
3521 .level = 0xd,
3522 .vendor = CPUID_VENDOR_INTEL,
3523 .family = 6,
3524 .model = 60,
3525 .stepping = 4,
3526 .features[FEAT_1_EDX] =
3527 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3528 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3529 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3530 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3531 CPUID_DE | CPUID_FP87,
3532 .features[FEAT_1_ECX] =
3533 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3534 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3535 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3536 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3537 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3538 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3539 .features[FEAT_8000_0001_EDX] =
3540 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
3541 CPUID_EXT2_SYSCALL,
3542 .features[FEAT_8000_0001_ECX] =
3543 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
3544 .features[FEAT_7_0_EBX] =
3545 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3546 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3547 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3548 CPUID_7_0_EBX_RTM,
3549 .features[FEAT_XSAVE] =
3550 CPUID_XSAVE_XSAVEOPT,
3551 .features[FEAT_6_EAX] =
3552 CPUID_6_EAX_ARAT,
3553 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3554 MSR_VMX_BASIC_TRUE_CTLS,
3555 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3556 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3557 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3558 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3559 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3560 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3561 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3562 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3563 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3564 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3565 .features[FEAT_VMX_EXIT_CTLS] =
3566 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3567 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3568 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3569 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3570 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3571 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3572 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3573 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3574 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3575 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3576 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3577 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3578 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3579 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3580 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3581 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3582 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3583 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3584 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3585 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3586 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3587 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3588 .features[FEAT_VMX_SECONDARY_CTLS] =
3589 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3590 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3591 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3592 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3593 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3594 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3595 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3596 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3597 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS,
3598 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3599 .xlevel = 0x80000008,
3600 .model_id = "Intel Core Processor (Haswell)",
3601 .versions = (X86CPUVersionDefinition[]) {
3602 { .version = 1 },
3603 {
3604 .version = 2,
3605 .alias = "Haswell-noTSX",
3606 .props = (PropValue[]) {
3607 { "hle", "off" },
3608 { "rtm", "off" },
3609 { "stepping", "1" },
3610 { "model-id", "Intel Core Processor (Haswell, no TSX)", },
3611 { /* end of list */ }
3612 },
3613 },
3614 {
3615 .version = 3,
3616 .alias = "Haswell-IBRS",
3617 .props = (PropValue[]) {
3618 /* Restore TSX features removed by -v2 above */
3619 { "hle", "on" },
3620 { "rtm", "on" },
3621 /*
3622 * Haswell and Haswell-IBRS had stepping=4 in
3623 * QEMU 4.0 and older
3624 */
3625 { "stepping", "4" },
3626 { "spec-ctrl", "on" },
3627 { "model-id",
3628 "Intel Core Processor (Haswell, IBRS)" },
3629 { /* end of list */ }
3630 }
3631 },
3632 {
3633 .version = 4,
3634 .alias = "Haswell-noTSX-IBRS",
3635 .props = (PropValue[]) {
3636 { "hle", "off" },
3637 { "rtm", "off" },
3638 /* spec-ctrl was already enabled by -v3 above */
3639 { "stepping", "1" },
3640 { "model-id",
3641 "Intel Core Processor (Haswell, no TSX, IBRS)" },
3642 { /* end of list */ }
3643 }
3644 },
3645 { /* end of list */ }
3646 }
3647 },
3648 {
3649 .name = "Broadwell",
3650 .level = 0xd,
3651 .vendor = CPUID_VENDOR_INTEL,
3652 .family = 6,
3653 .model = 61,
3654 .stepping = 2,
3655 .features[FEAT_1_EDX] =
3656 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3657 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3658 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3659 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3660 CPUID_DE | CPUID_FP87,
3661 .features[FEAT_1_ECX] =
3662 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3663 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3664 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3665 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3666 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3667 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3668 .features[FEAT_8000_0001_EDX] =
3669 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
3670 CPUID_EXT2_SYSCALL,
3671 .features[FEAT_8000_0001_ECX] =
3672 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3673 .features[FEAT_7_0_EBX] =
3674 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3675 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3676 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3677 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3678 CPUID_7_0_EBX_SMAP,
3679 .features[FEAT_XSAVE] =
3680 CPUID_XSAVE_XSAVEOPT,
3681 .features[FEAT_6_EAX] =
3682 CPUID_6_EAX_ARAT,
3683 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3684 MSR_VMX_BASIC_TRUE_CTLS,
3685 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3686 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3687 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3688 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3689 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3690 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3691 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3692 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3693 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3694 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3695 .features[FEAT_VMX_EXIT_CTLS] =
3696 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3697 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3698 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3699 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3700 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3701 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3702 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3703 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3704 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3705 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3706 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3707 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3708 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3709 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3710 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3711 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3712 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3713 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3714 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3715 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3716 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3717 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3718 .features[FEAT_VMX_SECONDARY_CTLS] =
3719 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3720 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3721 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3722 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3723 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3724 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3725 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3726 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3727 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3728 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3729 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3730 .xlevel = 0x80000008,
3731 .model_id = "Intel Core Processor (Broadwell)",
3732 .versions = (X86CPUVersionDefinition[]) {
3733 { .version = 1 },
3734 {
3735 .version = 2,
3736 .alias = "Broadwell-noTSX",
3737 .props = (PropValue[]) {
3738 { "hle", "off" },
3739 { "rtm", "off" },
3740 { "model-id", "Intel Core Processor (Broadwell, no TSX)", },
3741 { /* end of list */ }
3742 },
3743 },
3744 {
3745 .version = 3,
3746 .alias = "Broadwell-IBRS",
3747 .props = (PropValue[]) {
3748 /* Restore TSX features removed by -v2 above */
3749 { "hle", "on" },
3750 { "rtm", "on" },
3751 { "spec-ctrl", "on" },
3752 { "model-id",
3753 "Intel Core Processor (Broadwell, IBRS)" },
3754 { /* end of list */ }
3755 }
3756 },
3757 {
3758 .version = 4,
3759 .alias = "Broadwell-noTSX-IBRS",
3760 .props = (PropValue[]) {
3761 { "hle", "off" },
3762 { "rtm", "off" },
3763 /* spec-ctrl was already enabled by -v3 above */
3764 { "model-id",
3765 "Intel Core Processor (Broadwell, no TSX, IBRS)" },
3766 { /* end of list */ }
3767 }
3768 },
3769 { /* end of list */ }
3770 }
3771 },
3772 {
3773 .name = "Skylake-Client",
3774 .level = 0xd,
3775 .vendor = CPUID_VENDOR_INTEL,
3776 .family = 6,
3777 .model = 94,
3778 .stepping = 3,
3779 .features[FEAT_1_EDX] =
3780 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3781 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3782 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3783 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3784 CPUID_DE | CPUID_FP87,
3785 .features[FEAT_1_ECX] =
3786 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3787 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3788 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3789 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3790 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3791 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3792 .features[FEAT_8000_0001_EDX] =
3793 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
3794 CPUID_EXT2_SYSCALL,
3795 .features[FEAT_8000_0001_ECX] =
3796 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3797 .features[FEAT_7_0_EBX] =
3798 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3799 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3800 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3801 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3802 CPUID_7_0_EBX_SMAP,
3803 /* XSAVES is added in version 4 */
3804 .features[FEAT_XSAVE] =
3805 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3806 CPUID_XSAVE_XGETBV1,
3807 .features[FEAT_6_EAX] =
3808 CPUID_6_EAX_ARAT,
3809 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3810 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3811 MSR_VMX_BASIC_TRUE_CTLS,
3812 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3813 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3814 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3815 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3816 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3817 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3818 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3819 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3820 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3821 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3822 .features[FEAT_VMX_EXIT_CTLS] =
3823 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3824 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3825 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3826 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3827 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3828 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3829 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3830 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3831 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3832 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
3833 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3834 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3835 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3836 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3837 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3838 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3839 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3840 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3841 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3842 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3843 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3844 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3845 .features[FEAT_VMX_SECONDARY_CTLS] =
3846 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3847 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3848 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3849 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3850 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3851 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3852 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3853 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3854 .xlevel = 0x80000008,
3855 .model_id = "Intel Core Processor (Skylake)",
3856 .versions = (X86CPUVersionDefinition[]) {
3857 { .version = 1 },
3858 {
3859 .version = 2,
3860 .alias = "Skylake-Client-IBRS",
3861 .props = (PropValue[]) {
3862 { "spec-ctrl", "on" },
3863 { "model-id",
3864 "Intel Core Processor (Skylake, IBRS)" },
3865 { /* end of list */ }
3866 }
3867 },
3868 {
3869 .version = 3,
3870 .alias = "Skylake-Client-noTSX-IBRS",
3871 .props = (PropValue[]) {
3872 { "hle", "off" },
3873 { "rtm", "off" },
3874 { "model-id",
3875 "Intel Core Processor (Skylake, IBRS, no TSX)" },
3876 { /* end of list */ }
3877 }
3878 },
3879 {
3880 .version = 4,
3881 .note = "IBRS, XSAVES, no TSX",
3882 .props = (PropValue[]) {
3883 { "xsaves", "on" },
3884 { "vmx-xsaves", "on" },
3885 { /* end of list */ }
3886 }
3887 },
3888 { /* end of list */ }
3889 }
3890 },
3891 {
3892 .name = "Skylake-Server",
3893 .level = 0xd,
3894 .vendor = CPUID_VENDOR_INTEL,
3895 .family = 6,
3896 .model = 85,
3897 .stepping = 4,
3898 .features[FEAT_1_EDX] =
3899 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3900 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3901 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3902 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3903 CPUID_DE | CPUID_FP87,
3904 .features[FEAT_1_ECX] =
3905 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3906 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3907 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3908 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3909 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3910 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3911 .features[FEAT_8000_0001_EDX] =
3912 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3913 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3914 .features[FEAT_8000_0001_ECX] =
3915 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3916 .features[FEAT_7_0_EBX] =
3917 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3918 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3919 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3920 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3921 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
3922 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
3923 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
3924 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
3925 .features[FEAT_7_0_ECX] =
3926 CPUID_7_0_ECX_PKU,
3927 /* XSAVES is added in version 5 */
3928 .features[FEAT_XSAVE] =
3929 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3930 CPUID_XSAVE_XGETBV1,
3931 .features[FEAT_6_EAX] =
3932 CPUID_6_EAX_ARAT,
3933 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3934 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3935 MSR_VMX_BASIC_TRUE_CTLS,
3936 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3937 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3938 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3939 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3940 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3941 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3942 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3943 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3944 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3945 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3946 .features[FEAT_VMX_EXIT_CTLS] =
3947 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3948 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3949 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3950 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3951 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3952 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3953 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3954 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3955 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3956 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3957 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3958 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3959 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3960 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3961 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3962 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3963 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3964 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3965 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3966 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3967 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3968 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3969 .features[FEAT_VMX_SECONDARY_CTLS] =
3970 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3971 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3972 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3973 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3974 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3975 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3976 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3977 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3978 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3979 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3980 .xlevel = 0x80000008,
3981 .model_id = "Intel Xeon Processor (Skylake)",
3982 .versions = (X86CPUVersionDefinition[]) {
3983 { .version = 1 },
3984 {
3985 .version = 2,
3986 .alias = "Skylake-Server-IBRS",
3987 .props = (PropValue[]) {
3988 /* clflushopt was not added to Skylake-Server-IBRS */
3989 /* TODO: add -v3 including clflushopt */
3990 { "clflushopt", "off" },
3991 { "spec-ctrl", "on" },
3992 { "model-id",
3993 "Intel Xeon Processor (Skylake, IBRS)" },
3994 { /* end of list */ }
3995 }
3996 },
3997 {
3998 .version = 3,
3999 .alias = "Skylake-Server-noTSX-IBRS",
4000 .props = (PropValue[]) {
4001 { "hle", "off" },
4002 { "rtm", "off" },
4003 { "model-id",
4004 "Intel Xeon Processor (Skylake, IBRS, no TSX)" },
4005 { /* end of list */ }
4006 }
4007 },
4008 {
4009 .version = 4,
4010 .note = "IBRS, EPT switching, no TSX",
4011 .props = (PropValue[]) {
4012 { "vmx-eptp-switching", "on" },
4013 { /* end of list */ }
4014 }
4015 },
4016 {
4017 .version = 5,
4018 .note = "IBRS, XSAVES, EPT switching, no TSX",
4019 .props = (PropValue[]) {
4020 { "xsaves", "on" },
4021 { "vmx-xsaves", "on" },
4022 { /* end of list */ }
4023 }
4024 },
4025 { /* end of list */ }
4026 }
4027 },
4028 {
4029 .name = "Cascadelake-Server",
4030 .level = 0xd,
4031 .vendor = CPUID_VENDOR_INTEL,
4032 .family = 6,
4033 .model = 85,
4034 .stepping = 6,
4035 .features[FEAT_1_EDX] =
4036 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4037 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4038 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4039 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4040 CPUID_DE | CPUID_FP87,
4041 .features[FEAT_1_ECX] =
4042 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
4043 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
4044 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
4045 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
4046 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
4047 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
4048 .features[FEAT_8000_0001_EDX] =
4049 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
4050 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
4051 .features[FEAT_8000_0001_ECX] =
4052 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
4053 .features[FEAT_7_0_EBX] =
4054 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
4055 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
4056 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
4057 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
4058 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
4059 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
4060 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
4061 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
4062 .features[FEAT_7_0_ECX] =
4063 CPUID_7_0_ECX_PKU |
4064 CPUID_7_0_ECX_AVX512VNNI,
4065 .features[FEAT_7_0_EDX] =
4066 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
4067 /* XSAVES is added in version 5 */
4068 .features[FEAT_XSAVE] =
4069 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4070 CPUID_XSAVE_XGETBV1,
4071 .features[FEAT_6_EAX] =
4072 CPUID_6_EAX_ARAT,
4073 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
4074 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
4075 MSR_VMX_BASIC_TRUE_CTLS,
4076 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
4077 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
4078 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
4079 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
4080 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
4081 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
4082 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
4083 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
4084 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
4085 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
4086 .features[FEAT_VMX_EXIT_CTLS] =
4087 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
4088 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
4089 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
4090 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
4091 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
4092 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
4093 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
4094 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
4095 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
4096 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
4097 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
4098 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
4099 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
4100 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
4101 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
4102 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
4103 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
4104 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
4105 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
4106 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
4107 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
4108 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
4109 .features[FEAT_VMX_SECONDARY_CTLS] =
4110 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
4111 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
4112 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
4113 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
4114 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
4115 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
4116 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
4117 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
4118 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
4119 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
4120 .xlevel = 0x80000008,
4121 .model_id = "Intel Xeon Processor (Cascadelake)",
4122 .versions = (X86CPUVersionDefinition[]) {
4123 { .version = 1 },
4124 { .version = 2,
4125 .note = "ARCH_CAPABILITIES",
4126 .props = (PropValue[]) {
4127 { "arch-capabilities", "on" },
4128 { "rdctl-no", "on" },
4129 { "ibrs-all", "on" },
4130 { "skip-l1dfl-vmentry", "on" },
4131 { "mds-no", "on" },
4132 { /* end of list */ }
4133 },
4134 },
4135 { .version = 3,
4136 .alias = "Cascadelake-Server-noTSX",
4137 .note = "ARCH_CAPABILITIES, no TSX",
4138 .props = (PropValue[]) {
4139 { "hle", "off" },
4140 { "rtm", "off" },
4141 { /* end of list */ }
4142 },
4143 },
4144 { .version = 4,
4145 .note = "ARCH_CAPABILITIES, EPT switching, no TSX",
4146 .props = (PropValue[]) {
4147 { "vmx-eptp-switching", "on" },
4148 { /* end of list */ }
4149 },
4150 },
4151 { .version = 5,
4152 .note = "ARCH_CAPABILITIES, EPT switching, XSAVES, no TSX",
4153 .props = (PropValue[]) {
4154 { "xsaves", "on" },
4155 { "vmx-xsaves", "on" },
4156 { /* end of list */ }
4157 },
4158 },
4159 { /* end of list */ }
4160 }
4161 },
4162 {
4163 .name = "Cooperlake",
4164 .level = 0xd,
4165 .vendor = CPUID_VENDOR_INTEL,
4166 .family = 6,
4167 .model = 85,
4168 .stepping = 10,
4169 .features[FEAT_1_EDX] =
4170 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4171 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4172 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4173 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4174 CPUID_DE | CPUID_FP87,
4175 .features[FEAT_1_ECX] =
4176 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
4177 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
4178 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
4179 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
4180 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
4181 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
4182 .features[FEAT_8000_0001_EDX] =
4183 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
4184 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
4185 .features[FEAT_8000_0001_ECX] =
4186 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
4187 .features[FEAT_7_0_EBX] =
4188 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
4189 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
4190 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
4191 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
4192 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
4193 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
4194 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
4195 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
4196 .features[FEAT_7_0_ECX] =
4197 CPUID_7_0_ECX_PKU |
4198 CPUID_7_0_ECX_AVX512VNNI,
4199 .features[FEAT_7_0_EDX] =
4200 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_STIBP |
4201 CPUID_7_0_EDX_SPEC_CTRL_SSBD | CPUID_7_0_EDX_ARCH_CAPABILITIES,
4202 .features[FEAT_ARCH_CAPABILITIES] =
4203 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
4204 MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
4205 MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO,
4206 .features[FEAT_7_1_EAX] =
4207 CPUID_7_1_EAX_AVX512_BF16,
4208 /* XSAVES is added in version 2 */
4209 .features[FEAT_XSAVE] =
4210 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4211 CPUID_XSAVE_XGETBV1,
4212 .features[FEAT_6_EAX] =
4213 CPUID_6_EAX_ARAT,
4214 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
4215 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
4216 MSR_VMX_BASIC_TRUE_CTLS,
4217 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
4218 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
4219 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
4220 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
4221 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
4222 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
4223 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
4224 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
4225 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
4226 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
4227 .features[FEAT_VMX_EXIT_CTLS] =
4228 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
4229 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
4230 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
4231 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
4232 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
4233 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
4234 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
4235 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
4236 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
4237 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
4238 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
4239 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
4240 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
4241 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
4242 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
4243 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
4244 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
4245 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
4246 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
4247 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
4248 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
4249 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
4250 .features[FEAT_VMX_SECONDARY_CTLS] =
4251 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
4252 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
4253 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
4254 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
4255 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
4256 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
4257 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
4258 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
4259 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
4260 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
4261 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
4262 .xlevel = 0x80000008,
4263 .model_id = "Intel Xeon Processor (Cooperlake)",
4264 .versions = (X86CPUVersionDefinition[]) {
4265 { .version = 1 },
4266 { .version = 2,
4267 .note = "XSAVES",
4268 .props = (PropValue[]) {
4269 { "xsaves", "on" },
4270 { "vmx-xsaves", "on" },
4271 { /* end of list */ }
4272 },
4273 },
4274 { /* end of list */ }
4275 }
4276 },
4277 {
4278 .name = "Icelake-Server",
4279 .level = 0xd,
4280 .vendor = CPUID_VENDOR_INTEL,
4281 .family = 6,
4282 .model = 134,
4283 .stepping = 0,
4284 .features[FEAT_1_EDX] =
4285 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4286 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4287 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4288 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4289 CPUID_DE | CPUID_FP87,
4290 .features[FEAT_1_ECX] =
4291 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
4292 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
4293 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
4294 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
4295 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
4296 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
4297 .features[FEAT_8000_0001_EDX] =
4298 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
4299 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
4300 .features[FEAT_8000_0001_ECX] =
4301 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
4302 .features[FEAT_8000_0008_EBX] =
4303 CPUID_8000_0008_EBX_WBNOINVD,
4304 .features[FEAT_7_0_EBX] =
4305 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
4306 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
4307 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
4308 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
4309 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
4310 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
4311 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
4312 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
4313 .features[FEAT_7_0_ECX] =
4314 CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
4315 CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
4316 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
4317 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
4318 CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57,
4319 .features[FEAT_7_0_EDX] =
4320 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
4321 /* XSAVES is added in version 5 */
4322 .features[FEAT_XSAVE] =
4323 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4324 CPUID_XSAVE_XGETBV1,
4325 .features[FEAT_6_EAX] =
4326 CPUID_6_EAX_ARAT,
4327 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
4328 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
4329 MSR_VMX_BASIC_TRUE_CTLS,
4330 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
4331 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
4332 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
4333 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
4334 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
4335 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
4336 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
4337 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
4338 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
4339 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
4340 .features[FEAT_VMX_EXIT_CTLS] =
4341 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
4342 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
4343 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
4344 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
4345 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
4346 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
4347 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
4348 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
4349 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
4350 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
4351 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
4352 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
4353 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
4354 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
4355 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
4356 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
4357 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
4358 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
4359 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
4360 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
4361 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
4362 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
4363 .features[FEAT_VMX_SECONDARY_CTLS] =
4364 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
4365 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
4366 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
4367 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
4368 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
4369 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
4370 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
4371 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
4372 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS,
4373 .xlevel = 0x80000008,
4374 .model_id = "Intel Xeon Processor (Icelake)",
4375 .versions = (X86CPUVersionDefinition[]) {
4376 { .version = 1 },
4377 {
4378 .version = 2,
4379 .note = "no TSX",
4380 .alias = "Icelake-Server-noTSX",
4381 .props = (PropValue[]) {
4382 { "hle", "off" },
4383 { "rtm", "off" },
4384 { /* end of list */ }
4385 },
4386 },
4387 {
4388 .version = 3,
4389 .props = (PropValue[]) {
4390 { "arch-capabilities", "on" },
4391 { "rdctl-no", "on" },
4392 { "ibrs-all", "on" },
4393 { "skip-l1dfl-vmentry", "on" },
4394 { "mds-no", "on" },
4395 { "pschange-mc-no", "on" },
4396 { "taa-no", "on" },
4397 { /* end of list */ }
4398 },
4399 },
4400 {
4401 .version = 4,
4402 .props = (PropValue[]) {
4403 { "sha-ni", "on" },
4404 { "avx512ifma", "on" },
4405 { "rdpid", "on" },
4406 { "fsrm", "on" },
4407 { "vmx-rdseed-exit", "on" },
4408 { "vmx-pml", "on" },
4409 { "vmx-eptp-switching", "on" },
4410 { "model", "106" },
4411 { /* end of list */ }
4412 },
4413 },
4414 {
4415 .version = 5,
4416 .note = "XSAVES",
4417 .props = (PropValue[]) {
4418 { "xsaves", "on" },
4419 { "vmx-xsaves", "on" },
4420 { /* end of list */ }
4421 },
4422 },
4423 {
4424 .version = 6,
4425 .note = "5-level EPT",
4426 .props = (PropValue[]) {
4427 { "vmx-page-walk-5", "on" },
4428 { /* end of list */ }
4429 },
4430 },
4431 {
4432 .version = 7,
4433 .note = "TSX, taa-no",
4434 .props = (PropValue[]) {
4435 /* Restore TSX features removed by -v2 above */
4436 { "hle", "on" },
4437 { "rtm", "on" },
4438 { /* end of list */ }
4439 },
4440 },
4441 { /* end of list */ }
4442 }
4443 },
4444 {
4445 .name = "SapphireRapids",
4446 .level = 0x20,
4447 .vendor = CPUID_VENDOR_INTEL,
4448 .family = 6,
4449 .model = 143,
4450 .stepping = 4,
4451 /*
4452 * please keep the ascending order so that we can have a clear view of
4453 * bit position of each feature.
4454 */
4455 .features[FEAT_1_EDX] =
4456 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
4457 CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
4458 CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
4459 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
4460 CPUID_SSE | CPUID_SSE2,
4461 .features[FEAT_1_ECX] =
4462 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 |
4463 CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 |
4464 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
4465 CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES |
4466 CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
4467 .features[FEAT_8000_0001_EDX] =
4468 CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
4469 CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
4470 .features[FEAT_8000_0001_ECX] =
4471 CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH,
4472 .features[FEAT_8000_0008_EBX] =
4473 CPUID_8000_0008_EBX_WBNOINVD,
4474 .features[FEAT_7_0_EBX] =
4475 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_HLE |
4476 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 |
4477 CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_RTM |
4478 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
4479 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP |
4480 CPUID_7_0_EBX_AVX512IFMA | CPUID_7_0_EBX_CLFLUSHOPT |
4481 CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_SHA_NI |
4482 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512VL,
4483 .features[FEAT_7_0_ECX] =
4484 CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
4485 CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
4486 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
4487 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
4488 CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57 |
4489 CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT,
4490 .features[FEAT_7_0_EDX] =
4491 CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE |
4492 CPUID_7_0_EDX_TSX_LDTRK | CPUID_7_0_EDX_AMX_BF16 |
4493 CPUID_7_0_EDX_AVX512_FP16 | CPUID_7_0_EDX_AMX_TILE |
4494 CPUID_7_0_EDX_AMX_INT8 | CPUID_7_0_EDX_SPEC_CTRL |
4495 CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
4496 .features[FEAT_ARCH_CAPABILITIES] =
4497 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
4498 MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
4499 MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO,
4500 .features[FEAT_XSAVE] =
4501 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4502 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES | CPUID_D_1_EAX_XFD,
4503 .features[FEAT_6_EAX] =
4504 CPUID_6_EAX_ARAT,
4505 .features[FEAT_7_1_EAX] =
4506 CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_AVX512_BF16 |
4507 CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_FSRC,
4508 .features[FEAT_VMX_BASIC] =
4509 MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS,
4510 .features[FEAT_VMX_ENTRY_CTLS] =
4511 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE |
4512 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL |
4513 VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER,
4514 .features[FEAT_VMX_EPT_VPID_CAPS] =
4515 MSR_VMX_EPT_EXECONLY |
4516 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_PAGE_WALK_LENGTH_5 |
4517 MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB |
4518 MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS |
4519 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
4520 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
4521 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT |
4522 MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
4523 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
4524 .features[FEAT_VMX_EXIT_CTLS] =
4525 VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
4526 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
4527 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT |
4528 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
4529 VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
4530 .features[FEAT_VMX_MISC] =
4531 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT |
4532 MSR_VMX_MISC_VMWRITE_VMEXIT,
4533 .features[FEAT_VMX_PINBASED_CTLS] =
4534 VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING |
4535 VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER |
4536 VMX_PIN_BASED_POSTED_INTR,
4537 .features[FEAT_VMX_PROCBASED_CTLS] =
4538 VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
4539 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
4540 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
4541 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
4542 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
4543 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
4544 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING |
4545 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
4546 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG |
4547 VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
4548 VMX_CPU_BASED_PAUSE_EXITING |
4549 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
4550 .features[FEAT_VMX_SECONDARY_CTLS] =
4551 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
4552 VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC |
4553 VMX_SECONDARY_EXEC_RDTSCP |
4554 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
4555 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING |
4556 VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
4557 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
4558 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
4559 VMX_SECONDARY_EXEC_RDRAND_EXITING |
4560 VMX_SECONDARY_EXEC_ENABLE_INVPCID |
4561 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
4562 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML |
4563 VMX_SECONDARY_EXEC_XSAVES,
4564 .features[FEAT_VMX_VMFUNC] =
4565 MSR_VMX_VMFUNC_EPT_SWITCHING,
4566 .xlevel = 0x80000008,
4567 .model_id = "Intel Xeon Processor (SapphireRapids)",
4568 .versions = (X86CPUVersionDefinition[]) {
4569 { .version = 1 },
4570 {
4571 .version = 2,
4572 .props = (PropValue[]) {
4573 { "sbdr-ssdp-no", "on" },
4574 { "fbsdp-no", "on" },
4575 { "psdp-no", "on" },
4576 { /* end of list */ }
4577 }
4578 },
4579 {
4580 .version = 3,
4581 .props = (PropValue[]) {
4582 { "ss", "on" },
4583 { "tsc-adjust", "on" },
4584 { "cldemote", "on" },
4585 { "movdiri", "on" },
4586 { "movdir64b", "on" },
4587 { /* end of list */ }
4588 }
4589 },
4590 { /* end of list */ }
4591 }
4592 },
4593 {
4594 .name = "GraniteRapids",
4595 .level = 0x20,
4596 .vendor = CPUID_VENDOR_INTEL,
4597 .family = 6,
4598 .model = 173,
4599 .stepping = 0,
4600 /*
4601 * please keep the ascending order so that we can have a clear view of
4602 * bit position of each feature.
4603 */
4604 .features[FEAT_1_EDX] =
4605 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
4606 CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
4607 CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
4608 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
4609 CPUID_SSE | CPUID_SSE2,
4610 .features[FEAT_1_ECX] =
4611 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 |
4612 CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 |
4613 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
4614 CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES |
4615 CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
4616 .features[FEAT_8000_0001_EDX] =
4617 CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
4618 CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
4619 .features[FEAT_8000_0001_ECX] =
4620 CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH,
4621 .features[FEAT_8000_0008_EBX] =
4622 CPUID_8000_0008_EBX_WBNOINVD,
4623 .features[FEAT_7_0_EBX] =
4624 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_HLE |
4625 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 |
4626 CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_RTM |
4627 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
4628 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP |
4629 CPUID_7_0_EBX_AVX512IFMA | CPUID_7_0_EBX_CLFLUSHOPT |
4630 CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_SHA_NI |
4631 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512VL,
4632 .features[FEAT_7_0_ECX] =
4633 CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
4634 CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
4635 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
4636 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
4637 CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57 |
4638 CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT,
4639 .features[FEAT_7_0_EDX] =
4640 CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE |
4641 CPUID_7_0_EDX_TSX_LDTRK | CPUID_7_0_EDX_AMX_BF16 |
4642 CPUID_7_0_EDX_AVX512_FP16 | CPUID_7_0_EDX_AMX_TILE |
4643 CPUID_7_0_EDX_AMX_INT8 | CPUID_7_0_EDX_SPEC_CTRL |
4644 CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
4645 .features[FEAT_ARCH_CAPABILITIES] =
4646 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
4647 MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
4648 MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO |
4649 MSR_ARCH_CAP_SBDR_SSDP_NO | MSR_ARCH_CAP_FBSDP_NO |
4650 MSR_ARCH_CAP_PSDP_NO | MSR_ARCH_CAP_PBRSB_NO,
4651 .features[FEAT_XSAVE] =
4652 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4653 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES | CPUID_D_1_EAX_XFD,
4654 .features[FEAT_6_EAX] =
4655 CPUID_6_EAX_ARAT,
4656 .features[FEAT_7_1_EAX] =
4657 CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_AVX512_BF16 |
4658 CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_FSRC |
4659 CPUID_7_1_EAX_AMX_FP16,
4660 .features[FEAT_7_1_EDX] =
4661 CPUID_7_1_EDX_PREFETCHITI,
4662 .features[FEAT_7_2_EDX] =
4663 CPUID_7_2_EDX_MCDT_NO,
4664 .features[FEAT_VMX_BASIC] =
4665 MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS,
4666 .features[FEAT_VMX_ENTRY_CTLS] =
4667 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE |
4668 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL |
4669 VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER,
4670 .features[FEAT_VMX_EPT_VPID_CAPS] =
4671 MSR_VMX_EPT_EXECONLY |
4672 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_PAGE_WALK_LENGTH_5 |
4673 MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB |
4674 MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS |
4675 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
4676 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
4677 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT |
4678 MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
4679 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
4680 .features[FEAT_VMX_EXIT_CTLS] =
4681 VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
4682 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
4683 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT |
4684 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
4685 VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
4686 .features[FEAT_VMX_MISC] =
4687 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT |
4688 MSR_VMX_MISC_VMWRITE_VMEXIT,
4689 .features[FEAT_VMX_PINBASED_CTLS] =
4690 VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING |
4691 VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER |
4692 VMX_PIN_BASED_POSTED_INTR,
4693 .features[FEAT_VMX_PROCBASED_CTLS] =
4694 VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
4695 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
4696 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
4697 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
4698 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
4699 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
4700 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING |
4701 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
4702 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG |
4703 VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
4704 VMX_CPU_BASED_PAUSE_EXITING |
4705 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
4706 .features[FEAT_VMX_SECONDARY_CTLS] =
4707 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
4708 VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC |
4709 VMX_SECONDARY_EXEC_RDTSCP |
4710 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
4711 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING |
4712 VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
4713 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
4714 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
4715 VMX_SECONDARY_EXEC_RDRAND_EXITING |
4716 VMX_SECONDARY_EXEC_ENABLE_INVPCID |
4717 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
4718 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML |
4719 VMX_SECONDARY_EXEC_XSAVES,
4720 .features[FEAT_VMX_VMFUNC] =
4721 MSR_VMX_VMFUNC_EPT_SWITCHING,
4722 .xlevel = 0x80000008,
4723 .model_id = "Intel Xeon Processor (GraniteRapids)",
4724 .versions = (X86CPUVersionDefinition[]) {
4725 { .version = 1 },
4726 {
4727 .version = 2,
4728 .props = (PropValue[]) {
4729 { "ss", "on" },
4730 { "tsc-adjust", "on" },
4731 { "cldemote", "on" },
4732 { "movdiri", "on" },
4733 { "movdir64b", "on" },
4734 { "avx10", "on" },
4735 { "avx10-128", "on" },
4736 { "avx10-256", "on" },
4737 { "avx10-512", "on" },
4738 { "avx10-version", "1" },
4739 { "stepping", "1" },
4740 { /* end of list */ }
4741 }
4742 },
4743 { /* end of list */ },
4744 },
4745 },
4746 {
4747 .name = "SierraForest",
4748 .level = 0x23,
4749 .vendor = CPUID_VENDOR_INTEL,
4750 .family = 6,
4751 .model = 175,
4752 .stepping = 0,
4753 /*
4754 * please keep the ascending order so that we can have a clear view of
4755 * bit position of each feature.
4756 */
4757 .features[FEAT_1_EDX] =
4758 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
4759 CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
4760 CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
4761 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
4762 CPUID_SSE | CPUID_SSE2,
4763 .features[FEAT_1_ECX] =
4764 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 |
4765 CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 |
4766 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
4767 CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES |
4768 CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
4769 .features[FEAT_8000_0001_EDX] =
4770 CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
4771 CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
4772 .features[FEAT_8000_0001_ECX] =
4773 CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH,
4774 .features[FEAT_8000_0008_EBX] =
4775 CPUID_8000_0008_EBX_WBNOINVD,
4776 .features[FEAT_7_0_EBX] =
4777 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4778 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
4779 CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
4780 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_CLWB |
4781 CPUID_7_0_EBX_SHA_NI,
4782 .features[FEAT_7_0_ECX] =
4783 CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | CPUID_7_0_ECX_GFNI |
4784 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
4785 CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT,
4786 .features[FEAT_7_0_EDX] =
4787 CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE |
4788 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_ARCH_CAPABILITIES |
4789 CPUID_7_0_EDX_SPEC_CTRL_SSBD,
4790 .features[FEAT_ARCH_CAPABILITIES] =
4791 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
4792 MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
4793 MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_SBDR_SSDP_NO |
4794 MSR_ARCH_CAP_FBSDP_NO | MSR_ARCH_CAP_PSDP_NO |
4795 MSR_ARCH_CAP_PBRSB_NO,
4796 .features[FEAT_XSAVE] =
4797 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4798 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
4799 .features[FEAT_6_EAX] =
4800 CPUID_6_EAX_ARAT,
4801 .features[FEAT_7_1_EAX] =
4802 CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_CMPCCXADD |
4803 CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_AVX_IFMA,
4804 .features[FEAT_7_1_EDX] =
4805 CPUID_7_1_EDX_AVX_VNNI_INT8 | CPUID_7_1_EDX_AVX_NE_CONVERT,
4806 .features[FEAT_7_2_EDX] =
4807 CPUID_7_2_EDX_MCDT_NO,
4808 .features[FEAT_VMX_BASIC] =
4809 MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS,
4810 .features[FEAT_VMX_ENTRY_CTLS] =
4811 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE |
4812 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL |
4813 VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER,
4814 .features[FEAT_VMX_EPT_VPID_CAPS] =
4815 MSR_VMX_EPT_EXECONLY | MSR_VMX_EPT_PAGE_WALK_LENGTH_4 |
4816 MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB |
4817 MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS |
4818 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
4819 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
4820 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT |
4821 MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
4822 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
4823 .features[FEAT_VMX_EXIT_CTLS] =
4824 VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
4825 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
4826 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT |
4827 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
4828 VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
4829 .features[FEAT_VMX_MISC] =
4830 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT |
4831 MSR_VMX_MISC_VMWRITE_VMEXIT,
4832 .features[FEAT_VMX_PINBASED_CTLS] =
4833 VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING |
4834 VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER |
4835 VMX_PIN_BASED_POSTED_INTR,
4836 .features[FEAT_VMX_PROCBASED_CTLS] =
4837 VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
4838 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
4839 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
4840 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
4841 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
4842 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
4843 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING |
4844 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
4845 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG |
4846 VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
4847 VMX_CPU_BASED_PAUSE_EXITING |
4848 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
4849 .features[FEAT_VMX_SECONDARY_CTLS] =
4850 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
4851 VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC |
4852 VMX_SECONDARY_EXEC_RDTSCP |
4853 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
4854 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING |
4855 VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
4856 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
4857 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
4858 VMX_SECONDARY_EXEC_RDRAND_EXITING |
4859 VMX_SECONDARY_EXEC_ENABLE_INVPCID |
4860 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
4861 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML |
4862 VMX_SECONDARY_EXEC_XSAVES,
4863 .features[FEAT_VMX_VMFUNC] =
4864 MSR_VMX_VMFUNC_EPT_SWITCHING,
4865 .xlevel = 0x80000008,
4866 .model_id = "Intel Xeon Processor (SierraForest)",
4867 .versions = (X86CPUVersionDefinition[]) {
4868 { .version = 1 },
4869 {
4870 .version = 2,
4871 .props = (PropValue[]) {
4872 { "ss", "on" },
4873 { "tsc-adjust", "on" },
4874 { "cldemote", "on" },
4875 { "movdiri", "on" },
4876 { "movdir64b", "on" },
4877 { "gds-no", "on" },
4878 { "rfds-no", "on" },
4879 { "lam", "on" },
4880 { "intel-psfd", "on"},
4881 { "ipred-ctrl", "on"},
4882 { "rrsba-ctrl", "on"},
4883 { "bhi-ctrl", "on"},
4884 { "stepping", "3" },
4885 { /* end of list */ }
4886 }
4887 },
4888 { /* end of list */ },
4889 },
4890 },
4891 {
4892 .name = "ClearwaterForest",
4893 .level = 0x23,
4894 .xlevel = 0x80000008,
4895 .vendor = CPUID_VENDOR_INTEL,
4896 .family = 6,
4897 .model = 221,
4898 .stepping = 0,
4899 /*
4900 * please keep the ascending order so that we can have a clear view of
4901 * bit position of each feature.
4902 */
4903 .features[FEAT_1_EDX] =
4904 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
4905 CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
4906 CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
4907 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
4908 CPUID_SSE | CPUID_SSE2 | CPUID_SS,
4909 .features[FEAT_1_ECX] =
4910 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 |
4911 CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 |
4912 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
4913 CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES |
4914 CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
4915 .features[FEAT_8000_0001_EDX] =
4916 CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
4917 CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
4918 .features[FEAT_8000_0001_ECX] =
4919 CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH,
4920 .features[FEAT_8000_0008_EBX] =
4921 CPUID_8000_0008_EBX_WBNOINVD,
4922 .features[FEAT_7_0_EBX] =
4923 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_TSC_ADJUST |
4924 CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
4925 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
4926 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP |
4927 CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_CLWB |
4928 CPUID_7_0_EBX_SHA_NI,
4929 .features[FEAT_7_0_ECX] =
4930 CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | CPUID_7_0_ECX_GFNI |
4931 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
4932 CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT |
4933 CPUID_7_0_ECX_CLDEMOTE | CPUID_7_0_ECX_MOVDIRI |
4934 CPUID_7_0_ECX_MOVDIR64B,
4935 .features[FEAT_7_0_EDX] =
4936 CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE |
4937 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_ARCH_CAPABILITIES |
4938 CPUID_7_0_EDX_SPEC_CTRL_SSBD,
4939 .features[FEAT_ARCH_CAPABILITIES] =
4940 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
4941 MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
4942 MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_SBDR_SSDP_NO |
4943 MSR_ARCH_CAP_FBSDP_NO | MSR_ARCH_CAP_PSDP_NO |
4944 MSR_ARCH_CAP_BHI_NO | MSR_ARCH_CAP_PBRSB_NO |
4945 MSR_ARCH_CAP_GDS_NO | MSR_ARCH_CAP_RFDS_NO,
4946 .features[FEAT_XSAVE] =
4947 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4948 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
4949 .features[FEAT_6_EAX] =
4950 CPUID_6_EAX_ARAT,
4951 .features[FEAT_7_1_EAX] =
4952 CPUID_7_1_EAX_SHA512 | CPUID_7_1_EAX_SM3 | CPUID_7_1_EAX_SM4 |
4953 CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_CMPCCXADD |
4954 CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_AVX_IFMA |
4955 CPUID_7_1_EAX_LAM,
4956 .features[FEAT_7_1_EDX] =
4957 CPUID_7_1_EDX_AVX_VNNI_INT8 | CPUID_7_1_EDX_AVX_NE_CONVERT |
4958 CPUID_7_1_EDX_AVX_VNNI_INT16 | CPUID_7_1_EDX_PREFETCHITI,
4959 .features[FEAT_7_2_EDX] =
4960 CPUID_7_2_EDX_PSFD | CPUID_7_2_EDX_IPRED_CTRL |
4961 CPUID_7_2_EDX_RRSBA_CTRL | CPUID_7_2_EDX_DDPD_U |
4962 CPUID_7_2_EDX_BHI_CTRL | CPUID_7_2_EDX_MCDT_NO,
4963 .features[FEAT_VMX_BASIC] =
4964 MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS,
4965 .features[FEAT_VMX_ENTRY_CTLS] =
4966 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE |
4967 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL |
4968 VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER,
4969 .features[FEAT_VMX_EPT_VPID_CAPS] =
4970 MSR_VMX_EPT_EXECONLY | MSR_VMX_EPT_PAGE_WALK_LENGTH_4 |
4971 MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB |
4972 MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS |
4973 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
4974 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
4975 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT |
4976 MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
4977 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
4978 .features[FEAT_VMX_EXIT_CTLS] =
4979 VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
4980 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
4981 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT |
4982 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
4983 VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
4984 .features[FEAT_VMX_MISC] =
4985 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT |
4986 MSR_VMX_MISC_VMWRITE_VMEXIT,
4987 .features[FEAT_VMX_PINBASED_CTLS] =
4988 VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING |
4989 VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER |
4990 VMX_PIN_BASED_POSTED_INTR,
4991 .features[FEAT_VMX_PROCBASED_CTLS] =
4992 VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
4993 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
4994 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
4995 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
4996 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
4997 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
4998 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING |
4999 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
5000 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG |
5001 VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
5002 VMX_CPU_BASED_PAUSE_EXITING |
5003 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
5004 .features[FEAT_VMX_SECONDARY_CTLS] =
5005 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
5006 VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC |
5007 VMX_SECONDARY_EXEC_RDTSCP |
5008 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
5009 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING |
5010 VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
5011 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
5012 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
5013 VMX_SECONDARY_EXEC_RDRAND_EXITING |
5014 VMX_SECONDARY_EXEC_ENABLE_INVPCID |
5015 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
5016 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML |
5017 VMX_SECONDARY_EXEC_XSAVES,
5018 .features[FEAT_VMX_VMFUNC] =
5019 MSR_VMX_VMFUNC_EPT_SWITCHING,
5020 .model_id = "Intel Xeon Processor (ClearwaterForest)",
5021 .versions = (X86CPUVersionDefinition[]) {
5022 { .version = 1 },
5023 { /* end of list */ },
5024 },
5025 },
5026 {
5027 .name = "Denverton",
5028 .level = 21,
5029 .vendor = CPUID_VENDOR_INTEL,
5030 .family = 6,
5031 .model = 95,
5032 .stepping = 1,
5033 .features[FEAT_1_EDX] =
5034 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
5035 CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
5036 CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
5037 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
5038 CPUID_SSE | CPUID_SSE2,
5039 .features[FEAT_1_ECX] =
5040 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR |
5041 CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | CPUID_EXT_SSE41 |
5042 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
5043 CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER |
5044 CPUID_EXT_AES | CPUID_EXT_XSAVE | CPUID_EXT_RDRAND,
5045 .features[FEAT_8000_0001_EDX] =
5046 CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
5047 CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
5048 .features[FEAT_8000_0001_ECX] =
5049 CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
5050 .features[FEAT_7_0_EBX] =
5051 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_ERMS |
5052 CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_SMAP |
5053 CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_SHA_NI,
5054 .features[FEAT_7_0_EDX] =
5055 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_ARCH_CAPABILITIES |
5056 CPUID_7_0_EDX_SPEC_CTRL_SSBD,
5057 /* XSAVES is added in version 3 */
5058 .features[FEAT_XSAVE] =
5059 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | CPUID_XSAVE_XGETBV1,
5060 .features[FEAT_6_EAX] =
5061 CPUID_6_EAX_ARAT,
5062 .features[FEAT_ARCH_CAPABILITIES] =
5063 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY,
5064 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
5065 MSR_VMX_BASIC_TRUE_CTLS,
5066 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
5067 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
5068 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
5069 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
5070 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
5071 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
5072 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
5073 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
5074 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
5075 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
5076 .features[FEAT_VMX_EXIT_CTLS] =
5077 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
5078 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
5079 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
5080 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
5081 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
5082 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
5083 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
5084 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
5085 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
5086 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
5087 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
5088 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
5089 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
5090 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
5091 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
5092 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
5093 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
5094 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
5095 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
5096 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
5097 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
5098 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
5099 .features[FEAT_VMX_SECONDARY_CTLS] =
5100 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
5101 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
5102 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
5103 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
5104 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
5105 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
5106 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
5107 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
5108 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
5109 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
5110 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
5111 .xlevel = 0x80000008,
5112 .model_id = "Intel Atom Processor (Denverton)",
5113 .versions = (X86CPUVersionDefinition[]) {
5114 { .version = 1 },
5115 {
5116 .version = 2,
5117 .note = "no MPX, no MONITOR",
5118 .props = (PropValue[]) {
5119 { "monitor", "off" },
5120 { "mpx", "off" },
5121 { /* end of list */ },
5122 },
5123 },
5124 {
5125 .version = 3,
5126 .note = "XSAVES, no MPX, no MONITOR",
5127 .props = (PropValue[]) {
5128 { "xsaves", "on" },
5129 { "vmx-xsaves", "on" },
5130 { /* end of list */ },
5131 },
5132 },
5133 { /* end of list */ },
5134 },
5135 },
5136 {
5137 .name = "Snowridge",
5138 .level = 27,
5139 .vendor = CPUID_VENDOR_INTEL,
5140 .family = 6,
5141 .model = 134,
5142 .stepping = 1,
5143 .features[FEAT_1_EDX] =
5144 /* missing: CPUID_PN CPUID_IA64 */
5145 /* missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
5146 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE |
5147 CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE |
5148 CPUID_CX8 | CPUID_APIC | CPUID_SEP |
5149 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
5150 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH |
5151 CPUID_MMX |
5152 CPUID_FXSR | CPUID_SSE | CPUID_SSE2,
5153 .features[FEAT_1_ECX] =
5154 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR |
5155 CPUID_EXT_SSSE3 |
5156 CPUID_EXT_CX16 |
5157 CPUID_EXT_SSE41 |
5158 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
5159 CPUID_EXT_POPCNT |
5160 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES | CPUID_EXT_XSAVE |
5161 CPUID_EXT_RDRAND,
5162 .features[FEAT_8000_0001_EDX] =
5163 CPUID_EXT2_SYSCALL |
5164 CPUID_EXT2_NX |
5165 CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
5166 CPUID_EXT2_LM,
5167 .features[FEAT_8000_0001_ECX] =
5168 CPUID_EXT3_LAHF_LM |
5169 CPUID_EXT3_3DNOWPREFETCH,
5170 .features[FEAT_7_0_EBX] =
5171 CPUID_7_0_EBX_FSGSBASE |
5172 CPUID_7_0_EBX_SMEP |
5173 CPUID_7_0_EBX_ERMS |
5174 CPUID_7_0_EBX_MPX | /* missing bits 13, 15 */
5175 CPUID_7_0_EBX_RDSEED |
5176 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
5177 CPUID_7_0_EBX_CLWB |
5178 CPUID_7_0_EBX_SHA_NI,
5179 .features[FEAT_7_0_ECX] =
5180 CPUID_7_0_ECX_UMIP |
5181 /* missing bit 5 */
5182 CPUID_7_0_ECX_GFNI |
5183 CPUID_7_0_ECX_MOVDIRI | CPUID_7_0_ECX_CLDEMOTE |
5184 CPUID_7_0_ECX_MOVDIR64B,
5185 .features[FEAT_7_0_EDX] =
5186 CPUID_7_0_EDX_SPEC_CTRL |
5187 CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD |
5188 CPUID_7_0_EDX_CORE_CAPABILITY,
5189 .features[FEAT_CORE_CAPABILITY] =
5190 MSR_CORE_CAP_SPLIT_LOCK_DETECT,
5191 /* XSAVES is added in version 3 */
5192 .features[FEAT_XSAVE] =
5193 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
5194 CPUID_XSAVE_XGETBV1,
5195 .features[FEAT_6_EAX] =
5196 CPUID_6_EAX_ARAT,
5197 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
5198 MSR_VMX_BASIC_TRUE_CTLS,
5199 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
5200 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
5201 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
5202 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
5203 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
5204 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
5205 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
5206 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
5207 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
5208 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
5209 .features[FEAT_VMX_EXIT_CTLS] =
5210 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
5211 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
5212 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
5213 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
5214 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
5215 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
5216 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
5217 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
5218 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
5219 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
5220 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
5221 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
5222 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
5223 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
5224 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
5225 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
5226 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
5227 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
5228 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
5229 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
5230 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
5231 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
5232 .features[FEAT_VMX_SECONDARY_CTLS] =
5233 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
5234 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
5235 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
5236 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
5237 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
5238 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
5239 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
5240 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
5241 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
5242 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
5243 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
5244 .xlevel = 0x80000008,
5245 .model_id = "Intel Atom Processor (SnowRidge)",
5246 .versions = (X86CPUVersionDefinition[]) {
5247 { .version = 1 },
5248 {
5249 .version = 2,
5250 .props = (PropValue[]) {
5251 { "mpx", "off" },
5252 { "model-id", "Intel Atom Processor (Snowridge, no MPX)" },
5253 { /* end of list */ },
5254 },
5255 },
5256 {
5257 .version = 3,
5258 .note = "XSAVES, no MPX",
5259 .props = (PropValue[]) {
5260 { "xsaves", "on" },
5261 { "vmx-xsaves", "on" },
5262 { /* end of list */ },
5263 },
5264 },
5265 {
5266 .version = 4,
5267 .note = "no split lock detect, no core-capability",
5268 .props = (PropValue[]) {
5269 { "split-lock-detect", "off" },
5270 { "core-capability", "off" },
5271 { /* end of list */ },
5272 },
5273 },
5274 { /* end of list */ },
5275 },
5276 },
5277 {
5278 .name = "KnightsMill",
5279 .level = 0xd,
5280 .vendor = CPUID_VENDOR_INTEL,
5281 .family = 6,
5282 .model = 133,
5283 .stepping = 0,
5284 .features[FEAT_1_EDX] =
5285 CPUID_VME | CPUID_SS | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR |
5286 CPUID_MMX | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV |
5287 CPUID_MCA | CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC |
5288 CPUID_CX8 | CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC |
5289 CPUID_PSE | CPUID_DE | CPUID_FP87,
5290 .features[FEAT_1_ECX] =
5291 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
5292 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
5293 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
5294 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
5295 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
5296 CPUID_EXT_F16C | CPUID_EXT_RDRAND,
5297 .features[FEAT_8000_0001_EDX] =
5298 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
5299 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
5300 .features[FEAT_8000_0001_ECX] =
5301 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
5302 .features[FEAT_7_0_EBX] =
5303 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
5304 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
5305 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_AVX512F |
5306 CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_AVX512PF |
5307 CPUID_7_0_EBX_AVX512ER,
5308 .features[FEAT_7_0_ECX] =
5309 CPUID_7_0_ECX_AVX512_VPOPCNTDQ,
5310 .features[FEAT_7_0_EDX] =
5311 CPUID_7_0_EDX_AVX512_4VNNIW | CPUID_7_0_EDX_AVX512_4FMAPS,
5312 .features[FEAT_XSAVE] =
5313 CPUID_XSAVE_XSAVEOPT,
5314 .features[FEAT_6_EAX] =
5315 CPUID_6_EAX_ARAT,
5316 .xlevel = 0x80000008,
5317 .model_id = "Intel Xeon Phi Processor (Knights Mill)",
5318 },
5319 {
5320 .name = "Opteron_G1",
5321 .level = 5,
5322 .vendor = CPUID_VENDOR_AMD,
5323 .family = 15,
5324 .model = 6,
5325 .stepping = 1,
5326 .features[FEAT_1_EDX] =
5327 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
5328 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
5329 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
5330 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
5331 CPUID_DE | CPUID_FP87,
5332 .features[FEAT_1_ECX] =
5333 CPUID_EXT_SSE3,
5334 .features[FEAT_8000_0001_EDX] =
5335 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
5336 .xlevel = 0x80000008,
5337 .model_id = "AMD Opteron 240 (Gen 1 Class Opteron)",
5338 },
5339 {
5340 .name = "Opteron_G2",
5341 .level = 5,
5342 .vendor = CPUID_VENDOR_AMD,
5343 .family = 15,
5344 .model = 6,
5345 .stepping = 1,
5346 .features[FEAT_1_EDX] =
5347 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
5348 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
5349 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
5350 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
5351 CPUID_DE | CPUID_FP87,
5352 .features[FEAT_1_ECX] =
5353 CPUID_EXT_CX16 | CPUID_EXT_SSE3,
5354 .features[FEAT_8000_0001_EDX] =
5355 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
5356 .features[FEAT_8000_0001_ECX] =
5357 CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
5358 .xlevel = 0x80000008,
5359 .model_id = "AMD Opteron 22xx (Gen 2 Class Opteron)",
5360 },
5361 {
5362 .name = "Opteron_G3",
5363 .level = 5,
5364 .vendor = CPUID_VENDOR_AMD,
5365 .family = 16,
5366 .model = 2,
5367 .stepping = 3,
5368 .features[FEAT_1_EDX] =
5369 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
5370 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
5371 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
5372 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
5373 CPUID_DE | CPUID_FP87,
5374 .features[FEAT_1_ECX] =
5375 CPUID_EXT_POPCNT | CPUID_EXT_CX16 | CPUID_EXT_MONITOR |
5376 CPUID_EXT_SSE3,
5377 .features[FEAT_8000_0001_EDX] =
5378 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL |
5379 CPUID_EXT2_RDTSCP,
5380 .features[FEAT_8000_0001_ECX] =
5381 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A |
5382 CPUID_EXT3_ABM | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
5383 .xlevel = 0x80000008,
5384 .model_id = "AMD Opteron 23xx (Gen 3 Class Opteron)",
5385 },
5386 {
5387 .name = "Opteron_G4",
5388 .level = 0xd,
5389 .vendor = CPUID_VENDOR_AMD,
5390 .family = 21,
5391 .model = 1,
5392 .stepping = 2,
5393 .features[FEAT_1_EDX] =
5394 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
5395 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
5396 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
5397 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
5398 CPUID_DE | CPUID_FP87,
5399 .features[FEAT_1_ECX] =
5400 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
5401 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
5402 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
5403 CPUID_EXT_SSE3,
5404 .features[FEAT_8000_0001_EDX] =
5405 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
5406 CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
5407 .features[FEAT_8000_0001_ECX] =
5408 CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
5409 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
5410 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
5411 CPUID_EXT3_LAHF_LM,
5412 .features[FEAT_SVM] =
5413 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
5414 /* no xsaveopt! */
5415 .xlevel = 0x8000001A,
5416 .model_id = "AMD Opteron 62xx class CPU",
5417 },
5418 {
5419 .name = "Opteron_G5",
5420 .level = 0xd,
5421 .vendor = CPUID_VENDOR_AMD,
5422 .family = 21,
5423 .model = 2,
5424 .stepping = 0,
5425 .features[FEAT_1_EDX] =
5426 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
5427 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
5428 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
5429 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
5430 CPUID_DE | CPUID_FP87,
5431 .features[FEAT_1_ECX] =
5432 CPUID_EXT_F16C | CPUID_EXT_AVX | CPUID_EXT_XSAVE |
5433 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
5434 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_FMA |
5435 CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
5436 .features[FEAT_8000_0001_EDX] =
5437 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
5438 CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
5439 .features[FEAT_8000_0001_ECX] =
5440 CPUID_EXT3_TBM | CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
5441 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
5442 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
5443 CPUID_EXT3_LAHF_LM,
5444 .features[FEAT_SVM] =
5445 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
5446 /* no xsaveopt! */
5447 .xlevel = 0x8000001A,
5448 .model_id = "AMD Opteron 63xx class CPU",
5449 },
5450 {
5451 .name = "EPYC",
5452 .level = 0xd,
5453 .vendor = CPUID_VENDOR_AMD,
5454 .family = 23,
5455 .model = 1,
5456 .stepping = 2,
5457 .features[FEAT_1_EDX] =
5458 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
5459 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
5460 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
5461 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
5462 CPUID_VME | CPUID_FP87,
5463 .features[FEAT_1_ECX] =
5464 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
5465 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
5466 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
5467 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
5468 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
5469 .features[FEAT_8000_0001_EDX] =
5470 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
5471 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
5472 CPUID_EXT2_SYSCALL,
5473 .features[FEAT_8000_0001_ECX] =
5474 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
5475 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
5476 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
5477 CPUID_EXT3_TOPOEXT,
5478 .features[FEAT_7_0_EBX] =
5479 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
5480 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
5481 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
5482 CPUID_7_0_EBX_SHA_NI,
5483 .features[FEAT_XSAVE] =
5484 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
5485 CPUID_XSAVE_XGETBV1,
5486 .features[FEAT_6_EAX] =
5487 CPUID_6_EAX_ARAT,
5488 .features[FEAT_SVM] =
5489 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
5490 .xlevel = 0x8000001E,
5491 .model_id = "AMD EPYC Processor",
5492 .cache_info = &epyc_cache_info,
5493 .versions = (X86CPUVersionDefinition[]) {
5494 { .version = 1 },
5495 {
5496 .version = 2,
5497 .alias = "EPYC-IBPB",
5498 .props = (PropValue[]) {
5499 { "ibpb", "on" },
5500 { "model-id",
5501 "AMD EPYC Processor (with IBPB)" },
5502 { /* end of list */ }
5503 }
5504 },
5505 {
5506 .version = 3,
5507 .props = (PropValue[]) {
5508 { "ibpb", "on" },
5509 { "perfctr-core", "on" },
5510 { "clzero", "on" },
5511 { "xsaveerptr", "on" },
5512 { "xsaves", "on" },
5513 { "model-id",
5514 "AMD EPYC Processor" },
5515 { /* end of list */ }
5516 }
5517 },
5518 {
5519 .version = 4,
5520 .props = (PropValue[]) {
5521 { "model-id",
5522 "AMD EPYC-v4 Processor" },
5523 { /* end of list */ }
5524 },
5525 .cache_info = &epyc_v4_cache_info
5526 },
5527 {
5528 .version = 5,
5529 .props = (PropValue[]) {
5530 { "overflow-recov", "on" },
5531 { "succor", "on" },
5532 { "lbrv", "on" },
5533 { "tsc-scale", "on" },
5534 { "vmcb-clean", "on" },
5535 { "flushbyasid", "on" },
5536 { "pause-filter", "on" },
5537 { "pfthreshold", "on" },
5538 { "v-vmsave-vmload", "on" },
5539 { "vgif", "on" },
5540 { "model-id",
5541 "AMD EPYC-v5 Processor" },
5542 { /* end of list */ }
5543 },
5544 .cache_info = &epyc_v5_cache_info
5545 },
5546 { /* end of list */ }
5547 }
5548 },
5549 {
5550 .name = "Dhyana",
5551 .level = 0xd,
5552 .vendor = CPUID_VENDOR_HYGON,
5553 .family = 24,
5554 .model = 0,
5555 .stepping = 1,
5556 .features[FEAT_1_EDX] =
5557 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
5558 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
5559 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
5560 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
5561 CPUID_VME | CPUID_FP87,
5562 .features[FEAT_1_ECX] =
5563 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
5564 CPUID_EXT_XSAVE | CPUID_EXT_POPCNT |
5565 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
5566 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
5567 CPUID_EXT_MONITOR | CPUID_EXT_SSE3,
5568 .features[FEAT_8000_0001_EDX] =
5569 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
5570 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
5571 CPUID_EXT2_SYSCALL,
5572 .features[FEAT_8000_0001_ECX] =
5573 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
5574 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
5575 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
5576 CPUID_EXT3_TOPOEXT,
5577 .features[FEAT_8000_0008_EBX] =
5578 CPUID_8000_0008_EBX_IBPB,
5579 .features[FEAT_7_0_EBX] =
5580 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
5581 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
5582 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT,
5583 /* XSAVES is added in version 2 */
5584 .features[FEAT_XSAVE] =
5585 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
5586 CPUID_XSAVE_XGETBV1,
5587 .features[FEAT_6_EAX] =
5588 CPUID_6_EAX_ARAT,
5589 .features[FEAT_SVM] =
5590 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
5591 .xlevel = 0x8000001E,
5592 .model_id = "Hygon Dhyana Processor",
5593 .cache_info = &epyc_cache_info,
5594 .versions = (X86CPUVersionDefinition[]) {
5595 { .version = 1 },
5596 { .version = 2,
5597 .note = "XSAVES",
5598 .props = (PropValue[]) {
5599 { "xsaves", "on" },
5600 { /* end of list */ }
5601 },
5602 },
5603 { /* end of list */ }
5604 }
5605 },
5606 {
5607 .name = "EPYC-Rome",
5608 .level = 0xd,
5609 .vendor = CPUID_VENDOR_AMD,
5610 .family = 23,
5611 .model = 49,
5612 .stepping = 0,
5613 .features[FEAT_1_EDX] =
5614 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
5615 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
5616 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
5617 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
5618 CPUID_VME | CPUID_FP87,
5619 .features[FEAT_1_ECX] =
5620 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
5621 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
5622 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
5623 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
5624 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
5625 .features[FEAT_8000_0001_EDX] =
5626 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
5627 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
5628 CPUID_EXT2_SYSCALL,
5629 .features[FEAT_8000_0001_ECX] =
5630 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
5631 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
5632 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
5633 CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
5634 .features[FEAT_8000_0008_EBX] =
5635 CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
5636 CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
5637 CPUID_8000_0008_EBX_STIBP,
5638 .features[FEAT_7_0_EBX] =
5639 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
5640 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
5641 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
5642 CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_CLWB,
5643 .features[FEAT_7_0_ECX] =
5644 CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_RDPID,
5645 .features[FEAT_XSAVE] =
5646 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
5647 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
5648 .features[FEAT_6_EAX] =
5649 CPUID_6_EAX_ARAT,
5650 .features[FEAT_SVM] =
5651 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
5652 .xlevel = 0x8000001E,
5653 .model_id = "AMD EPYC-Rome Processor",
5654 .cache_info = &epyc_rome_cache_info,
5655 .versions = (X86CPUVersionDefinition[]) {
5656 { .version = 1 },
5657 {
5658 .version = 2,
5659 .props = (PropValue[]) {
5660 { "ibrs", "on" },
5661 { "amd-ssbd", "on" },
5662 { /* end of list */ }
5663 }
5664 },
5665 {
5666 .version = 3,
5667 .props = (PropValue[]) {
5668 { "model-id",
5669 "AMD EPYC-Rome-v3 Processor" },
5670 { /* end of list */ }
5671 },
5672 .cache_info = &epyc_rome_v3_cache_info
5673 },
5674 {
5675 .version = 4,
5676 .props = (PropValue[]) {
5677 /* Erratum 1386 */
5678 { "model-id",
5679 "AMD EPYC-Rome-v4 Processor (no XSAVES)" },
5680 { "xsaves", "off" },
5681 { /* end of list */ }
5682 },
5683 },
5684 {
5685 .version = 5,
5686 .props = (PropValue[]) {
5687 { "overflow-recov", "on" },
5688 { "succor", "on" },
5689 { "lbrv", "on" },
5690 { "tsc-scale", "on" },
5691 { "vmcb-clean", "on" },
5692 { "flushbyasid", "on" },
5693 { "pause-filter", "on" },
5694 { "pfthreshold", "on" },
5695 { "v-vmsave-vmload", "on" },
5696 { "vgif", "on" },
5697 { "model-id",
5698 "AMD EPYC-Rome-v5 Processor" },
5699 { /* end of list */ }
5700 },
5701 .cache_info = &epyc_rome_v5_cache_info
5702 },
5703 { /* end of list */ }
5704 }
5705 },
5706 {
5707 .name = "EPYC-Milan",
5708 .level = 0xd,
5709 .vendor = CPUID_VENDOR_AMD,
5710 .family = 25,
5711 .model = 1,
5712 .stepping = 1,
5713 .features[FEAT_1_EDX] =
5714 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
5715 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
5716 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
5717 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
5718 CPUID_VME | CPUID_FP87,
5719 .features[FEAT_1_ECX] =
5720 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
5721 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
5722 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
5723 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
5724 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
5725 CPUID_EXT_PCID,
5726 .features[FEAT_8000_0001_EDX] =
5727 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
5728 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
5729 CPUID_EXT2_SYSCALL,
5730 .features[FEAT_8000_0001_ECX] =
5731 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
5732 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
5733 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
5734 CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
5735 .features[FEAT_8000_0008_EBX] =
5736 CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
5737 CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
5738 CPUID_8000_0008_EBX_IBRS | CPUID_8000_0008_EBX_STIBP |
5739 CPUID_8000_0008_EBX_AMD_SSBD,
5740 .features[FEAT_7_0_EBX] =
5741 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
5742 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
5743 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
5744 CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_ERMS |
5745 CPUID_7_0_EBX_INVPCID,
5746 .features[FEAT_7_0_ECX] =
5747 CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_PKU,
5748 .features[FEAT_7_0_EDX] =
5749 CPUID_7_0_EDX_FSRM,
5750 .features[FEAT_XSAVE] =
5751 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
5752 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
5753 .features[FEAT_6_EAX] =
5754 CPUID_6_EAX_ARAT,
5755 .features[FEAT_SVM] =
5756 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE | CPUID_SVM_SVME_ADDR_CHK,
5757 .xlevel = 0x8000001E,
5758 .model_id = "AMD EPYC-Milan Processor",
5759 .cache_info = &epyc_milan_cache_info,
5760 .versions = (X86CPUVersionDefinition[]) {
5761 { .version = 1 },
5762 {
5763 .version = 2,
5764 .props = (PropValue[]) {
5765 { "model-id",
5766 "AMD EPYC-Milan-v2 Processor" },
5767 { "vaes", "on" },
5768 { "vpclmulqdq", "on" },
5769 { "stibp-always-on", "on" },
5770 { "amd-psfd", "on" },
5771 { "no-nested-data-bp", "on" },
5772 { "lfence-always-serializing", "on" },
5773 { "null-sel-clr-base", "on" },
5774 { /* end of list */ }
5775 },
5776 .cache_info = &epyc_milan_v2_cache_info
5777 },
5778 {
5779 .version = 3,
5780 .props = (PropValue[]) {
5781 { "overflow-recov", "on" },
5782 { "succor", "on" },
5783 { "lbrv", "on" },
5784 { "tsc-scale", "on" },
5785 { "vmcb-clean", "on" },
5786 { "flushbyasid", "on" },
5787 { "pause-filter", "on" },
5788 { "pfthreshold", "on" },
5789 { "v-vmsave-vmload", "on" },
5790 { "vgif", "on" },
5791 { "model-id",
5792 "AMD EPYC-Milan-v3 Processor" },
5793 { /* end of list */ }
5794 },
5795 .cache_info = &epyc_milan_v3_cache_info
5796 },
5797 { /* end of list */ }
5798 }
5799 },
5800 {
5801 .name = "EPYC-Genoa",
5802 .level = 0xd,
5803 .vendor = CPUID_VENDOR_AMD,
5804 .family = 25,
5805 .model = 17,
5806 .stepping = 0,
5807 .features[FEAT_1_EDX] =
5808 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
5809 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
5810 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
5811 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
5812 CPUID_VME | CPUID_FP87,
5813 .features[FEAT_1_ECX] =
5814 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
5815 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
5816 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
5817 CPUID_EXT_PCID | CPUID_EXT_CX16 | CPUID_EXT_FMA |
5818 CPUID_EXT_SSSE3 | CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ |
5819 CPUID_EXT_SSE3,
5820 .features[FEAT_8000_0001_EDX] =
5821 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
5822 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
5823 CPUID_EXT2_SYSCALL,
5824 .features[FEAT_8000_0001_ECX] =
5825 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
5826 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
5827 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
5828 CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
5829 .features[FEAT_8000_0008_EBX] =
5830 CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
5831 CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
5832 CPUID_8000_0008_EBX_IBRS | CPUID_8000_0008_EBX_STIBP |
5833 CPUID_8000_0008_EBX_STIBP_ALWAYS_ON |
5834 CPUID_8000_0008_EBX_AMD_SSBD | CPUID_8000_0008_EBX_AMD_PSFD,
5835 .features[FEAT_8000_0021_EAX] =
5836 CPUID_8000_0021_EAX_NO_NESTED_DATA_BP |
5837 CPUID_8000_0021_EAX_LFENCE_ALWAYS_SERIALIZING |
5838 CPUID_8000_0021_EAX_NULL_SEL_CLR_BASE |
5839 CPUID_8000_0021_EAX_AUTO_IBRS,
5840 .features[FEAT_7_0_EBX] =
5841 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
5842 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
5843 CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_AVX512F |
5844 CPUID_7_0_EBX_AVX512DQ | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
5845 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_AVX512IFMA |
5846 CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_CLWB |
5847 CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_SHA_NI |
5848 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512VL,
5849 .features[FEAT_7_0_ECX] =
5850 CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
5851 CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
5852 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
5853 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
5854 CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57 |
5855 CPUID_7_0_ECX_RDPID,
5856 .features[FEAT_7_0_EDX] =
5857 CPUID_7_0_EDX_FSRM,
5858 .features[FEAT_7_1_EAX] =
5859 CPUID_7_1_EAX_AVX512_BF16,
5860 .features[FEAT_XSAVE] =
5861 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
5862 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
5863 .features[FEAT_6_EAX] =
5864 CPUID_6_EAX_ARAT,
5865 .features[FEAT_SVM] =
5866 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE | CPUID_SVM_VNMI |
5867 CPUID_SVM_SVME_ADDR_CHK,
5868 .xlevel = 0x80000022,
5869 .model_id = "AMD EPYC-Genoa Processor",
5870 .cache_info = &epyc_genoa_cache_info,
5871 .versions = (X86CPUVersionDefinition[]) {
5872 { .version = 1 },
5873 {
5874 .version = 2,
5875 .props = (PropValue[]) {
5876 { "overflow-recov", "on" },
5877 { "succor", "on" },
5878 { "lbrv", "on" },
5879 { "tsc-scale", "on" },
5880 { "vmcb-clean", "on" },
5881 { "flushbyasid", "on" },
5882 { "pause-filter", "on" },
5883 { "pfthreshold", "on" },
5884 { "v-vmsave-vmload", "on" },
5885 { "vgif", "on" },
5886 { "fs-gs-base-ns", "on" },
5887 { "perfmon-v2", "on" },
5888 { "model-id",
5889 "AMD EPYC-Genoa-v2 Processor" },
5890 { /* end of list */ }
5891 },
5892 .cache_info = &epyc_genoa_v2_cache_info
5893 },
5894 { /* end of list */ }
5895 }
5896 },
5897 {
5898 .name = "YongFeng",
5899 .level = 0x1F,
5900 .vendor = CPUID_VENDOR_ZHAOXIN1,
5901 .family = 7,
5902 .model = 11,
5903 .stepping = 3,
5904 /* missing: CPUID_HT, CPUID_TM, CPUID_PBE */
5905 .features[FEAT_1_EDX] =
5906 CPUID_SS | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
5907 CPUID_ACPI | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV |
5908 CPUID_MCA | CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC |
5909 CPUID_CX8 | CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC |
5910 CPUID_PSE | CPUID_DE | CPUID_VME | CPUID_FP87,
5911 /*
5912 * missing: CPUID_EXT_OSXSAVE, CPUID_EXT_XTPR, CPUID_EXT_TM2,
5913 * CPUID_EXT_EST, CPUID_EXT_SMX, CPUID_EXT_VMX
5914 */
5915 .features[FEAT_1_ECX] =
5916 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
5917 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_TSC_DEADLINE_TIMER |
5918 CPUID_EXT_POPCNT | CPUID_EXT_MOVBE | CPUID_EXT_X2APIC |
5919 CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | CPUID_EXT_PCID |
5920 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
5921 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
5922 .features[FEAT_7_0_EBX] =
5923 CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_ADX |
5924 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_BMI2 |
5925 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_BMI1 |
5926 CPUID_7_0_EBX_FSGSBASE,
5927 /* missing: CPUID_7_0_ECX_OSPKE */
5928 .features[FEAT_7_0_ECX] =
5929 CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_PKU | CPUID_7_0_ECX_UMIP,
5930 .features[FEAT_7_0_EDX] =
5931 CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL,
5932 .features[FEAT_8000_0001_EDX] =
5933 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
5934 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
5935 .features[FEAT_8000_0001_ECX] =
5936 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
5937 .features[FEAT_8000_0007_EDX] = CPUID_APM_INVTSC,
5938 /*
5939 * TODO: When the Linux kernel introduces other existing definitions
5940 * for this leaf, remember to update the definitions here.
5941 */
5942 .features[FEAT_C000_0001_EDX] =
5943 CPUID_C000_0001_EDX_PMM_EN | CPUID_C000_0001_EDX_PMM |
5944 CPUID_C000_0001_EDX_PHE_EN | CPUID_C000_0001_EDX_PHE |
5945 CPUID_C000_0001_EDX_ACE2 |
5946 CPUID_C000_0001_EDX_XCRYPT_EN | CPUID_C000_0001_EDX_XCRYPT |
5947 CPUID_C000_0001_EDX_XSTORE_EN | CPUID_C000_0001_EDX_XSTORE,
5948 .features[FEAT_XSAVE] =
5949 CPUID_XSAVE_XSAVEOPT,
5950 .features[FEAT_ARCH_CAPABILITIES] =
5951 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY |
5952 MSR_ARCH_CAP_MDS_NO | MSR_ARCH_CAP_PSCHANGE_MC_NO |
5953 MSR_ARCH_CAP_SSB_NO,
5954 .features[FEAT_VMX_PROCBASED_CTLS] =
5955 VMX_CPU_BASED_VIRTUAL_INTR_PENDING | VMX_CPU_BASED_HLT_EXITING |
5956 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_INVLPG_EXITING |
5957 VMX_CPU_BASED_MWAIT_EXITING | VMX_CPU_BASED_RDPMC_EXITING |
5958 VMX_CPU_BASED_RDTSC_EXITING | VMX_CPU_BASED_CR3_LOAD_EXITING |
5959 VMX_CPU_BASED_CR3_STORE_EXITING | VMX_CPU_BASED_CR8_LOAD_EXITING |
5960 VMX_CPU_BASED_CR8_STORE_EXITING | VMX_CPU_BASED_TPR_SHADOW |
5961 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_MOV_DR_EXITING |
5962 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
5963 VMX_CPU_BASED_MONITOR_TRAP_FLAG | VMX_CPU_BASED_USE_MSR_BITMAPS |
5964 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
5965 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
5966 /*
5967 * missing: VMX_SECONDARY_EXEC_PAUSE_LOOP_EXITING,
5968 * VMX_SECONDARY_EXEC_TSC_SCALING
5969 */
5970 .features[FEAT_VMX_SECONDARY_CTLS] =
5971 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
5972 VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC |
5973 VMX_SECONDARY_EXEC_RDTSCP | VMX_SECONDARY_EXEC_ENABLE_VPID |
5974 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
5975 VMX_SECONDARY_EXEC_WBINVD_EXITING |
5976 VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
5977 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
5978 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
5979 VMX_SECONDARY_EXEC_RDRAND_EXITING |
5980 VMX_SECONDARY_EXEC_ENABLE_INVPCID |
5981 VMX_SECONDARY_EXEC_ENABLE_VMFUNC |
5982 VMX_SECONDARY_EXEC_SHADOW_VMCS |
5983 VMX_SECONDARY_EXEC_ENABLE_PML,
5984 .features[FEAT_VMX_PINBASED_CTLS] =
5985 VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING |
5986 VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER |
5987 VMX_PIN_BASED_POSTED_INTR,
5988 .features[FEAT_VMX_EXIT_CTLS] =
5989 VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | VMX_VM_EXIT_HOST_ADDR_SPACE_SIZE |
5990 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
5991 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT |
5992 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
5993 VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
5994 /* missing: VMX_VM_ENTRY_SMM, VMX_VM_ENTRY_DEACT_DUAL_MONITOR */
5995 .features[FEAT_VMX_ENTRY_CTLS] =
5996 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE |
5997 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL |
5998 VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER,
5999 /*
6000 * missing: MSR_VMX_MISC_ACTIVITY_SHUTDOWN,
6001 * MSR_VMX_MISC_ACTIVITY_WAIT_SIPI
6002 */
6003 .features[FEAT_VMX_MISC] =
6004 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT |
6005 MSR_VMX_MISC_VMWRITE_VMEXIT,
6006 /* missing: MSR_VMX_EPT_UC */
6007 .features[FEAT_VMX_EPT_VPID_CAPS] =
6008 MSR_VMX_EPT_EXECONLY | MSR_VMX_EPT_PAGE_WALK_LENGTH_4 |
6009 MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB |
6010 MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS |
6011 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
6012 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID |
6013 MSR_VMX_EPT_INVVPID_ALL_CONTEXT | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
6014 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
6015 .features[FEAT_VMX_BASIC] =
6016 MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS,
6017 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
6018 .xlevel = 0x80000008,
6019 .model_id = "Zhaoxin YongFeng Processor",
6020 .versions = (X86CPUVersionDefinition[]) {
6021 { .version = 1 },
6022 {
6023 .version = 2,
6024 .note = "with the correct model number",
6025 .props = (PropValue[]) {
6026 { "model", "0x5b" },
6027 { /* end of list */ }
6028 }
6029 },
6030 { /* end of list */ }
6031 }
6032 },
6033 {
6034 .name = "EPYC-Turin",
6035 .level = 0xd,
6036 .vendor = CPUID_VENDOR_AMD,
6037 .family = 26,
6038 .model = 0,
6039 .stepping = 0,
6040 .features[FEAT_1_ECX] =
6041 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
6042 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
6043 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
6044 CPUID_EXT_PCID | CPUID_EXT_CX16 | CPUID_EXT_FMA |
6045 CPUID_EXT_SSSE3 | CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ |
6046 CPUID_EXT_SSE3,
6047 .features[FEAT_1_EDX] =
6048 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
6049 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
6050 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
6051 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
6052 CPUID_VME | CPUID_FP87,
6053 .features[FEAT_6_EAX] =
6054 CPUID_6_EAX_ARAT,
6055 .features[FEAT_7_0_EBX] =
6056 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
6057 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
6058 CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_AVX512F |
6059 CPUID_7_0_EBX_AVX512DQ | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
6060 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_AVX512IFMA |
6061 CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_CLWB |
6062 CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_SHA_NI |
6063 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512VL,
6064 .features[FEAT_7_0_ECX] =
6065 CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
6066 CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
6067 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
6068 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
6069 CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57 |
6070 CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_MOVDIRI |
6071 CPUID_7_0_ECX_MOVDIR64B,
6072 .features[FEAT_7_0_EDX] =
6073 CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_AVX512_VP2INTERSECT,
6074 .features[FEAT_7_1_EAX] =
6075 CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_AVX512_BF16,
6076 .features[FEAT_8000_0001_ECX] =
6077 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
6078 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
6079 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
6080 CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
6081 .features[FEAT_8000_0001_EDX] =
6082 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
6083 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
6084 CPUID_EXT2_SYSCALL,
6085 .features[FEAT_8000_0007_EBX] =
6086 CPUID_8000_0007_EBX_OVERFLOW_RECOV | CPUID_8000_0007_EBX_SUCCOR,
6087 .features[FEAT_8000_0008_EBX] =
6088 CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
6089 CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
6090 CPUID_8000_0008_EBX_IBRS | CPUID_8000_0008_EBX_STIBP |
6091 CPUID_8000_0008_EBX_STIBP_ALWAYS_ON |
6092 CPUID_8000_0008_EBX_AMD_SSBD | CPUID_8000_0008_EBX_AMD_PSFD,
6093 .features[FEAT_8000_0021_EAX] =
6094 CPUID_8000_0021_EAX_NO_NESTED_DATA_BP |
6095 CPUID_8000_0021_EAX_FS_GS_BASE_NS |
6096 CPUID_8000_0021_EAX_LFENCE_ALWAYS_SERIALIZING |
6097 CPUID_8000_0021_EAX_NULL_SEL_CLR_BASE |
6098 CPUID_8000_0021_EAX_AUTO_IBRS | CPUID_8000_0021_EAX_PREFETCHI |
6099 CPUID_8000_0021_EAX_SBPB | CPUID_8000_0021_EAX_IBPB_BRTYPE |
6100 CPUID_8000_0021_EAX_SRSO_USER_KERNEL_NO,
6101 .features[FEAT_8000_0022_EAX] =
6102 CPUID_8000_0022_EAX_PERFMON_V2,
6103 .features[FEAT_XSAVE] =
6104 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
6105 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
6106 .features[FEAT_SVM] =
6107 CPUID_SVM_NPT | CPUID_SVM_LBRV | CPUID_SVM_NRIPSAVE |
6108 CPUID_SVM_TSCSCALE | CPUID_SVM_VMCBCLEAN | CPUID_SVM_FLUSHASID |
6109 CPUID_SVM_PAUSEFILTER | CPUID_SVM_PFTHRESHOLD |
6110 CPUID_SVM_V_VMSAVE_VMLOAD | CPUID_SVM_VGIF |
6111 CPUID_SVM_VNMI | CPUID_SVM_SVME_ADDR_CHK,
6112 .xlevel = 0x80000022,
6113 .model_id = "AMD EPYC-Turin Processor",
6114 .cache_info = &epyc_turin_cache_info,
6115 },
6116 };
6117
6118 /*
6119 * We resolve CPU model aliases using -v1 when using "-machine
6120 * none", but this is just for compatibility while libvirt isn't
6121 * adapted to resolve CPU model versions before creating VMs.
6122 * See "Runnability guarantee of CPU models" at
6123 * docs/about/deprecated.rst.
6124 */
6125 X86CPUVersion default_cpu_version = 1;
6126
x86_cpu_set_default_version(X86CPUVersion version)6127 void x86_cpu_set_default_version(X86CPUVersion version)
6128 {
6129 /* Translating CPU_VERSION_AUTO to CPU_VERSION_AUTO doesn't make sense */
6130 assert(version != CPU_VERSION_AUTO);
6131 default_cpu_version = version;
6132 }
6133
x86_cpu_model_last_version(const X86CPUModel * model)6134 static X86CPUVersion x86_cpu_model_last_version(const X86CPUModel *model)
6135 {
6136 int v = 0;
6137 const X86CPUVersionDefinition *vdef =
6138 x86_cpu_def_get_versions(model->cpudef);
6139 while (vdef->version) {
6140 v = vdef->version;
6141 vdef++;
6142 }
6143 return v;
6144 }
6145
6146 /* Return the actual version being used for a specific CPU model */
x86_cpu_model_resolve_version(const X86CPUModel * model)6147 static X86CPUVersion x86_cpu_model_resolve_version(const X86CPUModel *model)
6148 {
6149 X86CPUVersion v = model->version;
6150 if (v == CPU_VERSION_AUTO) {
6151 v = default_cpu_version;
6152 }
6153 if (v == CPU_VERSION_LATEST) {
6154 return x86_cpu_model_last_version(model);
6155 }
6156 return v;
6157 }
6158
6159 static const Property max_x86_cpu_properties[] = {
6160 DEFINE_PROP_BOOL("migratable", X86CPU, migratable, true),
6161 DEFINE_PROP_BOOL("host-cache-info", X86CPU, cache_info_passthrough, false),
6162 };
6163
max_x86_cpu_realize(DeviceState * dev,Error ** errp)6164 static void max_x86_cpu_realize(DeviceState *dev, Error **errp)
6165 {
6166 Object *obj = OBJECT(dev);
6167
6168 if (!object_property_get_int(obj, "family", &error_abort)) {
6169 if (X86_CPU(obj)->env.features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
6170 object_property_set_int(obj, "family", 15, &error_abort);
6171 object_property_set_int(obj, "model", 107, &error_abort);
6172 object_property_set_int(obj, "stepping", 1, &error_abort);
6173 } else {
6174 object_property_set_int(obj, "family", 6, &error_abort);
6175 object_property_set_int(obj, "model", 6, &error_abort);
6176 object_property_set_int(obj, "stepping", 3, &error_abort);
6177 }
6178 }
6179
6180 x86_cpu_realizefn(dev, errp);
6181 }
6182
max_x86_cpu_class_init(ObjectClass * oc,const void * data)6183 static void max_x86_cpu_class_init(ObjectClass *oc, const void *data)
6184 {
6185 DeviceClass *dc = DEVICE_CLASS(oc);
6186 X86CPUClass *xcc = X86_CPU_CLASS(oc);
6187
6188 xcc->ordering = 9;
6189
6190 xcc->model_description =
6191 "Enables all features supported by the accelerator in the current host";
6192
6193 device_class_set_props(dc, max_x86_cpu_properties);
6194 dc->realize = max_x86_cpu_realize;
6195 }
6196
max_x86_cpu_initfn(Object * obj)6197 static void max_x86_cpu_initfn(Object *obj)
6198 {
6199 X86CPU *cpu = X86_CPU(obj);
6200
6201 /* We can't fill the features array here because we don't know yet if
6202 * "migratable" is true or false.
6203 */
6204 cpu->max_features = true;
6205 object_property_set_bool(OBJECT(cpu), "pmu", true, &error_abort);
6206
6207 /*
6208 * these defaults are used for TCG and all other accelerators
6209 * besides KVM and HVF, which overwrite these values
6210 */
6211 object_property_set_str(OBJECT(cpu), "vendor", CPUID_VENDOR_AMD,
6212 &error_abort);
6213 object_property_set_str(OBJECT(cpu), "model-id",
6214 "QEMU TCG CPU version " QEMU_HW_VERSION,
6215 &error_abort);
6216 }
6217
6218 static const TypeInfo max_x86_cpu_type_info = {
6219 .name = X86_CPU_TYPE_NAME("max"),
6220 .parent = TYPE_X86_CPU,
6221 .instance_init = max_x86_cpu_initfn,
6222 .class_init = max_x86_cpu_class_init,
6223 };
6224
feature_word_description(FeatureWordInfo * f)6225 static char *feature_word_description(FeatureWordInfo *f)
6226 {
6227 assert(f->type == CPUID_FEATURE_WORD || f->type == MSR_FEATURE_WORD);
6228
6229 switch (f->type) {
6230 case CPUID_FEATURE_WORD:
6231 {
6232 const char *reg = get_register_name_32(f->cpuid.reg);
6233 assert(reg);
6234 if (!f->cpuid.needs_ecx) {
6235 return g_strdup_printf("CPUID[eax=%02Xh].%s", f->cpuid.eax, reg);
6236 } else {
6237 return g_strdup_printf("CPUID[eax=%02Xh,ecx=%02Xh].%s",
6238 f->cpuid.eax, f->cpuid.ecx, reg);
6239 }
6240 }
6241 case MSR_FEATURE_WORD:
6242 return g_strdup_printf("MSR(%02Xh)",
6243 f->msr.index);
6244 }
6245
6246 return NULL;
6247 }
6248
x86_cpu_have_filtered_features(X86CPU * cpu)6249 static bool x86_cpu_have_filtered_features(X86CPU *cpu)
6250 {
6251 FeatureWord w;
6252
6253 for (w = 0; w < FEATURE_WORDS; w++) {
6254 if (cpu->filtered_features[w]) {
6255 return true;
6256 }
6257 }
6258
6259 return false;
6260 }
6261
mark_unavailable_features(X86CPU * cpu,FeatureWord w,uint64_t mask,const char * verbose_prefix)6262 void mark_unavailable_features(X86CPU *cpu, FeatureWord w, uint64_t mask,
6263 const char *verbose_prefix)
6264 {
6265 CPUX86State *env = &cpu->env;
6266 FeatureWordInfo *f = &feature_word_info[w];
6267 int i;
6268 g_autofree char *feat_word_str = feature_word_description(f);
6269
6270 if (!cpu->force_features) {
6271 env->features[w] &= ~mask;
6272 }
6273 cpu->filtered_features[w] |= mask;
6274
6275 if (!verbose_prefix) {
6276 return;
6277 }
6278
6279 for (i = 0; i < 64; ++i) {
6280 if ((1ULL << i) & mask) {
6281 warn_report("%s: %s%s%s [bit %d]",
6282 verbose_prefix,
6283 feat_word_str,
6284 f->feat_names[i] ? "." : "",
6285 f->feat_names[i] ? f->feat_names[i] : "", i);
6286 }
6287 }
6288 }
6289
mark_forced_on_features(X86CPU * cpu,FeatureWord w,uint64_t mask,const char * verbose_prefix)6290 void mark_forced_on_features(X86CPU *cpu, FeatureWord w, uint64_t mask,
6291 const char *verbose_prefix)
6292 {
6293 CPUX86State *env = &cpu->env;
6294 FeatureWordInfo *f = &feature_word_info[w];
6295 int i;
6296
6297 if (!cpu->force_features) {
6298 env->features[w] |= mask;
6299 }
6300
6301 cpu->forced_on_features[w] |= mask;
6302
6303 if (!verbose_prefix) {
6304 return;
6305 }
6306
6307 for (i = 0; i < 64; ++i) {
6308 if ((1ULL << i) & mask) {
6309 g_autofree char *feat_word_str = feature_word_description(f);
6310 warn_report("%s: %s%s%s [bit %d]",
6311 verbose_prefix,
6312 feat_word_str,
6313 f->feat_names[i] ? "." : "",
6314 f->feat_names[i] ? f->feat_names[i] : "", i);
6315 }
6316 }
6317 }
6318
x86_cpuid_version_get_family(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)6319 static void x86_cpuid_version_get_family(Object *obj, Visitor *v,
6320 const char *name, void *opaque,
6321 Error **errp)
6322 {
6323 X86CPU *cpu = X86_CPU(obj);
6324 CPUX86State *env = &cpu->env;
6325 uint64_t value;
6326
6327 value = (env->cpuid_version >> 8) & 0xf;
6328 if (value == 0xf) {
6329 value += (env->cpuid_version >> 20) & 0xff;
6330 }
6331 visit_type_uint64(v, name, &value, errp);
6332 }
6333
x86_cpuid_version_set_family(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)6334 static void x86_cpuid_version_set_family(Object *obj, Visitor *v,
6335 const char *name, void *opaque,
6336 Error **errp)
6337 {
6338 X86CPU *cpu = X86_CPU(obj);
6339 CPUX86State *env = &cpu->env;
6340 const uint64_t max = 0xff + 0xf;
6341 uint64_t value;
6342
6343 if (!visit_type_uint64(v, name, &value, errp)) {
6344 return;
6345 }
6346 if (value > max) {
6347 error_setg(errp, "parameter '%s' can be at most %" PRIu64,
6348 name ? name : "null", max);
6349 return;
6350 }
6351
6352 env->cpuid_version &= ~0xff00f00;
6353 if (value > 0x0f) {
6354 env->cpuid_version |= 0xf00 | ((value - 0x0f) << 20);
6355 } else {
6356 env->cpuid_version |= value << 8;
6357 }
6358 }
6359
x86_cpuid_version_get_model(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)6360 static void x86_cpuid_version_get_model(Object *obj, Visitor *v,
6361 const char *name, void *opaque,
6362 Error **errp)
6363 {
6364 X86CPU *cpu = X86_CPU(obj);
6365 CPUX86State *env = &cpu->env;
6366 uint64_t value;
6367
6368 value = (env->cpuid_version >> 4) & 0xf;
6369 value |= ((env->cpuid_version >> 16) & 0xf) << 4;
6370 visit_type_uint64(v, name, &value, errp);
6371 }
6372
x86_cpuid_version_set_model(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)6373 static void x86_cpuid_version_set_model(Object *obj, Visitor *v,
6374 const char *name, void *opaque,
6375 Error **errp)
6376 {
6377 X86CPU *cpu = X86_CPU(obj);
6378 CPUX86State *env = &cpu->env;
6379 const uint64_t max = 0xff;
6380 uint64_t value;
6381
6382 if (!visit_type_uint64(v, name, &value, errp)) {
6383 return;
6384 }
6385 if (value > max) {
6386 error_setg(errp, "parameter '%s' can be at most %" PRIu64,
6387 name ? name : "null", max);
6388 return;
6389 }
6390
6391 env->cpuid_version &= ~0xf00f0;
6392 env->cpuid_version |= ((value & 0xf) << 4) | ((value >> 4) << 16);
6393 }
6394
x86_cpuid_version_get_stepping(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)6395 static void x86_cpuid_version_get_stepping(Object *obj, Visitor *v,
6396 const char *name, void *opaque,
6397 Error **errp)
6398 {
6399 X86CPU *cpu = X86_CPU(obj);
6400 CPUX86State *env = &cpu->env;
6401 uint64_t value;
6402
6403 value = env->cpuid_version & 0xf;
6404 visit_type_uint64(v, name, &value, errp);
6405 }
6406
x86_cpuid_version_set_stepping(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)6407 static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v,
6408 const char *name, void *opaque,
6409 Error **errp)
6410 {
6411 X86CPU *cpu = X86_CPU(obj);
6412 CPUX86State *env = &cpu->env;
6413 const uint64_t max = 0xf;
6414 uint64_t value;
6415
6416 if (!visit_type_uint64(v, name, &value, errp)) {
6417 return;
6418 }
6419 if (value > max) {
6420 error_setg(errp, "parameter '%s' can be at most %" PRIu64,
6421 name ? name : "null", max);
6422 return;
6423 }
6424
6425 env->cpuid_version &= ~0xf;
6426 env->cpuid_version |= value & 0xf;
6427 }
6428
x86_cpuid_get_vendor(Object * obj,Error ** errp)6429 static char *x86_cpuid_get_vendor(Object *obj, Error **errp)
6430 {
6431 X86CPU *cpu = X86_CPU(obj);
6432 CPUX86State *env = &cpu->env;
6433 char *value;
6434
6435 value = g_malloc(CPUID_VENDOR_SZ + 1);
6436 x86_cpu_vendor_words2str(value, env->cpuid_vendor1, env->cpuid_vendor2,
6437 env->cpuid_vendor3);
6438 return value;
6439 }
6440
x86_cpuid_set_vendor(Object * obj,const char * value,Error ** errp)6441 static void x86_cpuid_set_vendor(Object *obj, const char *value,
6442 Error **errp)
6443 {
6444 X86CPU *cpu = X86_CPU(obj);
6445 CPUX86State *env = &cpu->env;
6446 int i;
6447
6448 if (strlen(value) != CPUID_VENDOR_SZ) {
6449 error_setg(errp, "value of property 'vendor' must consist of"
6450 " exactly " stringify(CPUID_VENDOR_SZ) " characters");
6451 return;
6452 }
6453
6454 env->cpuid_vendor1 = 0;
6455 env->cpuid_vendor2 = 0;
6456 env->cpuid_vendor3 = 0;
6457 for (i = 0; i < 4; i++) {
6458 env->cpuid_vendor1 |= ((uint8_t)value[i ]) << (8 * i);
6459 env->cpuid_vendor2 |= ((uint8_t)value[i + 4]) << (8 * i);
6460 env->cpuid_vendor3 |= ((uint8_t)value[i + 8]) << (8 * i);
6461 }
6462 }
6463
x86_cpuid_get_model_id(Object * obj,Error ** errp)6464 static char *x86_cpuid_get_model_id(Object *obj, Error **errp)
6465 {
6466 X86CPU *cpu = X86_CPU(obj);
6467 CPUX86State *env = &cpu->env;
6468 char *value;
6469 int i;
6470
6471 value = g_malloc(48 + 1);
6472 for (i = 0; i < 48; i++) {
6473 value[i] = env->cpuid_model[i >> 2] >> (8 * (i & 3));
6474 }
6475 value[48] = '\0';
6476 return value;
6477 }
6478
x86_cpuid_set_model_id(Object * obj,const char * model_id,Error ** errp)6479 static void x86_cpuid_set_model_id(Object *obj, const char *model_id,
6480 Error **errp)
6481 {
6482 X86CPU *cpu = X86_CPU(obj);
6483 CPUX86State *env = &cpu->env;
6484 int c, len, i;
6485
6486 if (model_id == NULL) {
6487 model_id = "";
6488 }
6489 len = strlen(model_id);
6490 memset(env->cpuid_model, 0, 48);
6491 for (i = 0; i < 48; i++) {
6492 if (i >= len) {
6493 c = '\0';
6494 } else {
6495 c = (uint8_t)model_id[i];
6496 }
6497 env->cpuid_model[i >> 2] |= c << (8 * (i & 3));
6498 }
6499 }
6500
x86_cpuid_get_tsc_freq(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)6501 static void x86_cpuid_get_tsc_freq(Object *obj, Visitor *v, const char *name,
6502 void *opaque, Error **errp)
6503 {
6504 X86CPU *cpu = X86_CPU(obj);
6505 int64_t value;
6506
6507 value = cpu->env.tsc_khz * 1000;
6508 visit_type_int(v, name, &value, errp);
6509 }
6510
x86_cpuid_set_tsc_freq(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)6511 static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name,
6512 void *opaque, Error **errp)
6513 {
6514 X86CPU *cpu = X86_CPU(obj);
6515 const int64_t max = INT64_MAX;
6516 int64_t value;
6517
6518 if (!visit_type_int(v, name, &value, errp)) {
6519 return;
6520 }
6521 if (value < 0 || value > max) {
6522 error_setg(errp, "parameter '%s' can be at most %" PRId64,
6523 name ? name : "null", max);
6524 return;
6525 }
6526
6527 cpu->env.tsc_khz = cpu->env.user_tsc_khz = value / 1000;
6528 }
6529
6530 /* Generic getter for "feature-words" and "filtered-features" properties */
x86_cpu_get_feature_words(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)6531 static void x86_cpu_get_feature_words(Object *obj, Visitor *v,
6532 const char *name, void *opaque,
6533 Error **errp)
6534 {
6535 uint64_t *array = (uint64_t *)opaque;
6536 FeatureWord w;
6537 X86CPUFeatureWordInfo word_infos[FEATURE_WORDS] = { };
6538 X86CPUFeatureWordInfoList list_entries[FEATURE_WORDS] = { };
6539 X86CPUFeatureWordInfoList *list = NULL;
6540
6541 for (w = 0; w < FEATURE_WORDS; w++) {
6542 FeatureWordInfo *wi = &feature_word_info[w];
6543 /*
6544 * We didn't have MSR features when "feature-words" was
6545 * introduced. Therefore skipped other type entries.
6546 */
6547 if (wi->type != CPUID_FEATURE_WORD) {
6548 continue;
6549 }
6550 X86CPUFeatureWordInfo *qwi = &word_infos[w];
6551 qwi->cpuid_input_eax = wi->cpuid.eax;
6552 qwi->has_cpuid_input_ecx = wi->cpuid.needs_ecx;
6553 qwi->cpuid_input_ecx = wi->cpuid.ecx;
6554 qwi->cpuid_register = x86_reg_info_32[wi->cpuid.reg].qapi_enum;
6555 qwi->features = array[w];
6556
6557 /* List will be in reverse order, but order shouldn't matter */
6558 list_entries[w].next = list;
6559 list_entries[w].value = &word_infos[w];
6560 list = &list_entries[w];
6561 }
6562
6563 visit_type_X86CPUFeatureWordInfoList(v, "feature-words", &list, errp);
6564 }
6565
6566 /* Convert all '_' in a feature string option name to '-', to make feature
6567 * name conform to QOM property naming rule, which uses '-' instead of '_'.
6568 */
feat2prop(char * s)6569 static inline void feat2prop(char *s)
6570 {
6571 while ((s = strchr(s, '_'))) {
6572 *s = '-';
6573 }
6574 }
6575
6576 /* Return the feature property name for a feature flag bit */
x86_cpu_feature_name(FeatureWord w,int bitnr)6577 static const char *x86_cpu_feature_name(FeatureWord w, int bitnr)
6578 {
6579 const char *name;
6580 /* XSAVE components are automatically enabled by other features,
6581 * so return the original feature name instead
6582 */
6583 if (w == FEAT_XSAVE_XCR0_LO || w == FEAT_XSAVE_XCR0_HI) {
6584 int comp = (w == FEAT_XSAVE_XCR0_HI) ? bitnr + 32 : bitnr;
6585
6586 if (comp < ARRAY_SIZE(x86_ext_save_areas) &&
6587 x86_ext_save_areas[comp].bits) {
6588 w = x86_ext_save_areas[comp].feature;
6589 bitnr = ctz32(x86_ext_save_areas[comp].bits);
6590 }
6591 }
6592
6593 assert(bitnr < 64);
6594 assert(w < FEATURE_WORDS);
6595 name = feature_word_info[w].feat_names[bitnr];
6596 assert(bitnr < 32 || !(name && feature_word_info[w].type == CPUID_FEATURE_WORD));
6597 return name;
6598 }
6599
6600 /* Compatibility hack to maintain legacy +-feat semantic,
6601 * where +-feat overwrites any feature set by
6602 * feat=on|feat even if the later is parsed after +-feat
6603 * (i.e. "-x2apic,x2apic=on" will result in x2apic disabled)
6604 */
6605 static GList *plus_features, *minus_features;
6606
compare_string(gconstpointer a,gconstpointer b)6607 static gint compare_string(gconstpointer a, gconstpointer b)
6608 {
6609 return g_strcmp0(a, b);
6610 }
6611
6612 /* Parse "+feature,-feature,feature=foo" CPU feature string
6613 */
x86_cpu_parse_featurestr(const char * typename,char * features,Error ** errp)6614 static void x86_cpu_parse_featurestr(const char *typename, char *features,
6615 Error **errp)
6616 {
6617 char *featurestr; /* Single 'key=value" string being parsed */
6618 static bool cpu_globals_initialized;
6619 bool ambiguous = false;
6620
6621 if (cpu_globals_initialized) {
6622 return;
6623 }
6624 cpu_globals_initialized = true;
6625
6626 if (!features) {
6627 return;
6628 }
6629
6630 for (featurestr = strtok(features, ",");
6631 featurestr;
6632 featurestr = strtok(NULL, ",")) {
6633 const char *name;
6634 const char *val = NULL;
6635 char *eq = NULL;
6636 char num[32];
6637 GlobalProperty *prop;
6638
6639 /* Compatibility syntax: */
6640 if (featurestr[0] == '+') {
6641 plus_features = g_list_append(plus_features,
6642 g_strdup(featurestr + 1));
6643 continue;
6644 } else if (featurestr[0] == '-') {
6645 minus_features = g_list_append(minus_features,
6646 g_strdup(featurestr + 1));
6647 continue;
6648 }
6649
6650 eq = strchr(featurestr, '=');
6651 if (eq) {
6652 *eq++ = 0;
6653 val = eq;
6654 } else {
6655 val = "on";
6656 }
6657
6658 feat2prop(featurestr);
6659 name = featurestr;
6660
6661 if (g_list_find_custom(plus_features, name, compare_string)) {
6662 warn_report("Ambiguous CPU model string. "
6663 "Don't mix both \"+%s\" and \"%s=%s\"",
6664 name, name, val);
6665 ambiguous = true;
6666 }
6667 if (g_list_find_custom(minus_features, name, compare_string)) {
6668 warn_report("Ambiguous CPU model string. "
6669 "Don't mix both \"-%s\" and \"%s=%s\"",
6670 name, name, val);
6671 ambiguous = true;
6672 }
6673
6674 /* Special case: */
6675 if (!strcmp(name, "tsc-freq")) {
6676 int ret;
6677 uint64_t tsc_freq;
6678
6679 ret = qemu_strtosz_metric(val, NULL, &tsc_freq);
6680 if (ret < 0 || tsc_freq > INT64_MAX) {
6681 error_setg(errp, "bad numerical value %s", val);
6682 return;
6683 }
6684 snprintf(num, sizeof(num), "%" PRId64, tsc_freq);
6685 val = num;
6686 name = "tsc-frequency";
6687 }
6688
6689 prop = g_new0(typeof(*prop), 1);
6690 prop->driver = typename;
6691 prop->property = g_strdup(name);
6692 prop->value = g_strdup(val);
6693 qdev_prop_register_global(prop);
6694 }
6695
6696 if (ambiguous) {
6697 warn_report("Compatibility of ambiguous CPU model "
6698 "strings won't be kept on future QEMU versions");
6699 }
6700 }
6701
6702 static bool x86_cpu_filter_features(X86CPU *cpu, bool verbose);
6703
6704 /* Build a list with the name of all features on a feature word array */
x86_cpu_list_feature_names(FeatureWordArray features,strList ** list)6705 static void x86_cpu_list_feature_names(FeatureWordArray features,
6706 strList **list)
6707 {
6708 strList **tail = list;
6709 FeatureWord w;
6710
6711 for (w = 0; w < FEATURE_WORDS; w++) {
6712 uint64_t filtered = features[w];
6713 int i;
6714 for (i = 0; i < 64; i++) {
6715 if (filtered & (1ULL << i)) {
6716 QAPI_LIST_APPEND(tail, g_strdup(x86_cpu_feature_name(w, i)));
6717 }
6718 }
6719 }
6720 }
6721
x86_cpu_get_unavailable_features(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)6722 static void x86_cpu_get_unavailable_features(Object *obj, Visitor *v,
6723 const char *name, void *opaque,
6724 Error **errp)
6725 {
6726 X86CPU *xc = X86_CPU(obj);
6727 strList *result = NULL;
6728
6729 x86_cpu_list_feature_names(xc->filtered_features, &result);
6730 visit_type_strList(v, "unavailable-features", &result, errp);
6731 }
6732
6733 /* Print all cpuid feature names in featureset
6734 */
listflags(GList * features)6735 static void listflags(GList *features)
6736 {
6737 size_t len = 0;
6738 GList *tmp;
6739
6740 for (tmp = features; tmp; tmp = tmp->next) {
6741 const char *name = tmp->data;
6742 if ((len + strlen(name) + 1) >= 75) {
6743 qemu_printf("\n");
6744 len = 0;
6745 }
6746 qemu_printf("%s%s", len == 0 ? " " : " ", name);
6747 len += strlen(name) + 1;
6748 }
6749 qemu_printf("\n");
6750 }
6751
6752 /* Sort alphabetically by type name, respecting X86CPUClass::ordering. */
x86_cpu_list_compare(gconstpointer a,gconstpointer b,gpointer d)6753 static gint x86_cpu_list_compare(gconstpointer a, gconstpointer b, gpointer d)
6754 {
6755 ObjectClass *class_a = (ObjectClass *)a;
6756 ObjectClass *class_b = (ObjectClass *)b;
6757 X86CPUClass *cc_a = X86_CPU_CLASS(class_a);
6758 X86CPUClass *cc_b = X86_CPU_CLASS(class_b);
6759 int ret;
6760
6761 if (cc_a->ordering != cc_b->ordering) {
6762 ret = cc_a->ordering - cc_b->ordering;
6763 } else {
6764 g_autofree char *name_a = x86_cpu_class_get_model_name(cc_a);
6765 g_autofree char *name_b = x86_cpu_class_get_model_name(cc_b);
6766 ret = strcmp(name_a, name_b);
6767 }
6768 return ret;
6769 }
6770
get_sorted_cpu_model_list(void)6771 static GSList *get_sorted_cpu_model_list(void)
6772 {
6773 GSList *list = object_class_get_list(TYPE_X86_CPU, false);
6774 list = g_slist_sort_with_data(list, x86_cpu_list_compare, NULL);
6775 return list;
6776 }
6777
x86_cpu_class_get_model_id(X86CPUClass * xc)6778 static char *x86_cpu_class_get_model_id(X86CPUClass *xc)
6779 {
6780 Object *obj = object_new_with_class(OBJECT_CLASS(xc));
6781 char *r = object_property_get_str(obj, "model-id", &error_abort);
6782 object_unref(obj);
6783 return r;
6784 }
6785
x86_cpu_class_get_alias_of(X86CPUClass * cc)6786 static char *x86_cpu_class_get_alias_of(X86CPUClass *cc)
6787 {
6788 X86CPUVersion version;
6789
6790 if (!cc->model || !cc->model->is_alias) {
6791 return NULL;
6792 }
6793 version = x86_cpu_model_resolve_version(cc->model);
6794 if (version <= 0) {
6795 return NULL;
6796 }
6797 return x86_cpu_versioned_model_name(cc->model->cpudef, version);
6798 }
6799
x86_cpu_list_entry(gpointer data,gpointer user_data)6800 static void x86_cpu_list_entry(gpointer data, gpointer user_data)
6801 {
6802 ObjectClass *oc = data;
6803 X86CPUClass *cc = X86_CPU_CLASS(oc);
6804 g_autofree char *name = x86_cpu_class_get_model_name(cc);
6805 g_autofree char *desc = g_strdup(cc->model_description);
6806 g_autofree char *alias_of = x86_cpu_class_get_alias_of(cc);
6807 g_autofree char *model_id = x86_cpu_class_get_model_id(cc);
6808
6809 if (!desc && alias_of) {
6810 if (cc->model && cc->model->version == CPU_VERSION_AUTO) {
6811 desc = g_strdup("(alias configured by machine type)");
6812 } else {
6813 desc = g_strdup_printf("(alias of %s)", alias_of);
6814 }
6815 }
6816 if (!desc && cc->model && cc->model->note) {
6817 desc = g_strdup_printf("%s [%s]", model_id, cc->model->note);
6818 }
6819 if (!desc) {
6820 desc = g_strdup(model_id);
6821 }
6822
6823 if (cc->model && cc->model->cpudef->deprecation_note) {
6824 g_autofree char *olddesc = desc;
6825 desc = g_strdup_printf("%s (deprecated)", olddesc);
6826 }
6827
6828 qemu_printf(" %-20s %s\n", name, desc);
6829 }
6830
strcmp_wrap(gconstpointer a,gconstpointer b,gpointer d)6831 static gint strcmp_wrap(gconstpointer a, gconstpointer b, gpointer d)
6832 {
6833 return strcmp(a, b);
6834 }
6835
6836 /* list available CPU models and flags */
x86_cpu_list(void)6837 static void x86_cpu_list(void)
6838 {
6839 int i, j;
6840 GSList *list;
6841 GList *names = NULL;
6842
6843 qemu_printf("Available CPUs:\n");
6844 list = get_sorted_cpu_model_list();
6845 g_slist_foreach(list, x86_cpu_list_entry, NULL);
6846 g_slist_free(list);
6847
6848 names = NULL;
6849 for (i = 0; i < ARRAY_SIZE(feature_word_info); i++) {
6850 FeatureWordInfo *fw = &feature_word_info[i];
6851 for (j = 0; j < 64; j++) {
6852 if (fw->feat_names[j]) {
6853 names = g_list_append(names, (gpointer)fw->feat_names[j]);
6854 }
6855 }
6856 }
6857
6858 names = g_list_sort_with_data(names, strcmp_wrap, NULL);
6859
6860 qemu_printf("\nRecognized CPUID flags:\n");
6861 listflags(names);
6862 qemu_printf("\n");
6863 g_list_free(names);
6864 }
6865
6866 #ifndef CONFIG_USER_ONLY
6867
6868 /* Check for missing features that may prevent the CPU class from
6869 * running using the current machine and accelerator.
6870 */
x86_cpu_class_check_missing_features(X86CPUClass * xcc,strList ** list)6871 static void x86_cpu_class_check_missing_features(X86CPUClass *xcc,
6872 strList **list)
6873 {
6874 strList **tail = list;
6875 X86CPU *xc;
6876 Error *err = NULL;
6877
6878 if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
6879 QAPI_LIST_APPEND(tail, g_strdup("kvm"));
6880 return;
6881 }
6882
6883 xc = X86_CPU(object_new_with_class(OBJECT_CLASS(xcc)));
6884
6885 x86_cpu_expand_features(xc, &err);
6886 if (err) {
6887 /* Errors at x86_cpu_expand_features should never happen,
6888 * but in case it does, just report the model as not
6889 * runnable at all using the "type" property.
6890 */
6891 QAPI_LIST_APPEND(tail, g_strdup("type"));
6892 error_free(err);
6893 }
6894
6895 x86_cpu_filter_features(xc, false);
6896
6897 x86_cpu_list_feature_names(xc->filtered_features, tail);
6898
6899 object_unref(OBJECT(xc));
6900 }
6901
x86_cpu_definition_entry(gpointer data,gpointer user_data)6902 static void x86_cpu_definition_entry(gpointer data, gpointer user_data)
6903 {
6904 ObjectClass *oc = data;
6905 X86CPUClass *cc = X86_CPU_CLASS(oc);
6906 CpuDefinitionInfoList **cpu_list = user_data;
6907 CpuDefinitionInfo *info;
6908
6909 info = g_malloc0(sizeof(*info));
6910 info->name = x86_cpu_class_get_model_name(cc);
6911 x86_cpu_class_check_missing_features(cc, &info->unavailable_features);
6912 info->has_unavailable_features = true;
6913 info->q_typename = g_strdup(object_class_get_name(oc));
6914 info->migration_safe = cc->migration_safe;
6915 info->has_migration_safe = true;
6916 info->q_static = cc->static_model;
6917 if (cc->model && cc->model->cpudef->deprecation_note) {
6918 info->deprecated = true;
6919 } else {
6920 info->deprecated = false;
6921 }
6922 /*
6923 * Old machine types won't report aliases, so that alias translation
6924 * doesn't break compatibility with previous QEMU versions.
6925 */
6926 if (default_cpu_version != CPU_VERSION_LEGACY) {
6927 info->alias_of = x86_cpu_class_get_alias_of(cc);
6928 }
6929
6930 QAPI_LIST_PREPEND(*cpu_list, info);
6931 }
6932
qmp_query_cpu_definitions(Error ** errp)6933 CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
6934 {
6935 CpuDefinitionInfoList *cpu_list = NULL;
6936 GSList *list = get_sorted_cpu_model_list();
6937 g_slist_foreach(list, x86_cpu_definition_entry, &cpu_list);
6938 g_slist_free(list);
6939 return cpu_list;
6940 }
6941
6942 #endif /* !CONFIG_USER_ONLY */
6943
x86_cpu_get_supported_feature_word(X86CPU * cpu,FeatureWord w)6944 uint64_t x86_cpu_get_supported_feature_word(X86CPU *cpu, FeatureWord w)
6945 {
6946 FeatureWordInfo *wi = &feature_word_info[w];
6947 uint64_t r = 0;
6948 uint64_t unavail = 0;
6949
6950 if (kvm_enabled()) {
6951 switch (wi->type) {
6952 case CPUID_FEATURE_WORD:
6953 r = kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid.eax,
6954 wi->cpuid.ecx,
6955 wi->cpuid.reg);
6956 break;
6957 case MSR_FEATURE_WORD:
6958 r = kvm_arch_get_supported_msr_feature(kvm_state,
6959 wi->msr.index);
6960 break;
6961 }
6962 } else if (hvf_enabled()) {
6963 if (wi->type != CPUID_FEATURE_WORD) {
6964 return 0;
6965 }
6966 r = hvf_get_supported_cpuid(wi->cpuid.eax,
6967 wi->cpuid.ecx,
6968 wi->cpuid.reg);
6969 } else if (tcg_enabled()) {
6970 r = wi->tcg_features;
6971 } else {
6972 return ~0;
6973 }
6974
6975 switch (w) {
6976 #ifndef TARGET_X86_64
6977 case FEAT_8000_0001_EDX:
6978 /*
6979 * 32-bit TCG can emulate 64-bit compatibility mode. If there is no
6980 * way for userspace to get out of its 32-bit jail, we can leave
6981 * the LM bit set.
6982 */
6983 unavail = tcg_enabled()
6984 ? CPUID_EXT2_LM & ~CPUID_EXT2_KERNEL_FEATURES
6985 : CPUID_EXT2_LM;
6986 break;
6987 #endif
6988
6989 case FEAT_8000_0007_EBX:
6990 if (cpu && !IS_AMD_CPU(&cpu->env)) {
6991 /* Disable AMD machine check architecture for Intel CPU. */
6992 unavail = ~0;
6993 }
6994 break;
6995
6996 case FEAT_7_0_EBX:
6997 #ifndef CONFIG_USER_ONLY
6998 if (!check_sgx_support()) {
6999 unavail = CPUID_7_0_EBX_SGX;
7000 }
7001 #endif
7002 break;
7003 case FEAT_7_0_ECX:
7004 #ifndef CONFIG_USER_ONLY
7005 if (!check_sgx_support()) {
7006 unavail = CPUID_7_0_ECX_SGX_LC;
7007 }
7008 #endif
7009 break;
7010
7011 default:
7012 break;
7013 }
7014
7015 r &= ~unavail;
7016 if (cpu && cpu->migratable) {
7017 r &= x86_cpu_get_migratable_flags(cpu, w);
7018 }
7019 return r;
7020 }
7021
x86_cpu_get_supported_cpuid(uint32_t func,uint32_t index,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)7022 static void x86_cpu_get_supported_cpuid(uint32_t func, uint32_t index,
7023 uint32_t *eax, uint32_t *ebx,
7024 uint32_t *ecx, uint32_t *edx)
7025 {
7026 if (kvm_enabled()) {
7027 *eax = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EAX);
7028 *ebx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EBX);
7029 *ecx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_ECX);
7030 *edx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EDX);
7031 } else if (hvf_enabled()) {
7032 *eax = hvf_get_supported_cpuid(func, index, R_EAX);
7033 *ebx = hvf_get_supported_cpuid(func, index, R_EBX);
7034 *ecx = hvf_get_supported_cpuid(func, index, R_ECX);
7035 *edx = hvf_get_supported_cpuid(func, index, R_EDX);
7036 } else {
7037 *eax = 0;
7038 *ebx = 0;
7039 *ecx = 0;
7040 *edx = 0;
7041 }
7042 }
7043
x86_cpu_get_cache_cpuid(uint32_t func,uint32_t index,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)7044 static void x86_cpu_get_cache_cpuid(uint32_t func, uint32_t index,
7045 uint32_t *eax, uint32_t *ebx,
7046 uint32_t *ecx, uint32_t *edx)
7047 {
7048 uint32_t level, unused;
7049
7050 /* Only return valid host leaves. */
7051 switch (func) {
7052 case 2:
7053 case 4:
7054 host_cpuid(0, 0, &level, &unused, &unused, &unused);
7055 break;
7056 case 0x80000005:
7057 case 0x80000006:
7058 case 0x8000001d:
7059 host_cpuid(0x80000000, 0, &level, &unused, &unused, &unused);
7060 break;
7061 default:
7062 return;
7063 }
7064
7065 if (func > level) {
7066 *eax = 0;
7067 *ebx = 0;
7068 *ecx = 0;
7069 *edx = 0;
7070 } else {
7071 host_cpuid(func, index, eax, ebx, ecx, edx);
7072 }
7073 }
7074
7075 /*
7076 * Only for builtin_x86_defs models initialized with x86_register_cpudef_types.
7077 */
x86_cpu_apply_props(X86CPU * cpu,PropValue * props)7078 void x86_cpu_apply_props(X86CPU *cpu, PropValue *props)
7079 {
7080 PropValue *pv;
7081 for (pv = props; pv->prop; pv++) {
7082 if (!pv->value) {
7083 continue;
7084 }
7085 object_property_parse(OBJECT(cpu), pv->prop, pv->value,
7086 &error_abort);
7087 }
7088 }
7089
7090 /*
7091 * Apply properties for the CPU model version specified in model.
7092 * Only for builtin_x86_defs models initialized with x86_register_cpudef_types.
7093 */
7094
x86_cpu_apply_version_props(X86CPU * cpu,const X86CPUModel * model)7095 static void x86_cpu_apply_version_props(X86CPU *cpu, const X86CPUModel *model)
7096 {
7097 const X86CPUVersionDefinition *vdef;
7098 X86CPUVersion version = x86_cpu_model_resolve_version(model);
7099
7100 if (version == CPU_VERSION_LEGACY) {
7101 return;
7102 }
7103
7104 for (vdef = x86_cpu_def_get_versions(model->cpudef); vdef->version; vdef++) {
7105 PropValue *p;
7106
7107 for (p = vdef->props; p && p->prop; p++) {
7108 object_property_parse(OBJECT(cpu), p->prop, p->value,
7109 &error_abort);
7110 }
7111
7112 if (vdef->version == version) {
7113 break;
7114 }
7115 }
7116
7117 /*
7118 * If we reached the end of the list, version number was invalid
7119 */
7120 assert(vdef->version == version);
7121 }
7122
x86_cpu_get_versioned_cache_info(X86CPU * cpu,const X86CPUModel * model)7123 static const CPUCaches *x86_cpu_get_versioned_cache_info(X86CPU *cpu,
7124 const X86CPUModel *model)
7125 {
7126 const X86CPUVersionDefinition *vdef;
7127 X86CPUVersion version = x86_cpu_model_resolve_version(model);
7128 const CPUCaches *cache_info = model->cpudef->cache_info;
7129
7130 if (version == CPU_VERSION_LEGACY) {
7131 return cache_info;
7132 }
7133
7134 for (vdef = x86_cpu_def_get_versions(model->cpudef); vdef->version; vdef++) {
7135 if (vdef->cache_info) {
7136 cache_info = vdef->cache_info;
7137 }
7138
7139 if (vdef->version == version) {
7140 break;
7141 }
7142 }
7143
7144 assert(vdef->version == version);
7145 return cache_info;
7146 }
7147
7148 /*
7149 * Load data from X86CPUDefinition into a X86CPU object.
7150 * Only for builtin_x86_defs models initialized with x86_register_cpudef_types.
7151 */
x86_cpu_load_model(X86CPU * cpu,const X86CPUModel * model)7152 static void x86_cpu_load_model(X86CPU *cpu, const X86CPUModel *model)
7153 {
7154 const X86CPUDefinition *def = model->cpudef;
7155 CPUX86State *env = &cpu->env;
7156 FeatureWord w;
7157
7158 /*NOTE: any property set by this function should be returned by
7159 * x86_cpu_static_props(), so static expansion of
7160 * query-cpu-model-expansion is always complete.
7161 */
7162
7163 /* CPU models only set _minimum_ values for level/xlevel: */
7164 object_property_set_uint(OBJECT(cpu), "min-level", def->level,
7165 &error_abort);
7166 object_property_set_uint(OBJECT(cpu), "min-xlevel", def->xlevel,
7167 &error_abort);
7168
7169 object_property_set_int(OBJECT(cpu), "family", def->family, &error_abort);
7170 object_property_set_int(OBJECT(cpu), "model", def->model, &error_abort);
7171 object_property_set_int(OBJECT(cpu), "stepping", def->stepping,
7172 &error_abort);
7173 object_property_set_str(OBJECT(cpu), "model-id", def->model_id,
7174 &error_abort);
7175 for (w = 0; w < FEATURE_WORDS; w++) {
7176 env->features[w] = def->features[w];
7177 }
7178
7179 /* legacy-cache defaults to 'off' if CPU model provides cache info */
7180 cpu->legacy_cache = !x86_cpu_get_versioned_cache_info(cpu, model);
7181
7182 env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR;
7183
7184 /* sysenter isn't supported in compatibility mode on AMD,
7185 * syscall isn't supported in compatibility mode on Intel.
7186 * Normally we advertise the actual CPU vendor, but you can
7187 * override this using the 'vendor' property if you want to use
7188 * KVM's sysenter/syscall emulation in compatibility mode and
7189 * when doing cross vendor migration
7190 */
7191
7192 /*
7193 * vendor property is set here but then overloaded with the
7194 * host cpu vendor for KVM and HVF.
7195 */
7196 object_property_set_str(OBJECT(cpu), "vendor", def->vendor, &error_abort);
7197
7198 object_property_set_uint(OBJECT(cpu), "avx10-version", def->avx10_version,
7199 &error_abort);
7200
7201 x86_cpu_apply_version_props(cpu, model);
7202
7203 /*
7204 * Properties in versioned CPU model are not user specified features.
7205 * We can simply clear env->user_features here since it will be filled later
7206 * in x86_cpu_expand_features() based on plus_features and minus_features.
7207 */
7208 memset(&env->user_features, 0, sizeof(env->user_features));
7209 }
7210
x86_gdb_arch_name(CPUState * cs)7211 static const gchar *x86_gdb_arch_name(CPUState *cs)
7212 {
7213 #ifdef TARGET_X86_64
7214 return "i386:x86-64";
7215 #else
7216 return "i386";
7217 #endif
7218 }
7219
x86_cpu_cpudef_class_init(ObjectClass * oc,const void * data)7220 static void x86_cpu_cpudef_class_init(ObjectClass *oc, const void *data)
7221 {
7222 const X86CPUModel *model = data;
7223 X86CPUClass *xcc = X86_CPU_CLASS(oc);
7224 CPUClass *cc = CPU_CLASS(oc);
7225
7226 xcc->model = model;
7227 xcc->migration_safe = true;
7228 cc->deprecation_note = model->cpudef->deprecation_note;
7229 }
7230
x86_register_cpu_model_type(const char * name,X86CPUModel * model)7231 static void x86_register_cpu_model_type(const char *name, X86CPUModel *model)
7232 {
7233 g_autofree char *typename = x86_cpu_type_name(name);
7234 TypeInfo ti = {
7235 .name = typename,
7236 .parent = TYPE_X86_CPU,
7237 .class_init = x86_cpu_cpudef_class_init,
7238 .class_data = model,
7239 };
7240
7241 type_register_static(&ti);
7242 }
7243
7244
7245 /*
7246 * register builtin_x86_defs;
7247 * "max", "base" and subclasses ("host") are not registered here.
7248 * See x86_cpu_register_types for all model registrations.
7249 */
x86_register_cpudef_types(const X86CPUDefinition * def)7250 static void x86_register_cpudef_types(const X86CPUDefinition *def)
7251 {
7252 X86CPUModel *m;
7253 const X86CPUVersionDefinition *vdef;
7254
7255 /* AMD aliases are handled at runtime based on CPUID vendor, so
7256 * they shouldn't be set on the CPU model table.
7257 */
7258 assert(!(def->features[FEAT_8000_0001_EDX] & CPUID_EXT2_AMD_ALIASES));
7259 /* catch mistakes instead of silently truncating model_id when too long */
7260 assert(def->model_id && strlen(def->model_id) <= 48);
7261
7262 /* Unversioned model: */
7263 m = g_new0(X86CPUModel, 1);
7264 m->cpudef = def;
7265 m->version = CPU_VERSION_AUTO;
7266 m->is_alias = true;
7267 x86_register_cpu_model_type(def->name, m);
7268
7269 /* Versioned models: */
7270
7271 for (vdef = x86_cpu_def_get_versions(def); vdef->version; vdef++) {
7272 g_autofree char *name =
7273 x86_cpu_versioned_model_name(def, vdef->version);
7274
7275 m = g_new0(X86CPUModel, 1);
7276 m->cpudef = def;
7277 m->version = vdef->version;
7278 m->note = vdef->note;
7279 x86_register_cpu_model_type(name, m);
7280
7281 if (vdef->alias) {
7282 X86CPUModel *am = g_new0(X86CPUModel, 1);
7283 am->cpudef = def;
7284 am->version = vdef->version;
7285 am->is_alias = true;
7286 x86_register_cpu_model_type(vdef->alias, am);
7287 }
7288 }
7289
7290 }
7291
cpu_x86_virtual_addr_width(CPUX86State * env)7292 uint32_t cpu_x86_virtual_addr_width(CPUX86State *env)
7293 {
7294 if (env->features[FEAT_7_0_ECX] & CPUID_7_0_ECX_LA57) {
7295 return 57; /* 57 bits virtual */
7296 } else {
7297 return 48; /* 48 bits virtual */
7298 }
7299 }
7300
cpu_x86_cpuid(CPUX86State * env,uint32_t index,uint32_t count,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)7301 void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
7302 uint32_t *eax, uint32_t *ebx,
7303 uint32_t *ecx, uint32_t *edx)
7304 {
7305 X86CPU *cpu = env_archcpu(env);
7306 CPUState *cs = env_cpu(env);
7307 uint32_t limit;
7308 uint32_t signature[3];
7309 X86CPUTopoInfo *topo_info = &env->topo_info;
7310 uint32_t threads_per_pkg;
7311
7312 threads_per_pkg = x86_threads_per_pkg(topo_info);
7313
7314 /* Calculate & apply limits for different index ranges */
7315 if (index >= 0xC0000000) {
7316 limit = env->cpuid_xlevel2;
7317 } else if (index >= 0x80000000) {
7318 limit = env->cpuid_xlevel;
7319 } else if (index >= 0x40000000) {
7320 limit = 0x40000001;
7321 } else {
7322 limit = env->cpuid_level;
7323 }
7324
7325 if (index > limit) {
7326 /* Intel documentation states that invalid EAX input will
7327 * return the same information as EAX=cpuid_level
7328 * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID)
7329 */
7330 index = env->cpuid_level;
7331 }
7332
7333 switch(index) {
7334 case 0:
7335 *eax = env->cpuid_level;
7336 *ebx = env->cpuid_vendor1;
7337 *edx = env->cpuid_vendor2;
7338 *ecx = env->cpuid_vendor3;
7339 break;
7340 case 1:
7341 *eax = env->cpuid_version;
7342 *ebx = (cpu->apic_id << 24) |
7343 8 << 8; /* CLFLUSH size in quad words, Linux wants it. */
7344 *ecx = env->features[FEAT_1_ECX];
7345 if ((*ecx & CPUID_EXT_XSAVE) && (env->cr[4] & CR4_OSXSAVE_MASK)) {
7346 *ecx |= CPUID_EXT_OSXSAVE;
7347 }
7348 *edx = env->features[FEAT_1_EDX];
7349 if (threads_per_pkg > 1) {
7350 *ebx |= threads_per_pkg << 16;
7351 }
7352 break;
7353 case 2:
7354 /* cache info: needed for Pentium Pro compatibility */
7355 if (cpu->cache_info_passthrough) {
7356 x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
7357 break;
7358 } else if (cpu->vendor_cpuid_only && IS_AMD_CPU(env)) {
7359 *eax = *ebx = *ecx = *edx = 0;
7360 break;
7361 }
7362 *eax = 1; /* Number of CPUID[EAX=2] calls required */
7363 *ebx = 0;
7364 if (!cpu->enable_l3_cache) {
7365 *ecx = 0;
7366 } else {
7367 *ecx = cpuid2_cache_descriptor(env->cache_info_cpuid2.l3_cache);
7368 }
7369 *edx = (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1d_cache) << 16) |
7370 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1i_cache) << 8) |
7371 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l2_cache));
7372 break;
7373 case 4:
7374 /* cache info: needed for Core compatibility */
7375 if (cpu->cache_info_passthrough) {
7376 x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx);
7377 /*
7378 * QEMU has its own number of cores/logical cpus,
7379 * set 24..14, 31..26 bit to configured values
7380 */
7381 if (*eax & 31) {
7382 int host_vcpus_per_cache = 1 + ((*eax & 0x3FFC000) >> 14);
7383
7384 *eax &= ~0xFC000000;
7385 *eax |= max_core_ids_in_package(topo_info) << 26;
7386 if (host_vcpus_per_cache > threads_per_pkg) {
7387 *eax &= ~0x3FFC000;
7388
7389 /* Share the cache at package level. */
7390 *eax |= max_thread_ids_for_cache(topo_info,
7391 CPU_TOPOLOGY_LEVEL_SOCKET) << 14;
7392 }
7393 }
7394 } else if (cpu->vendor_cpuid_only && IS_AMD_CPU(env)) {
7395 *eax = *ebx = *ecx = *edx = 0;
7396 } else {
7397 *eax = 0;
7398
7399 switch (count) {
7400 case 0: /* L1 dcache info */
7401 encode_cache_cpuid4(env->cache_info_cpuid4.l1d_cache,
7402 topo_info,
7403 eax, ebx, ecx, edx);
7404 if (!cpu->l1_cache_per_core) {
7405 *eax &= ~MAKE_64BIT_MASK(14, 12);
7406 }
7407 break;
7408 case 1: /* L1 icache info */
7409 encode_cache_cpuid4(env->cache_info_cpuid4.l1i_cache,
7410 topo_info,
7411 eax, ebx, ecx, edx);
7412 if (!cpu->l1_cache_per_core) {
7413 *eax &= ~MAKE_64BIT_MASK(14, 12);
7414 }
7415 break;
7416 case 2: /* L2 cache info */
7417 encode_cache_cpuid4(env->cache_info_cpuid4.l2_cache,
7418 topo_info,
7419 eax, ebx, ecx, edx);
7420 break;
7421 case 3: /* L3 cache info */
7422 if (cpu->enable_l3_cache) {
7423 encode_cache_cpuid4(env->cache_info_cpuid4.l3_cache,
7424 topo_info,
7425 eax, ebx, ecx, edx);
7426 break;
7427 }
7428 /* fall through */
7429 default: /* end of info */
7430 *eax = *ebx = *ecx = *edx = 0;
7431 break;
7432 }
7433 }
7434 break;
7435 case 5:
7436 /* MONITOR/MWAIT Leaf */
7437 *eax = cpu->mwait.eax; /* Smallest monitor-line size in bytes */
7438 *ebx = cpu->mwait.ebx; /* Largest monitor-line size in bytes */
7439 *ecx = cpu->mwait.ecx; /* flags */
7440 *edx = cpu->mwait.edx; /* mwait substates */
7441 break;
7442 case 6:
7443 /* Thermal and Power Leaf */
7444 *eax = env->features[FEAT_6_EAX];
7445 *ebx = 0;
7446 *ecx = 0;
7447 *edx = 0;
7448 break;
7449 case 7:
7450 /* Structured Extended Feature Flags Enumeration Leaf */
7451 if (count == 0) {
7452 /* Maximum ECX value for sub-leaves */
7453 *eax = env->cpuid_level_func7;
7454 *ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */
7455 *ecx = env->features[FEAT_7_0_ECX]; /* Feature flags */
7456 if ((*ecx & CPUID_7_0_ECX_PKU) && env->cr[4] & CR4_PKE_MASK) {
7457 *ecx |= CPUID_7_0_ECX_OSPKE;
7458 }
7459 *edx = env->features[FEAT_7_0_EDX]; /* Feature flags */
7460 } else if (count == 1) {
7461 *eax = env->features[FEAT_7_1_EAX];
7462 *ecx = env->features[FEAT_7_1_ECX];
7463 *edx = env->features[FEAT_7_1_EDX];
7464 *ebx = 0;
7465 } else if (count == 2) {
7466 *edx = env->features[FEAT_7_2_EDX];
7467 *eax = 0;
7468 *ebx = 0;
7469 *ecx = 0;
7470 } else {
7471 *eax = 0;
7472 *ebx = 0;
7473 *ecx = 0;
7474 *edx = 0;
7475 }
7476 break;
7477 case 9:
7478 /* Direct Cache Access Information Leaf */
7479 *eax = 0; /* Bits 0-31 in DCA_CAP MSR */
7480 *ebx = 0;
7481 *ecx = 0;
7482 *edx = 0;
7483 break;
7484 case 0xA:
7485 /* Architectural Performance Monitoring Leaf */
7486 if (cpu->enable_pmu) {
7487 x86_cpu_get_supported_cpuid(0xA, count, eax, ebx, ecx, edx);
7488 } else {
7489 *eax = 0;
7490 *ebx = 0;
7491 *ecx = 0;
7492 *edx = 0;
7493 }
7494 break;
7495 case 0xB:
7496 /* Extended Topology Enumeration Leaf */
7497 if (!cpu->enable_cpuid_0xb) {
7498 *eax = *ebx = *ecx = *edx = 0;
7499 break;
7500 }
7501
7502 *ecx = count & 0xff;
7503 *edx = cpu->apic_id;
7504
7505 switch (count) {
7506 case 0:
7507 *eax = apicid_core_offset(topo_info);
7508 *ebx = topo_info->threads_per_core;
7509 *ecx |= CPUID_B_ECX_TOPO_LEVEL_SMT << 8;
7510 break;
7511 case 1:
7512 *eax = apicid_pkg_offset(topo_info);
7513 *ebx = threads_per_pkg;
7514 *ecx |= CPUID_B_ECX_TOPO_LEVEL_CORE << 8;
7515 break;
7516 default:
7517 *eax = 0;
7518 *ebx = 0;
7519 *ecx |= CPUID_B_ECX_TOPO_LEVEL_INVALID << 8;
7520 }
7521
7522 assert(!(*eax & ~0x1f));
7523 *ebx &= 0xffff; /* The count doesn't need to be reliable. */
7524 break;
7525 case 0x1C:
7526 if (cpu->enable_pmu && (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR)) {
7527 x86_cpu_get_supported_cpuid(0x1C, 0, eax, ebx, ecx, edx);
7528 *edx = 0;
7529 }
7530 break;
7531 case 0x1F:
7532 /* V2 Extended Topology Enumeration Leaf */
7533 if (!x86_has_cpuid_0x1f(cpu)) {
7534 *eax = *ebx = *ecx = *edx = 0;
7535 break;
7536 }
7537
7538 encode_topo_cpuid1f(env, count, topo_info, eax, ebx, ecx, edx);
7539 break;
7540 case 0xD: {
7541 /* Processor Extended State */
7542 *eax = 0;
7543 *ebx = 0;
7544 *ecx = 0;
7545 *edx = 0;
7546 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
7547 break;
7548 }
7549
7550 if (count == 0) {
7551 *ecx = xsave_area_size(x86_cpu_xsave_xcr0_components(cpu), false);
7552 *eax = env->features[FEAT_XSAVE_XCR0_LO];
7553 *edx = env->features[FEAT_XSAVE_XCR0_HI];
7554 /*
7555 * The initial value of xcr0 and ebx == 0, On host without kvm
7556 * commit 412a3c41(e.g., CentOS 6), the ebx's value always == 0
7557 * even through guest update xcr0, this will crash some legacy guest
7558 * (e.g., CentOS 6), So set ebx == ecx to workaround it.
7559 */
7560 *ebx = kvm_enabled() ? *ecx : xsave_area_size(env->xcr0, false);
7561 } else if (count == 1) {
7562 uint64_t xstate = x86_cpu_xsave_xcr0_components(cpu) |
7563 x86_cpu_xsave_xss_components(cpu);
7564
7565 *eax = env->features[FEAT_XSAVE];
7566 *ebx = xsave_area_size(xstate, true);
7567 *ecx = env->features[FEAT_XSAVE_XSS_LO];
7568 *edx = env->features[FEAT_XSAVE_XSS_HI];
7569 if (kvm_enabled() && cpu->enable_pmu &&
7570 (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR) &&
7571 (*eax & CPUID_XSAVE_XSAVES)) {
7572 *ecx |= XSTATE_ARCH_LBR_MASK;
7573 } else {
7574 *ecx &= ~XSTATE_ARCH_LBR_MASK;
7575 }
7576 } else if (count == 0xf && cpu->enable_pmu
7577 && (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR)) {
7578 x86_cpu_get_supported_cpuid(0xD, count, eax, ebx, ecx, edx);
7579 } else if (count < ARRAY_SIZE(x86_ext_save_areas)) {
7580 const ExtSaveArea *esa = &x86_ext_save_areas[count];
7581
7582 if (x86_cpu_xsave_xcr0_components(cpu) & (1ULL << count)) {
7583 *eax = esa->size;
7584 *ebx = esa->offset;
7585 *ecx = esa->ecx &
7586 (ESA_FEATURE_ALIGN64_MASK | ESA_FEATURE_XFD_MASK);
7587 } else if (x86_cpu_xsave_xss_components(cpu) & (1ULL << count)) {
7588 *eax = esa->size;
7589 *ebx = 0;
7590 *ecx = 1;
7591 }
7592 }
7593 break;
7594 }
7595 case 0x12:
7596 #ifndef CONFIG_USER_ONLY
7597 if (!kvm_enabled() ||
7598 !(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_SGX)) {
7599 *eax = *ebx = *ecx = *edx = 0;
7600 break;
7601 }
7602
7603 /*
7604 * SGX sub-leafs CPUID.0x12.{0x2..N} enumerate EPC sections. Retrieve
7605 * the EPC properties, e.g. confidentiality and integrity, from the
7606 * host's first EPC section, i.e. assume there is one EPC section or
7607 * that all EPC sections have the same security properties.
7608 */
7609 if (count > 1) {
7610 uint64_t epc_addr, epc_size;
7611
7612 if (sgx_epc_get_section(count - 2, &epc_addr, &epc_size)) {
7613 *eax = *ebx = *ecx = *edx = 0;
7614 break;
7615 }
7616 host_cpuid(index, 2, eax, ebx, ecx, edx);
7617 *eax = (uint32_t)(epc_addr & 0xfffff000) | 0x1;
7618 *ebx = (uint32_t)(epc_addr >> 32);
7619 *ecx = (uint32_t)(epc_size & 0xfffff000) | (*ecx & 0xf);
7620 *edx = (uint32_t)(epc_size >> 32);
7621 break;
7622 }
7623
7624 /*
7625 * SGX sub-leafs CPUID.0x12.{0x0,0x1} are heavily dependent on hardware
7626 * and KVM, i.e. QEMU cannot emulate features to override what KVM
7627 * supports. Features can be further restricted by userspace, but not
7628 * made more permissive.
7629 */
7630 x86_cpu_get_supported_cpuid(0x12, count, eax, ebx, ecx, edx);
7631
7632 if (count == 0) {
7633 *eax &= env->features[FEAT_SGX_12_0_EAX];
7634 *ebx &= env->features[FEAT_SGX_12_0_EBX];
7635 } else {
7636 *eax &= env->features[FEAT_SGX_12_1_EAX];
7637 *ebx &= 0; /* ebx reserve */
7638 *ecx &= env->features[FEAT_XSAVE_XCR0_LO];
7639 *edx &= env->features[FEAT_XSAVE_XCR0_HI];
7640
7641 /* FP and SSE are always allowed regardless of XSAVE/XCR0. */
7642 *ecx |= XSTATE_FP_MASK | XSTATE_SSE_MASK;
7643
7644 /* Access to PROVISIONKEY requires additional credentials. */
7645 if ((*eax & (1U << 4)) &&
7646 !kvm_enable_sgx_provisioning(cs->kvm_state)) {
7647 *eax &= ~(1U << 4);
7648 }
7649 }
7650 #endif
7651 break;
7652 case 0x14: {
7653 /* Intel Processor Trace Enumeration */
7654 *eax = 0;
7655 *ebx = 0;
7656 *ecx = 0;
7657 *edx = 0;
7658 if (!(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) ||
7659 !kvm_enabled()) {
7660 break;
7661 }
7662
7663 /*
7664 * If these are changed, they should stay in sync with
7665 * x86_cpu_filter_features().
7666 */
7667 if (count == 0) {
7668 *eax = INTEL_PT_MAX_SUBLEAF;
7669 *ebx = INTEL_PT_MINIMAL_EBX;
7670 *ecx = INTEL_PT_MINIMAL_ECX;
7671 if (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP) {
7672 *ecx |= CPUID_14_0_ECX_LIP;
7673 }
7674 } else if (count == 1) {
7675 *eax = INTEL_PT_MTC_BITMAP | INTEL_PT_ADDR_RANGES_NUM;
7676 *ebx = INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP;
7677 }
7678 break;
7679 }
7680 case 0x1D: {
7681 /* AMX TILE, for now hardcoded for Sapphire Rapids*/
7682 *eax = 0;
7683 *ebx = 0;
7684 *ecx = 0;
7685 *edx = 0;
7686 if (!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE)) {
7687 break;
7688 }
7689
7690 if (count == 0) {
7691 /* Highest numbered palette subleaf */
7692 *eax = INTEL_AMX_TILE_MAX_SUBLEAF;
7693 } else if (count == 1) {
7694 *eax = INTEL_AMX_TOTAL_TILE_BYTES |
7695 (INTEL_AMX_BYTES_PER_TILE << 16);
7696 *ebx = INTEL_AMX_BYTES_PER_ROW | (INTEL_AMX_TILE_MAX_NAMES << 16);
7697 *ecx = INTEL_AMX_TILE_MAX_ROWS;
7698 }
7699 break;
7700 }
7701 case 0x1E: {
7702 /* AMX TMUL, for now hardcoded for Sapphire Rapids */
7703 *eax = 0;
7704 *ebx = 0;
7705 *ecx = 0;
7706 *edx = 0;
7707 if (!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE)) {
7708 break;
7709 }
7710
7711 if (count == 0) {
7712 /* Highest numbered palette subleaf */
7713 *ebx = INTEL_AMX_TMUL_MAX_K | (INTEL_AMX_TMUL_MAX_N << 8);
7714 }
7715 break;
7716 }
7717 case 0x24: {
7718 *eax = 0;
7719 *ebx = 0;
7720 *ecx = 0;
7721 *edx = 0;
7722 if ((env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10) && count == 0) {
7723 *ebx = env->features[FEAT_24_0_EBX] | env->avx10_version;
7724 }
7725 break;
7726 }
7727 case 0x40000000:
7728 /*
7729 * CPUID code in kvm_arch_init_vcpu() ignores stuff
7730 * set here, but we restrict to TCG none the less.
7731 */
7732 if (tcg_enabled() && cpu->expose_tcg) {
7733 memcpy(signature, "TCGTCGTCGTCG", 12);
7734 *eax = 0x40000001;
7735 *ebx = signature[0];
7736 *ecx = signature[1];
7737 *edx = signature[2];
7738 } else {
7739 *eax = 0;
7740 *ebx = 0;
7741 *ecx = 0;
7742 *edx = 0;
7743 }
7744 break;
7745 case 0x40000001:
7746 *eax = 0;
7747 *ebx = 0;
7748 *ecx = 0;
7749 *edx = 0;
7750 break;
7751 case 0x80000000:
7752 *eax = env->cpuid_xlevel;
7753 *ebx = env->cpuid_vendor1;
7754 *edx = env->cpuid_vendor2;
7755 *ecx = env->cpuid_vendor3;
7756 break;
7757 case 0x80000001:
7758 *eax = env->cpuid_version;
7759 *ebx = 0;
7760 *ecx = env->features[FEAT_8000_0001_ECX];
7761 *edx = env->features[FEAT_8000_0001_EDX];
7762
7763 if (tcg_enabled() && env->cpuid_vendor1 == CPUID_VENDOR_INTEL_1 &&
7764 !(env->hflags & HF_LMA_MASK)) {
7765 *edx &= ~CPUID_EXT2_SYSCALL;
7766 }
7767 break;
7768 case 0x80000002:
7769 case 0x80000003:
7770 case 0x80000004:
7771 *eax = env->cpuid_model[(index - 0x80000002) * 4 + 0];
7772 *ebx = env->cpuid_model[(index - 0x80000002) * 4 + 1];
7773 *ecx = env->cpuid_model[(index - 0x80000002) * 4 + 2];
7774 *edx = env->cpuid_model[(index - 0x80000002) * 4 + 3];
7775 break;
7776 case 0x80000005:
7777 /* cache info (L1 cache) */
7778 if (cpu->cache_info_passthrough) {
7779 x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
7780 break;
7781 }
7782 *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) |
7783 (L1_ITLB_2M_ASSOC << 8) | (L1_ITLB_2M_ENTRIES);
7784 *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) |
7785 (L1_ITLB_4K_ASSOC << 8) | (L1_ITLB_4K_ENTRIES);
7786 *ecx = encode_cache_cpuid80000005(env->cache_info_amd.l1d_cache);
7787 *edx = encode_cache_cpuid80000005(env->cache_info_amd.l1i_cache);
7788 break;
7789 case 0x80000006:
7790 /* cache info (L2 cache) */
7791 if (cpu->cache_info_passthrough) {
7792 x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
7793 break;
7794 }
7795 *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) |
7796 (L2_DTLB_2M_ENTRIES << 16) |
7797 (AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) |
7798 (L2_ITLB_2M_ENTRIES);
7799 *ebx = (AMD_ENC_ASSOC(L2_DTLB_4K_ASSOC) << 28) |
7800 (L2_DTLB_4K_ENTRIES << 16) |
7801 (AMD_ENC_ASSOC(L2_ITLB_4K_ASSOC) << 12) |
7802 (L2_ITLB_4K_ENTRIES);
7803 encode_cache_cpuid80000006(env->cache_info_amd.l2_cache,
7804 cpu->enable_l3_cache ?
7805 env->cache_info_amd.l3_cache : NULL,
7806 ecx, edx);
7807 break;
7808 case 0x80000007:
7809 *eax = 0;
7810 *ebx = env->features[FEAT_8000_0007_EBX];
7811 *ecx = 0;
7812 *edx = env->features[FEAT_8000_0007_EDX];
7813 break;
7814 case 0x80000008:
7815 /* virtual & phys address size in low 2 bytes. */
7816 *eax = cpu->phys_bits;
7817 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
7818 /* 64 bit processor */
7819 *eax |= (cpu_x86_virtual_addr_width(env) << 8);
7820 *eax |= (cpu->guest_phys_bits << 16);
7821 }
7822 *ebx = env->features[FEAT_8000_0008_EBX];
7823 if (threads_per_pkg > 1) {
7824 /*
7825 * Bits 15:12 is "The number of bits in the initial
7826 * Core::X86::Apic::ApicId[ApicId] value that indicate
7827 * thread ID within a package".
7828 * Bits 7:0 is "The number of threads in the package is NC+1"
7829 */
7830 *ecx = (apicid_pkg_offset(topo_info) << 12) |
7831 (threads_per_pkg - 1);
7832 } else {
7833 *ecx = 0;
7834 }
7835 *edx = 0;
7836 break;
7837 case 0x8000000A:
7838 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
7839 *eax = 0x00000001; /* SVM Revision */
7840 *ebx = 0x00000010; /* nr of ASIDs */
7841 *ecx = 0;
7842 *edx = env->features[FEAT_SVM]; /* optional features */
7843 } else {
7844 *eax = 0;
7845 *ebx = 0;
7846 *ecx = 0;
7847 *edx = 0;
7848 }
7849 break;
7850 case 0x8000001D:
7851 *eax = 0;
7852 if (cpu->cache_info_passthrough) {
7853 x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx);
7854 break;
7855 }
7856 switch (count) {
7857 case 0: /* L1 dcache info */
7858 encode_cache_cpuid8000001d(env->cache_info_amd.l1d_cache,
7859 topo_info, eax, ebx, ecx, edx);
7860 break;
7861 case 1: /* L1 icache info */
7862 encode_cache_cpuid8000001d(env->cache_info_amd.l1i_cache,
7863 topo_info, eax, ebx, ecx, edx);
7864 break;
7865 case 2: /* L2 cache info */
7866 encode_cache_cpuid8000001d(env->cache_info_amd.l2_cache,
7867 topo_info, eax, ebx, ecx, edx);
7868 break;
7869 case 3: /* L3 cache info */
7870 encode_cache_cpuid8000001d(env->cache_info_amd.l3_cache,
7871 topo_info, eax, ebx, ecx, edx);
7872 break;
7873 default: /* end of info */
7874 *eax = *ebx = *ecx = *edx = 0;
7875 break;
7876 }
7877 if (cpu->amd_topoext_features_only) {
7878 *edx &= CACHE_NO_INVD_SHARING | CACHE_INCLUSIVE;
7879 }
7880 break;
7881 case 0x8000001E:
7882 if (cpu->core_id <= 255) {
7883 encode_topo_cpuid8000001e(cpu, topo_info, eax, ebx, ecx, edx);
7884 } else {
7885 *eax = 0;
7886 *ebx = 0;
7887 *ecx = 0;
7888 *edx = 0;
7889 }
7890 break;
7891 case 0x80000022:
7892 *eax = *ebx = *ecx = *edx = 0;
7893 /* AMD Extended Performance Monitoring and Debug */
7894 if (kvm_enabled() && cpu->enable_pmu &&
7895 (env->features[FEAT_8000_0022_EAX] & CPUID_8000_0022_EAX_PERFMON_V2)) {
7896 *eax |= CPUID_8000_0022_EAX_PERFMON_V2;
7897 *ebx |= kvm_arch_get_supported_cpuid(cs->kvm_state, index, count,
7898 R_EBX) & 0xf;
7899 }
7900 break;
7901 case 0xC0000000:
7902 *eax = env->cpuid_xlevel2;
7903 *ebx = 0;
7904 *ecx = 0;
7905 *edx = 0;
7906 break;
7907 case 0xC0000001:
7908 /* Support for VIA CPU's CPUID instruction */
7909 *eax = env->cpuid_version;
7910 *ebx = 0;
7911 *ecx = 0;
7912 *edx = env->features[FEAT_C000_0001_EDX];
7913 break;
7914 case 0xC0000002:
7915 case 0xC0000003:
7916 case 0xC0000004:
7917 /* Reserved for the future, and now filled with zero */
7918 *eax = 0;
7919 *ebx = 0;
7920 *ecx = 0;
7921 *edx = 0;
7922 break;
7923 case 0x8000001F:
7924 *eax = *ebx = *ecx = *edx = 0;
7925 if (sev_enabled()) {
7926 *eax = 0x2;
7927 *eax |= sev_es_enabled() ? 0x8 : 0;
7928 *eax |= sev_snp_enabled() ? 0x10 : 0;
7929 *ebx = sev_get_cbit_position() & 0x3f; /* EBX[5:0] */
7930 *ebx |= (sev_get_reduced_phys_bits() & 0x3f) << 6; /* EBX[11:6] */
7931 }
7932 break;
7933 case 0x80000021:
7934 *eax = *ebx = *ecx = *edx = 0;
7935 *eax = env->features[FEAT_8000_0021_EAX];
7936 *ebx = env->features[FEAT_8000_0021_EBX];
7937 break;
7938 default:
7939 /* reserved values: zero */
7940 *eax = 0;
7941 *ebx = 0;
7942 *ecx = 0;
7943 *edx = 0;
7944 break;
7945 }
7946 }
7947
x86_cpu_set_sgxlepubkeyhash(CPUX86State * env)7948 static void x86_cpu_set_sgxlepubkeyhash(CPUX86State *env)
7949 {
7950 #ifndef CONFIG_USER_ONLY
7951 /* Those default values are defined in Skylake HW */
7952 env->msr_ia32_sgxlepubkeyhash[0] = 0xa6053e051270b7acULL;
7953 env->msr_ia32_sgxlepubkeyhash[1] = 0x6cfbe8ba8b3b413dULL;
7954 env->msr_ia32_sgxlepubkeyhash[2] = 0xc4916d99f2b3735dULL;
7955 env->msr_ia32_sgxlepubkeyhash[3] = 0xd4f8c05909f9bb3bULL;
7956 #endif
7957 }
7958
cpuid_has_xsave_feature(CPUX86State * env,const ExtSaveArea * esa)7959 static bool cpuid_has_xsave_feature(CPUX86State *env, const ExtSaveArea *esa)
7960 {
7961 if (!esa->size) {
7962 return false;
7963 }
7964
7965 if (env->features[esa->feature] & esa->bits) {
7966 return true;
7967 }
7968 if (esa->feature == FEAT_7_0_EBX && esa->bits == CPUID_7_0_EBX_AVX512F
7969 && (env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10)) {
7970 return true;
7971 }
7972
7973 return false;
7974 }
7975
x86_cpu_reset_hold(Object * obj,ResetType type)7976 static void x86_cpu_reset_hold(Object *obj, ResetType type)
7977 {
7978 CPUState *cs = CPU(obj);
7979 X86CPU *cpu = X86_CPU(cs);
7980 X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
7981 CPUX86State *env = &cpu->env;
7982 target_ulong cr4;
7983 uint64_t xcr0;
7984 int i;
7985
7986 if (xcc->parent_phases.hold) {
7987 xcc->parent_phases.hold(obj, type);
7988 }
7989
7990 memset(env, 0, offsetof(CPUX86State, end_reset_fields));
7991
7992 if (tcg_enabled()) {
7993 cpu_init_fp_statuses(env);
7994 }
7995
7996 env->old_exception = -1;
7997
7998 /* init to reset state */
7999 env->int_ctl = 0;
8000 env->hflags2 |= HF2_GIF_MASK;
8001 env->hflags2 |= HF2_VGIF_MASK;
8002 env->hflags &= ~HF_GUEST_MASK;
8003
8004 cpu_x86_update_cr0(env, 0x60000010);
8005 env->a20_mask = ~0x0;
8006 env->smbase = 0x30000;
8007 env->msr_smi_count = 0;
8008
8009 env->idt.limit = 0xffff;
8010 env->gdt.limit = 0xffff;
8011 env->ldt.limit = 0xffff;
8012 env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT);
8013 env->tr.limit = 0xffff;
8014 env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT);
8015
8016 cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff,
8017 DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK |
8018 DESC_R_MASK | DESC_A_MASK);
8019 cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff,
8020 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
8021 DESC_A_MASK);
8022 cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff,
8023 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
8024 DESC_A_MASK);
8025 cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff,
8026 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
8027 DESC_A_MASK);
8028 cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff,
8029 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
8030 DESC_A_MASK);
8031 cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff,
8032 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
8033 DESC_A_MASK);
8034
8035 env->eip = 0xfff0;
8036 env->regs[R_EDX] = env->cpuid_version;
8037
8038 env->eflags = 0x2;
8039
8040 /* FPU init */
8041 for (i = 0; i < 8; i++) {
8042 env->fptags[i] = 1;
8043 }
8044 cpu_set_fpuc(env, 0x37f);
8045
8046 env->mxcsr = 0x1f80;
8047 /* All units are in INIT state. */
8048 env->xstate_bv = 0;
8049
8050 env->pat = 0x0007040600070406ULL;
8051
8052 if (kvm_enabled()) {
8053 /*
8054 * KVM handles TSC = 0 specially and thinks we are hot-plugging
8055 * a new CPU, use 1 instead to force a reset.
8056 */
8057 if (env->tsc != 0) {
8058 env->tsc = 1;
8059 }
8060 } else {
8061 env->tsc = 0;
8062 }
8063
8064 env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT;
8065 if (env->features[FEAT_1_ECX] & CPUID_EXT_MONITOR) {
8066 env->msr_ia32_misc_enable |= MSR_IA32_MISC_ENABLE_MWAIT;
8067 }
8068
8069 memset(env->dr, 0, sizeof(env->dr));
8070 env->dr[6] = DR6_FIXED_1;
8071 env->dr[7] = DR7_FIXED_1;
8072 cpu_breakpoint_remove_all(cs, BP_CPU);
8073 cpu_watchpoint_remove_all(cs, BP_CPU);
8074
8075 cr4 = 0;
8076 xcr0 = XSTATE_FP_MASK;
8077
8078 #ifdef CONFIG_USER_ONLY
8079 /* Enable all the features for user-mode. */
8080 if (env->features[FEAT_1_EDX] & CPUID_SSE) {
8081 xcr0 |= XSTATE_SSE_MASK;
8082 }
8083 for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
8084 const ExtSaveArea *esa = &x86_ext_save_areas[i];
8085 if (!((1 << i) & CPUID_XSTATE_XCR0_MASK)) {
8086 continue;
8087 }
8088 if (cpuid_has_xsave_feature(env, esa)) {
8089 xcr0 |= 1ull << i;
8090 }
8091 }
8092
8093 if (env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE) {
8094 cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK;
8095 }
8096 if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_FSGSBASE) {
8097 cr4 |= CR4_FSGSBASE_MASK;
8098 }
8099 #endif
8100
8101 env->xcr0 = xcr0;
8102 cpu_x86_update_cr4(env, cr4);
8103
8104 /*
8105 * SDM 11.11.5 requires:
8106 * - IA32_MTRR_DEF_TYPE MSR.E = 0
8107 * - IA32_MTRR_PHYSMASKn.V = 0
8108 * All other bits are undefined. For simplification, zero it all.
8109 */
8110 env->mtrr_deftype = 0;
8111 memset(env->mtrr_var, 0, sizeof(env->mtrr_var));
8112 memset(env->mtrr_fixed, 0, sizeof(env->mtrr_fixed));
8113
8114 env->interrupt_injected = -1;
8115 env->exception_nr = -1;
8116 env->exception_pending = 0;
8117 env->exception_injected = 0;
8118 env->exception_has_payload = false;
8119 env->exception_payload = 0;
8120 env->nmi_injected = false;
8121 env->triple_fault_pending = false;
8122 #if !defined(CONFIG_USER_ONLY)
8123 /* We hard-wire the BSP to the first CPU. */
8124 apic_designate_bsp(cpu->apic_state, cs->cpu_index == 0);
8125
8126 cs->halted = !cpu_is_bsp(cpu);
8127
8128 if (kvm_enabled()) {
8129 kvm_arch_reset_vcpu(cpu);
8130 }
8131
8132 x86_cpu_set_sgxlepubkeyhash(env);
8133
8134 env->amd_tsc_scale_msr = MSR_AMD64_TSC_RATIO_DEFAULT;
8135
8136 #endif
8137 }
8138
x86_cpu_after_reset(X86CPU * cpu)8139 void x86_cpu_after_reset(X86CPU *cpu)
8140 {
8141 #ifndef CONFIG_USER_ONLY
8142 if (kvm_enabled()) {
8143 kvm_arch_after_reset_vcpu(cpu);
8144 }
8145
8146 if (cpu->apic_state) {
8147 device_cold_reset(cpu->apic_state);
8148 }
8149 #endif
8150 }
8151
mce_init(X86CPU * cpu)8152 static void mce_init(X86CPU *cpu)
8153 {
8154 CPUX86State *cenv = &cpu->env;
8155 unsigned int bank;
8156
8157 if (((cenv->cpuid_version >> 8) & 0xf) >= 6
8158 && (cenv->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) ==
8159 (CPUID_MCE | CPUID_MCA)) {
8160 cenv->mcg_cap = MCE_CAP_DEF | MCE_BANKS_DEF |
8161 (cpu->enable_lmce ? MCG_LMCE_P : 0);
8162 cenv->mcg_ctl = ~(uint64_t)0;
8163 for (bank = 0; bank < MCE_BANKS_DEF; bank++) {
8164 cenv->mce_banks[bank * 4] = ~(uint64_t)0;
8165 }
8166 }
8167 }
8168
x86_cpu_adjust_level(X86CPU * cpu,uint32_t * min,uint32_t value)8169 static void x86_cpu_adjust_level(X86CPU *cpu, uint32_t *min, uint32_t value)
8170 {
8171 if (*min < value) {
8172 *min = value;
8173 }
8174 }
8175
8176 /* Increase cpuid_min_{level,xlevel,xlevel2} automatically, if appropriate */
x86_cpu_adjust_feat_level(X86CPU * cpu,FeatureWord w)8177 static void x86_cpu_adjust_feat_level(X86CPU *cpu, FeatureWord w)
8178 {
8179 CPUX86State *env = &cpu->env;
8180 FeatureWordInfo *fi = &feature_word_info[w];
8181 uint32_t eax = fi->cpuid.eax;
8182 uint32_t region = eax & 0xF0000000;
8183
8184 assert(feature_word_info[w].type == CPUID_FEATURE_WORD);
8185 if (!env->features[w]) {
8186 return;
8187 }
8188
8189 switch (region) {
8190 case 0x00000000:
8191 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, eax);
8192 break;
8193 case 0x80000000:
8194 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, eax);
8195 break;
8196 case 0xC0000000:
8197 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel2, eax);
8198 break;
8199 }
8200
8201 if (eax == 7) {
8202 x86_cpu_adjust_level(cpu, &env->cpuid_min_level_func7,
8203 fi->cpuid.ecx);
8204 }
8205 }
8206
8207 /* Calculate XSAVE components based on the configured CPU feature flags */
x86_cpu_enable_xsave_components(X86CPU * cpu)8208 static void x86_cpu_enable_xsave_components(X86CPU *cpu)
8209 {
8210 CPUX86State *env = &cpu->env;
8211 int i;
8212 uint64_t mask;
8213 static bool request_perm;
8214
8215 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
8216 env->features[FEAT_XSAVE_XCR0_LO] = 0;
8217 env->features[FEAT_XSAVE_XCR0_HI] = 0;
8218 env->features[FEAT_XSAVE_XSS_LO] = 0;
8219 env->features[FEAT_XSAVE_XSS_HI] = 0;
8220 return;
8221 }
8222
8223 mask = 0;
8224 for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
8225 const ExtSaveArea *esa = &x86_ext_save_areas[i];
8226 if (cpuid_has_xsave_feature(env, esa)) {
8227 mask |= (1ULL << i);
8228 }
8229 }
8230
8231 /* Only request permission for first vcpu */
8232 if (kvm_enabled() && !request_perm) {
8233 kvm_request_xsave_components(cpu, mask);
8234 request_perm = true;
8235 }
8236
8237 env->features[FEAT_XSAVE_XCR0_LO] = mask & CPUID_XSTATE_XCR0_MASK;
8238 env->features[FEAT_XSAVE_XCR0_HI] = (mask & CPUID_XSTATE_XCR0_MASK) >> 32;
8239 env->features[FEAT_XSAVE_XSS_LO] = mask & CPUID_XSTATE_XSS_MASK;
8240 env->features[FEAT_XSAVE_XSS_HI] = (mask & CPUID_XSTATE_XSS_MASK) >> 32;
8241 }
8242
8243 /***** Steps involved on loading and filtering CPUID data
8244 *
8245 * When initializing and realizing a CPU object, the steps
8246 * involved in setting up CPUID data are:
8247 *
8248 * 1) Loading CPU model definition (X86CPUDefinition). This is
8249 * implemented by x86_cpu_load_model() and should be completely
8250 * transparent, as it is done automatically by instance_init.
8251 * No code should need to look at X86CPUDefinition structs
8252 * outside instance_init.
8253 *
8254 * 2) CPU expansion. This is done by realize before CPUID
8255 * filtering, and will make sure host/accelerator data is
8256 * loaded for CPU models that depend on host capabilities
8257 * (e.g. "host"). Done by x86_cpu_expand_features().
8258 *
8259 * 3) CPUID filtering. This initializes extra data related to
8260 * CPUID, and checks if the host supports all capabilities
8261 * required by the CPU. Runnability of a CPU model is
8262 * determined at this step. Done by x86_cpu_filter_features().
8263 *
8264 * Some operations don't require all steps to be performed.
8265 * More precisely:
8266 *
8267 * - CPU instance creation (instance_init) will run only CPU
8268 * model loading. CPU expansion can't run at instance_init-time
8269 * because host/accelerator data may be not available yet.
8270 * - CPU realization will perform both CPU model expansion and CPUID
8271 * filtering, and return an error in case one of them fails.
8272 * - query-cpu-definitions needs to run all 3 steps. It needs
8273 * to run CPUID filtering, as the 'unavailable-features'
8274 * field is set based on the filtering results.
8275 * - The query-cpu-model-expansion QMP command only needs to run
8276 * CPU model loading and CPU expansion. It should not filter
8277 * any CPUID data based on host capabilities.
8278 */
8279
8280 /* Expand CPU configuration data, based on configured features
8281 * and host/accelerator capabilities when appropriate.
8282 */
x86_cpu_expand_features(X86CPU * cpu,Error ** errp)8283 void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
8284 {
8285 CPUX86State *env = &cpu->env;
8286 FeatureWord w;
8287 int i;
8288 GList *l;
8289
8290 for (l = plus_features; l; l = l->next) {
8291 const char *prop = l->data;
8292 if (!object_property_set_bool(OBJECT(cpu), prop, true, errp)) {
8293 return;
8294 }
8295 }
8296
8297 for (l = minus_features; l; l = l->next) {
8298 const char *prop = l->data;
8299 if (!object_property_set_bool(OBJECT(cpu), prop, false, errp)) {
8300 return;
8301 }
8302 }
8303
8304 /*TODO: Now cpu->max_features doesn't overwrite features
8305 * set using QOM properties, and we can convert
8306 * plus_features & minus_features to global properties
8307 * inside x86_cpu_parse_featurestr() too.
8308 */
8309 if (cpu->max_features) {
8310 for (w = 0; w < FEATURE_WORDS; w++) {
8311 /* Override only features that weren't set explicitly
8312 * by the user.
8313 */
8314 env->features[w] |=
8315 x86_cpu_get_supported_feature_word(cpu, w) &
8316 ~env->user_features[w] &
8317 ~feature_word_info[w].no_autoenable_flags;
8318 }
8319
8320 if ((env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10) && !env->avx10_version) {
8321 uint32_t eax, ebx, ecx, edx;
8322 x86_cpu_get_supported_cpuid(0x24, 0, &eax, &ebx, &ecx, &edx);
8323 env->avx10_version = ebx & 0xff;
8324 }
8325 }
8326
8327 if (x86_threads_per_pkg(&env->topo_info) > 1) {
8328 env->features[FEAT_1_EDX] |= CPUID_HT;
8329
8330 /*
8331 * The Linux kernel checks for the CMPLegacy bit and
8332 * discards multiple thread information if it is set.
8333 * So don't set it here for Intel (and other processors
8334 * following Intel's behavior) to make Linux guests happy.
8335 */
8336 if (!IS_INTEL_CPU(env) && !IS_ZHAOXIN_CPU(env)) {
8337 env->features[FEAT_8000_0001_ECX] |= CPUID_EXT3_CMP_LEG;
8338 }
8339 }
8340
8341 if (!cpu->enable_pmu) {
8342 mark_unavailable_features(cpu, FEAT_1_ECX,
8343 env->user_features[FEAT_1_ECX] & CPUID_EXT_PDCM,
8344 "This feature is not available due to PMU being disabled");
8345 env->features[FEAT_1_ECX] &= ~CPUID_EXT_PDCM;
8346 }
8347
8348 for (i = 0; i < ARRAY_SIZE(feature_dependencies); i++) {
8349 FeatureDep *d = &feature_dependencies[i];
8350 if (!(env->features[d->from.index] & d->from.mask)) {
8351 uint64_t unavailable_features = env->features[d->to.index] & d->to.mask;
8352
8353 /* Not an error unless the dependent feature was added explicitly. */
8354 mark_unavailable_features(cpu, d->to.index,
8355 unavailable_features & env->user_features[d->to.index],
8356 "This feature depends on other features that were not requested");
8357
8358 env->features[d->to.index] &= ~unavailable_features;
8359 }
8360 }
8361
8362 if (!kvm_enabled() || !cpu->expose_kvm) {
8363 env->features[FEAT_KVM] = 0;
8364 }
8365
8366 x86_cpu_enable_xsave_components(cpu);
8367
8368 /* CPUID[EAX=7,ECX=0].EBX always increased level automatically: */
8369 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_EBX);
8370 if (cpu->full_cpuid_auto_level) {
8371 x86_cpu_adjust_feat_level(cpu, FEAT_1_EDX);
8372 x86_cpu_adjust_feat_level(cpu, FEAT_1_ECX);
8373 x86_cpu_adjust_feat_level(cpu, FEAT_6_EAX);
8374 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_ECX);
8375 x86_cpu_adjust_feat_level(cpu, FEAT_7_1_EAX);
8376 x86_cpu_adjust_feat_level(cpu, FEAT_7_1_ECX);
8377 x86_cpu_adjust_feat_level(cpu, FEAT_7_1_EDX);
8378 x86_cpu_adjust_feat_level(cpu, FEAT_7_2_EDX);
8379 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_EDX);
8380 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_ECX);
8381 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0007_EDX);
8382 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0008_EBX);
8383 x86_cpu_adjust_feat_level(cpu, FEAT_C000_0001_EDX);
8384 x86_cpu_adjust_feat_level(cpu, FEAT_SVM);
8385 x86_cpu_adjust_feat_level(cpu, FEAT_XSAVE);
8386
8387 /* Intel Processor Trace requires CPUID[0x14] */
8388 if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT)) {
8389 if (cpu->intel_pt_auto_level) {
8390 x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14);
8391 } else if (cpu->env.cpuid_min_level < 0x14) {
8392 mark_unavailable_features(cpu, FEAT_7_0_EBX,
8393 CPUID_7_0_EBX_INTEL_PT,
8394 "Intel PT need CPUID leaf 0x14, please set by \"-cpu ...,intel-pt=on,min-level=0x14\"");
8395 }
8396 }
8397
8398 /*
8399 * Intel CPU topology with multi-dies support requires CPUID[0x1F].
8400 * For AMD Rome/Milan, cpuid level is 0x10, and guest OS should detect
8401 * extended toplogy by leaf 0xB. Only adjust it for Intel CPU, unless
8402 * cpu->vendor_cpuid_only has been unset for compatibility with older
8403 * machine types.
8404 */
8405 if (x86_has_cpuid_0x1f(cpu) &&
8406 (IS_INTEL_CPU(env) || !cpu->vendor_cpuid_only)) {
8407 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x1F);
8408 }
8409
8410 /* Advanced Vector Extensions 10 (AVX10) requires CPUID[0x24] */
8411 if (env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10) {
8412 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x24);
8413 }
8414
8415 /* SVM requires CPUID[0x8000000A] */
8416 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
8417 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000000A);
8418 }
8419
8420 /* SEV requires CPUID[0x8000001F] */
8421 if (sev_enabled()) {
8422 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000001F);
8423 }
8424
8425 if (env->features[FEAT_8000_0021_EAX]) {
8426 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x80000021);
8427 }
8428
8429 /* SGX requires CPUID[0x12] for EPC enumeration */
8430 if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_SGX) {
8431 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x12);
8432 }
8433 }
8434
8435 /* Set cpuid_*level* based on cpuid_min_*level, if not explicitly set */
8436 if (env->cpuid_level_func7 == UINT32_MAX) {
8437 env->cpuid_level_func7 = env->cpuid_min_level_func7;
8438 }
8439 if (env->cpuid_level == UINT32_MAX) {
8440 env->cpuid_level = env->cpuid_min_level;
8441 }
8442 if (env->cpuid_xlevel == UINT32_MAX) {
8443 env->cpuid_xlevel = env->cpuid_min_xlevel;
8444 }
8445 if (env->cpuid_xlevel2 == UINT32_MAX) {
8446 env->cpuid_xlevel2 = env->cpuid_min_xlevel2;
8447 }
8448
8449 if (kvm_enabled() && !kvm_hyperv_expand_features(cpu, errp)) {
8450 return;
8451 }
8452 }
8453
8454 /*
8455 * Finishes initialization of CPUID data, filters CPU feature
8456 * words based on host availability of each feature.
8457 *
8458 * Returns: true if any flag is not supported by the host, false otherwise.
8459 */
x86_cpu_filter_features(X86CPU * cpu,bool verbose)8460 static bool x86_cpu_filter_features(X86CPU *cpu, bool verbose)
8461 {
8462 CPUX86State *env = &cpu->env;
8463 FeatureWord w;
8464 const char *prefix = NULL;
8465 bool have_filtered_features;
8466
8467 uint32_t eax_0, ebx_0, ecx_0, edx_0;
8468 uint32_t eax_1, ebx_1, ecx_1, edx_1;
8469
8470 if (verbose) {
8471 prefix = accel_uses_host_cpuid()
8472 ? "host doesn't support requested feature"
8473 : "TCG doesn't support requested feature";
8474 }
8475
8476 for (w = 0; w < FEATURE_WORDS; w++) {
8477 uint64_t host_feat =
8478 x86_cpu_get_supported_feature_word(NULL, w);
8479 uint64_t requested_features = env->features[w];
8480 uint64_t unavailable_features = requested_features & ~host_feat;
8481 mark_unavailable_features(cpu, w, unavailable_features, prefix);
8482 }
8483
8484 /*
8485 * Check that KVM actually allows the processor tracing features that
8486 * are advertised by cpu_x86_cpuid(). Keep these two in sync.
8487 */
8488 if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) &&
8489 kvm_enabled()) {
8490 x86_cpu_get_supported_cpuid(0x14, 0,
8491 &eax_0, &ebx_0, &ecx_0, &edx_0);
8492 x86_cpu_get_supported_cpuid(0x14, 1,
8493 &eax_1, &ebx_1, &ecx_1, &edx_1);
8494
8495 if (!eax_0 ||
8496 ((ebx_0 & INTEL_PT_MINIMAL_EBX) != INTEL_PT_MINIMAL_EBX) ||
8497 ((ecx_0 & INTEL_PT_MINIMAL_ECX) != INTEL_PT_MINIMAL_ECX) ||
8498 ((eax_1 & INTEL_PT_MTC_BITMAP) != INTEL_PT_MTC_BITMAP) ||
8499 ((eax_1 & INTEL_PT_ADDR_RANGES_NUM_MASK) <
8500 INTEL_PT_ADDR_RANGES_NUM) ||
8501 ((ebx_1 & (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) !=
8502 (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) ||
8503 ((ecx_0 & CPUID_14_0_ECX_LIP) !=
8504 (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP))) {
8505 /*
8506 * Processor Trace capabilities aren't configurable, so if the
8507 * host can't emulate the capabilities we report on
8508 * cpu_x86_cpuid(), intel-pt can't be enabled on the current host.
8509 */
8510 mark_unavailable_features(cpu, FEAT_7_0_EBX, CPUID_7_0_EBX_INTEL_PT, prefix);
8511 }
8512 }
8513
8514 have_filtered_features = x86_cpu_have_filtered_features(cpu);
8515
8516 if (env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10) {
8517 x86_cpu_get_supported_cpuid(0x24, 0,
8518 &eax_0, &ebx_0, &ecx_0, &edx_0);
8519 uint8_t version = ebx_0 & 0xff;
8520
8521 if (version < env->avx10_version) {
8522 if (prefix) {
8523 warn_report("%s: avx10.%d. Adjust to avx10.%d",
8524 prefix, env->avx10_version, version);
8525 }
8526 env->avx10_version = version;
8527 have_filtered_features = true;
8528 }
8529 } else if (env->avx10_version) {
8530 if (prefix) {
8531 warn_report("%s: avx10.%d.", prefix, env->avx10_version);
8532 }
8533 have_filtered_features = true;
8534 }
8535
8536 return have_filtered_features;
8537 }
8538
x86_cpu_hyperv_realize(X86CPU * cpu)8539 static void x86_cpu_hyperv_realize(X86CPU *cpu)
8540 {
8541 size_t len;
8542
8543 /* Hyper-V vendor id */
8544 if (!cpu->hyperv_vendor) {
8545 object_property_set_str(OBJECT(cpu), "hv-vendor-id", "Microsoft Hv",
8546 &error_abort);
8547 }
8548 len = strlen(cpu->hyperv_vendor);
8549 if (len > 12) {
8550 warn_report("hv-vendor-id truncated to 12 characters");
8551 len = 12;
8552 }
8553 memset(cpu->hyperv_vendor_id, 0, 12);
8554 memcpy(cpu->hyperv_vendor_id, cpu->hyperv_vendor, len);
8555
8556 /* 'Hv#1' interface identification*/
8557 cpu->hyperv_interface_id[0] = 0x31237648;
8558 cpu->hyperv_interface_id[1] = 0;
8559 cpu->hyperv_interface_id[2] = 0;
8560 cpu->hyperv_interface_id[3] = 0;
8561
8562 /* Hypervisor implementation limits */
8563 cpu->hyperv_limits[0] = 64;
8564 cpu->hyperv_limits[1] = 0;
8565 cpu->hyperv_limits[2] = 0;
8566 }
8567
8568 #ifndef CONFIG_USER_ONLY
x86_cpu_update_smp_cache_topo(MachineState * ms,X86CPU * cpu,Error ** errp)8569 static bool x86_cpu_update_smp_cache_topo(MachineState *ms, X86CPU *cpu,
8570 Error **errp)
8571 {
8572 CPUX86State *env = &cpu->env;
8573 CpuTopologyLevel level;
8574
8575 level = machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1D);
8576 if (level != CPU_TOPOLOGY_LEVEL_DEFAULT) {
8577 env->cache_info_cpuid4.l1d_cache->share_level = level;
8578 env->cache_info_amd.l1d_cache->share_level = level;
8579 } else {
8580 machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1D,
8581 env->cache_info_cpuid4.l1d_cache->share_level);
8582 machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1D,
8583 env->cache_info_amd.l1d_cache->share_level);
8584 }
8585
8586 level = machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1I);
8587 if (level != CPU_TOPOLOGY_LEVEL_DEFAULT) {
8588 env->cache_info_cpuid4.l1i_cache->share_level = level;
8589 env->cache_info_amd.l1i_cache->share_level = level;
8590 } else {
8591 machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1I,
8592 env->cache_info_cpuid4.l1i_cache->share_level);
8593 machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1I,
8594 env->cache_info_amd.l1i_cache->share_level);
8595 }
8596
8597 level = machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L2);
8598 if (level != CPU_TOPOLOGY_LEVEL_DEFAULT) {
8599 env->cache_info_cpuid4.l2_cache->share_level = level;
8600 env->cache_info_amd.l2_cache->share_level = level;
8601 } else {
8602 machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L2,
8603 env->cache_info_cpuid4.l2_cache->share_level);
8604 machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L2,
8605 env->cache_info_amd.l2_cache->share_level);
8606 }
8607
8608 level = machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L3);
8609 if (level != CPU_TOPOLOGY_LEVEL_DEFAULT) {
8610 env->cache_info_cpuid4.l3_cache->share_level = level;
8611 env->cache_info_amd.l3_cache->share_level = level;
8612 } else {
8613 machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L3,
8614 env->cache_info_cpuid4.l3_cache->share_level);
8615 machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L3,
8616 env->cache_info_amd.l3_cache->share_level);
8617 }
8618
8619 if (!machine_check_smp_cache(ms, errp)) {
8620 return false;
8621 }
8622 return true;
8623 }
8624 #endif
8625
x86_cpu_realizefn(DeviceState * dev,Error ** errp)8626 static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
8627 {
8628 CPUState *cs = CPU(dev);
8629 X86CPU *cpu = X86_CPU(dev);
8630 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
8631 CPUX86State *env = &cpu->env;
8632 Error *local_err = NULL;
8633 unsigned requested_lbr_fmt;
8634
8635 #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
8636 /* Use pc-relative instructions in system-mode */
8637 tcg_cflags_set(cs, CF_PCREL);
8638 #endif
8639
8640 if (cpu->apic_id == UNASSIGNED_APIC_ID) {
8641 error_setg(errp, "apic-id property was not initialized properly");
8642 return;
8643 }
8644
8645 /*
8646 * Process Hyper-V enlightenments.
8647 * Note: this currently has to happen before the expansion of CPU features.
8648 */
8649 x86_cpu_hyperv_realize(cpu);
8650
8651 x86_cpu_expand_features(cpu, &local_err);
8652 if (local_err) {
8653 goto out;
8654 }
8655
8656 /*
8657 * Override env->features[FEAT_PERF_CAPABILITIES].LBR_FMT
8658 * with user-provided setting.
8659 */
8660 if (cpu->lbr_fmt != ~PERF_CAP_LBR_FMT) {
8661 if ((cpu->lbr_fmt & PERF_CAP_LBR_FMT) != cpu->lbr_fmt) {
8662 error_setg(errp, "invalid lbr-fmt");
8663 return;
8664 }
8665 env->features[FEAT_PERF_CAPABILITIES] &= ~PERF_CAP_LBR_FMT;
8666 env->features[FEAT_PERF_CAPABILITIES] |= cpu->lbr_fmt;
8667 }
8668
8669 /*
8670 * vPMU LBR is supported when 1) KVM is enabled 2) Option pmu=on and
8671 * 3)vPMU LBR format matches that of host setting.
8672 */
8673 requested_lbr_fmt =
8674 env->features[FEAT_PERF_CAPABILITIES] & PERF_CAP_LBR_FMT;
8675 if (requested_lbr_fmt && kvm_enabled()) {
8676 uint64_t host_perf_cap =
8677 x86_cpu_get_supported_feature_word(NULL, FEAT_PERF_CAPABILITIES);
8678 unsigned host_lbr_fmt = host_perf_cap & PERF_CAP_LBR_FMT;
8679
8680 if (!cpu->enable_pmu) {
8681 error_setg(errp, "vPMU: LBR is unsupported without pmu=on");
8682 return;
8683 }
8684 if (requested_lbr_fmt != host_lbr_fmt) {
8685 error_setg(errp, "vPMU: the lbr-fmt value (0x%x) does not match "
8686 "the host value (0x%x).",
8687 requested_lbr_fmt, host_lbr_fmt);
8688 return;
8689 }
8690 }
8691
8692 if (x86_cpu_filter_features(cpu, cpu->check_cpuid || cpu->enforce_cpuid)) {
8693 if (cpu->enforce_cpuid) {
8694 error_setg(&local_err,
8695 accel_uses_host_cpuid() ?
8696 "Host doesn't support requested features" :
8697 "TCG doesn't support requested features");
8698 goto out;
8699 }
8700 }
8701
8702 /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on
8703 * CPUID[1].EDX.
8704 */
8705 if (IS_AMD_CPU(env)) {
8706 env->features[FEAT_8000_0001_EDX] &= ~CPUID_EXT2_AMD_ALIASES;
8707 env->features[FEAT_8000_0001_EDX] |= (env->features[FEAT_1_EDX]
8708 & CPUID_EXT2_AMD_ALIASES);
8709 }
8710
8711 x86_cpu_set_sgxlepubkeyhash(env);
8712
8713 /*
8714 * note: the call to the framework needs to happen after feature expansion,
8715 * but before the checks/modifications to ucode_rev, mwait, phys_bits.
8716 * These may be set by the accel-specific code,
8717 * and the results are subsequently checked / assumed in this function.
8718 */
8719 cpu_exec_realizefn(cs, &local_err);
8720 if (local_err != NULL) {
8721 error_propagate(errp, local_err);
8722 return;
8723 }
8724
8725 if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
8726 g_autofree char *name = x86_cpu_class_get_model_name(xcc);
8727 error_setg(&local_err, "CPU model '%s' requires KVM or HVF", name);
8728 goto out;
8729 }
8730
8731 if (cpu->guest_phys_bits == -1) {
8732 /*
8733 * If it was not set by the user, or by the accelerator via
8734 * cpu_exec_realizefn, clear.
8735 */
8736 cpu->guest_phys_bits = 0;
8737 }
8738
8739 if (cpu->ucode_rev == 0) {
8740 /*
8741 * The default is the same as KVM's. Note that this check
8742 * needs to happen after the evenual setting of ucode_rev in
8743 * accel-specific code in cpu_exec_realizefn.
8744 */
8745 if (IS_AMD_CPU(env)) {
8746 cpu->ucode_rev = 0x01000065;
8747 } else {
8748 cpu->ucode_rev = 0x100000000ULL;
8749 }
8750 }
8751
8752 /*
8753 * mwait extended info: needed for Core compatibility
8754 * We always wake on interrupt even if host does not have the capability.
8755 *
8756 * requires the accel-specific code in cpu_exec_realizefn to
8757 * have already acquired the CPUID data into cpu->mwait.
8758 */
8759 cpu->mwait.ecx |= CPUID_MWAIT_EMX | CPUID_MWAIT_IBE;
8760
8761 /*
8762 * Most Intel and certain AMD CPUs support hyperthreading. Even though QEMU
8763 * fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
8764 * based on inputs (sockets,cores,threads), it is still better to give
8765 * users a warning.
8766 */
8767 if (IS_AMD_CPU(env) &&
8768 !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
8769 env->topo_info.threads_per_core > 1) {
8770 warn_report_once("This family of AMD CPU doesn't support "
8771 "hyperthreading(%d). Please configure -smp "
8772 "options properly or try enabling topoext "
8773 "feature.", env->topo_info.threads_per_core);
8774 }
8775
8776 /* For 64bit systems think about the number of physical bits to present.
8777 * ideally this should be the same as the host; anything other than matching
8778 * the host can cause incorrect guest behaviour.
8779 * QEMU used to pick the magic value of 40 bits that corresponds to
8780 * consumer AMD devices but nothing else.
8781 *
8782 * Note that this code assumes features expansion has already been done
8783 * (as it checks for CPUID_EXT2_LM), and also assumes that potential
8784 * phys_bits adjustments to match the host have been already done in
8785 * accel-specific code in cpu_exec_realizefn.
8786 */
8787 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
8788 if (cpu->phys_bits &&
8789 (cpu->phys_bits > TARGET_PHYS_ADDR_SPACE_BITS ||
8790 cpu->phys_bits < 32)) {
8791 error_setg(errp, "phys-bits should be between 32 and %u "
8792 " (but is %u)",
8793 TARGET_PHYS_ADDR_SPACE_BITS, cpu->phys_bits);
8794 return;
8795 }
8796 /*
8797 * 0 means it was not explicitly set by the user (or by machine
8798 * compat_props or by the host code in host-cpu.c).
8799 * In this case, the default is the value used by TCG (40).
8800 */
8801 if (cpu->phys_bits == 0) {
8802 cpu->phys_bits = TCG_PHYS_ADDR_BITS;
8803 }
8804 if (cpu->guest_phys_bits &&
8805 (cpu->guest_phys_bits > cpu->phys_bits ||
8806 cpu->guest_phys_bits < 32)) {
8807 error_setg(errp, "guest-phys-bits should be between 32 and %u "
8808 " (but is %u)",
8809 cpu->phys_bits, cpu->guest_phys_bits);
8810 return;
8811 }
8812 } else {
8813 /* For 32 bit systems don't use the user set value, but keep
8814 * phys_bits consistent with what we tell the guest.
8815 */
8816 if (cpu->phys_bits != 0) {
8817 error_setg(errp, "phys-bits is not user-configurable in 32 bit");
8818 return;
8819 }
8820 if (cpu->guest_phys_bits != 0) {
8821 error_setg(errp, "guest-phys-bits is not user-configurable in 32 bit");
8822 return;
8823 }
8824
8825 if (env->features[FEAT_1_EDX] & (CPUID_PSE36 | CPUID_PAE)) {
8826 cpu->phys_bits = 36;
8827 } else {
8828 cpu->phys_bits = 32;
8829 }
8830 }
8831
8832 /* Cache information initialization */
8833 if (!cpu->legacy_cache) {
8834 const CPUCaches *cache_info =
8835 x86_cpu_get_versioned_cache_info(cpu, xcc->model);
8836
8837 if (!xcc->model || !cache_info) {
8838 g_autofree char *name = x86_cpu_class_get_model_name(xcc);
8839 error_setg(errp,
8840 "CPU model '%s' doesn't support legacy-cache=off", name);
8841 return;
8842 }
8843 env->cache_info_cpuid2 = env->cache_info_cpuid4 = env->cache_info_amd =
8844 *cache_info;
8845 } else {
8846 /* Build legacy cache information */
8847 env->cache_info_cpuid2.l1d_cache = &legacy_l1d_cache;
8848 env->cache_info_cpuid2.l1i_cache = &legacy_l1i_cache;
8849 env->cache_info_cpuid2.l2_cache = &legacy_l2_cache_cpuid2;
8850 env->cache_info_cpuid2.l3_cache = &legacy_l3_cache;
8851
8852 env->cache_info_cpuid4.l1d_cache = &legacy_l1d_cache;
8853 env->cache_info_cpuid4.l1i_cache = &legacy_l1i_cache;
8854 env->cache_info_cpuid4.l2_cache = &legacy_l2_cache;
8855 env->cache_info_cpuid4.l3_cache = &legacy_l3_cache;
8856
8857 env->cache_info_amd.l1d_cache = &legacy_l1d_cache_amd;
8858 env->cache_info_amd.l1i_cache = &legacy_l1i_cache_amd;
8859 env->cache_info_amd.l2_cache = &legacy_l2_cache_amd;
8860 env->cache_info_amd.l3_cache = &legacy_l3_cache;
8861 }
8862
8863 #ifndef CONFIG_USER_ONLY
8864 MachineState *ms = MACHINE(qdev_get_machine());
8865 MachineClass *mc = MACHINE_GET_CLASS(ms);
8866
8867 if (mc->smp_props.has_caches) {
8868 if (!x86_cpu_update_smp_cache_topo(ms, cpu, errp)) {
8869 return;
8870 }
8871 }
8872
8873 qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
8874
8875 if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || ms->smp.cpus > 1) {
8876 x86_cpu_apic_create(cpu, &local_err);
8877 if (local_err != NULL) {
8878 goto out;
8879 }
8880 }
8881 #endif
8882
8883 mce_init(cpu);
8884
8885 x86_cpu_gdb_init(cs);
8886 qemu_init_vcpu(cs);
8887
8888 #ifndef CONFIG_USER_ONLY
8889 x86_cpu_apic_realize(cpu, &local_err);
8890 if (local_err != NULL) {
8891 goto out;
8892 }
8893 #endif /* !CONFIG_USER_ONLY */
8894 cpu_reset(cs);
8895
8896 xcc->parent_realize(dev, &local_err);
8897
8898 out:
8899 if (local_err != NULL) {
8900 error_propagate(errp, local_err);
8901 return;
8902 }
8903 }
8904
x86_cpu_unrealizefn(DeviceState * dev)8905 static void x86_cpu_unrealizefn(DeviceState *dev)
8906 {
8907 X86CPU *cpu = X86_CPU(dev);
8908 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
8909
8910 #ifndef CONFIG_USER_ONLY
8911 cpu_remove_sync(CPU(dev));
8912 qemu_unregister_reset(x86_cpu_machine_reset_cb, dev);
8913 #endif
8914
8915 if (cpu->apic_state) {
8916 object_unparent(OBJECT(cpu->apic_state));
8917 cpu->apic_state = NULL;
8918 }
8919
8920 xcc->parent_unrealize(dev);
8921 }
8922
8923 typedef struct BitProperty {
8924 FeatureWord w;
8925 uint64_t mask;
8926 } BitProperty;
8927
x86_cpu_get_bit_prop(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)8928 static void x86_cpu_get_bit_prop(Object *obj, Visitor *v, const char *name,
8929 void *opaque, Error **errp)
8930 {
8931 X86CPU *cpu = X86_CPU(obj);
8932 BitProperty *fp = opaque;
8933 uint64_t f = cpu->env.features[fp->w];
8934 bool value = (f & fp->mask) == fp->mask;
8935 visit_type_bool(v, name, &value, errp);
8936 }
8937
x86_cpu_set_bit_prop(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)8938 static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
8939 void *opaque, Error **errp)
8940 {
8941 DeviceState *dev = DEVICE(obj);
8942 X86CPU *cpu = X86_CPU(obj);
8943 BitProperty *fp = opaque;
8944 bool value;
8945
8946 if (dev->realized) {
8947 qdev_prop_set_after_realize(dev, name, errp);
8948 return;
8949 }
8950
8951 if (!visit_type_bool(v, name, &value, errp)) {
8952 return;
8953 }
8954
8955 if (value) {
8956 cpu->env.features[fp->w] |= fp->mask;
8957 } else {
8958 cpu->env.features[fp->w] &= ~fp->mask;
8959 }
8960 cpu->env.user_features[fp->w] |= fp->mask;
8961 }
8962
8963 /* Register a boolean property to get/set a single bit in a uint32_t field.
8964 *
8965 * The same property name can be registered multiple times to make it affect
8966 * multiple bits in the same FeatureWord. In that case, the getter will return
8967 * true only if all bits are set.
8968 */
x86_cpu_register_bit_prop(X86CPUClass * xcc,const char * prop_name,FeatureWord w,int bitnr)8969 static void x86_cpu_register_bit_prop(X86CPUClass *xcc,
8970 const char *prop_name,
8971 FeatureWord w,
8972 int bitnr)
8973 {
8974 ObjectClass *oc = OBJECT_CLASS(xcc);
8975 BitProperty *fp;
8976 ObjectProperty *op;
8977 uint64_t mask = (1ULL << bitnr);
8978
8979 op = object_class_property_find(oc, prop_name);
8980 if (op) {
8981 fp = op->opaque;
8982 assert(fp->w == w);
8983 fp->mask |= mask;
8984 } else {
8985 fp = g_new0(BitProperty, 1);
8986 fp->w = w;
8987 fp->mask = mask;
8988 object_class_property_add(oc, prop_name, "bool",
8989 x86_cpu_get_bit_prop,
8990 x86_cpu_set_bit_prop,
8991 NULL, fp);
8992 }
8993 }
8994
x86_cpu_register_feature_bit_props(X86CPUClass * xcc,FeatureWord w,int bitnr)8995 static void x86_cpu_register_feature_bit_props(X86CPUClass *xcc,
8996 FeatureWord w,
8997 int bitnr)
8998 {
8999 FeatureWordInfo *fi = &feature_word_info[w];
9000 const char *name = fi->feat_names[bitnr];
9001
9002 if (!name) {
9003 return;
9004 }
9005
9006 /* Property names should use "-" instead of "_".
9007 * Old names containing underscores are registered as aliases
9008 * using object_property_add_alias()
9009 */
9010 assert(!strchr(name, '_'));
9011 /* aliases don't use "|" delimiters anymore, they are registered
9012 * manually using object_property_add_alias() */
9013 assert(!strchr(name, '|'));
9014 x86_cpu_register_bit_prop(xcc, name, w, bitnr);
9015 }
9016
x86_cpu_post_initfn(Object * obj)9017 static void x86_cpu_post_initfn(Object *obj)
9018 {
9019 static bool first = true;
9020 uint64_t supported_xcr0;
9021 int i;
9022
9023 if (first) {
9024 first = false;
9025
9026 supported_xcr0 =
9027 ((uint64_t) x86_cpu_get_supported_feature_word(NULL, FEAT_XSAVE_XCR0_HI) << 32) |
9028 x86_cpu_get_supported_feature_word(NULL, FEAT_XSAVE_XCR0_LO);
9029
9030 for (i = XSTATE_SSE_BIT + 1; i < XSAVE_STATE_AREA_COUNT; i++) {
9031 ExtSaveArea *esa = &x86_ext_save_areas[i];
9032
9033 if (!(supported_xcr0 & (1 << i))) {
9034 esa->size = 0;
9035 }
9036 }
9037 }
9038
9039 accel_cpu_instance_init(CPU(obj));
9040
9041 #ifndef CONFIG_USER_ONLY
9042 if (current_machine && current_machine->cgs) {
9043 x86_confidential_guest_cpu_instance_init(
9044 X86_CONFIDENTIAL_GUEST(current_machine->cgs), (CPU(obj)));
9045 }
9046 #endif
9047 }
9048
x86_cpu_init_default_topo(X86CPU * cpu)9049 static void x86_cpu_init_default_topo(X86CPU *cpu)
9050 {
9051 CPUX86State *env = &cpu->env;
9052
9053 env->topo_info = (X86CPUTopoInfo) {1, 1, 1, 1};
9054
9055 /* thread, core and socket levels are set by default. */
9056 set_bit(CPU_TOPOLOGY_LEVEL_THREAD, env->avail_cpu_topo);
9057 set_bit(CPU_TOPOLOGY_LEVEL_CORE, env->avail_cpu_topo);
9058 set_bit(CPU_TOPOLOGY_LEVEL_SOCKET, env->avail_cpu_topo);
9059 }
9060
x86_cpu_initfn(Object * obj)9061 static void x86_cpu_initfn(Object *obj)
9062 {
9063 X86CPU *cpu = X86_CPU(obj);
9064 X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
9065 CPUX86State *env = &cpu->env;
9066
9067 x86_cpu_init_default_topo(cpu);
9068
9069 object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo",
9070 x86_cpu_get_feature_words,
9071 NULL, NULL, (void *)env->features);
9072 object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo",
9073 x86_cpu_get_feature_words,
9074 NULL, NULL, (void *)cpu->filtered_features);
9075
9076 object_property_add_alias(obj, "sse3", obj, "pni");
9077 object_property_add_alias(obj, "pclmuldq", obj, "pclmulqdq");
9078 object_property_add_alias(obj, "sse4-1", obj, "sse4.1");
9079 object_property_add_alias(obj, "sse4-2", obj, "sse4.2");
9080 object_property_add_alias(obj, "xd", obj, "nx");
9081 object_property_add_alias(obj, "ffxsr", obj, "fxsr-opt");
9082 object_property_add_alias(obj, "i64", obj, "lm");
9083
9084 object_property_add_alias(obj, "ds_cpl", obj, "ds-cpl");
9085 object_property_add_alias(obj, "tsc_adjust", obj, "tsc-adjust");
9086 object_property_add_alias(obj, "fxsr_opt", obj, "fxsr-opt");
9087 object_property_add_alias(obj, "lahf_lm", obj, "lahf-lm");
9088 object_property_add_alias(obj, "cmp_legacy", obj, "cmp-legacy");
9089 object_property_add_alias(obj, "nodeid_msr", obj, "nodeid-msr");
9090 object_property_add_alias(obj, "perfctr_core", obj, "perfctr-core");
9091 object_property_add_alias(obj, "perfctr_nb", obj, "perfctr-nb");
9092 object_property_add_alias(obj, "kvm_nopiodelay", obj, "kvm-nopiodelay");
9093 object_property_add_alias(obj, "kvm_mmu", obj, "kvm-mmu");
9094 object_property_add_alias(obj, "kvm_asyncpf", obj, "kvm-asyncpf");
9095 object_property_add_alias(obj, "kvm_asyncpf_int", obj, "kvm-asyncpf-int");
9096 object_property_add_alias(obj, "kvm_steal_time", obj, "kvm-steal-time");
9097 object_property_add_alias(obj, "kvm_pv_eoi", obj, "kvm-pv-eoi");
9098 object_property_add_alias(obj, "kvm_pv_unhalt", obj, "kvm-pv-unhalt");
9099 object_property_add_alias(obj, "kvm_poll_control", obj, "kvm-poll-control");
9100 object_property_add_alias(obj, "svm_lock", obj, "svm-lock");
9101 object_property_add_alias(obj, "nrip_save", obj, "nrip-save");
9102 object_property_add_alias(obj, "tsc_scale", obj, "tsc-scale");
9103 object_property_add_alias(obj, "vmcb_clean", obj, "vmcb-clean");
9104 object_property_add_alias(obj, "pause_filter", obj, "pause-filter");
9105 object_property_add_alias(obj, "sse4_1", obj, "sse4.1");
9106 object_property_add_alias(obj, "sse4_2", obj, "sse4.2");
9107
9108 object_property_add_alias(obj, "hv-apicv", obj, "hv-avic");
9109 cpu->lbr_fmt = ~PERF_CAP_LBR_FMT;
9110 object_property_add_alias(obj, "lbr_fmt", obj, "lbr-fmt");
9111
9112 if (xcc->model) {
9113 x86_cpu_load_model(cpu, xcc->model);
9114 }
9115 }
9116
x86_cpu_get_arch_id(CPUState * cs)9117 static int64_t x86_cpu_get_arch_id(CPUState *cs)
9118 {
9119 X86CPU *cpu = X86_CPU(cs);
9120
9121 return cpu->apic_id;
9122 }
9123
9124 #if !defined(CONFIG_USER_ONLY)
x86_cpu_get_paging_enabled(const CPUState * cs)9125 static bool x86_cpu_get_paging_enabled(const CPUState *cs)
9126 {
9127 X86CPU *cpu = X86_CPU(cs);
9128
9129 return cpu->env.cr[0] & CR0_PG_MASK;
9130 }
9131 #endif /* !CONFIG_USER_ONLY */
9132
x86_cpu_set_pc(CPUState * cs,vaddr value)9133 static void x86_cpu_set_pc(CPUState *cs, vaddr value)
9134 {
9135 X86CPU *cpu = X86_CPU(cs);
9136
9137 cpu->env.eip = value;
9138 }
9139
x86_cpu_get_pc(CPUState * cs)9140 static vaddr x86_cpu_get_pc(CPUState *cs)
9141 {
9142 X86CPU *cpu = X86_CPU(cs);
9143
9144 /* Match cpu_get_tb_cpu_state. */
9145 return cpu->env.eip + cpu->env.segs[R_CS].base;
9146 }
9147
9148 #if !defined(CONFIG_USER_ONLY)
x86_cpu_pending_interrupt(CPUState * cs,int interrupt_request)9149 int x86_cpu_pending_interrupt(CPUState *cs, int interrupt_request)
9150 {
9151 X86CPU *cpu = X86_CPU(cs);
9152 CPUX86State *env = &cpu->env;
9153
9154 if (interrupt_request & CPU_INTERRUPT_POLL) {
9155 return CPU_INTERRUPT_POLL;
9156 }
9157 if (interrupt_request & CPU_INTERRUPT_SIPI) {
9158 return CPU_INTERRUPT_SIPI;
9159 }
9160
9161 if (env->hflags2 & HF2_GIF_MASK) {
9162 if ((interrupt_request & CPU_INTERRUPT_SMI) &&
9163 !(env->hflags & HF_SMM_MASK)) {
9164 return CPU_INTERRUPT_SMI;
9165 } else if ((interrupt_request & CPU_INTERRUPT_NMI) &&
9166 !(env->hflags2 & HF2_NMI_MASK)) {
9167 return CPU_INTERRUPT_NMI;
9168 } else if (interrupt_request & CPU_INTERRUPT_MCE) {
9169 return CPU_INTERRUPT_MCE;
9170 } else if ((interrupt_request & CPU_INTERRUPT_HARD) &&
9171 (((env->hflags2 & HF2_VINTR_MASK) &&
9172 (env->hflags2 & HF2_HIF_MASK)) ||
9173 (!(env->hflags2 & HF2_VINTR_MASK) &&
9174 (env->eflags & IF_MASK &&
9175 !(env->hflags & HF_INHIBIT_IRQ_MASK))))) {
9176 return CPU_INTERRUPT_HARD;
9177 } else if (env->hflags2 & HF2_VGIF_MASK) {
9178 if((interrupt_request & CPU_INTERRUPT_VIRQ) &&
9179 (env->eflags & IF_MASK) &&
9180 !(env->hflags & HF_INHIBIT_IRQ_MASK)) {
9181 return CPU_INTERRUPT_VIRQ;
9182 }
9183 }
9184 }
9185
9186 return 0;
9187 }
9188
x86_cpu_has_work(CPUState * cs)9189 static bool x86_cpu_has_work(CPUState *cs)
9190 {
9191 return x86_cpu_pending_interrupt(cs, cs->interrupt_request) != 0;
9192 }
9193 #endif /* !CONFIG_USER_ONLY */
9194
x86_disas_set_info(CPUState * cs,disassemble_info * info)9195 static void x86_disas_set_info(CPUState *cs, disassemble_info *info)
9196 {
9197 X86CPU *cpu = X86_CPU(cs);
9198 CPUX86State *env = &cpu->env;
9199
9200 info->endian = BFD_ENDIAN_LITTLE;
9201 info->mach = (env->hflags & HF_CS64_MASK ? bfd_mach_x86_64
9202 : env->hflags & HF_CS32_MASK ? bfd_mach_i386_i386
9203 : bfd_mach_i386_i8086);
9204
9205 info->cap_arch = CS_ARCH_X86;
9206 info->cap_mode = (env->hflags & HF_CS64_MASK ? CS_MODE_64
9207 : env->hflags & HF_CS32_MASK ? CS_MODE_32
9208 : CS_MODE_16);
9209 info->cap_insn_unit = 1;
9210 info->cap_insn_split = 8;
9211 }
9212
x86_update_hflags(CPUX86State * env)9213 void x86_update_hflags(CPUX86State *env)
9214 {
9215 uint32_t hflags;
9216 #define HFLAG_COPY_MASK \
9217 ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
9218 HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
9219 HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
9220 HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK)
9221
9222 hflags = env->hflags & HFLAG_COPY_MASK;
9223 hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
9224 hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
9225 hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
9226 (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
9227 hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
9228
9229 if (env->cr[4] & CR4_OSFXSR_MASK) {
9230 hflags |= HF_OSFXSR_MASK;
9231 }
9232
9233 if (env->efer & MSR_EFER_LMA) {
9234 hflags |= HF_LMA_MASK;
9235 }
9236
9237 if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
9238 hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
9239 } else {
9240 hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
9241 (DESC_B_SHIFT - HF_CS32_SHIFT);
9242 hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
9243 (DESC_B_SHIFT - HF_SS32_SHIFT);
9244 if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) ||
9245 !(hflags & HF_CS32_MASK)) {
9246 hflags |= HF_ADDSEG_MASK;
9247 } else {
9248 hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base |
9249 env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
9250 }
9251 }
9252 env->hflags = hflags;
9253 }
9254
9255 static const Property x86_cpu_properties[] = {
9256 #ifdef CONFIG_USER_ONLY
9257 /* apic_id = 0 by default for *-user, see commit 9886e834 */
9258 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, 0),
9259 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, 0),
9260 DEFINE_PROP_INT32("core-id", X86CPU, core_id, 0),
9261 DEFINE_PROP_INT32("module-id", X86CPU, module_id, 0),
9262 DEFINE_PROP_INT32("die-id", X86CPU, die_id, 0),
9263 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, 0),
9264 #else
9265 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, UNASSIGNED_APIC_ID),
9266 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, -1),
9267 DEFINE_PROP_INT32("core-id", X86CPU, core_id, -1),
9268 DEFINE_PROP_INT32("module-id", X86CPU, module_id, -1),
9269 DEFINE_PROP_INT32("die-id", X86CPU, die_id, -1),
9270 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, -1),
9271 #endif
9272 DEFINE_PROP_INT32("node-id", X86CPU, node_id, CPU_UNSET_NUMA_NODE_ID),
9273 DEFINE_PROP_BOOL("pmu", X86CPU, enable_pmu, false),
9274 DEFINE_PROP_UINT64_CHECKMASK("lbr-fmt", X86CPU, lbr_fmt, PERF_CAP_LBR_FMT),
9275
9276 DEFINE_PROP_UINT32("hv-spinlocks", X86CPU, hyperv_spinlock_attempts,
9277 HYPERV_SPINLOCK_NEVER_NOTIFY),
9278 DEFINE_PROP_BIT64("hv-relaxed", X86CPU, hyperv_features,
9279 HYPERV_FEAT_RELAXED, 0),
9280 DEFINE_PROP_BIT64("hv-vapic", X86CPU, hyperv_features,
9281 HYPERV_FEAT_VAPIC, 0),
9282 DEFINE_PROP_BIT64("hv-time", X86CPU, hyperv_features,
9283 HYPERV_FEAT_TIME, 0),
9284 DEFINE_PROP_BIT64("hv-crash", X86CPU, hyperv_features,
9285 HYPERV_FEAT_CRASH, 0),
9286 DEFINE_PROP_BIT64("hv-reset", X86CPU, hyperv_features,
9287 HYPERV_FEAT_RESET, 0),
9288 DEFINE_PROP_BIT64("hv-vpindex", X86CPU, hyperv_features,
9289 HYPERV_FEAT_VPINDEX, 0),
9290 DEFINE_PROP_BIT64("hv-runtime", X86CPU, hyperv_features,
9291 HYPERV_FEAT_RUNTIME, 0),
9292 DEFINE_PROP_BIT64("hv-synic", X86CPU, hyperv_features,
9293 HYPERV_FEAT_SYNIC, 0),
9294 DEFINE_PROP_BIT64("hv-stimer", X86CPU, hyperv_features,
9295 HYPERV_FEAT_STIMER, 0),
9296 DEFINE_PROP_BIT64("hv-frequencies", X86CPU, hyperv_features,
9297 HYPERV_FEAT_FREQUENCIES, 0),
9298 DEFINE_PROP_BIT64("hv-reenlightenment", X86CPU, hyperv_features,
9299 HYPERV_FEAT_REENLIGHTENMENT, 0),
9300 DEFINE_PROP_BIT64("hv-tlbflush", X86CPU, hyperv_features,
9301 HYPERV_FEAT_TLBFLUSH, 0),
9302 DEFINE_PROP_BIT64("hv-evmcs", X86CPU, hyperv_features,
9303 HYPERV_FEAT_EVMCS, 0),
9304 DEFINE_PROP_BIT64("hv-ipi", X86CPU, hyperv_features,
9305 HYPERV_FEAT_IPI, 0),
9306 DEFINE_PROP_BIT64("hv-stimer-direct", X86CPU, hyperv_features,
9307 HYPERV_FEAT_STIMER_DIRECT, 0),
9308 DEFINE_PROP_BIT64("hv-avic", X86CPU, hyperv_features,
9309 HYPERV_FEAT_AVIC, 0),
9310 DEFINE_PROP_BIT64("hv-emsr-bitmap", X86CPU, hyperv_features,
9311 HYPERV_FEAT_MSR_BITMAP, 0),
9312 DEFINE_PROP_BIT64("hv-xmm-input", X86CPU, hyperv_features,
9313 HYPERV_FEAT_XMM_INPUT, 0),
9314 DEFINE_PROP_BIT64("hv-tlbflush-ext", X86CPU, hyperv_features,
9315 HYPERV_FEAT_TLBFLUSH_EXT, 0),
9316 DEFINE_PROP_BIT64("hv-tlbflush-direct", X86CPU, hyperv_features,
9317 HYPERV_FEAT_TLBFLUSH_DIRECT, 0),
9318 DEFINE_PROP_ON_OFF_AUTO("hv-no-nonarch-coresharing", X86CPU,
9319 hyperv_no_nonarch_cs, ON_OFF_AUTO_OFF),
9320 #ifdef CONFIG_SYNDBG
9321 DEFINE_PROP_BIT64("hv-syndbg", X86CPU, hyperv_features,
9322 HYPERV_FEAT_SYNDBG, 0),
9323 #endif
9324 DEFINE_PROP_BOOL("hv-passthrough", X86CPU, hyperv_passthrough, false),
9325 DEFINE_PROP_BOOL("hv-enforce-cpuid", X86CPU, hyperv_enforce_cpuid, false),
9326
9327 /* WS2008R2 identify by default */
9328 DEFINE_PROP_UINT32("hv-version-id-build", X86CPU, hyperv_ver_id_build,
9329 0x3839),
9330 DEFINE_PROP_UINT16("hv-version-id-major", X86CPU, hyperv_ver_id_major,
9331 0x000A),
9332 DEFINE_PROP_UINT16("hv-version-id-minor", X86CPU, hyperv_ver_id_minor,
9333 0x0000),
9334 DEFINE_PROP_UINT32("hv-version-id-spack", X86CPU, hyperv_ver_id_sp, 0),
9335 DEFINE_PROP_UINT8("hv-version-id-sbranch", X86CPU, hyperv_ver_id_sb, 0),
9336 DEFINE_PROP_UINT32("hv-version-id-snumber", X86CPU, hyperv_ver_id_sn, 0),
9337
9338 DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true),
9339 DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
9340 DEFINE_PROP_BOOL("x-force-features", X86CPU, force_features, false),
9341 DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true),
9342 DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 0),
9343 DEFINE_PROP_UINT32("guest-phys-bits", X86CPU, guest_phys_bits, -1),
9344 DEFINE_PROP_BOOL("host-phys-bits", X86CPU, host_phys_bits, false),
9345 DEFINE_PROP_UINT8("host-phys-bits-limit", X86CPU, host_phys_bits_limit, 0),
9346 DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true),
9347 DEFINE_PROP_UINT32("level-func7", X86CPU, env.cpuid_level_func7,
9348 UINT32_MAX),
9349 DEFINE_PROP_UINT32("level", X86CPU, env.cpuid_level, UINT32_MAX),
9350 DEFINE_PROP_UINT32("xlevel", X86CPU, env.cpuid_xlevel, UINT32_MAX),
9351 DEFINE_PROP_UINT32("xlevel2", X86CPU, env.cpuid_xlevel2, UINT32_MAX),
9352 DEFINE_PROP_UINT32("min-level", X86CPU, env.cpuid_min_level, 0),
9353 DEFINE_PROP_UINT32("min-xlevel", X86CPU, env.cpuid_min_xlevel, 0),
9354 DEFINE_PROP_UINT32("min-xlevel2", X86CPU, env.cpuid_min_xlevel2, 0),
9355 DEFINE_PROP_UINT8("avx10-version", X86CPU, env.avx10_version, 0),
9356 DEFINE_PROP_UINT64("ucode-rev", X86CPU, ucode_rev, 0),
9357 DEFINE_PROP_BOOL("full-cpuid-auto-level", X86CPU, full_cpuid_auto_level, true),
9358 DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor),
9359 DEFINE_PROP_BOOL("cpuid-0xb", X86CPU, enable_cpuid_0xb, true),
9360 DEFINE_PROP_BOOL("x-vendor-cpuid-only", X86CPU, vendor_cpuid_only, true),
9361 DEFINE_PROP_BOOL("x-amd-topoext-features-only", X86CPU, amd_topoext_features_only, true),
9362 DEFINE_PROP_BOOL("lmce", X86CPU, enable_lmce, false),
9363 DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true),
9364 DEFINE_PROP_BOOL("kvm-pv-enforce-cpuid", X86CPU, kvm_pv_enforce_cpuid,
9365 false),
9366 DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true),
9367 DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true),
9368 DEFINE_PROP_BOOL("x-migrate-smi-count", X86CPU, migrate_smi_count,
9369 true),
9370 /*
9371 * lecacy_cache defaults to true unless the CPU model provides its
9372 * own cache information (see x86_cpu_load_def()).
9373 */
9374 DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, true),
9375 DEFINE_PROP_BOOL("legacy-multi-node", X86CPU, legacy_multi_node, false),
9376 DEFINE_PROP_BOOL("xen-vapic", X86CPU, xen_vapic, false),
9377
9378 /*
9379 * From "Requirements for Implementing the Microsoft
9380 * Hypervisor Interface":
9381 * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs
9382 *
9383 * "Starting with Windows Server 2012 and Windows 8, if
9384 * CPUID.40000005.EAX contains a value of -1, Windows assumes that
9385 * the hypervisor imposes no specific limit to the number of VPs.
9386 * In this case, Windows Server 2012 guest VMs may use more than
9387 * 64 VPs, up to the maximum supported number of processors applicable
9388 * to the specific Windows version being used."
9389 */
9390 DEFINE_PROP_INT32("x-hv-max-vps", X86CPU, hv_max_vps, -1),
9391 DEFINE_PROP_BOOL("x-hv-synic-kvm-only", X86CPU, hyperv_synic_kvm_only,
9392 false),
9393 DEFINE_PROP_BOOL("x-intel-pt-auto-level", X86CPU, intel_pt_auto_level,
9394 true),
9395 DEFINE_PROP_BOOL("x-l1-cache-per-thread", X86CPU, l1_cache_per_core, true),
9396 };
9397
9398 #ifndef CONFIG_USER_ONLY
9399 #include "hw/core/sysemu-cpu-ops.h"
9400
9401 static const struct SysemuCPUOps i386_sysemu_ops = {
9402 .has_work = x86_cpu_has_work,
9403 .get_memory_mapping = x86_cpu_get_memory_mapping,
9404 .get_paging_enabled = x86_cpu_get_paging_enabled,
9405 .get_phys_page_attrs_debug = x86_cpu_get_phys_page_attrs_debug,
9406 .asidx_from_attrs = x86_asidx_from_attrs,
9407 .get_crash_info = x86_cpu_get_crash_info,
9408 .write_elf32_note = x86_cpu_write_elf32_note,
9409 .write_elf64_note = x86_cpu_write_elf64_note,
9410 .write_elf32_qemunote = x86_cpu_write_elf32_qemunote,
9411 .write_elf64_qemunote = x86_cpu_write_elf64_qemunote,
9412 .legacy_vmsd = &vmstate_x86_cpu,
9413 };
9414 #endif
9415
x86_cpu_common_class_init(ObjectClass * oc,const void * data)9416 static void x86_cpu_common_class_init(ObjectClass *oc, const void *data)
9417 {
9418 X86CPUClass *xcc = X86_CPU_CLASS(oc);
9419 CPUClass *cc = CPU_CLASS(oc);
9420 DeviceClass *dc = DEVICE_CLASS(oc);
9421 ResettableClass *rc = RESETTABLE_CLASS(oc);
9422 FeatureWord w;
9423
9424 device_class_set_parent_realize(dc, x86_cpu_realizefn,
9425 &xcc->parent_realize);
9426 device_class_set_parent_unrealize(dc, x86_cpu_unrealizefn,
9427 &xcc->parent_unrealize);
9428 device_class_set_props(dc, x86_cpu_properties);
9429
9430 resettable_class_set_parent_phases(rc, NULL, x86_cpu_reset_hold, NULL,
9431 &xcc->parent_phases);
9432 cc->reset_dump_flags = CPU_DUMP_FPU | CPU_DUMP_CCOP;
9433
9434 cc->class_by_name = x86_cpu_class_by_name;
9435 cc->list_cpus = x86_cpu_list;
9436 cc->parse_features = x86_cpu_parse_featurestr;
9437 cc->dump_state = x86_cpu_dump_state;
9438 cc->set_pc = x86_cpu_set_pc;
9439 cc->get_pc = x86_cpu_get_pc;
9440 cc->gdb_read_register = x86_cpu_gdb_read_register;
9441 cc->gdb_write_register = x86_cpu_gdb_write_register;
9442 cc->get_arch_id = x86_cpu_get_arch_id;
9443
9444 #ifndef CONFIG_USER_ONLY
9445 cc->sysemu_ops = &i386_sysemu_ops;
9446 #endif /* !CONFIG_USER_ONLY */
9447 #ifdef CONFIG_TCG
9448 cc->tcg_ops = &x86_tcg_ops;
9449 #endif /* CONFIG_TCG */
9450
9451 cc->gdb_arch_name = x86_gdb_arch_name;
9452 #ifdef TARGET_X86_64
9453 cc->gdb_core_xml_file = "i386-64bit.xml";
9454 #else
9455 cc->gdb_core_xml_file = "i386-32bit.xml";
9456 #endif
9457 cc->disas_set_info = x86_disas_set_info;
9458
9459 dc->user_creatable = true;
9460
9461 object_class_property_add(oc, "family", "int",
9462 x86_cpuid_version_get_family,
9463 x86_cpuid_version_set_family, NULL, NULL);
9464 object_class_property_add(oc, "model", "int",
9465 x86_cpuid_version_get_model,
9466 x86_cpuid_version_set_model, NULL, NULL);
9467 object_class_property_add(oc, "stepping", "int",
9468 x86_cpuid_version_get_stepping,
9469 x86_cpuid_version_set_stepping, NULL, NULL);
9470 object_class_property_add_str(oc, "vendor",
9471 x86_cpuid_get_vendor,
9472 x86_cpuid_set_vendor);
9473 object_class_property_add_str(oc, "model-id",
9474 x86_cpuid_get_model_id,
9475 x86_cpuid_set_model_id);
9476 object_class_property_add(oc, "tsc-frequency", "int",
9477 x86_cpuid_get_tsc_freq,
9478 x86_cpuid_set_tsc_freq, NULL, NULL);
9479 /*
9480 * The "unavailable-features" property has the same semantics as
9481 * CpuDefinitionInfo.unavailable-features on the "query-cpu-definitions"
9482 * QMP command: they list the features that would have prevented the
9483 * CPU from running if the "enforce" flag was set.
9484 */
9485 object_class_property_add(oc, "unavailable-features", "strList",
9486 x86_cpu_get_unavailable_features,
9487 NULL, NULL, NULL);
9488
9489 #if !defined(CONFIG_USER_ONLY)
9490 object_class_property_add(oc, "crash-information", "GuestPanicInformation",
9491 x86_cpu_get_crash_info_qom, NULL, NULL, NULL);
9492 #endif
9493
9494 for (w = 0; w < FEATURE_WORDS; w++) {
9495 int bitnr;
9496 for (bitnr = 0; bitnr < 64; bitnr++) {
9497 x86_cpu_register_feature_bit_props(xcc, w, bitnr);
9498 }
9499 }
9500 }
9501
9502 static const TypeInfo x86_cpu_type_info = {
9503 .name = TYPE_X86_CPU,
9504 .parent = TYPE_CPU,
9505 .instance_size = sizeof(X86CPU),
9506 .instance_align = __alignof(X86CPU),
9507 .instance_init = x86_cpu_initfn,
9508 .instance_post_init = x86_cpu_post_initfn,
9509
9510 .abstract = true,
9511 .class_size = sizeof(X86CPUClass),
9512 .class_init = x86_cpu_common_class_init,
9513 };
9514
9515 /* "base" CPU model, used by query-cpu-model-expansion */
x86_cpu_base_class_init(ObjectClass * oc,const void * data)9516 static void x86_cpu_base_class_init(ObjectClass *oc, const void *data)
9517 {
9518 X86CPUClass *xcc = X86_CPU_CLASS(oc);
9519
9520 xcc->static_model = true;
9521 xcc->migration_safe = true;
9522 xcc->model_description = "base CPU model type with no features enabled";
9523 xcc->ordering = 8;
9524 }
9525
9526 static const TypeInfo x86_base_cpu_type_info = {
9527 .name = X86_CPU_TYPE_NAME("base"),
9528 .parent = TYPE_X86_CPU,
9529 .class_init = x86_cpu_base_class_init,
9530 };
9531
x86_cpu_register_types(void)9532 static void x86_cpu_register_types(void)
9533 {
9534 int i;
9535
9536 type_register_static(&x86_cpu_type_info);
9537 for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) {
9538 x86_register_cpudef_types(&builtin_x86_defs[i]);
9539 }
9540 type_register_static(&max_x86_cpu_type_info);
9541 type_register_static(&x86_base_cpu_type_info);
9542 }
9543
9544 type_init(x86_cpu_register_types)
9545