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"
27 #include "exec/exec-all.h"
28 #include "sysemu/kvm.h"
29 #include "sysemu/reset.h"
30 #include "sysemu/hvf.h"
31 #include "sysemu/cpus.h"
32 #include "sysemu/xen.h"
36 #include "qemu/error-report.h"
37 #include "qemu/module.h"
38 #include "qemu/option.h"
39 #include "qemu/config-file.h"
40 #include "qapi/error.h"
41 #include "qapi/qapi-visit-machine.h"
42 #include "qapi/qapi-visit-run-state.h"
43 #include "qapi/qmp/qdict.h"
44 #include "qapi/qmp/qerror.h"
45 #include "qapi/visitor.h"
46 #include "qom/qom-qobject.h"
47 #include "sysemu/arch_init.h"
48 #include "qapi/qapi-commands-machine-target.h"
50 #include "standard-headers/asm-x86/kvm_para.h"
52 #include "sysemu/sysemu.h"
53 #include "sysemu/tcg.h"
54 #include "hw/qdev-properties.h"
55 #include "hw/i386/topology.h"
56 #ifndef CONFIG_USER_ONLY
57 #include "exec/address-spaces.h"
58 #include "hw/i386/apic_internal.h"
59 #include "hw/boards.h"
62 #include "disas/capstone.h"
64 /* Helpers for building CPUID[2] descriptors: */
66 struct CPUID2CacheDescriptorInfo {
75 * Known CPUID 2 cache descriptors.
76 * From Intel SDM Volume 2A, CPUID instruction
78 struct CPUID2CacheDescriptorInfo cpuid2_cache_descriptors[] = {
79 [0x06] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 8 * KiB,
80 .associativity = 4, .line_size = 32, },
81 [0x08] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 16 * KiB,
82 .associativity = 4, .line_size = 32, },
83 [0x09] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 32 * KiB,
84 .associativity = 4, .line_size = 64, },
85 [0x0A] = { .level = 1, .type = DATA_CACHE, .size = 8 * KiB,
86 .associativity = 2, .line_size = 32, },
87 [0x0C] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
88 .associativity = 4, .line_size = 32, },
89 [0x0D] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
90 .associativity = 4, .line_size = 64, },
91 [0x0E] = { .level = 1, .type = DATA_CACHE, .size = 24 * KiB,
92 .associativity = 6, .line_size = 64, },
93 [0x1D] = { .level = 2, .type = UNIFIED_CACHE, .size = 128 * KiB,
94 .associativity = 2, .line_size = 64, },
95 [0x21] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
96 .associativity = 8, .line_size = 64, },
97 /* lines per sector is not supported cpuid2_cache_descriptor(),
98 * so descriptors 0x22, 0x23 are not included
100 [0x24] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
101 .associativity = 16, .line_size = 64, },
102 /* lines per sector is not supported cpuid2_cache_descriptor(),
103 * so descriptors 0x25, 0x20 are not included
105 [0x2C] = { .level = 1, .type = DATA_CACHE, .size = 32 * KiB,
106 .associativity = 8, .line_size = 64, },
107 [0x30] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 32 * KiB,
108 .associativity = 8, .line_size = 64, },
109 [0x41] = { .level = 2, .type = UNIFIED_CACHE, .size = 128 * KiB,
110 .associativity = 4, .line_size = 32, },
111 [0x42] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
112 .associativity = 4, .line_size = 32, },
113 [0x43] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
114 .associativity = 4, .line_size = 32, },
115 [0x44] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
116 .associativity = 4, .line_size = 32, },
117 [0x45] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
118 .associativity = 4, .line_size = 32, },
119 [0x46] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
120 .associativity = 4, .line_size = 64, },
121 [0x47] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
122 .associativity = 8, .line_size = 64, },
123 [0x48] = { .level = 2, .type = UNIFIED_CACHE, .size = 3 * MiB,
124 .associativity = 12, .line_size = 64, },
125 /* Descriptor 0x49 depends on CPU family/model, so it is not included */
126 [0x4A] = { .level = 3, .type = UNIFIED_CACHE, .size = 6 * MiB,
127 .associativity = 12, .line_size = 64, },
128 [0x4B] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
129 .associativity = 16, .line_size = 64, },
130 [0x4C] = { .level = 3, .type = UNIFIED_CACHE, .size = 12 * MiB,
131 .associativity = 12, .line_size = 64, },
132 [0x4D] = { .level = 3, .type = UNIFIED_CACHE, .size = 16 * MiB,
133 .associativity = 16, .line_size = 64, },
134 [0x4E] = { .level = 2, .type = UNIFIED_CACHE, .size = 6 * MiB,
135 .associativity = 24, .line_size = 64, },
136 [0x60] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
137 .associativity = 8, .line_size = 64, },
138 [0x66] = { .level = 1, .type = DATA_CACHE, .size = 8 * KiB,
139 .associativity = 4, .line_size = 64, },
140 [0x67] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
141 .associativity = 4, .line_size = 64, },
142 [0x68] = { .level = 1, .type = DATA_CACHE, .size = 32 * KiB,
143 .associativity = 4, .line_size = 64, },
144 [0x78] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
145 .associativity = 4, .line_size = 64, },
146 /* lines per sector is not supported cpuid2_cache_descriptor(),
147 * so descriptors 0x79, 0x7A, 0x7B, 0x7C are not included.
149 [0x7D] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
150 .associativity = 8, .line_size = 64, },
151 [0x7F] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
152 .associativity = 2, .line_size = 64, },
153 [0x80] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
154 .associativity = 8, .line_size = 64, },
155 [0x82] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
156 .associativity = 8, .line_size = 32, },
157 [0x83] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
158 .associativity = 8, .line_size = 32, },
159 [0x84] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
160 .associativity = 8, .line_size = 32, },
161 [0x85] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
162 .associativity = 8, .line_size = 32, },
163 [0x86] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
164 .associativity = 4, .line_size = 64, },
165 [0x87] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
166 .associativity = 8, .line_size = 64, },
167 [0xD0] = { .level = 3, .type = UNIFIED_CACHE, .size = 512 * KiB,
168 .associativity = 4, .line_size = 64, },
169 [0xD1] = { .level = 3, .type = UNIFIED_CACHE, .size = 1 * MiB,
170 .associativity = 4, .line_size = 64, },
171 [0xD2] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
172 .associativity = 4, .line_size = 64, },
173 [0xD6] = { .level = 3, .type = UNIFIED_CACHE, .size = 1 * MiB,
174 .associativity = 8, .line_size = 64, },
175 [0xD7] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
176 .associativity = 8, .line_size = 64, },
177 [0xD8] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
178 .associativity = 8, .line_size = 64, },
179 [0xDC] = { .level = 3, .type = UNIFIED_CACHE, .size = 1.5 * MiB,
180 .associativity = 12, .line_size = 64, },
181 [0xDD] = { .level = 3, .type = UNIFIED_CACHE, .size = 3 * MiB,
182 .associativity = 12, .line_size = 64, },
183 [0xDE] = { .level = 3, .type = UNIFIED_CACHE, .size = 6 * MiB,
184 .associativity = 12, .line_size = 64, },
185 [0xE2] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
186 .associativity = 16, .line_size = 64, },
187 [0xE3] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
188 .associativity = 16, .line_size = 64, },
189 [0xE4] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
190 .associativity = 16, .line_size = 64, },
191 [0xEA] = { .level = 3, .type = UNIFIED_CACHE, .size = 12 * MiB,
192 .associativity = 24, .line_size = 64, },
193 [0xEB] = { .level = 3, .type = UNIFIED_CACHE, .size = 18 * MiB,
194 .associativity = 24, .line_size = 64, },
195 [0xEC] = { .level = 3, .type = UNIFIED_CACHE, .size = 24 * MiB,
196 .associativity = 24, .line_size = 64, },
200 * "CPUID leaf 2 does not report cache descriptor information,
201 * use CPUID leaf 4 to query cache parameters"
203 #define CACHE_DESCRIPTOR_UNAVAILABLE 0xFF
206 * Return a CPUID 2 cache descriptor for a given cache.
207 * If no known descriptor is found, return CACHE_DESCRIPTOR_UNAVAILABLE
209 static uint8_t cpuid2_cache_descriptor(CPUCacheInfo *cache)
213 assert(cache->size > 0);
214 assert(cache->level > 0);
215 assert(cache->line_size > 0);
216 assert(cache->associativity > 0);
217 for (i = 0; i < ARRAY_SIZE(cpuid2_cache_descriptors); i++) {
218 struct CPUID2CacheDescriptorInfo *d = &cpuid2_cache_descriptors[i];
219 if (d->level == cache->level && d->type == cache->type &&
220 d->size == cache->size && d->line_size == cache->line_size &&
221 d->associativity == cache->associativity) {
226 return CACHE_DESCRIPTOR_UNAVAILABLE;
229 /* CPUID Leaf 4 constants: */
232 #define CACHE_TYPE_D 1
233 #define CACHE_TYPE_I 2
234 #define CACHE_TYPE_UNIFIED 3
236 #define CACHE_LEVEL(l) (l << 5)
238 #define CACHE_SELF_INIT_LEVEL (1 << 8)
241 #define CACHE_NO_INVD_SHARING (1 << 0)
242 #define CACHE_INCLUSIVE (1 << 1)
243 #define CACHE_COMPLEX_IDX (1 << 2)
245 /* Encode CacheType for CPUID[4].EAX */
246 #define CACHE_TYPE(t) (((t) == DATA_CACHE) ? CACHE_TYPE_D : \
247 ((t) == INSTRUCTION_CACHE) ? CACHE_TYPE_I : \
248 ((t) == UNIFIED_CACHE) ? CACHE_TYPE_UNIFIED : \
249 0 /* Invalid value */)
252 /* Encode cache info for CPUID[4] */
253 static void encode_cache_cpuid4(CPUCacheInfo *cache,
254 int num_apic_ids, int num_cores,
255 uint32_t *eax, uint32_t *ebx,
256 uint32_t *ecx, uint32_t *edx)
258 assert(cache->size == cache->line_size * cache->associativity *
259 cache->partitions * cache->sets);
261 assert(num_apic_ids > 0);
262 *eax = CACHE_TYPE(cache->type) |
263 CACHE_LEVEL(cache->level) |
264 (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0) |
265 ((num_cores - 1) << 26) |
266 ((num_apic_ids - 1) << 14);
268 assert(cache->line_size > 0);
269 assert(cache->partitions > 0);
270 assert(cache->associativity > 0);
271 /* We don't implement fully-associative caches */
272 assert(cache->associativity < cache->sets);
273 *ebx = (cache->line_size - 1) |
274 ((cache->partitions - 1) << 12) |
275 ((cache->associativity - 1) << 22);
277 assert(cache->sets > 0);
278 *ecx = cache->sets - 1;
280 *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
281 (cache->inclusive ? CACHE_INCLUSIVE : 0) |
282 (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
285 /* Encode cache info for CPUID[0x80000005].ECX or CPUID[0x80000005].EDX */
286 static uint32_t encode_cache_cpuid80000005(CPUCacheInfo *cache)
288 assert(cache->size % 1024 == 0);
289 assert(cache->lines_per_tag > 0);
290 assert(cache->associativity > 0);
291 assert(cache->line_size > 0);
292 return ((cache->size / 1024) << 24) | (cache->associativity << 16) |
293 (cache->lines_per_tag << 8) | (cache->line_size);
296 #define ASSOC_FULL 0xFF
298 /* AMD associativity encoding used on CPUID Leaf 0x80000006: */
299 #define AMD_ENC_ASSOC(a) (a <= 1 ? a : \
309 a == ASSOC_FULL ? 0xF : \
310 0 /* invalid value */)
313 * Encode cache info for CPUID[0x80000006].ECX and CPUID[0x80000006].EDX
316 static void encode_cache_cpuid80000006(CPUCacheInfo *l2,
318 uint32_t *ecx, uint32_t *edx)
320 assert(l2->size % 1024 == 0);
321 assert(l2->associativity > 0);
322 assert(l2->lines_per_tag > 0);
323 assert(l2->line_size > 0);
324 *ecx = ((l2->size / 1024) << 16) |
325 (AMD_ENC_ASSOC(l2->associativity) << 12) |
326 (l2->lines_per_tag << 8) | (l2->line_size);
329 assert(l3->size % (512 * 1024) == 0);
330 assert(l3->associativity > 0);
331 assert(l3->lines_per_tag > 0);
332 assert(l3->line_size > 0);
333 *edx = ((l3->size / (512 * 1024)) << 18) |
334 (AMD_ENC_ASSOC(l3->associativity) << 12) |
335 (l3->lines_per_tag << 8) | (l3->line_size);
341 /* Encode cache info for CPUID[8000001D] */
342 static void encode_cache_cpuid8000001d(CPUCacheInfo *cache,
343 X86CPUTopoInfo *topo_info,
344 uint32_t *eax, uint32_t *ebx,
345 uint32_t *ecx, uint32_t *edx)
348 assert(cache->size == cache->line_size * cache->associativity *
349 cache->partitions * cache->sets);
351 *eax = CACHE_TYPE(cache->type) | CACHE_LEVEL(cache->level) |
352 (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0);
354 /* L3 is shared among multiple cores */
355 if (cache->level == 3) {
356 l3_threads = topo_info->cores_per_die * topo_info->threads_per_core;
357 *eax |= (l3_threads - 1) << 14;
359 *eax |= ((topo_info->threads_per_core - 1) << 14);
362 assert(cache->line_size > 0);
363 assert(cache->partitions > 0);
364 assert(cache->associativity > 0);
365 /* We don't implement fully-associative caches */
366 assert(cache->associativity < cache->sets);
367 *ebx = (cache->line_size - 1) |
368 ((cache->partitions - 1) << 12) |
369 ((cache->associativity - 1) << 22);
371 assert(cache->sets > 0);
372 *ecx = cache->sets - 1;
374 *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
375 (cache->inclusive ? CACHE_INCLUSIVE : 0) |
376 (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
379 /* Encode cache info for CPUID[8000001E] */
380 static void encode_topo_cpuid8000001e(X86CPU *cpu, X86CPUTopoInfo *topo_info,
381 uint32_t *eax, uint32_t *ebx,
382 uint32_t *ecx, uint32_t *edx)
384 X86CPUTopoIDs topo_ids;
386 x86_topo_ids_from_apicid(cpu->apic_id, topo_info, &topo_ids);
391 * CPUID_Fn8000001E_EBX [Core Identifiers] (CoreId)
392 * Read-only. Reset: 0000_XXXXh.
393 * See Core::X86::Cpuid::ExtApicId.
394 * Core::X86::Cpuid::CoreId_lthree[1:0]_core[3:0]_thread[1:0];
397 * 15:8 ThreadsPerCore: threads per core. Read-only. Reset: XXh.
398 * The number of threads per core is ThreadsPerCore+1.
399 * 7:0 CoreId: core ID. Read-only. Reset: XXh.
401 * NOTE: CoreId is already part of apic_id. Just use it. We can
402 * use all the 8 bits to represent the core_id here.
404 *ebx = ((topo_info->threads_per_core - 1) << 8) | (topo_ids.core_id & 0xFF);
407 * CPUID_Fn8000001E_ECX [Node Identifiers] (NodeId)
408 * Read-only. Reset: 0000_0XXXh.
409 * Core::X86::Cpuid::NodeId_lthree[1:0]_core[3:0]_thread[1:0];
412 * 10:8 NodesPerProcessor: Node per processor. Read-only. Reset: XXXb.
415 * 000b 1 node per processor.
416 * 001b 2 nodes per processor.
418 * 011b 4 nodes per processor.
419 * 111b-100b Reserved.
420 * 7:0 NodeId: Node ID. Read-only. Reset: XXh.
422 * NOTE: Hardware reserves 3 bits for number of nodes per processor.
423 * But users can create more nodes than the actual hardware can
424 * support. To genaralize we can use all the upper 8 bits for nodes.
425 * NodeId is combination of node and socket_id which is already decoded
426 * in apic_id. Just use it by shifting.
428 *ecx = ((topo_info->dies_per_pkg - 1) << 8) |
429 ((cpu->apic_id >> apicid_die_offset(topo_info)) & 0xFF);
435 * Definitions of the hardcoded cache entries we expose:
436 * These are legacy cache values. If there is a need to change any
437 * of these values please use builtin_x86_defs
441 static CPUCacheInfo legacy_l1d_cache = {
450 .no_invd_sharing = true,
453 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
454 static CPUCacheInfo legacy_l1d_cache_amd = {
464 .no_invd_sharing = true,
467 /* L1 instruction cache: */
468 static CPUCacheInfo legacy_l1i_cache = {
469 .type = INSTRUCTION_CACHE,
477 .no_invd_sharing = true,
480 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
481 static CPUCacheInfo legacy_l1i_cache_amd = {
482 .type = INSTRUCTION_CACHE,
491 .no_invd_sharing = true,
494 /* Level 2 unified cache: */
495 static CPUCacheInfo legacy_l2_cache = {
496 .type = UNIFIED_CACHE,
504 .no_invd_sharing = true,
507 /*FIXME: CPUID leaf 2 descriptor is inconsistent with CPUID leaf 4 */
508 static CPUCacheInfo legacy_l2_cache_cpuid2 = {
509 .type = UNIFIED_CACHE,
517 /*FIXME: CPUID leaf 0x80000006 is inconsistent with leaves 2 & 4 */
518 static CPUCacheInfo legacy_l2_cache_amd = {
519 .type = UNIFIED_CACHE,
529 /* Level 3 unified cache: */
530 static CPUCacheInfo legacy_l3_cache = {
531 .type = UNIFIED_CACHE,
541 .complex_indexing = true,
544 /* TLB definitions: */
546 #define L1_DTLB_2M_ASSOC 1
547 #define L1_DTLB_2M_ENTRIES 255
548 #define L1_DTLB_4K_ASSOC 1
549 #define L1_DTLB_4K_ENTRIES 255
551 #define L1_ITLB_2M_ASSOC 1
552 #define L1_ITLB_2M_ENTRIES 255
553 #define L1_ITLB_4K_ASSOC 1
554 #define L1_ITLB_4K_ENTRIES 255
556 #define L2_DTLB_2M_ASSOC 0 /* disabled */
557 #define L2_DTLB_2M_ENTRIES 0 /* disabled */
558 #define L2_DTLB_4K_ASSOC 4
559 #define L2_DTLB_4K_ENTRIES 512
561 #define L2_ITLB_2M_ASSOC 0 /* disabled */
562 #define L2_ITLB_2M_ENTRIES 0 /* disabled */
563 #define L2_ITLB_4K_ASSOC 4
564 #define L2_ITLB_4K_ENTRIES 512
566 /* CPUID Leaf 0x14 constants: */
567 #define INTEL_PT_MAX_SUBLEAF 0x1
569 * bit[00]: IA32_RTIT_CTL.CR3 filter can be set to 1 and IA32_RTIT_CR3_MATCH
570 * MSR can be accessed;
571 * bit[01]: Support Configurable PSB and Cycle-Accurate Mode;
572 * bit[02]: Support IP Filtering, TraceStop filtering, and preservation
573 * of Intel PT MSRs across warm reset;
574 * bit[03]: Support MTC timing packet and suppression of COFI-based packets;
576 #define INTEL_PT_MINIMAL_EBX 0xf
578 * bit[00]: Tracing can be enabled with IA32_RTIT_CTL.ToPA = 1 and
579 * IA32_RTIT_OUTPUT_BASE and IA32_RTIT_OUTPUT_MASK_PTRS MSRs can be
581 * bit[01]: ToPA tables can hold any number of output entries, up to the
582 * maximum allowed by the MaskOrTableOffset field of
583 * IA32_RTIT_OUTPUT_MASK_PTRS;
584 * bit[02]: Support Single-Range Output scheme;
586 #define INTEL_PT_MINIMAL_ECX 0x7
587 /* generated packets which contain IP payloads have LIP values */
588 #define INTEL_PT_IP_LIP (1 << 31)
589 #define INTEL_PT_ADDR_RANGES_NUM 0x2 /* Number of configurable address ranges */
590 #define INTEL_PT_ADDR_RANGES_NUM_MASK 0x3
591 #define INTEL_PT_MTC_BITMAP (0x0249 << 16) /* Support ART(0,3,6,9) */
592 #define INTEL_PT_CYCLE_BITMAP 0x1fff /* Support 0,2^(0~11) */
593 #define INTEL_PT_PSB_BITMAP (0x003f << 16) /* Support 2K,4K,8K,16K,32K,64K */
595 static void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1,
596 uint32_t vendor2, uint32_t vendor3)
599 for (i = 0; i < 4; i++) {
600 dst[i] = vendor1 >> (8 * i);
601 dst[i + 4] = vendor2 >> (8 * i);
602 dst[i + 8] = vendor3 >> (8 * i);
604 dst[CPUID_VENDOR_SZ] = '\0';
607 #define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
608 #define PENTIUM_FEATURES (I486_FEATURES | CPUID_DE | CPUID_TSC | \
609 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_MMX | CPUID_APIC)
610 #define PENTIUM2_FEATURES (PENTIUM_FEATURES | CPUID_PAE | CPUID_SEP | \
611 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
612 CPUID_PSE36 | CPUID_FXSR)
613 #define PENTIUM3_FEATURES (PENTIUM2_FEATURES | CPUID_SSE)
614 #define PPRO_FEATURES (CPUID_FP87 | CPUID_DE | CPUID_PSE | CPUID_TSC | \
615 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_PGE | CPUID_CMOV | \
616 CPUID_PAT | CPUID_FXSR | CPUID_MMX | CPUID_SSE | CPUID_SSE2 | \
617 CPUID_PAE | CPUID_SEP | CPUID_APIC)
619 #define TCG_FEATURES (CPUID_FP87 | CPUID_PSE | CPUID_TSC | CPUID_MSR | \
620 CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | CPUID_SEP | \
621 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
622 CPUID_PSE36 | CPUID_CLFLUSH | CPUID_ACPI | CPUID_MMX | \
623 CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS | CPUID_DE)
624 /* partly implemented:
625 CPUID_MTRR, CPUID_MCA, CPUID_CLFLUSH (needed for Win64) */
627 CPUID_VME, CPUID_DTS, CPUID_SS, CPUID_HT, CPUID_TM, CPUID_PBE */
628 #define TCG_EXT_FEATURES (CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | \
629 CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | \
630 CPUID_EXT_SSE41 | CPUID_EXT_SSE42 | CPUID_EXT_POPCNT | \
631 CPUID_EXT_XSAVE | /* CPUID_EXT_OSXSAVE is dynamic */ \
632 CPUID_EXT_MOVBE | CPUID_EXT_AES | CPUID_EXT_HYPERVISOR | \
635 CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_SMX,
636 CPUID_EXT_EST, CPUID_EXT_TM2, CPUID_EXT_CID, CPUID_EXT_FMA,
637 CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_PCID, CPUID_EXT_DCA,
638 CPUID_EXT_X2APIC, CPUID_EXT_TSC_DEADLINE_TIMER, CPUID_EXT_AVX,
642 #define TCG_EXT2_X86_64_FEATURES (CPUID_EXT2_SYSCALL | CPUID_EXT2_LM)
644 #define TCG_EXT2_X86_64_FEATURES 0
647 #define TCG_EXT2_FEATURES ((TCG_FEATURES & CPUID_EXT2_AMD_ALIASES) | \
648 CPUID_EXT2_NX | CPUID_EXT2_MMXEXT | CPUID_EXT2_RDTSCP | \
649 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_PDPE1GB | \
650 TCG_EXT2_X86_64_FEATURES)
651 #define TCG_EXT3_FEATURES (CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | \
652 CPUID_EXT3_CR8LEG | CPUID_EXT3_ABM | CPUID_EXT3_SSE4A)
653 #define TCG_EXT4_FEATURES 0
654 #define TCG_SVM_FEATURES CPUID_SVM_NPT
655 #define TCG_KVM_FEATURES 0
656 #define TCG_7_0_EBX_FEATURES (CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_SMAP | \
657 CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX | \
658 CPUID_7_0_EBX_PCOMMIT | CPUID_7_0_EBX_CLFLUSHOPT | \
659 CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_FSGSBASE | \
662 CPUID_7_0_EBX_HLE, CPUID_7_0_EBX_AVX2,
663 CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM,
664 CPUID_7_0_EBX_RDSEED */
665 #define TCG_7_0_ECX_FEATURES (CPUID_7_0_ECX_PKU | \
666 /* CPUID_7_0_ECX_OSPKE is dynamic */ \
668 #define TCG_7_0_EDX_FEATURES 0
669 #define TCG_7_1_EAX_FEATURES 0
670 #define TCG_APM_FEATURES 0
671 #define TCG_6_EAX_FEATURES CPUID_6_EAX_ARAT
672 #define TCG_XSAVE_FEATURES (CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XGETBV1)
674 CPUID_XSAVE_XSAVEC, CPUID_XSAVE_XSAVES */
675 #define TCG_14_0_ECX_FEATURES 0
677 typedef enum FeatureWordType {
682 typedef struct FeatureWordInfo {
683 FeatureWordType type;
684 /* feature flags names are taken from "Intel Processor Identification and
685 * the CPUID Instruction" and AMD's "CPUID Specification".
686 * In cases of disagreement between feature naming conventions,
687 * aliases may be added.
689 const char *feat_names[64];
691 /* If type==CPUID_FEATURE_WORD */
693 uint32_t eax; /* Input EAX for CPUID */
694 bool needs_ecx; /* CPUID instruction uses ECX as input */
695 uint32_t ecx; /* Input ECX value for CPUID */
696 int reg; /* output register (R_* constant) */
698 /* If type==MSR_FEATURE_WORD */
703 uint64_t tcg_features; /* Feature flags supported by TCG */
704 uint64_t unmigratable_flags; /* Feature flags known to be unmigratable */
705 uint64_t migratable_flags; /* Feature flags known to be migratable */
706 /* Features that shouldn't be auto-enabled by "-cpu host" */
707 uint64_t no_autoenable_flags;
710 static FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
712 .type = CPUID_FEATURE_WORD,
714 "fpu", "vme", "de", "pse",
715 "tsc", "msr", "pae", "mce",
716 "cx8", "apic", NULL, "sep",
717 "mtrr", "pge", "mca", "cmov",
718 "pat", "pse36", "pn" /* Intel psn */, "clflush" /* Intel clfsh */,
719 NULL, "ds" /* Intel dts */, "acpi", "mmx",
720 "fxsr", "sse", "sse2", "ss",
721 "ht" /* Intel htt */, "tm", "ia64", "pbe",
723 .cpuid = {.eax = 1, .reg = R_EDX, },
724 .tcg_features = TCG_FEATURES,
727 .type = CPUID_FEATURE_WORD,
729 "pni" /* Intel,AMD sse3 */, "pclmulqdq", "dtes64", "monitor",
730 "ds-cpl", "vmx", "smx", "est",
731 "tm2", "ssse3", "cid", NULL,
732 "fma", "cx16", "xtpr", "pdcm",
733 NULL, "pcid", "dca", "sse4.1",
734 "sse4.2", "x2apic", "movbe", "popcnt",
735 "tsc-deadline", "aes", "xsave", NULL /* osxsave */,
736 "avx", "f16c", "rdrand", "hypervisor",
738 .cpuid = { .eax = 1, .reg = R_ECX, },
739 .tcg_features = TCG_EXT_FEATURES,
741 /* Feature names that are already defined on feature_name[] but
742 * are set on CPUID[8000_0001].EDX on AMD CPUs don't have their
743 * names on feat_names below. They are copied automatically
744 * to features[FEAT_8000_0001_EDX] if and only if CPU vendor is AMD.
746 [FEAT_8000_0001_EDX] = {
747 .type = CPUID_FEATURE_WORD,
749 NULL /* fpu */, NULL /* vme */, NULL /* de */, NULL /* pse */,
750 NULL /* tsc */, NULL /* msr */, NULL /* pae */, NULL /* mce */,
751 NULL /* cx8 */, NULL /* apic */, NULL, "syscall",
752 NULL /* mtrr */, NULL /* pge */, NULL /* mca */, NULL /* cmov */,
753 NULL /* pat */, NULL /* pse36 */, NULL, NULL /* Linux mp */,
754 "nx", NULL, "mmxext", NULL /* mmx */,
755 NULL /* fxsr */, "fxsr-opt", "pdpe1gb", "rdtscp",
756 NULL, "lm", "3dnowext", "3dnow",
758 .cpuid = { .eax = 0x80000001, .reg = R_EDX, },
759 .tcg_features = TCG_EXT2_FEATURES,
761 [FEAT_8000_0001_ECX] = {
762 .type = CPUID_FEATURE_WORD,
764 "lahf-lm", "cmp-legacy", "svm", "extapic",
765 "cr8legacy", "abm", "sse4a", "misalignsse",
766 "3dnowprefetch", "osvw", "ibs", "xop",
767 "skinit", "wdt", NULL, "lwp",
768 "fma4", "tce", NULL, "nodeid-msr",
769 NULL, "tbm", "topoext", "perfctr-core",
770 "perfctr-nb", NULL, NULL, NULL,
771 NULL, NULL, NULL, NULL,
773 .cpuid = { .eax = 0x80000001, .reg = R_ECX, },
774 .tcg_features = TCG_EXT3_FEATURES,
776 * TOPOEXT is always allowed but can't be enabled blindly by
777 * "-cpu host", as it requires consistent cache topology info
778 * to be provided so it doesn't confuse guests.
780 .no_autoenable_flags = CPUID_EXT3_TOPOEXT,
782 [FEAT_C000_0001_EDX] = {
783 .type = CPUID_FEATURE_WORD,
785 NULL, NULL, "xstore", "xstore-en",
786 NULL, NULL, "xcrypt", "xcrypt-en",
787 "ace2", "ace2-en", "phe", "phe-en",
788 "pmm", "pmm-en", NULL, NULL,
789 NULL, NULL, NULL, NULL,
790 NULL, NULL, NULL, NULL,
791 NULL, NULL, NULL, NULL,
792 NULL, NULL, NULL, NULL,
794 .cpuid = { .eax = 0xC0000001, .reg = R_EDX, },
795 .tcg_features = TCG_EXT4_FEATURES,
798 .type = CPUID_FEATURE_WORD,
800 "kvmclock", "kvm-nopiodelay", "kvm-mmu", "kvmclock",
801 "kvm-asyncpf", "kvm-steal-time", "kvm-pv-eoi", "kvm-pv-unhalt",
802 NULL, "kvm-pv-tlb-flush", NULL, "kvm-pv-ipi",
803 "kvm-poll-control", "kvm-pv-sched-yield", "kvm-asyncpf-int", NULL,
804 NULL, NULL, NULL, NULL,
805 NULL, NULL, NULL, NULL,
806 "kvmclock-stable-bit", NULL, NULL, NULL,
807 NULL, NULL, NULL, NULL,
809 .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EAX, },
810 .tcg_features = TCG_KVM_FEATURES,
813 .type = CPUID_FEATURE_WORD,
815 "kvm-hint-dedicated", NULL, NULL, NULL,
816 NULL, NULL, NULL, NULL,
817 NULL, NULL, NULL, NULL,
818 NULL, NULL, NULL, NULL,
819 NULL, NULL, NULL, NULL,
820 NULL, NULL, NULL, NULL,
821 NULL, NULL, NULL, NULL,
822 NULL, NULL, NULL, NULL,
824 .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EDX, },
825 .tcg_features = TCG_KVM_FEATURES,
827 * KVM hints aren't auto-enabled by -cpu host, they need to be
828 * explicitly enabled in the command-line.
830 .no_autoenable_flags = ~0U,
833 * .feat_names are commented out for Hyper-V enlightenments because we
834 * don't want to have two different ways for enabling them on QEMU command
835 * line. Some features (e.g. "hyperv_time", "hyperv_vapic", ...) require
836 * enabling several feature bits simultaneously, exposing these bits
837 * individually may just confuse guests.
839 [FEAT_HYPERV_EAX] = {
840 .type = CPUID_FEATURE_WORD,
842 NULL /* hv_msr_vp_runtime_access */, NULL /* hv_msr_time_refcount_access */,
843 NULL /* hv_msr_synic_access */, NULL /* hv_msr_stimer_access */,
844 NULL /* hv_msr_apic_access */, NULL /* hv_msr_hypercall_access */,
845 NULL /* hv_vpindex_access */, NULL /* hv_msr_reset_access */,
846 NULL /* hv_msr_stats_access */, NULL /* hv_reftsc_access */,
847 NULL /* hv_msr_idle_access */, NULL /* hv_msr_frequency_access */,
848 NULL /* hv_msr_debug_access */, NULL /* hv_msr_reenlightenment_access */,
850 NULL, NULL, NULL, NULL,
851 NULL, NULL, NULL, NULL,
852 NULL, NULL, NULL, NULL,
853 NULL, NULL, NULL, NULL,
855 .cpuid = { .eax = 0x40000003, .reg = R_EAX, },
857 [FEAT_HYPERV_EBX] = {
858 .type = CPUID_FEATURE_WORD,
860 NULL /* hv_create_partitions */, NULL /* hv_access_partition_id */,
861 NULL /* hv_access_memory_pool */, NULL /* hv_adjust_message_buffers */,
862 NULL /* hv_post_messages */, NULL /* hv_signal_events */,
863 NULL /* hv_create_port */, NULL /* hv_connect_port */,
864 NULL /* hv_access_stats */, NULL, NULL, NULL /* hv_debugging */,
865 NULL /* hv_cpu_power_management */, NULL /* hv_configure_profiler */,
867 NULL, NULL, NULL, NULL,
868 NULL, NULL, NULL, NULL,
869 NULL, NULL, NULL, NULL,
870 NULL, NULL, NULL, NULL,
872 .cpuid = { .eax = 0x40000003, .reg = R_EBX, },
874 [FEAT_HYPERV_EDX] = {
875 .type = CPUID_FEATURE_WORD,
877 NULL /* hv_mwait */, NULL /* hv_guest_debugging */,
878 NULL /* hv_perf_monitor */, NULL /* hv_cpu_dynamic_part */,
879 NULL /* hv_hypercall_params_xmm */, NULL /* hv_guest_idle_state */,
881 NULL, NULL, NULL /* hv_guest_crash_msr */, NULL,
882 NULL, NULL, NULL, NULL,
883 NULL, NULL, NULL, NULL,
884 NULL, NULL, NULL, NULL,
885 NULL, NULL, NULL, NULL,
886 NULL, NULL, NULL, NULL,
888 .cpuid = { .eax = 0x40000003, .reg = R_EDX, },
890 [FEAT_HV_RECOMM_EAX] = {
891 .type = CPUID_FEATURE_WORD,
893 NULL /* hv_recommend_pv_as_switch */,
894 NULL /* hv_recommend_pv_tlbflush_local */,
895 NULL /* hv_recommend_pv_tlbflush_remote */,
896 NULL /* hv_recommend_msr_apic_access */,
897 NULL /* hv_recommend_msr_reset */,
898 NULL /* hv_recommend_relaxed_timing */,
899 NULL /* hv_recommend_dma_remapping */,
900 NULL /* hv_recommend_int_remapping */,
901 NULL /* hv_recommend_x2apic_msrs */,
902 NULL /* hv_recommend_autoeoi_deprecation */,
903 NULL /* hv_recommend_pv_ipi */,
904 NULL /* hv_recommend_ex_hypercalls */,
905 NULL /* hv_hypervisor_is_nested */,
906 NULL /* hv_recommend_int_mbec */,
907 NULL /* hv_recommend_evmcs */,
909 NULL, NULL, NULL, NULL,
910 NULL, NULL, NULL, NULL,
911 NULL, NULL, NULL, NULL,
912 NULL, NULL, NULL, NULL,
914 .cpuid = { .eax = 0x40000004, .reg = R_EAX, },
916 [FEAT_HV_NESTED_EAX] = {
917 .type = CPUID_FEATURE_WORD,
918 .cpuid = { .eax = 0x4000000A, .reg = R_EAX, },
921 .type = CPUID_FEATURE_WORD,
923 "npt", "lbrv", "svm-lock", "nrip-save",
924 "tsc-scale", "vmcb-clean", "flushbyasid", "decodeassists",
925 NULL, NULL, "pause-filter", NULL,
926 "pfthreshold", NULL, NULL, NULL,
927 NULL, NULL, NULL, NULL,
928 NULL, NULL, NULL, NULL,
929 NULL, NULL, NULL, NULL,
930 NULL, NULL, NULL, NULL,
932 .cpuid = { .eax = 0x8000000A, .reg = R_EDX, },
933 .tcg_features = TCG_SVM_FEATURES,
936 .type = CPUID_FEATURE_WORD,
938 "fsgsbase", "tsc-adjust", NULL, "bmi1",
939 "hle", "avx2", NULL, "smep",
940 "bmi2", "erms", "invpcid", "rtm",
941 NULL, NULL, "mpx", NULL,
942 "avx512f", "avx512dq", "rdseed", "adx",
943 "smap", "avx512ifma", "pcommit", "clflushopt",
944 "clwb", "intel-pt", "avx512pf", "avx512er",
945 "avx512cd", "sha-ni", "avx512bw", "avx512vl",
949 .needs_ecx = true, .ecx = 0,
952 .tcg_features = TCG_7_0_EBX_FEATURES,
955 .type = CPUID_FEATURE_WORD,
957 NULL, "avx512vbmi", "umip", "pku",
958 NULL /* ospke */, "waitpkg", "avx512vbmi2", NULL,
959 "gfni", "vaes", "vpclmulqdq", "avx512vnni",
960 "avx512bitalg", NULL, "avx512-vpopcntdq", NULL,
961 "la57", NULL, NULL, NULL,
962 NULL, NULL, "rdpid", NULL,
963 NULL, "cldemote", NULL, "movdiri",
964 "movdir64b", NULL, NULL, NULL,
968 .needs_ecx = true, .ecx = 0,
971 .tcg_features = TCG_7_0_ECX_FEATURES,
974 .type = CPUID_FEATURE_WORD,
976 NULL, NULL, "avx512-4vnniw", "avx512-4fmaps",
977 "fsrm", NULL, NULL, NULL,
978 "avx512-vp2intersect", NULL, "md-clear", NULL,
979 NULL, NULL, "serialize", NULL,
980 "tsx-ldtrk", NULL, NULL /* pconfig */, NULL,
981 NULL, NULL, NULL, NULL,
982 NULL, NULL, "spec-ctrl", "stibp",
983 NULL, "arch-capabilities", "core-capability", "ssbd",
987 .needs_ecx = true, .ecx = 0,
990 .tcg_features = TCG_7_0_EDX_FEATURES,
993 .type = CPUID_FEATURE_WORD,
995 NULL, NULL, NULL, NULL,
996 NULL, "avx512-bf16", NULL, NULL,
997 NULL, NULL, NULL, NULL,
998 NULL, NULL, NULL, NULL,
999 NULL, NULL, NULL, NULL,
1000 NULL, NULL, NULL, NULL,
1001 NULL, NULL, NULL, NULL,
1002 NULL, NULL, NULL, NULL,
1006 .needs_ecx = true, .ecx = 1,
1009 .tcg_features = TCG_7_1_EAX_FEATURES,
1011 [FEAT_8000_0007_EDX] = {
1012 .type = CPUID_FEATURE_WORD,
1014 NULL, NULL, NULL, NULL,
1015 NULL, NULL, NULL, NULL,
1016 "invtsc", NULL, NULL, NULL,
1017 NULL, NULL, NULL, NULL,
1018 NULL, NULL, NULL, NULL,
1019 NULL, NULL, NULL, NULL,
1020 NULL, NULL, NULL, NULL,
1021 NULL, NULL, NULL, NULL,
1023 .cpuid = { .eax = 0x80000007, .reg = R_EDX, },
1024 .tcg_features = TCG_APM_FEATURES,
1025 .unmigratable_flags = CPUID_APM_INVTSC,
1027 [FEAT_8000_0008_EBX] = {
1028 .type = CPUID_FEATURE_WORD,
1030 "clzero", NULL, "xsaveerptr", NULL,
1031 NULL, NULL, NULL, NULL,
1032 NULL, "wbnoinvd", NULL, NULL,
1033 "ibpb", NULL, NULL, "amd-stibp",
1034 NULL, NULL, NULL, NULL,
1035 NULL, NULL, NULL, NULL,
1036 "amd-ssbd", "virt-ssbd", "amd-no-ssb", NULL,
1037 NULL, NULL, NULL, NULL,
1039 .cpuid = { .eax = 0x80000008, .reg = R_EBX, },
1041 .unmigratable_flags = 0,
1044 .type = CPUID_FEATURE_WORD,
1046 "xsaveopt", "xsavec", "xgetbv1", "xsaves",
1047 NULL, NULL, NULL, NULL,
1048 NULL, NULL, NULL, NULL,
1049 NULL, NULL, NULL, NULL,
1050 NULL, NULL, NULL, NULL,
1051 NULL, NULL, NULL, NULL,
1052 NULL, NULL, NULL, NULL,
1053 NULL, NULL, NULL, NULL,
1057 .needs_ecx = true, .ecx = 1,
1060 .tcg_features = TCG_XSAVE_FEATURES,
1063 .type = CPUID_FEATURE_WORD,
1065 NULL, NULL, "arat", NULL,
1066 NULL, NULL, NULL, NULL,
1067 NULL, NULL, NULL, NULL,
1068 NULL, NULL, NULL, NULL,
1069 NULL, NULL, NULL, NULL,
1070 NULL, NULL, NULL, NULL,
1071 NULL, NULL, NULL, NULL,
1072 NULL, NULL, NULL, NULL,
1074 .cpuid = { .eax = 6, .reg = R_EAX, },
1075 .tcg_features = TCG_6_EAX_FEATURES,
1077 [FEAT_XSAVE_COMP_LO] = {
1078 .type = CPUID_FEATURE_WORD,
1081 .needs_ecx = true, .ecx = 0,
1084 .tcg_features = ~0U,
1085 .migratable_flags = XSTATE_FP_MASK | XSTATE_SSE_MASK |
1086 XSTATE_YMM_MASK | XSTATE_BNDREGS_MASK | XSTATE_BNDCSR_MASK |
1087 XSTATE_OPMASK_MASK | XSTATE_ZMM_Hi256_MASK | XSTATE_Hi16_ZMM_MASK |
1090 [FEAT_XSAVE_COMP_HI] = {
1091 .type = CPUID_FEATURE_WORD,
1094 .needs_ecx = true, .ecx = 0,
1097 .tcg_features = ~0U,
1099 /*Below are MSR exposed features*/
1100 [FEAT_ARCH_CAPABILITIES] = {
1101 .type = MSR_FEATURE_WORD,
1103 "rdctl-no", "ibrs-all", "rsba", "skip-l1dfl-vmentry",
1104 "ssb-no", "mds-no", "pschange-mc-no", "tsx-ctrl",
1105 "taa-no", NULL, NULL, NULL,
1106 NULL, NULL, NULL, NULL,
1107 NULL, NULL, NULL, NULL,
1108 NULL, NULL, NULL, NULL,
1109 NULL, NULL, NULL, NULL,
1110 NULL, NULL, NULL, NULL,
1113 .index = MSR_IA32_ARCH_CAPABILITIES,
1116 [FEAT_CORE_CAPABILITY] = {
1117 .type = MSR_FEATURE_WORD,
1119 NULL, NULL, NULL, NULL,
1120 NULL, "split-lock-detect", NULL, NULL,
1121 NULL, NULL, NULL, NULL,
1122 NULL, NULL, NULL, NULL,
1123 NULL, NULL, NULL, NULL,
1124 NULL, NULL, NULL, NULL,
1125 NULL, NULL, NULL, NULL,
1126 NULL, NULL, NULL, NULL,
1129 .index = MSR_IA32_CORE_CAPABILITY,
1132 [FEAT_PERF_CAPABILITIES] = {
1133 .type = MSR_FEATURE_WORD,
1135 NULL, NULL, NULL, NULL,
1136 NULL, NULL, NULL, NULL,
1137 NULL, NULL, NULL, NULL,
1138 NULL, "full-width-write", NULL, NULL,
1139 NULL, NULL, NULL, NULL,
1140 NULL, NULL, NULL, NULL,
1141 NULL, NULL, NULL, NULL,
1142 NULL, NULL, NULL, NULL,
1145 .index = MSR_IA32_PERF_CAPABILITIES,
1149 [FEAT_VMX_PROCBASED_CTLS] = {
1150 .type = MSR_FEATURE_WORD,
1152 NULL, NULL, "vmx-vintr-pending", "vmx-tsc-offset",
1153 NULL, NULL, NULL, "vmx-hlt-exit",
1154 NULL, "vmx-invlpg-exit", "vmx-mwait-exit", "vmx-rdpmc-exit",
1155 "vmx-rdtsc-exit", NULL, NULL, "vmx-cr3-load-noexit",
1156 "vmx-cr3-store-noexit", NULL, NULL, "vmx-cr8-load-exit",
1157 "vmx-cr8-store-exit", "vmx-flexpriority", "vmx-vnmi-pending", "vmx-movdr-exit",
1158 "vmx-io-exit", "vmx-io-bitmap", NULL, "vmx-mtf",
1159 "vmx-msr-bitmap", "vmx-monitor-exit", "vmx-pause-exit", "vmx-secondary-ctls",
1162 .index = MSR_IA32_VMX_TRUE_PROCBASED_CTLS,
1166 [FEAT_VMX_SECONDARY_CTLS] = {
1167 .type = MSR_FEATURE_WORD,
1169 "vmx-apicv-xapic", "vmx-ept", "vmx-desc-exit", "vmx-rdtscp-exit",
1170 "vmx-apicv-x2apic", "vmx-vpid", "vmx-wbinvd-exit", "vmx-unrestricted-guest",
1171 "vmx-apicv-register", "vmx-apicv-vid", "vmx-ple", "vmx-rdrand-exit",
1172 "vmx-invpcid-exit", "vmx-vmfunc", "vmx-shadow-vmcs", "vmx-encls-exit",
1173 "vmx-rdseed-exit", "vmx-pml", NULL, NULL,
1174 "vmx-xsaves", NULL, NULL, NULL,
1175 NULL, NULL, NULL, NULL,
1176 NULL, NULL, NULL, NULL,
1179 .index = MSR_IA32_VMX_PROCBASED_CTLS2,
1183 [FEAT_VMX_PINBASED_CTLS] = {
1184 .type = MSR_FEATURE_WORD,
1186 "vmx-intr-exit", NULL, NULL, "vmx-nmi-exit",
1187 NULL, "vmx-vnmi", "vmx-preemption-timer", "vmx-posted-intr",
1188 NULL, NULL, NULL, NULL,
1189 NULL, NULL, NULL, NULL,
1190 NULL, NULL, NULL, NULL,
1191 NULL, NULL, NULL, NULL,
1192 NULL, NULL, NULL, NULL,
1193 NULL, NULL, NULL, NULL,
1196 .index = MSR_IA32_VMX_TRUE_PINBASED_CTLS,
1200 [FEAT_VMX_EXIT_CTLS] = {
1201 .type = MSR_FEATURE_WORD,
1203 * VMX_VM_EXIT_HOST_ADDR_SPACE_SIZE is copied from
1207 NULL, NULL, "vmx-exit-nosave-debugctl", NULL,
1208 NULL, NULL, NULL, NULL,
1209 NULL, NULL /* vmx-exit-host-addr-space-size */, NULL, NULL,
1210 "vmx-exit-load-perf-global-ctrl", NULL, NULL, "vmx-exit-ack-intr",
1211 NULL, NULL, "vmx-exit-save-pat", "vmx-exit-load-pat",
1212 "vmx-exit-save-efer", "vmx-exit-load-efer",
1213 "vmx-exit-save-preemption-timer", "vmx-exit-clear-bndcfgs",
1214 NULL, "vmx-exit-clear-rtit-ctl", NULL, NULL,
1215 NULL, NULL, NULL, NULL,
1218 .index = MSR_IA32_VMX_TRUE_EXIT_CTLS,
1222 [FEAT_VMX_ENTRY_CTLS] = {
1223 .type = MSR_FEATURE_WORD,
1225 NULL, NULL, "vmx-entry-noload-debugctl", NULL,
1226 NULL, NULL, NULL, NULL,
1227 NULL, "vmx-entry-ia32e-mode", NULL, NULL,
1228 NULL, "vmx-entry-load-perf-global-ctrl", "vmx-entry-load-pat", "vmx-entry-load-efer",
1229 "vmx-entry-load-bndcfgs", NULL, "vmx-entry-load-rtit-ctl", NULL,
1230 NULL, NULL, NULL, NULL,
1231 NULL, NULL, NULL, NULL,
1232 NULL, NULL, NULL, NULL,
1235 .index = MSR_IA32_VMX_TRUE_ENTRY_CTLS,
1240 .type = MSR_FEATURE_WORD,
1242 NULL, NULL, NULL, NULL,
1243 NULL, "vmx-store-lma", "vmx-activity-hlt", "vmx-activity-shutdown",
1244 "vmx-activity-wait-sipi", NULL, NULL, NULL,
1245 NULL, NULL, NULL, NULL,
1246 NULL, NULL, NULL, NULL,
1247 NULL, NULL, NULL, NULL,
1248 NULL, NULL, NULL, NULL,
1249 NULL, "vmx-vmwrite-vmexit-fields", "vmx-zero-len-inject", NULL,
1252 .index = MSR_IA32_VMX_MISC,
1256 [FEAT_VMX_EPT_VPID_CAPS] = {
1257 .type = MSR_FEATURE_WORD,
1259 "vmx-ept-execonly", NULL, NULL, NULL,
1260 NULL, NULL, "vmx-page-walk-4", "vmx-page-walk-5",
1261 NULL, NULL, NULL, NULL,
1262 NULL, NULL, NULL, NULL,
1263 "vmx-ept-2mb", "vmx-ept-1gb", NULL, NULL,
1264 "vmx-invept", "vmx-eptad", "vmx-ept-advanced-exitinfo", NULL,
1265 NULL, "vmx-invept-single-context", "vmx-invept-all-context", NULL,
1266 NULL, NULL, NULL, NULL,
1267 "vmx-invvpid", NULL, NULL, NULL,
1268 NULL, NULL, NULL, NULL,
1269 "vmx-invvpid-single-addr", "vmx-invept-single-context",
1270 "vmx-invvpid-all-context", "vmx-invept-single-context-noglobals",
1271 NULL, NULL, NULL, NULL,
1272 NULL, NULL, NULL, NULL,
1273 NULL, NULL, NULL, NULL,
1274 NULL, NULL, NULL, NULL,
1275 NULL, NULL, NULL, NULL,
1278 .index = MSR_IA32_VMX_EPT_VPID_CAP,
1282 [FEAT_VMX_BASIC] = {
1283 .type = MSR_FEATURE_WORD,
1285 [54] = "vmx-ins-outs",
1286 [55] = "vmx-true-ctls",
1289 .index = MSR_IA32_VMX_BASIC,
1291 /* Just to be safe - we don't support setting the MSEG version field. */
1292 .no_autoenable_flags = MSR_VMX_BASIC_DUAL_MONITOR,
1295 [FEAT_VMX_VMFUNC] = {
1296 .type = MSR_FEATURE_WORD,
1298 [0] = "vmx-eptp-switching",
1301 .index = MSR_IA32_VMX_VMFUNC,
1306 .type = CPUID_FEATURE_WORD,
1308 NULL, NULL, NULL, NULL,
1309 NULL, NULL, NULL, NULL,
1310 NULL, NULL, NULL, NULL,
1311 NULL, NULL, NULL, NULL,
1312 NULL, NULL, NULL, NULL,
1313 NULL, NULL, NULL, NULL,
1314 NULL, NULL, NULL, NULL,
1315 NULL, NULL, NULL, "intel-pt-lip",
1319 .needs_ecx = true, .ecx = 0,
1322 .tcg_features = TCG_14_0_ECX_FEATURES,
1327 typedef struct FeatureMask {
1332 typedef struct FeatureDep {
1333 FeatureMask from, to;
1336 static FeatureDep feature_dependencies[] = {
1338 .from = { FEAT_7_0_EDX, CPUID_7_0_EDX_ARCH_CAPABILITIES },
1339 .to = { FEAT_ARCH_CAPABILITIES, ~0ull },
1342 .from = { FEAT_7_0_EDX, CPUID_7_0_EDX_CORE_CAPABILITY },
1343 .to = { FEAT_CORE_CAPABILITY, ~0ull },
1346 .from = { FEAT_1_ECX, CPUID_EXT_PDCM },
1347 .to = { FEAT_PERF_CAPABILITIES, ~0ull },
1350 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1351 .to = { FEAT_VMX_PROCBASED_CTLS, ~0ull },
1354 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1355 .to = { FEAT_VMX_PINBASED_CTLS, ~0ull },
1358 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1359 .to = { FEAT_VMX_EXIT_CTLS, ~0ull },
1362 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1363 .to = { FEAT_VMX_ENTRY_CTLS, ~0ull },
1366 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1367 .to = { FEAT_VMX_MISC, ~0ull },
1370 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1371 .to = { FEAT_VMX_BASIC, ~0ull },
1374 .from = { FEAT_8000_0001_EDX, CPUID_EXT2_LM },
1375 .to = { FEAT_VMX_ENTRY_CTLS, VMX_VM_ENTRY_IA32E_MODE },
1378 .from = { FEAT_VMX_PROCBASED_CTLS, VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS },
1379 .to = { FEAT_VMX_SECONDARY_CTLS, ~0ull },
1382 .from = { FEAT_XSAVE, CPUID_XSAVE_XSAVES },
1383 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_XSAVES },
1386 .from = { FEAT_1_ECX, CPUID_EXT_RDRAND },
1387 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDRAND_EXITING },
1390 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_INVPCID },
1391 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_INVPCID },
1394 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_RDSEED },
1395 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDSEED_EXITING },
1398 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_INTEL_PT },
1399 .to = { FEAT_14_0_ECX, ~0ull },
1402 .from = { FEAT_8000_0001_EDX, CPUID_EXT2_RDTSCP },
1403 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDTSCP },
1406 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_EPT },
1407 .to = { FEAT_VMX_EPT_VPID_CAPS, 0xffffffffull },
1410 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_EPT },
1411 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST },
1414 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_VPID },
1415 .to = { FEAT_VMX_EPT_VPID_CAPS, 0xffffffffull << 32 },
1418 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_VMFUNC },
1419 .to = { FEAT_VMX_VMFUNC, ~0ull },
1422 .from = { FEAT_8000_0001_ECX, CPUID_EXT3_SVM },
1423 .to = { FEAT_SVM, ~0ull },
1427 typedef struct X86RegisterInfo32 {
1428 /* Name of register */
1430 /* QAPI enum value register */
1431 X86CPURegister32 qapi_enum;
1432 } X86RegisterInfo32;
1434 #define REGISTER(reg) \
1435 [R_##reg] = { .name = #reg, .qapi_enum = X86_CPU_REGISTER32_##reg }
1436 static const X86RegisterInfo32 x86_reg_info_32[CPU_NB_REGS32] = {
1448 typedef struct ExtSaveArea {
1449 uint32_t feature, bits;
1450 uint32_t offset, size;
1453 static const ExtSaveArea x86_ext_save_areas[] = {
1455 /* x87 FP state component is always enabled if XSAVE is supported */
1456 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
1457 /* x87 state is in the legacy region of the XSAVE area */
1459 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1461 [XSTATE_SSE_BIT] = {
1462 /* SSE state component is always enabled if XSAVE is supported */
1463 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
1464 /* SSE state is in the legacy region of the XSAVE area */
1466 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1469 { .feature = FEAT_1_ECX, .bits = CPUID_EXT_AVX,
1470 .offset = offsetof(X86XSaveArea, avx_state),
1471 .size = sizeof(XSaveAVX) },
1472 [XSTATE_BNDREGS_BIT] =
1473 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
1474 .offset = offsetof(X86XSaveArea, bndreg_state),
1475 .size = sizeof(XSaveBNDREG) },
1476 [XSTATE_BNDCSR_BIT] =
1477 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
1478 .offset = offsetof(X86XSaveArea, bndcsr_state),
1479 .size = sizeof(XSaveBNDCSR) },
1480 [XSTATE_OPMASK_BIT] =
1481 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1482 .offset = offsetof(X86XSaveArea, opmask_state),
1483 .size = sizeof(XSaveOpmask) },
1484 [XSTATE_ZMM_Hi256_BIT] =
1485 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1486 .offset = offsetof(X86XSaveArea, zmm_hi256_state),
1487 .size = sizeof(XSaveZMM_Hi256) },
1488 [XSTATE_Hi16_ZMM_BIT] =
1489 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1490 .offset = offsetof(X86XSaveArea, hi16_zmm_state),
1491 .size = sizeof(XSaveHi16_ZMM) },
1493 { .feature = FEAT_7_0_ECX, .bits = CPUID_7_0_ECX_PKU,
1494 .offset = offsetof(X86XSaveArea, pkru_state),
1495 .size = sizeof(XSavePKRU) },
1498 static uint32_t xsave_area_size(uint64_t mask)
1503 for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
1504 const ExtSaveArea *esa = &x86_ext_save_areas[i];
1505 if ((mask >> i) & 1) {
1506 ret = MAX(ret, esa->offset + esa->size);
1512 static inline bool accel_uses_host_cpuid(void)
1514 return kvm_enabled() || hvf_enabled();
1517 static inline uint64_t x86_cpu_xsave_components(X86CPU *cpu)
1519 return ((uint64_t)cpu->env.features[FEAT_XSAVE_COMP_HI]) << 32 |
1520 cpu->env.features[FEAT_XSAVE_COMP_LO];
1523 const char *get_register_name_32(unsigned int reg)
1525 if (reg >= CPU_NB_REGS32) {
1528 return x86_reg_info_32[reg].name;
1532 * Returns the set of feature flags that are supported and migratable by
1533 * QEMU, for a given FeatureWord.
1535 static uint64_t x86_cpu_get_migratable_flags(FeatureWord w)
1537 FeatureWordInfo *wi = &feature_word_info[w];
1541 for (i = 0; i < 64; i++) {
1542 uint64_t f = 1ULL << i;
1544 /* If the feature name is known, it is implicitly considered migratable,
1545 * unless it is explicitly set in unmigratable_flags */
1546 if ((wi->migratable_flags & f) ||
1547 (wi->feat_names[i] && !(wi->unmigratable_flags & f))) {
1554 void host_cpuid(uint32_t function, uint32_t count,
1555 uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
1560 asm volatile("cpuid"
1561 : "=a"(vec[0]), "=b"(vec[1]),
1562 "=c"(vec[2]), "=d"(vec[3])
1563 : "0"(function), "c"(count) : "cc");
1564 #elif defined(__i386__)
1565 asm volatile("pusha \n\t"
1567 "mov %%eax, 0(%2) \n\t"
1568 "mov %%ebx, 4(%2) \n\t"
1569 "mov %%ecx, 8(%2) \n\t"
1570 "mov %%edx, 12(%2) \n\t"
1572 : : "a"(function), "c"(count), "S"(vec)
1588 void host_vendor_fms(char *vendor, int *family, int *model, int *stepping)
1590 uint32_t eax, ebx, ecx, edx;
1592 host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx);
1593 x86_cpu_vendor_words2str(vendor, ebx, edx, ecx);
1595 host_cpuid(0x1, 0, &eax, &ebx, &ecx, &edx);
1597 *family = ((eax >> 8) & 0x0F) + ((eax >> 20) & 0xFF);
1600 *model = ((eax >> 4) & 0x0F) | ((eax & 0xF0000) >> 12);
1603 *stepping = eax & 0x0F;
1607 /* CPU class name definitions: */
1609 /* Return type name for a given CPU model name
1610 * Caller is responsible for freeing the returned string.
1612 static char *x86_cpu_type_name(const char *model_name)
1614 return g_strdup_printf(X86_CPU_TYPE_NAME("%s"), model_name);
1617 static ObjectClass *x86_cpu_class_by_name(const char *cpu_model)
1619 g_autofree char *typename = x86_cpu_type_name(cpu_model);
1620 return object_class_by_name(typename);
1623 static char *x86_cpu_class_get_model_name(X86CPUClass *cc)
1625 const char *class_name = object_class_get_name(OBJECT_CLASS(cc));
1626 assert(g_str_has_suffix(class_name, X86_CPU_TYPE_SUFFIX));
1627 return g_strndup(class_name,
1628 strlen(class_name) - strlen(X86_CPU_TYPE_SUFFIX));
1631 typedef struct PropValue {
1632 const char *prop, *value;
1635 typedef struct X86CPUVersionDefinition {
1636 X86CPUVersion version;
1640 } X86CPUVersionDefinition;
1642 /* Base definition for a CPU model */
1643 typedef struct X86CPUDefinition {
1647 /* vendor is zero-terminated, 12 character ASCII string */
1648 char vendor[CPUID_VENDOR_SZ + 1];
1652 FeatureWordArray features;
1653 const char *model_id;
1654 CPUCaches *cache_info;
1656 * Definitions for alternative versions of CPU model.
1657 * List is terminated by item with version == 0.
1658 * If NULL, version 1 will be registered automatically.
1660 const X86CPUVersionDefinition *versions;
1661 const char *deprecation_note;
1664 /* Reference to a specific CPU model version */
1665 struct X86CPUModel {
1666 /* Base CPU definition */
1667 X86CPUDefinition *cpudef;
1668 /* CPU model version */
1669 X86CPUVersion version;
1672 * If true, this is an alias CPU model.
1673 * This matters only for "-cpu help" and query-cpu-definitions
1678 /* Get full model name for CPU version */
1679 static char *x86_cpu_versioned_model_name(X86CPUDefinition *cpudef,
1680 X86CPUVersion version)
1682 assert(version > 0);
1683 return g_strdup_printf("%s-v%d", cpudef->name, (int)version);
1686 static const X86CPUVersionDefinition *x86_cpu_def_get_versions(X86CPUDefinition *def)
1688 /* When X86CPUDefinition::versions is NULL, we register only v1 */
1689 static const X86CPUVersionDefinition default_version_list[] = {
1691 { /* end of list */ }
1694 return def->versions ?: default_version_list;
1697 static CPUCaches epyc_cache_info = {
1698 .l1d_cache = &(CPUCacheInfo) {
1708 .no_invd_sharing = true,
1710 .l1i_cache = &(CPUCacheInfo) {
1711 .type = INSTRUCTION_CACHE,
1720 .no_invd_sharing = true,
1722 .l2_cache = &(CPUCacheInfo) {
1723 .type = UNIFIED_CACHE,
1732 .l3_cache = &(CPUCacheInfo) {
1733 .type = UNIFIED_CACHE,
1737 .associativity = 16,
1743 .complex_indexing = true,
1747 static CPUCaches epyc_rome_cache_info = {
1748 .l1d_cache = &(CPUCacheInfo) {
1758 .no_invd_sharing = true,
1760 .l1i_cache = &(CPUCacheInfo) {
1761 .type = INSTRUCTION_CACHE,
1770 .no_invd_sharing = true,
1772 .l2_cache = &(CPUCacheInfo) {
1773 .type = UNIFIED_CACHE,
1782 .l3_cache = &(CPUCacheInfo) {
1783 .type = UNIFIED_CACHE,
1787 .associativity = 16,
1793 .complex_indexing = true,
1797 /* The following VMX features are not supported by KVM and are left out in the
1800 * Dual-monitor support (all processors)
1802 * Deactivate dual-monitor treatment
1803 * Number of CR3-target values
1804 * Shutdown activity state
1805 * Wait-for-SIPI activity state
1806 * PAUSE-loop exiting (Westmere and newer)
1807 * EPT-violation #VE (Broadwell and newer)
1808 * Inject event with insn length=0 (Skylake and newer)
1809 * Conceal non-root operation from PT
1810 * Conceal VM exits from PT
1811 * Conceal VM entries from PT
1812 * Enable ENCLS exiting
1813 * Mode-based execute control (XS/XU)
1814 s TSC scaling (Skylake Server and newer)
1815 * GPA translation for PT (IceLake and newer)
1816 * User wait and pause
1818 * Load IA32_RTIT_CTL
1819 * Clear IA32_RTIT_CTL
1820 * Advanced VM-exit information for EPT violations
1821 * Sub-page write permissions
1822 * PT in VMX operation
1825 static X86CPUDefinition builtin_x86_defs[] = {
1829 .vendor = CPUID_VENDOR_AMD,
1833 .features[FEAT_1_EDX] =
1835 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1837 .features[FEAT_1_ECX] =
1838 CPUID_EXT_SSE3 | CPUID_EXT_CX16,
1839 .features[FEAT_8000_0001_EDX] =
1840 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1841 .features[FEAT_8000_0001_ECX] =
1842 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM,
1843 .xlevel = 0x8000000A,
1844 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
1849 .vendor = CPUID_VENDOR_AMD,
1853 /* Missing: CPUID_HT */
1854 .features[FEAT_1_EDX] =
1856 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1857 CPUID_PSE36 | CPUID_VME,
1858 .features[FEAT_1_ECX] =
1859 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_CX16 |
1861 .features[FEAT_8000_0001_EDX] =
1862 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX |
1863 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_MMXEXT |
1864 CPUID_EXT2_FFXSR | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP,
1865 /* Missing: CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
1867 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
1868 CPUID_EXT3_OSVW, CPUID_EXT3_IBS */
1869 .features[FEAT_8000_0001_ECX] =
1870 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM |
1871 CPUID_EXT3_ABM | CPUID_EXT3_SSE4A,
1872 /* Missing: CPUID_SVM_LBRV */
1873 .features[FEAT_SVM] =
1875 .xlevel = 0x8000001A,
1876 .model_id = "AMD Phenom(tm) 9550 Quad-Core Processor"
1881 .vendor = CPUID_VENDOR_INTEL,
1885 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
1886 .features[FEAT_1_EDX] =
1888 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1889 CPUID_PSE36 | CPUID_VME | CPUID_ACPI | CPUID_SS,
1890 /* Missing: CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_EST,
1891 * CPUID_EXT_TM2, CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_VMX */
1892 .features[FEAT_1_ECX] =
1893 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
1895 .features[FEAT_8000_0001_EDX] =
1896 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1897 .features[FEAT_8000_0001_ECX] =
1899 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
1900 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
1901 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
1902 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
1903 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
1904 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
1905 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
1906 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
1907 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
1908 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
1909 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
1910 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
1911 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
1912 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
1913 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
1914 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
1915 .features[FEAT_VMX_SECONDARY_CTLS] =
1916 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES,
1917 .xlevel = 0x80000008,
1918 .model_id = "Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz",
1923 .vendor = CPUID_VENDOR_INTEL,
1927 /* Missing: CPUID_HT */
1928 .features[FEAT_1_EDX] =
1929 PPRO_FEATURES | CPUID_VME |
1930 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1932 /* Missing: CPUID_EXT_POPCNT, CPUID_EXT_MONITOR */
1933 .features[FEAT_1_ECX] =
1934 CPUID_EXT_SSE3 | CPUID_EXT_CX16,
1935 /* Missing: CPUID_EXT2_PDPE1GB, CPUID_EXT2_RDTSCP */
1936 .features[FEAT_8000_0001_EDX] =
1937 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1938 /* Missing: CPUID_EXT3_LAHF_LM, CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
1939 CPUID_EXT3_CR8LEG, CPUID_EXT3_ABM, CPUID_EXT3_SSE4A,
1940 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
1941 CPUID_EXT3_OSVW, CPUID_EXT3_IBS, CPUID_EXT3_SVM */
1942 .features[FEAT_8000_0001_ECX] =
1944 /* VMX features from Cedar Mill/Prescott */
1945 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
1946 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
1947 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
1948 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
1949 VMX_PIN_BASED_NMI_EXITING,
1950 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
1951 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
1952 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
1953 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
1954 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
1955 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
1956 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
1957 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING,
1958 .xlevel = 0x80000008,
1959 .model_id = "Common KVM processor"
1964 .vendor = CPUID_VENDOR_INTEL,
1968 .features[FEAT_1_EDX] =
1970 .features[FEAT_1_ECX] =
1972 .xlevel = 0x80000004,
1973 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
1978 .vendor = CPUID_VENDOR_INTEL,
1982 .features[FEAT_1_EDX] =
1983 PPRO_FEATURES | CPUID_VME |
1984 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_PSE36,
1985 .features[FEAT_1_ECX] =
1987 .features[FEAT_8000_0001_ECX] =
1989 /* VMX features from Yonah */
1990 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
1991 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
1992 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
1993 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
1994 VMX_PIN_BASED_NMI_EXITING,
1995 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
1996 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
1997 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
1998 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
1999 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
2000 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
2001 VMX_CPU_BASED_PAUSE_EXITING | VMX_CPU_BASED_USE_MSR_BITMAPS,
2002 .xlevel = 0x80000008,
2003 .model_id = "Common 32-bit KVM processor"
2008 .vendor = CPUID_VENDOR_INTEL,
2012 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
2013 .features[FEAT_1_EDX] =
2014 PPRO_FEATURES | CPUID_VME |
2015 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_ACPI |
2017 /* Missing: CPUID_EXT_EST, CPUID_EXT_TM2 , CPUID_EXT_XTPR,
2018 * CPUID_EXT_PDCM, CPUID_EXT_VMX */
2019 .features[FEAT_1_ECX] =
2020 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR,
2021 .features[FEAT_8000_0001_EDX] =
2023 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
2024 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
2025 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2026 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2027 VMX_PIN_BASED_NMI_EXITING,
2028 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2029 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2030 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2031 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2032 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
2033 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
2034 VMX_CPU_BASED_PAUSE_EXITING | VMX_CPU_BASED_USE_MSR_BITMAPS,
2035 .xlevel = 0x80000008,
2036 .model_id = "Genuine Intel(R) CPU T2600 @ 2.16GHz",
2041 .vendor = CPUID_VENDOR_INTEL,
2045 .features[FEAT_1_EDX] =
2053 .vendor = CPUID_VENDOR_INTEL,
2057 .features[FEAT_1_EDX] =
2065 .vendor = CPUID_VENDOR_INTEL,
2069 .features[FEAT_1_EDX] =
2077 .vendor = CPUID_VENDOR_INTEL,
2081 .features[FEAT_1_EDX] =
2089 .vendor = CPUID_VENDOR_AMD,
2093 .features[FEAT_1_EDX] =
2094 PPRO_FEATURES | CPUID_PSE36 | CPUID_VME | CPUID_MTRR |
2096 .features[FEAT_8000_0001_EDX] =
2097 CPUID_EXT2_MMXEXT | CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT,
2098 .xlevel = 0x80000008,
2099 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
2104 .vendor = CPUID_VENDOR_INTEL,
2108 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
2109 .features[FEAT_1_EDX] =
2111 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_VME |
2112 CPUID_ACPI | CPUID_SS,
2113 /* Some CPUs got no CPUID_SEP */
2114 /* Missing: CPUID_EXT_DSCPL, CPUID_EXT_EST, CPUID_EXT_TM2,
2116 .features[FEAT_1_ECX] =
2117 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
2119 .features[FEAT_8000_0001_EDX] =
2121 .features[FEAT_8000_0001_ECX] =
2123 .xlevel = 0x80000008,
2124 .model_id = "Intel(R) Atom(TM) CPU N270 @ 1.60GHz",
2129 .vendor = CPUID_VENDOR_INTEL,
2133 .features[FEAT_1_EDX] =
2134 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2135 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2136 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2137 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2138 CPUID_DE | CPUID_FP87,
2139 .features[FEAT_1_ECX] =
2140 CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
2141 .features[FEAT_8000_0001_EDX] =
2142 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2143 .features[FEAT_8000_0001_ECX] =
2145 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
2146 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
2147 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
2148 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2149 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2150 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
2151 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2152 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2153 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2154 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2155 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2156 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2157 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2158 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2159 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2160 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2161 .features[FEAT_VMX_SECONDARY_CTLS] =
2162 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES,
2163 .xlevel = 0x80000008,
2164 .model_id = "Intel Celeron_4x0 (Conroe/Merom Class Core 2)",
2169 .vendor = CPUID_VENDOR_INTEL,
2173 .features[FEAT_1_EDX] =
2174 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2175 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2176 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2177 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2178 CPUID_DE | CPUID_FP87,
2179 .features[FEAT_1_ECX] =
2180 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2182 .features[FEAT_8000_0001_EDX] =
2183 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2184 .features[FEAT_8000_0001_ECX] =
2186 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
2187 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2188 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL,
2189 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT |
2190 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL,
2191 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2192 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2193 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
2194 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2195 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2196 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2197 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2198 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2199 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2200 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2201 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2202 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2203 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2204 .features[FEAT_VMX_SECONDARY_CTLS] =
2205 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2206 VMX_SECONDARY_EXEC_WBINVD_EXITING,
2207 .xlevel = 0x80000008,
2208 .model_id = "Intel Core 2 Duo P9xxx (Penryn Class Core 2)",
2213 .vendor = CPUID_VENDOR_INTEL,
2217 .features[FEAT_1_EDX] =
2218 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2219 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2220 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2221 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2222 CPUID_DE | CPUID_FP87,
2223 .features[FEAT_1_ECX] =
2224 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2225 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
2226 .features[FEAT_8000_0001_EDX] =
2227 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2228 .features[FEAT_8000_0001_ECX] =
2230 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2231 MSR_VMX_BASIC_TRUE_CTLS,
2232 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2233 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2234 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2235 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2236 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2237 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2238 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2239 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2240 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2241 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
2242 .features[FEAT_VMX_EXIT_CTLS] =
2243 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2244 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2245 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2246 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2247 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2248 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2249 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2250 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2251 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
2252 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2253 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2254 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2255 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2256 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2257 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2258 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2259 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2260 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2261 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2262 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2263 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2264 .features[FEAT_VMX_SECONDARY_CTLS] =
2265 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2266 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2267 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2268 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2269 VMX_SECONDARY_EXEC_ENABLE_VPID,
2270 .xlevel = 0x80000008,
2271 .model_id = "Intel Core i7 9xx (Nehalem Class Core i7)",
2272 .versions = (X86CPUVersionDefinition[]) {
2276 .alias = "Nehalem-IBRS",
2277 .props = (PropValue[]) {
2278 { "spec-ctrl", "on" },
2280 "Intel Core i7 9xx (Nehalem Core i7, IBRS update)" },
2281 { /* end of list */ }
2284 { /* end of list */ }
2290 .vendor = CPUID_VENDOR_INTEL,
2294 .features[FEAT_1_EDX] =
2295 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2296 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2297 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2298 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2299 CPUID_DE | CPUID_FP87,
2300 .features[FEAT_1_ECX] =
2301 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
2302 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2303 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
2304 .features[FEAT_8000_0001_EDX] =
2305 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2306 .features[FEAT_8000_0001_ECX] =
2308 .features[FEAT_6_EAX] =
2310 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2311 MSR_VMX_BASIC_TRUE_CTLS,
2312 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2313 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2314 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2315 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2316 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2317 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2318 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2319 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2320 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2321 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
2322 .features[FEAT_VMX_EXIT_CTLS] =
2323 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2324 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2325 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2326 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2327 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2328 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2329 MSR_VMX_MISC_STORE_LMA,
2330 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2331 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2332 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
2333 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2334 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2335 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2336 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2337 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2338 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2339 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2340 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2341 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2342 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2343 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2344 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2345 .features[FEAT_VMX_SECONDARY_CTLS] =
2346 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2347 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2348 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2349 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2350 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST,
2351 .xlevel = 0x80000008,
2352 .model_id = "Westmere E56xx/L56xx/X56xx (Nehalem-C)",
2353 .versions = (X86CPUVersionDefinition[]) {
2357 .alias = "Westmere-IBRS",
2358 .props = (PropValue[]) {
2359 { "spec-ctrl", "on" },
2361 "Westmere E56xx/L56xx/X56xx (IBRS update)" },
2362 { /* end of list */ }
2365 { /* end of list */ }
2369 .name = "SandyBridge",
2371 .vendor = CPUID_VENDOR_INTEL,
2375 .features[FEAT_1_EDX] =
2376 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2377 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2378 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2379 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2380 CPUID_DE | CPUID_FP87,
2381 .features[FEAT_1_ECX] =
2382 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2383 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
2384 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2385 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
2387 .features[FEAT_8000_0001_EDX] =
2388 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2390 .features[FEAT_8000_0001_ECX] =
2392 .features[FEAT_XSAVE] =
2393 CPUID_XSAVE_XSAVEOPT,
2394 .features[FEAT_6_EAX] =
2396 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2397 MSR_VMX_BASIC_TRUE_CTLS,
2398 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2399 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2400 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2401 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2402 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2403 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2404 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2405 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2406 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2407 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
2408 .features[FEAT_VMX_EXIT_CTLS] =
2409 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2410 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2411 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2412 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2413 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2414 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2415 MSR_VMX_MISC_STORE_LMA,
2416 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2417 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2418 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
2419 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2420 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2421 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2422 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2423 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2424 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2425 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2426 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2427 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2428 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2429 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2430 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2431 .features[FEAT_VMX_SECONDARY_CTLS] =
2432 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2433 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2434 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2435 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2436 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST,
2437 .xlevel = 0x80000008,
2438 .model_id = "Intel Xeon E312xx (Sandy Bridge)",
2439 .versions = (X86CPUVersionDefinition[]) {
2443 .alias = "SandyBridge-IBRS",
2444 .props = (PropValue[]) {
2445 { "spec-ctrl", "on" },
2447 "Intel Xeon E312xx (Sandy Bridge, IBRS update)" },
2448 { /* end of list */ }
2451 { /* end of list */ }
2455 .name = "IvyBridge",
2457 .vendor = CPUID_VENDOR_INTEL,
2461 .features[FEAT_1_EDX] =
2462 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2463 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2464 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2465 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2466 CPUID_DE | CPUID_FP87,
2467 .features[FEAT_1_ECX] =
2468 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2469 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
2470 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2471 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
2472 CPUID_EXT_SSE3 | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2473 .features[FEAT_7_0_EBX] =
2474 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP |
2476 .features[FEAT_8000_0001_EDX] =
2477 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2479 .features[FEAT_8000_0001_ECX] =
2481 .features[FEAT_XSAVE] =
2482 CPUID_XSAVE_XSAVEOPT,
2483 .features[FEAT_6_EAX] =
2485 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2486 MSR_VMX_BASIC_TRUE_CTLS,
2487 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2488 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2489 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2490 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2491 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2492 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2493 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2494 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2495 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2496 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
2497 .features[FEAT_VMX_EXIT_CTLS] =
2498 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2499 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2500 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2501 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2502 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2503 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2504 MSR_VMX_MISC_STORE_LMA,
2505 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2506 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2507 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
2508 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2509 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2510 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2511 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2512 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2513 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2514 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2515 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2516 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2517 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2518 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2519 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2520 .features[FEAT_VMX_SECONDARY_CTLS] =
2521 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2522 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2523 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2524 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2525 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
2526 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
2527 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
2528 VMX_SECONDARY_EXEC_RDRAND_EXITING,
2529 .xlevel = 0x80000008,
2530 .model_id = "Intel Xeon E3-12xx v2 (Ivy Bridge)",
2531 .versions = (X86CPUVersionDefinition[]) {
2535 .alias = "IvyBridge-IBRS",
2536 .props = (PropValue[]) {
2537 { "spec-ctrl", "on" },
2539 "Intel Xeon E3-12xx v2 (Ivy Bridge, IBRS)" },
2540 { /* end of list */ }
2543 { /* end of list */ }
2549 .vendor = CPUID_VENDOR_INTEL,
2553 .features[FEAT_1_EDX] =
2554 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2555 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2556 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2557 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2558 CPUID_DE | CPUID_FP87,
2559 .features[FEAT_1_ECX] =
2560 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2561 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2562 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2563 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2564 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2565 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2566 .features[FEAT_8000_0001_EDX] =
2567 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2569 .features[FEAT_8000_0001_ECX] =
2570 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
2571 .features[FEAT_7_0_EBX] =
2572 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2573 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2574 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2576 .features[FEAT_XSAVE] =
2577 CPUID_XSAVE_XSAVEOPT,
2578 .features[FEAT_6_EAX] =
2580 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2581 MSR_VMX_BASIC_TRUE_CTLS,
2582 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2583 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2584 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2585 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2586 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2587 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2588 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2589 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2590 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2591 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
2592 .features[FEAT_VMX_EXIT_CTLS] =
2593 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2594 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2595 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2596 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2597 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2598 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2599 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
2600 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2601 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2602 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
2603 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2604 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2605 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2606 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2607 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2608 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2609 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2610 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2611 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2612 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2613 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2614 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2615 .features[FEAT_VMX_SECONDARY_CTLS] =
2616 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2617 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2618 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2619 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2620 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
2621 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
2622 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
2623 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
2624 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS,
2625 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
2626 .xlevel = 0x80000008,
2627 .model_id = "Intel Core Processor (Haswell)",
2628 .versions = (X86CPUVersionDefinition[]) {
2632 .alias = "Haswell-noTSX",
2633 .props = (PropValue[]) {
2636 { "stepping", "1" },
2637 { "model-id", "Intel Core Processor (Haswell, no TSX)", },
2638 { /* end of list */ }
2643 .alias = "Haswell-IBRS",
2644 .props = (PropValue[]) {
2645 /* Restore TSX features removed by -v2 above */
2649 * Haswell and Haswell-IBRS had stepping=4 in
2650 * QEMU 4.0 and older
2652 { "stepping", "4" },
2653 { "spec-ctrl", "on" },
2655 "Intel Core Processor (Haswell, IBRS)" },
2656 { /* end of list */ }
2661 .alias = "Haswell-noTSX-IBRS",
2662 .props = (PropValue[]) {
2665 /* spec-ctrl was already enabled by -v3 above */
2666 { "stepping", "1" },
2668 "Intel Core Processor (Haswell, no TSX, IBRS)" },
2669 { /* end of list */ }
2672 { /* end of list */ }
2676 .name = "Broadwell",
2678 .vendor = CPUID_VENDOR_INTEL,
2682 .features[FEAT_1_EDX] =
2683 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2684 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2685 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2686 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2687 CPUID_DE | CPUID_FP87,
2688 .features[FEAT_1_ECX] =
2689 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2690 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2691 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2692 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2693 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2694 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2695 .features[FEAT_8000_0001_EDX] =
2696 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2698 .features[FEAT_8000_0001_ECX] =
2699 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2700 .features[FEAT_7_0_EBX] =
2701 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2702 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2703 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2704 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2706 .features[FEAT_XSAVE] =
2707 CPUID_XSAVE_XSAVEOPT,
2708 .features[FEAT_6_EAX] =
2710 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2711 MSR_VMX_BASIC_TRUE_CTLS,
2712 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2713 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2714 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2715 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2716 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2717 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2718 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2719 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2720 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2721 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
2722 .features[FEAT_VMX_EXIT_CTLS] =
2723 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2724 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2725 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2726 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2727 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2728 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2729 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
2730 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2731 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2732 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
2733 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2734 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2735 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2736 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2737 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2738 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2739 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2740 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2741 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2742 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2743 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2744 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2745 .features[FEAT_VMX_SECONDARY_CTLS] =
2746 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2747 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2748 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2749 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2750 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
2751 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
2752 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
2753 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
2754 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
2755 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
2756 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
2757 .xlevel = 0x80000008,
2758 .model_id = "Intel Core Processor (Broadwell)",
2759 .versions = (X86CPUVersionDefinition[]) {
2763 .alias = "Broadwell-noTSX",
2764 .props = (PropValue[]) {
2767 { "model-id", "Intel Core Processor (Broadwell, no TSX)", },
2768 { /* end of list */ }
2773 .alias = "Broadwell-IBRS",
2774 .props = (PropValue[]) {
2775 /* Restore TSX features removed by -v2 above */
2778 { "spec-ctrl", "on" },
2780 "Intel Core Processor (Broadwell, IBRS)" },
2781 { /* end of list */ }
2786 .alias = "Broadwell-noTSX-IBRS",
2787 .props = (PropValue[]) {
2790 /* spec-ctrl was already enabled by -v3 above */
2792 "Intel Core Processor (Broadwell, no TSX, IBRS)" },
2793 { /* end of list */ }
2796 { /* end of list */ }
2800 .name = "Skylake-Client",
2802 .vendor = CPUID_VENDOR_INTEL,
2806 .features[FEAT_1_EDX] =
2807 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2808 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2809 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2810 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2811 CPUID_DE | CPUID_FP87,
2812 .features[FEAT_1_ECX] =
2813 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2814 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2815 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2816 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2817 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2818 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2819 .features[FEAT_8000_0001_EDX] =
2820 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2822 .features[FEAT_8000_0001_ECX] =
2823 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2824 .features[FEAT_7_0_EBX] =
2825 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2826 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2827 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2828 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2830 /* Missing: XSAVES (not supported by some Linux versions,
2831 * including v4.1 to v4.12).
2832 * KVM doesn't yet expose any XSAVES state save component,
2833 * and the only one defined in Skylake (processor tracing)
2834 * probably will block migration anyway.
2836 .features[FEAT_XSAVE] =
2837 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2838 CPUID_XSAVE_XGETBV1,
2839 .features[FEAT_6_EAX] =
2841 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
2842 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2843 MSR_VMX_BASIC_TRUE_CTLS,
2844 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2845 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2846 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2847 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2848 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2849 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2850 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2851 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2852 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2853 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
2854 .features[FEAT_VMX_EXIT_CTLS] =
2855 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2856 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2857 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2858 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2859 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2860 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2861 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
2862 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2863 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2864 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
2865 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2866 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2867 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2868 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2869 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2870 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2871 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2872 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2873 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2874 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2875 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2876 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2877 .features[FEAT_VMX_SECONDARY_CTLS] =
2878 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2879 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2880 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2881 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
2882 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
2883 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
2884 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
2885 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
2886 .xlevel = 0x80000008,
2887 .model_id = "Intel Core Processor (Skylake)",
2888 .versions = (X86CPUVersionDefinition[]) {
2892 .alias = "Skylake-Client-IBRS",
2893 .props = (PropValue[]) {
2894 { "spec-ctrl", "on" },
2896 "Intel Core Processor (Skylake, IBRS)" },
2897 { /* end of list */ }
2902 .alias = "Skylake-Client-noTSX-IBRS",
2903 .props = (PropValue[]) {
2907 "Intel Core Processor (Skylake, IBRS, no TSX)" },
2908 { /* end of list */ }
2911 { /* end of list */ }
2915 .name = "Skylake-Server",
2917 .vendor = CPUID_VENDOR_INTEL,
2921 .features[FEAT_1_EDX] =
2922 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2923 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2924 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2925 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2926 CPUID_DE | CPUID_FP87,
2927 .features[FEAT_1_ECX] =
2928 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2929 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2930 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2931 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2932 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2933 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2934 .features[FEAT_8000_0001_EDX] =
2935 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
2936 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2937 .features[FEAT_8000_0001_ECX] =
2938 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2939 .features[FEAT_7_0_EBX] =
2940 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2941 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2942 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2943 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2944 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
2945 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
2946 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
2947 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
2948 .features[FEAT_7_0_ECX] =
2950 /* Missing: XSAVES (not supported by some Linux versions,
2951 * including v4.1 to v4.12).
2952 * KVM doesn't yet expose any XSAVES state save component,
2953 * and the only one defined in Skylake (processor tracing)
2954 * probably will block migration anyway.
2956 .features[FEAT_XSAVE] =
2957 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2958 CPUID_XSAVE_XGETBV1,
2959 .features[FEAT_6_EAX] =
2961 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
2962 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2963 MSR_VMX_BASIC_TRUE_CTLS,
2964 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2965 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2966 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2967 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2968 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2969 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2970 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2971 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2972 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2973 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
2974 .features[FEAT_VMX_EXIT_CTLS] =
2975 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2976 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2977 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2978 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2979 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2980 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2981 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
2982 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2983 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2984 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
2985 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2986 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2987 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2988 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2989 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2990 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2991 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2992 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2993 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2994 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2995 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2996 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2997 .features[FEAT_VMX_SECONDARY_CTLS] =
2998 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2999 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3000 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3001 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3002 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3003 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3004 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3005 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3006 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3007 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3008 .xlevel = 0x80000008,
3009 .model_id = "Intel Xeon Processor (Skylake)",
3010 .versions = (X86CPUVersionDefinition[]) {
3014 .alias = "Skylake-Server-IBRS",
3015 .props = (PropValue[]) {
3016 /* clflushopt was not added to Skylake-Server-IBRS */
3017 /* TODO: add -v3 including clflushopt */
3018 { "clflushopt", "off" },
3019 { "spec-ctrl", "on" },
3021 "Intel Xeon Processor (Skylake, IBRS)" },
3022 { /* end of list */ }
3027 .alias = "Skylake-Server-noTSX-IBRS",
3028 .props = (PropValue[]) {
3032 "Intel Xeon Processor (Skylake, IBRS, no TSX)" },
3033 { /* end of list */ }
3038 .props = (PropValue[]) {
3039 { "vmx-eptp-switching", "on" },
3040 { /* end of list */ }
3043 { /* end of list */ }
3047 .name = "Cascadelake-Server",
3049 .vendor = CPUID_VENDOR_INTEL,
3053 .features[FEAT_1_EDX] =
3054 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3055 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3056 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3057 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3058 CPUID_DE | CPUID_FP87,
3059 .features[FEAT_1_ECX] =
3060 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3061 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3062 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3063 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3064 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3065 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3066 .features[FEAT_8000_0001_EDX] =
3067 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3068 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3069 .features[FEAT_8000_0001_ECX] =
3070 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3071 .features[FEAT_7_0_EBX] =
3072 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3073 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3074 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3075 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3076 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
3077 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
3078 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
3079 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
3080 .features[FEAT_7_0_ECX] =
3082 CPUID_7_0_ECX_AVX512VNNI,
3083 .features[FEAT_7_0_EDX] =
3084 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
3085 /* Missing: XSAVES (not supported by some Linux versions,
3086 * including v4.1 to v4.12).
3087 * KVM doesn't yet expose any XSAVES state save component,
3088 * and the only one defined in Skylake (processor tracing)
3089 * probably will block migration anyway.
3091 .features[FEAT_XSAVE] =
3092 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3093 CPUID_XSAVE_XGETBV1,
3094 .features[FEAT_6_EAX] =
3096 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3097 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3098 MSR_VMX_BASIC_TRUE_CTLS,
3099 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3100 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3101 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3102 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3103 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3104 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3105 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3106 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3107 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3108 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3109 .features[FEAT_VMX_EXIT_CTLS] =
3110 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3111 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3112 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3113 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3114 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3115 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3116 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3117 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3118 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3119 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3120 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3121 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3122 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3123 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3124 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3125 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3126 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3127 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3128 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3129 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3130 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3131 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3132 .features[FEAT_VMX_SECONDARY_CTLS] =
3133 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3134 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3135 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3136 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3137 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3138 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3139 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3140 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3141 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3142 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3143 .xlevel = 0x80000008,
3144 .model_id = "Intel Xeon Processor (Cascadelake)",
3145 .versions = (X86CPUVersionDefinition[]) {
3148 .note = "ARCH_CAPABILITIES",
3149 .props = (PropValue[]) {
3150 { "arch-capabilities", "on" },
3151 { "rdctl-no", "on" },
3152 { "ibrs-all", "on" },
3153 { "skip-l1dfl-vmentry", "on" },
3155 { /* end of list */ }
3159 .alias = "Cascadelake-Server-noTSX",
3160 .note = "ARCH_CAPABILITIES, no TSX",
3161 .props = (PropValue[]) {
3164 { /* end of list */ }
3168 .note = "ARCH_CAPABILITIES, no TSX",
3169 .props = (PropValue[]) {
3170 { "vmx-eptp-switching", "on" },
3171 { /* end of list */ }
3174 { /* end of list */ }
3178 .name = "Cooperlake",
3180 .vendor = CPUID_VENDOR_INTEL,
3184 .features[FEAT_1_EDX] =
3185 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3186 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3187 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3188 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3189 CPUID_DE | CPUID_FP87,
3190 .features[FEAT_1_ECX] =
3191 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3192 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3193 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3194 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3195 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3196 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3197 .features[FEAT_8000_0001_EDX] =
3198 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3199 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3200 .features[FEAT_8000_0001_ECX] =
3201 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3202 .features[FEAT_7_0_EBX] =
3203 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3204 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3205 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3206 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3207 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
3208 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
3209 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
3210 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
3211 .features[FEAT_7_0_ECX] =
3213 CPUID_7_0_ECX_AVX512VNNI,
3214 .features[FEAT_7_0_EDX] =
3215 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_STIBP |
3216 CPUID_7_0_EDX_SPEC_CTRL_SSBD | CPUID_7_0_EDX_ARCH_CAPABILITIES,
3217 .features[FEAT_ARCH_CAPABILITIES] =
3218 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
3219 MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
3220 MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO,
3221 .features[FEAT_7_1_EAX] =
3222 CPUID_7_1_EAX_AVX512_BF16,
3224 * Missing: XSAVES (not supported by some Linux versions,
3225 * including v4.1 to v4.12).
3226 * KVM doesn't yet expose any XSAVES state save component,
3227 * and the only one defined in Skylake (processor tracing)
3228 * probably will block migration anyway.
3230 .features[FEAT_XSAVE] =
3231 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3232 CPUID_XSAVE_XGETBV1,
3233 .features[FEAT_6_EAX] =
3235 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3236 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3237 MSR_VMX_BASIC_TRUE_CTLS,
3238 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3239 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3240 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3241 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3242 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3243 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3244 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3245 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3246 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3247 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3248 .features[FEAT_VMX_EXIT_CTLS] =
3249 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3250 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3251 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3252 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3253 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3254 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3255 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3256 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3257 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3258 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3259 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3260 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3261 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3262 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3263 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3264 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3265 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3266 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3267 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3268 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3269 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3270 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3271 .features[FEAT_VMX_SECONDARY_CTLS] =
3272 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3273 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3274 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3275 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3276 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3277 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3278 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3279 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3280 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3281 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3282 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3283 .xlevel = 0x80000008,
3284 .model_id = "Intel Xeon Processor (Cooperlake)",
3287 .name = "Icelake-Client",
3289 .vendor = CPUID_VENDOR_INTEL,
3293 .features[FEAT_1_EDX] =
3294 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3295 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3296 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3297 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3298 CPUID_DE | CPUID_FP87,
3299 .features[FEAT_1_ECX] =
3300 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3301 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3302 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3303 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3304 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3305 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3306 .features[FEAT_8000_0001_EDX] =
3307 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
3309 .features[FEAT_8000_0001_ECX] =
3310 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3311 .features[FEAT_8000_0008_EBX] =
3312 CPUID_8000_0008_EBX_WBNOINVD,
3313 .features[FEAT_7_0_EBX] =
3314 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3315 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3316 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3317 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3319 .features[FEAT_7_0_ECX] =
3320 CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
3321 CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
3322 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
3323 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
3324 CPUID_7_0_ECX_AVX512_VPOPCNTDQ,
3325 .features[FEAT_7_0_EDX] =
3326 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
3327 /* Missing: XSAVES (not supported by some Linux versions,
3328 * including v4.1 to v4.12).
3329 * KVM doesn't yet expose any XSAVES state save component,
3330 * and the only one defined in Skylake (processor tracing)
3331 * probably will block migration anyway.
3333 .features[FEAT_XSAVE] =
3334 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3335 CPUID_XSAVE_XGETBV1,
3336 .features[FEAT_6_EAX] =
3338 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3339 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3340 MSR_VMX_BASIC_TRUE_CTLS,
3341 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3342 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3343 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3344 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3345 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3346 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3347 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3348 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3349 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3350 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3351 .features[FEAT_VMX_EXIT_CTLS] =
3352 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3353 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3354 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3355 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3356 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3357 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3358 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3359 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3360 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3361 VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
3362 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3363 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3364 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3365 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3366 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3367 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3368 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3369 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3370 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3371 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3372 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3373 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3374 .features[FEAT_VMX_SECONDARY_CTLS] =
3375 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3376 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3377 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3378 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3379 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3380 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3381 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3382 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3383 .xlevel = 0x80000008,
3384 .model_id = "Intel Core Processor (Icelake)",
3385 .versions = (X86CPUVersionDefinition[]) {
3388 .note = "deprecated"
3392 .note = "no TSX, deprecated",
3393 .alias = "Icelake-Client-noTSX",
3394 .props = (PropValue[]) {
3397 { /* end of list */ }
3400 { /* end of list */ }
3402 .deprecation_note = "use Icelake-Server instead"
3405 .name = "Icelake-Server",
3407 .vendor = CPUID_VENDOR_INTEL,
3411 .features[FEAT_1_EDX] =
3412 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3413 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3414 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3415 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3416 CPUID_DE | CPUID_FP87,
3417 .features[FEAT_1_ECX] =
3418 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3419 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3420 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3421 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3422 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3423 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3424 .features[FEAT_8000_0001_EDX] =
3425 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3426 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3427 .features[FEAT_8000_0001_ECX] =
3428 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3429 .features[FEAT_8000_0008_EBX] =
3430 CPUID_8000_0008_EBX_WBNOINVD,
3431 .features[FEAT_7_0_EBX] =
3432 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3433 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3434 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3435 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3436 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
3437 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
3438 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
3439 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
3440 .features[FEAT_7_0_ECX] =
3441 CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
3442 CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
3443 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
3444 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
3445 CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57,
3446 .features[FEAT_7_0_EDX] =
3447 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
3448 /* Missing: XSAVES (not supported by some Linux versions,
3449 * including v4.1 to v4.12).
3450 * KVM doesn't yet expose any XSAVES state save component,
3451 * and the only one defined in Skylake (processor tracing)
3452 * probably will block migration anyway.
3454 .features[FEAT_XSAVE] =
3455 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3456 CPUID_XSAVE_XGETBV1,
3457 .features[FEAT_6_EAX] =
3459 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3460 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3461 MSR_VMX_BASIC_TRUE_CTLS,
3462 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3463 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3464 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3465 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3466 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3467 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3468 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3469 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3470 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3471 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3472 .features[FEAT_VMX_EXIT_CTLS] =
3473 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3474 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3475 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3476 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3477 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3478 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3479 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3480 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3481 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3482 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3483 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3484 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3485 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3486 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3487 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3488 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3489 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3490 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3491 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3492 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3493 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3494 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3495 .features[FEAT_VMX_SECONDARY_CTLS] =
3496 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3497 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3498 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3499 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3500 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3501 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3502 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3503 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3504 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS,
3505 .xlevel = 0x80000008,
3506 .model_id = "Intel Xeon Processor (Icelake)",
3507 .versions = (X86CPUVersionDefinition[]) {
3512 .alias = "Icelake-Server-noTSX",
3513 .props = (PropValue[]) {
3516 { /* end of list */ }
3521 .props = (PropValue[]) {
3522 { "arch-capabilities", "on" },
3523 { "rdctl-no", "on" },
3524 { "ibrs-all", "on" },
3525 { "skip-l1dfl-vmentry", "on" },
3527 { "pschange-mc-no", "on" },
3529 { /* end of list */ }
3534 .props = (PropValue[]) {
3536 { "avx512ifma", "on" },
3539 { "vmx-rdseed-exit", "on" },
3540 { "vmx-pml", "on" },
3541 { "vmx-eptp-switching", "on" },
3543 { /* end of list */ }
3546 { /* end of list */ }
3550 .name = "Denverton",
3552 .vendor = CPUID_VENDOR_INTEL,
3556 .features[FEAT_1_EDX] =
3557 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
3558 CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
3559 CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
3560 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
3561 CPUID_SSE | CPUID_SSE2,
3562 .features[FEAT_1_ECX] =
3563 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR |
3564 CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | CPUID_EXT_SSE41 |
3565 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
3566 CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER |
3567 CPUID_EXT_AES | CPUID_EXT_XSAVE | CPUID_EXT_RDRAND,
3568 .features[FEAT_8000_0001_EDX] =
3569 CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
3570 CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
3571 .features[FEAT_8000_0001_ECX] =
3572 CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3573 .features[FEAT_7_0_EBX] =
3574 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_ERMS |
3575 CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_SMAP |
3576 CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_SHA_NI,
3577 .features[FEAT_7_0_EDX] =
3578 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_ARCH_CAPABILITIES |
3579 CPUID_7_0_EDX_SPEC_CTRL_SSBD,
3581 * Missing: XSAVES (not supported by some Linux versions,
3582 * including v4.1 to v4.12).
3583 * KVM doesn't yet expose any XSAVES state save component,
3584 * and the only one defined in Skylake (processor tracing)
3585 * probably will block migration anyway.
3587 .features[FEAT_XSAVE] =
3588 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | CPUID_XSAVE_XGETBV1,
3589 .features[FEAT_6_EAX] =
3591 .features[FEAT_ARCH_CAPABILITIES] =
3592 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY,
3593 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3594 MSR_VMX_BASIC_TRUE_CTLS,
3595 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3596 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3597 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3598 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3599 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3600 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3601 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3602 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3603 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3604 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3605 .features[FEAT_VMX_EXIT_CTLS] =
3606 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3607 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3608 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3609 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3610 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3611 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3612 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3613 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3614 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3615 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3616 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3617 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3618 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3619 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3620 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3621 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3622 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3623 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3624 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3625 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3626 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3627 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3628 .features[FEAT_VMX_SECONDARY_CTLS] =
3629 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3630 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3631 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3632 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3633 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3634 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3635 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3636 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3637 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3638 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3639 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3640 .xlevel = 0x80000008,
3641 .model_id = "Intel Atom Processor (Denverton)",
3642 .versions = (X86CPUVersionDefinition[]) {
3646 .note = "no MPX, no MONITOR",
3647 .props = (PropValue[]) {
3648 { "monitor", "off" },
3650 { /* end of list */ },
3653 { /* end of list */ },
3657 .name = "Snowridge",
3659 .vendor = CPUID_VENDOR_INTEL,
3663 .features[FEAT_1_EDX] =
3664 /* missing: CPUID_PN CPUID_IA64 */
3665 /* missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
3666 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE |
3667 CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE |
3668 CPUID_CX8 | CPUID_APIC | CPUID_SEP |
3669 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
3670 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH |
3672 CPUID_FXSR | CPUID_SSE | CPUID_SSE2,
3673 .features[FEAT_1_ECX] =
3674 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR |
3678 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
3680 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES | CPUID_EXT_XSAVE |
3682 .features[FEAT_8000_0001_EDX] =
3683 CPUID_EXT2_SYSCALL |
3685 CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3687 .features[FEAT_8000_0001_ECX] =
3688 CPUID_EXT3_LAHF_LM |
3689 CPUID_EXT3_3DNOWPREFETCH,
3690 .features[FEAT_7_0_EBX] =
3691 CPUID_7_0_EBX_FSGSBASE |
3692 CPUID_7_0_EBX_SMEP |
3693 CPUID_7_0_EBX_ERMS |
3694 CPUID_7_0_EBX_MPX | /* missing bits 13, 15 */
3695 CPUID_7_0_EBX_RDSEED |
3696 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
3697 CPUID_7_0_EBX_CLWB |
3698 CPUID_7_0_EBX_SHA_NI,
3699 .features[FEAT_7_0_ECX] =
3700 CPUID_7_0_ECX_UMIP |
3702 CPUID_7_0_ECX_GFNI |
3703 CPUID_7_0_ECX_MOVDIRI | CPUID_7_0_ECX_CLDEMOTE |
3704 CPUID_7_0_ECX_MOVDIR64B,
3705 .features[FEAT_7_0_EDX] =
3706 CPUID_7_0_EDX_SPEC_CTRL |
3707 CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD |
3708 CPUID_7_0_EDX_CORE_CAPABILITY,
3709 .features[FEAT_CORE_CAPABILITY] =
3710 MSR_CORE_CAP_SPLIT_LOCK_DETECT,
3712 * Missing: XSAVES (not supported by some Linux versions,
3713 * including v4.1 to v4.12).
3714 * KVM doesn't yet expose any XSAVES state save component,
3715 * and the only one defined in Skylake (processor tracing)
3716 * probably will block migration anyway.
3718 .features[FEAT_XSAVE] =
3719 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3720 CPUID_XSAVE_XGETBV1,
3721 .features[FEAT_6_EAX] =
3723 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3724 MSR_VMX_BASIC_TRUE_CTLS,
3725 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3726 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3727 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3728 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3729 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3730 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3731 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3732 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3733 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3734 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3735 .features[FEAT_VMX_EXIT_CTLS] =
3736 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3737 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3738 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3739 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3740 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3741 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3742 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3743 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3744 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3745 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3746 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3747 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3748 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3749 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3750 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3751 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3752 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3753 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3754 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3755 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3756 VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3757 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3758 .features[FEAT_VMX_SECONDARY_CTLS] =
3759 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3760 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3761 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3762 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3763 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3764 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3765 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3766 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3767 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3768 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3769 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3770 .xlevel = 0x80000008,
3771 .model_id = "Intel Atom Processor (SnowRidge)",
3772 .versions = (X86CPUVersionDefinition[]) {
3776 .props = (PropValue[]) {
3778 { "model-id", "Intel Atom Processor (Snowridge, no MPX)" },
3779 { /* end of list */ },
3782 { /* end of list */ },
3786 .name = "KnightsMill",
3788 .vendor = CPUID_VENDOR_INTEL,
3792 .features[FEAT_1_EDX] =
3793 CPUID_VME | CPUID_SS | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR |
3794 CPUID_MMX | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV |
3795 CPUID_MCA | CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC |
3796 CPUID_CX8 | CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC |
3797 CPUID_PSE | CPUID_DE | CPUID_FP87,
3798 .features[FEAT_1_ECX] =
3799 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3800 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3801 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3802 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3803 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3804 CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3805 .features[FEAT_8000_0001_EDX] =
3806 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3807 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3808 .features[FEAT_8000_0001_ECX] =
3809 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3810 .features[FEAT_7_0_EBX] =
3811 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
3812 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
3813 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_AVX512F |
3814 CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_AVX512PF |
3815 CPUID_7_0_EBX_AVX512ER,
3816 .features[FEAT_7_0_ECX] =
3817 CPUID_7_0_ECX_AVX512_VPOPCNTDQ,
3818 .features[FEAT_7_0_EDX] =
3819 CPUID_7_0_EDX_AVX512_4VNNIW | CPUID_7_0_EDX_AVX512_4FMAPS,
3820 .features[FEAT_XSAVE] =
3821 CPUID_XSAVE_XSAVEOPT,
3822 .features[FEAT_6_EAX] =
3824 .xlevel = 0x80000008,
3825 .model_id = "Intel Xeon Phi Processor (Knights Mill)",
3828 .name = "Opteron_G1",
3830 .vendor = CPUID_VENDOR_AMD,
3834 .features[FEAT_1_EDX] =
3835 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3836 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3837 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3838 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3839 CPUID_DE | CPUID_FP87,
3840 .features[FEAT_1_ECX] =
3842 .features[FEAT_8000_0001_EDX] =
3843 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3844 .xlevel = 0x80000008,
3845 .model_id = "AMD Opteron 240 (Gen 1 Class Opteron)",
3848 .name = "Opteron_G2",
3850 .vendor = CPUID_VENDOR_AMD,
3854 .features[FEAT_1_EDX] =
3855 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3856 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3857 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3858 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3859 CPUID_DE | CPUID_FP87,
3860 .features[FEAT_1_ECX] =
3861 CPUID_EXT_CX16 | CPUID_EXT_SSE3,
3862 .features[FEAT_8000_0001_EDX] =
3863 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3864 .features[FEAT_8000_0001_ECX] =
3865 CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
3866 .xlevel = 0x80000008,
3867 .model_id = "AMD Opteron 22xx (Gen 2 Class Opteron)",
3870 .name = "Opteron_G3",
3872 .vendor = CPUID_VENDOR_AMD,
3876 .features[FEAT_1_EDX] =
3877 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3878 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3879 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3880 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3881 CPUID_DE | CPUID_FP87,
3882 .features[FEAT_1_ECX] =
3883 CPUID_EXT_POPCNT | CPUID_EXT_CX16 | CPUID_EXT_MONITOR |
3885 .features[FEAT_8000_0001_EDX] =
3886 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL |
3888 .features[FEAT_8000_0001_ECX] =
3889 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A |
3890 CPUID_EXT3_ABM | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
3891 .xlevel = 0x80000008,
3892 .model_id = "AMD Opteron 23xx (Gen 3 Class Opteron)",
3895 .name = "Opteron_G4",
3897 .vendor = CPUID_VENDOR_AMD,
3901 .features[FEAT_1_EDX] =
3902 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3903 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3904 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3905 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3906 CPUID_DE | CPUID_FP87,
3907 .features[FEAT_1_ECX] =
3908 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3909 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
3910 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
3912 .features[FEAT_8000_0001_EDX] =
3913 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
3914 CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
3915 .features[FEAT_8000_0001_ECX] =
3916 CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
3917 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
3918 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
3920 .features[FEAT_SVM] =
3921 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
3923 .xlevel = 0x8000001A,
3924 .model_id = "AMD Opteron 62xx class CPU",
3927 .name = "Opteron_G5",
3929 .vendor = CPUID_VENDOR_AMD,
3933 .features[FEAT_1_EDX] =
3934 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3935 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3936 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3937 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3938 CPUID_DE | CPUID_FP87,
3939 .features[FEAT_1_ECX] =
3940 CPUID_EXT_F16C | CPUID_EXT_AVX | CPUID_EXT_XSAVE |
3941 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
3942 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_FMA |
3943 CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
3944 .features[FEAT_8000_0001_EDX] =
3945 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
3946 CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
3947 .features[FEAT_8000_0001_ECX] =
3948 CPUID_EXT3_TBM | CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
3949 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
3950 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
3952 .features[FEAT_SVM] =
3953 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
3955 .xlevel = 0x8000001A,
3956 .model_id = "AMD Opteron 63xx class CPU",
3961 .vendor = CPUID_VENDOR_AMD,
3965 .features[FEAT_1_EDX] =
3966 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
3967 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
3968 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
3969 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
3970 CPUID_VME | CPUID_FP87,
3971 .features[FEAT_1_ECX] =
3972 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
3973 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
3974 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
3975 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
3976 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
3977 .features[FEAT_8000_0001_EDX] =
3978 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
3979 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
3981 .features[FEAT_8000_0001_ECX] =
3982 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
3983 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
3984 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
3986 .features[FEAT_7_0_EBX] =
3987 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
3988 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
3989 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
3990 CPUID_7_0_EBX_SHA_NI,
3991 .features[FEAT_XSAVE] =
3992 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3993 CPUID_XSAVE_XGETBV1,
3994 .features[FEAT_6_EAX] =
3996 .features[FEAT_SVM] =
3997 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
3998 .xlevel = 0x8000001E,
3999 .model_id = "AMD EPYC Processor",
4000 .cache_info = &epyc_cache_info,
4001 .versions = (X86CPUVersionDefinition[]) {
4005 .alias = "EPYC-IBPB",
4006 .props = (PropValue[]) {
4009 "AMD EPYC Processor (with IBPB)" },
4010 { /* end of list */ }
4015 .props = (PropValue[]) {
4017 { "perfctr-core", "on" },
4019 { "xsaveerptr", "on" },
4022 "AMD EPYC Processor" },
4023 { /* end of list */ }
4026 { /* end of list */ }
4032 .vendor = CPUID_VENDOR_HYGON,
4036 .features[FEAT_1_EDX] =
4037 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
4038 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
4039 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
4040 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
4041 CPUID_VME | CPUID_FP87,
4042 .features[FEAT_1_ECX] =
4043 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
4044 CPUID_EXT_XSAVE | CPUID_EXT_POPCNT |
4045 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4046 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
4047 CPUID_EXT_MONITOR | CPUID_EXT_SSE3,
4048 .features[FEAT_8000_0001_EDX] =
4049 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
4050 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
4052 .features[FEAT_8000_0001_ECX] =
4053 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
4054 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
4055 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
4057 .features[FEAT_8000_0008_EBX] =
4058 CPUID_8000_0008_EBX_IBPB,
4059 .features[FEAT_7_0_EBX] =
4060 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4061 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
4062 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT,
4064 * Missing: XSAVES (not supported by some Linux versions,
4065 * including v4.1 to v4.12).
4066 * KVM doesn't yet expose any XSAVES state save component.
4068 .features[FEAT_XSAVE] =
4069 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4070 CPUID_XSAVE_XGETBV1,
4071 .features[FEAT_6_EAX] =
4073 .features[FEAT_SVM] =
4074 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4075 .xlevel = 0x8000001E,
4076 .model_id = "Hygon Dhyana Processor",
4077 .cache_info = &epyc_cache_info,
4080 .name = "EPYC-Rome",
4082 .vendor = CPUID_VENDOR_AMD,
4086 .features[FEAT_1_EDX] =
4087 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
4088 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
4089 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
4090 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
4091 CPUID_VME | CPUID_FP87,
4092 .features[FEAT_1_ECX] =
4093 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
4094 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
4095 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4096 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
4097 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
4098 .features[FEAT_8000_0001_EDX] =
4099 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
4100 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
4102 .features[FEAT_8000_0001_ECX] =
4103 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
4104 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
4105 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
4106 CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
4107 .features[FEAT_8000_0008_EBX] =
4108 CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
4109 CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
4110 CPUID_8000_0008_EBX_STIBP,
4111 .features[FEAT_7_0_EBX] =
4112 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4113 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
4114 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
4115 CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_CLWB,
4116 .features[FEAT_7_0_ECX] =
4117 CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_RDPID,
4118 .features[FEAT_XSAVE] =
4119 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4120 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
4121 .features[FEAT_6_EAX] =
4123 .features[FEAT_SVM] =
4124 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4125 .xlevel = 0x8000001E,
4126 .model_id = "AMD EPYC-Rome Processor",
4127 .cache_info = &epyc_rome_cache_info,
4131 /* KVM-specific features that are automatically added/removed
4132 * from all CPU models when KVM is enabled.
4134 static PropValue kvm_default_props[] = {
4135 { "kvmclock", "on" },
4136 { "kvm-nopiodelay", "on" },
4137 { "kvm-asyncpf", "on" },
4138 { "kvm-steal-time", "on" },
4139 { "kvm-pv-eoi", "on" },
4140 { "kvmclock-stable-bit", "on" },
4143 { "monitor", "off" },
4148 /* TCG-specific defaults that override all CPU models when using TCG
4150 static PropValue tcg_default_props[] = {
4157 * We resolve CPU model aliases using -v1 when using "-machine
4158 * none", but this is just for compatibility while libvirt isn't
4159 * adapted to resolve CPU model versions before creating VMs.
4160 * See "Runnability guarantee of CPU models" at
4161 * docs/system/deprecated.rst.
4163 X86CPUVersion default_cpu_version = 1;
4165 void x86_cpu_set_default_version(X86CPUVersion version)
4167 /* Translating CPU_VERSION_AUTO to CPU_VERSION_AUTO doesn't make sense */
4168 assert(version != CPU_VERSION_AUTO);
4169 default_cpu_version = version;
4172 static X86CPUVersion x86_cpu_model_last_version(const X86CPUModel *model)
4175 const X86CPUVersionDefinition *vdef =
4176 x86_cpu_def_get_versions(model->cpudef);
4177 while (vdef->version) {
4184 /* Return the actual version being used for a specific CPU model */
4185 static X86CPUVersion x86_cpu_model_resolve_version(const X86CPUModel *model)
4187 X86CPUVersion v = model->version;
4188 if (v == CPU_VERSION_AUTO) {
4189 v = default_cpu_version;
4191 if (v == CPU_VERSION_LATEST) {
4192 return x86_cpu_model_last_version(model);
4197 void x86_cpu_change_kvm_default(const char *prop, const char *value)
4200 for (pv = kvm_default_props; pv->prop; pv++) {
4201 if (!strcmp(pv->prop, prop)) {
4207 /* It is valid to call this function only for properties that
4208 * are already present in the kvm_default_props table.
4213 static bool lmce_supported(void)
4215 uint64_t mce_cap = 0;
4218 if (kvm_ioctl(kvm_state, KVM_X86_GET_MCE_CAP_SUPPORTED, &mce_cap) < 0) {
4223 return !!(mce_cap & MCG_LMCE_P);
4226 #define CPUID_MODEL_ID_SZ 48
4229 * cpu_x86_fill_model_id:
4230 * Get CPUID model ID string from host CPU.
4232 * @str should have at least CPUID_MODEL_ID_SZ bytes
4234 * The function does NOT add a null terminator to the string
4237 static int cpu_x86_fill_model_id(char *str)
4239 uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0;
4242 for (i = 0; i < 3; i++) {
4243 host_cpuid(0x80000002 + i, 0, &eax, &ebx, &ecx, &edx);
4244 memcpy(str + i * 16 + 0, &eax, 4);
4245 memcpy(str + i * 16 + 4, &ebx, 4);
4246 memcpy(str + i * 16 + 8, &ecx, 4);
4247 memcpy(str + i * 16 + 12, &edx, 4);
4252 static Property max_x86_cpu_properties[] = {
4253 DEFINE_PROP_BOOL("migratable", X86CPU, migratable, true),
4254 DEFINE_PROP_BOOL("host-cache-info", X86CPU, cache_info_passthrough, false),
4255 DEFINE_PROP_END_OF_LIST()
4258 static void max_x86_cpu_class_init(ObjectClass *oc, void *data)
4260 DeviceClass *dc = DEVICE_CLASS(oc);
4261 X86CPUClass *xcc = X86_CPU_CLASS(oc);
4265 xcc->model_description =
4266 "Enables all features supported by the accelerator in the current host";
4268 device_class_set_props(dc, max_x86_cpu_properties);
4271 static void max_x86_cpu_initfn(Object *obj)
4273 X86CPU *cpu = X86_CPU(obj);
4274 CPUX86State *env = &cpu->env;
4275 KVMState *s = kvm_state;
4277 /* We can't fill the features array here because we don't know yet if
4278 * "migratable" is true or false.
4280 cpu->max_features = true;
4282 if (accel_uses_host_cpuid()) {
4283 char vendor[CPUID_VENDOR_SZ + 1] = { 0 };
4284 char model_id[CPUID_MODEL_ID_SZ + 1] = { 0 };
4285 int family, model, stepping;
4287 host_vendor_fms(vendor, &family, &model, &stepping);
4288 cpu_x86_fill_model_id(model_id);
4290 object_property_set_str(OBJECT(cpu), "vendor", vendor, &error_abort);
4291 object_property_set_int(OBJECT(cpu), "family", family, &error_abort);
4292 object_property_set_int(OBJECT(cpu), "model", model, &error_abort);
4293 object_property_set_int(OBJECT(cpu), "stepping", stepping,
4295 object_property_set_str(OBJECT(cpu), "model-id", model_id,
4298 if (kvm_enabled()) {
4299 env->cpuid_min_level =
4300 kvm_arch_get_supported_cpuid(s, 0x0, 0, R_EAX);
4301 env->cpuid_min_xlevel =
4302 kvm_arch_get_supported_cpuid(s, 0x80000000, 0, R_EAX);
4303 env->cpuid_min_xlevel2 =
4304 kvm_arch_get_supported_cpuid(s, 0xC0000000, 0, R_EAX);
4306 env->cpuid_min_level =
4307 hvf_get_supported_cpuid(0x0, 0, R_EAX);
4308 env->cpuid_min_xlevel =
4309 hvf_get_supported_cpuid(0x80000000, 0, R_EAX);
4310 env->cpuid_min_xlevel2 =
4311 hvf_get_supported_cpuid(0xC0000000, 0, R_EAX);
4314 if (lmce_supported()) {
4315 object_property_set_bool(OBJECT(cpu), "lmce", true, &error_abort);
4318 object_property_set_str(OBJECT(cpu), "vendor", CPUID_VENDOR_AMD,
4320 object_property_set_int(OBJECT(cpu), "family", 6, &error_abort);
4321 object_property_set_int(OBJECT(cpu), "model", 6, &error_abort);
4322 object_property_set_int(OBJECT(cpu), "stepping", 3, &error_abort);
4323 object_property_set_str(OBJECT(cpu), "model-id",
4324 "QEMU TCG CPU version " QEMU_HW_VERSION,
4328 object_property_set_bool(OBJECT(cpu), "pmu", true, &error_abort);
4331 static const TypeInfo max_x86_cpu_type_info = {
4332 .name = X86_CPU_TYPE_NAME("max"),
4333 .parent = TYPE_X86_CPU,
4334 .instance_init = max_x86_cpu_initfn,
4335 .class_init = max_x86_cpu_class_init,
4338 #if defined(CONFIG_KVM) || defined(CONFIG_HVF)
4339 static void host_x86_cpu_class_init(ObjectClass *oc, void *data)
4341 X86CPUClass *xcc = X86_CPU_CLASS(oc);
4343 xcc->host_cpuid_required = true;
4346 #if defined(CONFIG_KVM)
4347 xcc->model_description =
4348 "KVM processor with all supported host features ";
4349 #elif defined(CONFIG_HVF)
4350 xcc->model_description =
4351 "HVF processor with all supported host features ";
4355 static const TypeInfo host_x86_cpu_type_info = {
4356 .name = X86_CPU_TYPE_NAME("host"),
4357 .parent = X86_CPU_TYPE_NAME("max"),
4358 .class_init = host_x86_cpu_class_init,
4363 static char *feature_word_description(FeatureWordInfo *f, uint32_t bit)
4365 assert(f->type == CPUID_FEATURE_WORD || f->type == MSR_FEATURE_WORD);
4368 case CPUID_FEATURE_WORD:
4370 const char *reg = get_register_name_32(f->cpuid.reg);
4372 return g_strdup_printf("CPUID.%02XH:%s",
4375 case MSR_FEATURE_WORD:
4376 return g_strdup_printf("MSR(%02XH)",
4383 static bool x86_cpu_have_filtered_features(X86CPU *cpu)
4387 for (w = 0; w < FEATURE_WORDS; w++) {
4388 if (cpu->filtered_features[w]) {
4396 static void mark_unavailable_features(X86CPU *cpu, FeatureWord w, uint64_t mask,
4397 const char *verbose_prefix)
4399 CPUX86State *env = &cpu->env;
4400 FeatureWordInfo *f = &feature_word_info[w];
4403 if (!cpu->force_features) {
4404 env->features[w] &= ~mask;
4406 cpu->filtered_features[w] |= mask;
4408 if (!verbose_prefix) {
4412 for (i = 0; i < 64; ++i) {
4413 if ((1ULL << i) & mask) {
4414 g_autofree char *feat_word_str = feature_word_description(f, i);
4415 warn_report("%s: %s%s%s [bit %d]",
4418 f->feat_names[i] ? "." : "",
4419 f->feat_names[i] ? f->feat_names[i] : "", i);
4424 static void x86_cpuid_version_get_family(Object *obj, Visitor *v,
4425 const char *name, void *opaque,
4428 X86CPU *cpu = X86_CPU(obj);
4429 CPUX86State *env = &cpu->env;
4432 value = (env->cpuid_version >> 8) & 0xf;
4434 value += (env->cpuid_version >> 20) & 0xff;
4436 visit_type_int(v, name, &value, errp);
4439 static void x86_cpuid_version_set_family(Object *obj, Visitor *v,
4440 const char *name, void *opaque,
4443 X86CPU *cpu = X86_CPU(obj);
4444 CPUX86State *env = &cpu->env;
4445 const int64_t min = 0;
4446 const int64_t max = 0xff + 0xf;
4449 if (!visit_type_int(v, name, &value, errp)) {
4452 if (value < min || value > max) {
4453 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
4454 name ? name : "null", value, min, max);
4458 env->cpuid_version &= ~0xff00f00;
4460 env->cpuid_version |= 0xf00 | ((value - 0x0f) << 20);
4462 env->cpuid_version |= value << 8;
4466 static void x86_cpuid_version_get_model(Object *obj, Visitor *v,
4467 const char *name, void *opaque,
4470 X86CPU *cpu = X86_CPU(obj);
4471 CPUX86State *env = &cpu->env;
4474 value = (env->cpuid_version >> 4) & 0xf;
4475 value |= ((env->cpuid_version >> 16) & 0xf) << 4;
4476 visit_type_int(v, name, &value, errp);
4479 static void x86_cpuid_version_set_model(Object *obj, Visitor *v,
4480 const char *name, void *opaque,
4483 X86CPU *cpu = X86_CPU(obj);
4484 CPUX86State *env = &cpu->env;
4485 const int64_t min = 0;
4486 const int64_t max = 0xff;
4489 if (!visit_type_int(v, name, &value, errp)) {
4492 if (value < min || value > max) {
4493 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
4494 name ? name : "null", value, min, max);
4498 env->cpuid_version &= ~0xf00f0;
4499 env->cpuid_version |= ((value & 0xf) << 4) | ((value >> 4) << 16);
4502 static void x86_cpuid_version_get_stepping(Object *obj, Visitor *v,
4503 const char *name, void *opaque,
4506 X86CPU *cpu = X86_CPU(obj);
4507 CPUX86State *env = &cpu->env;
4510 value = env->cpuid_version & 0xf;
4511 visit_type_int(v, name, &value, errp);
4514 static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v,
4515 const char *name, void *opaque,
4518 X86CPU *cpu = X86_CPU(obj);
4519 CPUX86State *env = &cpu->env;
4520 const int64_t min = 0;
4521 const int64_t max = 0xf;
4524 if (!visit_type_int(v, name, &value, errp)) {
4527 if (value < min || value > max) {
4528 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
4529 name ? name : "null", value, min, max);
4533 env->cpuid_version &= ~0xf;
4534 env->cpuid_version |= value & 0xf;
4537 static char *x86_cpuid_get_vendor(Object *obj, Error **errp)
4539 X86CPU *cpu = X86_CPU(obj);
4540 CPUX86State *env = &cpu->env;
4543 value = g_malloc(CPUID_VENDOR_SZ + 1);
4544 x86_cpu_vendor_words2str(value, env->cpuid_vendor1, env->cpuid_vendor2,
4545 env->cpuid_vendor3);
4549 static void x86_cpuid_set_vendor(Object *obj, const char *value,
4552 X86CPU *cpu = X86_CPU(obj);
4553 CPUX86State *env = &cpu->env;
4556 if (strlen(value) != CPUID_VENDOR_SZ) {
4557 error_setg(errp, QERR_PROPERTY_VALUE_BAD, "", "vendor", value);
4561 env->cpuid_vendor1 = 0;
4562 env->cpuid_vendor2 = 0;
4563 env->cpuid_vendor3 = 0;
4564 for (i = 0; i < 4; i++) {
4565 env->cpuid_vendor1 |= ((uint8_t)value[i ]) << (8 * i);
4566 env->cpuid_vendor2 |= ((uint8_t)value[i + 4]) << (8 * i);
4567 env->cpuid_vendor3 |= ((uint8_t)value[i + 8]) << (8 * i);
4571 static char *x86_cpuid_get_model_id(Object *obj, Error **errp)
4573 X86CPU *cpu = X86_CPU(obj);
4574 CPUX86State *env = &cpu->env;
4578 value = g_malloc(48 + 1);
4579 for (i = 0; i < 48; i++) {
4580 value[i] = env->cpuid_model[i >> 2] >> (8 * (i & 3));
4586 static void x86_cpuid_set_model_id(Object *obj, const char *model_id,
4589 X86CPU *cpu = X86_CPU(obj);
4590 CPUX86State *env = &cpu->env;
4593 if (model_id == NULL) {
4596 len = strlen(model_id);
4597 memset(env->cpuid_model, 0, 48);
4598 for (i = 0; i < 48; i++) {
4602 c = (uint8_t)model_id[i];
4604 env->cpuid_model[i >> 2] |= c << (8 * (i & 3));
4608 static void x86_cpuid_get_tsc_freq(Object *obj, Visitor *v, const char *name,
4609 void *opaque, Error **errp)
4611 X86CPU *cpu = X86_CPU(obj);
4614 value = cpu->env.tsc_khz * 1000;
4615 visit_type_int(v, name, &value, errp);
4618 static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name,
4619 void *opaque, Error **errp)
4621 X86CPU *cpu = X86_CPU(obj);
4622 const int64_t min = 0;
4623 const int64_t max = INT64_MAX;
4626 if (!visit_type_int(v, name, &value, errp)) {
4629 if (value < min || value > max) {
4630 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
4631 name ? name : "null", value, min, max);
4635 cpu->env.tsc_khz = cpu->env.user_tsc_khz = value / 1000;
4638 /* Generic getter for "feature-words" and "filtered-features" properties */
4639 static void x86_cpu_get_feature_words(Object *obj, Visitor *v,
4640 const char *name, void *opaque,
4643 uint64_t *array = (uint64_t *)opaque;
4645 X86CPUFeatureWordInfo word_infos[FEATURE_WORDS] = { };
4646 X86CPUFeatureWordInfoList list_entries[FEATURE_WORDS] = { };
4647 X86CPUFeatureWordInfoList *list = NULL;
4649 for (w = 0; w < FEATURE_WORDS; w++) {
4650 FeatureWordInfo *wi = &feature_word_info[w];
4652 * We didn't have MSR features when "feature-words" was
4653 * introduced. Therefore skipped other type entries.
4655 if (wi->type != CPUID_FEATURE_WORD) {
4658 X86CPUFeatureWordInfo *qwi = &word_infos[w];
4659 qwi->cpuid_input_eax = wi->cpuid.eax;
4660 qwi->has_cpuid_input_ecx = wi->cpuid.needs_ecx;
4661 qwi->cpuid_input_ecx = wi->cpuid.ecx;
4662 qwi->cpuid_register = x86_reg_info_32[wi->cpuid.reg].qapi_enum;
4663 qwi->features = array[w];
4665 /* List will be in reverse order, but order shouldn't matter */
4666 list_entries[w].next = list;
4667 list_entries[w].value = &word_infos[w];
4668 list = &list_entries[w];
4671 visit_type_X86CPUFeatureWordInfoList(v, "feature-words", &list, errp);
4674 /* Convert all '_' in a feature string option name to '-', to make feature
4675 * name conform to QOM property naming rule, which uses '-' instead of '_'.
4677 static inline void feat2prop(char *s)
4679 while ((s = strchr(s, '_'))) {
4684 /* Return the feature property name for a feature flag bit */
4685 static const char *x86_cpu_feature_name(FeatureWord w, int bitnr)
4688 /* XSAVE components are automatically enabled by other features,
4689 * so return the original feature name instead
4691 if (w == FEAT_XSAVE_COMP_LO || w == FEAT_XSAVE_COMP_HI) {
4692 int comp = (w == FEAT_XSAVE_COMP_HI) ? bitnr + 32 : bitnr;
4694 if (comp < ARRAY_SIZE(x86_ext_save_areas) &&
4695 x86_ext_save_areas[comp].bits) {
4696 w = x86_ext_save_areas[comp].feature;
4697 bitnr = ctz32(x86_ext_save_areas[comp].bits);
4702 assert(w < FEATURE_WORDS);
4703 name = feature_word_info[w].feat_names[bitnr];
4704 assert(bitnr < 32 || !(name && feature_word_info[w].type == CPUID_FEATURE_WORD));
4708 /* Compatibily hack to maintain legacy +-feat semantic,
4709 * where +-feat overwrites any feature set by
4710 * feat=on|feat even if the later is parsed after +-feat
4711 * (i.e. "-x2apic,x2apic=on" will result in x2apic disabled)
4713 static GList *plus_features, *minus_features;
4715 static gint compare_string(gconstpointer a, gconstpointer b)
4717 return g_strcmp0(a, b);
4720 /* Parse "+feature,-feature,feature=foo" CPU feature string
4722 static void x86_cpu_parse_featurestr(const char *typename, char *features,
4725 char *featurestr; /* Single 'key=value" string being parsed */
4726 static bool cpu_globals_initialized;
4727 bool ambiguous = false;
4729 if (cpu_globals_initialized) {
4732 cpu_globals_initialized = true;
4738 for (featurestr = strtok(features, ",");
4740 featurestr = strtok(NULL, ",")) {
4742 const char *val = NULL;
4745 GlobalProperty *prop;
4747 /* Compatibility syntax: */
4748 if (featurestr[0] == '+') {
4749 plus_features = g_list_append(plus_features,
4750 g_strdup(featurestr + 1));
4752 } else if (featurestr[0] == '-') {
4753 minus_features = g_list_append(minus_features,
4754 g_strdup(featurestr + 1));
4758 eq = strchr(featurestr, '=');
4766 feat2prop(featurestr);
4769 if (g_list_find_custom(plus_features, name, compare_string)) {
4770 warn_report("Ambiguous CPU model string. "
4771 "Don't mix both \"+%s\" and \"%s=%s\"",
4775 if (g_list_find_custom(minus_features, name, compare_string)) {
4776 warn_report("Ambiguous CPU model string. "
4777 "Don't mix both \"-%s\" and \"%s=%s\"",
4783 if (!strcmp(name, "tsc-freq")) {
4787 ret = qemu_strtosz_metric(val, NULL, &tsc_freq);
4788 if (ret < 0 || tsc_freq > INT64_MAX) {
4789 error_setg(errp, "bad numerical value %s", val);
4792 snprintf(num, sizeof(num), "%" PRId64, tsc_freq);
4794 name = "tsc-frequency";
4797 prop = g_new0(typeof(*prop), 1);
4798 prop->driver = typename;
4799 prop->property = g_strdup(name);
4800 prop->value = g_strdup(val);
4801 qdev_prop_register_global(prop);
4805 warn_report("Compatibility of ambiguous CPU model "
4806 "strings won't be kept on future QEMU versions");
4810 static void x86_cpu_expand_features(X86CPU *cpu, Error **errp);
4811 static void x86_cpu_filter_features(X86CPU *cpu, bool verbose);
4813 /* Build a list with the name of all features on a feature word array */
4814 static void x86_cpu_list_feature_names(FeatureWordArray features,
4815 strList **feat_names)
4818 strList **next = feat_names;
4820 for (w = 0; w < FEATURE_WORDS; w++) {
4821 uint64_t filtered = features[w];
4823 for (i = 0; i < 64; i++) {
4824 if (filtered & (1ULL << i)) {
4825 strList *new = g_new0(strList, 1);
4826 new->value = g_strdup(x86_cpu_feature_name(w, i));
4834 static void x86_cpu_get_unavailable_features(Object *obj, Visitor *v,
4835 const char *name, void *opaque,
4838 X86CPU *xc = X86_CPU(obj);
4839 strList *result = NULL;
4841 x86_cpu_list_feature_names(xc->filtered_features, &result);
4842 visit_type_strList(v, "unavailable-features", &result, errp);
4845 /* Check for missing features that may prevent the CPU class from
4846 * running using the current machine and accelerator.
4848 static void x86_cpu_class_check_missing_features(X86CPUClass *xcc,
4849 strList **missing_feats)
4853 strList **next = missing_feats;
4855 if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
4856 strList *new = g_new0(strList, 1);
4857 new->value = g_strdup("kvm");
4858 *missing_feats = new;
4862 xc = X86_CPU(object_new_with_class(OBJECT_CLASS(xcc)));
4864 x86_cpu_expand_features(xc, &err);
4866 /* Errors at x86_cpu_expand_features should never happen,
4867 * but in case it does, just report the model as not
4868 * runnable at all using the "type" property.
4870 strList *new = g_new0(strList, 1);
4871 new->value = g_strdup("type");
4877 x86_cpu_filter_features(xc, false);
4879 x86_cpu_list_feature_names(xc->filtered_features, next);
4881 object_unref(OBJECT(xc));
4884 /* Print all cpuid feature names in featureset
4886 static void listflags(GList *features)
4891 for (tmp = features; tmp; tmp = tmp->next) {
4892 const char *name = tmp->data;
4893 if ((len + strlen(name) + 1) >= 75) {
4897 qemu_printf("%s%s", len == 0 ? " " : " ", name);
4898 len += strlen(name) + 1;
4903 /* Sort alphabetically by type name, respecting X86CPUClass::ordering. */
4904 static gint x86_cpu_list_compare(gconstpointer a, gconstpointer b)
4906 ObjectClass *class_a = (ObjectClass *)a;
4907 ObjectClass *class_b = (ObjectClass *)b;
4908 X86CPUClass *cc_a = X86_CPU_CLASS(class_a);
4909 X86CPUClass *cc_b = X86_CPU_CLASS(class_b);
4912 if (cc_a->ordering != cc_b->ordering) {
4913 ret = cc_a->ordering - cc_b->ordering;
4915 g_autofree char *name_a = x86_cpu_class_get_model_name(cc_a);
4916 g_autofree char *name_b = x86_cpu_class_get_model_name(cc_b);
4917 ret = strcmp(name_a, name_b);
4922 static GSList *get_sorted_cpu_model_list(void)
4924 GSList *list = object_class_get_list(TYPE_X86_CPU, false);
4925 list = g_slist_sort(list, x86_cpu_list_compare);
4929 static char *x86_cpu_class_get_model_id(X86CPUClass *xc)
4931 Object *obj = object_new_with_class(OBJECT_CLASS(xc));
4932 char *r = object_property_get_str(obj, "model-id", &error_abort);
4937 static char *x86_cpu_class_get_alias_of(X86CPUClass *cc)
4939 X86CPUVersion version;
4941 if (!cc->model || !cc->model->is_alias) {
4944 version = x86_cpu_model_resolve_version(cc->model);
4948 return x86_cpu_versioned_model_name(cc->model->cpudef, version);
4951 static void x86_cpu_list_entry(gpointer data, gpointer user_data)
4953 ObjectClass *oc = data;
4954 X86CPUClass *cc = X86_CPU_CLASS(oc);
4955 g_autofree char *name = x86_cpu_class_get_model_name(cc);
4956 g_autofree char *desc = g_strdup(cc->model_description);
4957 g_autofree char *alias_of = x86_cpu_class_get_alias_of(cc);
4958 g_autofree char *model_id = x86_cpu_class_get_model_id(cc);
4960 if (!desc && alias_of) {
4961 if (cc->model && cc->model->version == CPU_VERSION_AUTO) {
4962 desc = g_strdup("(alias configured by machine type)");
4964 desc = g_strdup_printf("(alias of %s)", alias_of);
4967 if (!desc && cc->model && cc->model->note) {
4968 desc = g_strdup_printf("%s [%s]", model_id, cc->model->note);
4971 desc = g_strdup_printf("%s", model_id);
4974 qemu_printf("x86 %-20s %-58s\n", name, desc);
4977 /* list available CPU models and flags */
4978 void x86_cpu_list(void)
4982 GList *names = NULL;
4984 qemu_printf("Available CPUs:\n");
4985 list = get_sorted_cpu_model_list();
4986 g_slist_foreach(list, x86_cpu_list_entry, NULL);
4990 for (i = 0; i < ARRAY_SIZE(feature_word_info); i++) {
4991 FeatureWordInfo *fw = &feature_word_info[i];
4992 for (j = 0; j < 64; j++) {
4993 if (fw->feat_names[j]) {
4994 names = g_list_append(names, (gpointer)fw->feat_names[j]);
4999 names = g_list_sort(names, (GCompareFunc)strcmp);
5001 qemu_printf("\nRecognized CPUID flags:\n");
5007 static void x86_cpu_definition_entry(gpointer data, gpointer user_data)
5009 ObjectClass *oc = data;
5010 X86CPUClass *cc = X86_CPU_CLASS(oc);
5011 CpuDefinitionInfoList **cpu_list = user_data;
5012 CpuDefinitionInfoList *entry;
5013 CpuDefinitionInfo *info;
5015 info = g_malloc0(sizeof(*info));
5016 info->name = x86_cpu_class_get_model_name(cc);
5017 x86_cpu_class_check_missing_features(cc, &info->unavailable_features);
5018 info->has_unavailable_features = true;
5019 info->q_typename = g_strdup(object_class_get_name(oc));
5020 info->migration_safe = cc->migration_safe;
5021 info->has_migration_safe = true;
5022 info->q_static = cc->static_model;
5023 if (cc->model && cc->model->cpudef->deprecation_note) {
5024 info->deprecated = true;
5026 info->deprecated = false;
5029 * Old machine types won't report aliases, so that alias translation
5030 * doesn't break compatibility with previous QEMU versions.
5032 if (default_cpu_version != CPU_VERSION_LEGACY) {
5033 info->alias_of = x86_cpu_class_get_alias_of(cc);
5034 info->has_alias_of = !!info->alias_of;
5037 entry = g_malloc0(sizeof(*entry));
5038 entry->value = info;
5039 entry->next = *cpu_list;
5043 CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
5045 CpuDefinitionInfoList *cpu_list = NULL;
5046 GSList *list = get_sorted_cpu_model_list();
5047 g_slist_foreach(list, x86_cpu_definition_entry, &cpu_list);
5052 static uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
5053 bool migratable_only)
5055 FeatureWordInfo *wi = &feature_word_info[w];
5058 if (kvm_enabled()) {
5060 case CPUID_FEATURE_WORD:
5061 r = kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid.eax,
5065 case MSR_FEATURE_WORD:
5066 r = kvm_arch_get_supported_msr_feature(kvm_state,
5070 } else if (hvf_enabled()) {
5071 if (wi->type != CPUID_FEATURE_WORD) {
5074 r = hvf_get_supported_cpuid(wi->cpuid.eax,
5077 } else if (tcg_enabled()) {
5078 r = wi->tcg_features;
5082 if (migratable_only) {
5083 r &= x86_cpu_get_migratable_flags(w);
5088 static void x86_cpu_apply_props(X86CPU *cpu, PropValue *props)
5091 for (pv = props; pv->prop; pv++) {
5095 object_property_parse(OBJECT(cpu), pv->prop, pv->value,
5100 /* Apply properties for the CPU model version specified in model */
5101 static void x86_cpu_apply_version_props(X86CPU *cpu, X86CPUModel *model)
5103 const X86CPUVersionDefinition *vdef;
5104 X86CPUVersion version = x86_cpu_model_resolve_version(model);
5106 if (version == CPU_VERSION_LEGACY) {
5110 for (vdef = x86_cpu_def_get_versions(model->cpudef); vdef->version; vdef++) {
5113 for (p = vdef->props; p && p->prop; p++) {
5114 object_property_parse(OBJECT(cpu), p->prop, p->value,
5118 if (vdef->version == version) {
5124 * If we reached the end of the list, version number was invalid
5126 assert(vdef->version == version);
5129 /* Load data from X86CPUDefinition into a X86CPU object
5131 static void x86_cpu_load_model(X86CPU *cpu, X86CPUModel *model)
5133 X86CPUDefinition *def = model->cpudef;
5134 CPUX86State *env = &cpu->env;
5136 char host_vendor[CPUID_VENDOR_SZ + 1];
5139 /*NOTE: any property set by this function should be returned by
5140 * x86_cpu_static_props(), so static expansion of
5141 * query-cpu-model-expansion is always complete.
5144 /* CPU models only set _minimum_ values for level/xlevel: */
5145 object_property_set_uint(OBJECT(cpu), "min-level", def->level,
5147 object_property_set_uint(OBJECT(cpu), "min-xlevel", def->xlevel,
5150 object_property_set_int(OBJECT(cpu), "family", def->family, &error_abort);
5151 object_property_set_int(OBJECT(cpu), "model", def->model, &error_abort);
5152 object_property_set_int(OBJECT(cpu), "stepping", def->stepping,
5154 object_property_set_str(OBJECT(cpu), "model-id", def->model_id,
5156 for (w = 0; w < FEATURE_WORDS; w++) {
5157 env->features[w] = def->features[w];
5160 /* legacy-cache defaults to 'off' if CPU model provides cache info */
5161 cpu->legacy_cache = !def->cache_info;
5163 /* Special cases not set in the X86CPUDefinition structs: */
5164 /* TODO: in-kernel irqchip for hvf */
5165 if (kvm_enabled()) {
5166 if (!kvm_irqchip_in_kernel()) {
5167 x86_cpu_change_kvm_default("x2apic", "off");
5170 x86_cpu_apply_props(cpu, kvm_default_props);
5171 } else if (tcg_enabled()) {
5172 x86_cpu_apply_props(cpu, tcg_default_props);
5175 env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR;
5177 /* sysenter isn't supported in compatibility mode on AMD,
5178 * syscall isn't supported in compatibility mode on Intel.
5179 * Normally we advertise the actual CPU vendor, but you can
5180 * override this using the 'vendor' property if you want to use
5181 * KVM's sysenter/syscall emulation in compatibility mode and
5182 * when doing cross vendor migration
5184 vendor = def->vendor;
5185 if (accel_uses_host_cpuid()) {
5186 uint32_t ebx = 0, ecx = 0, edx = 0;
5187 host_cpuid(0, 0, NULL, &ebx, &ecx, &edx);
5188 x86_cpu_vendor_words2str(host_vendor, ebx, edx, ecx);
5189 vendor = host_vendor;
5192 object_property_set_str(OBJECT(cpu), "vendor", vendor, &error_abort);
5194 x86_cpu_apply_version_props(cpu, model);
5197 * Properties in versioned CPU model are not user specified features.
5198 * We can simply clear env->user_features here since it will be filled later
5199 * in x86_cpu_expand_features() based on plus_features and minus_features.
5201 memset(&env->user_features, 0, sizeof(env->user_features));
5204 #ifndef CONFIG_USER_ONLY
5205 /* Return a QDict containing keys for all properties that can be included
5206 * in static expansion of CPU models. All properties set by x86_cpu_load_model()
5207 * must be included in the dictionary.
5209 static QDict *x86_cpu_static_props(void)
5213 static const char *props[] = {
5231 for (i = 0; props[i]; i++) {
5232 qdict_put_null(d, props[i]);
5235 for (w = 0; w < FEATURE_WORDS; w++) {
5236 FeatureWordInfo *fi = &feature_word_info[w];
5238 for (bit = 0; bit < 64; bit++) {
5239 if (!fi->feat_names[bit]) {
5242 qdict_put_null(d, fi->feat_names[bit]);
5249 /* Add an entry to @props dict, with the value for property. */
5250 static void x86_cpu_expand_prop(X86CPU *cpu, QDict *props, const char *prop)
5252 QObject *value = object_property_get_qobject(OBJECT(cpu), prop,
5255 qdict_put_obj(props, prop, value);
5258 /* Convert CPU model data from X86CPU object to a property dictionary
5259 * that can recreate exactly the same CPU model.
5261 static void x86_cpu_to_dict(X86CPU *cpu, QDict *props)
5263 QDict *sprops = x86_cpu_static_props();
5264 const QDictEntry *e;
5266 for (e = qdict_first(sprops); e; e = qdict_next(sprops, e)) {
5267 const char *prop = qdict_entry_key(e);
5268 x86_cpu_expand_prop(cpu, props, prop);
5272 /* Convert CPU model data from X86CPU object to a property dictionary
5273 * that can recreate exactly the same CPU model, including every
5274 * writeable QOM property.
5276 static void x86_cpu_to_dict_full(X86CPU *cpu, QDict *props)
5278 ObjectPropertyIterator iter;
5279 ObjectProperty *prop;
5281 object_property_iter_init(&iter, OBJECT(cpu));
5282 while ((prop = object_property_iter_next(&iter))) {
5283 /* skip read-only or write-only properties */
5284 if (!prop->get || !prop->set) {
5288 /* "hotplugged" is the only property that is configurable
5289 * on the command-line but will be set differently on CPUs
5290 * created using "-cpu ... -smp ..." and by CPUs created
5291 * on the fly by x86_cpu_from_model() for querying. Skip it.
5293 if (!strcmp(prop->name, "hotplugged")) {
5296 x86_cpu_expand_prop(cpu, props, prop->name);
5300 static void object_apply_props(Object *obj, QDict *props, Error **errp)
5302 const QDictEntry *prop;
5304 for (prop = qdict_first(props); prop; prop = qdict_next(props, prop)) {
5305 if (!object_property_set_qobject(obj, qdict_entry_key(prop),
5306 qdict_entry_value(prop), errp)) {
5312 /* Create X86CPU object according to model+props specification */
5313 static X86CPU *x86_cpu_from_model(const char *model, QDict *props, Error **errp)
5319 xcc = X86_CPU_CLASS(cpu_class_by_name(TYPE_X86_CPU, model));
5321 error_setg(&err, "CPU model '%s' not found", model);
5325 xc = X86_CPU(object_new_with_class(OBJECT_CLASS(xcc)));
5327 object_apply_props(OBJECT(xc), props, &err);
5333 x86_cpu_expand_features(xc, &err);
5340 error_propagate(errp, err);
5341 object_unref(OBJECT(xc));
5347 CpuModelExpansionInfo *
5348 qmp_query_cpu_model_expansion(CpuModelExpansionType type,
5349 CpuModelInfo *model,
5354 CpuModelExpansionInfo *ret = g_new0(CpuModelExpansionInfo, 1);
5355 QDict *props = NULL;
5356 const char *base_name;
5358 xc = x86_cpu_from_model(model->name,
5360 qobject_to(QDict, model->props) :
5366 props = qdict_new();
5367 ret->model = g_new0(CpuModelInfo, 1);
5368 ret->model->props = QOBJECT(props);
5369 ret->model->has_props = true;
5372 case CPU_MODEL_EXPANSION_TYPE_STATIC:
5373 /* Static expansion will be based on "base" only */
5375 x86_cpu_to_dict(xc, props);
5377 case CPU_MODEL_EXPANSION_TYPE_FULL:
5378 /* As we don't return every single property, full expansion needs
5379 * to keep the original model name+props, and add extra
5380 * properties on top of that.
5382 base_name = model->name;
5383 x86_cpu_to_dict_full(xc, props);
5386 error_setg(&err, "Unsupported expansion type");
5390 x86_cpu_to_dict(xc, props);
5392 ret->model->name = g_strdup(base_name);
5395 object_unref(OBJECT(xc));
5397 error_propagate(errp, err);
5398 qapi_free_CpuModelExpansionInfo(ret);
5403 #endif /* !CONFIG_USER_ONLY */
5405 static gchar *x86_gdb_arch_name(CPUState *cs)
5407 #ifdef TARGET_X86_64
5408 return g_strdup("i386:x86-64");
5410 return g_strdup("i386");
5414 static void x86_cpu_cpudef_class_init(ObjectClass *oc, void *data)
5416 X86CPUModel *model = data;
5417 X86CPUClass *xcc = X86_CPU_CLASS(oc);
5418 CPUClass *cc = CPU_CLASS(oc);
5421 xcc->migration_safe = true;
5422 cc->deprecation_note = model->cpudef->deprecation_note;
5425 static void x86_register_cpu_model_type(const char *name, X86CPUModel *model)
5427 g_autofree char *typename = x86_cpu_type_name(name);
5430 .parent = TYPE_X86_CPU,
5431 .class_init = x86_cpu_cpudef_class_init,
5432 .class_data = model,
5438 static void x86_register_cpudef_types(X86CPUDefinition *def)
5441 const X86CPUVersionDefinition *vdef;
5443 /* AMD aliases are handled at runtime based on CPUID vendor, so
5444 * they shouldn't be set on the CPU model table.
5446 assert(!(def->features[FEAT_8000_0001_EDX] & CPUID_EXT2_AMD_ALIASES));
5447 /* catch mistakes instead of silently truncating model_id when too long */
5448 assert(def->model_id && strlen(def->model_id) <= 48);
5450 /* Unversioned model: */
5451 m = g_new0(X86CPUModel, 1);
5453 m->version = CPU_VERSION_AUTO;
5455 x86_register_cpu_model_type(def->name, m);
5457 /* Versioned models: */
5459 for (vdef = x86_cpu_def_get_versions(def); vdef->version; vdef++) {
5460 X86CPUModel *m = g_new0(X86CPUModel, 1);
5461 g_autofree char *name =
5462 x86_cpu_versioned_model_name(def, vdef->version);
5464 m->version = vdef->version;
5465 m->note = vdef->note;
5466 x86_register_cpu_model_type(name, m);
5469 X86CPUModel *am = g_new0(X86CPUModel, 1);
5471 am->version = vdef->version;
5472 am->is_alias = true;
5473 x86_register_cpu_model_type(vdef->alias, am);
5479 #if !defined(CONFIG_USER_ONLY)
5481 void cpu_clear_apic_feature(CPUX86State *env)
5483 env->features[FEAT_1_EDX] &= ~CPUID_APIC;
5486 #endif /* !CONFIG_USER_ONLY */
5488 void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
5489 uint32_t *eax, uint32_t *ebx,
5490 uint32_t *ecx, uint32_t *edx)
5492 X86CPU *cpu = env_archcpu(env);
5493 CPUState *cs = env_cpu(env);
5494 uint32_t die_offset;
5496 uint32_t signature[3];
5497 X86CPUTopoInfo topo_info;
5499 topo_info.dies_per_pkg = env->nr_dies;
5500 topo_info.cores_per_die = cs->nr_cores;
5501 topo_info.threads_per_core = cs->nr_threads;
5503 /* Calculate & apply limits for different index ranges */
5504 if (index >= 0xC0000000) {
5505 limit = env->cpuid_xlevel2;
5506 } else if (index >= 0x80000000) {
5507 limit = env->cpuid_xlevel;
5508 } else if (index >= 0x40000000) {
5511 limit = env->cpuid_level;
5514 if (index > limit) {
5515 /* Intel documentation states that invalid EAX input will
5516 * return the same information as EAX=cpuid_level
5517 * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID)
5519 index = env->cpuid_level;
5524 *eax = env->cpuid_level;
5525 *ebx = env->cpuid_vendor1;
5526 *edx = env->cpuid_vendor2;
5527 *ecx = env->cpuid_vendor3;
5530 *eax = env->cpuid_version;
5531 *ebx = (cpu->apic_id << 24) |
5532 8 << 8; /* CLFLUSH size in quad words, Linux wants it. */
5533 *ecx = env->features[FEAT_1_ECX];
5534 if ((*ecx & CPUID_EXT_XSAVE) && (env->cr[4] & CR4_OSXSAVE_MASK)) {
5535 *ecx |= CPUID_EXT_OSXSAVE;
5537 *edx = env->features[FEAT_1_EDX];
5538 if (cs->nr_cores * cs->nr_threads > 1) {
5539 *ebx |= (cs->nr_cores * cs->nr_threads) << 16;
5542 if (!cpu->enable_pmu) {
5543 *ecx &= ~CPUID_EXT_PDCM;
5547 /* cache info: needed for Pentium Pro compatibility */
5548 if (cpu->cache_info_passthrough) {
5549 host_cpuid(index, 0, eax, ebx, ecx, edx);
5552 *eax = 1; /* Number of CPUID[EAX=2] calls required */
5554 if (!cpu->enable_l3_cache) {
5557 *ecx = cpuid2_cache_descriptor(env->cache_info_cpuid2.l3_cache);
5559 *edx = (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1d_cache) << 16) |
5560 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1i_cache) << 8) |
5561 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l2_cache));
5564 /* cache info: needed for Core compatibility */
5565 if (cpu->cache_info_passthrough) {
5566 host_cpuid(index, count, eax, ebx, ecx, edx);
5567 /* QEMU gives out its own APIC IDs, never pass down bits 31..26. */
5568 *eax &= ~0xFC000000;
5569 if ((*eax & 31) && cs->nr_cores > 1) {
5570 *eax |= (cs->nr_cores - 1) << 26;
5575 case 0: /* L1 dcache info */
5576 encode_cache_cpuid4(env->cache_info_cpuid4.l1d_cache,
5578 eax, ebx, ecx, edx);
5580 case 1: /* L1 icache info */
5581 encode_cache_cpuid4(env->cache_info_cpuid4.l1i_cache,
5583 eax, ebx, ecx, edx);
5585 case 2: /* L2 cache info */
5586 encode_cache_cpuid4(env->cache_info_cpuid4.l2_cache,
5587 cs->nr_threads, cs->nr_cores,
5588 eax, ebx, ecx, edx);
5590 case 3: /* L3 cache info */
5591 die_offset = apicid_die_offset(&topo_info);
5592 if (cpu->enable_l3_cache) {
5593 encode_cache_cpuid4(env->cache_info_cpuid4.l3_cache,
5594 (1 << die_offset), cs->nr_cores,
5595 eax, ebx, ecx, edx);
5599 default: /* end of info */
5600 *eax = *ebx = *ecx = *edx = 0;
5606 /* MONITOR/MWAIT Leaf */
5607 *eax = cpu->mwait.eax; /* Smallest monitor-line size in bytes */
5608 *ebx = cpu->mwait.ebx; /* Largest monitor-line size in bytes */
5609 *ecx = cpu->mwait.ecx; /* flags */
5610 *edx = cpu->mwait.edx; /* mwait substates */
5613 /* Thermal and Power Leaf */
5614 *eax = env->features[FEAT_6_EAX];
5620 /* Structured Extended Feature Flags Enumeration Leaf */
5622 /* Maximum ECX value for sub-leaves */
5623 *eax = env->cpuid_level_func7;
5624 *ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */
5625 *ecx = env->features[FEAT_7_0_ECX]; /* Feature flags */
5626 if ((*ecx & CPUID_7_0_ECX_PKU) && env->cr[4] & CR4_PKE_MASK) {
5627 *ecx |= CPUID_7_0_ECX_OSPKE;
5629 *edx = env->features[FEAT_7_0_EDX]; /* Feature flags */
5630 } else if (count == 1) {
5631 *eax = env->features[FEAT_7_1_EAX];
5643 /* Direct Cache Access Information Leaf */
5644 *eax = 0; /* Bits 0-31 in DCA_CAP MSR */
5650 /* Architectural Performance Monitoring Leaf */
5651 if (kvm_enabled() && cpu->enable_pmu) {
5652 KVMState *s = cs->kvm_state;
5654 *eax = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EAX);
5655 *ebx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EBX);
5656 *ecx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_ECX);
5657 *edx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EDX);
5658 } else if (hvf_enabled() && cpu->enable_pmu) {
5659 *eax = hvf_get_supported_cpuid(0xA, count, R_EAX);
5660 *ebx = hvf_get_supported_cpuid(0xA, count, R_EBX);
5661 *ecx = hvf_get_supported_cpuid(0xA, count, R_ECX);
5662 *edx = hvf_get_supported_cpuid(0xA, count, R_EDX);
5671 /* Extended Topology Enumeration Leaf */
5672 if (!cpu->enable_cpuid_0xb) {
5673 *eax = *ebx = *ecx = *edx = 0;
5677 *ecx = count & 0xff;
5678 *edx = cpu->apic_id;
5682 *eax = apicid_core_offset(&topo_info);
5683 *ebx = cs->nr_threads;
5684 *ecx |= CPUID_TOPOLOGY_LEVEL_SMT;
5687 *eax = apicid_pkg_offset(&topo_info);
5688 *ebx = cs->nr_cores * cs->nr_threads;
5689 *ecx |= CPUID_TOPOLOGY_LEVEL_CORE;
5694 *ecx |= CPUID_TOPOLOGY_LEVEL_INVALID;
5697 assert(!(*eax & ~0x1f));
5698 *ebx &= 0xffff; /* The count doesn't need to be reliable. */
5701 /* V2 Extended Topology Enumeration Leaf */
5702 if (env->nr_dies < 2) {
5703 *eax = *ebx = *ecx = *edx = 0;
5707 *ecx = count & 0xff;
5708 *edx = cpu->apic_id;
5711 *eax = apicid_core_offset(&topo_info);
5712 *ebx = cs->nr_threads;
5713 *ecx |= CPUID_TOPOLOGY_LEVEL_SMT;
5716 *eax = apicid_die_offset(&topo_info);
5717 *ebx = cs->nr_cores * cs->nr_threads;
5718 *ecx |= CPUID_TOPOLOGY_LEVEL_CORE;
5721 *eax = apicid_pkg_offset(&topo_info);
5722 *ebx = env->nr_dies * cs->nr_cores * cs->nr_threads;
5723 *ecx |= CPUID_TOPOLOGY_LEVEL_DIE;
5728 *ecx |= CPUID_TOPOLOGY_LEVEL_INVALID;
5730 assert(!(*eax & ~0x1f));
5731 *ebx &= 0xffff; /* The count doesn't need to be reliable. */
5734 /* Processor Extended State */
5739 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
5744 *ecx = xsave_area_size(x86_cpu_xsave_components(cpu));
5745 *eax = env->features[FEAT_XSAVE_COMP_LO];
5746 *edx = env->features[FEAT_XSAVE_COMP_HI];
5748 * The initial value of xcr0 and ebx == 0, On host without kvm
5749 * commit 412a3c41(e.g., CentOS 6), the ebx's value always == 0
5750 * even through guest update xcr0, this will crash some legacy guest
5751 * (e.g., CentOS 6), So set ebx == ecx to workaroud it.
5753 *ebx = kvm_enabled() ? *ecx : xsave_area_size(env->xcr0);
5754 } else if (count == 1) {
5755 *eax = env->features[FEAT_XSAVE];
5756 } else if (count < ARRAY_SIZE(x86_ext_save_areas)) {
5757 if ((x86_cpu_xsave_components(cpu) >> count) & 1) {
5758 const ExtSaveArea *esa = &x86_ext_save_areas[count];
5766 /* Intel Processor Trace Enumeration */
5771 if (!(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) ||
5777 *eax = INTEL_PT_MAX_SUBLEAF;
5778 *ebx = INTEL_PT_MINIMAL_EBX;
5779 *ecx = INTEL_PT_MINIMAL_ECX;
5780 if (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP) {
5781 *ecx |= CPUID_14_0_ECX_LIP;
5783 } else if (count == 1) {
5784 *eax = INTEL_PT_MTC_BITMAP | INTEL_PT_ADDR_RANGES_NUM;
5785 *ebx = INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP;
5791 * CPUID code in kvm_arch_init_vcpu() ignores stuff
5792 * set here, but we restrict to TCG none the less.
5794 if (tcg_enabled() && cpu->expose_tcg) {
5795 memcpy(signature, "TCGTCGTCGTCG", 12);
5797 *ebx = signature[0];
5798 *ecx = signature[1];
5799 *edx = signature[2];
5814 *eax = env->cpuid_xlevel;
5815 *ebx = env->cpuid_vendor1;
5816 *edx = env->cpuid_vendor2;
5817 *ecx = env->cpuid_vendor3;
5820 *eax = env->cpuid_version;
5822 *ecx = env->features[FEAT_8000_0001_ECX];
5823 *edx = env->features[FEAT_8000_0001_EDX];
5825 /* The Linux kernel checks for the CMPLegacy bit and
5826 * discards multiple thread information if it is set.
5827 * So don't set it here for Intel to make Linux guests happy.
5829 if (cs->nr_cores * cs->nr_threads > 1) {
5830 if (env->cpuid_vendor1 != CPUID_VENDOR_INTEL_1 ||
5831 env->cpuid_vendor2 != CPUID_VENDOR_INTEL_2 ||
5832 env->cpuid_vendor3 != CPUID_VENDOR_INTEL_3) {
5833 *ecx |= 1 << 1; /* CmpLegacy bit */
5840 *eax = env->cpuid_model[(index - 0x80000002) * 4 + 0];
5841 *ebx = env->cpuid_model[(index - 0x80000002) * 4 + 1];
5842 *ecx = env->cpuid_model[(index - 0x80000002) * 4 + 2];
5843 *edx = env->cpuid_model[(index - 0x80000002) * 4 + 3];
5846 /* cache info (L1 cache) */
5847 if (cpu->cache_info_passthrough) {
5848 host_cpuid(index, 0, eax, ebx, ecx, edx);
5851 *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) |
5852 (L1_ITLB_2M_ASSOC << 8) | (L1_ITLB_2M_ENTRIES);
5853 *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) |
5854 (L1_ITLB_4K_ASSOC << 8) | (L1_ITLB_4K_ENTRIES);
5855 *ecx = encode_cache_cpuid80000005(env->cache_info_amd.l1d_cache);
5856 *edx = encode_cache_cpuid80000005(env->cache_info_amd.l1i_cache);
5859 /* cache info (L2 cache) */
5860 if (cpu->cache_info_passthrough) {
5861 host_cpuid(index, 0, eax, ebx, ecx, edx);
5864 *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) |
5865 (L2_DTLB_2M_ENTRIES << 16) |
5866 (AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) |
5867 (L2_ITLB_2M_ENTRIES);
5868 *ebx = (AMD_ENC_ASSOC(L2_DTLB_4K_ASSOC) << 28) |
5869 (L2_DTLB_4K_ENTRIES << 16) |
5870 (AMD_ENC_ASSOC(L2_ITLB_4K_ASSOC) << 12) |
5871 (L2_ITLB_4K_ENTRIES);
5872 encode_cache_cpuid80000006(env->cache_info_amd.l2_cache,
5873 cpu->enable_l3_cache ?
5874 env->cache_info_amd.l3_cache : NULL,
5881 *edx = env->features[FEAT_8000_0007_EDX];
5884 /* virtual & phys address size in low 2 bytes. */
5885 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
5886 /* 64 bit processor */
5887 *eax = cpu->phys_bits; /* configurable physical bits */
5888 if (env->features[FEAT_7_0_ECX] & CPUID_7_0_ECX_LA57) {
5889 *eax |= 0x00003900; /* 57 bits virtual */
5891 *eax |= 0x00003000; /* 48 bits virtual */
5894 *eax = cpu->phys_bits;
5896 *ebx = env->features[FEAT_8000_0008_EBX];
5897 if (cs->nr_cores * cs->nr_threads > 1) {
5899 * Bits 15:12 is "The number of bits in the initial
5900 * Core::X86::Apic::ApicId[ApicId] value that indicate
5901 * thread ID within a package".
5902 * Bits 7:0 is "The number of threads in the package is NC+1"
5904 *ecx = (apicid_pkg_offset(&topo_info) << 12) |
5905 ((cs->nr_cores * cs->nr_threads) - 1);
5912 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
5913 *eax = 0x00000001; /* SVM Revision */
5914 *ebx = 0x00000010; /* nr of ASIDs */
5916 *edx = env->features[FEAT_SVM]; /* optional features */
5926 if (cpu->cache_info_passthrough) {
5927 host_cpuid(index, count, eax, ebx, ecx, edx);
5931 case 0: /* L1 dcache info */
5932 encode_cache_cpuid8000001d(env->cache_info_amd.l1d_cache,
5933 &topo_info, eax, ebx, ecx, edx);
5935 case 1: /* L1 icache info */
5936 encode_cache_cpuid8000001d(env->cache_info_amd.l1i_cache,
5937 &topo_info, eax, ebx, ecx, edx);
5939 case 2: /* L2 cache info */
5940 encode_cache_cpuid8000001d(env->cache_info_amd.l2_cache,
5941 &topo_info, eax, ebx, ecx, edx);
5943 case 3: /* L3 cache info */
5944 encode_cache_cpuid8000001d(env->cache_info_amd.l3_cache,
5945 &topo_info, eax, ebx, ecx, edx);
5947 default: /* end of info */
5948 *eax = *ebx = *ecx = *edx = 0;
5953 if (cpu->core_id <= 255) {
5954 encode_topo_cpuid8000001e(cpu, &topo_info, eax, ebx, ecx, edx);
5963 *eax = env->cpuid_xlevel2;
5969 /* Support for VIA CPU's CPUID instruction */
5970 *eax = env->cpuid_version;
5973 *edx = env->features[FEAT_C000_0001_EDX];
5978 /* Reserved for the future, and now filled with zero */
5985 *eax = sev_enabled() ? 0x2 : 0;
5986 *ebx = sev_get_cbit_position();
5987 *ebx |= sev_get_reduced_phys_bits() << 6;
5992 /* reserved values: zero */
6001 static void x86_cpu_reset(DeviceState *dev)
6003 CPUState *s = CPU(dev);
6004 X86CPU *cpu = X86_CPU(s);
6005 X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu);
6006 CPUX86State *env = &cpu->env;
6011 xcc->parent_reset(dev);
6013 memset(env, 0, offsetof(CPUX86State, end_reset_fields));
6015 env->old_exception = -1;
6017 /* init to reset state */
6019 env->hflags2 |= HF2_GIF_MASK;
6020 env->hflags &= ~HF_GUEST_MASK;
6022 cpu_x86_update_cr0(env, 0x60000010);
6023 env->a20_mask = ~0x0;
6024 env->smbase = 0x30000;
6025 env->msr_smi_count = 0;
6027 env->idt.limit = 0xffff;
6028 env->gdt.limit = 0xffff;
6029 env->ldt.limit = 0xffff;
6030 env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT);
6031 env->tr.limit = 0xffff;
6032 env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT);
6034 cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff,
6035 DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK |
6036 DESC_R_MASK | DESC_A_MASK);
6037 cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff,
6038 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
6040 cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff,
6041 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
6043 cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff,
6044 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
6046 cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff,
6047 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
6049 cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff,
6050 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
6054 env->regs[R_EDX] = env->cpuid_version;
6059 for (i = 0; i < 8; i++) {
6062 cpu_set_fpuc(env, 0x37f);
6064 env->mxcsr = 0x1f80;
6065 /* All units are in INIT state. */
6068 env->pat = 0x0007040600070406ULL;
6069 env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT;
6070 if (env->features[FEAT_1_ECX] & CPUID_EXT_MONITOR) {
6071 env->msr_ia32_misc_enable |= MSR_IA32_MISC_ENABLE_MWAIT;
6074 memset(env->dr, 0, sizeof(env->dr));
6075 env->dr[6] = DR6_FIXED_1;
6076 env->dr[7] = DR7_FIXED_1;
6077 cpu_breakpoint_remove_all(s, BP_CPU);
6078 cpu_watchpoint_remove_all(s, BP_CPU);
6081 xcr0 = XSTATE_FP_MASK;
6083 #ifdef CONFIG_USER_ONLY
6084 /* Enable all the features for user-mode. */
6085 if (env->features[FEAT_1_EDX] & CPUID_SSE) {
6086 xcr0 |= XSTATE_SSE_MASK;
6088 for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
6089 const ExtSaveArea *esa = &x86_ext_save_areas[i];
6090 if (env->features[esa->feature] & esa->bits) {
6095 if (env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE) {
6096 cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK;
6098 if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_FSGSBASE) {
6099 cr4 |= CR4_FSGSBASE_MASK;
6104 cpu_x86_update_cr4(env, cr4);
6107 * SDM 11.11.5 requires:
6108 * - IA32_MTRR_DEF_TYPE MSR.E = 0
6109 * - IA32_MTRR_PHYSMASKn.V = 0
6110 * All other bits are undefined. For simplification, zero it all.
6112 env->mtrr_deftype = 0;
6113 memset(env->mtrr_var, 0, sizeof(env->mtrr_var));
6114 memset(env->mtrr_fixed, 0, sizeof(env->mtrr_fixed));
6116 env->interrupt_injected = -1;
6117 env->exception_nr = -1;
6118 env->exception_pending = 0;
6119 env->exception_injected = 0;
6120 env->exception_has_payload = false;
6121 env->exception_payload = 0;
6122 env->nmi_injected = false;
6123 #if !defined(CONFIG_USER_ONLY)
6124 /* We hard-wire the BSP to the first CPU. */
6125 apic_designate_bsp(cpu->apic_state, s->cpu_index == 0);
6127 s->halted = !cpu_is_bsp(cpu);
6129 if (kvm_enabled()) {
6130 kvm_arch_reset_vcpu(cpu);
6135 #ifndef CONFIG_USER_ONLY
6136 bool cpu_is_bsp(X86CPU *cpu)
6138 return cpu_get_apic_base(cpu->apic_state) & MSR_IA32_APICBASE_BSP;
6141 /* TODO: remove me, when reset over QOM tree is implemented */
6142 static void x86_cpu_machine_reset_cb(void *opaque)
6144 X86CPU *cpu = opaque;
6145 cpu_reset(CPU(cpu));
6149 static void mce_init(X86CPU *cpu)
6151 CPUX86State *cenv = &cpu->env;
6154 if (((cenv->cpuid_version >> 8) & 0xf) >= 6
6155 && (cenv->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) ==
6156 (CPUID_MCE | CPUID_MCA)) {
6157 cenv->mcg_cap = MCE_CAP_DEF | MCE_BANKS_DEF |
6158 (cpu->enable_lmce ? MCG_LMCE_P : 0);
6159 cenv->mcg_ctl = ~(uint64_t)0;
6160 for (bank = 0; bank < MCE_BANKS_DEF; bank++) {
6161 cenv->mce_banks[bank * 4] = ~(uint64_t)0;
6166 #ifndef CONFIG_USER_ONLY
6167 APICCommonClass *apic_get_class(void)
6169 const char *apic_type = "apic";
6171 /* TODO: in-kernel irqchip for hvf */
6172 if (kvm_apic_in_kernel()) {
6173 apic_type = "kvm-apic";
6174 } else if (xen_enabled()) {
6175 apic_type = "xen-apic";
6178 return APIC_COMMON_CLASS(object_class_by_name(apic_type));
6181 static void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
6183 APICCommonState *apic;
6184 ObjectClass *apic_class = OBJECT_CLASS(apic_get_class());
6186 cpu->apic_state = DEVICE(object_new_with_class(apic_class));
6188 object_property_add_child(OBJECT(cpu), "lapic",
6189 OBJECT(cpu->apic_state));
6190 object_unref(OBJECT(cpu->apic_state));
6192 qdev_prop_set_uint32(cpu->apic_state, "id", cpu->apic_id);
6193 /* TODO: convert to link<> */
6194 apic = APIC_COMMON(cpu->apic_state);
6196 apic->apicbase = APIC_DEFAULT_ADDRESS | MSR_IA32_APICBASE_ENABLE;
6199 static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
6201 APICCommonState *apic;
6202 static bool apic_mmio_map_once;
6204 if (cpu->apic_state == NULL) {
6207 qdev_realize(DEVICE(cpu->apic_state), NULL, errp);
6209 /* Map APIC MMIO area */
6210 apic = APIC_COMMON(cpu->apic_state);
6211 if (!apic_mmio_map_once) {
6212 memory_region_add_subregion_overlap(get_system_memory(),
6214 MSR_IA32_APICBASE_BASE,
6217 apic_mmio_map_once = true;
6221 static void x86_cpu_machine_done(Notifier *n, void *unused)
6223 X86CPU *cpu = container_of(n, X86CPU, machine_done);
6224 MemoryRegion *smram =
6225 (MemoryRegion *) object_resolve_path("/machine/smram", NULL);
6228 cpu->smram = g_new(MemoryRegion, 1);
6229 memory_region_init_alias(cpu->smram, OBJECT(cpu), "smram",
6231 memory_region_set_enabled(cpu->smram, true);
6232 memory_region_add_subregion_overlap(cpu->cpu_as_root, 0, cpu->smram, 1);
6236 static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
6241 /* Note: Only safe for use on x86(-64) hosts */
6242 static uint32_t x86_host_phys_bits(void)
6245 uint32_t host_phys_bits;
6247 host_cpuid(0x80000000, 0, &eax, NULL, NULL, NULL);
6248 if (eax >= 0x80000008) {
6249 host_cpuid(0x80000008, 0, &eax, NULL, NULL, NULL);
6250 /* Note: According to AMD doc 25481 rev 2.34 they have a field
6251 * at 23:16 that can specify a maximum physical address bits for
6252 * the guest that can override this value; but I've not seen
6253 * anything with that set.
6255 host_phys_bits = eax & 0xff;
6257 /* It's an odd 64 bit machine that doesn't have the leaf for
6258 * physical address bits; fall back to 36 that's most older
6261 host_phys_bits = 36;
6264 return host_phys_bits;
6267 static void x86_cpu_adjust_level(X86CPU *cpu, uint32_t *min, uint32_t value)
6274 /* Increase cpuid_min_{level,xlevel,xlevel2} automatically, if appropriate */
6275 static void x86_cpu_adjust_feat_level(X86CPU *cpu, FeatureWord w)
6277 CPUX86State *env = &cpu->env;
6278 FeatureWordInfo *fi = &feature_word_info[w];
6279 uint32_t eax = fi->cpuid.eax;
6280 uint32_t region = eax & 0xF0000000;
6282 assert(feature_word_info[w].type == CPUID_FEATURE_WORD);
6283 if (!env->features[w]) {
6289 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, eax);
6292 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, eax);
6295 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel2, eax);
6300 x86_cpu_adjust_level(cpu, &env->cpuid_min_level_func7,
6305 /* Calculate XSAVE components based on the configured CPU feature flags */
6306 static void x86_cpu_enable_xsave_components(X86CPU *cpu)
6308 CPUX86State *env = &cpu->env;
6312 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
6313 env->features[FEAT_XSAVE_COMP_LO] = 0;
6314 env->features[FEAT_XSAVE_COMP_HI] = 0;
6319 for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
6320 const ExtSaveArea *esa = &x86_ext_save_areas[i];
6321 if (env->features[esa->feature] & esa->bits) {
6322 mask |= (1ULL << i);
6326 env->features[FEAT_XSAVE_COMP_LO] = mask;
6327 env->features[FEAT_XSAVE_COMP_HI] = mask >> 32;
6330 /***** Steps involved on loading and filtering CPUID data
6332 * When initializing and realizing a CPU object, the steps
6333 * involved in setting up CPUID data are:
6335 * 1) Loading CPU model definition (X86CPUDefinition). This is
6336 * implemented by x86_cpu_load_model() and should be completely
6337 * transparent, as it is done automatically by instance_init.
6338 * No code should need to look at X86CPUDefinition structs
6339 * outside instance_init.
6341 * 2) CPU expansion. This is done by realize before CPUID
6342 * filtering, and will make sure host/accelerator data is
6343 * loaded for CPU models that depend on host capabilities
6344 * (e.g. "host"). Done by x86_cpu_expand_features().
6346 * 3) CPUID filtering. This initializes extra data related to
6347 * CPUID, and checks if the host supports all capabilities
6348 * required by the CPU. Runnability of a CPU model is
6349 * determined at this step. Done by x86_cpu_filter_features().
6351 * Some operations don't require all steps to be performed.
6354 * - CPU instance creation (instance_init) will run only CPU
6355 * model loading. CPU expansion can't run at instance_init-time
6356 * because host/accelerator data may be not available yet.
6357 * - CPU realization will perform both CPU model expansion and CPUID
6358 * filtering, and return an error in case one of them fails.
6359 * - query-cpu-definitions needs to run all 3 steps. It needs
6360 * to run CPUID filtering, as the 'unavailable-features'
6361 * field is set based on the filtering results.
6362 * - The query-cpu-model-expansion QMP command only needs to run
6363 * CPU model loading and CPU expansion. It should not filter
6364 * any CPUID data based on host capabilities.
6367 /* Expand CPU configuration data, based on configured features
6368 * and host/accelerator capabilities when appropriate.
6370 static void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
6372 CPUX86State *env = &cpu->env;
6377 for (l = plus_features; l; l = l->next) {
6378 const char *prop = l->data;
6379 if (!object_property_set_bool(OBJECT(cpu), prop, true, errp)) {
6384 for (l = minus_features; l; l = l->next) {
6385 const char *prop = l->data;
6386 if (!object_property_set_bool(OBJECT(cpu), prop, false, errp)) {
6391 /*TODO: Now cpu->max_features doesn't overwrite features
6392 * set using QOM properties, and we can convert
6393 * plus_features & minus_features to global properties
6394 * inside x86_cpu_parse_featurestr() too.
6396 if (cpu->max_features) {
6397 for (w = 0; w < FEATURE_WORDS; w++) {
6398 /* Override only features that weren't set explicitly
6402 x86_cpu_get_supported_feature_word(w, cpu->migratable) &
6403 ~env->user_features[w] &
6404 ~feature_word_info[w].no_autoenable_flags;
6408 for (i = 0; i < ARRAY_SIZE(feature_dependencies); i++) {
6409 FeatureDep *d = &feature_dependencies[i];
6410 if (!(env->features[d->from.index] & d->from.mask)) {
6411 uint64_t unavailable_features = env->features[d->to.index] & d->to.mask;
6413 /* Not an error unless the dependent feature was added explicitly. */
6414 mark_unavailable_features(cpu, d->to.index,
6415 unavailable_features & env->user_features[d->to.index],
6416 "This feature depends on other features that were not requested");
6418 env->features[d->to.index] &= ~unavailable_features;
6422 if (!kvm_enabled() || !cpu->expose_kvm) {
6423 env->features[FEAT_KVM] = 0;
6426 x86_cpu_enable_xsave_components(cpu);
6428 /* CPUID[EAX=7,ECX=0].EBX always increased level automatically: */
6429 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_EBX);
6430 if (cpu->full_cpuid_auto_level) {
6431 x86_cpu_adjust_feat_level(cpu, FEAT_1_EDX);
6432 x86_cpu_adjust_feat_level(cpu, FEAT_1_ECX);
6433 x86_cpu_adjust_feat_level(cpu, FEAT_6_EAX);
6434 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_ECX);
6435 x86_cpu_adjust_feat_level(cpu, FEAT_7_1_EAX);
6436 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_EDX);
6437 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_ECX);
6438 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0007_EDX);
6439 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0008_EBX);
6440 x86_cpu_adjust_feat_level(cpu, FEAT_C000_0001_EDX);
6441 x86_cpu_adjust_feat_level(cpu, FEAT_SVM);
6442 x86_cpu_adjust_feat_level(cpu, FEAT_XSAVE);
6444 /* Intel Processor Trace requires CPUID[0x14] */
6445 if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT)) {
6446 if (cpu->intel_pt_auto_level) {
6447 x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14);
6448 } else if (cpu->env.cpuid_min_level < 0x14) {
6449 mark_unavailable_features(cpu, FEAT_7_0_EBX,
6450 CPUID_7_0_EBX_INTEL_PT,
6451 "Intel PT need CPUID leaf 0x14, please set by \"-cpu ...,+intel-pt,min-level=0x14\"");
6455 /* CPU topology with multi-dies support requires CPUID[0x1F] */
6456 if (env->nr_dies > 1) {
6457 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x1F);
6460 /* SVM requires CPUID[0x8000000A] */
6461 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
6462 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000000A);
6465 /* SEV requires CPUID[0x8000001F] */
6466 if (sev_enabled()) {
6467 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000001F);
6471 /* Set cpuid_*level* based on cpuid_min_*level, if not explicitly set */
6472 if (env->cpuid_level_func7 == UINT32_MAX) {
6473 env->cpuid_level_func7 = env->cpuid_min_level_func7;
6475 if (env->cpuid_level == UINT32_MAX) {
6476 env->cpuid_level = env->cpuid_min_level;
6478 if (env->cpuid_xlevel == UINT32_MAX) {
6479 env->cpuid_xlevel = env->cpuid_min_xlevel;
6481 if (env->cpuid_xlevel2 == UINT32_MAX) {
6482 env->cpuid_xlevel2 = env->cpuid_min_xlevel2;
6487 * Finishes initialization of CPUID data, filters CPU feature
6488 * words based on host availability of each feature.
6490 * Returns: 0 if all flags are supported by the host, non-zero otherwise.
6492 static void x86_cpu_filter_features(X86CPU *cpu, bool verbose)
6494 CPUX86State *env = &cpu->env;
6496 const char *prefix = NULL;
6499 prefix = accel_uses_host_cpuid()
6500 ? "host doesn't support requested feature"
6501 : "TCG doesn't support requested feature";
6504 for (w = 0; w < FEATURE_WORDS; w++) {
6505 uint64_t host_feat =
6506 x86_cpu_get_supported_feature_word(w, false);
6507 uint64_t requested_features = env->features[w];
6508 uint64_t unavailable_features = requested_features & ~host_feat;
6509 mark_unavailable_features(cpu, w, unavailable_features, prefix);
6512 if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) &&
6514 KVMState *s = CPU(cpu)->kvm_state;
6515 uint32_t eax_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EAX);
6516 uint32_t ebx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EBX);
6517 uint32_t ecx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_ECX);
6518 uint32_t eax_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EAX);
6519 uint32_t ebx_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EBX);
6522 ((ebx_0 & INTEL_PT_MINIMAL_EBX) != INTEL_PT_MINIMAL_EBX) ||
6523 ((ecx_0 & INTEL_PT_MINIMAL_ECX) != INTEL_PT_MINIMAL_ECX) ||
6524 ((eax_1 & INTEL_PT_MTC_BITMAP) != INTEL_PT_MTC_BITMAP) ||
6525 ((eax_1 & INTEL_PT_ADDR_RANGES_NUM_MASK) <
6526 INTEL_PT_ADDR_RANGES_NUM) ||
6527 ((ebx_1 & (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) !=
6528 (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) ||
6529 ((ecx_0 & CPUID_14_0_ECX_LIP) !=
6530 (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP))) {
6532 * Processor Trace capabilities aren't configurable, so if the
6533 * host can't emulate the capabilities we report on
6534 * cpu_x86_cpuid(), intel-pt can't be enabled on the current host.
6536 mark_unavailable_features(cpu, FEAT_7_0_EBX, CPUID_7_0_EBX_INTEL_PT, prefix);
6541 static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
6543 CPUState *cs = CPU(dev);
6544 X86CPU *cpu = X86_CPU(dev);
6545 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
6546 CPUX86State *env = &cpu->env;
6547 Error *local_err = NULL;
6548 static bool ht_warned;
6550 if (xcc->host_cpuid_required) {
6551 if (!accel_uses_host_cpuid()) {
6552 g_autofree char *name = x86_cpu_class_get_model_name(xcc);
6553 error_setg(&local_err, "CPU model '%s' requires KVM", name);
6558 if (cpu->max_features && accel_uses_host_cpuid()) {
6559 if (enable_cpu_pm) {
6560 host_cpuid(5, 0, &cpu->mwait.eax, &cpu->mwait.ebx,
6561 &cpu->mwait.ecx, &cpu->mwait.edx);
6562 env->features[FEAT_1_ECX] |= CPUID_EXT_MONITOR;
6563 if (kvm_enabled() && kvm_has_waitpkg()) {
6564 env->features[FEAT_7_0_ECX] |= CPUID_7_0_ECX_WAITPKG;
6567 if (kvm_enabled() && cpu->ucode_rev == 0) {
6568 cpu->ucode_rev = kvm_arch_get_supported_msr_feature(kvm_state,
6569 MSR_IA32_UCODE_REV);
6573 if (cpu->ucode_rev == 0) {
6574 /* The default is the same as KVM's. */
6575 if (IS_AMD_CPU(env)) {
6576 cpu->ucode_rev = 0x01000065;
6578 cpu->ucode_rev = 0x100000000ULL;
6582 /* mwait extended info: needed for Core compatibility */
6583 /* We always wake on interrupt even if host does not have the capability */
6584 cpu->mwait.ecx |= CPUID_MWAIT_EMX | CPUID_MWAIT_IBE;
6586 if (cpu->apic_id == UNASSIGNED_APIC_ID) {
6587 error_setg(errp, "apic-id property was not initialized properly");
6591 x86_cpu_expand_features(cpu, &local_err);
6596 x86_cpu_filter_features(cpu, cpu->check_cpuid || cpu->enforce_cpuid);
6598 if (cpu->enforce_cpuid && x86_cpu_have_filtered_features(cpu)) {
6599 error_setg(&local_err,
6600 accel_uses_host_cpuid() ?
6601 "Host doesn't support requested features" :
6602 "TCG doesn't support requested features");
6606 /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on
6609 if (IS_AMD_CPU(env)) {
6610 env->features[FEAT_8000_0001_EDX] &= ~CPUID_EXT2_AMD_ALIASES;
6611 env->features[FEAT_8000_0001_EDX] |= (env->features[FEAT_1_EDX]
6612 & CPUID_EXT2_AMD_ALIASES);
6615 /* For 64bit systems think about the number of physical bits to present.
6616 * ideally this should be the same as the host; anything other than matching
6617 * the host can cause incorrect guest behaviour.
6618 * QEMU used to pick the magic value of 40 bits that corresponds to
6619 * consumer AMD devices but nothing else.
6621 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
6622 if (accel_uses_host_cpuid()) {
6623 uint32_t host_phys_bits = x86_host_phys_bits();
6626 /* Print a warning if the user set it to a value that's not the
6629 if (cpu->phys_bits != host_phys_bits && cpu->phys_bits != 0 &&
6631 warn_report("Host physical bits (%u)"
6632 " does not match phys-bits property (%u)",
6633 host_phys_bits, cpu->phys_bits);
6637 if (cpu->host_phys_bits) {
6638 /* The user asked for us to use the host physical bits */
6639 cpu->phys_bits = host_phys_bits;
6640 if (cpu->host_phys_bits_limit &&
6641 cpu->phys_bits > cpu->host_phys_bits_limit) {
6642 cpu->phys_bits = cpu->host_phys_bits_limit;
6646 if (cpu->phys_bits &&
6647 (cpu->phys_bits > TARGET_PHYS_ADDR_SPACE_BITS ||
6648 cpu->phys_bits < 32)) {
6649 error_setg(errp, "phys-bits should be between 32 and %u "
6651 TARGET_PHYS_ADDR_SPACE_BITS, cpu->phys_bits);
6655 if (cpu->phys_bits && cpu->phys_bits != TCG_PHYS_ADDR_BITS) {
6656 error_setg(errp, "TCG only supports phys-bits=%u",
6657 TCG_PHYS_ADDR_BITS);
6661 /* 0 means it was not explicitly set by the user (or by machine
6662 * compat_props or by the host code above). In this case, the default
6663 * is the value used by TCG (40).
6665 if (cpu->phys_bits == 0) {
6666 cpu->phys_bits = TCG_PHYS_ADDR_BITS;
6669 /* For 32 bit systems don't use the user set value, but keep
6670 * phys_bits consistent with what we tell the guest.
6672 if (cpu->phys_bits != 0) {
6673 error_setg(errp, "phys-bits is not user-configurable in 32 bit");
6677 if (env->features[FEAT_1_EDX] & CPUID_PSE36) {
6678 cpu->phys_bits = 36;
6680 cpu->phys_bits = 32;
6684 /* Cache information initialization */
6685 if (!cpu->legacy_cache) {
6686 if (!xcc->model || !xcc->model->cpudef->cache_info) {
6687 g_autofree char *name = x86_cpu_class_get_model_name(xcc);
6689 "CPU model '%s' doesn't support legacy-cache=off", name);
6692 env->cache_info_cpuid2 = env->cache_info_cpuid4 = env->cache_info_amd =
6693 *xcc->model->cpudef->cache_info;
6695 /* Build legacy cache information */
6696 env->cache_info_cpuid2.l1d_cache = &legacy_l1d_cache;
6697 env->cache_info_cpuid2.l1i_cache = &legacy_l1i_cache;
6698 env->cache_info_cpuid2.l2_cache = &legacy_l2_cache_cpuid2;
6699 env->cache_info_cpuid2.l3_cache = &legacy_l3_cache;
6701 env->cache_info_cpuid4.l1d_cache = &legacy_l1d_cache;
6702 env->cache_info_cpuid4.l1i_cache = &legacy_l1i_cache;
6703 env->cache_info_cpuid4.l2_cache = &legacy_l2_cache;
6704 env->cache_info_cpuid4.l3_cache = &legacy_l3_cache;
6706 env->cache_info_amd.l1d_cache = &legacy_l1d_cache_amd;
6707 env->cache_info_amd.l1i_cache = &legacy_l1i_cache_amd;
6708 env->cache_info_amd.l2_cache = &legacy_l2_cache_amd;
6709 env->cache_info_amd.l3_cache = &legacy_l3_cache;
6713 cpu_exec_realizefn(cs, &local_err);
6714 if (local_err != NULL) {
6715 error_propagate(errp, local_err);
6719 #ifndef CONFIG_USER_ONLY
6720 MachineState *ms = MACHINE(qdev_get_machine());
6721 qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
6723 if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || ms->smp.cpus > 1) {
6724 x86_cpu_apic_create(cpu, &local_err);
6725 if (local_err != NULL) {
6733 #ifndef CONFIG_USER_ONLY
6734 if (tcg_enabled()) {
6735 cpu->cpu_as_mem = g_new(MemoryRegion, 1);
6736 cpu->cpu_as_root = g_new(MemoryRegion, 1);
6738 /* Outer container... */
6739 memory_region_init(cpu->cpu_as_root, OBJECT(cpu), "memory", ~0ull);
6740 memory_region_set_enabled(cpu->cpu_as_root, true);
6742 /* ... with two regions inside: normal system memory with low
6745 memory_region_init_alias(cpu->cpu_as_mem, OBJECT(cpu), "memory",
6746 get_system_memory(), 0, ~0ull);
6747 memory_region_add_subregion_overlap(cpu->cpu_as_root, 0, cpu->cpu_as_mem, 0);
6748 memory_region_set_enabled(cpu->cpu_as_mem, true);
6751 cpu_address_space_init(cs, 0, "cpu-memory", cs->memory);
6752 cpu_address_space_init(cs, 1, "cpu-smm", cpu->cpu_as_root);
6754 /* ... SMRAM with higher priority, linked from /machine/smram. */
6755 cpu->machine_done.notify = x86_cpu_machine_done;
6756 qemu_add_machine_init_done_notifier(&cpu->machine_done);
6763 * Most Intel and certain AMD CPUs support hyperthreading. Even though QEMU
6764 * fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
6765 * based on inputs (sockets,cores,threads), it is still better to give
6768 * NOTE: the following code has to follow qemu_init_vcpu(). Otherwise
6769 * cs->nr_threads hasn't be populated yet and the checking is incorrect.
6771 if (IS_AMD_CPU(env) &&
6772 !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
6773 cs->nr_threads > 1 && !ht_warned) {
6774 warn_report("This family of AMD CPU doesn't support "
6775 "hyperthreading(%d)",
6777 error_printf("Please configure -smp options properly"
6778 " or try enabling topoext feature.\n");
6782 x86_cpu_apic_realize(cpu, &local_err);
6783 if (local_err != NULL) {
6788 xcc->parent_realize(dev, &local_err);
6791 if (local_err != NULL) {
6792 error_propagate(errp, local_err);
6797 static void x86_cpu_unrealizefn(DeviceState *dev)
6799 X86CPU *cpu = X86_CPU(dev);
6800 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
6802 #ifndef CONFIG_USER_ONLY
6803 cpu_remove_sync(CPU(dev));
6804 qemu_unregister_reset(x86_cpu_machine_reset_cb, dev);
6807 if (cpu->apic_state) {
6808 object_unparent(OBJECT(cpu->apic_state));
6809 cpu->apic_state = NULL;
6812 xcc->parent_unrealize(dev);
6815 typedef struct BitProperty {
6820 static void x86_cpu_get_bit_prop(Object *obj, Visitor *v, const char *name,
6821 void *opaque, Error **errp)
6823 X86CPU *cpu = X86_CPU(obj);
6824 BitProperty *fp = opaque;
6825 uint64_t f = cpu->env.features[fp->w];
6826 bool value = (f & fp->mask) == fp->mask;
6827 visit_type_bool(v, name, &value, errp);
6830 static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
6831 void *opaque, Error **errp)
6833 DeviceState *dev = DEVICE(obj);
6834 X86CPU *cpu = X86_CPU(obj);
6835 BitProperty *fp = opaque;
6838 if (dev->realized) {
6839 qdev_prop_set_after_realize(dev, name, errp);
6843 if (!visit_type_bool(v, name, &value, errp)) {
6848 cpu->env.features[fp->w] |= fp->mask;
6850 cpu->env.features[fp->w] &= ~fp->mask;
6852 cpu->env.user_features[fp->w] |= fp->mask;
6855 static void x86_cpu_release_bit_prop(Object *obj, const char *name,
6858 BitProperty *prop = opaque;
6862 /* Register a boolean property to get/set a single bit in a uint32_t field.
6864 * The same property name can be registered multiple times to make it affect
6865 * multiple bits in the same FeatureWord. In that case, the getter will return
6866 * true only if all bits are set.
6868 static void x86_cpu_register_bit_prop(X86CPU *cpu,
6869 const char *prop_name,
6875 uint64_t mask = (1ULL << bitnr);
6877 op = object_property_find(OBJECT(cpu), prop_name);
6883 fp = g_new0(BitProperty, 1);
6886 object_property_add(OBJECT(cpu), prop_name, "bool",
6887 x86_cpu_get_bit_prop,
6888 x86_cpu_set_bit_prop,
6889 x86_cpu_release_bit_prop, fp);
6893 static void x86_cpu_register_feature_bit_props(X86CPU *cpu,
6897 FeatureWordInfo *fi = &feature_word_info[w];
6898 const char *name = fi->feat_names[bitnr];
6904 /* Property names should use "-" instead of "_".
6905 * Old names containing underscores are registered as aliases
6906 * using object_property_add_alias()
6908 assert(!strchr(name, '_'));
6909 /* aliases don't use "|" delimiters anymore, they are registered
6910 * manually using object_property_add_alias() */
6911 assert(!strchr(name, '|'));
6912 x86_cpu_register_bit_prop(cpu, name, w, bitnr);
6915 #if !defined(CONFIG_USER_ONLY)
6916 static GuestPanicInformation *x86_cpu_get_crash_info(CPUState *cs)
6918 X86CPU *cpu = X86_CPU(cs);
6919 CPUX86State *env = &cpu->env;
6920 GuestPanicInformation *panic_info = NULL;
6922 if (env->features[FEAT_HYPERV_EDX] & HV_GUEST_CRASH_MSR_AVAILABLE) {
6923 panic_info = g_malloc0(sizeof(GuestPanicInformation));
6925 panic_info->type = GUEST_PANIC_INFORMATION_TYPE_HYPER_V;
6927 assert(HV_CRASH_PARAMS >= 5);
6928 panic_info->u.hyper_v.arg1 = env->msr_hv_crash_params[0];
6929 panic_info->u.hyper_v.arg2 = env->msr_hv_crash_params[1];
6930 panic_info->u.hyper_v.arg3 = env->msr_hv_crash_params[2];
6931 panic_info->u.hyper_v.arg4 = env->msr_hv_crash_params[3];
6932 panic_info->u.hyper_v.arg5 = env->msr_hv_crash_params[4];
6937 static void x86_cpu_get_crash_info_qom(Object *obj, Visitor *v,
6938 const char *name, void *opaque,
6941 CPUState *cs = CPU(obj);
6942 GuestPanicInformation *panic_info;
6944 if (!cs->crash_occurred) {
6945 error_setg(errp, "No crash occured");
6949 panic_info = x86_cpu_get_crash_info(cs);
6950 if (panic_info == NULL) {
6951 error_setg(errp, "No crash information");
6955 visit_type_GuestPanicInformation(v, "crash-information", &panic_info,
6957 qapi_free_GuestPanicInformation(panic_info);
6959 #endif /* !CONFIG_USER_ONLY */
6961 static void x86_cpu_initfn(Object *obj)
6963 X86CPU *cpu = X86_CPU(obj);
6964 X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
6965 CPUX86State *env = &cpu->env;
6969 cpu_set_cpustate_pointers(cpu);
6971 object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo",
6972 x86_cpu_get_feature_words,
6973 NULL, NULL, (void *)env->features);
6974 object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo",
6975 x86_cpu_get_feature_words,
6976 NULL, NULL, (void *)cpu->filtered_features);
6978 for (w = 0; w < FEATURE_WORDS; w++) {
6981 for (bitnr = 0; bitnr < 64; bitnr++) {
6982 x86_cpu_register_feature_bit_props(cpu, w, bitnr);
6986 object_property_add_alias(obj, "sse3", obj, "pni");
6987 object_property_add_alias(obj, "pclmuldq", obj, "pclmulqdq");
6988 object_property_add_alias(obj, "sse4-1", obj, "sse4.1");
6989 object_property_add_alias(obj, "sse4-2", obj, "sse4.2");
6990 object_property_add_alias(obj, "xd", obj, "nx");
6991 object_property_add_alias(obj, "ffxsr", obj, "fxsr-opt");
6992 object_property_add_alias(obj, "i64", obj, "lm");
6994 object_property_add_alias(obj, "ds_cpl", obj, "ds-cpl");
6995 object_property_add_alias(obj, "tsc_adjust", obj, "tsc-adjust");
6996 object_property_add_alias(obj, "fxsr_opt", obj, "fxsr-opt");
6997 object_property_add_alias(obj, "lahf_lm", obj, "lahf-lm");
6998 object_property_add_alias(obj, "cmp_legacy", obj, "cmp-legacy");
6999 object_property_add_alias(obj, "nodeid_msr", obj, "nodeid-msr");
7000 object_property_add_alias(obj, "perfctr_core", obj, "perfctr-core");
7001 object_property_add_alias(obj, "perfctr_nb", obj, "perfctr-nb");
7002 object_property_add_alias(obj, "kvm_nopiodelay", obj, "kvm-nopiodelay");
7003 object_property_add_alias(obj, "kvm_mmu", obj, "kvm-mmu");
7004 object_property_add_alias(obj, "kvm_asyncpf", obj, "kvm-asyncpf");
7005 object_property_add_alias(obj, "kvm_asyncpf_int", obj, "kvm-asyncpf-int");
7006 object_property_add_alias(obj, "kvm_steal_time", obj, "kvm-steal-time");
7007 object_property_add_alias(obj, "kvm_pv_eoi", obj, "kvm-pv-eoi");
7008 object_property_add_alias(obj, "kvm_pv_unhalt", obj, "kvm-pv-unhalt");
7009 object_property_add_alias(obj, "kvm_poll_control", obj, "kvm-poll-control");
7010 object_property_add_alias(obj, "svm_lock", obj, "svm-lock");
7011 object_property_add_alias(obj, "nrip_save", obj, "nrip-save");
7012 object_property_add_alias(obj, "tsc_scale", obj, "tsc-scale");
7013 object_property_add_alias(obj, "vmcb_clean", obj, "vmcb-clean");
7014 object_property_add_alias(obj, "pause_filter", obj, "pause-filter");
7015 object_property_add_alias(obj, "sse4_1", obj, "sse4.1");
7016 object_property_add_alias(obj, "sse4_2", obj, "sse4.2");
7019 x86_cpu_load_model(cpu, xcc->model);
7023 static int64_t x86_cpu_get_arch_id(CPUState *cs)
7025 X86CPU *cpu = X86_CPU(cs);
7027 return cpu->apic_id;
7030 static bool x86_cpu_get_paging_enabled(const CPUState *cs)
7032 X86CPU *cpu = X86_CPU(cs);
7034 return cpu->env.cr[0] & CR0_PG_MASK;
7037 static void x86_cpu_set_pc(CPUState *cs, vaddr value)
7039 X86CPU *cpu = X86_CPU(cs);
7041 cpu->env.eip = value;
7044 static void x86_cpu_synchronize_from_tb(CPUState *cs, TranslationBlock *tb)
7046 X86CPU *cpu = X86_CPU(cs);
7048 cpu->env.eip = tb->pc - tb->cs_base;
7051 int x86_cpu_pending_interrupt(CPUState *cs, int interrupt_request)
7053 X86CPU *cpu = X86_CPU(cs);
7054 CPUX86State *env = &cpu->env;
7056 #if !defined(CONFIG_USER_ONLY)
7057 if (interrupt_request & CPU_INTERRUPT_POLL) {
7058 return CPU_INTERRUPT_POLL;
7061 if (interrupt_request & CPU_INTERRUPT_SIPI) {
7062 return CPU_INTERRUPT_SIPI;
7065 if (env->hflags2 & HF2_GIF_MASK) {
7066 if ((interrupt_request & CPU_INTERRUPT_SMI) &&
7067 !(env->hflags & HF_SMM_MASK)) {
7068 return CPU_INTERRUPT_SMI;
7069 } else if ((interrupt_request & CPU_INTERRUPT_NMI) &&
7070 !(env->hflags2 & HF2_NMI_MASK)) {
7071 return CPU_INTERRUPT_NMI;
7072 } else if (interrupt_request & CPU_INTERRUPT_MCE) {
7073 return CPU_INTERRUPT_MCE;
7074 } else if ((interrupt_request & CPU_INTERRUPT_HARD) &&
7075 (((env->hflags2 & HF2_VINTR_MASK) &&
7076 (env->hflags2 & HF2_HIF_MASK)) ||
7077 (!(env->hflags2 & HF2_VINTR_MASK) &&
7078 (env->eflags & IF_MASK &&
7079 !(env->hflags & HF_INHIBIT_IRQ_MASK))))) {
7080 return CPU_INTERRUPT_HARD;
7081 #if !defined(CONFIG_USER_ONLY)
7082 } else if ((interrupt_request & CPU_INTERRUPT_VIRQ) &&
7083 (env->eflags & IF_MASK) &&
7084 !(env->hflags & HF_INHIBIT_IRQ_MASK)) {
7085 return CPU_INTERRUPT_VIRQ;
7093 static bool x86_cpu_has_work(CPUState *cs)
7095 return x86_cpu_pending_interrupt(cs, cs->interrupt_request) != 0;
7098 static void x86_disas_set_info(CPUState *cs, disassemble_info *info)
7100 X86CPU *cpu = X86_CPU(cs);
7101 CPUX86State *env = &cpu->env;
7103 info->mach = (env->hflags & HF_CS64_MASK ? bfd_mach_x86_64
7104 : env->hflags & HF_CS32_MASK ? bfd_mach_i386_i386
7105 : bfd_mach_i386_i8086);
7106 info->print_insn = print_insn_i386;
7108 info->cap_arch = CS_ARCH_X86;
7109 info->cap_mode = (env->hflags & HF_CS64_MASK ? CS_MODE_64
7110 : env->hflags & HF_CS32_MASK ? CS_MODE_32
7112 info->cap_insn_unit = 1;
7113 info->cap_insn_split = 8;
7116 void x86_update_hflags(CPUX86State *env)
7119 #define HFLAG_COPY_MASK \
7120 ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
7121 HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
7122 HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
7123 HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK)
7125 hflags = env->hflags & HFLAG_COPY_MASK;
7126 hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
7127 hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
7128 hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
7129 (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
7130 hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
7132 if (env->cr[4] & CR4_OSFXSR_MASK) {
7133 hflags |= HF_OSFXSR_MASK;
7136 if (env->efer & MSR_EFER_LMA) {
7137 hflags |= HF_LMA_MASK;
7140 if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
7141 hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
7143 hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
7144 (DESC_B_SHIFT - HF_CS32_SHIFT);
7145 hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
7146 (DESC_B_SHIFT - HF_SS32_SHIFT);
7147 if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) ||
7148 !(hflags & HF_CS32_MASK)) {
7149 hflags |= HF_ADDSEG_MASK;
7151 hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base |
7152 env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
7155 env->hflags = hflags;
7158 static Property x86_cpu_properties[] = {
7159 #ifdef CONFIG_USER_ONLY
7160 /* apic_id = 0 by default for *-user, see commit 9886e834 */
7161 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, 0),
7162 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, 0),
7163 DEFINE_PROP_INT32("core-id", X86CPU, core_id, 0),
7164 DEFINE_PROP_INT32("die-id", X86CPU, die_id, 0),
7165 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, 0),
7167 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, UNASSIGNED_APIC_ID),
7168 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, -1),
7169 DEFINE_PROP_INT32("core-id", X86CPU, core_id, -1),
7170 DEFINE_PROP_INT32("die-id", X86CPU, die_id, -1),
7171 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, -1),
7173 DEFINE_PROP_INT32("node-id", X86CPU, node_id, CPU_UNSET_NUMA_NODE_ID),
7174 DEFINE_PROP_BOOL("pmu", X86CPU, enable_pmu, false),
7176 DEFINE_PROP_UINT32("hv-spinlocks", X86CPU, hyperv_spinlock_attempts,
7177 HYPERV_SPINLOCK_NEVER_NOTIFY),
7178 DEFINE_PROP_BIT64("hv-relaxed", X86CPU, hyperv_features,
7179 HYPERV_FEAT_RELAXED, 0),
7180 DEFINE_PROP_BIT64("hv-vapic", X86CPU, hyperv_features,
7181 HYPERV_FEAT_VAPIC, 0),
7182 DEFINE_PROP_BIT64("hv-time", X86CPU, hyperv_features,
7183 HYPERV_FEAT_TIME, 0),
7184 DEFINE_PROP_BIT64("hv-crash", X86CPU, hyperv_features,
7185 HYPERV_FEAT_CRASH, 0),
7186 DEFINE_PROP_BIT64("hv-reset", X86CPU, hyperv_features,
7187 HYPERV_FEAT_RESET, 0),
7188 DEFINE_PROP_BIT64("hv-vpindex", X86CPU, hyperv_features,
7189 HYPERV_FEAT_VPINDEX, 0),
7190 DEFINE_PROP_BIT64("hv-runtime", X86CPU, hyperv_features,
7191 HYPERV_FEAT_RUNTIME, 0),
7192 DEFINE_PROP_BIT64("hv-synic", X86CPU, hyperv_features,
7193 HYPERV_FEAT_SYNIC, 0),
7194 DEFINE_PROP_BIT64("hv-stimer", X86CPU, hyperv_features,
7195 HYPERV_FEAT_STIMER, 0),
7196 DEFINE_PROP_BIT64("hv-frequencies", X86CPU, hyperv_features,
7197 HYPERV_FEAT_FREQUENCIES, 0),
7198 DEFINE_PROP_BIT64("hv-reenlightenment", X86CPU, hyperv_features,
7199 HYPERV_FEAT_REENLIGHTENMENT, 0),
7200 DEFINE_PROP_BIT64("hv-tlbflush", X86CPU, hyperv_features,
7201 HYPERV_FEAT_TLBFLUSH, 0),
7202 DEFINE_PROP_BIT64("hv-evmcs", X86CPU, hyperv_features,
7203 HYPERV_FEAT_EVMCS, 0),
7204 DEFINE_PROP_BIT64("hv-ipi", X86CPU, hyperv_features,
7205 HYPERV_FEAT_IPI, 0),
7206 DEFINE_PROP_BIT64("hv-stimer-direct", X86CPU, hyperv_features,
7207 HYPERV_FEAT_STIMER_DIRECT, 0),
7208 DEFINE_PROP_ON_OFF_AUTO("hv-no-nonarch-coresharing", X86CPU,
7209 hyperv_no_nonarch_cs, ON_OFF_AUTO_OFF),
7210 DEFINE_PROP_BOOL("hv-passthrough", X86CPU, hyperv_passthrough, false),
7212 DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true),
7213 DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
7214 DEFINE_PROP_BOOL("x-force-features", X86CPU, force_features, false),
7215 DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true),
7216 DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 0),
7217 DEFINE_PROP_BOOL("host-phys-bits", X86CPU, host_phys_bits, false),
7218 DEFINE_PROP_UINT8("host-phys-bits-limit", X86CPU, host_phys_bits_limit, 0),
7219 DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true),
7220 DEFINE_PROP_UINT32("level-func7", X86CPU, env.cpuid_level_func7,
7222 DEFINE_PROP_UINT32("level", X86CPU, env.cpuid_level, UINT32_MAX),
7223 DEFINE_PROP_UINT32("xlevel", X86CPU, env.cpuid_xlevel, UINT32_MAX),
7224 DEFINE_PROP_UINT32("xlevel2", X86CPU, env.cpuid_xlevel2, UINT32_MAX),
7225 DEFINE_PROP_UINT32("min-level", X86CPU, env.cpuid_min_level, 0),
7226 DEFINE_PROP_UINT32("min-xlevel", X86CPU, env.cpuid_min_xlevel, 0),
7227 DEFINE_PROP_UINT32("min-xlevel2", X86CPU, env.cpuid_min_xlevel2, 0),
7228 DEFINE_PROP_UINT64("ucode-rev", X86CPU, ucode_rev, 0),
7229 DEFINE_PROP_BOOL("full-cpuid-auto-level", X86CPU, full_cpuid_auto_level, true),
7230 DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor_id),
7231 DEFINE_PROP_BOOL("cpuid-0xb", X86CPU, enable_cpuid_0xb, true),
7232 DEFINE_PROP_BOOL("lmce", X86CPU, enable_lmce, false),
7233 DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true),
7234 DEFINE_PROP_BOOL("kvm-no-smi-migration", X86CPU, kvm_no_smi_migration,
7236 DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true),
7237 DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true),
7238 DEFINE_PROP_BOOL("x-migrate-smi-count", X86CPU, migrate_smi_count,
7241 * lecacy_cache defaults to true unless the CPU model provides its
7242 * own cache information (see x86_cpu_load_def()).
7244 DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, true),
7247 * From "Requirements for Implementing the Microsoft
7248 * Hypervisor Interface":
7249 * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs
7251 * "Starting with Windows Server 2012 and Windows 8, if
7252 * CPUID.40000005.EAX contains a value of -1, Windows assumes that
7253 * the hypervisor imposes no specific limit to the number of VPs.
7254 * In this case, Windows Server 2012 guest VMs may use more than
7255 * 64 VPs, up to the maximum supported number of processors applicable
7256 * to the specific Windows version being used."
7258 DEFINE_PROP_INT32("x-hv-max-vps", X86CPU, hv_max_vps, -1),
7259 DEFINE_PROP_BOOL("x-hv-synic-kvm-only", X86CPU, hyperv_synic_kvm_only,
7261 DEFINE_PROP_BOOL("x-intel-pt-auto-level", X86CPU, intel_pt_auto_level,
7263 DEFINE_PROP_END_OF_LIST()
7266 static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
7268 X86CPUClass *xcc = X86_CPU_CLASS(oc);
7269 CPUClass *cc = CPU_CLASS(oc);
7270 DeviceClass *dc = DEVICE_CLASS(oc);
7272 device_class_set_parent_realize(dc, x86_cpu_realizefn,
7273 &xcc->parent_realize);
7274 device_class_set_parent_unrealize(dc, x86_cpu_unrealizefn,
7275 &xcc->parent_unrealize);
7276 device_class_set_props(dc, x86_cpu_properties);
7278 device_class_set_parent_reset(dc, x86_cpu_reset, &xcc->parent_reset);
7279 cc->reset_dump_flags = CPU_DUMP_FPU | CPU_DUMP_CCOP;
7281 cc->class_by_name = x86_cpu_class_by_name;
7282 cc->parse_features = x86_cpu_parse_featurestr;
7283 cc->has_work = x86_cpu_has_work;
7285 cc->do_interrupt = x86_cpu_do_interrupt;
7286 cc->cpu_exec_interrupt = x86_cpu_exec_interrupt;
7288 cc->dump_state = x86_cpu_dump_state;
7289 cc->set_pc = x86_cpu_set_pc;
7290 cc->synchronize_from_tb = x86_cpu_synchronize_from_tb;
7291 cc->gdb_read_register = x86_cpu_gdb_read_register;
7292 cc->gdb_write_register = x86_cpu_gdb_write_register;
7293 cc->get_arch_id = x86_cpu_get_arch_id;
7294 cc->get_paging_enabled = x86_cpu_get_paging_enabled;
7295 #ifndef CONFIG_USER_ONLY
7296 cc->asidx_from_attrs = x86_asidx_from_attrs;
7297 cc->get_memory_mapping = x86_cpu_get_memory_mapping;
7298 cc->get_phys_page_attrs_debug = x86_cpu_get_phys_page_attrs_debug;
7299 cc->get_crash_info = x86_cpu_get_crash_info;
7300 cc->write_elf64_note = x86_cpu_write_elf64_note;
7301 cc->write_elf64_qemunote = x86_cpu_write_elf64_qemunote;
7302 cc->write_elf32_note = x86_cpu_write_elf32_note;
7303 cc->write_elf32_qemunote = x86_cpu_write_elf32_qemunote;
7304 cc->vmsd = &vmstate_x86_cpu;
7306 cc->gdb_arch_name = x86_gdb_arch_name;
7307 #ifdef TARGET_X86_64
7308 cc->gdb_core_xml_file = "i386-64bit.xml";
7309 cc->gdb_num_core_regs = 66;
7311 cc->gdb_core_xml_file = "i386-32bit.xml";
7312 cc->gdb_num_core_regs = 50;
7314 #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
7315 cc->debug_excp_handler = breakpoint_handler;
7317 cc->cpu_exec_enter = x86_cpu_exec_enter;
7318 cc->cpu_exec_exit = x86_cpu_exec_exit;
7320 cc->tcg_initialize = tcg_x86_init;
7321 cc->tlb_fill = x86_cpu_tlb_fill;
7323 cc->disas_set_info = x86_disas_set_info;
7325 dc->user_creatable = true;
7327 object_class_property_add(oc, "family", "int",
7328 x86_cpuid_version_get_family,
7329 x86_cpuid_version_set_family, NULL, NULL);
7330 object_class_property_add(oc, "model", "int",
7331 x86_cpuid_version_get_model,
7332 x86_cpuid_version_set_model, NULL, NULL);
7333 object_class_property_add(oc, "stepping", "int",
7334 x86_cpuid_version_get_stepping,
7335 x86_cpuid_version_set_stepping, NULL, NULL);
7336 object_class_property_add_str(oc, "vendor",
7337 x86_cpuid_get_vendor,
7338 x86_cpuid_set_vendor);
7339 object_class_property_add_str(oc, "model-id",
7340 x86_cpuid_get_model_id,
7341 x86_cpuid_set_model_id);
7342 object_class_property_add(oc, "tsc-frequency", "int",
7343 x86_cpuid_get_tsc_freq,
7344 x86_cpuid_set_tsc_freq, NULL, NULL);
7346 * The "unavailable-features" property has the same semantics as
7347 * CpuDefinitionInfo.unavailable-features on the "query-cpu-definitions"
7348 * QMP command: they list the features that would have prevented the
7349 * CPU from running if the "enforce" flag was set.
7351 object_class_property_add(oc, "unavailable-features", "strList",
7352 x86_cpu_get_unavailable_features,
7355 #if !defined(CONFIG_USER_ONLY)
7356 object_class_property_add(oc, "crash-information", "GuestPanicInformation",
7357 x86_cpu_get_crash_info_qom, NULL, NULL, NULL);
7362 static const TypeInfo x86_cpu_type_info = {
7363 .name = TYPE_X86_CPU,
7365 .instance_size = sizeof(X86CPU),
7366 .instance_init = x86_cpu_initfn,
7368 .class_size = sizeof(X86CPUClass),
7369 .class_init = x86_cpu_common_class_init,
7373 /* "base" CPU model, used by query-cpu-model-expansion */
7374 static void x86_cpu_base_class_init(ObjectClass *oc, void *data)
7376 X86CPUClass *xcc = X86_CPU_CLASS(oc);
7378 xcc->static_model = true;
7379 xcc->migration_safe = true;
7380 xcc->model_description = "base CPU model type with no features enabled";
7384 static const TypeInfo x86_base_cpu_type_info = {
7385 .name = X86_CPU_TYPE_NAME("base"),
7386 .parent = TYPE_X86_CPU,
7387 .class_init = x86_cpu_base_class_init,
7390 static void x86_cpu_register_types(void)
7394 type_register_static(&x86_cpu_type_info);
7395 for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) {
7396 x86_register_cpudef_types(&builtin_x86_defs[i]);
7398 type_register_static(&max_x86_cpu_type_info);
7399 type_register_static(&x86_base_cpu_type_info);
7400 #if defined(CONFIG_KVM) || defined(CONFIG_HVF)
7401 type_register_static(&host_x86_cpu_type_info);
7405 type_init(x86_cpu_register_types)