2 * i386 CPUID helper functions
4 * Copyright (c) 2003 Fabrice Bellard
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.
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.
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/>.
20 #include "qemu/osdep.h"
21 #include "qemu/units.h"
22 #include "qemu/cutils.h"
23 #include "qemu/bitops.h"
24 #include "qemu/qemu-print.h"
26 #include "tcg/helper-tcg.h"
27 #include "exec/exec-all.h"
28 #include "sysemu/kvm.h"
29 #include "sysemu/reset.h"
30 #include "sysemu/hvf.h"
31 #include "hw/core/accel-cpu.h"
32 #include "sysemu/xen.h"
33 #include "sysemu/whpx.h"
34 #include "kvm/kvm_i386.h"
36 #include "qemu/module.h"
37 #include "qapi/qapi-visit-machine.h"
38 #include "qapi/qapi-visit-run-state.h"
39 #include "qapi/qmp/qdict.h"
40 #include "qapi/qmp/qerror.h"
41 #include "qom/qom-qobject.h"
42 #include "qapi/qapi-commands-machine-target.h"
43 #include "standard-headers/asm-x86/kvm_para.h"
44 #include "hw/qdev-properties.h"
45 #include "hw/i386/topology.h"
46 #ifndef CONFIG_USER_ONLY
47 #include "exec/address-spaces.h"
48 #include "hw/i386/apic_internal.h"
49 #include "hw/boards.h"
52 #include "disas/capstone.h"
54 /* Helpers for building CPUID[2] descriptors: */
56 struct CPUID2CacheDescriptorInfo {
65 * Known CPUID 2 cache descriptors.
66 * From Intel SDM Volume 2A, CPUID instruction
68 struct CPUID2CacheDescriptorInfo cpuid2_cache_descriptors[] = {
69 [0x06] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 8 * KiB,
70 .associativity = 4, .line_size = 32, },
71 [0x08] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 16 * KiB,
72 .associativity = 4, .line_size = 32, },
73 [0x09] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 32 * KiB,
74 .associativity = 4, .line_size = 64, },
75 [0x0A] = { .level = 1, .type = DATA_CACHE, .size = 8 * KiB,
76 .associativity = 2, .line_size = 32, },
77 [0x0C] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
78 .associativity = 4, .line_size = 32, },
79 [0x0D] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
80 .associativity = 4, .line_size = 64, },
81 [0x0E] = { .level = 1, .type = DATA_CACHE, .size = 24 * KiB,
82 .associativity = 6, .line_size = 64, },
83 [0x1D] = { .level = 2, .type = UNIFIED_CACHE, .size = 128 * KiB,
84 .associativity = 2, .line_size = 64, },
85 [0x21] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
86 .associativity = 8, .line_size = 64, },
87 /* lines per sector is not supported cpuid2_cache_descriptor(),
88 * so descriptors 0x22, 0x23 are not included
90 [0x24] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
91 .associativity = 16, .line_size = 64, },
92 /* lines per sector is not supported cpuid2_cache_descriptor(),
93 * so descriptors 0x25, 0x20 are not included
95 [0x2C] = { .level = 1, .type = DATA_CACHE, .size = 32 * KiB,
96 .associativity = 8, .line_size = 64, },
97 [0x30] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 32 * KiB,
98 .associativity = 8, .line_size = 64, },
99 [0x41] = { .level = 2, .type = UNIFIED_CACHE, .size = 128 * KiB,
100 .associativity = 4, .line_size = 32, },
101 [0x42] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
102 .associativity = 4, .line_size = 32, },
103 [0x43] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
104 .associativity = 4, .line_size = 32, },
105 [0x44] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
106 .associativity = 4, .line_size = 32, },
107 [0x45] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
108 .associativity = 4, .line_size = 32, },
109 [0x46] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
110 .associativity = 4, .line_size = 64, },
111 [0x47] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
112 .associativity = 8, .line_size = 64, },
113 [0x48] = { .level = 2, .type = UNIFIED_CACHE, .size = 3 * MiB,
114 .associativity = 12, .line_size = 64, },
115 /* Descriptor 0x49 depends on CPU family/model, so it is not included */
116 [0x4A] = { .level = 3, .type = UNIFIED_CACHE, .size = 6 * MiB,
117 .associativity = 12, .line_size = 64, },
118 [0x4B] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
119 .associativity = 16, .line_size = 64, },
120 [0x4C] = { .level = 3, .type = UNIFIED_CACHE, .size = 12 * MiB,
121 .associativity = 12, .line_size = 64, },
122 [0x4D] = { .level = 3, .type = UNIFIED_CACHE, .size = 16 * MiB,
123 .associativity = 16, .line_size = 64, },
124 [0x4E] = { .level = 2, .type = UNIFIED_CACHE, .size = 6 * MiB,
125 .associativity = 24, .line_size = 64, },
126 [0x60] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
127 .associativity = 8, .line_size = 64, },
128 [0x66] = { .level = 1, .type = DATA_CACHE, .size = 8 * KiB,
129 .associativity = 4, .line_size = 64, },
130 [0x67] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
131 .associativity = 4, .line_size = 64, },
132 [0x68] = { .level = 1, .type = DATA_CACHE, .size = 32 * KiB,
133 .associativity = 4, .line_size = 64, },
134 [0x78] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
135 .associativity = 4, .line_size = 64, },
136 /* lines per sector is not supported cpuid2_cache_descriptor(),
137 * so descriptors 0x79, 0x7A, 0x7B, 0x7C are not included.
139 [0x7D] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
140 .associativity = 8, .line_size = 64, },
141 [0x7F] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
142 .associativity = 2, .line_size = 64, },
143 [0x80] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
144 .associativity = 8, .line_size = 64, },
145 [0x82] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
146 .associativity = 8, .line_size = 32, },
147 [0x83] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
148 .associativity = 8, .line_size = 32, },
149 [0x84] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
150 .associativity = 8, .line_size = 32, },
151 [0x85] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
152 .associativity = 8, .line_size = 32, },
153 [0x86] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
154 .associativity = 4, .line_size = 64, },
155 [0x87] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
156 .associativity = 8, .line_size = 64, },
157 [0xD0] = { .level = 3, .type = UNIFIED_CACHE, .size = 512 * KiB,
158 .associativity = 4, .line_size = 64, },
159 [0xD1] = { .level = 3, .type = UNIFIED_CACHE, .size = 1 * MiB,
160 .associativity = 4, .line_size = 64, },
161 [0xD2] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
162 .associativity = 4, .line_size = 64, },
163 [0xD6] = { .level = 3, .type = UNIFIED_CACHE, .size = 1 * MiB,
164 .associativity = 8, .line_size = 64, },
165 [0xD7] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
166 .associativity = 8, .line_size = 64, },
167 [0xD8] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
168 .associativity = 8, .line_size = 64, },
169 [0xDC] = { .level = 3, .type = UNIFIED_CACHE, .size = 1.5 * MiB,
170 .associativity = 12, .line_size = 64, },
171 [0xDD] = { .level = 3, .type = UNIFIED_CACHE, .size = 3 * MiB,
172 .associativity = 12, .line_size = 64, },
173 [0xDE] = { .level = 3, .type = UNIFIED_CACHE, .size = 6 * MiB,
174 .associativity = 12, .line_size = 64, },
175 [0xE2] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
176 .associativity = 16, .line_size = 64, },
177 [0xE3] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
178 .associativity = 16, .line_size = 64, },
179 [0xE4] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
180 .associativity = 16, .line_size = 64, },
181 [0xEA] = { .level = 3, .type = UNIFIED_CACHE, .size = 12 * MiB,
182 .associativity = 24, .line_size = 64, },
183 [0xEB] = { .level = 3, .type = UNIFIED_CACHE, .size = 18 * MiB,
184 .associativity = 24, .line_size = 64, },
185 [0xEC] = { .level = 3, .type = UNIFIED_CACHE, .size = 24 * MiB,
186 .associativity = 24, .line_size = 64, },
190 * "CPUID leaf 2 does not report cache descriptor information,
191 * use CPUID leaf 4 to query cache parameters"
193 #define CACHE_DESCRIPTOR_UNAVAILABLE 0xFF
196 * Return a CPUID 2 cache descriptor for a given cache.
197 * If no known descriptor is found, return CACHE_DESCRIPTOR_UNAVAILABLE
199 static uint8_t cpuid2_cache_descriptor(CPUCacheInfo *cache)
203 assert(cache->size > 0);
204 assert(cache->level > 0);
205 assert(cache->line_size > 0);
206 assert(cache->associativity > 0);
207 for (i = 0; i < ARRAY_SIZE(cpuid2_cache_descriptors); i++) {
208 struct CPUID2CacheDescriptorInfo *d = &cpuid2_cache_descriptors[i];
209 if (d->level == cache->level && d->type == cache->type &&
210 d->size == cache->size && d->line_size == cache->line_size &&
211 d->associativity == cache->associativity) {
216 return CACHE_DESCRIPTOR_UNAVAILABLE;
219 /* CPUID Leaf 4 constants: */
222 #define CACHE_TYPE_D 1
223 #define CACHE_TYPE_I 2
224 #define CACHE_TYPE_UNIFIED 3
226 #define CACHE_LEVEL(l) (l << 5)
228 #define CACHE_SELF_INIT_LEVEL (1 << 8)
231 #define CACHE_NO_INVD_SHARING (1 << 0)
232 #define CACHE_INCLUSIVE (1 << 1)
233 #define CACHE_COMPLEX_IDX (1 << 2)
235 /* Encode CacheType for CPUID[4].EAX */
236 #define CACHE_TYPE(t) (((t) == DATA_CACHE) ? CACHE_TYPE_D : \
237 ((t) == INSTRUCTION_CACHE) ? CACHE_TYPE_I : \
238 ((t) == UNIFIED_CACHE) ? CACHE_TYPE_UNIFIED : \
239 0 /* Invalid value */)
242 /* Encode cache info for CPUID[4] */
243 static void encode_cache_cpuid4(CPUCacheInfo *cache,
244 int num_apic_ids, int num_cores,
245 uint32_t *eax, uint32_t *ebx,
246 uint32_t *ecx, uint32_t *edx)
248 assert(cache->size == cache->line_size * cache->associativity *
249 cache->partitions * cache->sets);
251 assert(num_apic_ids > 0);
252 *eax = CACHE_TYPE(cache->type) |
253 CACHE_LEVEL(cache->level) |
254 (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0) |
255 ((num_cores - 1) << 26) |
256 ((num_apic_ids - 1) << 14);
258 assert(cache->line_size > 0);
259 assert(cache->partitions > 0);
260 assert(cache->associativity > 0);
261 /* We don't implement fully-associative caches */
262 assert(cache->associativity < cache->sets);
263 *ebx = (cache->line_size - 1) |
264 ((cache->partitions - 1) << 12) |
265 ((cache->associativity - 1) << 22);
267 assert(cache->sets > 0);
268 *ecx = cache->sets - 1;
270 *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
271 (cache->inclusive ? CACHE_INCLUSIVE : 0) |
272 (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
275 /* Encode cache info for CPUID[0x80000005].ECX or CPUID[0x80000005].EDX */
276 static uint32_t encode_cache_cpuid80000005(CPUCacheInfo *cache)
278 assert(cache->size % 1024 == 0);
279 assert(cache->lines_per_tag > 0);
280 assert(cache->associativity > 0);
281 assert(cache->line_size > 0);
282 return ((cache->size / 1024) << 24) | (cache->associativity << 16) |
283 (cache->lines_per_tag << 8) | (cache->line_size);
286 #define ASSOC_FULL 0xFF
288 /* AMD associativity encoding used on CPUID Leaf 0x80000006: */
289 #define AMD_ENC_ASSOC(a) (a <= 1 ? a : \
299 a == ASSOC_FULL ? 0xF : \
300 0 /* invalid value */)
303 * Encode cache info for CPUID[0x80000006].ECX and CPUID[0x80000006].EDX
306 static void encode_cache_cpuid80000006(CPUCacheInfo *l2,
308 uint32_t *ecx, uint32_t *edx)
310 assert(l2->size % 1024 == 0);
311 assert(l2->associativity > 0);
312 assert(l2->lines_per_tag > 0);
313 assert(l2->line_size > 0);
314 *ecx = ((l2->size / 1024) << 16) |
315 (AMD_ENC_ASSOC(l2->associativity) << 12) |
316 (l2->lines_per_tag << 8) | (l2->line_size);
319 assert(l3->size % (512 * 1024) == 0);
320 assert(l3->associativity > 0);
321 assert(l3->lines_per_tag > 0);
322 assert(l3->line_size > 0);
323 *edx = ((l3->size / (512 * 1024)) << 18) |
324 (AMD_ENC_ASSOC(l3->associativity) << 12) |
325 (l3->lines_per_tag << 8) | (l3->line_size);
331 /* Encode cache info for CPUID[8000001D] */
332 static void encode_cache_cpuid8000001d(CPUCacheInfo *cache,
333 X86CPUTopoInfo *topo_info,
334 uint32_t *eax, uint32_t *ebx,
335 uint32_t *ecx, uint32_t *edx)
338 assert(cache->size == cache->line_size * cache->associativity *
339 cache->partitions * cache->sets);
341 *eax = CACHE_TYPE(cache->type) | CACHE_LEVEL(cache->level) |
342 (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0);
344 /* L3 is shared among multiple cores */
345 if (cache->level == 3) {
346 l3_threads = topo_info->cores_per_die * topo_info->threads_per_core;
347 *eax |= (l3_threads - 1) << 14;
349 *eax |= ((topo_info->threads_per_core - 1) << 14);
352 assert(cache->line_size > 0);
353 assert(cache->partitions > 0);
354 assert(cache->associativity > 0);
355 /* We don't implement fully-associative caches */
356 assert(cache->associativity < cache->sets);
357 *ebx = (cache->line_size - 1) |
358 ((cache->partitions - 1) << 12) |
359 ((cache->associativity - 1) << 22);
361 assert(cache->sets > 0);
362 *ecx = cache->sets - 1;
364 *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
365 (cache->inclusive ? CACHE_INCLUSIVE : 0) |
366 (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
369 /* Encode cache info for CPUID[8000001E] */
370 static void encode_topo_cpuid8000001e(X86CPU *cpu, X86CPUTopoInfo *topo_info,
371 uint32_t *eax, uint32_t *ebx,
372 uint32_t *ecx, uint32_t *edx)
374 X86CPUTopoIDs topo_ids;
376 x86_topo_ids_from_apicid(cpu->apic_id, topo_info, &topo_ids);
381 * CPUID_Fn8000001E_EBX [Core Identifiers] (CoreId)
382 * Read-only. Reset: 0000_XXXXh.
383 * See Core::X86::Cpuid::ExtApicId.
384 * Core::X86::Cpuid::CoreId_lthree[1:0]_core[3:0]_thread[1:0];
387 * 15:8 ThreadsPerCore: threads per core. Read-only. Reset: XXh.
388 * The number of threads per core is ThreadsPerCore+1.
389 * 7:0 CoreId: core ID. Read-only. Reset: XXh.
391 * NOTE: CoreId is already part of apic_id. Just use it. We can
392 * use all the 8 bits to represent the core_id here.
394 *ebx = ((topo_info->threads_per_core - 1) << 8) | (topo_ids.core_id & 0xFF);
397 * CPUID_Fn8000001E_ECX [Node Identifiers] (NodeId)
398 * Read-only. Reset: 0000_0XXXh.
399 * Core::X86::Cpuid::NodeId_lthree[1:0]_core[3:0]_thread[1:0];
402 * 10:8 NodesPerProcessor: Node per processor. Read-only. Reset: XXXb.
405 * 000b 1 node per processor.
406 * 001b 2 nodes per processor.
408 * 011b 4 nodes per processor.
409 * 111b-100b Reserved.
410 * 7:0 NodeId: Node ID. Read-only. Reset: XXh.
412 * NOTE: Hardware reserves 3 bits for number of nodes per processor.
413 * But users can create more nodes than the actual hardware can
414 * support. To genaralize we can use all the upper 8 bits for nodes.
415 * NodeId is combination of node and socket_id which is already decoded
416 * in apic_id. Just use it by shifting.
418 *ecx = ((topo_info->dies_per_pkg - 1) << 8) |
419 ((cpu->apic_id >> apicid_die_offset(topo_info)) & 0xFF);
425 * Definitions of the hardcoded cache entries we expose:
426 * These are legacy cache values. If there is a need to change any
427 * of these values please use builtin_x86_defs
431 static CPUCacheInfo legacy_l1d_cache = {
440 .no_invd_sharing = true,
443 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
444 static CPUCacheInfo legacy_l1d_cache_amd = {
454 .no_invd_sharing = true,
457 /* L1 instruction cache: */
458 static CPUCacheInfo legacy_l1i_cache = {
459 .type = INSTRUCTION_CACHE,
467 .no_invd_sharing = true,
470 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
471 static CPUCacheInfo legacy_l1i_cache_amd = {
472 .type = INSTRUCTION_CACHE,
481 .no_invd_sharing = true,
484 /* Level 2 unified cache: */
485 static CPUCacheInfo legacy_l2_cache = {
486 .type = UNIFIED_CACHE,
494 .no_invd_sharing = true,
497 /*FIXME: CPUID leaf 2 descriptor is inconsistent with CPUID leaf 4 */
498 static CPUCacheInfo legacy_l2_cache_cpuid2 = {
499 .type = UNIFIED_CACHE,
507 /*FIXME: CPUID leaf 0x80000006 is inconsistent with leaves 2 & 4 */
508 static CPUCacheInfo legacy_l2_cache_amd = {
509 .type = UNIFIED_CACHE,
519 /* Level 3 unified cache: */
520 static CPUCacheInfo legacy_l3_cache = {
521 .type = UNIFIED_CACHE,
531 .complex_indexing = true,
534 /* TLB definitions: */
536 #define L1_DTLB_2M_ASSOC 1
537 #define L1_DTLB_2M_ENTRIES 255
538 #define L1_DTLB_4K_ASSOC 1
539 #define L1_DTLB_4K_ENTRIES 255
541 #define L1_ITLB_2M_ASSOC 1
542 #define L1_ITLB_2M_ENTRIES 255
543 #define L1_ITLB_4K_ASSOC 1
544 #define L1_ITLB_4K_ENTRIES 255
546 #define L2_DTLB_2M_ASSOC 0 /* disabled */
547 #define L2_DTLB_2M_ENTRIES 0 /* disabled */
548 #define L2_DTLB_4K_ASSOC 4
549 #define L2_DTLB_4K_ENTRIES 512
551 #define L2_ITLB_2M_ASSOC 0 /* disabled */
552 #define L2_ITLB_2M_ENTRIES 0 /* disabled */
553 #define L2_ITLB_4K_ASSOC 4
554 #define L2_ITLB_4K_ENTRIES 512
556 /* CPUID Leaf 0x14 constants: */
557 #define INTEL_PT_MAX_SUBLEAF 0x1
559 * bit[00]: IA32_RTIT_CTL.CR3 filter can be set to 1 and IA32_RTIT_CR3_MATCH
560 * MSR can be accessed;
561 * bit[01]: Support Configurable PSB and Cycle-Accurate Mode;
562 * bit[02]: Support IP Filtering, TraceStop filtering, and preservation
563 * of Intel PT MSRs across warm reset;
564 * bit[03]: Support MTC timing packet and suppression of COFI-based packets;
566 #define INTEL_PT_MINIMAL_EBX 0xf
568 * bit[00]: Tracing can be enabled with IA32_RTIT_CTL.ToPA = 1 and
569 * IA32_RTIT_OUTPUT_BASE and IA32_RTIT_OUTPUT_MASK_PTRS MSRs can be
571 * bit[01]: ToPA tables can hold any number of output entries, up to the
572 * maximum allowed by the MaskOrTableOffset field of
573 * IA32_RTIT_OUTPUT_MASK_PTRS;
574 * bit[02]: Support Single-Range Output scheme;
576 #define INTEL_PT_MINIMAL_ECX 0x7
577 /* generated packets which contain IP payloads have LIP values */
578 #define INTEL_PT_IP_LIP (1 << 31)
579 #define INTEL_PT_ADDR_RANGES_NUM 0x2 /* Number of configurable address ranges */
580 #define INTEL_PT_ADDR_RANGES_NUM_MASK 0x3
581 #define INTEL_PT_MTC_BITMAP (0x0249 << 16) /* Support ART(0,3,6,9) */
582 #define INTEL_PT_CYCLE_BITMAP 0x1fff /* Support 0,2^(0~11) */
583 #define INTEL_PT_PSB_BITMAP (0x003f << 16) /* Support 2K,4K,8K,16K,32K,64K */
585 void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1,
586 uint32_t vendor2, uint32_t vendor3)
589 for (i = 0; i < 4; i++) {
590 dst[i] = vendor1 >> (8 * i);
591 dst[i + 4] = vendor2 >> (8 * i);
592 dst[i + 8] = vendor3 >> (8 * i);
594 dst[CPUID_VENDOR_SZ] = '\0';
597 #define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
598 #define PENTIUM_FEATURES (I486_FEATURES | CPUID_DE | CPUID_TSC | \
599 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_MMX | CPUID_APIC)
600 #define PENTIUM2_FEATURES (PENTIUM_FEATURES | CPUID_PAE | CPUID_SEP | \
601 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
602 CPUID_PSE36 | CPUID_FXSR)
603 #define PENTIUM3_FEATURES (PENTIUM2_FEATURES | CPUID_SSE)
604 #define PPRO_FEATURES (CPUID_FP87 | CPUID_DE | CPUID_PSE | CPUID_TSC | \
605 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_PGE | CPUID_CMOV | \
606 CPUID_PAT | CPUID_FXSR | CPUID_MMX | CPUID_SSE | CPUID_SSE2 | \
607 CPUID_PAE | CPUID_SEP | CPUID_APIC)
609 #define TCG_FEATURES (CPUID_FP87 | CPUID_PSE | CPUID_TSC | CPUID_MSR | \
610 CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | CPUID_SEP | \
611 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
612 CPUID_PSE36 | CPUID_CLFLUSH | CPUID_ACPI | CPUID_MMX | \
613 CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS | CPUID_DE)
614 /* partly implemented:
615 CPUID_MTRR, CPUID_MCA, CPUID_CLFLUSH (needed for Win64) */
617 CPUID_VME, CPUID_DTS, CPUID_SS, CPUID_HT, CPUID_TM, CPUID_PBE */
618 #define TCG_EXT_FEATURES (CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | \
619 CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | \
620 CPUID_EXT_SSE41 | CPUID_EXT_SSE42 | CPUID_EXT_POPCNT | \
621 CPUID_EXT_XSAVE | /* CPUID_EXT_OSXSAVE is dynamic */ \
622 CPUID_EXT_MOVBE | CPUID_EXT_AES | CPUID_EXT_HYPERVISOR | \
625 CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_SMX,
626 CPUID_EXT_EST, CPUID_EXT_TM2, CPUID_EXT_CID, CPUID_EXT_FMA,
627 CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_PCID, CPUID_EXT_DCA,
628 CPUID_EXT_X2APIC, CPUID_EXT_TSC_DEADLINE_TIMER, CPUID_EXT_AVX,
632 #define TCG_EXT2_X86_64_FEATURES (CPUID_EXT2_SYSCALL | CPUID_EXT2_LM)
634 #define TCG_EXT2_X86_64_FEATURES 0
637 #define TCG_EXT2_FEATURES ((TCG_FEATURES & CPUID_EXT2_AMD_ALIASES) | \
638 CPUID_EXT2_NX | CPUID_EXT2_MMXEXT | CPUID_EXT2_RDTSCP | \
639 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_PDPE1GB | \
640 TCG_EXT2_X86_64_FEATURES)
641 #define TCG_EXT3_FEATURES (CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | \
642 CPUID_EXT3_CR8LEG | CPUID_EXT3_ABM | CPUID_EXT3_SSE4A)
643 #define TCG_EXT4_FEATURES 0
644 #define TCG_SVM_FEATURES CPUID_SVM_NPT
645 #define TCG_KVM_FEATURES 0
646 #define TCG_7_0_EBX_FEATURES (CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_SMAP | \
647 CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX | \
648 CPUID_7_0_EBX_PCOMMIT | CPUID_7_0_EBX_CLFLUSHOPT | \
649 CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_FSGSBASE | \
652 CPUID_7_0_EBX_HLE, CPUID_7_0_EBX_AVX2,
653 CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM,
654 CPUID_7_0_EBX_RDSEED */
655 #define TCG_7_0_ECX_FEATURES (CPUID_7_0_ECX_PKU | \
656 /* CPUID_7_0_ECX_OSPKE is dynamic */ \
657 CPUID_7_0_ECX_LA57 | CPUID_7_0_ECX_PKS)
658 #define TCG_7_0_EDX_FEATURES 0
659 #define TCG_7_1_EAX_FEATURES 0
660 #define TCG_APM_FEATURES 0
661 #define TCG_6_EAX_FEATURES CPUID_6_EAX_ARAT
662 #define TCG_XSAVE_FEATURES (CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XGETBV1)
664 CPUID_XSAVE_XSAVEC, CPUID_XSAVE_XSAVES */
665 #define TCG_14_0_ECX_FEATURES 0
667 typedef enum FeatureWordType {
672 typedef struct FeatureWordInfo {
673 FeatureWordType type;
674 /* feature flags names are taken from "Intel Processor Identification and
675 * the CPUID Instruction" and AMD's "CPUID Specification".
676 * In cases of disagreement between feature naming conventions,
677 * aliases may be added.
679 const char *feat_names[64];
681 /* If type==CPUID_FEATURE_WORD */
683 uint32_t eax; /* Input EAX for CPUID */
684 bool needs_ecx; /* CPUID instruction uses ECX as input */
685 uint32_t ecx; /* Input ECX value for CPUID */
686 int reg; /* output register (R_* constant) */
688 /* If type==MSR_FEATURE_WORD */
693 uint64_t tcg_features; /* Feature flags supported by TCG */
694 uint64_t unmigratable_flags; /* Feature flags known to be unmigratable */
695 uint64_t migratable_flags; /* Feature flags known to be migratable */
696 /* Features that shouldn't be auto-enabled by "-cpu host" */
697 uint64_t no_autoenable_flags;
700 static FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
702 .type = CPUID_FEATURE_WORD,
704 "fpu", "vme", "de", "pse",
705 "tsc", "msr", "pae", "mce",
706 "cx8", "apic", NULL, "sep",
707 "mtrr", "pge", "mca", "cmov",
708 "pat", "pse36", "pn" /* Intel psn */, "clflush" /* Intel clfsh */,
709 NULL, "ds" /* Intel dts */, "acpi", "mmx",
710 "fxsr", "sse", "sse2", "ss",
711 "ht" /* Intel htt */, "tm", "ia64", "pbe",
713 .cpuid = {.eax = 1, .reg = R_EDX, },
714 .tcg_features = TCG_FEATURES,
717 .type = CPUID_FEATURE_WORD,
719 "pni" /* Intel,AMD sse3 */, "pclmulqdq", "dtes64", "monitor",
720 "ds-cpl", "vmx", "smx", "est",
721 "tm2", "ssse3", "cid", NULL,
722 "fma", "cx16", "xtpr", "pdcm",
723 NULL, "pcid", "dca", "sse4.1",
724 "sse4.2", "x2apic", "movbe", "popcnt",
725 "tsc-deadline", "aes", "xsave", NULL /* osxsave */,
726 "avx", "f16c", "rdrand", "hypervisor",
728 .cpuid = { .eax = 1, .reg = R_ECX, },
729 .tcg_features = TCG_EXT_FEATURES,
731 /* Feature names that are already defined on feature_name[] but
732 * are set on CPUID[8000_0001].EDX on AMD CPUs don't have their
733 * names on feat_names below. They are copied automatically
734 * to features[FEAT_8000_0001_EDX] if and only if CPU vendor is AMD.
736 [FEAT_8000_0001_EDX] = {
737 .type = CPUID_FEATURE_WORD,
739 NULL /* fpu */, NULL /* vme */, NULL /* de */, NULL /* pse */,
740 NULL /* tsc */, NULL /* msr */, NULL /* pae */, NULL /* mce */,
741 NULL /* cx8 */, NULL /* apic */, NULL, "syscall",
742 NULL /* mtrr */, NULL /* pge */, NULL /* mca */, NULL /* cmov */,
743 NULL /* pat */, NULL /* pse36 */, NULL, NULL /* Linux mp */,
744 "nx", NULL, "mmxext", NULL /* mmx */,
745 NULL /* fxsr */, "fxsr-opt", "pdpe1gb", "rdtscp",
746 NULL, "lm", "3dnowext", "3dnow",
748 .cpuid = { .eax = 0x80000001, .reg = R_EDX, },
749 .tcg_features = TCG_EXT2_FEATURES,
751 [FEAT_8000_0001_ECX] = {
752 .type = CPUID_FEATURE_WORD,
754 "lahf-lm", "cmp-legacy", "svm", "extapic",
755 "cr8legacy", "abm", "sse4a", "misalignsse",
756 "3dnowprefetch", "osvw", "ibs", "xop",
757 "skinit", "wdt", NULL, "lwp",
758 "fma4", "tce", NULL, "nodeid-msr",
759 NULL, "tbm", "topoext", "perfctr-core",
760 "perfctr-nb", NULL, NULL, NULL,
761 NULL, NULL, NULL, NULL,
763 .cpuid = { .eax = 0x80000001, .reg = R_ECX, },
764 .tcg_features = TCG_EXT3_FEATURES,
766 * TOPOEXT is always allowed but can't be enabled blindly by
767 * "-cpu host", as it requires consistent cache topology info
768 * to be provided so it doesn't confuse guests.
770 .no_autoenable_flags = CPUID_EXT3_TOPOEXT,
772 [FEAT_C000_0001_EDX] = {
773 .type = CPUID_FEATURE_WORD,
775 NULL, NULL, "xstore", "xstore-en",
776 NULL, NULL, "xcrypt", "xcrypt-en",
777 "ace2", "ace2-en", "phe", "phe-en",
778 "pmm", "pmm-en", NULL, NULL,
779 NULL, NULL, NULL, NULL,
780 NULL, NULL, NULL, NULL,
781 NULL, NULL, NULL, NULL,
782 NULL, NULL, NULL, NULL,
784 .cpuid = { .eax = 0xC0000001, .reg = R_EDX, },
785 .tcg_features = TCG_EXT4_FEATURES,
788 .type = CPUID_FEATURE_WORD,
790 "kvmclock", "kvm-nopiodelay", "kvm-mmu", "kvmclock",
791 "kvm-asyncpf", "kvm-steal-time", "kvm-pv-eoi", "kvm-pv-unhalt",
792 NULL, "kvm-pv-tlb-flush", NULL, "kvm-pv-ipi",
793 "kvm-poll-control", "kvm-pv-sched-yield", "kvm-asyncpf-int", "kvm-msi-ext-dest-id",
794 NULL, NULL, NULL, NULL,
795 NULL, NULL, NULL, NULL,
796 "kvmclock-stable-bit", NULL, NULL, NULL,
797 NULL, NULL, NULL, NULL,
799 .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EAX, },
800 .tcg_features = TCG_KVM_FEATURES,
803 .type = CPUID_FEATURE_WORD,
805 "kvm-hint-dedicated", NULL, NULL, NULL,
806 NULL, NULL, NULL, NULL,
807 NULL, NULL, NULL, NULL,
808 NULL, NULL, NULL, NULL,
809 NULL, NULL, NULL, NULL,
810 NULL, NULL, NULL, NULL,
811 NULL, NULL, NULL, NULL,
812 NULL, NULL, NULL, NULL,
814 .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EDX, },
815 .tcg_features = TCG_KVM_FEATURES,
817 * KVM hints aren't auto-enabled by -cpu host, they need to be
818 * explicitly enabled in the command-line.
820 .no_autoenable_flags = ~0U,
823 * .feat_names are commented out for Hyper-V enlightenments because we
824 * don't want to have two different ways for enabling them on QEMU command
825 * line. Some features (e.g. "hyperv_time", "hyperv_vapic", ...) require
826 * enabling several feature bits simultaneously, exposing these bits
827 * individually may just confuse guests.
829 [FEAT_HYPERV_EAX] = {
830 .type = CPUID_FEATURE_WORD,
832 NULL /* hv_msr_vp_runtime_access */, NULL /* hv_msr_time_refcount_access */,
833 NULL /* hv_msr_synic_access */, NULL /* hv_msr_stimer_access */,
834 NULL /* hv_msr_apic_access */, NULL /* hv_msr_hypercall_access */,
835 NULL /* hv_vpindex_access */, NULL /* hv_msr_reset_access */,
836 NULL /* hv_msr_stats_access */, NULL /* hv_reftsc_access */,
837 NULL /* hv_msr_idle_access */, NULL /* hv_msr_frequency_access */,
838 NULL /* hv_msr_debug_access */, NULL /* hv_msr_reenlightenment_access */,
840 NULL, NULL, NULL, NULL,
841 NULL, NULL, NULL, NULL,
842 NULL, NULL, NULL, NULL,
843 NULL, NULL, NULL, NULL,
845 .cpuid = { .eax = 0x40000003, .reg = R_EAX, },
847 [FEAT_HYPERV_EBX] = {
848 .type = CPUID_FEATURE_WORD,
850 NULL /* hv_create_partitions */, NULL /* hv_access_partition_id */,
851 NULL /* hv_access_memory_pool */, NULL /* hv_adjust_message_buffers */,
852 NULL /* hv_post_messages */, NULL /* hv_signal_events */,
853 NULL /* hv_create_port */, NULL /* hv_connect_port */,
854 NULL /* hv_access_stats */, NULL, NULL, NULL /* hv_debugging */,
855 NULL /* hv_cpu_power_management */, NULL /* hv_configure_profiler */,
857 NULL, NULL, NULL, NULL,
858 NULL, NULL, NULL, NULL,
859 NULL, NULL, NULL, NULL,
860 NULL, NULL, NULL, NULL,
862 .cpuid = { .eax = 0x40000003, .reg = R_EBX, },
864 [FEAT_HYPERV_EDX] = {
865 .type = CPUID_FEATURE_WORD,
867 NULL /* hv_mwait */, NULL /* hv_guest_debugging */,
868 NULL /* hv_perf_monitor */, NULL /* hv_cpu_dynamic_part */,
869 NULL /* hv_hypercall_params_xmm */, NULL /* hv_guest_idle_state */,
871 NULL, NULL, NULL /* hv_guest_crash_msr */, NULL,
872 NULL, NULL, NULL, NULL,
873 NULL, NULL, NULL, NULL,
874 NULL, NULL, NULL, NULL,
875 NULL, NULL, NULL, NULL,
876 NULL, NULL, NULL, NULL,
878 .cpuid = { .eax = 0x40000003, .reg = R_EDX, },
880 [FEAT_HV_RECOMM_EAX] = {
881 .type = CPUID_FEATURE_WORD,
883 NULL /* hv_recommend_pv_as_switch */,
884 NULL /* hv_recommend_pv_tlbflush_local */,
885 NULL /* hv_recommend_pv_tlbflush_remote */,
886 NULL /* hv_recommend_msr_apic_access */,
887 NULL /* hv_recommend_msr_reset */,
888 NULL /* hv_recommend_relaxed_timing */,
889 NULL /* hv_recommend_dma_remapping */,
890 NULL /* hv_recommend_int_remapping */,
891 NULL /* hv_recommend_x2apic_msrs */,
892 NULL /* hv_recommend_autoeoi_deprecation */,
893 NULL /* hv_recommend_pv_ipi */,
894 NULL /* hv_recommend_ex_hypercalls */,
895 NULL /* hv_hypervisor_is_nested */,
896 NULL /* hv_recommend_int_mbec */,
897 NULL /* hv_recommend_evmcs */,
899 NULL, NULL, NULL, NULL,
900 NULL, NULL, NULL, NULL,
901 NULL, NULL, NULL, NULL,
902 NULL, NULL, NULL, NULL,
904 .cpuid = { .eax = 0x40000004, .reg = R_EAX, },
906 [FEAT_HV_NESTED_EAX] = {
907 .type = CPUID_FEATURE_WORD,
908 .cpuid = { .eax = 0x4000000A, .reg = R_EAX, },
911 .type = CPUID_FEATURE_WORD,
913 "npt", "lbrv", "svm-lock", "nrip-save",
914 "tsc-scale", "vmcb-clean", "flushbyasid", "decodeassists",
915 NULL, NULL, "pause-filter", NULL,
916 "pfthreshold", "avic", NULL, "v-vmsave-vmload",
917 "vgif", NULL, NULL, NULL,
918 NULL, NULL, NULL, NULL,
919 NULL, NULL, NULL, NULL,
920 "svme-addr-chk", NULL, NULL, NULL,
922 .cpuid = { .eax = 0x8000000A, .reg = R_EDX, },
923 .tcg_features = TCG_SVM_FEATURES,
926 .type = CPUID_FEATURE_WORD,
928 "fsgsbase", "tsc-adjust", NULL, "bmi1",
929 "hle", "avx2", NULL, "smep",
930 "bmi2", "erms", "invpcid", "rtm",
931 NULL, NULL, "mpx", NULL,
932 "avx512f", "avx512dq", "rdseed", "adx",
933 "smap", "avx512ifma", "pcommit", "clflushopt",
934 "clwb", "intel-pt", "avx512pf", "avx512er",
935 "avx512cd", "sha-ni", "avx512bw", "avx512vl",
939 .needs_ecx = true, .ecx = 0,
942 .tcg_features = TCG_7_0_EBX_FEATURES,
945 .type = CPUID_FEATURE_WORD,
947 NULL, "avx512vbmi", "umip", "pku",
948 NULL /* ospke */, "waitpkg", "avx512vbmi2", NULL,
949 "gfni", "vaes", "vpclmulqdq", "avx512vnni",
950 "avx512bitalg", NULL, "avx512-vpopcntdq", NULL,
951 "la57", NULL, NULL, NULL,
952 NULL, NULL, "rdpid", NULL,
953 "bus-lock-detect", "cldemote", NULL, "movdiri",
954 "movdir64b", NULL, NULL, "pks",
958 .needs_ecx = true, .ecx = 0,
961 .tcg_features = TCG_7_0_ECX_FEATURES,
964 .type = CPUID_FEATURE_WORD,
966 NULL, NULL, "avx512-4vnniw", "avx512-4fmaps",
967 "fsrm", NULL, NULL, NULL,
968 "avx512-vp2intersect", NULL, "md-clear", NULL,
969 NULL, NULL, "serialize", NULL,
970 "tsx-ldtrk", NULL, NULL /* pconfig */, NULL,
971 NULL, NULL, NULL, "avx512-fp16",
972 NULL, NULL, "spec-ctrl", "stibp",
973 NULL, "arch-capabilities", "core-capability", "ssbd",
977 .needs_ecx = true, .ecx = 0,
980 .tcg_features = TCG_7_0_EDX_FEATURES,
983 .type = CPUID_FEATURE_WORD,
985 NULL, NULL, NULL, NULL,
986 NULL, "avx512-bf16", NULL, NULL,
987 NULL, NULL, NULL, NULL,
988 NULL, NULL, NULL, NULL,
989 NULL, NULL, NULL, NULL,
990 NULL, NULL, NULL, NULL,
991 NULL, NULL, NULL, NULL,
992 NULL, NULL, NULL, NULL,
996 .needs_ecx = true, .ecx = 1,
999 .tcg_features = TCG_7_1_EAX_FEATURES,
1001 [FEAT_8000_0007_EDX] = {
1002 .type = CPUID_FEATURE_WORD,
1004 NULL, NULL, NULL, NULL,
1005 NULL, NULL, NULL, NULL,
1006 "invtsc", NULL, NULL, NULL,
1007 NULL, NULL, NULL, NULL,
1008 NULL, NULL, NULL, NULL,
1009 NULL, NULL, NULL, NULL,
1010 NULL, NULL, NULL, NULL,
1011 NULL, NULL, NULL, NULL,
1013 .cpuid = { .eax = 0x80000007, .reg = R_EDX, },
1014 .tcg_features = TCG_APM_FEATURES,
1015 .unmigratable_flags = CPUID_APM_INVTSC,
1017 [FEAT_8000_0008_EBX] = {
1018 .type = CPUID_FEATURE_WORD,
1020 "clzero", NULL, "xsaveerptr", NULL,
1021 NULL, NULL, NULL, NULL,
1022 NULL, "wbnoinvd", NULL, NULL,
1023 "ibpb", NULL, "ibrs", "amd-stibp",
1024 NULL, NULL, NULL, NULL,
1025 NULL, NULL, NULL, NULL,
1026 "amd-ssbd", "virt-ssbd", "amd-no-ssb", NULL,
1027 NULL, NULL, NULL, NULL,
1029 .cpuid = { .eax = 0x80000008, .reg = R_EBX, },
1031 .unmigratable_flags = 0,
1034 .type = CPUID_FEATURE_WORD,
1036 "xsaveopt", "xsavec", "xgetbv1", "xsaves",
1037 NULL, NULL, NULL, NULL,
1038 NULL, NULL, NULL, NULL,
1039 NULL, NULL, NULL, NULL,
1040 NULL, NULL, NULL, NULL,
1041 NULL, NULL, NULL, NULL,
1042 NULL, NULL, NULL, NULL,
1043 NULL, NULL, NULL, NULL,
1047 .needs_ecx = true, .ecx = 1,
1050 .tcg_features = TCG_XSAVE_FEATURES,
1053 .type = CPUID_FEATURE_WORD,
1055 NULL, NULL, "arat", NULL,
1056 NULL, NULL, NULL, NULL,
1057 NULL, NULL, NULL, NULL,
1058 NULL, NULL, NULL, NULL,
1059 NULL, NULL, NULL, NULL,
1060 NULL, NULL, NULL, NULL,
1061 NULL, NULL, NULL, NULL,
1062 NULL, NULL, NULL, NULL,
1064 .cpuid = { .eax = 6, .reg = R_EAX, },
1065 .tcg_features = TCG_6_EAX_FEATURES,
1067 [FEAT_XSAVE_COMP_LO] = {
1068 .type = CPUID_FEATURE_WORD,
1071 .needs_ecx = true, .ecx = 0,
1074 .tcg_features = ~0U,
1075 .migratable_flags = XSTATE_FP_MASK | XSTATE_SSE_MASK |
1076 XSTATE_YMM_MASK | XSTATE_BNDREGS_MASK | XSTATE_BNDCSR_MASK |
1077 XSTATE_OPMASK_MASK | XSTATE_ZMM_Hi256_MASK | XSTATE_Hi16_ZMM_MASK |
1080 [FEAT_XSAVE_COMP_HI] = {
1081 .type = CPUID_FEATURE_WORD,
1084 .needs_ecx = true, .ecx = 0,
1087 .tcg_features = ~0U,
1089 /*Below are MSR exposed features*/
1090 [FEAT_ARCH_CAPABILITIES] = {
1091 .type = MSR_FEATURE_WORD,
1093 "rdctl-no", "ibrs-all", "rsba", "skip-l1dfl-vmentry",
1094 "ssb-no", "mds-no", "pschange-mc-no", "tsx-ctrl",
1095 "taa-no", NULL, NULL, NULL,
1096 NULL, NULL, NULL, NULL,
1097 NULL, NULL, NULL, NULL,
1098 NULL, NULL, NULL, NULL,
1099 NULL, NULL, NULL, NULL,
1100 NULL, NULL, NULL, NULL,
1103 .index = MSR_IA32_ARCH_CAPABILITIES,
1106 [FEAT_CORE_CAPABILITY] = {
1107 .type = MSR_FEATURE_WORD,
1109 NULL, NULL, NULL, NULL,
1110 NULL, "split-lock-detect", NULL, NULL,
1111 NULL, NULL, NULL, NULL,
1112 NULL, NULL, NULL, NULL,
1113 NULL, NULL, NULL, NULL,
1114 NULL, NULL, NULL, NULL,
1115 NULL, NULL, NULL, NULL,
1116 NULL, NULL, NULL, NULL,
1119 .index = MSR_IA32_CORE_CAPABILITY,
1122 [FEAT_PERF_CAPABILITIES] = {
1123 .type = MSR_FEATURE_WORD,
1125 NULL, NULL, NULL, NULL,
1126 NULL, NULL, NULL, NULL,
1127 NULL, NULL, NULL, NULL,
1128 NULL, "full-width-write", NULL, NULL,
1129 NULL, NULL, NULL, NULL,
1130 NULL, NULL, NULL, NULL,
1131 NULL, NULL, NULL, NULL,
1132 NULL, NULL, NULL, NULL,
1135 .index = MSR_IA32_PERF_CAPABILITIES,
1139 [FEAT_VMX_PROCBASED_CTLS] = {
1140 .type = MSR_FEATURE_WORD,
1142 NULL, NULL, "vmx-vintr-pending", "vmx-tsc-offset",
1143 NULL, NULL, NULL, "vmx-hlt-exit",
1144 NULL, "vmx-invlpg-exit", "vmx-mwait-exit", "vmx-rdpmc-exit",
1145 "vmx-rdtsc-exit", NULL, NULL, "vmx-cr3-load-noexit",
1146 "vmx-cr3-store-noexit", NULL, NULL, "vmx-cr8-load-exit",
1147 "vmx-cr8-store-exit", "vmx-flexpriority", "vmx-vnmi-pending", "vmx-movdr-exit",
1148 "vmx-io-exit", "vmx-io-bitmap", NULL, "vmx-mtf",
1149 "vmx-msr-bitmap", "vmx-monitor-exit", "vmx-pause-exit", "vmx-secondary-ctls",
1152 .index = MSR_IA32_VMX_TRUE_PROCBASED_CTLS,
1156 [FEAT_VMX_SECONDARY_CTLS] = {
1157 .type = MSR_FEATURE_WORD,
1159 "vmx-apicv-xapic", "vmx-ept", "vmx-desc-exit", "vmx-rdtscp-exit",
1160 "vmx-apicv-x2apic", "vmx-vpid", "vmx-wbinvd-exit", "vmx-unrestricted-guest",
1161 "vmx-apicv-register", "vmx-apicv-vid", "vmx-ple", "vmx-rdrand-exit",
1162 "vmx-invpcid-exit", "vmx-vmfunc", "vmx-shadow-vmcs", "vmx-encls-exit",
1163 "vmx-rdseed-exit", "vmx-pml", NULL, NULL,
1164 "vmx-xsaves", NULL, NULL, NULL,
1165 NULL, NULL, NULL, NULL,
1166 NULL, NULL, NULL, NULL,
1169 .index = MSR_IA32_VMX_PROCBASED_CTLS2,
1173 [FEAT_VMX_PINBASED_CTLS] = {
1174 .type = MSR_FEATURE_WORD,
1176 "vmx-intr-exit", NULL, NULL, "vmx-nmi-exit",
1177 NULL, "vmx-vnmi", "vmx-preemption-timer", "vmx-posted-intr",
1178 NULL, NULL, NULL, NULL,
1179 NULL, NULL, NULL, NULL,
1180 NULL, NULL, NULL, NULL,
1181 NULL, NULL, NULL, NULL,
1182 NULL, NULL, NULL, NULL,
1183 NULL, NULL, NULL, NULL,
1186 .index = MSR_IA32_VMX_TRUE_PINBASED_CTLS,
1190 [FEAT_VMX_EXIT_CTLS] = {
1191 .type = MSR_FEATURE_WORD,
1193 * VMX_VM_EXIT_HOST_ADDR_SPACE_SIZE is copied from
1197 NULL, NULL, "vmx-exit-nosave-debugctl", NULL,
1198 NULL, NULL, NULL, NULL,
1199 NULL, NULL /* vmx-exit-host-addr-space-size */, NULL, NULL,
1200 "vmx-exit-load-perf-global-ctrl", NULL, NULL, "vmx-exit-ack-intr",
1201 NULL, NULL, "vmx-exit-save-pat", "vmx-exit-load-pat",
1202 "vmx-exit-save-efer", "vmx-exit-load-efer",
1203 "vmx-exit-save-preemption-timer", "vmx-exit-clear-bndcfgs",
1204 NULL, "vmx-exit-clear-rtit-ctl", NULL, NULL,
1205 NULL, "vmx-exit-load-pkrs", NULL, NULL,
1208 .index = MSR_IA32_VMX_TRUE_EXIT_CTLS,
1212 [FEAT_VMX_ENTRY_CTLS] = {
1213 .type = MSR_FEATURE_WORD,
1215 NULL, NULL, "vmx-entry-noload-debugctl", NULL,
1216 NULL, NULL, NULL, NULL,
1217 NULL, "vmx-entry-ia32e-mode", NULL, NULL,
1218 NULL, "vmx-entry-load-perf-global-ctrl", "vmx-entry-load-pat", "vmx-entry-load-efer",
1219 "vmx-entry-load-bndcfgs", NULL, "vmx-entry-load-rtit-ctl", NULL,
1220 NULL, NULL, "vmx-entry-load-pkrs", NULL,
1221 NULL, NULL, NULL, NULL,
1222 NULL, NULL, NULL, NULL,
1225 .index = MSR_IA32_VMX_TRUE_ENTRY_CTLS,
1230 .type = MSR_FEATURE_WORD,
1232 NULL, NULL, NULL, NULL,
1233 NULL, "vmx-store-lma", "vmx-activity-hlt", "vmx-activity-shutdown",
1234 "vmx-activity-wait-sipi", NULL, NULL, NULL,
1235 NULL, NULL, NULL, NULL,
1236 NULL, NULL, NULL, NULL,
1237 NULL, NULL, NULL, NULL,
1238 NULL, NULL, NULL, NULL,
1239 NULL, "vmx-vmwrite-vmexit-fields", "vmx-zero-len-inject", NULL,
1242 .index = MSR_IA32_VMX_MISC,
1246 [FEAT_VMX_EPT_VPID_CAPS] = {
1247 .type = MSR_FEATURE_WORD,
1249 "vmx-ept-execonly", NULL, NULL, NULL,
1250 NULL, NULL, "vmx-page-walk-4", "vmx-page-walk-5",
1251 NULL, NULL, NULL, NULL,
1252 NULL, NULL, NULL, NULL,
1253 "vmx-ept-2mb", "vmx-ept-1gb", NULL, NULL,
1254 "vmx-invept", "vmx-eptad", "vmx-ept-advanced-exitinfo", NULL,
1255 NULL, "vmx-invept-single-context", "vmx-invept-all-context", NULL,
1256 NULL, NULL, NULL, NULL,
1257 "vmx-invvpid", NULL, NULL, NULL,
1258 NULL, NULL, NULL, NULL,
1259 "vmx-invvpid-single-addr", "vmx-invept-single-context",
1260 "vmx-invvpid-all-context", "vmx-invept-single-context-noglobals",
1261 NULL, NULL, NULL, NULL,
1262 NULL, NULL, NULL, NULL,
1263 NULL, NULL, NULL, NULL,
1264 NULL, NULL, NULL, NULL,
1265 NULL, NULL, NULL, NULL,
1268 .index = MSR_IA32_VMX_EPT_VPID_CAP,
1272 [FEAT_VMX_BASIC] = {
1273 .type = MSR_FEATURE_WORD,
1275 [54] = "vmx-ins-outs",
1276 [55] = "vmx-true-ctls",
1279 .index = MSR_IA32_VMX_BASIC,
1281 /* Just to be safe - we don't support setting the MSEG version field. */
1282 .no_autoenable_flags = MSR_VMX_BASIC_DUAL_MONITOR,
1285 [FEAT_VMX_VMFUNC] = {
1286 .type = MSR_FEATURE_WORD,
1288 [0] = "vmx-eptp-switching",
1291 .index = MSR_IA32_VMX_VMFUNC,
1296 .type = CPUID_FEATURE_WORD,
1298 NULL, 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, "intel-pt-lip",
1309 .needs_ecx = true, .ecx = 0,
1312 .tcg_features = TCG_14_0_ECX_FEATURES,
1317 typedef struct FeatureMask {
1322 typedef struct FeatureDep {
1323 FeatureMask from, to;
1326 static FeatureDep feature_dependencies[] = {
1328 .from = { FEAT_7_0_EDX, CPUID_7_0_EDX_ARCH_CAPABILITIES },
1329 .to = { FEAT_ARCH_CAPABILITIES, ~0ull },
1332 .from = { FEAT_7_0_EDX, CPUID_7_0_EDX_CORE_CAPABILITY },
1333 .to = { FEAT_CORE_CAPABILITY, ~0ull },
1336 .from = { FEAT_1_ECX, CPUID_EXT_PDCM },
1337 .to = { FEAT_PERF_CAPABILITIES, ~0ull },
1340 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1341 .to = { FEAT_VMX_PROCBASED_CTLS, ~0ull },
1344 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1345 .to = { FEAT_VMX_PINBASED_CTLS, ~0ull },
1348 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1349 .to = { FEAT_VMX_EXIT_CTLS, ~0ull },
1352 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1353 .to = { FEAT_VMX_ENTRY_CTLS, ~0ull },
1356 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1357 .to = { FEAT_VMX_MISC, ~0ull },
1360 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1361 .to = { FEAT_VMX_BASIC, ~0ull },
1364 .from = { FEAT_8000_0001_EDX, CPUID_EXT2_LM },
1365 .to = { FEAT_VMX_ENTRY_CTLS, VMX_VM_ENTRY_IA32E_MODE },
1368 .from = { FEAT_VMX_PROCBASED_CTLS, VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS },
1369 .to = { FEAT_VMX_SECONDARY_CTLS, ~0ull },
1372 .from = { FEAT_XSAVE, CPUID_XSAVE_XSAVES },
1373 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_XSAVES },
1376 .from = { FEAT_1_ECX, CPUID_EXT_RDRAND },
1377 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDRAND_EXITING },
1380 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_INVPCID },
1381 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_INVPCID },
1384 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_RDSEED },
1385 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDSEED_EXITING },
1388 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_INTEL_PT },
1389 .to = { FEAT_14_0_ECX, ~0ull },
1392 .from = { FEAT_8000_0001_EDX, CPUID_EXT2_RDTSCP },
1393 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDTSCP },
1396 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_EPT },
1397 .to = { FEAT_VMX_EPT_VPID_CAPS, 0xffffffffull },
1400 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_EPT },
1401 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST },
1404 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_VPID },
1405 .to = { FEAT_VMX_EPT_VPID_CAPS, 0xffffffffull << 32 },
1408 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_VMFUNC },
1409 .to = { FEAT_VMX_VMFUNC, ~0ull },
1412 .from = { FEAT_8000_0001_ECX, CPUID_EXT3_SVM },
1413 .to = { FEAT_SVM, ~0ull },
1417 typedef struct X86RegisterInfo32 {
1418 /* Name of register */
1420 /* QAPI enum value register */
1421 X86CPURegister32 qapi_enum;
1422 } X86RegisterInfo32;
1424 #define REGISTER(reg) \
1425 [R_##reg] = { .name = #reg, .qapi_enum = X86_CPU_REGISTER32_##reg }
1426 static const X86RegisterInfo32 x86_reg_info_32[CPU_NB_REGS32] = {
1438 typedef struct ExtSaveArea {
1439 uint32_t feature, bits;
1440 uint32_t offset, size;
1443 static const ExtSaveArea x86_ext_save_areas[] = {
1445 /* x87 FP state component is always enabled if XSAVE is supported */
1446 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
1447 /* x87 state is in the legacy region of the XSAVE area */
1449 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1451 [XSTATE_SSE_BIT] = {
1452 /* SSE state component is always enabled if XSAVE is supported */
1453 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
1454 /* SSE state is in the legacy region of the XSAVE area */
1456 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1459 { .feature = FEAT_1_ECX, .bits = CPUID_EXT_AVX,
1460 .offset = offsetof(X86XSaveArea, avx_state),
1461 .size = sizeof(XSaveAVX) },
1462 [XSTATE_BNDREGS_BIT] =
1463 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
1464 .offset = offsetof(X86XSaveArea, bndreg_state),
1465 .size = sizeof(XSaveBNDREG) },
1466 [XSTATE_BNDCSR_BIT] =
1467 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
1468 .offset = offsetof(X86XSaveArea, bndcsr_state),
1469 .size = sizeof(XSaveBNDCSR) },
1470 [XSTATE_OPMASK_BIT] =
1471 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1472 .offset = offsetof(X86XSaveArea, opmask_state),
1473 .size = sizeof(XSaveOpmask) },
1474 [XSTATE_ZMM_Hi256_BIT] =
1475 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1476 .offset = offsetof(X86XSaveArea, zmm_hi256_state),
1477 .size = sizeof(XSaveZMM_Hi256) },
1478 [XSTATE_Hi16_ZMM_BIT] =
1479 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1480 .offset = offsetof(X86XSaveArea, hi16_zmm_state),
1481 .size = sizeof(XSaveHi16_ZMM) },
1483 { .feature = FEAT_7_0_ECX, .bits = CPUID_7_0_ECX_PKU,
1484 .offset = offsetof(X86XSaveArea, pkru_state),
1485 .size = sizeof(XSavePKRU) },
1488 static uint32_t xsave_area_size(uint64_t mask)
1493 for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
1494 const ExtSaveArea *esa = &x86_ext_save_areas[i];
1495 if ((mask >> i) & 1) {
1496 ret = MAX(ret, esa->offset + esa->size);
1502 static inline bool accel_uses_host_cpuid(void)
1504 return kvm_enabled() || hvf_enabled();
1507 static inline uint64_t x86_cpu_xsave_components(X86CPU *cpu)
1509 return ((uint64_t)cpu->env.features[FEAT_XSAVE_COMP_HI]) << 32 |
1510 cpu->env.features[FEAT_XSAVE_COMP_LO];
1513 /* Return name of 32-bit register, from a R_* constant */
1514 static const char *get_register_name_32(unsigned int reg)
1516 if (reg >= CPU_NB_REGS32) {
1519 return x86_reg_info_32[reg].name;
1523 * Returns the set of feature flags that are supported and migratable by
1524 * QEMU, for a given FeatureWord.
1526 static uint64_t x86_cpu_get_migratable_flags(FeatureWord w)
1528 FeatureWordInfo *wi = &feature_word_info[w];
1532 for (i = 0; i < 64; i++) {
1533 uint64_t f = 1ULL << i;
1535 /* If the feature name is known, it is implicitly considered migratable,
1536 * unless it is explicitly set in unmigratable_flags */
1537 if ((wi->migratable_flags & f) ||
1538 (wi->feat_names[i] && !(wi->unmigratable_flags & f))) {
1545 void host_cpuid(uint32_t function, uint32_t count,
1546 uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
1551 asm volatile("cpuid"
1552 : "=a"(vec[0]), "=b"(vec[1]),
1553 "=c"(vec[2]), "=d"(vec[3])
1554 : "0"(function), "c"(count) : "cc");
1555 #elif defined(__i386__)
1556 asm volatile("pusha \n\t"
1558 "mov %%eax, 0(%2) \n\t"
1559 "mov %%ebx, 4(%2) \n\t"
1560 "mov %%ecx, 8(%2) \n\t"
1561 "mov %%edx, 12(%2) \n\t"
1563 : : "a"(function), "c"(count), "S"(vec)
1579 /* CPU class name definitions: */
1581 /* Return type name for a given CPU model name
1582 * Caller is responsible for freeing the returned string.
1584 static char *x86_cpu_type_name(const char *model_name)
1586 return g_strdup_printf(X86_CPU_TYPE_NAME("%s"), model_name);
1589 static ObjectClass *x86_cpu_class_by_name(const char *cpu_model)
1591 g_autofree char *typename = x86_cpu_type_name(cpu_model);
1592 return object_class_by_name(typename);
1595 static char *x86_cpu_class_get_model_name(X86CPUClass *cc)
1597 const char *class_name = object_class_get_name(OBJECT_CLASS(cc));
1598 assert(g_str_has_suffix(class_name, X86_CPU_TYPE_SUFFIX));
1599 return g_strndup(class_name,
1600 strlen(class_name) - strlen(X86_CPU_TYPE_SUFFIX));
1603 typedef struct X86CPUVersionDefinition {
1604 X86CPUVersion version;
1608 } X86CPUVersionDefinition;
1610 /* Base definition for a CPU model */
1611 typedef struct X86CPUDefinition {
1615 /* vendor is zero-terminated, 12 character ASCII string */
1616 char vendor[CPUID_VENDOR_SZ + 1];
1620 FeatureWordArray features;
1621 const char *model_id;
1622 CPUCaches *cache_info;
1624 * Definitions for alternative versions of CPU model.
1625 * List is terminated by item with version == 0.
1626 * If NULL, version 1 will be registered automatically.
1628 const X86CPUVersionDefinition *versions;
1629 const char *deprecation_note;
1632 /* Reference to a specific CPU model version */
1633 struct X86CPUModel {
1634 /* Base CPU definition */
1635 X86CPUDefinition *cpudef;
1636 /* CPU model version */
1637 X86CPUVersion version;
1640 * If true, this is an alias CPU model.
1641 * This matters only for "-cpu help" and query-cpu-definitions
1646 /* Get full model name for CPU version */
1647 static char *x86_cpu_versioned_model_name(X86CPUDefinition *cpudef,
1648 X86CPUVersion version)
1650 assert(version > 0);
1651 return g_strdup_printf("%s-v%d", cpudef->name, (int)version);
1654 static const X86CPUVersionDefinition *x86_cpu_def_get_versions(X86CPUDefinition *def)
1656 /* When X86CPUDefinition::versions is NULL, we register only v1 */
1657 static const X86CPUVersionDefinition default_version_list[] = {
1659 { /* end of list */ }
1662 return def->versions ?: default_version_list;
1665 static CPUCaches epyc_cache_info = {
1666 .l1d_cache = &(CPUCacheInfo) {
1676 .no_invd_sharing = true,
1678 .l1i_cache = &(CPUCacheInfo) {
1679 .type = INSTRUCTION_CACHE,
1688 .no_invd_sharing = true,
1690 .l2_cache = &(CPUCacheInfo) {
1691 .type = UNIFIED_CACHE,
1700 .l3_cache = &(CPUCacheInfo) {
1701 .type = UNIFIED_CACHE,
1705 .associativity = 16,
1711 .complex_indexing = true,
1715 static CPUCaches epyc_rome_cache_info = {
1716 .l1d_cache = &(CPUCacheInfo) {
1726 .no_invd_sharing = true,
1728 .l1i_cache = &(CPUCacheInfo) {
1729 .type = INSTRUCTION_CACHE,
1738 .no_invd_sharing = true,
1740 .l2_cache = &(CPUCacheInfo) {
1741 .type = UNIFIED_CACHE,
1750 .l3_cache = &(CPUCacheInfo) {
1751 .type = UNIFIED_CACHE,
1755 .associativity = 16,
1761 .complex_indexing = true,
1765 static CPUCaches epyc_milan_cache_info = {
1766 .l1d_cache = &(CPUCacheInfo) {
1776 .no_invd_sharing = true,
1778 .l1i_cache = &(CPUCacheInfo) {
1779 .type = INSTRUCTION_CACHE,
1788 .no_invd_sharing = true,
1790 .l2_cache = &(CPUCacheInfo) {
1791 .type = UNIFIED_CACHE,
1800 .l3_cache = &(CPUCacheInfo) {
1801 .type = UNIFIED_CACHE,
1805 .associativity = 16,
1811 .complex_indexing = true,
1815 /* The following VMX features are not supported by KVM and are left out in the
1818 * Dual-monitor support (all processors)
1820 * Deactivate dual-monitor treatment
1821 * Number of CR3-target values
1822 * Shutdown activity state
1823 * Wait-for-SIPI activity state
1824 * PAUSE-loop exiting (Westmere and newer)
1825 * EPT-violation #VE (Broadwell and newer)
1826 * Inject event with insn length=0 (Skylake and newer)
1827 * Conceal non-root operation from PT
1828 * Conceal VM exits from PT
1829 * Conceal VM entries from PT
1830 * Enable ENCLS exiting
1831 * Mode-based execute control (XS/XU)
1832 s TSC scaling (Skylake Server and newer)
1833 * GPA translation for PT (IceLake and newer)
1834 * User wait and pause
1836 * Load IA32_RTIT_CTL
1837 * Clear IA32_RTIT_CTL
1838 * Advanced VM-exit information for EPT violations
1839 * Sub-page write permissions
1840 * PT in VMX operation
1843 static X86CPUDefinition builtin_x86_defs[] = {
1847 .vendor = CPUID_VENDOR_AMD,
1851 .features[FEAT_1_EDX] =
1853 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1855 .features[FEAT_1_ECX] =
1856 CPUID_EXT_SSE3 | CPUID_EXT_CX16,
1857 .features[FEAT_8000_0001_EDX] =
1858 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1859 .features[FEAT_8000_0001_ECX] =
1860 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM,
1861 .xlevel = 0x8000000A,
1862 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
1867 .vendor = CPUID_VENDOR_AMD,
1871 /* Missing: CPUID_HT */
1872 .features[FEAT_1_EDX] =
1874 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1875 CPUID_PSE36 | CPUID_VME,
1876 .features[FEAT_1_ECX] =
1877 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_CX16 |
1879 .features[FEAT_8000_0001_EDX] =
1880 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX |
1881 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_MMXEXT |
1882 CPUID_EXT2_FFXSR | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP,
1883 /* Missing: CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
1885 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
1886 CPUID_EXT3_OSVW, CPUID_EXT3_IBS */
1887 .features[FEAT_8000_0001_ECX] =
1888 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM |
1889 CPUID_EXT3_ABM | CPUID_EXT3_SSE4A,
1890 /* Missing: CPUID_SVM_LBRV */
1891 .features[FEAT_SVM] =
1893 .xlevel = 0x8000001A,
1894 .model_id = "AMD Phenom(tm) 9550 Quad-Core Processor"
1899 .vendor = CPUID_VENDOR_INTEL,
1903 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
1904 .features[FEAT_1_EDX] =
1906 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1907 CPUID_PSE36 | CPUID_VME | CPUID_ACPI | CPUID_SS,
1908 /* Missing: CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_EST,
1909 * CPUID_EXT_TM2, CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_VMX */
1910 .features[FEAT_1_ECX] =
1911 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
1913 .features[FEAT_8000_0001_EDX] =
1914 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1915 .features[FEAT_8000_0001_ECX] =
1917 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
1918 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
1919 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
1920 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
1921 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
1922 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
1923 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
1924 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
1925 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
1926 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
1927 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
1928 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
1929 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
1930 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
1931 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
1932 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
1933 .features[FEAT_VMX_SECONDARY_CTLS] =
1934 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES,
1935 .xlevel = 0x80000008,
1936 .model_id = "Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz",
1941 .vendor = CPUID_VENDOR_INTEL,
1945 /* Missing: CPUID_HT */
1946 .features[FEAT_1_EDX] =
1947 PPRO_FEATURES | CPUID_VME |
1948 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1950 /* Missing: CPUID_EXT_POPCNT, CPUID_EXT_MONITOR */
1951 .features[FEAT_1_ECX] =
1952 CPUID_EXT_SSE3 | CPUID_EXT_CX16,
1953 /* Missing: CPUID_EXT2_PDPE1GB, CPUID_EXT2_RDTSCP */
1954 .features[FEAT_8000_0001_EDX] =
1955 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1956 /* Missing: CPUID_EXT3_LAHF_LM, CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
1957 CPUID_EXT3_CR8LEG, CPUID_EXT3_ABM, CPUID_EXT3_SSE4A,
1958 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
1959 CPUID_EXT3_OSVW, CPUID_EXT3_IBS, CPUID_EXT3_SVM */
1960 .features[FEAT_8000_0001_ECX] =
1962 /* VMX features from Cedar Mill/Prescott */
1963 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
1964 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
1965 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
1966 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
1967 VMX_PIN_BASED_NMI_EXITING,
1968 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
1969 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
1970 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
1971 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
1972 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
1973 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
1974 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
1975 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING,
1976 .xlevel = 0x80000008,
1977 .model_id = "Common KVM processor"
1982 .vendor = CPUID_VENDOR_INTEL,
1986 .features[FEAT_1_EDX] =
1988 .features[FEAT_1_ECX] =
1990 .xlevel = 0x80000004,
1991 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
1996 .vendor = CPUID_VENDOR_INTEL,
2000 .features[FEAT_1_EDX] =
2001 PPRO_FEATURES | CPUID_VME |
2002 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_PSE36,
2003 .features[FEAT_1_ECX] =
2005 .features[FEAT_8000_0001_ECX] =
2007 /* VMX features from Yonah */
2008 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
2009 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
2010 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2011 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2012 VMX_PIN_BASED_NMI_EXITING,
2013 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2014 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2015 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2016 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2017 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
2018 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
2019 VMX_CPU_BASED_PAUSE_EXITING | VMX_CPU_BASED_USE_MSR_BITMAPS,
2020 .xlevel = 0x80000008,
2021 .model_id = "Common 32-bit KVM processor"
2026 .vendor = CPUID_VENDOR_INTEL,
2030 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
2031 .features[FEAT_1_EDX] =
2032 PPRO_FEATURES | CPUID_VME |
2033 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_ACPI |
2035 /* Missing: CPUID_EXT_EST, CPUID_EXT_TM2 , CPUID_EXT_XTPR,
2036 * CPUID_EXT_PDCM, CPUID_EXT_VMX */
2037 .features[FEAT_1_ECX] =
2038 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR,
2039 .features[FEAT_8000_0001_EDX] =
2041 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
2042 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
2043 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2044 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2045 VMX_PIN_BASED_NMI_EXITING,
2046 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2047 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2048 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2049 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2050 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
2051 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
2052 VMX_CPU_BASED_PAUSE_EXITING | VMX_CPU_BASED_USE_MSR_BITMAPS,
2053 .xlevel = 0x80000008,
2054 .model_id = "Genuine Intel(R) CPU T2600 @ 2.16GHz",
2059 .vendor = CPUID_VENDOR_INTEL,
2063 .features[FEAT_1_EDX] =
2071 .vendor = CPUID_VENDOR_INTEL,
2075 .features[FEAT_1_EDX] =
2083 .vendor = CPUID_VENDOR_INTEL,
2087 .features[FEAT_1_EDX] =
2095 .vendor = CPUID_VENDOR_INTEL,
2099 .features[FEAT_1_EDX] =
2107 .vendor = CPUID_VENDOR_AMD,
2111 .features[FEAT_1_EDX] =
2112 PPRO_FEATURES | CPUID_PSE36 | CPUID_VME | CPUID_MTRR |
2114 .features[FEAT_8000_0001_EDX] =
2115 CPUID_EXT2_MMXEXT | CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT,
2116 .xlevel = 0x80000008,
2117 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
2122 .vendor = CPUID_VENDOR_INTEL,
2126 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
2127 .features[FEAT_1_EDX] =
2129 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_VME |
2130 CPUID_ACPI | CPUID_SS,
2131 /* Some CPUs got no CPUID_SEP */
2132 /* Missing: CPUID_EXT_DSCPL, CPUID_EXT_EST, CPUID_EXT_TM2,
2134 .features[FEAT_1_ECX] =
2135 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
2137 .features[FEAT_8000_0001_EDX] =
2139 .features[FEAT_8000_0001_ECX] =
2141 .xlevel = 0x80000008,
2142 .model_id = "Intel(R) Atom(TM) CPU N270 @ 1.60GHz",
2147 .vendor = CPUID_VENDOR_INTEL,
2151 .features[FEAT_1_EDX] =
2152 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2153 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2154 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2155 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2156 CPUID_DE | CPUID_FP87,
2157 .features[FEAT_1_ECX] =
2158 CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
2159 .features[FEAT_8000_0001_EDX] =
2160 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2161 .features[FEAT_8000_0001_ECX] =
2163 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
2164 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
2165 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
2166 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2167 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2168 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
2169 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2170 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2171 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2172 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2173 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2174 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2175 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2176 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2177 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2178 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2179 .features[FEAT_VMX_SECONDARY_CTLS] =
2180 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES,
2181 .xlevel = 0x80000008,
2182 .model_id = "Intel Celeron_4x0 (Conroe/Merom Class Core 2)",
2187 .vendor = CPUID_VENDOR_INTEL,
2191 .features[FEAT_1_EDX] =
2192 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2193 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2194 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2195 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2196 CPUID_DE | CPUID_FP87,
2197 .features[FEAT_1_ECX] =
2198 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2200 .features[FEAT_8000_0001_EDX] =
2201 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2202 .features[FEAT_8000_0001_ECX] =
2204 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
2205 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2206 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL,
2207 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT |
2208 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL,
2209 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2210 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2211 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
2212 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2213 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2214 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2215 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2216 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2217 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2218 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2219 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2220 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2221 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2222 .features[FEAT_VMX_SECONDARY_CTLS] =
2223 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2224 VMX_SECONDARY_EXEC_WBINVD_EXITING,
2225 .xlevel = 0x80000008,
2226 .model_id = "Intel Core 2 Duo P9xxx (Penryn Class Core 2)",
2231 .vendor = CPUID_VENDOR_INTEL,
2235 .features[FEAT_1_EDX] =
2236 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2237 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2238 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2239 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2240 CPUID_DE | CPUID_FP87,
2241 .features[FEAT_1_ECX] =
2242 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2243 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
2244 .features[FEAT_8000_0001_EDX] =
2245 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2246 .features[FEAT_8000_0001_ECX] =
2248 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2249 MSR_VMX_BASIC_TRUE_CTLS,
2250 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2251 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2252 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2253 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2254 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2255 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2256 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2257 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2258 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2259 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
2260 .features[FEAT_VMX_EXIT_CTLS] =
2261 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2262 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2263 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2264 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2265 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2266 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2267 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2268 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2269 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
2270 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2271 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2272 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2273 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2274 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2275 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2276 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2277 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2278 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2279 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2280 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2281 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2282 .features[FEAT_VMX_SECONDARY_CTLS] =
2283 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2284 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2285 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2286 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2287 VMX_SECONDARY_EXEC_ENABLE_VPID,
2288 .xlevel = 0x80000008,
2289 .model_id = "Intel Core i7 9xx (Nehalem Class Core i7)",
2290 .versions = (X86CPUVersionDefinition[]) {
2294 .alias = "Nehalem-IBRS",
2295 .props = (PropValue[]) {
2296 { "spec-ctrl", "on" },
2298 "Intel Core i7 9xx (Nehalem Core i7, IBRS update)" },
2299 { /* end of list */ }
2302 { /* end of list */ }
2308 .vendor = CPUID_VENDOR_INTEL,
2312 .features[FEAT_1_EDX] =
2313 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2314 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2315 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2316 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2317 CPUID_DE | CPUID_FP87,
2318 .features[FEAT_1_ECX] =
2319 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
2320 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2321 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
2322 .features[FEAT_8000_0001_EDX] =
2323 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2324 .features[FEAT_8000_0001_ECX] =
2326 .features[FEAT_6_EAX] =
2328 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2329 MSR_VMX_BASIC_TRUE_CTLS,
2330 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2331 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2332 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2333 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2334 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2335 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2336 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2337 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2338 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2339 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
2340 .features[FEAT_VMX_EXIT_CTLS] =
2341 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2342 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2343 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2344 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2345 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2346 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2347 MSR_VMX_MISC_STORE_LMA,
2348 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2349 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2350 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
2351 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2352 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2353 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2354 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2355 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2356 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2357 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2358 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2359 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2360 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2361 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2362 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2363 .features[FEAT_VMX_SECONDARY_CTLS] =
2364 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2365 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2366 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2367 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2368 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST,
2369 .xlevel = 0x80000008,
2370 .model_id = "Westmere E56xx/L56xx/X56xx (Nehalem-C)",
2371 .versions = (X86CPUVersionDefinition[]) {
2375 .alias = "Westmere-IBRS",
2376 .props = (PropValue[]) {
2377 { "spec-ctrl", "on" },
2379 "Westmere E56xx/L56xx/X56xx (IBRS update)" },
2380 { /* end of list */ }
2383 { /* end of list */ }
2387 .name = "SandyBridge",
2389 .vendor = CPUID_VENDOR_INTEL,
2393 .features[FEAT_1_EDX] =
2394 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2395 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2396 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2397 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2398 CPUID_DE | CPUID_FP87,
2399 .features[FEAT_1_ECX] =
2400 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2401 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
2402 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2403 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
2405 .features[FEAT_8000_0001_EDX] =
2406 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2408 .features[FEAT_8000_0001_ECX] =
2410 .features[FEAT_XSAVE] =
2411 CPUID_XSAVE_XSAVEOPT,
2412 .features[FEAT_6_EAX] =
2414 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2415 MSR_VMX_BASIC_TRUE_CTLS,
2416 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2417 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2418 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2419 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2420 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2421 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2422 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2423 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2424 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2425 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
2426 .features[FEAT_VMX_EXIT_CTLS] =
2427 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2428 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2429 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2430 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2431 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2432 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2433 MSR_VMX_MISC_STORE_LMA,
2434 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2435 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2436 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
2437 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2438 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2439 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2440 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2441 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2442 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2443 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2444 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2445 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2446 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2447 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2448 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2449 .features[FEAT_VMX_SECONDARY_CTLS] =
2450 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2451 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2452 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2453 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2454 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST,
2455 .xlevel = 0x80000008,
2456 .model_id = "Intel Xeon E312xx (Sandy Bridge)",
2457 .versions = (X86CPUVersionDefinition[]) {
2461 .alias = "SandyBridge-IBRS",
2462 .props = (PropValue[]) {
2463 { "spec-ctrl", "on" },
2465 "Intel Xeon E312xx (Sandy Bridge, IBRS update)" },
2466 { /* end of list */ }
2469 { /* end of list */ }
2473 .name = "IvyBridge",
2475 .vendor = CPUID_VENDOR_INTEL,
2479 .features[FEAT_1_EDX] =
2480 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2481 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2482 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2483 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2484 CPUID_DE | CPUID_FP87,
2485 .features[FEAT_1_ECX] =
2486 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2487 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
2488 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2489 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
2490 CPUID_EXT_SSE3 | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2491 .features[FEAT_7_0_EBX] =
2492 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP |
2494 .features[FEAT_8000_0001_EDX] =
2495 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2497 .features[FEAT_8000_0001_ECX] =
2499 .features[FEAT_XSAVE] =
2500 CPUID_XSAVE_XSAVEOPT,
2501 .features[FEAT_6_EAX] =
2503 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2504 MSR_VMX_BASIC_TRUE_CTLS,
2505 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2506 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2507 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2508 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2509 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2510 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2511 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2512 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2513 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2514 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
2515 .features[FEAT_VMX_EXIT_CTLS] =
2516 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2517 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2518 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2519 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2520 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2521 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2522 MSR_VMX_MISC_STORE_LMA,
2523 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2524 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2525 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
2526 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2527 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2528 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2529 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2530 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2531 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2532 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2533 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2534 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2535 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2536 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2537 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2538 .features[FEAT_VMX_SECONDARY_CTLS] =
2539 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2540 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2541 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2542 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2543 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
2544 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
2545 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
2546 VMX_SECONDARY_EXEC_RDRAND_EXITING,
2547 .xlevel = 0x80000008,
2548 .model_id = "Intel Xeon E3-12xx v2 (Ivy Bridge)",
2549 .versions = (X86CPUVersionDefinition[]) {
2553 .alias = "IvyBridge-IBRS",
2554 .props = (PropValue[]) {
2555 { "spec-ctrl", "on" },
2557 "Intel Xeon E3-12xx v2 (Ivy Bridge, IBRS)" },
2558 { /* end of list */ }
2561 { /* end of list */ }
2567 .vendor = CPUID_VENDOR_INTEL,
2571 .features[FEAT_1_EDX] =
2572 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2573 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2574 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2575 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2576 CPUID_DE | CPUID_FP87,
2577 .features[FEAT_1_ECX] =
2578 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2579 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2580 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2581 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2582 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2583 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2584 .features[FEAT_8000_0001_EDX] =
2585 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2587 .features[FEAT_8000_0001_ECX] =
2588 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
2589 .features[FEAT_7_0_EBX] =
2590 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2591 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2592 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2594 .features[FEAT_XSAVE] =
2595 CPUID_XSAVE_XSAVEOPT,
2596 .features[FEAT_6_EAX] =
2598 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2599 MSR_VMX_BASIC_TRUE_CTLS,
2600 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2601 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2602 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2603 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2604 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2605 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2606 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2607 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2608 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2609 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
2610 .features[FEAT_VMX_EXIT_CTLS] =
2611 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2612 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2613 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2614 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2615 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2616 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2617 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
2618 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2619 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2620 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
2621 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2622 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2623 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2624 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2625 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2626 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2627 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2628 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2629 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2630 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2631 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2632 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2633 .features[FEAT_VMX_SECONDARY_CTLS] =
2634 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2635 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2636 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2637 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2638 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
2639 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
2640 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
2641 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
2642 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS,
2643 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
2644 .xlevel = 0x80000008,
2645 .model_id = "Intel Core Processor (Haswell)",
2646 .versions = (X86CPUVersionDefinition[]) {
2650 .alias = "Haswell-noTSX",
2651 .props = (PropValue[]) {
2654 { "stepping", "1" },
2655 { "model-id", "Intel Core Processor (Haswell, no TSX)", },
2656 { /* end of list */ }
2661 .alias = "Haswell-IBRS",
2662 .props = (PropValue[]) {
2663 /* Restore TSX features removed by -v2 above */
2667 * Haswell and Haswell-IBRS had stepping=4 in
2668 * QEMU 4.0 and older
2670 { "stepping", "4" },
2671 { "spec-ctrl", "on" },
2673 "Intel Core Processor (Haswell, IBRS)" },
2674 { /* end of list */ }
2679 .alias = "Haswell-noTSX-IBRS",
2680 .props = (PropValue[]) {
2683 /* spec-ctrl was already enabled by -v3 above */
2684 { "stepping", "1" },
2686 "Intel Core Processor (Haswell, no TSX, IBRS)" },
2687 { /* end of list */ }
2690 { /* end of list */ }
2694 .name = "Broadwell",
2696 .vendor = CPUID_VENDOR_INTEL,
2700 .features[FEAT_1_EDX] =
2701 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2702 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2703 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2704 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2705 CPUID_DE | CPUID_FP87,
2706 .features[FEAT_1_ECX] =
2707 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2708 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2709 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2710 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2711 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2712 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2713 .features[FEAT_8000_0001_EDX] =
2714 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2716 .features[FEAT_8000_0001_ECX] =
2717 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2718 .features[FEAT_7_0_EBX] =
2719 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2720 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2721 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2722 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2724 .features[FEAT_XSAVE] =
2725 CPUID_XSAVE_XSAVEOPT,
2726 .features[FEAT_6_EAX] =
2728 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2729 MSR_VMX_BASIC_TRUE_CTLS,
2730 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2731 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2732 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2733 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2734 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2735 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2736 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2737 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2738 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2739 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
2740 .features[FEAT_VMX_EXIT_CTLS] =
2741 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2742 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2743 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2744 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2745 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2746 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2747 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
2748 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2749 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2750 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
2751 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2752 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2753 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2754 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2755 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2756 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2757 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2758 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2759 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2760 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2761 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2762 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2763 .features[FEAT_VMX_SECONDARY_CTLS] =
2764 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2765 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2766 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2767 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2768 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
2769 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
2770 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
2771 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
2772 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
2773 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
2774 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
2775 .xlevel = 0x80000008,
2776 .model_id = "Intel Core Processor (Broadwell)",
2777 .versions = (X86CPUVersionDefinition[]) {
2781 .alias = "Broadwell-noTSX",
2782 .props = (PropValue[]) {
2785 { "model-id", "Intel Core Processor (Broadwell, no TSX)", },
2786 { /* end of list */ }
2791 .alias = "Broadwell-IBRS",
2792 .props = (PropValue[]) {
2793 /* Restore TSX features removed by -v2 above */
2796 { "spec-ctrl", "on" },
2798 "Intel Core Processor (Broadwell, IBRS)" },
2799 { /* end of list */ }
2804 .alias = "Broadwell-noTSX-IBRS",
2805 .props = (PropValue[]) {
2808 /* spec-ctrl was already enabled by -v3 above */
2810 "Intel Core Processor (Broadwell, no TSX, IBRS)" },
2811 { /* end of list */ }
2814 { /* end of list */ }
2818 .name = "Skylake-Client",
2820 .vendor = CPUID_VENDOR_INTEL,
2824 .features[FEAT_1_EDX] =
2825 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2826 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2827 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2828 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2829 CPUID_DE | CPUID_FP87,
2830 .features[FEAT_1_ECX] =
2831 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2832 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2833 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2834 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2835 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2836 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2837 .features[FEAT_8000_0001_EDX] =
2838 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2840 .features[FEAT_8000_0001_ECX] =
2841 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2842 .features[FEAT_7_0_EBX] =
2843 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2844 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2845 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2846 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2848 /* Missing: XSAVES (not supported by some Linux versions,
2849 * including v4.1 to v4.12).
2850 * KVM doesn't yet expose any XSAVES state save component,
2851 * and the only one defined in Skylake (processor tracing)
2852 * probably will block migration anyway.
2854 .features[FEAT_XSAVE] =
2855 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2856 CPUID_XSAVE_XGETBV1,
2857 .features[FEAT_6_EAX] =
2859 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
2860 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2861 MSR_VMX_BASIC_TRUE_CTLS,
2862 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2863 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2864 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2865 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2866 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2867 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2868 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2869 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2870 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2871 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
2872 .features[FEAT_VMX_EXIT_CTLS] =
2873 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2874 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2875 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2876 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2877 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2878 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2879 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
2880 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2881 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2882 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
2883 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2884 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2885 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2886 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2887 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2888 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2889 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2890 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2891 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2892 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2893 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2894 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2895 .features[FEAT_VMX_SECONDARY_CTLS] =
2896 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2897 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2898 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2899 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
2900 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
2901 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
2902 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
2903 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
2904 .xlevel = 0x80000008,
2905 .model_id = "Intel Core Processor (Skylake)",
2906 .versions = (X86CPUVersionDefinition[]) {
2910 .alias = "Skylake-Client-IBRS",
2911 .props = (PropValue[]) {
2912 { "spec-ctrl", "on" },
2914 "Intel Core Processor (Skylake, IBRS)" },
2915 { /* end of list */ }
2920 .alias = "Skylake-Client-noTSX-IBRS",
2921 .props = (PropValue[]) {
2925 "Intel Core Processor (Skylake, IBRS, no TSX)" },
2926 { /* end of list */ }
2929 { /* end of list */ }
2933 .name = "Skylake-Server",
2935 .vendor = CPUID_VENDOR_INTEL,
2939 .features[FEAT_1_EDX] =
2940 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2941 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2942 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2943 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2944 CPUID_DE | CPUID_FP87,
2945 .features[FEAT_1_ECX] =
2946 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2947 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2948 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2949 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2950 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2951 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2952 .features[FEAT_8000_0001_EDX] =
2953 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
2954 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2955 .features[FEAT_8000_0001_ECX] =
2956 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2957 .features[FEAT_7_0_EBX] =
2958 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2959 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2960 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2961 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2962 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
2963 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
2964 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
2965 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
2966 .features[FEAT_7_0_ECX] =
2968 /* Missing: XSAVES (not supported by some Linux versions,
2969 * including v4.1 to v4.12).
2970 * KVM doesn't yet expose any XSAVES state save component,
2971 * and the only one defined in Skylake (processor tracing)
2972 * probably will block migration anyway.
2974 .features[FEAT_XSAVE] =
2975 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2976 CPUID_XSAVE_XGETBV1,
2977 .features[FEAT_6_EAX] =
2979 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
2980 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2981 MSR_VMX_BASIC_TRUE_CTLS,
2982 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2983 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2984 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2985 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2986 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2987 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2988 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2989 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2990 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2991 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
2992 .features[FEAT_VMX_EXIT_CTLS] =
2993 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2994 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2995 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2996 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2997 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2998 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2999 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3000 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3001 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3002 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3003 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3004 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3005 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3006 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3007 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3008 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3009 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3010 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3011 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3012 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3013 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3014 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3015 .features[FEAT_VMX_SECONDARY_CTLS] =
3016 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3017 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3018 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3019 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3020 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3021 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3022 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3023 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3024 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3025 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3026 .xlevel = 0x80000008,
3027 .model_id = "Intel Xeon Processor (Skylake)",
3028 .versions = (X86CPUVersionDefinition[]) {
3032 .alias = "Skylake-Server-IBRS",
3033 .props = (PropValue[]) {
3034 /* clflushopt was not added to Skylake-Server-IBRS */
3035 /* TODO: add -v3 including clflushopt */
3036 { "clflushopt", "off" },
3037 { "spec-ctrl", "on" },
3039 "Intel Xeon Processor (Skylake, IBRS)" },
3040 { /* end of list */ }
3045 .alias = "Skylake-Server-noTSX-IBRS",
3046 .props = (PropValue[]) {
3050 "Intel Xeon Processor (Skylake, IBRS, no TSX)" },
3051 { /* end of list */ }
3056 .props = (PropValue[]) {
3057 { "vmx-eptp-switching", "on" },
3058 { /* end of list */ }
3061 { /* end of list */ }
3065 .name = "Cascadelake-Server",
3067 .vendor = CPUID_VENDOR_INTEL,
3071 .features[FEAT_1_EDX] =
3072 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3073 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3074 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3075 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3076 CPUID_DE | CPUID_FP87,
3077 .features[FEAT_1_ECX] =
3078 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3079 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3080 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3081 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3082 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3083 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3084 .features[FEAT_8000_0001_EDX] =
3085 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3086 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3087 .features[FEAT_8000_0001_ECX] =
3088 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3089 .features[FEAT_7_0_EBX] =
3090 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3091 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3092 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3093 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3094 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
3095 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
3096 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
3097 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
3098 .features[FEAT_7_0_ECX] =
3100 CPUID_7_0_ECX_AVX512VNNI,
3101 .features[FEAT_7_0_EDX] =
3102 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
3103 /* Missing: XSAVES (not supported by some Linux versions,
3104 * including v4.1 to v4.12).
3105 * KVM doesn't yet expose any XSAVES state save component,
3106 * and the only one defined in Skylake (processor tracing)
3107 * probably will block migration anyway.
3109 .features[FEAT_XSAVE] =
3110 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3111 CPUID_XSAVE_XGETBV1,
3112 .features[FEAT_6_EAX] =
3114 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3115 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3116 MSR_VMX_BASIC_TRUE_CTLS,
3117 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3118 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3119 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3120 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3121 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3122 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3123 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3124 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3125 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3126 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3127 .features[FEAT_VMX_EXIT_CTLS] =
3128 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3129 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3130 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3131 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3132 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3133 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3134 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3135 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3136 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3137 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3138 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3139 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3140 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3141 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3142 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3143 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3144 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3145 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3146 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3147 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3148 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3149 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3150 .features[FEAT_VMX_SECONDARY_CTLS] =
3151 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3152 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3153 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3154 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3155 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3156 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3157 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3158 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3159 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3160 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3161 .xlevel = 0x80000008,
3162 .model_id = "Intel Xeon Processor (Cascadelake)",
3163 .versions = (X86CPUVersionDefinition[]) {
3166 .note = "ARCH_CAPABILITIES",
3167 .props = (PropValue[]) {
3168 { "arch-capabilities", "on" },
3169 { "rdctl-no", "on" },
3170 { "ibrs-all", "on" },
3171 { "skip-l1dfl-vmentry", "on" },
3173 { /* end of list */ }
3177 .alias = "Cascadelake-Server-noTSX",
3178 .note = "ARCH_CAPABILITIES, no TSX",
3179 .props = (PropValue[]) {
3182 { /* end of list */ }
3186 .note = "ARCH_CAPABILITIES, no TSX",
3187 .props = (PropValue[]) {
3188 { "vmx-eptp-switching", "on" },
3189 { /* end of list */ }
3192 { /* end of list */ }
3196 .name = "Cooperlake",
3198 .vendor = CPUID_VENDOR_INTEL,
3202 .features[FEAT_1_EDX] =
3203 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3204 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3205 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3206 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3207 CPUID_DE | CPUID_FP87,
3208 .features[FEAT_1_ECX] =
3209 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3210 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3211 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3212 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3213 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3214 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3215 .features[FEAT_8000_0001_EDX] =
3216 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3217 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3218 .features[FEAT_8000_0001_ECX] =
3219 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3220 .features[FEAT_7_0_EBX] =
3221 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3222 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3223 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3224 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3225 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
3226 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
3227 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
3228 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
3229 .features[FEAT_7_0_ECX] =
3231 CPUID_7_0_ECX_AVX512VNNI,
3232 .features[FEAT_7_0_EDX] =
3233 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_STIBP |
3234 CPUID_7_0_EDX_SPEC_CTRL_SSBD | CPUID_7_0_EDX_ARCH_CAPABILITIES,
3235 .features[FEAT_ARCH_CAPABILITIES] =
3236 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
3237 MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
3238 MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO,
3239 .features[FEAT_7_1_EAX] =
3240 CPUID_7_1_EAX_AVX512_BF16,
3242 * Missing: XSAVES (not supported by some Linux versions,
3243 * including v4.1 to v4.12).
3244 * KVM doesn't yet expose any XSAVES state save component,
3245 * and the only one defined in Skylake (processor tracing)
3246 * probably will block migration anyway.
3248 .features[FEAT_XSAVE] =
3249 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3250 CPUID_XSAVE_XGETBV1,
3251 .features[FEAT_6_EAX] =
3253 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3254 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3255 MSR_VMX_BASIC_TRUE_CTLS,
3256 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3257 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3258 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3259 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3260 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3261 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3262 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3263 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3264 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3265 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3266 .features[FEAT_VMX_EXIT_CTLS] =
3267 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3268 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3269 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3270 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3271 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3272 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3273 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3274 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3275 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3276 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3277 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3278 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3279 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3280 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3281 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3282 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3283 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3284 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3285 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3286 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3287 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3288 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3289 .features[FEAT_VMX_SECONDARY_CTLS] =
3290 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3291 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3292 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3293 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3294 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3295 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3296 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3297 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3298 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3299 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3300 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3301 .xlevel = 0x80000008,
3302 .model_id = "Intel Xeon Processor (Cooperlake)",
3305 .name = "Icelake-Client",
3307 .vendor = CPUID_VENDOR_INTEL,
3311 .features[FEAT_1_EDX] =
3312 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3313 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3314 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3315 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3316 CPUID_DE | CPUID_FP87,
3317 .features[FEAT_1_ECX] =
3318 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3319 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3320 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3321 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3322 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3323 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3324 .features[FEAT_8000_0001_EDX] =
3325 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
3327 .features[FEAT_8000_0001_ECX] =
3328 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3329 .features[FEAT_8000_0008_EBX] =
3330 CPUID_8000_0008_EBX_WBNOINVD,
3331 .features[FEAT_7_0_EBX] =
3332 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3333 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3334 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3335 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3337 .features[FEAT_7_0_ECX] =
3338 CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
3339 CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
3340 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
3341 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
3342 CPUID_7_0_ECX_AVX512_VPOPCNTDQ,
3343 .features[FEAT_7_0_EDX] =
3344 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
3345 /* Missing: XSAVES (not supported by some Linux versions,
3346 * including v4.1 to v4.12).
3347 * KVM doesn't yet expose any XSAVES state save component,
3348 * and the only one defined in Skylake (processor tracing)
3349 * probably will block migration anyway.
3351 .features[FEAT_XSAVE] =
3352 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3353 CPUID_XSAVE_XGETBV1,
3354 .features[FEAT_6_EAX] =
3356 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3357 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3358 MSR_VMX_BASIC_TRUE_CTLS,
3359 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3360 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3361 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3362 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3363 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3364 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3365 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3366 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3367 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3368 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3369 .features[FEAT_VMX_EXIT_CTLS] =
3370 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3371 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3372 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3373 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3374 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3375 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3376 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3377 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3378 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3379 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
3380 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3381 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3382 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3383 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3384 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3385 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3386 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3387 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3388 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3389 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3390 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3391 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3392 .features[FEAT_VMX_SECONDARY_CTLS] =
3393 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3394 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3395 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3396 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3397 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3398 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3399 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3400 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3401 .xlevel = 0x80000008,
3402 .model_id = "Intel Core Processor (Icelake)",
3403 .versions = (X86CPUVersionDefinition[]) {
3406 .note = "deprecated"
3410 .note = "no TSX, deprecated",
3411 .alias = "Icelake-Client-noTSX",
3412 .props = (PropValue[]) {
3415 { /* end of list */ }
3418 { /* end of list */ }
3420 .deprecation_note = "use Icelake-Server instead"
3423 .name = "Icelake-Server",
3425 .vendor = CPUID_VENDOR_INTEL,
3429 .features[FEAT_1_EDX] =
3430 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3431 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3432 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3433 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3434 CPUID_DE | CPUID_FP87,
3435 .features[FEAT_1_ECX] =
3436 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3437 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3438 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3439 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3440 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3441 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3442 .features[FEAT_8000_0001_EDX] =
3443 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3444 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3445 .features[FEAT_8000_0001_ECX] =
3446 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3447 .features[FEAT_8000_0008_EBX] =
3448 CPUID_8000_0008_EBX_WBNOINVD,
3449 .features[FEAT_7_0_EBX] =
3450 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3451 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3452 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3453 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3454 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
3455 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
3456 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
3457 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
3458 .features[FEAT_7_0_ECX] =
3459 CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
3460 CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
3461 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
3462 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
3463 CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57,
3464 .features[FEAT_7_0_EDX] =
3465 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
3466 /* Missing: XSAVES (not supported by some Linux versions,
3467 * including v4.1 to v4.12).
3468 * KVM doesn't yet expose any XSAVES state save component,
3469 * and the only one defined in Skylake (processor tracing)
3470 * probably will block migration anyway.
3472 .features[FEAT_XSAVE] =
3473 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3474 CPUID_XSAVE_XGETBV1,
3475 .features[FEAT_6_EAX] =
3477 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3478 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3479 MSR_VMX_BASIC_TRUE_CTLS,
3480 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3481 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3482 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3483 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3484 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3485 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3486 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3487 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3488 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3489 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3490 .features[FEAT_VMX_EXIT_CTLS] =
3491 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3492 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3493 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3494 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3495 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3496 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3497 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3498 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3499 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3500 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3501 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3502 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3503 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3504 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3505 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3506 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3507 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3508 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3509 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3510 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3511 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3512 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3513 .features[FEAT_VMX_SECONDARY_CTLS] =
3514 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3515 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3516 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3517 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3518 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3519 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3520 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3521 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3522 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS,
3523 .xlevel = 0x80000008,
3524 .model_id = "Intel Xeon Processor (Icelake)",
3525 .versions = (X86CPUVersionDefinition[]) {
3530 .alias = "Icelake-Server-noTSX",
3531 .props = (PropValue[]) {
3534 { /* end of list */ }
3539 .props = (PropValue[]) {
3540 { "arch-capabilities", "on" },
3541 { "rdctl-no", "on" },
3542 { "ibrs-all", "on" },
3543 { "skip-l1dfl-vmentry", "on" },
3545 { "pschange-mc-no", "on" },
3547 { /* end of list */ }
3552 .props = (PropValue[]) {
3554 { "avx512ifma", "on" },
3557 { "vmx-rdseed-exit", "on" },
3558 { "vmx-pml", "on" },
3559 { "vmx-eptp-switching", "on" },
3561 { /* end of list */ }
3564 { /* end of list */ }
3568 .name = "Denverton",
3570 .vendor = CPUID_VENDOR_INTEL,
3574 .features[FEAT_1_EDX] =
3575 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
3576 CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
3577 CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
3578 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
3579 CPUID_SSE | CPUID_SSE2,
3580 .features[FEAT_1_ECX] =
3581 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR |
3582 CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | CPUID_EXT_SSE41 |
3583 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
3584 CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER |
3585 CPUID_EXT_AES | CPUID_EXT_XSAVE | CPUID_EXT_RDRAND,
3586 .features[FEAT_8000_0001_EDX] =
3587 CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
3588 CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
3589 .features[FEAT_8000_0001_ECX] =
3590 CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3591 .features[FEAT_7_0_EBX] =
3592 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_ERMS |
3593 CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_SMAP |
3594 CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_SHA_NI,
3595 .features[FEAT_7_0_EDX] =
3596 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_ARCH_CAPABILITIES |
3597 CPUID_7_0_EDX_SPEC_CTRL_SSBD,
3599 * Missing: XSAVES (not supported by some Linux versions,
3600 * including v4.1 to v4.12).
3601 * KVM doesn't yet expose any XSAVES state save component,
3602 * and the only one defined in Skylake (processor tracing)
3603 * probably will block migration anyway.
3605 .features[FEAT_XSAVE] =
3606 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | CPUID_XSAVE_XGETBV1,
3607 .features[FEAT_6_EAX] =
3609 .features[FEAT_ARCH_CAPABILITIES] =
3610 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY,
3611 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3612 MSR_VMX_BASIC_TRUE_CTLS,
3613 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3614 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3615 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3616 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3617 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3618 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3619 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3620 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3621 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3622 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3623 .features[FEAT_VMX_EXIT_CTLS] =
3624 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3625 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3626 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3627 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3628 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3629 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3630 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3631 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3632 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3633 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3634 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3635 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3636 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3637 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3638 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3639 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3640 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3641 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3642 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3643 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3644 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3645 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3646 .features[FEAT_VMX_SECONDARY_CTLS] =
3647 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3648 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3649 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3650 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3651 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3652 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3653 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3654 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3655 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3656 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3657 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3658 .xlevel = 0x80000008,
3659 .model_id = "Intel Atom Processor (Denverton)",
3660 .versions = (X86CPUVersionDefinition[]) {
3664 .note = "no MPX, no MONITOR",
3665 .props = (PropValue[]) {
3666 { "monitor", "off" },
3668 { /* end of list */ },
3671 { /* end of list */ },
3675 .name = "Snowridge",
3677 .vendor = CPUID_VENDOR_INTEL,
3681 .features[FEAT_1_EDX] =
3682 /* missing: CPUID_PN CPUID_IA64 */
3683 /* missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
3684 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE |
3685 CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE |
3686 CPUID_CX8 | CPUID_APIC | CPUID_SEP |
3687 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
3688 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH |
3690 CPUID_FXSR | CPUID_SSE | CPUID_SSE2,
3691 .features[FEAT_1_ECX] =
3692 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR |
3696 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
3698 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES | CPUID_EXT_XSAVE |
3700 .features[FEAT_8000_0001_EDX] =
3701 CPUID_EXT2_SYSCALL |
3703 CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3705 .features[FEAT_8000_0001_ECX] =
3706 CPUID_EXT3_LAHF_LM |
3707 CPUID_EXT3_3DNOWPREFETCH,
3708 .features[FEAT_7_0_EBX] =
3709 CPUID_7_0_EBX_FSGSBASE |
3710 CPUID_7_0_EBX_SMEP |
3711 CPUID_7_0_EBX_ERMS |
3712 CPUID_7_0_EBX_MPX | /* missing bits 13, 15 */
3713 CPUID_7_0_EBX_RDSEED |
3714 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
3715 CPUID_7_0_EBX_CLWB |
3716 CPUID_7_0_EBX_SHA_NI,
3717 .features[FEAT_7_0_ECX] =
3718 CPUID_7_0_ECX_UMIP |
3720 CPUID_7_0_ECX_GFNI |
3721 CPUID_7_0_ECX_MOVDIRI | CPUID_7_0_ECX_CLDEMOTE |
3722 CPUID_7_0_ECX_MOVDIR64B,
3723 .features[FEAT_7_0_EDX] =
3724 CPUID_7_0_EDX_SPEC_CTRL |
3725 CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD |
3726 CPUID_7_0_EDX_CORE_CAPABILITY,
3727 .features[FEAT_CORE_CAPABILITY] =
3728 MSR_CORE_CAP_SPLIT_LOCK_DETECT,
3730 * Missing: XSAVES (not supported by some Linux versions,
3731 * including v4.1 to v4.12).
3732 * KVM doesn't yet expose any XSAVES state save component,
3733 * and the only one defined in Skylake (processor tracing)
3734 * probably will block migration anyway.
3736 .features[FEAT_XSAVE] =
3737 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3738 CPUID_XSAVE_XGETBV1,
3739 .features[FEAT_6_EAX] =
3741 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3742 MSR_VMX_BASIC_TRUE_CTLS,
3743 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3744 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3745 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3746 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3747 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3748 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3749 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3750 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3751 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3752 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3753 .features[FEAT_VMX_EXIT_CTLS] =
3754 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3755 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3756 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3757 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3758 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3759 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3760 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3761 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3762 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3763 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3764 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3765 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3766 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3767 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3768 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3769 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3770 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3771 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3772 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3773 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3774 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3775 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3776 .features[FEAT_VMX_SECONDARY_CTLS] =
3777 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3778 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3779 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3780 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3781 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3782 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3783 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3784 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3785 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3786 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3787 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3788 .xlevel = 0x80000008,
3789 .model_id = "Intel Atom Processor (SnowRidge)",
3790 .versions = (X86CPUVersionDefinition[]) {
3794 .props = (PropValue[]) {
3796 { "model-id", "Intel Atom Processor (Snowridge, no MPX)" },
3797 { /* end of list */ },
3800 { /* end of list */ },
3804 .name = "KnightsMill",
3806 .vendor = CPUID_VENDOR_INTEL,
3810 .features[FEAT_1_EDX] =
3811 CPUID_VME | CPUID_SS | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR |
3812 CPUID_MMX | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV |
3813 CPUID_MCA | CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC |
3814 CPUID_CX8 | CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC |
3815 CPUID_PSE | CPUID_DE | CPUID_FP87,
3816 .features[FEAT_1_ECX] =
3817 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3818 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3819 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3820 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3821 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3822 CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3823 .features[FEAT_8000_0001_EDX] =
3824 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3825 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3826 .features[FEAT_8000_0001_ECX] =
3827 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3828 .features[FEAT_7_0_EBX] =
3829 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
3830 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
3831 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_AVX512F |
3832 CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_AVX512PF |
3833 CPUID_7_0_EBX_AVX512ER,
3834 .features[FEAT_7_0_ECX] =
3835 CPUID_7_0_ECX_AVX512_VPOPCNTDQ,
3836 .features[FEAT_7_0_EDX] =
3837 CPUID_7_0_EDX_AVX512_4VNNIW | CPUID_7_0_EDX_AVX512_4FMAPS,
3838 .features[FEAT_XSAVE] =
3839 CPUID_XSAVE_XSAVEOPT,
3840 .features[FEAT_6_EAX] =
3842 .xlevel = 0x80000008,
3843 .model_id = "Intel Xeon Phi Processor (Knights Mill)",
3846 .name = "Opteron_G1",
3848 .vendor = CPUID_VENDOR_AMD,
3852 .features[FEAT_1_EDX] =
3853 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3854 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3855 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3856 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3857 CPUID_DE | CPUID_FP87,
3858 .features[FEAT_1_ECX] =
3860 .features[FEAT_8000_0001_EDX] =
3861 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3862 .xlevel = 0x80000008,
3863 .model_id = "AMD Opteron 240 (Gen 1 Class Opteron)",
3866 .name = "Opteron_G2",
3868 .vendor = CPUID_VENDOR_AMD,
3872 .features[FEAT_1_EDX] =
3873 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3874 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3875 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3876 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3877 CPUID_DE | CPUID_FP87,
3878 .features[FEAT_1_ECX] =
3879 CPUID_EXT_CX16 | CPUID_EXT_SSE3,
3880 .features[FEAT_8000_0001_EDX] =
3881 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3882 .features[FEAT_8000_0001_ECX] =
3883 CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
3884 .xlevel = 0x80000008,
3885 .model_id = "AMD Opteron 22xx (Gen 2 Class Opteron)",
3888 .name = "Opteron_G3",
3890 .vendor = CPUID_VENDOR_AMD,
3894 .features[FEAT_1_EDX] =
3895 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3896 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3897 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3898 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3899 CPUID_DE | CPUID_FP87,
3900 .features[FEAT_1_ECX] =
3901 CPUID_EXT_POPCNT | CPUID_EXT_CX16 | CPUID_EXT_MONITOR |
3903 .features[FEAT_8000_0001_EDX] =
3904 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL |
3906 .features[FEAT_8000_0001_ECX] =
3907 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A |
3908 CPUID_EXT3_ABM | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
3909 .xlevel = 0x80000008,
3910 .model_id = "AMD Opteron 23xx (Gen 3 Class Opteron)",
3913 .name = "Opteron_G4",
3915 .vendor = CPUID_VENDOR_AMD,
3919 .features[FEAT_1_EDX] =
3920 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3921 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3922 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3923 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3924 CPUID_DE | CPUID_FP87,
3925 .features[FEAT_1_ECX] =
3926 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3927 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
3928 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
3930 .features[FEAT_8000_0001_EDX] =
3931 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
3932 CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
3933 .features[FEAT_8000_0001_ECX] =
3934 CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
3935 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
3936 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
3938 .features[FEAT_SVM] =
3939 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
3941 .xlevel = 0x8000001A,
3942 .model_id = "AMD Opteron 62xx class CPU",
3945 .name = "Opteron_G5",
3947 .vendor = CPUID_VENDOR_AMD,
3951 .features[FEAT_1_EDX] =
3952 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3953 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3954 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3955 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3956 CPUID_DE | CPUID_FP87,
3957 .features[FEAT_1_ECX] =
3958 CPUID_EXT_F16C | CPUID_EXT_AVX | CPUID_EXT_XSAVE |
3959 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
3960 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_FMA |
3961 CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
3962 .features[FEAT_8000_0001_EDX] =
3963 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
3964 CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
3965 .features[FEAT_8000_0001_ECX] =
3966 CPUID_EXT3_TBM | CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
3967 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
3968 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
3970 .features[FEAT_SVM] =
3971 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
3973 .xlevel = 0x8000001A,
3974 .model_id = "AMD Opteron 63xx class CPU",
3979 .vendor = CPUID_VENDOR_AMD,
3983 .features[FEAT_1_EDX] =
3984 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
3985 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
3986 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
3987 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
3988 CPUID_VME | CPUID_FP87,
3989 .features[FEAT_1_ECX] =
3990 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
3991 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
3992 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
3993 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
3994 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
3995 .features[FEAT_8000_0001_EDX] =
3996 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
3997 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
3999 .features[FEAT_8000_0001_ECX] =
4000 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
4001 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
4002 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
4004 .features[FEAT_7_0_EBX] =
4005 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4006 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
4007 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
4008 CPUID_7_0_EBX_SHA_NI,
4009 .features[FEAT_XSAVE] =
4010 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4011 CPUID_XSAVE_XGETBV1,
4012 .features[FEAT_6_EAX] =
4014 .features[FEAT_SVM] =
4015 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4016 .xlevel = 0x8000001E,
4017 .model_id = "AMD EPYC Processor",
4018 .cache_info = &epyc_cache_info,
4019 .versions = (X86CPUVersionDefinition[]) {
4023 .alias = "EPYC-IBPB",
4024 .props = (PropValue[]) {
4027 "AMD EPYC Processor (with IBPB)" },
4028 { /* end of list */ }
4033 .props = (PropValue[]) {
4035 { "perfctr-core", "on" },
4037 { "xsaveerptr", "on" },
4040 "AMD EPYC Processor" },
4041 { /* end of list */ }
4044 { /* end of list */ }
4050 .vendor = CPUID_VENDOR_HYGON,
4054 .features[FEAT_1_EDX] =
4055 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
4056 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
4057 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
4058 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
4059 CPUID_VME | CPUID_FP87,
4060 .features[FEAT_1_ECX] =
4061 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
4062 CPUID_EXT_XSAVE | CPUID_EXT_POPCNT |
4063 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4064 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
4065 CPUID_EXT_MONITOR | CPUID_EXT_SSE3,
4066 .features[FEAT_8000_0001_EDX] =
4067 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
4068 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
4070 .features[FEAT_8000_0001_ECX] =
4071 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
4072 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
4073 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
4075 .features[FEAT_8000_0008_EBX] =
4076 CPUID_8000_0008_EBX_IBPB,
4077 .features[FEAT_7_0_EBX] =
4078 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4079 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
4080 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT,
4082 * Missing: XSAVES (not supported by some Linux versions,
4083 * including v4.1 to v4.12).
4084 * KVM doesn't yet expose any XSAVES state save component.
4086 .features[FEAT_XSAVE] =
4087 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4088 CPUID_XSAVE_XGETBV1,
4089 .features[FEAT_6_EAX] =
4091 .features[FEAT_SVM] =
4092 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4093 .xlevel = 0x8000001E,
4094 .model_id = "Hygon Dhyana Processor",
4095 .cache_info = &epyc_cache_info,
4098 .name = "EPYC-Rome",
4100 .vendor = CPUID_VENDOR_AMD,
4104 .features[FEAT_1_EDX] =
4105 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
4106 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
4107 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
4108 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
4109 CPUID_VME | CPUID_FP87,
4110 .features[FEAT_1_ECX] =
4111 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
4112 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
4113 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4114 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
4115 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
4116 .features[FEAT_8000_0001_EDX] =
4117 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
4118 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
4120 .features[FEAT_8000_0001_ECX] =
4121 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
4122 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
4123 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
4124 CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
4125 .features[FEAT_8000_0008_EBX] =
4126 CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
4127 CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
4128 CPUID_8000_0008_EBX_STIBP,
4129 .features[FEAT_7_0_EBX] =
4130 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4131 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
4132 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
4133 CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_CLWB,
4134 .features[FEAT_7_0_ECX] =
4135 CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_RDPID,
4136 .features[FEAT_XSAVE] =
4137 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4138 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
4139 .features[FEAT_6_EAX] =
4141 .features[FEAT_SVM] =
4142 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4143 .xlevel = 0x8000001E,
4144 .model_id = "AMD EPYC-Rome Processor",
4145 .cache_info = &epyc_rome_cache_info,
4146 .versions = (X86CPUVersionDefinition[]) {
4150 .props = (PropValue[]) {
4152 { "amd-ssbd", "on" },
4153 { /* end of list */ }
4156 { /* end of list */ }
4160 .name = "EPYC-Milan",
4162 .vendor = CPUID_VENDOR_AMD,
4166 .features[FEAT_1_EDX] =
4167 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
4168 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
4169 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
4170 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
4171 CPUID_VME | CPUID_FP87,
4172 .features[FEAT_1_ECX] =
4173 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
4174 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
4175 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4176 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
4177 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
4179 .features[FEAT_8000_0001_EDX] =
4180 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
4181 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
4183 .features[FEAT_8000_0001_ECX] =
4184 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
4185 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
4186 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
4187 CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
4188 .features[FEAT_8000_0008_EBX] =
4189 CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
4190 CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
4191 CPUID_8000_0008_EBX_IBRS | CPUID_8000_0008_EBX_STIBP |
4192 CPUID_8000_0008_EBX_AMD_SSBD,
4193 .features[FEAT_7_0_EBX] =
4194 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4195 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
4196 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
4197 CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_ERMS |
4198 CPUID_7_0_EBX_INVPCID,
4199 .features[FEAT_7_0_ECX] =
4200 CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_PKU,
4201 .features[FEAT_7_0_EDX] =
4203 .features[FEAT_XSAVE] =
4204 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4205 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
4206 .features[FEAT_6_EAX] =
4208 .features[FEAT_SVM] =
4209 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE | CPUID_SVM_SVME_ADDR_CHK,
4210 .xlevel = 0x8000001E,
4211 .model_id = "AMD EPYC-Milan Processor",
4212 .cache_info = &epyc_milan_cache_info,
4217 * We resolve CPU model aliases using -v1 when using "-machine
4218 * none", but this is just for compatibility while libvirt isn't
4219 * adapted to resolve CPU model versions before creating VMs.
4220 * See "Runnability guarantee of CPU models" at
4221 * docs/system/deprecated.rst.
4223 X86CPUVersion default_cpu_version = 1;
4225 void x86_cpu_set_default_version(X86CPUVersion version)
4227 /* Translating CPU_VERSION_AUTO to CPU_VERSION_AUTO doesn't make sense */
4228 assert(version != CPU_VERSION_AUTO);
4229 default_cpu_version = version;
4232 static X86CPUVersion x86_cpu_model_last_version(const X86CPUModel *model)
4235 const X86CPUVersionDefinition *vdef =
4236 x86_cpu_def_get_versions(model->cpudef);
4237 while (vdef->version) {
4244 /* Return the actual version being used for a specific CPU model */
4245 static X86CPUVersion x86_cpu_model_resolve_version(const X86CPUModel *model)
4247 X86CPUVersion v = model->version;
4248 if (v == CPU_VERSION_AUTO) {
4249 v = default_cpu_version;
4251 if (v == CPU_VERSION_LATEST) {
4252 return x86_cpu_model_last_version(model);
4257 static Property max_x86_cpu_properties[] = {
4258 DEFINE_PROP_BOOL("migratable", X86CPU, migratable, true),
4259 DEFINE_PROP_BOOL("host-cache-info", X86CPU, cache_info_passthrough, false),
4260 DEFINE_PROP_END_OF_LIST()
4263 static void max_x86_cpu_class_init(ObjectClass *oc, void *data)
4265 DeviceClass *dc = DEVICE_CLASS(oc);
4266 X86CPUClass *xcc = X86_CPU_CLASS(oc);
4270 xcc->model_description =
4271 "Enables all features supported by the accelerator in the current host";
4273 device_class_set_props(dc, max_x86_cpu_properties);
4276 static void max_x86_cpu_initfn(Object *obj)
4278 X86CPU *cpu = X86_CPU(obj);
4280 /* We can't fill the features array here because we don't know yet if
4281 * "migratable" is true or false.
4283 cpu->max_features = true;
4284 object_property_set_bool(OBJECT(cpu), "pmu", true, &error_abort);
4287 * these defaults are used for TCG and all other accelerators
4288 * besides KVM and HVF, which overwrite these values
4290 object_property_set_str(OBJECT(cpu), "vendor", CPUID_VENDOR_AMD,
4292 object_property_set_int(OBJECT(cpu), "family", 6, &error_abort);
4293 object_property_set_int(OBJECT(cpu), "model", 6, &error_abort);
4294 object_property_set_int(OBJECT(cpu), "stepping", 3, &error_abort);
4295 object_property_set_str(OBJECT(cpu), "model-id",
4296 "QEMU TCG CPU version " QEMU_HW_VERSION,
4300 static const TypeInfo max_x86_cpu_type_info = {
4301 .name = X86_CPU_TYPE_NAME("max"),
4302 .parent = TYPE_X86_CPU,
4303 .instance_init = max_x86_cpu_initfn,
4304 .class_init = max_x86_cpu_class_init,
4307 static char *feature_word_description(FeatureWordInfo *f, uint32_t bit)
4309 assert(f->type == CPUID_FEATURE_WORD || f->type == MSR_FEATURE_WORD);
4312 case CPUID_FEATURE_WORD:
4314 const char *reg = get_register_name_32(f->cpuid.reg);
4316 return g_strdup_printf("CPUID.%02XH:%s",
4319 case MSR_FEATURE_WORD:
4320 return g_strdup_printf("MSR(%02XH)",
4327 static bool x86_cpu_have_filtered_features(X86CPU *cpu)
4331 for (w = 0; w < FEATURE_WORDS; w++) {
4332 if (cpu->filtered_features[w]) {
4340 static void mark_unavailable_features(X86CPU *cpu, FeatureWord w, uint64_t mask,
4341 const char *verbose_prefix)
4343 CPUX86State *env = &cpu->env;
4344 FeatureWordInfo *f = &feature_word_info[w];
4347 if (!cpu->force_features) {
4348 env->features[w] &= ~mask;
4350 cpu->filtered_features[w] |= mask;
4352 if (!verbose_prefix) {
4356 for (i = 0; i < 64; ++i) {
4357 if ((1ULL << i) & mask) {
4358 g_autofree char *feat_word_str = feature_word_description(f, i);
4359 warn_report("%s: %s%s%s [bit %d]",
4362 f->feat_names[i] ? "." : "",
4363 f->feat_names[i] ? f->feat_names[i] : "", i);
4368 static void x86_cpuid_version_get_family(Object *obj, Visitor *v,
4369 const char *name, void *opaque,
4372 X86CPU *cpu = X86_CPU(obj);
4373 CPUX86State *env = &cpu->env;
4376 value = (env->cpuid_version >> 8) & 0xf;
4378 value += (env->cpuid_version >> 20) & 0xff;
4380 visit_type_int(v, name, &value, errp);
4383 static void x86_cpuid_version_set_family(Object *obj, Visitor *v,
4384 const char *name, void *opaque,
4387 X86CPU *cpu = X86_CPU(obj);
4388 CPUX86State *env = &cpu->env;
4389 const int64_t min = 0;
4390 const int64_t max = 0xff + 0xf;
4393 if (!visit_type_int(v, name, &value, errp)) {
4396 if (value < min || value > max) {
4397 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
4398 name ? name : "null", value, min, max);
4402 env->cpuid_version &= ~0xff00f00;
4404 env->cpuid_version |= 0xf00 | ((value - 0x0f) << 20);
4406 env->cpuid_version |= value << 8;
4410 static void x86_cpuid_version_get_model(Object *obj, Visitor *v,
4411 const char *name, void *opaque,
4414 X86CPU *cpu = X86_CPU(obj);
4415 CPUX86State *env = &cpu->env;
4418 value = (env->cpuid_version >> 4) & 0xf;
4419 value |= ((env->cpuid_version >> 16) & 0xf) << 4;
4420 visit_type_int(v, name, &value, errp);
4423 static void x86_cpuid_version_set_model(Object *obj, Visitor *v,
4424 const char *name, void *opaque,
4427 X86CPU *cpu = X86_CPU(obj);
4428 CPUX86State *env = &cpu->env;
4429 const int64_t min = 0;
4430 const int64_t max = 0xff;
4433 if (!visit_type_int(v, name, &value, errp)) {
4436 if (value < min || value > max) {
4437 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
4438 name ? name : "null", value, min, max);
4442 env->cpuid_version &= ~0xf00f0;
4443 env->cpuid_version |= ((value & 0xf) << 4) | ((value >> 4) << 16);
4446 static void x86_cpuid_version_get_stepping(Object *obj, Visitor *v,
4447 const char *name, void *opaque,
4450 X86CPU *cpu = X86_CPU(obj);
4451 CPUX86State *env = &cpu->env;
4454 value = env->cpuid_version & 0xf;
4455 visit_type_int(v, name, &value, errp);
4458 static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v,
4459 const char *name, void *opaque,
4462 X86CPU *cpu = X86_CPU(obj);
4463 CPUX86State *env = &cpu->env;
4464 const int64_t min = 0;
4465 const int64_t max = 0xf;
4468 if (!visit_type_int(v, name, &value, errp)) {
4471 if (value < min || value > max) {
4472 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
4473 name ? name : "null", value, min, max);
4477 env->cpuid_version &= ~0xf;
4478 env->cpuid_version |= value & 0xf;
4481 static char *x86_cpuid_get_vendor(Object *obj, Error **errp)
4483 X86CPU *cpu = X86_CPU(obj);
4484 CPUX86State *env = &cpu->env;
4487 value = g_malloc(CPUID_VENDOR_SZ + 1);
4488 x86_cpu_vendor_words2str(value, env->cpuid_vendor1, env->cpuid_vendor2,
4489 env->cpuid_vendor3);
4493 static void x86_cpuid_set_vendor(Object *obj, const char *value,
4496 X86CPU *cpu = X86_CPU(obj);
4497 CPUX86State *env = &cpu->env;
4500 if (strlen(value) != CPUID_VENDOR_SZ) {
4501 error_setg(errp, QERR_PROPERTY_VALUE_BAD, "", "vendor", value);
4505 env->cpuid_vendor1 = 0;
4506 env->cpuid_vendor2 = 0;
4507 env->cpuid_vendor3 = 0;
4508 for (i = 0; i < 4; i++) {
4509 env->cpuid_vendor1 |= ((uint8_t)value[i ]) << (8 * i);
4510 env->cpuid_vendor2 |= ((uint8_t)value[i + 4]) << (8 * i);
4511 env->cpuid_vendor3 |= ((uint8_t)value[i + 8]) << (8 * i);
4515 static char *x86_cpuid_get_model_id(Object *obj, Error **errp)
4517 X86CPU *cpu = X86_CPU(obj);
4518 CPUX86State *env = &cpu->env;
4522 value = g_malloc(48 + 1);
4523 for (i = 0; i < 48; i++) {
4524 value[i] = env->cpuid_model[i >> 2] >> (8 * (i & 3));
4530 static void x86_cpuid_set_model_id(Object *obj, const char *model_id,
4533 X86CPU *cpu = X86_CPU(obj);
4534 CPUX86State *env = &cpu->env;
4537 if (model_id == NULL) {
4540 len = strlen(model_id);
4541 memset(env->cpuid_model, 0, 48);
4542 for (i = 0; i < 48; i++) {
4546 c = (uint8_t)model_id[i];
4548 env->cpuid_model[i >> 2] |= c << (8 * (i & 3));
4552 static void x86_cpuid_get_tsc_freq(Object *obj, Visitor *v, const char *name,
4553 void *opaque, Error **errp)
4555 X86CPU *cpu = X86_CPU(obj);
4558 value = cpu->env.tsc_khz * 1000;
4559 visit_type_int(v, name, &value, errp);
4562 static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name,
4563 void *opaque, Error **errp)
4565 X86CPU *cpu = X86_CPU(obj);
4566 const int64_t min = 0;
4567 const int64_t max = INT64_MAX;
4570 if (!visit_type_int(v, name, &value, errp)) {
4573 if (value < min || value > max) {
4574 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
4575 name ? name : "null", value, min, max);
4579 cpu->env.tsc_khz = cpu->env.user_tsc_khz = value / 1000;
4582 /* Generic getter for "feature-words" and "filtered-features" properties */
4583 static void x86_cpu_get_feature_words(Object *obj, Visitor *v,
4584 const char *name, void *opaque,
4587 uint64_t *array = (uint64_t *)opaque;
4589 X86CPUFeatureWordInfo word_infos[FEATURE_WORDS] = { };
4590 X86CPUFeatureWordInfoList list_entries[FEATURE_WORDS] = { };
4591 X86CPUFeatureWordInfoList *list = NULL;
4593 for (w = 0; w < FEATURE_WORDS; w++) {
4594 FeatureWordInfo *wi = &feature_word_info[w];
4596 * We didn't have MSR features when "feature-words" was
4597 * introduced. Therefore skipped other type entries.
4599 if (wi->type != CPUID_FEATURE_WORD) {
4602 X86CPUFeatureWordInfo *qwi = &word_infos[w];
4603 qwi->cpuid_input_eax = wi->cpuid.eax;
4604 qwi->has_cpuid_input_ecx = wi->cpuid.needs_ecx;
4605 qwi->cpuid_input_ecx = wi->cpuid.ecx;
4606 qwi->cpuid_register = x86_reg_info_32[wi->cpuid.reg].qapi_enum;
4607 qwi->features = array[w];
4609 /* List will be in reverse order, but order shouldn't matter */
4610 list_entries[w].next = list;
4611 list_entries[w].value = &word_infos[w];
4612 list = &list_entries[w];
4615 visit_type_X86CPUFeatureWordInfoList(v, "feature-words", &list, errp);
4618 /* Convert all '_' in a feature string option name to '-', to make feature
4619 * name conform to QOM property naming rule, which uses '-' instead of '_'.
4621 static inline void feat2prop(char *s)
4623 while ((s = strchr(s, '_'))) {
4628 /* Return the feature property name for a feature flag bit */
4629 static const char *x86_cpu_feature_name(FeatureWord w, int bitnr)
4632 /* XSAVE components are automatically enabled by other features,
4633 * so return the original feature name instead
4635 if (w == FEAT_XSAVE_COMP_LO || w == FEAT_XSAVE_COMP_HI) {
4636 int comp = (w == FEAT_XSAVE_COMP_HI) ? bitnr + 32 : bitnr;
4638 if (comp < ARRAY_SIZE(x86_ext_save_areas) &&
4639 x86_ext_save_areas[comp].bits) {
4640 w = x86_ext_save_areas[comp].feature;
4641 bitnr = ctz32(x86_ext_save_areas[comp].bits);
4646 assert(w < FEATURE_WORDS);
4647 name = feature_word_info[w].feat_names[bitnr];
4648 assert(bitnr < 32 || !(name && feature_word_info[w].type == CPUID_FEATURE_WORD));
4652 /* Compatibily hack to maintain legacy +-feat semantic,
4653 * where +-feat overwrites any feature set by
4654 * feat=on|feat even if the later is parsed after +-feat
4655 * (i.e. "-x2apic,x2apic=on" will result in x2apic disabled)
4657 static GList *plus_features, *minus_features;
4659 static gint compare_string(gconstpointer a, gconstpointer b)
4661 return g_strcmp0(a, b);
4664 /* Parse "+feature,-feature,feature=foo" CPU feature string
4666 static void x86_cpu_parse_featurestr(const char *typename, char *features,
4669 char *featurestr; /* Single 'key=value" string being parsed */
4670 static bool cpu_globals_initialized;
4671 bool ambiguous = false;
4673 if (cpu_globals_initialized) {
4676 cpu_globals_initialized = true;
4682 for (featurestr = strtok(features, ",");
4684 featurestr = strtok(NULL, ",")) {
4686 const char *val = NULL;
4689 GlobalProperty *prop;
4691 /* Compatibility syntax: */
4692 if (featurestr[0] == '+') {
4693 plus_features = g_list_append(plus_features,
4694 g_strdup(featurestr + 1));
4696 } else if (featurestr[0] == '-') {
4697 minus_features = g_list_append(minus_features,
4698 g_strdup(featurestr + 1));
4702 eq = strchr(featurestr, '=');
4710 feat2prop(featurestr);
4713 if (g_list_find_custom(plus_features, name, compare_string)) {
4714 warn_report("Ambiguous CPU model string. "
4715 "Don't mix both \"+%s\" and \"%s=%s\"",
4719 if (g_list_find_custom(minus_features, name, compare_string)) {
4720 warn_report("Ambiguous CPU model string. "
4721 "Don't mix both \"-%s\" and \"%s=%s\"",
4727 if (!strcmp(name, "tsc-freq")) {
4731 ret = qemu_strtosz_metric(val, NULL, &tsc_freq);
4732 if (ret < 0 || tsc_freq > INT64_MAX) {
4733 error_setg(errp, "bad numerical value %s", val);
4736 snprintf(num, sizeof(num), "%" PRId64, tsc_freq);
4738 name = "tsc-frequency";
4741 prop = g_new0(typeof(*prop), 1);
4742 prop->driver = typename;
4743 prop->property = g_strdup(name);
4744 prop->value = g_strdup(val);
4745 qdev_prop_register_global(prop);
4749 warn_report("Compatibility of ambiguous CPU model "
4750 "strings won't be kept on future QEMU versions");
4754 static void x86_cpu_expand_features(X86CPU *cpu, Error **errp);
4755 static void x86_cpu_filter_features(X86CPU *cpu, bool verbose);
4757 /* Build a list with the name of all features on a feature word array */
4758 static void x86_cpu_list_feature_names(FeatureWordArray features,
4761 strList **tail = list;
4764 for (w = 0; w < FEATURE_WORDS; w++) {
4765 uint64_t filtered = features[w];
4767 for (i = 0; i < 64; i++) {
4768 if (filtered & (1ULL << i)) {
4769 QAPI_LIST_APPEND(tail, g_strdup(x86_cpu_feature_name(w, i)));
4775 static void x86_cpu_get_unavailable_features(Object *obj, Visitor *v,
4776 const char *name, void *opaque,
4779 X86CPU *xc = X86_CPU(obj);
4780 strList *result = NULL;
4782 x86_cpu_list_feature_names(xc->filtered_features, &result);
4783 visit_type_strList(v, "unavailable-features", &result, errp);
4786 /* Check for missing features that may prevent the CPU class from
4787 * running using the current machine and accelerator.
4789 static void x86_cpu_class_check_missing_features(X86CPUClass *xcc,
4792 strList **tail = list;
4796 if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
4797 QAPI_LIST_APPEND(tail, g_strdup("kvm"));
4801 xc = X86_CPU(object_new_with_class(OBJECT_CLASS(xcc)));
4803 x86_cpu_expand_features(xc, &err);
4805 /* Errors at x86_cpu_expand_features should never happen,
4806 * but in case it does, just report the model as not
4807 * runnable at all using the "type" property.
4809 QAPI_LIST_APPEND(tail, g_strdup("type"));
4813 x86_cpu_filter_features(xc, false);
4815 x86_cpu_list_feature_names(xc->filtered_features, tail);
4817 object_unref(OBJECT(xc));
4820 /* Print all cpuid feature names in featureset
4822 static void listflags(GList *features)
4827 for (tmp = features; tmp; tmp = tmp->next) {
4828 const char *name = tmp->data;
4829 if ((len + strlen(name) + 1) >= 75) {
4833 qemu_printf("%s%s", len == 0 ? " " : " ", name);
4834 len += strlen(name) + 1;
4839 /* Sort alphabetically by type name, respecting X86CPUClass::ordering. */
4840 static gint x86_cpu_list_compare(gconstpointer a, gconstpointer b)
4842 ObjectClass *class_a = (ObjectClass *)a;
4843 ObjectClass *class_b = (ObjectClass *)b;
4844 X86CPUClass *cc_a = X86_CPU_CLASS(class_a);
4845 X86CPUClass *cc_b = X86_CPU_CLASS(class_b);
4848 if (cc_a->ordering != cc_b->ordering) {
4849 ret = cc_a->ordering - cc_b->ordering;
4851 g_autofree char *name_a = x86_cpu_class_get_model_name(cc_a);
4852 g_autofree char *name_b = x86_cpu_class_get_model_name(cc_b);
4853 ret = strcmp(name_a, name_b);
4858 static GSList *get_sorted_cpu_model_list(void)
4860 GSList *list = object_class_get_list(TYPE_X86_CPU, false);
4861 list = g_slist_sort(list, x86_cpu_list_compare);
4865 static char *x86_cpu_class_get_model_id(X86CPUClass *xc)
4867 Object *obj = object_new_with_class(OBJECT_CLASS(xc));
4868 char *r = object_property_get_str(obj, "model-id", &error_abort);
4873 static char *x86_cpu_class_get_alias_of(X86CPUClass *cc)
4875 X86CPUVersion version;
4877 if (!cc->model || !cc->model->is_alias) {
4880 version = x86_cpu_model_resolve_version(cc->model);
4884 return x86_cpu_versioned_model_name(cc->model->cpudef, version);
4887 static void x86_cpu_list_entry(gpointer data, gpointer user_data)
4889 ObjectClass *oc = data;
4890 X86CPUClass *cc = X86_CPU_CLASS(oc);
4891 g_autofree char *name = x86_cpu_class_get_model_name(cc);
4892 g_autofree char *desc = g_strdup(cc->model_description);
4893 g_autofree char *alias_of = x86_cpu_class_get_alias_of(cc);
4894 g_autofree char *model_id = x86_cpu_class_get_model_id(cc);
4896 if (!desc && alias_of) {
4897 if (cc->model && cc->model->version == CPU_VERSION_AUTO) {
4898 desc = g_strdup("(alias configured by machine type)");
4900 desc = g_strdup_printf("(alias of %s)", alias_of);
4903 if (!desc && cc->model && cc->model->note) {
4904 desc = g_strdup_printf("%s [%s]", model_id, cc->model->note);
4907 desc = g_strdup_printf("%s", model_id);
4910 qemu_printf("x86 %-20s %-58s\n", name, desc);
4913 /* list available CPU models and flags */
4914 void x86_cpu_list(void)
4918 GList *names = NULL;
4920 qemu_printf("Available CPUs:\n");
4921 list = get_sorted_cpu_model_list();
4922 g_slist_foreach(list, x86_cpu_list_entry, NULL);
4926 for (i = 0; i < ARRAY_SIZE(feature_word_info); i++) {
4927 FeatureWordInfo *fw = &feature_word_info[i];
4928 for (j = 0; j < 64; j++) {
4929 if (fw->feat_names[j]) {
4930 names = g_list_append(names, (gpointer)fw->feat_names[j]);
4935 names = g_list_sort(names, (GCompareFunc)strcmp);
4937 qemu_printf("\nRecognized CPUID flags:\n");
4943 static void x86_cpu_definition_entry(gpointer data, gpointer user_data)
4945 ObjectClass *oc = data;
4946 X86CPUClass *cc = X86_CPU_CLASS(oc);
4947 CpuDefinitionInfoList **cpu_list = user_data;
4948 CpuDefinitionInfo *info;
4950 info = g_malloc0(sizeof(*info));
4951 info->name = x86_cpu_class_get_model_name(cc);
4952 x86_cpu_class_check_missing_features(cc, &info->unavailable_features);
4953 info->has_unavailable_features = true;
4954 info->q_typename = g_strdup(object_class_get_name(oc));
4955 info->migration_safe = cc->migration_safe;
4956 info->has_migration_safe = true;
4957 info->q_static = cc->static_model;
4958 if (cc->model && cc->model->cpudef->deprecation_note) {
4959 info->deprecated = true;
4961 info->deprecated = false;
4964 * Old machine types won't report aliases, so that alias translation
4965 * doesn't break compatibility with previous QEMU versions.
4967 if (default_cpu_version != CPU_VERSION_LEGACY) {
4968 info->alias_of = x86_cpu_class_get_alias_of(cc);
4969 info->has_alias_of = !!info->alias_of;
4972 QAPI_LIST_PREPEND(*cpu_list, info);
4975 CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
4977 CpuDefinitionInfoList *cpu_list = NULL;
4978 GSList *list = get_sorted_cpu_model_list();
4979 g_slist_foreach(list, x86_cpu_definition_entry, &cpu_list);
4984 static uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
4985 bool migratable_only)
4987 FeatureWordInfo *wi = &feature_word_info[w];
4990 if (kvm_enabled()) {
4992 case CPUID_FEATURE_WORD:
4993 r = kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid.eax,
4997 case MSR_FEATURE_WORD:
4998 r = kvm_arch_get_supported_msr_feature(kvm_state,
5002 } else if (hvf_enabled()) {
5003 if (wi->type != CPUID_FEATURE_WORD) {
5006 r = hvf_get_supported_cpuid(wi->cpuid.eax,
5009 } else if (tcg_enabled()) {
5010 r = wi->tcg_features;
5014 #ifndef TARGET_X86_64
5015 if (w == FEAT_8000_0001_EDX) {
5016 r &= ~CPUID_EXT2_LM;
5019 if (migratable_only) {
5020 r &= x86_cpu_get_migratable_flags(w);
5025 void x86_cpu_apply_props(X86CPU *cpu, PropValue *props)
5028 for (pv = props; pv->prop; pv++) {
5032 object_property_parse(OBJECT(cpu), pv->prop, pv->value,
5037 /* Apply properties for the CPU model version specified in model */
5038 static void x86_cpu_apply_version_props(X86CPU *cpu, X86CPUModel *model)
5040 const X86CPUVersionDefinition *vdef;
5041 X86CPUVersion version = x86_cpu_model_resolve_version(model);
5043 if (version == CPU_VERSION_LEGACY) {
5047 for (vdef = x86_cpu_def_get_versions(model->cpudef); vdef->version; vdef++) {
5050 for (p = vdef->props; p && p->prop; p++) {
5051 object_property_parse(OBJECT(cpu), p->prop, p->value,
5055 if (vdef->version == version) {
5061 * If we reached the end of the list, version number was invalid
5063 assert(vdef->version == version);
5066 /* Load data from X86CPUDefinition into a X86CPU object
5068 static void x86_cpu_load_model(X86CPU *cpu, X86CPUModel *model)
5070 X86CPUDefinition *def = model->cpudef;
5071 CPUX86State *env = &cpu->env;
5074 /*NOTE: any property set by this function should be returned by
5075 * x86_cpu_static_props(), so static expansion of
5076 * query-cpu-model-expansion is always complete.
5079 /* CPU models only set _minimum_ values for level/xlevel: */
5080 object_property_set_uint(OBJECT(cpu), "min-level", def->level,
5082 object_property_set_uint(OBJECT(cpu), "min-xlevel", def->xlevel,
5085 object_property_set_int(OBJECT(cpu), "family", def->family, &error_abort);
5086 object_property_set_int(OBJECT(cpu), "model", def->model, &error_abort);
5087 object_property_set_int(OBJECT(cpu), "stepping", def->stepping,
5089 object_property_set_str(OBJECT(cpu), "model-id", def->model_id,
5091 for (w = 0; w < FEATURE_WORDS; w++) {
5092 env->features[w] = def->features[w];
5095 /* legacy-cache defaults to 'off' if CPU model provides cache info */
5096 cpu->legacy_cache = !def->cache_info;
5098 env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR;
5100 /* sysenter isn't supported in compatibility mode on AMD,
5101 * syscall isn't supported in compatibility mode on Intel.
5102 * Normally we advertise the actual CPU vendor, but you can
5103 * override this using the 'vendor' property if you want to use
5104 * KVM's sysenter/syscall emulation in compatibility mode and
5105 * when doing cross vendor migration
5109 * vendor property is set here but then overloaded with the
5110 * host cpu vendor for KVM and HVF.
5112 object_property_set_str(OBJECT(cpu), "vendor", def->vendor, &error_abort);
5114 x86_cpu_apply_version_props(cpu, model);
5117 * Properties in versioned CPU model are not user specified features.
5118 * We can simply clear env->user_features here since it will be filled later
5119 * in x86_cpu_expand_features() based on plus_features and minus_features.
5121 memset(&env->user_features, 0, sizeof(env->user_features));
5124 #ifndef CONFIG_USER_ONLY
5125 /* Return a QDict containing keys for all properties that can be included
5126 * in static expansion of CPU models. All properties set by x86_cpu_load_model()
5127 * must be included in the dictionary.
5129 static QDict *x86_cpu_static_props(void)
5133 static const char *props[] = {
5151 for (i = 0; props[i]; i++) {
5152 qdict_put_null(d, props[i]);
5155 for (w = 0; w < FEATURE_WORDS; w++) {
5156 FeatureWordInfo *fi = &feature_word_info[w];
5158 for (bit = 0; bit < 64; bit++) {
5159 if (!fi->feat_names[bit]) {
5162 qdict_put_null(d, fi->feat_names[bit]);
5169 /* Add an entry to @props dict, with the value for property. */
5170 static void x86_cpu_expand_prop(X86CPU *cpu, QDict *props, const char *prop)
5172 QObject *value = object_property_get_qobject(OBJECT(cpu), prop,
5175 qdict_put_obj(props, prop, value);
5178 /* Convert CPU model data from X86CPU object to a property dictionary
5179 * that can recreate exactly the same CPU model.
5181 static void x86_cpu_to_dict(X86CPU *cpu, QDict *props)
5183 QDict *sprops = x86_cpu_static_props();
5184 const QDictEntry *e;
5186 for (e = qdict_first(sprops); e; e = qdict_next(sprops, e)) {
5187 const char *prop = qdict_entry_key(e);
5188 x86_cpu_expand_prop(cpu, props, prop);
5192 /* Convert CPU model data from X86CPU object to a property dictionary
5193 * that can recreate exactly the same CPU model, including every
5194 * writeable QOM property.
5196 static void x86_cpu_to_dict_full(X86CPU *cpu, QDict *props)
5198 ObjectPropertyIterator iter;
5199 ObjectProperty *prop;
5201 object_property_iter_init(&iter, OBJECT(cpu));
5202 while ((prop = object_property_iter_next(&iter))) {
5203 /* skip read-only or write-only properties */
5204 if (!prop->get || !prop->set) {
5208 /* "hotplugged" is the only property that is configurable
5209 * on the command-line but will be set differently on CPUs
5210 * created using "-cpu ... -smp ..." and by CPUs created
5211 * on the fly by x86_cpu_from_model() for querying. Skip it.
5213 if (!strcmp(prop->name, "hotplugged")) {
5216 x86_cpu_expand_prop(cpu, props, prop->name);
5220 static void object_apply_props(Object *obj, QDict *props, Error **errp)
5222 const QDictEntry *prop;
5224 for (prop = qdict_first(props); prop; prop = qdict_next(props, prop)) {
5225 if (!object_property_set_qobject(obj, qdict_entry_key(prop),
5226 qdict_entry_value(prop), errp)) {
5232 /* Create X86CPU object according to model+props specification */
5233 static X86CPU *x86_cpu_from_model(const char *model, QDict *props, Error **errp)
5239 xcc = X86_CPU_CLASS(cpu_class_by_name(TYPE_X86_CPU, model));
5241 error_setg(&err, "CPU model '%s' not found", model);
5245 xc = X86_CPU(object_new_with_class(OBJECT_CLASS(xcc)));
5247 object_apply_props(OBJECT(xc), props, &err);
5253 x86_cpu_expand_features(xc, &err);
5260 error_propagate(errp, err);
5261 object_unref(OBJECT(xc));
5267 CpuModelExpansionInfo *
5268 qmp_query_cpu_model_expansion(CpuModelExpansionType type,
5269 CpuModelInfo *model,
5274 CpuModelExpansionInfo *ret = g_new0(CpuModelExpansionInfo, 1);
5275 QDict *props = NULL;
5276 const char *base_name;
5278 xc = x86_cpu_from_model(model->name,
5280 qobject_to(QDict, model->props) :
5286 props = qdict_new();
5287 ret->model = g_new0(CpuModelInfo, 1);
5288 ret->model->props = QOBJECT(props);
5289 ret->model->has_props = true;
5292 case CPU_MODEL_EXPANSION_TYPE_STATIC:
5293 /* Static expansion will be based on "base" only */
5295 x86_cpu_to_dict(xc, props);
5297 case CPU_MODEL_EXPANSION_TYPE_FULL:
5298 /* As we don't return every single property, full expansion needs
5299 * to keep the original model name+props, and add extra
5300 * properties on top of that.
5302 base_name = model->name;
5303 x86_cpu_to_dict_full(xc, props);
5306 error_setg(&err, "Unsupported expansion type");
5310 x86_cpu_to_dict(xc, props);
5312 ret->model->name = g_strdup(base_name);
5315 object_unref(OBJECT(xc));
5317 error_propagate(errp, err);
5318 qapi_free_CpuModelExpansionInfo(ret);
5323 #endif /* !CONFIG_USER_ONLY */
5325 static gchar *x86_gdb_arch_name(CPUState *cs)
5327 #ifdef TARGET_X86_64
5328 return g_strdup("i386:x86-64");
5330 return g_strdup("i386");
5334 static void x86_cpu_cpudef_class_init(ObjectClass *oc, void *data)
5336 X86CPUModel *model = data;
5337 X86CPUClass *xcc = X86_CPU_CLASS(oc);
5338 CPUClass *cc = CPU_CLASS(oc);
5341 xcc->migration_safe = true;
5342 cc->deprecation_note = model->cpudef->deprecation_note;
5345 static void x86_register_cpu_model_type(const char *name, X86CPUModel *model)
5347 g_autofree char *typename = x86_cpu_type_name(name);
5350 .parent = TYPE_X86_CPU,
5351 .class_init = x86_cpu_cpudef_class_init,
5352 .class_data = model,
5358 static void x86_register_cpudef_types(X86CPUDefinition *def)
5361 const X86CPUVersionDefinition *vdef;
5363 /* AMD aliases are handled at runtime based on CPUID vendor, so
5364 * they shouldn't be set on the CPU model table.
5366 assert(!(def->features[FEAT_8000_0001_EDX] & CPUID_EXT2_AMD_ALIASES));
5367 /* catch mistakes instead of silently truncating model_id when too long */
5368 assert(def->model_id && strlen(def->model_id) <= 48);
5370 /* Unversioned model: */
5371 m = g_new0(X86CPUModel, 1);
5373 m->version = CPU_VERSION_AUTO;
5375 x86_register_cpu_model_type(def->name, m);
5377 /* Versioned models: */
5379 for (vdef = x86_cpu_def_get_versions(def); vdef->version; vdef++) {
5380 X86CPUModel *m = g_new0(X86CPUModel, 1);
5381 g_autofree char *name =
5382 x86_cpu_versioned_model_name(def, vdef->version);
5384 m->version = vdef->version;
5385 m->note = vdef->note;
5386 x86_register_cpu_model_type(name, m);
5389 X86CPUModel *am = g_new0(X86CPUModel, 1);
5391 am->version = vdef->version;
5392 am->is_alias = true;
5393 x86_register_cpu_model_type(vdef->alias, am);
5399 #if !defined(CONFIG_USER_ONLY)
5401 void cpu_clear_apic_feature(CPUX86State *env)
5403 env->features[FEAT_1_EDX] &= ~CPUID_APIC;
5406 #endif /* !CONFIG_USER_ONLY */
5408 void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
5409 uint32_t *eax, uint32_t *ebx,
5410 uint32_t *ecx, uint32_t *edx)
5412 X86CPU *cpu = env_archcpu(env);
5413 CPUState *cs = env_cpu(env);
5414 uint32_t die_offset;
5416 uint32_t signature[3];
5417 X86CPUTopoInfo topo_info;
5419 topo_info.dies_per_pkg = env->nr_dies;
5420 topo_info.cores_per_die = cs->nr_cores;
5421 topo_info.threads_per_core = cs->nr_threads;
5423 /* Calculate & apply limits for different index ranges */
5424 if (index >= 0xC0000000) {
5425 limit = env->cpuid_xlevel2;
5426 } else if (index >= 0x80000000) {
5427 limit = env->cpuid_xlevel;
5428 } else if (index >= 0x40000000) {
5431 limit = env->cpuid_level;
5434 if (index > limit) {
5435 /* Intel documentation states that invalid EAX input will
5436 * return the same information as EAX=cpuid_level
5437 * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID)
5439 index = env->cpuid_level;
5444 *eax = env->cpuid_level;
5445 *ebx = env->cpuid_vendor1;
5446 *edx = env->cpuid_vendor2;
5447 *ecx = env->cpuid_vendor3;
5450 *eax = env->cpuid_version;
5451 *ebx = (cpu->apic_id << 24) |
5452 8 << 8; /* CLFLUSH size in quad words, Linux wants it. */
5453 *ecx = env->features[FEAT_1_ECX];
5454 if ((*ecx & CPUID_EXT_XSAVE) && (env->cr[4] & CR4_OSXSAVE_MASK)) {
5455 *ecx |= CPUID_EXT_OSXSAVE;
5457 *edx = env->features[FEAT_1_EDX];
5458 if (cs->nr_cores * cs->nr_threads > 1) {
5459 *ebx |= (cs->nr_cores * cs->nr_threads) << 16;
5462 if (!cpu->enable_pmu) {
5463 *ecx &= ~CPUID_EXT_PDCM;
5467 /* cache info: needed for Pentium Pro compatibility */
5468 if (cpu->cache_info_passthrough) {
5469 host_cpuid(index, 0, eax, ebx, ecx, edx);
5472 *eax = 1; /* Number of CPUID[EAX=2] calls required */
5474 if (!cpu->enable_l3_cache) {
5477 *ecx = cpuid2_cache_descriptor(env->cache_info_cpuid2.l3_cache);
5479 *edx = (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1d_cache) << 16) |
5480 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1i_cache) << 8) |
5481 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l2_cache));
5484 /* cache info: needed for Core compatibility */
5485 if (cpu->cache_info_passthrough) {
5486 host_cpuid(index, count, eax, ebx, ecx, edx);
5487 /* QEMU gives out its own APIC IDs, never pass down bits 31..26. */
5488 *eax &= ~0xFC000000;
5489 if ((*eax & 31) && cs->nr_cores > 1) {
5490 *eax |= (cs->nr_cores - 1) << 26;
5495 case 0: /* L1 dcache info */
5496 encode_cache_cpuid4(env->cache_info_cpuid4.l1d_cache,
5498 eax, ebx, ecx, edx);
5500 case 1: /* L1 icache info */
5501 encode_cache_cpuid4(env->cache_info_cpuid4.l1i_cache,
5503 eax, ebx, ecx, edx);
5505 case 2: /* L2 cache info */
5506 encode_cache_cpuid4(env->cache_info_cpuid4.l2_cache,
5507 cs->nr_threads, cs->nr_cores,
5508 eax, ebx, ecx, edx);
5510 case 3: /* L3 cache info */
5511 die_offset = apicid_die_offset(&topo_info);
5512 if (cpu->enable_l3_cache) {
5513 encode_cache_cpuid4(env->cache_info_cpuid4.l3_cache,
5514 (1 << die_offset), cs->nr_cores,
5515 eax, ebx, ecx, edx);
5519 default: /* end of info */
5520 *eax = *ebx = *ecx = *edx = 0;
5526 /* MONITOR/MWAIT Leaf */
5527 *eax = cpu->mwait.eax; /* Smallest monitor-line size in bytes */
5528 *ebx = cpu->mwait.ebx; /* Largest monitor-line size in bytes */
5529 *ecx = cpu->mwait.ecx; /* flags */
5530 *edx = cpu->mwait.edx; /* mwait substates */
5533 /* Thermal and Power Leaf */
5534 *eax = env->features[FEAT_6_EAX];
5540 /* Structured Extended Feature Flags Enumeration Leaf */
5542 /* Maximum ECX value for sub-leaves */
5543 *eax = env->cpuid_level_func7;
5544 *ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */
5545 *ecx = env->features[FEAT_7_0_ECX]; /* Feature flags */
5546 if ((*ecx & CPUID_7_0_ECX_PKU) && env->cr[4] & CR4_PKE_MASK) {
5547 *ecx |= CPUID_7_0_ECX_OSPKE;
5549 *edx = env->features[FEAT_7_0_EDX]; /* Feature flags */
5550 } else if (count == 1) {
5551 *eax = env->features[FEAT_7_1_EAX];
5563 /* Direct Cache Access Information Leaf */
5564 *eax = 0; /* Bits 0-31 in DCA_CAP MSR */
5570 /* Architectural Performance Monitoring Leaf */
5571 if (kvm_enabled() && cpu->enable_pmu) {
5572 KVMState *s = cs->kvm_state;
5574 *eax = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EAX);
5575 *ebx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EBX);
5576 *ecx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_ECX);
5577 *edx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EDX);
5578 } else if (hvf_enabled() && cpu->enable_pmu) {
5579 *eax = hvf_get_supported_cpuid(0xA, count, R_EAX);
5580 *ebx = hvf_get_supported_cpuid(0xA, count, R_EBX);
5581 *ecx = hvf_get_supported_cpuid(0xA, count, R_ECX);
5582 *edx = hvf_get_supported_cpuid(0xA, count, R_EDX);
5591 /* Extended Topology Enumeration Leaf */
5592 if (!cpu->enable_cpuid_0xb) {
5593 *eax = *ebx = *ecx = *edx = 0;
5597 *ecx = count & 0xff;
5598 *edx = cpu->apic_id;
5602 *eax = apicid_core_offset(&topo_info);
5603 *ebx = cs->nr_threads;
5604 *ecx |= CPUID_TOPOLOGY_LEVEL_SMT;
5607 *eax = apicid_pkg_offset(&topo_info);
5608 *ebx = cs->nr_cores * cs->nr_threads;
5609 *ecx |= CPUID_TOPOLOGY_LEVEL_CORE;
5614 *ecx |= CPUID_TOPOLOGY_LEVEL_INVALID;
5617 assert(!(*eax & ~0x1f));
5618 *ebx &= 0xffff; /* The count doesn't need to be reliable. */
5621 /* V2 Extended Topology Enumeration Leaf */
5622 if (env->nr_dies < 2) {
5623 *eax = *ebx = *ecx = *edx = 0;
5627 *ecx = count & 0xff;
5628 *edx = cpu->apic_id;
5631 *eax = apicid_core_offset(&topo_info);
5632 *ebx = cs->nr_threads;
5633 *ecx |= CPUID_TOPOLOGY_LEVEL_SMT;
5636 *eax = apicid_die_offset(&topo_info);
5637 *ebx = cs->nr_cores * cs->nr_threads;
5638 *ecx |= CPUID_TOPOLOGY_LEVEL_CORE;
5641 *eax = apicid_pkg_offset(&topo_info);
5642 *ebx = env->nr_dies * cs->nr_cores * cs->nr_threads;
5643 *ecx |= CPUID_TOPOLOGY_LEVEL_DIE;
5648 *ecx |= CPUID_TOPOLOGY_LEVEL_INVALID;
5650 assert(!(*eax & ~0x1f));
5651 *ebx &= 0xffff; /* The count doesn't need to be reliable. */
5654 /* Processor Extended State */
5659 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
5664 *ecx = xsave_area_size(x86_cpu_xsave_components(cpu));
5665 *eax = env->features[FEAT_XSAVE_COMP_LO];
5666 *edx = env->features[FEAT_XSAVE_COMP_HI];
5668 * The initial value of xcr0 and ebx == 0, On host without kvm
5669 * commit 412a3c41(e.g., CentOS 6), the ebx's value always == 0
5670 * even through guest update xcr0, this will crash some legacy guest
5671 * (e.g., CentOS 6), So set ebx == ecx to workaroud it.
5673 *ebx = kvm_enabled() ? *ecx : xsave_area_size(env->xcr0);
5674 } else if (count == 1) {
5675 *eax = env->features[FEAT_XSAVE];
5676 } else if (count < ARRAY_SIZE(x86_ext_save_areas)) {
5677 if ((x86_cpu_xsave_components(cpu) >> count) & 1) {
5678 const ExtSaveArea *esa = &x86_ext_save_areas[count];
5686 /* Intel Processor Trace Enumeration */
5691 if (!(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) ||
5697 *eax = INTEL_PT_MAX_SUBLEAF;
5698 *ebx = INTEL_PT_MINIMAL_EBX;
5699 *ecx = INTEL_PT_MINIMAL_ECX;
5700 if (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP) {
5701 *ecx |= CPUID_14_0_ECX_LIP;
5703 } else if (count == 1) {
5704 *eax = INTEL_PT_MTC_BITMAP | INTEL_PT_ADDR_RANGES_NUM;
5705 *ebx = INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP;
5711 * CPUID code in kvm_arch_init_vcpu() ignores stuff
5712 * set here, but we restrict to TCG none the less.
5714 if (tcg_enabled() && cpu->expose_tcg) {
5715 memcpy(signature, "TCGTCGTCGTCG", 12);
5717 *ebx = signature[0];
5718 *ecx = signature[1];
5719 *edx = signature[2];
5734 *eax = env->cpuid_xlevel;
5735 *ebx = env->cpuid_vendor1;
5736 *edx = env->cpuid_vendor2;
5737 *ecx = env->cpuid_vendor3;
5740 *eax = env->cpuid_version;
5742 *ecx = env->features[FEAT_8000_0001_ECX];
5743 *edx = env->features[FEAT_8000_0001_EDX];
5745 /* The Linux kernel checks for the CMPLegacy bit and
5746 * discards multiple thread information if it is set.
5747 * So don't set it here for Intel to make Linux guests happy.
5749 if (cs->nr_cores * cs->nr_threads > 1) {
5750 if (env->cpuid_vendor1 != CPUID_VENDOR_INTEL_1 ||
5751 env->cpuid_vendor2 != CPUID_VENDOR_INTEL_2 ||
5752 env->cpuid_vendor3 != CPUID_VENDOR_INTEL_3) {
5753 *ecx |= 1 << 1; /* CmpLegacy bit */
5760 *eax = env->cpuid_model[(index - 0x80000002) * 4 + 0];
5761 *ebx = env->cpuid_model[(index - 0x80000002) * 4 + 1];
5762 *ecx = env->cpuid_model[(index - 0x80000002) * 4 + 2];
5763 *edx = env->cpuid_model[(index - 0x80000002) * 4 + 3];
5766 /* cache info (L1 cache) */
5767 if (cpu->cache_info_passthrough) {
5768 host_cpuid(index, 0, eax, ebx, ecx, edx);
5771 *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) |
5772 (L1_ITLB_2M_ASSOC << 8) | (L1_ITLB_2M_ENTRIES);
5773 *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) |
5774 (L1_ITLB_4K_ASSOC << 8) | (L1_ITLB_4K_ENTRIES);
5775 *ecx = encode_cache_cpuid80000005(env->cache_info_amd.l1d_cache);
5776 *edx = encode_cache_cpuid80000005(env->cache_info_amd.l1i_cache);
5779 /* cache info (L2 cache) */
5780 if (cpu->cache_info_passthrough) {
5781 host_cpuid(index, 0, eax, ebx, ecx, edx);
5784 *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) |
5785 (L2_DTLB_2M_ENTRIES << 16) |
5786 (AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) |
5787 (L2_ITLB_2M_ENTRIES);
5788 *ebx = (AMD_ENC_ASSOC(L2_DTLB_4K_ASSOC) << 28) |
5789 (L2_DTLB_4K_ENTRIES << 16) |
5790 (AMD_ENC_ASSOC(L2_ITLB_4K_ASSOC) << 12) |
5791 (L2_ITLB_4K_ENTRIES);
5792 encode_cache_cpuid80000006(env->cache_info_amd.l2_cache,
5793 cpu->enable_l3_cache ?
5794 env->cache_info_amd.l3_cache : NULL,
5801 *edx = env->features[FEAT_8000_0007_EDX];
5804 /* virtual & phys address size in low 2 bytes. */
5805 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
5806 /* 64 bit processor */
5807 *eax = cpu->phys_bits; /* configurable physical bits */
5808 if (env->features[FEAT_7_0_ECX] & CPUID_7_0_ECX_LA57) {
5809 *eax |= 0x00003900; /* 57 bits virtual */
5811 *eax |= 0x00003000; /* 48 bits virtual */
5814 *eax = cpu->phys_bits;
5816 *ebx = env->features[FEAT_8000_0008_EBX];
5817 if (cs->nr_cores * cs->nr_threads > 1) {
5819 * Bits 15:12 is "The number of bits in the initial
5820 * Core::X86::Apic::ApicId[ApicId] value that indicate
5821 * thread ID within a package".
5822 * Bits 7:0 is "The number of threads in the package is NC+1"
5824 *ecx = (apicid_pkg_offset(&topo_info) << 12) |
5825 ((cs->nr_cores * cs->nr_threads) - 1);
5832 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
5833 *eax = 0x00000001; /* SVM Revision */
5834 *ebx = 0x00000010; /* nr of ASIDs */
5836 *edx = env->features[FEAT_SVM]; /* optional features */
5846 if (cpu->cache_info_passthrough) {
5847 host_cpuid(index, count, eax, ebx, ecx, edx);
5851 case 0: /* L1 dcache info */
5852 encode_cache_cpuid8000001d(env->cache_info_amd.l1d_cache,
5853 &topo_info, eax, ebx, ecx, edx);
5855 case 1: /* L1 icache info */
5856 encode_cache_cpuid8000001d(env->cache_info_amd.l1i_cache,
5857 &topo_info, eax, ebx, ecx, edx);
5859 case 2: /* L2 cache info */
5860 encode_cache_cpuid8000001d(env->cache_info_amd.l2_cache,
5861 &topo_info, eax, ebx, ecx, edx);
5863 case 3: /* L3 cache info */
5864 encode_cache_cpuid8000001d(env->cache_info_amd.l3_cache,
5865 &topo_info, eax, ebx, ecx, edx);
5867 default: /* end of info */
5868 *eax = *ebx = *ecx = *edx = 0;
5873 if (cpu->core_id <= 255) {
5874 encode_topo_cpuid8000001e(cpu, &topo_info, eax, ebx, ecx, edx);
5883 *eax = env->cpuid_xlevel2;
5889 /* Support for VIA CPU's CPUID instruction */
5890 *eax = env->cpuid_version;
5893 *edx = env->features[FEAT_C000_0001_EDX];
5898 /* Reserved for the future, and now filled with zero */
5905 *eax = sev_enabled() ? 0x2 : 0;
5906 *eax |= sev_es_enabled() ? 0x8 : 0;
5907 *ebx = sev_get_cbit_position();
5908 *ebx |= sev_get_reduced_phys_bits() << 6;
5913 /* reserved values: zero */
5922 static void x86_cpu_reset(DeviceState *dev)
5924 CPUState *s = CPU(dev);
5925 X86CPU *cpu = X86_CPU(s);
5926 X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu);
5927 CPUX86State *env = &cpu->env;
5932 xcc->parent_reset(dev);
5934 memset(env, 0, offsetof(CPUX86State, end_reset_fields));
5936 env->old_exception = -1;
5938 /* init to reset state */
5940 env->hflags2 |= HF2_GIF_MASK;
5941 env->hflags &= ~HF_GUEST_MASK;
5943 cpu_x86_update_cr0(env, 0x60000010);
5944 env->a20_mask = ~0x0;
5945 env->smbase = 0x30000;
5946 env->msr_smi_count = 0;
5948 env->idt.limit = 0xffff;
5949 env->gdt.limit = 0xffff;
5950 env->ldt.limit = 0xffff;
5951 env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT);
5952 env->tr.limit = 0xffff;
5953 env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT);
5955 cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff,
5956 DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK |
5957 DESC_R_MASK | DESC_A_MASK);
5958 cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff,
5959 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
5961 cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff,
5962 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
5964 cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff,
5965 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
5967 cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff,
5968 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
5970 cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff,
5971 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
5975 env->regs[R_EDX] = env->cpuid_version;
5980 for (i = 0; i < 8; i++) {
5983 cpu_set_fpuc(env, 0x37f);
5985 env->mxcsr = 0x1f80;
5986 /* All units are in INIT state. */
5989 env->pat = 0x0007040600070406ULL;
5990 env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT;
5991 if (env->features[FEAT_1_ECX] & CPUID_EXT_MONITOR) {
5992 env->msr_ia32_misc_enable |= MSR_IA32_MISC_ENABLE_MWAIT;
5995 memset(env->dr, 0, sizeof(env->dr));
5996 env->dr[6] = DR6_FIXED_1;
5997 env->dr[7] = DR7_FIXED_1;
5998 cpu_breakpoint_remove_all(s, BP_CPU);
5999 cpu_watchpoint_remove_all(s, BP_CPU);
6002 xcr0 = XSTATE_FP_MASK;
6004 #ifdef CONFIG_USER_ONLY
6005 /* Enable all the features for user-mode. */
6006 if (env->features[FEAT_1_EDX] & CPUID_SSE) {
6007 xcr0 |= XSTATE_SSE_MASK;
6009 for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
6010 const ExtSaveArea *esa = &x86_ext_save_areas[i];
6011 if (env->features[esa->feature] & esa->bits) {
6016 if (env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE) {
6017 cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK;
6019 if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_FSGSBASE) {
6020 cr4 |= CR4_FSGSBASE_MASK;
6025 cpu_x86_update_cr4(env, cr4);
6028 * SDM 11.11.5 requires:
6029 * - IA32_MTRR_DEF_TYPE MSR.E = 0
6030 * - IA32_MTRR_PHYSMASKn.V = 0
6031 * All other bits are undefined. For simplification, zero it all.
6033 env->mtrr_deftype = 0;
6034 memset(env->mtrr_var, 0, sizeof(env->mtrr_var));
6035 memset(env->mtrr_fixed, 0, sizeof(env->mtrr_fixed));
6037 env->interrupt_injected = -1;
6038 env->exception_nr = -1;
6039 env->exception_pending = 0;
6040 env->exception_injected = 0;
6041 env->exception_has_payload = false;
6042 env->exception_payload = 0;
6043 env->nmi_injected = false;
6044 #if !defined(CONFIG_USER_ONLY)
6045 /* We hard-wire the BSP to the first CPU. */
6046 apic_designate_bsp(cpu->apic_state, s->cpu_index == 0);
6048 s->halted = !cpu_is_bsp(cpu);
6050 if (kvm_enabled()) {
6051 kvm_arch_reset_vcpu(cpu);
6056 #ifndef CONFIG_USER_ONLY
6057 bool cpu_is_bsp(X86CPU *cpu)
6059 return cpu_get_apic_base(cpu->apic_state) & MSR_IA32_APICBASE_BSP;
6062 /* TODO: remove me, when reset over QOM tree is implemented */
6063 static void x86_cpu_machine_reset_cb(void *opaque)
6065 X86CPU *cpu = opaque;
6066 cpu_reset(CPU(cpu));
6070 static void mce_init(X86CPU *cpu)
6072 CPUX86State *cenv = &cpu->env;
6075 if (((cenv->cpuid_version >> 8) & 0xf) >= 6
6076 && (cenv->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) ==
6077 (CPUID_MCE | CPUID_MCA)) {
6078 cenv->mcg_cap = MCE_CAP_DEF | MCE_BANKS_DEF |
6079 (cpu->enable_lmce ? MCG_LMCE_P : 0);
6080 cenv->mcg_ctl = ~(uint64_t)0;
6081 for (bank = 0; bank < MCE_BANKS_DEF; bank++) {
6082 cenv->mce_banks[bank * 4] = ~(uint64_t)0;
6087 #ifndef CONFIG_USER_ONLY
6088 APICCommonClass *apic_get_class(void)
6090 const char *apic_type = "apic";
6092 /* TODO: in-kernel irqchip for hvf */
6093 if (kvm_apic_in_kernel()) {
6094 apic_type = "kvm-apic";
6095 } else if (xen_enabled()) {
6096 apic_type = "xen-apic";
6097 } else if (whpx_apic_in_platform()) {
6098 apic_type = "whpx-apic";
6101 return APIC_COMMON_CLASS(object_class_by_name(apic_type));
6104 static void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
6106 APICCommonState *apic;
6107 ObjectClass *apic_class = OBJECT_CLASS(apic_get_class());
6109 cpu->apic_state = DEVICE(object_new_with_class(apic_class));
6111 object_property_add_child(OBJECT(cpu), "lapic",
6112 OBJECT(cpu->apic_state));
6113 object_unref(OBJECT(cpu->apic_state));
6115 qdev_prop_set_uint32(cpu->apic_state, "id", cpu->apic_id);
6116 /* TODO: convert to link<> */
6117 apic = APIC_COMMON(cpu->apic_state);
6119 apic->apicbase = APIC_DEFAULT_ADDRESS | MSR_IA32_APICBASE_ENABLE;
6122 static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
6124 APICCommonState *apic;
6125 static bool apic_mmio_map_once;
6127 if (cpu->apic_state == NULL) {
6130 qdev_realize(DEVICE(cpu->apic_state), NULL, errp);
6132 /* Map APIC MMIO area */
6133 apic = APIC_COMMON(cpu->apic_state);
6134 if (!apic_mmio_map_once) {
6135 memory_region_add_subregion_overlap(get_system_memory(),
6137 MSR_IA32_APICBASE_BASE,
6140 apic_mmio_map_once = true;
6144 static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
6149 static void x86_cpu_adjust_level(X86CPU *cpu, uint32_t *min, uint32_t value)
6156 /* Increase cpuid_min_{level,xlevel,xlevel2} automatically, if appropriate */
6157 static void x86_cpu_adjust_feat_level(X86CPU *cpu, FeatureWord w)
6159 CPUX86State *env = &cpu->env;
6160 FeatureWordInfo *fi = &feature_word_info[w];
6161 uint32_t eax = fi->cpuid.eax;
6162 uint32_t region = eax & 0xF0000000;
6164 assert(feature_word_info[w].type == CPUID_FEATURE_WORD);
6165 if (!env->features[w]) {
6171 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, eax);
6174 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, eax);
6177 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel2, eax);
6182 x86_cpu_adjust_level(cpu, &env->cpuid_min_level_func7,
6187 /* Calculate XSAVE components based on the configured CPU feature flags */
6188 static void x86_cpu_enable_xsave_components(X86CPU *cpu)
6190 CPUX86State *env = &cpu->env;
6194 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
6195 env->features[FEAT_XSAVE_COMP_LO] = 0;
6196 env->features[FEAT_XSAVE_COMP_HI] = 0;
6201 for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
6202 const ExtSaveArea *esa = &x86_ext_save_areas[i];
6203 if (env->features[esa->feature] & esa->bits) {
6204 mask |= (1ULL << i);
6208 env->features[FEAT_XSAVE_COMP_LO] = mask;
6209 env->features[FEAT_XSAVE_COMP_HI] = mask >> 32;
6212 /***** Steps involved on loading and filtering CPUID data
6214 * When initializing and realizing a CPU object, the steps
6215 * involved in setting up CPUID data are:
6217 * 1) Loading CPU model definition (X86CPUDefinition). This is
6218 * implemented by x86_cpu_load_model() and should be completely
6219 * transparent, as it is done automatically by instance_init.
6220 * No code should need to look at X86CPUDefinition structs
6221 * outside instance_init.
6223 * 2) CPU expansion. This is done by realize before CPUID
6224 * filtering, and will make sure host/accelerator data is
6225 * loaded for CPU models that depend on host capabilities
6226 * (e.g. "host"). Done by x86_cpu_expand_features().
6228 * 3) CPUID filtering. This initializes extra data related to
6229 * CPUID, and checks if the host supports all capabilities
6230 * required by the CPU. Runnability of a CPU model is
6231 * determined at this step. Done by x86_cpu_filter_features().
6233 * Some operations don't require all steps to be performed.
6236 * - CPU instance creation (instance_init) will run only CPU
6237 * model loading. CPU expansion can't run at instance_init-time
6238 * because host/accelerator data may be not available yet.
6239 * - CPU realization will perform both CPU model expansion and CPUID
6240 * filtering, and return an error in case one of them fails.
6241 * - query-cpu-definitions needs to run all 3 steps. It needs
6242 * to run CPUID filtering, as the 'unavailable-features'
6243 * field is set based on the filtering results.
6244 * - The query-cpu-model-expansion QMP command only needs to run
6245 * CPU model loading and CPU expansion. It should not filter
6246 * any CPUID data based on host capabilities.
6249 /* Expand CPU configuration data, based on configured features
6250 * and host/accelerator capabilities when appropriate.
6252 static void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
6254 CPUX86State *env = &cpu->env;
6259 for (l = plus_features; l; l = l->next) {
6260 const char *prop = l->data;
6261 if (!object_property_set_bool(OBJECT(cpu), prop, true, errp)) {
6266 for (l = minus_features; l; l = l->next) {
6267 const char *prop = l->data;
6268 if (!object_property_set_bool(OBJECT(cpu), prop, false, errp)) {
6273 /*TODO: Now cpu->max_features doesn't overwrite features
6274 * set using QOM properties, and we can convert
6275 * plus_features & minus_features to global properties
6276 * inside x86_cpu_parse_featurestr() too.
6278 if (cpu->max_features) {
6279 for (w = 0; w < FEATURE_WORDS; w++) {
6280 /* Override only features that weren't set explicitly
6284 x86_cpu_get_supported_feature_word(w, cpu->migratable) &
6285 ~env->user_features[w] &
6286 ~feature_word_info[w].no_autoenable_flags;
6290 for (i = 0; i < ARRAY_SIZE(feature_dependencies); i++) {
6291 FeatureDep *d = &feature_dependencies[i];
6292 if (!(env->features[d->from.index] & d->from.mask)) {
6293 uint64_t unavailable_features = env->features[d->to.index] & d->to.mask;
6295 /* Not an error unless the dependent feature was added explicitly. */
6296 mark_unavailable_features(cpu, d->to.index,
6297 unavailable_features & env->user_features[d->to.index],
6298 "This feature depends on other features that were not requested");
6300 env->features[d->to.index] &= ~unavailable_features;
6304 if (!kvm_enabled() || !cpu->expose_kvm) {
6305 env->features[FEAT_KVM] = 0;
6308 x86_cpu_enable_xsave_components(cpu);
6310 /* CPUID[EAX=7,ECX=0].EBX always increased level automatically: */
6311 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_EBX);
6312 if (cpu->full_cpuid_auto_level) {
6313 x86_cpu_adjust_feat_level(cpu, FEAT_1_EDX);
6314 x86_cpu_adjust_feat_level(cpu, FEAT_1_ECX);
6315 x86_cpu_adjust_feat_level(cpu, FEAT_6_EAX);
6316 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_ECX);
6317 x86_cpu_adjust_feat_level(cpu, FEAT_7_1_EAX);
6318 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_EDX);
6319 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_ECX);
6320 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0007_EDX);
6321 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0008_EBX);
6322 x86_cpu_adjust_feat_level(cpu, FEAT_C000_0001_EDX);
6323 x86_cpu_adjust_feat_level(cpu, FEAT_SVM);
6324 x86_cpu_adjust_feat_level(cpu, FEAT_XSAVE);
6326 /* Intel Processor Trace requires CPUID[0x14] */
6327 if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT)) {
6328 if (cpu->intel_pt_auto_level) {
6329 x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14);
6330 } else if (cpu->env.cpuid_min_level < 0x14) {
6331 mark_unavailable_features(cpu, FEAT_7_0_EBX,
6332 CPUID_7_0_EBX_INTEL_PT,
6333 "Intel PT need CPUID leaf 0x14, please set by \"-cpu ...,intel-pt=on,min-level=0x14\"");
6337 /* CPU topology with multi-dies support requires CPUID[0x1F] */
6338 if (env->nr_dies > 1) {
6339 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x1F);
6342 /* SVM requires CPUID[0x8000000A] */
6343 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
6344 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000000A);
6347 /* SEV requires CPUID[0x8000001F] */
6348 if (sev_enabled()) {
6349 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000001F);
6353 /* Set cpuid_*level* based on cpuid_min_*level, if not explicitly set */
6354 if (env->cpuid_level_func7 == UINT32_MAX) {
6355 env->cpuid_level_func7 = env->cpuid_min_level_func7;
6357 if (env->cpuid_level == UINT32_MAX) {
6358 env->cpuid_level = env->cpuid_min_level;
6360 if (env->cpuid_xlevel == UINT32_MAX) {
6361 env->cpuid_xlevel = env->cpuid_min_xlevel;
6363 if (env->cpuid_xlevel2 == UINT32_MAX) {
6364 env->cpuid_xlevel2 = env->cpuid_min_xlevel2;
6369 * Finishes initialization of CPUID data, filters CPU feature
6370 * words based on host availability of each feature.
6372 * Returns: 0 if all flags are supported by the host, non-zero otherwise.
6374 static void x86_cpu_filter_features(X86CPU *cpu, bool verbose)
6376 CPUX86State *env = &cpu->env;
6378 const char *prefix = NULL;
6381 prefix = accel_uses_host_cpuid()
6382 ? "host doesn't support requested feature"
6383 : "TCG doesn't support requested feature";
6386 for (w = 0; w < FEATURE_WORDS; w++) {
6387 uint64_t host_feat =
6388 x86_cpu_get_supported_feature_word(w, false);
6389 uint64_t requested_features = env->features[w];
6390 uint64_t unavailable_features = requested_features & ~host_feat;
6391 mark_unavailable_features(cpu, w, unavailable_features, prefix);
6394 if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) &&
6396 KVMState *s = CPU(cpu)->kvm_state;
6397 uint32_t eax_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EAX);
6398 uint32_t ebx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EBX);
6399 uint32_t ecx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_ECX);
6400 uint32_t eax_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EAX);
6401 uint32_t ebx_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EBX);
6404 ((ebx_0 & INTEL_PT_MINIMAL_EBX) != INTEL_PT_MINIMAL_EBX) ||
6405 ((ecx_0 & INTEL_PT_MINIMAL_ECX) != INTEL_PT_MINIMAL_ECX) ||
6406 ((eax_1 & INTEL_PT_MTC_BITMAP) != INTEL_PT_MTC_BITMAP) ||
6407 ((eax_1 & INTEL_PT_ADDR_RANGES_NUM_MASK) <
6408 INTEL_PT_ADDR_RANGES_NUM) ||
6409 ((ebx_1 & (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) !=
6410 (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) ||
6411 ((ecx_0 & CPUID_14_0_ECX_LIP) !=
6412 (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP))) {
6414 * Processor Trace capabilities aren't configurable, so if the
6415 * host can't emulate the capabilities we report on
6416 * cpu_x86_cpuid(), intel-pt can't be enabled on the current host.
6418 mark_unavailable_features(cpu, FEAT_7_0_EBX, CPUID_7_0_EBX_INTEL_PT, prefix);
6423 static void x86_cpu_hyperv_realize(X86CPU *cpu)
6427 /* Hyper-V vendor id */
6428 if (!cpu->hyperv_vendor) {
6429 memcpy(cpu->hyperv_vendor_id, "Microsoft Hv", 12);
6431 len = strlen(cpu->hyperv_vendor);
6434 warn_report("hv-vendor-id truncated to 12 characters");
6437 memset(cpu->hyperv_vendor_id, 0, 12);
6438 memcpy(cpu->hyperv_vendor_id, cpu->hyperv_vendor, len);
6441 /* 'Hv#1' interface identification*/
6442 cpu->hyperv_interface_id[0] = 0x31237648;
6443 cpu->hyperv_interface_id[1] = 0;
6444 cpu->hyperv_interface_id[2] = 0;
6445 cpu->hyperv_interface_id[3] = 0;
6447 /* Hypervisor system identity */
6448 cpu->hyperv_version_id[0] = 0x00001bbc;
6449 cpu->hyperv_version_id[1] = 0x00060001;
6451 /* Hypervisor implementation limits */
6452 cpu->hyperv_limits[0] = 64;
6453 cpu->hyperv_limits[1] = 0;
6454 cpu->hyperv_limits[2] = 0;
6457 static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
6459 CPUState *cs = CPU(dev);
6460 X86CPU *cpu = X86_CPU(dev);
6461 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
6462 CPUX86State *env = &cpu->env;
6463 Error *local_err = NULL;
6464 static bool ht_warned;
6466 /* Process Hyper-V enlightenments */
6467 x86_cpu_hyperv_realize(cpu);
6469 cpu_exec_realizefn(cs, &local_err);
6470 if (local_err != NULL) {
6471 error_propagate(errp, local_err);
6475 if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
6476 g_autofree char *name = x86_cpu_class_get_model_name(xcc);
6477 error_setg(&local_err, "CPU model '%s' requires KVM or HVF", name);
6481 if (cpu->ucode_rev == 0) {
6482 /* The default is the same as KVM's. */
6483 if (IS_AMD_CPU(env)) {
6484 cpu->ucode_rev = 0x01000065;
6486 cpu->ucode_rev = 0x100000000ULL;
6490 /* mwait extended info: needed for Core compatibility */
6491 /* We always wake on interrupt even if host does not have the capability */
6492 cpu->mwait.ecx |= CPUID_MWAIT_EMX | CPUID_MWAIT_IBE;
6494 if (cpu->apic_id == UNASSIGNED_APIC_ID) {
6495 error_setg(errp, "apic-id property was not initialized properly");
6499 x86_cpu_expand_features(cpu, &local_err);
6504 x86_cpu_filter_features(cpu, cpu->check_cpuid || cpu->enforce_cpuid);
6506 if (cpu->enforce_cpuid && x86_cpu_have_filtered_features(cpu)) {
6507 error_setg(&local_err,
6508 accel_uses_host_cpuid() ?
6509 "Host doesn't support requested features" :
6510 "TCG doesn't support requested features");
6514 /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on
6517 if (IS_AMD_CPU(env)) {
6518 env->features[FEAT_8000_0001_EDX] &= ~CPUID_EXT2_AMD_ALIASES;
6519 env->features[FEAT_8000_0001_EDX] |= (env->features[FEAT_1_EDX]
6520 & CPUID_EXT2_AMD_ALIASES);
6523 /* For 64bit systems think about the number of physical bits to present.
6524 * ideally this should be the same as the host; anything other than matching
6525 * the host can cause incorrect guest behaviour.
6526 * QEMU used to pick the magic value of 40 bits that corresponds to
6527 * consumer AMD devices but nothing else.
6529 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
6530 if (cpu->phys_bits &&
6531 (cpu->phys_bits > TARGET_PHYS_ADDR_SPACE_BITS ||
6532 cpu->phys_bits < 32)) {
6533 error_setg(errp, "phys-bits should be between 32 and %u "
6535 TARGET_PHYS_ADDR_SPACE_BITS, cpu->phys_bits);
6539 * 0 means it was not explicitly set by the user (or by machine
6540 * compat_props or by the host code in host-cpu.c).
6541 * In this case, the default is the value used by TCG (40).
6543 if (cpu->phys_bits == 0) {
6544 cpu->phys_bits = TCG_PHYS_ADDR_BITS;
6547 /* For 32 bit systems don't use the user set value, but keep
6548 * phys_bits consistent with what we tell the guest.
6550 if (cpu->phys_bits != 0) {
6551 error_setg(errp, "phys-bits is not user-configurable in 32 bit");
6555 if (env->features[FEAT_1_EDX] & CPUID_PSE36) {
6556 cpu->phys_bits = 36;
6558 cpu->phys_bits = 32;
6562 /* Cache information initialization */
6563 if (!cpu->legacy_cache) {
6564 if (!xcc->model || !xcc->model->cpudef->cache_info) {
6565 g_autofree char *name = x86_cpu_class_get_model_name(xcc);
6567 "CPU model '%s' doesn't support legacy-cache=off", name);
6570 env->cache_info_cpuid2 = env->cache_info_cpuid4 = env->cache_info_amd =
6571 *xcc->model->cpudef->cache_info;
6573 /* Build legacy cache information */
6574 env->cache_info_cpuid2.l1d_cache = &legacy_l1d_cache;
6575 env->cache_info_cpuid2.l1i_cache = &legacy_l1i_cache;
6576 env->cache_info_cpuid2.l2_cache = &legacy_l2_cache_cpuid2;
6577 env->cache_info_cpuid2.l3_cache = &legacy_l3_cache;
6579 env->cache_info_cpuid4.l1d_cache = &legacy_l1d_cache;
6580 env->cache_info_cpuid4.l1i_cache = &legacy_l1i_cache;
6581 env->cache_info_cpuid4.l2_cache = &legacy_l2_cache;
6582 env->cache_info_cpuid4.l3_cache = &legacy_l3_cache;
6584 env->cache_info_amd.l1d_cache = &legacy_l1d_cache_amd;
6585 env->cache_info_amd.l1i_cache = &legacy_l1i_cache_amd;
6586 env->cache_info_amd.l2_cache = &legacy_l2_cache_amd;
6587 env->cache_info_amd.l3_cache = &legacy_l3_cache;
6590 #ifndef CONFIG_USER_ONLY
6591 MachineState *ms = MACHINE(qdev_get_machine());
6592 qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
6594 if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || ms->smp.cpus > 1) {
6595 x86_cpu_apic_create(cpu, &local_err);
6596 if (local_err != NULL) {
6607 * Most Intel and certain AMD CPUs support hyperthreading. Even though QEMU
6608 * fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
6609 * based on inputs (sockets,cores,threads), it is still better to give
6612 * NOTE: the following code has to follow qemu_init_vcpu(). Otherwise
6613 * cs->nr_threads hasn't be populated yet and the checking is incorrect.
6615 if (IS_AMD_CPU(env) &&
6616 !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
6617 cs->nr_threads > 1 && !ht_warned) {
6618 warn_report("This family of AMD CPU doesn't support "
6619 "hyperthreading(%d)",
6621 error_printf("Please configure -smp options properly"
6622 " or try enabling topoext feature.\n");
6626 x86_cpu_apic_realize(cpu, &local_err);
6627 if (local_err != NULL) {
6632 xcc->parent_realize(dev, &local_err);
6635 if (local_err != NULL) {
6636 error_propagate(errp, local_err);
6641 static void x86_cpu_unrealizefn(DeviceState *dev)
6643 X86CPU *cpu = X86_CPU(dev);
6644 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
6646 #ifndef CONFIG_USER_ONLY
6647 cpu_remove_sync(CPU(dev));
6648 qemu_unregister_reset(x86_cpu_machine_reset_cb, dev);
6651 if (cpu->apic_state) {
6652 object_unparent(OBJECT(cpu->apic_state));
6653 cpu->apic_state = NULL;
6656 xcc->parent_unrealize(dev);
6659 typedef struct BitProperty {
6664 static void x86_cpu_get_bit_prop(Object *obj, Visitor *v, const char *name,
6665 void *opaque, Error **errp)
6667 X86CPU *cpu = X86_CPU(obj);
6668 BitProperty *fp = opaque;
6669 uint64_t f = cpu->env.features[fp->w];
6670 bool value = (f & fp->mask) == fp->mask;
6671 visit_type_bool(v, name, &value, errp);
6674 static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
6675 void *opaque, Error **errp)
6677 DeviceState *dev = DEVICE(obj);
6678 X86CPU *cpu = X86_CPU(obj);
6679 BitProperty *fp = opaque;
6682 if (dev->realized) {
6683 qdev_prop_set_after_realize(dev, name, errp);
6687 if (!visit_type_bool(v, name, &value, errp)) {
6692 cpu->env.features[fp->w] |= fp->mask;
6694 cpu->env.features[fp->w] &= ~fp->mask;
6696 cpu->env.user_features[fp->w] |= fp->mask;
6699 /* Register a boolean property to get/set a single bit in a uint32_t field.
6701 * The same property name can be registered multiple times to make it affect
6702 * multiple bits in the same FeatureWord. In that case, the getter will return
6703 * true only if all bits are set.
6705 static void x86_cpu_register_bit_prop(X86CPUClass *xcc,
6706 const char *prop_name,
6710 ObjectClass *oc = OBJECT_CLASS(xcc);
6713 uint64_t mask = (1ULL << bitnr);
6715 op = object_class_property_find(oc, prop_name);
6721 fp = g_new0(BitProperty, 1);
6724 object_class_property_add(oc, prop_name, "bool",
6725 x86_cpu_get_bit_prop,
6726 x86_cpu_set_bit_prop,
6731 static void x86_cpu_register_feature_bit_props(X86CPUClass *xcc,
6735 FeatureWordInfo *fi = &feature_word_info[w];
6736 const char *name = fi->feat_names[bitnr];
6742 /* Property names should use "-" instead of "_".
6743 * Old names containing underscores are registered as aliases
6744 * using object_property_add_alias()
6746 assert(!strchr(name, '_'));
6747 /* aliases don't use "|" delimiters anymore, they are registered
6748 * manually using object_property_add_alias() */
6749 assert(!strchr(name, '|'));
6750 x86_cpu_register_bit_prop(xcc, name, w, bitnr);
6753 #if !defined(CONFIG_USER_ONLY)
6754 static GuestPanicInformation *x86_cpu_get_crash_info(CPUState *cs)
6756 X86CPU *cpu = X86_CPU(cs);
6757 CPUX86State *env = &cpu->env;
6758 GuestPanicInformation *panic_info = NULL;
6760 if (env->features[FEAT_HYPERV_EDX] & HV_GUEST_CRASH_MSR_AVAILABLE) {
6761 panic_info = g_malloc0(sizeof(GuestPanicInformation));
6763 panic_info->type = GUEST_PANIC_INFORMATION_TYPE_HYPER_V;
6765 assert(HV_CRASH_PARAMS >= 5);
6766 panic_info->u.hyper_v.arg1 = env->msr_hv_crash_params[0];
6767 panic_info->u.hyper_v.arg2 = env->msr_hv_crash_params[1];
6768 panic_info->u.hyper_v.arg3 = env->msr_hv_crash_params[2];
6769 panic_info->u.hyper_v.arg4 = env->msr_hv_crash_params[3];
6770 panic_info->u.hyper_v.arg5 = env->msr_hv_crash_params[4];
6775 static void x86_cpu_get_crash_info_qom(Object *obj, Visitor *v,
6776 const char *name, void *opaque,
6779 CPUState *cs = CPU(obj);
6780 GuestPanicInformation *panic_info;
6782 if (!cs->crash_occurred) {
6783 error_setg(errp, "No crash occurred");
6787 panic_info = x86_cpu_get_crash_info(cs);
6788 if (panic_info == NULL) {
6789 error_setg(errp, "No crash information");
6793 visit_type_GuestPanicInformation(v, "crash-information", &panic_info,
6795 qapi_free_GuestPanicInformation(panic_info);
6797 #endif /* !CONFIG_USER_ONLY */
6799 static void x86_cpu_initfn(Object *obj)
6801 X86CPU *cpu = X86_CPU(obj);
6802 X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
6803 CPUClass *cc = CPU_CLASS(xcc);
6805 CPUX86State *env = &cpu->env;
6808 cpu_set_cpustate_pointers(cpu);
6810 object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo",
6811 x86_cpu_get_feature_words,
6812 NULL, NULL, (void *)env->features);
6813 object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo",
6814 x86_cpu_get_feature_words,
6815 NULL, NULL, (void *)cpu->filtered_features);
6817 object_property_add_alias(obj, "sse3", obj, "pni");
6818 object_property_add_alias(obj, "pclmuldq", obj, "pclmulqdq");
6819 object_property_add_alias(obj, "sse4-1", obj, "sse4.1");
6820 object_property_add_alias(obj, "sse4-2", obj, "sse4.2");
6821 object_property_add_alias(obj, "xd", obj, "nx");
6822 object_property_add_alias(obj, "ffxsr", obj, "fxsr-opt");
6823 object_property_add_alias(obj, "i64", obj, "lm");
6825 object_property_add_alias(obj, "ds_cpl", obj, "ds-cpl");
6826 object_property_add_alias(obj, "tsc_adjust", obj, "tsc-adjust");
6827 object_property_add_alias(obj, "fxsr_opt", obj, "fxsr-opt");
6828 object_property_add_alias(obj, "lahf_lm", obj, "lahf-lm");
6829 object_property_add_alias(obj, "cmp_legacy", obj, "cmp-legacy");
6830 object_property_add_alias(obj, "nodeid_msr", obj, "nodeid-msr");
6831 object_property_add_alias(obj, "perfctr_core", obj, "perfctr-core");
6832 object_property_add_alias(obj, "perfctr_nb", obj, "perfctr-nb");
6833 object_property_add_alias(obj, "kvm_nopiodelay", obj, "kvm-nopiodelay");
6834 object_property_add_alias(obj, "kvm_mmu", obj, "kvm-mmu");
6835 object_property_add_alias(obj, "kvm_asyncpf", obj, "kvm-asyncpf");
6836 object_property_add_alias(obj, "kvm_asyncpf_int", obj, "kvm-asyncpf-int");
6837 object_property_add_alias(obj, "kvm_steal_time", obj, "kvm-steal-time");
6838 object_property_add_alias(obj, "kvm_pv_eoi", obj, "kvm-pv-eoi");
6839 object_property_add_alias(obj, "kvm_pv_unhalt", obj, "kvm-pv-unhalt");
6840 object_property_add_alias(obj, "kvm_poll_control", obj, "kvm-poll-control");
6841 object_property_add_alias(obj, "svm_lock", obj, "svm-lock");
6842 object_property_add_alias(obj, "nrip_save", obj, "nrip-save");
6843 object_property_add_alias(obj, "tsc_scale", obj, "tsc-scale");
6844 object_property_add_alias(obj, "vmcb_clean", obj, "vmcb-clean");
6845 object_property_add_alias(obj, "pause_filter", obj, "pause-filter");
6846 object_property_add_alias(obj, "sse4_1", obj, "sse4.1");
6847 object_property_add_alias(obj, "sse4_2", obj, "sse4.2");
6850 x86_cpu_load_model(cpu, xcc->model);
6853 /* if required, do the accelerator-specific cpu initialization */
6854 if (cc->accel_cpu) {
6855 cc->accel_cpu->cpu_instance_init(CPU(obj));
6859 static int64_t x86_cpu_get_arch_id(CPUState *cs)
6861 X86CPU *cpu = X86_CPU(cs);
6863 return cpu->apic_id;
6866 static bool x86_cpu_get_paging_enabled(const CPUState *cs)
6868 X86CPU *cpu = X86_CPU(cs);
6870 return cpu->env.cr[0] & CR0_PG_MASK;
6873 static void x86_cpu_set_pc(CPUState *cs, vaddr value)
6875 X86CPU *cpu = X86_CPU(cs);
6877 cpu->env.eip = value;
6880 int x86_cpu_pending_interrupt(CPUState *cs, int interrupt_request)
6882 X86CPU *cpu = X86_CPU(cs);
6883 CPUX86State *env = &cpu->env;
6885 #if !defined(CONFIG_USER_ONLY)
6886 if (interrupt_request & CPU_INTERRUPT_POLL) {
6887 return CPU_INTERRUPT_POLL;
6890 if (interrupt_request & CPU_INTERRUPT_SIPI) {
6891 return CPU_INTERRUPT_SIPI;
6894 if (env->hflags2 & HF2_GIF_MASK) {
6895 if ((interrupt_request & CPU_INTERRUPT_SMI) &&
6896 !(env->hflags & HF_SMM_MASK)) {
6897 return CPU_INTERRUPT_SMI;
6898 } else if ((interrupt_request & CPU_INTERRUPT_NMI) &&
6899 !(env->hflags2 & HF2_NMI_MASK)) {
6900 return CPU_INTERRUPT_NMI;
6901 } else if (interrupt_request & CPU_INTERRUPT_MCE) {
6902 return CPU_INTERRUPT_MCE;
6903 } else if ((interrupt_request & CPU_INTERRUPT_HARD) &&
6904 (((env->hflags2 & HF2_VINTR_MASK) &&
6905 (env->hflags2 & HF2_HIF_MASK)) ||
6906 (!(env->hflags2 & HF2_VINTR_MASK) &&
6907 (env->eflags & IF_MASK &&
6908 !(env->hflags & HF_INHIBIT_IRQ_MASK))))) {
6909 return CPU_INTERRUPT_HARD;
6910 #if !defined(CONFIG_USER_ONLY)
6911 } else if ((interrupt_request & CPU_INTERRUPT_VIRQ) &&
6912 (env->eflags & IF_MASK) &&
6913 !(env->hflags & HF_INHIBIT_IRQ_MASK)) {
6914 return CPU_INTERRUPT_VIRQ;
6922 static bool x86_cpu_has_work(CPUState *cs)
6924 return x86_cpu_pending_interrupt(cs, cs->interrupt_request) != 0;
6927 static void x86_disas_set_info(CPUState *cs, disassemble_info *info)
6929 X86CPU *cpu = X86_CPU(cs);
6930 CPUX86State *env = &cpu->env;
6932 info->mach = (env->hflags & HF_CS64_MASK ? bfd_mach_x86_64
6933 : env->hflags & HF_CS32_MASK ? bfd_mach_i386_i386
6934 : bfd_mach_i386_i8086);
6935 info->print_insn = print_insn_i386;
6937 info->cap_arch = CS_ARCH_X86;
6938 info->cap_mode = (env->hflags & HF_CS64_MASK ? CS_MODE_64
6939 : env->hflags & HF_CS32_MASK ? CS_MODE_32
6941 info->cap_insn_unit = 1;
6942 info->cap_insn_split = 8;
6945 void x86_update_hflags(CPUX86State *env)
6948 #define HFLAG_COPY_MASK \
6949 ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
6950 HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
6951 HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
6952 HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK)
6954 hflags = env->hflags & HFLAG_COPY_MASK;
6955 hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
6956 hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
6957 hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
6958 (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
6959 hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
6961 if (env->cr[4] & CR4_OSFXSR_MASK) {
6962 hflags |= HF_OSFXSR_MASK;
6965 if (env->efer & MSR_EFER_LMA) {
6966 hflags |= HF_LMA_MASK;
6969 if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
6970 hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
6972 hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
6973 (DESC_B_SHIFT - HF_CS32_SHIFT);
6974 hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
6975 (DESC_B_SHIFT - HF_SS32_SHIFT);
6976 if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) ||
6977 !(hflags & HF_CS32_MASK)) {
6978 hflags |= HF_ADDSEG_MASK;
6980 hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base |
6981 env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
6984 env->hflags = hflags;
6987 static Property x86_cpu_properties[] = {
6988 #ifdef CONFIG_USER_ONLY
6989 /* apic_id = 0 by default for *-user, see commit 9886e834 */
6990 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, 0),
6991 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, 0),
6992 DEFINE_PROP_INT32("core-id", X86CPU, core_id, 0),
6993 DEFINE_PROP_INT32("die-id", X86CPU, die_id, 0),
6994 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, 0),
6996 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, UNASSIGNED_APIC_ID),
6997 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, -1),
6998 DEFINE_PROP_INT32("core-id", X86CPU, core_id, -1),
6999 DEFINE_PROP_INT32("die-id", X86CPU, die_id, -1),
7000 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, -1),
7002 DEFINE_PROP_INT32("node-id", X86CPU, node_id, CPU_UNSET_NUMA_NODE_ID),
7003 DEFINE_PROP_BOOL("pmu", X86CPU, enable_pmu, false),
7005 DEFINE_PROP_UINT32("hv-spinlocks", X86CPU, hyperv_spinlock_attempts,
7006 HYPERV_SPINLOCK_NEVER_NOTIFY),
7007 DEFINE_PROP_BIT64("hv-relaxed", X86CPU, hyperv_features,
7008 HYPERV_FEAT_RELAXED, 0),
7009 DEFINE_PROP_BIT64("hv-vapic", X86CPU, hyperv_features,
7010 HYPERV_FEAT_VAPIC, 0),
7011 DEFINE_PROP_BIT64("hv-time", X86CPU, hyperv_features,
7012 HYPERV_FEAT_TIME, 0),
7013 DEFINE_PROP_BIT64("hv-crash", X86CPU, hyperv_features,
7014 HYPERV_FEAT_CRASH, 0),
7015 DEFINE_PROP_BIT64("hv-reset", X86CPU, hyperv_features,
7016 HYPERV_FEAT_RESET, 0),
7017 DEFINE_PROP_BIT64("hv-vpindex", X86CPU, hyperv_features,
7018 HYPERV_FEAT_VPINDEX, 0),
7019 DEFINE_PROP_BIT64("hv-runtime", X86CPU, hyperv_features,
7020 HYPERV_FEAT_RUNTIME, 0),
7021 DEFINE_PROP_BIT64("hv-synic", X86CPU, hyperv_features,
7022 HYPERV_FEAT_SYNIC, 0),
7023 DEFINE_PROP_BIT64("hv-stimer", X86CPU, hyperv_features,
7024 HYPERV_FEAT_STIMER, 0),
7025 DEFINE_PROP_BIT64("hv-frequencies", X86CPU, hyperv_features,
7026 HYPERV_FEAT_FREQUENCIES, 0),
7027 DEFINE_PROP_BIT64("hv-reenlightenment", X86CPU, hyperv_features,
7028 HYPERV_FEAT_REENLIGHTENMENT, 0),
7029 DEFINE_PROP_BIT64("hv-tlbflush", X86CPU, hyperv_features,
7030 HYPERV_FEAT_TLBFLUSH, 0),
7031 DEFINE_PROP_BIT64("hv-evmcs", X86CPU, hyperv_features,
7032 HYPERV_FEAT_EVMCS, 0),
7033 DEFINE_PROP_BIT64("hv-ipi", X86CPU, hyperv_features,
7034 HYPERV_FEAT_IPI, 0),
7035 DEFINE_PROP_BIT64("hv-stimer-direct", X86CPU, hyperv_features,
7036 HYPERV_FEAT_STIMER_DIRECT, 0),
7037 DEFINE_PROP_ON_OFF_AUTO("hv-no-nonarch-coresharing", X86CPU,
7038 hyperv_no_nonarch_cs, ON_OFF_AUTO_OFF),
7039 DEFINE_PROP_BOOL("hv-passthrough", X86CPU, hyperv_passthrough, false),
7041 DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true),
7042 DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
7043 DEFINE_PROP_BOOL("x-force-features", X86CPU, force_features, false),
7044 DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true),
7045 DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 0),
7046 DEFINE_PROP_BOOL("host-phys-bits", X86CPU, host_phys_bits, false),
7047 DEFINE_PROP_UINT8("host-phys-bits-limit", X86CPU, host_phys_bits_limit, 0),
7048 DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true),
7049 DEFINE_PROP_UINT32("level-func7", X86CPU, env.cpuid_level_func7,
7051 DEFINE_PROP_UINT32("level", X86CPU, env.cpuid_level, UINT32_MAX),
7052 DEFINE_PROP_UINT32("xlevel", X86CPU, env.cpuid_xlevel, UINT32_MAX),
7053 DEFINE_PROP_UINT32("xlevel2", X86CPU, env.cpuid_xlevel2, UINT32_MAX),
7054 DEFINE_PROP_UINT32("min-level", X86CPU, env.cpuid_min_level, 0),
7055 DEFINE_PROP_UINT32("min-xlevel", X86CPU, env.cpuid_min_xlevel, 0),
7056 DEFINE_PROP_UINT32("min-xlevel2", X86CPU, env.cpuid_min_xlevel2, 0),
7057 DEFINE_PROP_UINT64("ucode-rev", X86CPU, ucode_rev, 0),
7058 DEFINE_PROP_BOOL("full-cpuid-auto-level", X86CPU, full_cpuid_auto_level, true),
7059 DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor),
7060 DEFINE_PROP_BOOL("cpuid-0xb", X86CPU, enable_cpuid_0xb, true),
7061 DEFINE_PROP_BOOL("lmce", X86CPU, enable_lmce, false),
7062 DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true),
7063 DEFINE_PROP_BOOL("kvm-no-smi-migration", X86CPU, kvm_no_smi_migration,
7065 DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true),
7066 DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true),
7067 DEFINE_PROP_BOOL("x-migrate-smi-count", X86CPU, migrate_smi_count,
7070 * lecacy_cache defaults to true unless the CPU model provides its
7071 * own cache information (see x86_cpu_load_def()).
7073 DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, true),
7076 * From "Requirements for Implementing the Microsoft
7077 * Hypervisor Interface":
7078 * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs
7080 * "Starting with Windows Server 2012 and Windows 8, if
7081 * CPUID.40000005.EAX contains a value of -1, Windows assumes that
7082 * the hypervisor imposes no specific limit to the number of VPs.
7083 * In this case, Windows Server 2012 guest VMs may use more than
7084 * 64 VPs, up to the maximum supported number of processors applicable
7085 * to the specific Windows version being used."
7087 DEFINE_PROP_INT32("x-hv-max-vps", X86CPU, hv_max_vps, -1),
7088 DEFINE_PROP_BOOL("x-hv-synic-kvm-only", X86CPU, hyperv_synic_kvm_only,
7090 DEFINE_PROP_BOOL("x-intel-pt-auto-level", X86CPU, intel_pt_auto_level,
7092 DEFINE_PROP_END_OF_LIST()
7095 static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
7097 X86CPUClass *xcc = X86_CPU_CLASS(oc);
7098 CPUClass *cc = CPU_CLASS(oc);
7099 DeviceClass *dc = DEVICE_CLASS(oc);
7102 device_class_set_parent_realize(dc, x86_cpu_realizefn,
7103 &xcc->parent_realize);
7104 device_class_set_parent_unrealize(dc, x86_cpu_unrealizefn,
7105 &xcc->parent_unrealize);
7106 device_class_set_props(dc, x86_cpu_properties);
7108 device_class_set_parent_reset(dc, x86_cpu_reset, &xcc->parent_reset);
7109 cc->reset_dump_flags = CPU_DUMP_FPU | CPU_DUMP_CCOP;
7111 cc->class_by_name = x86_cpu_class_by_name;
7112 cc->parse_features = x86_cpu_parse_featurestr;
7113 cc->has_work = x86_cpu_has_work;
7114 cc->dump_state = x86_cpu_dump_state;
7115 cc->set_pc = x86_cpu_set_pc;
7116 cc->gdb_read_register = x86_cpu_gdb_read_register;
7117 cc->gdb_write_register = x86_cpu_gdb_write_register;
7118 cc->get_arch_id = x86_cpu_get_arch_id;
7119 cc->get_paging_enabled = x86_cpu_get_paging_enabled;
7121 #ifndef CONFIG_USER_ONLY
7122 cc->asidx_from_attrs = x86_asidx_from_attrs;
7123 cc->get_memory_mapping = x86_cpu_get_memory_mapping;
7124 cc->get_phys_page_attrs_debug = x86_cpu_get_phys_page_attrs_debug;
7125 cc->get_crash_info = x86_cpu_get_crash_info;
7126 cc->write_elf64_note = x86_cpu_write_elf64_note;
7127 cc->write_elf64_qemunote = x86_cpu_write_elf64_qemunote;
7128 cc->write_elf32_note = x86_cpu_write_elf32_note;
7129 cc->write_elf32_qemunote = x86_cpu_write_elf32_qemunote;
7130 cc->vmsd = &vmstate_x86_cpu;
7131 #endif /* !CONFIG_USER_ONLY */
7133 cc->gdb_arch_name = x86_gdb_arch_name;
7134 #ifdef TARGET_X86_64
7135 cc->gdb_core_xml_file = "i386-64bit.xml";
7136 cc->gdb_num_core_regs = 66;
7138 cc->gdb_core_xml_file = "i386-32bit.xml";
7139 cc->gdb_num_core_regs = 50;
7141 cc->disas_set_info = x86_disas_set_info;
7143 dc->user_creatable = true;
7145 object_class_property_add(oc, "family", "int",
7146 x86_cpuid_version_get_family,
7147 x86_cpuid_version_set_family, NULL, NULL);
7148 object_class_property_add(oc, "model", "int",
7149 x86_cpuid_version_get_model,
7150 x86_cpuid_version_set_model, NULL, NULL);
7151 object_class_property_add(oc, "stepping", "int",
7152 x86_cpuid_version_get_stepping,
7153 x86_cpuid_version_set_stepping, NULL, NULL);
7154 object_class_property_add_str(oc, "vendor",
7155 x86_cpuid_get_vendor,
7156 x86_cpuid_set_vendor);
7157 object_class_property_add_str(oc, "model-id",
7158 x86_cpuid_get_model_id,
7159 x86_cpuid_set_model_id);
7160 object_class_property_add(oc, "tsc-frequency", "int",
7161 x86_cpuid_get_tsc_freq,
7162 x86_cpuid_set_tsc_freq, NULL, NULL);
7164 * The "unavailable-features" property has the same semantics as
7165 * CpuDefinitionInfo.unavailable-features on the "query-cpu-definitions"
7166 * QMP command: they list the features that would have prevented the
7167 * CPU from running if the "enforce" flag was set.
7169 object_class_property_add(oc, "unavailable-features", "strList",
7170 x86_cpu_get_unavailable_features,
7173 #if !defined(CONFIG_USER_ONLY)
7174 object_class_property_add(oc, "crash-information", "GuestPanicInformation",
7175 x86_cpu_get_crash_info_qom, NULL, NULL, NULL);
7178 for (w = 0; w < FEATURE_WORDS; w++) {
7180 for (bitnr = 0; bitnr < 64; bitnr++) {
7181 x86_cpu_register_feature_bit_props(xcc, w, bitnr);
7186 static const TypeInfo x86_cpu_type_info = {
7187 .name = TYPE_X86_CPU,
7189 .instance_size = sizeof(X86CPU),
7190 .instance_init = x86_cpu_initfn,
7192 .class_size = sizeof(X86CPUClass),
7193 .class_init = x86_cpu_common_class_init,
7197 /* "base" CPU model, used by query-cpu-model-expansion */
7198 static void x86_cpu_base_class_init(ObjectClass *oc, void *data)
7200 X86CPUClass *xcc = X86_CPU_CLASS(oc);
7202 xcc->static_model = true;
7203 xcc->migration_safe = true;
7204 xcc->model_description = "base CPU model type with no features enabled";
7208 static const TypeInfo x86_base_cpu_type_info = {
7209 .name = X86_CPU_TYPE_NAME("base"),
7210 .parent = TYPE_X86_CPU,
7211 .class_init = x86_cpu_base_class_init,
7214 static void x86_cpu_register_types(void)
7218 type_register_static(&x86_cpu_type_info);
7219 for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) {
7220 x86_register_cpudef_types(&builtin_x86_defs[i]);
7222 type_register_static(&max_x86_cpu_type_info);
7223 type_register_static(&x86_base_cpu_type_info);
7226 type_init(x86_cpu_register_types)