Merge remote-tracking branch 'remotes/vivier2/tags/trivial-branch-pull-request' into...
[qemu/ar7.git] / target / i386 / cpu.c
bloba624163ac2cddf08648a90caffb2317006a6c3f8
1 /*
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 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
20 #include "qemu/osdep.h"
21 #include "qemu/units.h"
22 #include "qemu/cutils.h"
23 #include "qemu/bitops.h"
24 #include "qemu/qemu-print.h"
26 #include "cpu.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 "kvm_i386.h"
33 #include "sev_i386.h"
35 #include "qemu/error-report.h"
36 #include "qemu/module.h"
37 #include "qemu/option.h"
38 #include "qemu/config-file.h"
39 #include "qapi/error.h"
40 #include "qapi/qapi-visit-machine.h"
41 #include "qapi/qapi-visit-run-state.h"
42 #include "qapi/qmp/qdict.h"
43 #include "qapi/qmp/qerror.h"
44 #include "qapi/visitor.h"
45 #include "qom/qom-qobject.h"
46 #include "sysemu/arch_init.h"
47 #include "qapi/qapi-commands-machine-target.h"
49 #include "standard-headers/asm-x86/kvm_para.h"
51 #include "sysemu/sysemu.h"
52 #include "sysemu/tcg.h"
53 #include "hw/qdev-properties.h"
54 #include "hw/i386/topology.h"
55 #ifndef CONFIG_USER_ONLY
56 #include "exec/address-spaces.h"
57 #include "hw/xen/xen.h"
58 #include "hw/i386/apic_internal.h"
59 #include "hw/boards.h"
60 #endif
62 #include "disas/capstone.h"
64 /* Helpers for building CPUID[2] descriptors: */
66 struct CPUID2CacheDescriptorInfo {
67 enum CacheType type;
68 int level;
69 int size;
70 int line_size;
71 int associativity;
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)
211 int i;
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) {
222 return i;
226 return CACHE_DESCRIPTOR_UNAVAILABLE;
229 /* CPUID Leaf 4 constants: */
231 /* EAX: */
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)
240 /* EDX: */
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 : \
300 a == 2 ? 0x2 : \
301 a == 4 ? 0x4 : \
302 a == 8 ? 0x6 : \
303 a == 16 ? 0x8 : \
304 a == 32 ? 0xA : \
305 a == 48 ? 0xB : \
306 a == 64 ? 0xC : \
307 a == 96 ? 0xD : \
308 a == 128 ? 0xE : \
309 a == ASSOC_FULL ? 0xF : \
310 0 /* invalid value */)
313 * Encode cache info for CPUID[0x80000006].ECX and CPUID[0x80000006].EDX
314 * @l3 can be NULL.
316 static void encode_cache_cpuid80000006(CPUCacheInfo *l2,
317 CPUCacheInfo *l3,
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);
328 if (l3) {
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);
336 } else {
337 *edx = 0;
342 * Definitions used for building CPUID Leaf 0x8000001D and 0x8000001E
343 * Please refer to the AMD64 Architecture Programmer’s Manual Volume 3.
344 * Define the constants to build the cpu topology. Right now, TOPOEXT
345 * feature is enabled only on EPYC. So, these constants are based on
346 * EPYC supported configurations. We may need to handle the cases if
347 * these values change in future.
349 /* Maximum core complexes in a node */
350 #define MAX_CCX 2
351 /* Maximum cores in a core complex */
352 #define MAX_CORES_IN_CCX 4
353 /* Maximum cores in a node */
354 #define MAX_CORES_IN_NODE 8
355 /* Maximum nodes in a socket */
356 #define MAX_NODES_PER_SOCKET 4
359 * Figure out the number of nodes required to build this config.
360 * Max cores in a node is 8
362 static int nodes_in_socket(int nr_cores)
364 int nodes;
366 nodes = DIV_ROUND_UP(nr_cores, MAX_CORES_IN_NODE);
368 /* Hardware does not support config with 3 nodes, return 4 in that case */
369 return (nodes == 3) ? 4 : nodes;
373 * Decide the number of cores in a core complex with the given nr_cores using
374 * following set constants MAX_CCX, MAX_CORES_IN_CCX, MAX_CORES_IN_NODE and
375 * MAX_NODES_PER_SOCKET. Maintain symmetry as much as possible
376 * L3 cache is shared across all cores in a core complex. So, this will also
377 * tell us how many cores are sharing the L3 cache.
379 static int cores_in_core_complex(int nr_cores)
381 int nodes;
383 /* Check if we can fit all the cores in one core complex */
384 if (nr_cores <= MAX_CORES_IN_CCX) {
385 return nr_cores;
387 /* Get the number of nodes required to build this config */
388 nodes = nodes_in_socket(nr_cores);
391 * Divide the cores accros all the core complexes
392 * Return rounded up value
394 return DIV_ROUND_UP(nr_cores, nodes * MAX_CCX);
397 /* Encode cache info for CPUID[8000001D] */
398 static void encode_cache_cpuid8000001d(CPUCacheInfo *cache, CPUState *cs,
399 uint32_t *eax, uint32_t *ebx,
400 uint32_t *ecx, uint32_t *edx)
402 uint32_t l3_cores;
403 assert(cache->size == cache->line_size * cache->associativity *
404 cache->partitions * cache->sets);
406 *eax = CACHE_TYPE(cache->type) | CACHE_LEVEL(cache->level) |
407 (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0);
409 /* L3 is shared among multiple cores */
410 if (cache->level == 3) {
411 l3_cores = cores_in_core_complex(cs->nr_cores);
412 *eax |= ((l3_cores * cs->nr_threads) - 1) << 14;
413 } else {
414 *eax |= ((cs->nr_threads - 1) << 14);
417 assert(cache->line_size > 0);
418 assert(cache->partitions > 0);
419 assert(cache->associativity > 0);
420 /* We don't implement fully-associative caches */
421 assert(cache->associativity < cache->sets);
422 *ebx = (cache->line_size - 1) |
423 ((cache->partitions - 1) << 12) |
424 ((cache->associativity - 1) << 22);
426 assert(cache->sets > 0);
427 *ecx = cache->sets - 1;
429 *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
430 (cache->inclusive ? CACHE_INCLUSIVE : 0) |
431 (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
434 /* Data structure to hold the configuration info for a given core index */
435 struct core_topology {
436 /* core complex id of the current core index */
437 int ccx_id;
439 * Adjusted core index for this core in the topology
440 * This can be 0,1,2,3 with max 4 cores in a core complex
442 int core_id;
443 /* Node id for this core index */
444 int node_id;
445 /* Number of nodes in this config */
446 int num_nodes;
450 * Build the configuration closely match the EPYC hardware. Using the EPYC
451 * hardware configuration values (MAX_CCX, MAX_CORES_IN_CCX, MAX_CORES_IN_NODE)
452 * right now. This could change in future.
453 * nr_cores : Total number of cores in the config
454 * core_id : Core index of the current CPU
455 * topo : Data structure to hold all the config info for this core index
457 static void build_core_topology(int nr_cores, int core_id,
458 struct core_topology *topo)
460 int nodes, cores_in_ccx;
462 /* First get the number of nodes required */
463 nodes = nodes_in_socket(nr_cores);
465 cores_in_ccx = cores_in_core_complex(nr_cores);
467 topo->node_id = core_id / (cores_in_ccx * MAX_CCX);
468 topo->ccx_id = (core_id % (cores_in_ccx * MAX_CCX)) / cores_in_ccx;
469 topo->core_id = core_id % cores_in_ccx;
470 topo->num_nodes = nodes;
473 /* Encode cache info for CPUID[8000001E] */
474 static void encode_topo_cpuid8000001e(CPUState *cs, X86CPU *cpu,
475 uint32_t *eax, uint32_t *ebx,
476 uint32_t *ecx, uint32_t *edx)
478 struct core_topology topo = {0};
479 unsigned long nodes;
480 int shift;
482 build_core_topology(cs->nr_cores, cpu->core_id, &topo);
483 *eax = cpu->apic_id;
485 * CPUID_Fn8000001E_EBX
486 * 31:16 Reserved
487 * 15:8 Threads per core (The number of threads per core is
488 * Threads per core + 1)
489 * 7:0 Core id (see bit decoding below)
490 * SMT:
491 * 4:3 node id
492 * 2 Core complex id
493 * 1:0 Core id
494 * Non SMT:
495 * 5:4 node id
496 * 3 Core complex id
497 * 1:0 Core id
499 if (cs->nr_threads - 1) {
500 *ebx = ((cs->nr_threads - 1) << 8) | (topo.node_id << 3) |
501 (topo.ccx_id << 2) | topo.core_id;
502 } else {
503 *ebx = (topo.node_id << 4) | (topo.ccx_id << 3) | topo.core_id;
506 * CPUID_Fn8000001E_ECX
507 * 31:11 Reserved
508 * 10:8 Nodes per processor (Nodes per processor is number of nodes + 1)
509 * 7:0 Node id (see bit decoding below)
510 * 2 Socket id
511 * 1:0 Node id
513 if (topo.num_nodes <= 4) {
514 *ecx = ((topo.num_nodes - 1) << 8) | (cpu->socket_id << 2) |
515 topo.node_id;
516 } else {
518 * Node id fix up. Actual hardware supports up to 4 nodes. But with
519 * more than 32 cores, we may end up with more than 4 nodes.
520 * Node id is a combination of socket id and node id. Only requirement
521 * here is that this number should be unique accross the system.
522 * Shift the socket id to accommodate more nodes. We dont expect both
523 * socket id and node id to be big number at the same time. This is not
524 * an ideal config but we need to to support it. Max nodes we can have
525 * is 32 (255/8) with 8 cores per node and 255 max cores. We only need
526 * 5 bits for nodes. Find the left most set bit to represent the total
527 * number of nodes. find_last_bit returns last set bit(0 based). Left
528 * shift(+1) the socket id to represent all the nodes.
530 nodes = topo.num_nodes - 1;
531 shift = find_last_bit(&nodes, 8);
532 *ecx = ((topo.num_nodes - 1) << 8) | (cpu->socket_id << (shift + 1)) |
533 topo.node_id;
535 *edx = 0;
539 * Definitions of the hardcoded cache entries we expose:
540 * These are legacy cache values. If there is a need to change any
541 * of these values please use builtin_x86_defs
544 /* L1 data cache: */
545 static CPUCacheInfo legacy_l1d_cache = {
546 .type = DATA_CACHE,
547 .level = 1,
548 .size = 32 * KiB,
549 .self_init = 1,
550 .line_size = 64,
551 .associativity = 8,
552 .sets = 64,
553 .partitions = 1,
554 .no_invd_sharing = true,
557 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
558 static CPUCacheInfo legacy_l1d_cache_amd = {
559 .type = DATA_CACHE,
560 .level = 1,
561 .size = 64 * KiB,
562 .self_init = 1,
563 .line_size = 64,
564 .associativity = 2,
565 .sets = 512,
566 .partitions = 1,
567 .lines_per_tag = 1,
568 .no_invd_sharing = true,
571 /* L1 instruction cache: */
572 static CPUCacheInfo legacy_l1i_cache = {
573 .type = INSTRUCTION_CACHE,
574 .level = 1,
575 .size = 32 * KiB,
576 .self_init = 1,
577 .line_size = 64,
578 .associativity = 8,
579 .sets = 64,
580 .partitions = 1,
581 .no_invd_sharing = true,
584 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
585 static CPUCacheInfo legacy_l1i_cache_amd = {
586 .type = INSTRUCTION_CACHE,
587 .level = 1,
588 .size = 64 * KiB,
589 .self_init = 1,
590 .line_size = 64,
591 .associativity = 2,
592 .sets = 512,
593 .partitions = 1,
594 .lines_per_tag = 1,
595 .no_invd_sharing = true,
598 /* Level 2 unified cache: */
599 static CPUCacheInfo legacy_l2_cache = {
600 .type = UNIFIED_CACHE,
601 .level = 2,
602 .size = 4 * MiB,
603 .self_init = 1,
604 .line_size = 64,
605 .associativity = 16,
606 .sets = 4096,
607 .partitions = 1,
608 .no_invd_sharing = true,
611 /*FIXME: CPUID leaf 2 descriptor is inconsistent with CPUID leaf 4 */
612 static CPUCacheInfo legacy_l2_cache_cpuid2 = {
613 .type = UNIFIED_CACHE,
614 .level = 2,
615 .size = 2 * MiB,
616 .line_size = 64,
617 .associativity = 8,
621 /*FIXME: CPUID leaf 0x80000006 is inconsistent with leaves 2 & 4 */
622 static CPUCacheInfo legacy_l2_cache_amd = {
623 .type = UNIFIED_CACHE,
624 .level = 2,
625 .size = 512 * KiB,
626 .line_size = 64,
627 .lines_per_tag = 1,
628 .associativity = 16,
629 .sets = 512,
630 .partitions = 1,
633 /* Level 3 unified cache: */
634 static CPUCacheInfo legacy_l3_cache = {
635 .type = UNIFIED_CACHE,
636 .level = 3,
637 .size = 16 * MiB,
638 .line_size = 64,
639 .associativity = 16,
640 .sets = 16384,
641 .partitions = 1,
642 .lines_per_tag = 1,
643 .self_init = true,
644 .inclusive = true,
645 .complex_indexing = true,
648 /* TLB definitions: */
650 #define L1_DTLB_2M_ASSOC 1
651 #define L1_DTLB_2M_ENTRIES 255
652 #define L1_DTLB_4K_ASSOC 1
653 #define L1_DTLB_4K_ENTRIES 255
655 #define L1_ITLB_2M_ASSOC 1
656 #define L1_ITLB_2M_ENTRIES 255
657 #define L1_ITLB_4K_ASSOC 1
658 #define L1_ITLB_4K_ENTRIES 255
660 #define L2_DTLB_2M_ASSOC 0 /* disabled */
661 #define L2_DTLB_2M_ENTRIES 0 /* disabled */
662 #define L2_DTLB_4K_ASSOC 4
663 #define L2_DTLB_4K_ENTRIES 512
665 #define L2_ITLB_2M_ASSOC 0 /* disabled */
666 #define L2_ITLB_2M_ENTRIES 0 /* disabled */
667 #define L2_ITLB_4K_ASSOC 4
668 #define L2_ITLB_4K_ENTRIES 512
670 /* CPUID Leaf 0x14 constants: */
671 #define INTEL_PT_MAX_SUBLEAF 0x1
673 * bit[00]: IA32_RTIT_CTL.CR3 filter can be set to 1 and IA32_RTIT_CR3_MATCH
674 * MSR can be accessed;
675 * bit[01]: Support Configurable PSB and Cycle-Accurate Mode;
676 * bit[02]: Support IP Filtering, TraceStop filtering, and preservation
677 * of Intel PT MSRs across warm reset;
678 * bit[03]: Support MTC timing packet and suppression of COFI-based packets;
680 #define INTEL_PT_MINIMAL_EBX 0xf
682 * bit[00]: Tracing can be enabled with IA32_RTIT_CTL.ToPA = 1 and
683 * IA32_RTIT_OUTPUT_BASE and IA32_RTIT_OUTPUT_MASK_PTRS MSRs can be
684 * accessed;
685 * bit[01]: ToPA tables can hold any number of output entries, up to the
686 * maximum allowed by the MaskOrTableOffset field of
687 * IA32_RTIT_OUTPUT_MASK_PTRS;
688 * bit[02]: Support Single-Range Output scheme;
690 #define INTEL_PT_MINIMAL_ECX 0x7
691 /* generated packets which contain IP payloads have LIP values */
692 #define INTEL_PT_IP_LIP (1 << 31)
693 #define INTEL_PT_ADDR_RANGES_NUM 0x2 /* Number of configurable address ranges */
694 #define INTEL_PT_ADDR_RANGES_NUM_MASK 0x3
695 #define INTEL_PT_MTC_BITMAP (0x0249 << 16) /* Support ART(0,3,6,9) */
696 #define INTEL_PT_CYCLE_BITMAP 0x1fff /* Support 0,2^(0~11) */
697 #define INTEL_PT_PSB_BITMAP (0x003f << 16) /* Support 2K,4K,8K,16K,32K,64K */
699 static void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1,
700 uint32_t vendor2, uint32_t vendor3)
702 int i;
703 for (i = 0; i < 4; i++) {
704 dst[i] = vendor1 >> (8 * i);
705 dst[i + 4] = vendor2 >> (8 * i);
706 dst[i + 8] = vendor3 >> (8 * i);
708 dst[CPUID_VENDOR_SZ] = '\0';
711 #define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
712 #define PENTIUM_FEATURES (I486_FEATURES | CPUID_DE | CPUID_TSC | \
713 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_MMX | CPUID_APIC)
714 #define PENTIUM2_FEATURES (PENTIUM_FEATURES | CPUID_PAE | CPUID_SEP | \
715 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
716 CPUID_PSE36 | CPUID_FXSR)
717 #define PENTIUM3_FEATURES (PENTIUM2_FEATURES | CPUID_SSE)
718 #define PPRO_FEATURES (CPUID_FP87 | CPUID_DE | CPUID_PSE | CPUID_TSC | \
719 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_PGE | CPUID_CMOV | \
720 CPUID_PAT | CPUID_FXSR | CPUID_MMX | CPUID_SSE | CPUID_SSE2 | \
721 CPUID_PAE | CPUID_SEP | CPUID_APIC)
723 #define TCG_FEATURES (CPUID_FP87 | CPUID_PSE | CPUID_TSC | CPUID_MSR | \
724 CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | CPUID_SEP | \
725 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
726 CPUID_PSE36 | CPUID_CLFLUSH | CPUID_ACPI | CPUID_MMX | \
727 CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS | CPUID_DE)
728 /* partly implemented:
729 CPUID_MTRR, CPUID_MCA, CPUID_CLFLUSH (needed for Win64) */
730 /* missing:
731 CPUID_VME, CPUID_DTS, CPUID_SS, CPUID_HT, CPUID_TM, CPUID_PBE */
732 #define TCG_EXT_FEATURES (CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | \
733 CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | \
734 CPUID_EXT_SSE41 | CPUID_EXT_SSE42 | CPUID_EXT_POPCNT | \
735 CPUID_EXT_XSAVE | /* CPUID_EXT_OSXSAVE is dynamic */ \
736 CPUID_EXT_MOVBE | CPUID_EXT_AES | CPUID_EXT_HYPERVISOR | \
737 CPUID_EXT_RDRAND)
738 /* missing:
739 CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_SMX,
740 CPUID_EXT_EST, CPUID_EXT_TM2, CPUID_EXT_CID, CPUID_EXT_FMA,
741 CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_PCID, CPUID_EXT_DCA,
742 CPUID_EXT_X2APIC, CPUID_EXT_TSC_DEADLINE_TIMER, CPUID_EXT_AVX,
743 CPUID_EXT_F16C */
745 #ifdef TARGET_X86_64
746 #define TCG_EXT2_X86_64_FEATURES (CPUID_EXT2_SYSCALL | CPUID_EXT2_LM)
747 #else
748 #define TCG_EXT2_X86_64_FEATURES 0
749 #endif
751 #define TCG_EXT2_FEATURES ((TCG_FEATURES & CPUID_EXT2_AMD_ALIASES) | \
752 CPUID_EXT2_NX | CPUID_EXT2_MMXEXT | CPUID_EXT2_RDTSCP | \
753 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_PDPE1GB | \
754 TCG_EXT2_X86_64_FEATURES)
755 #define TCG_EXT3_FEATURES (CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | \
756 CPUID_EXT3_CR8LEG | CPUID_EXT3_ABM | CPUID_EXT3_SSE4A)
757 #define TCG_EXT4_FEATURES 0
758 #define TCG_SVM_FEATURES CPUID_SVM_NPT
759 #define TCG_KVM_FEATURES 0
760 #define TCG_7_0_EBX_FEATURES (CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_SMAP | \
761 CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX | \
762 CPUID_7_0_EBX_PCOMMIT | CPUID_7_0_EBX_CLFLUSHOPT | \
763 CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_FSGSBASE | \
764 CPUID_7_0_EBX_ERMS)
765 /* missing:
766 CPUID_7_0_EBX_HLE, CPUID_7_0_EBX_AVX2,
767 CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM,
768 CPUID_7_0_EBX_RDSEED */
769 #define TCG_7_0_ECX_FEATURES (CPUID_7_0_ECX_PKU | \
770 /* CPUID_7_0_ECX_OSPKE is dynamic */ \
771 CPUID_7_0_ECX_LA57)
772 #define TCG_7_0_EDX_FEATURES 0
773 #define TCG_7_1_EAX_FEATURES 0
774 #define TCG_APM_FEATURES 0
775 #define TCG_6_EAX_FEATURES CPUID_6_EAX_ARAT
776 #define TCG_XSAVE_FEATURES (CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XGETBV1)
777 /* missing:
778 CPUID_XSAVE_XSAVEC, CPUID_XSAVE_XSAVES */
780 typedef enum FeatureWordType {
781 CPUID_FEATURE_WORD,
782 MSR_FEATURE_WORD,
783 } FeatureWordType;
785 typedef struct FeatureWordInfo {
786 FeatureWordType type;
787 /* feature flags names are taken from "Intel Processor Identification and
788 * the CPUID Instruction" and AMD's "CPUID Specification".
789 * In cases of disagreement between feature naming conventions,
790 * aliases may be added.
792 const char *feat_names[64];
793 union {
794 /* If type==CPUID_FEATURE_WORD */
795 struct {
796 uint32_t eax; /* Input EAX for CPUID */
797 bool needs_ecx; /* CPUID instruction uses ECX as input */
798 uint32_t ecx; /* Input ECX value for CPUID */
799 int reg; /* output register (R_* constant) */
800 } cpuid;
801 /* If type==MSR_FEATURE_WORD */
802 struct {
803 uint32_t index;
804 } msr;
806 uint64_t tcg_features; /* Feature flags supported by TCG */
807 uint64_t unmigratable_flags; /* Feature flags known to be unmigratable */
808 uint64_t migratable_flags; /* Feature flags known to be migratable */
809 /* Features that shouldn't be auto-enabled by "-cpu host" */
810 uint64_t no_autoenable_flags;
811 } FeatureWordInfo;
813 static FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
814 [FEAT_1_EDX] = {
815 .type = CPUID_FEATURE_WORD,
816 .feat_names = {
817 "fpu", "vme", "de", "pse",
818 "tsc", "msr", "pae", "mce",
819 "cx8", "apic", NULL, "sep",
820 "mtrr", "pge", "mca", "cmov",
821 "pat", "pse36", "pn" /* Intel psn */, "clflush" /* Intel clfsh */,
822 NULL, "ds" /* Intel dts */, "acpi", "mmx",
823 "fxsr", "sse", "sse2", "ss",
824 "ht" /* Intel htt */, "tm", "ia64", "pbe",
826 .cpuid = {.eax = 1, .reg = R_EDX, },
827 .tcg_features = TCG_FEATURES,
829 [FEAT_1_ECX] = {
830 .type = CPUID_FEATURE_WORD,
831 .feat_names = {
832 "pni" /* Intel,AMD sse3 */, "pclmulqdq", "dtes64", "monitor",
833 "ds-cpl", "vmx", "smx", "est",
834 "tm2", "ssse3", "cid", NULL,
835 "fma", "cx16", "xtpr", "pdcm",
836 NULL, "pcid", "dca", "sse4.1",
837 "sse4.2", "x2apic", "movbe", "popcnt",
838 "tsc-deadline", "aes", "xsave", NULL /* osxsave */,
839 "avx", "f16c", "rdrand", "hypervisor",
841 .cpuid = { .eax = 1, .reg = R_ECX, },
842 .tcg_features = TCG_EXT_FEATURES,
844 /* Feature names that are already defined on feature_name[] but
845 * are set on CPUID[8000_0001].EDX on AMD CPUs don't have their
846 * names on feat_names below. They are copied automatically
847 * to features[FEAT_8000_0001_EDX] if and only if CPU vendor is AMD.
849 [FEAT_8000_0001_EDX] = {
850 .type = CPUID_FEATURE_WORD,
851 .feat_names = {
852 NULL /* fpu */, NULL /* vme */, NULL /* de */, NULL /* pse */,
853 NULL /* tsc */, NULL /* msr */, NULL /* pae */, NULL /* mce */,
854 NULL /* cx8 */, NULL /* apic */, NULL, "syscall",
855 NULL /* mtrr */, NULL /* pge */, NULL /* mca */, NULL /* cmov */,
856 NULL /* pat */, NULL /* pse36 */, NULL, NULL /* Linux mp */,
857 "nx", NULL, "mmxext", NULL /* mmx */,
858 NULL /* fxsr */, "fxsr-opt", "pdpe1gb", "rdtscp",
859 NULL, "lm", "3dnowext", "3dnow",
861 .cpuid = { .eax = 0x80000001, .reg = R_EDX, },
862 .tcg_features = TCG_EXT2_FEATURES,
864 [FEAT_8000_0001_ECX] = {
865 .type = CPUID_FEATURE_WORD,
866 .feat_names = {
867 "lahf-lm", "cmp-legacy", "svm", "extapic",
868 "cr8legacy", "abm", "sse4a", "misalignsse",
869 "3dnowprefetch", "osvw", "ibs", "xop",
870 "skinit", "wdt", NULL, "lwp",
871 "fma4", "tce", NULL, "nodeid-msr",
872 NULL, "tbm", "topoext", "perfctr-core",
873 "perfctr-nb", NULL, NULL, NULL,
874 NULL, NULL, NULL, NULL,
876 .cpuid = { .eax = 0x80000001, .reg = R_ECX, },
877 .tcg_features = TCG_EXT3_FEATURES,
879 * TOPOEXT is always allowed but can't be enabled blindly by
880 * "-cpu host", as it requires consistent cache topology info
881 * to be provided so it doesn't confuse guests.
883 .no_autoenable_flags = CPUID_EXT3_TOPOEXT,
885 [FEAT_C000_0001_EDX] = {
886 .type = CPUID_FEATURE_WORD,
887 .feat_names = {
888 NULL, NULL, "xstore", "xstore-en",
889 NULL, NULL, "xcrypt", "xcrypt-en",
890 "ace2", "ace2-en", "phe", "phe-en",
891 "pmm", "pmm-en", NULL, NULL,
892 NULL, NULL, NULL, NULL,
893 NULL, NULL, NULL, NULL,
894 NULL, NULL, NULL, NULL,
895 NULL, NULL, NULL, NULL,
897 .cpuid = { .eax = 0xC0000001, .reg = R_EDX, },
898 .tcg_features = TCG_EXT4_FEATURES,
900 [FEAT_KVM] = {
901 .type = CPUID_FEATURE_WORD,
902 .feat_names = {
903 "kvmclock", "kvm-nopiodelay", "kvm-mmu", "kvmclock",
904 "kvm-asyncpf", "kvm-steal-time", "kvm-pv-eoi", "kvm-pv-unhalt",
905 NULL, "kvm-pv-tlb-flush", NULL, "kvm-pv-ipi",
906 "kvm-poll-control", "kvm-pv-sched-yield", NULL, NULL,
907 NULL, NULL, NULL, NULL,
908 NULL, NULL, NULL, NULL,
909 "kvmclock-stable-bit", NULL, NULL, NULL,
910 NULL, NULL, NULL, NULL,
912 .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EAX, },
913 .tcg_features = TCG_KVM_FEATURES,
915 [FEAT_KVM_HINTS] = {
916 .type = CPUID_FEATURE_WORD,
917 .feat_names = {
918 "kvm-hint-dedicated", NULL, NULL, NULL,
919 NULL, NULL, NULL, NULL,
920 NULL, NULL, NULL, NULL,
921 NULL, NULL, NULL, NULL,
922 NULL, NULL, NULL, NULL,
923 NULL, NULL, NULL, NULL,
924 NULL, NULL, NULL, NULL,
925 NULL, NULL, NULL, NULL,
927 .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EDX, },
928 .tcg_features = TCG_KVM_FEATURES,
930 * KVM hints aren't auto-enabled by -cpu host, they need to be
931 * explicitly enabled in the command-line.
933 .no_autoenable_flags = ~0U,
936 * .feat_names are commented out for Hyper-V enlightenments because we
937 * don't want to have two different ways for enabling them on QEMU command
938 * line. Some features (e.g. "hyperv_time", "hyperv_vapic", ...) require
939 * enabling several feature bits simultaneously, exposing these bits
940 * individually may just confuse guests.
942 [FEAT_HYPERV_EAX] = {
943 .type = CPUID_FEATURE_WORD,
944 .feat_names = {
945 NULL /* hv_msr_vp_runtime_access */, NULL /* hv_msr_time_refcount_access */,
946 NULL /* hv_msr_synic_access */, NULL /* hv_msr_stimer_access */,
947 NULL /* hv_msr_apic_access */, NULL /* hv_msr_hypercall_access */,
948 NULL /* hv_vpindex_access */, NULL /* hv_msr_reset_access */,
949 NULL /* hv_msr_stats_access */, NULL /* hv_reftsc_access */,
950 NULL /* hv_msr_idle_access */, NULL /* hv_msr_frequency_access */,
951 NULL /* hv_msr_debug_access */, NULL /* hv_msr_reenlightenment_access */,
952 NULL, NULL,
953 NULL, NULL, NULL, NULL,
954 NULL, NULL, NULL, NULL,
955 NULL, NULL, NULL, NULL,
956 NULL, NULL, NULL, NULL,
958 .cpuid = { .eax = 0x40000003, .reg = R_EAX, },
960 [FEAT_HYPERV_EBX] = {
961 .type = CPUID_FEATURE_WORD,
962 .feat_names = {
963 NULL /* hv_create_partitions */, NULL /* hv_access_partition_id */,
964 NULL /* hv_access_memory_pool */, NULL /* hv_adjust_message_buffers */,
965 NULL /* hv_post_messages */, NULL /* hv_signal_events */,
966 NULL /* hv_create_port */, NULL /* hv_connect_port */,
967 NULL /* hv_access_stats */, NULL, NULL, NULL /* hv_debugging */,
968 NULL /* hv_cpu_power_management */, NULL /* hv_configure_profiler */,
969 NULL, NULL,
970 NULL, NULL, NULL, NULL,
971 NULL, NULL, NULL, NULL,
972 NULL, NULL, NULL, NULL,
973 NULL, NULL, NULL, NULL,
975 .cpuid = { .eax = 0x40000003, .reg = R_EBX, },
977 [FEAT_HYPERV_EDX] = {
978 .type = CPUID_FEATURE_WORD,
979 .feat_names = {
980 NULL /* hv_mwait */, NULL /* hv_guest_debugging */,
981 NULL /* hv_perf_monitor */, NULL /* hv_cpu_dynamic_part */,
982 NULL /* hv_hypercall_params_xmm */, NULL /* hv_guest_idle_state */,
983 NULL, NULL,
984 NULL, NULL, NULL /* hv_guest_crash_msr */, NULL,
985 NULL, NULL, NULL, NULL,
986 NULL, NULL, NULL, NULL,
987 NULL, NULL, NULL, NULL,
988 NULL, NULL, NULL, NULL,
989 NULL, NULL, NULL, NULL,
991 .cpuid = { .eax = 0x40000003, .reg = R_EDX, },
993 [FEAT_HV_RECOMM_EAX] = {
994 .type = CPUID_FEATURE_WORD,
995 .feat_names = {
996 NULL /* hv_recommend_pv_as_switch */,
997 NULL /* hv_recommend_pv_tlbflush_local */,
998 NULL /* hv_recommend_pv_tlbflush_remote */,
999 NULL /* hv_recommend_msr_apic_access */,
1000 NULL /* hv_recommend_msr_reset */,
1001 NULL /* hv_recommend_relaxed_timing */,
1002 NULL /* hv_recommend_dma_remapping */,
1003 NULL /* hv_recommend_int_remapping */,
1004 NULL /* hv_recommend_x2apic_msrs */,
1005 NULL /* hv_recommend_autoeoi_deprecation */,
1006 NULL /* hv_recommend_pv_ipi */,
1007 NULL /* hv_recommend_ex_hypercalls */,
1008 NULL /* hv_hypervisor_is_nested */,
1009 NULL /* hv_recommend_int_mbec */,
1010 NULL /* hv_recommend_evmcs */,
1011 NULL,
1012 NULL, NULL, NULL, NULL,
1013 NULL, NULL, NULL, NULL,
1014 NULL, NULL, NULL, NULL,
1015 NULL, NULL, NULL, NULL,
1017 .cpuid = { .eax = 0x40000004, .reg = R_EAX, },
1019 [FEAT_HV_NESTED_EAX] = {
1020 .type = CPUID_FEATURE_WORD,
1021 .cpuid = { .eax = 0x4000000A, .reg = R_EAX, },
1023 [FEAT_SVM] = {
1024 .type = CPUID_FEATURE_WORD,
1025 .feat_names = {
1026 "npt", "lbrv", "svm-lock", "nrip-save",
1027 "tsc-scale", "vmcb-clean", "flushbyasid", "decodeassists",
1028 NULL, NULL, "pause-filter", NULL,
1029 "pfthreshold", NULL, NULL, NULL,
1030 NULL, NULL, NULL, NULL,
1031 NULL, NULL, NULL, NULL,
1032 NULL, NULL, NULL, NULL,
1033 NULL, NULL, NULL, NULL,
1035 .cpuid = { .eax = 0x8000000A, .reg = R_EDX, },
1036 .tcg_features = TCG_SVM_FEATURES,
1038 [FEAT_7_0_EBX] = {
1039 .type = CPUID_FEATURE_WORD,
1040 .feat_names = {
1041 "fsgsbase", "tsc-adjust", NULL, "bmi1",
1042 "hle", "avx2", NULL, "smep",
1043 "bmi2", "erms", "invpcid", "rtm",
1044 NULL, NULL, "mpx", NULL,
1045 "avx512f", "avx512dq", "rdseed", "adx",
1046 "smap", "avx512ifma", "pcommit", "clflushopt",
1047 "clwb", "intel-pt", "avx512pf", "avx512er",
1048 "avx512cd", "sha-ni", "avx512bw", "avx512vl",
1050 .cpuid = {
1051 .eax = 7,
1052 .needs_ecx = true, .ecx = 0,
1053 .reg = R_EBX,
1055 .tcg_features = TCG_7_0_EBX_FEATURES,
1057 [FEAT_7_0_ECX] = {
1058 .type = CPUID_FEATURE_WORD,
1059 .feat_names = {
1060 NULL, "avx512vbmi", "umip", "pku",
1061 NULL /* ospke */, "waitpkg", "avx512vbmi2", NULL,
1062 "gfni", "vaes", "vpclmulqdq", "avx512vnni",
1063 "avx512bitalg", NULL, "avx512-vpopcntdq", NULL,
1064 "la57", NULL, NULL, NULL,
1065 NULL, NULL, "rdpid", NULL,
1066 NULL, "cldemote", NULL, "movdiri",
1067 "movdir64b", NULL, NULL, NULL,
1069 .cpuid = {
1070 .eax = 7,
1071 .needs_ecx = true, .ecx = 0,
1072 .reg = R_ECX,
1074 .tcg_features = TCG_7_0_ECX_FEATURES,
1076 [FEAT_7_0_EDX] = {
1077 .type = CPUID_FEATURE_WORD,
1078 .feat_names = {
1079 NULL, NULL, "avx512-4vnniw", "avx512-4fmaps",
1080 NULL, NULL, NULL, NULL,
1081 NULL, NULL, "md-clear", NULL,
1082 NULL, NULL, NULL, NULL,
1083 NULL, NULL, NULL /* pconfig */, NULL,
1084 NULL, NULL, NULL, NULL,
1085 NULL, NULL, "spec-ctrl", "stibp",
1086 NULL, "arch-capabilities", "core-capability", "ssbd",
1088 .cpuid = {
1089 .eax = 7,
1090 .needs_ecx = true, .ecx = 0,
1091 .reg = R_EDX,
1093 .tcg_features = TCG_7_0_EDX_FEATURES,
1095 [FEAT_7_1_EAX] = {
1096 .type = CPUID_FEATURE_WORD,
1097 .feat_names = {
1098 NULL, NULL, NULL, NULL,
1099 NULL, "avx512-bf16", NULL, NULL,
1100 NULL, NULL, NULL, NULL,
1101 NULL, NULL, NULL, NULL,
1102 NULL, NULL, NULL, NULL,
1103 NULL, NULL, NULL, NULL,
1104 NULL, NULL, NULL, NULL,
1105 NULL, NULL, NULL, NULL,
1107 .cpuid = {
1108 .eax = 7,
1109 .needs_ecx = true, .ecx = 1,
1110 .reg = R_EAX,
1112 .tcg_features = TCG_7_1_EAX_FEATURES,
1114 [FEAT_8000_0007_EDX] = {
1115 .type = CPUID_FEATURE_WORD,
1116 .feat_names = {
1117 NULL, NULL, NULL, NULL,
1118 NULL, NULL, NULL, NULL,
1119 "invtsc", NULL, NULL, NULL,
1120 NULL, NULL, NULL, NULL,
1121 NULL, NULL, NULL, NULL,
1122 NULL, NULL, NULL, NULL,
1123 NULL, NULL, NULL, NULL,
1124 NULL, NULL, NULL, NULL,
1126 .cpuid = { .eax = 0x80000007, .reg = R_EDX, },
1127 .tcg_features = TCG_APM_FEATURES,
1128 .unmigratable_flags = CPUID_APM_INVTSC,
1130 [FEAT_8000_0008_EBX] = {
1131 .type = CPUID_FEATURE_WORD,
1132 .feat_names = {
1133 "clzero", NULL, "xsaveerptr", NULL,
1134 NULL, NULL, NULL, NULL,
1135 NULL, "wbnoinvd", NULL, NULL,
1136 "ibpb", NULL, NULL, NULL,
1137 NULL, NULL, NULL, NULL,
1138 NULL, NULL, NULL, NULL,
1139 "amd-ssbd", "virt-ssbd", "amd-no-ssb", NULL,
1140 NULL, NULL, NULL, NULL,
1142 .cpuid = { .eax = 0x80000008, .reg = R_EBX, },
1143 .tcg_features = 0,
1144 .unmigratable_flags = 0,
1146 [FEAT_XSAVE] = {
1147 .type = CPUID_FEATURE_WORD,
1148 .feat_names = {
1149 "xsaveopt", "xsavec", "xgetbv1", "xsaves",
1150 NULL, NULL, NULL, NULL,
1151 NULL, NULL, NULL, NULL,
1152 NULL, NULL, NULL, NULL,
1153 NULL, NULL, NULL, NULL,
1154 NULL, NULL, NULL, NULL,
1155 NULL, NULL, NULL, NULL,
1156 NULL, NULL, NULL, NULL,
1158 .cpuid = {
1159 .eax = 0xd,
1160 .needs_ecx = true, .ecx = 1,
1161 .reg = R_EAX,
1163 .tcg_features = TCG_XSAVE_FEATURES,
1165 [FEAT_6_EAX] = {
1166 .type = CPUID_FEATURE_WORD,
1167 .feat_names = {
1168 NULL, NULL, "arat", NULL,
1169 NULL, NULL, NULL, NULL,
1170 NULL, NULL, NULL, NULL,
1171 NULL, NULL, NULL, NULL,
1172 NULL, NULL, NULL, NULL,
1173 NULL, NULL, NULL, NULL,
1174 NULL, NULL, NULL, NULL,
1175 NULL, NULL, NULL, NULL,
1177 .cpuid = { .eax = 6, .reg = R_EAX, },
1178 .tcg_features = TCG_6_EAX_FEATURES,
1180 [FEAT_XSAVE_COMP_LO] = {
1181 .type = CPUID_FEATURE_WORD,
1182 .cpuid = {
1183 .eax = 0xD,
1184 .needs_ecx = true, .ecx = 0,
1185 .reg = R_EAX,
1187 .tcg_features = ~0U,
1188 .migratable_flags = XSTATE_FP_MASK | XSTATE_SSE_MASK |
1189 XSTATE_YMM_MASK | XSTATE_BNDREGS_MASK | XSTATE_BNDCSR_MASK |
1190 XSTATE_OPMASK_MASK | XSTATE_ZMM_Hi256_MASK | XSTATE_Hi16_ZMM_MASK |
1191 XSTATE_PKRU_MASK,
1193 [FEAT_XSAVE_COMP_HI] = {
1194 .type = CPUID_FEATURE_WORD,
1195 .cpuid = {
1196 .eax = 0xD,
1197 .needs_ecx = true, .ecx = 0,
1198 .reg = R_EDX,
1200 .tcg_features = ~0U,
1202 /*Below are MSR exposed features*/
1203 [FEAT_ARCH_CAPABILITIES] = {
1204 .type = MSR_FEATURE_WORD,
1205 .feat_names = {
1206 "rdctl-no", "ibrs-all", "rsba", "skip-l1dfl-vmentry",
1207 "ssb-no", "mds-no", NULL, NULL,
1208 NULL, NULL, NULL, NULL,
1209 NULL, NULL, NULL, NULL,
1210 NULL, NULL, NULL, NULL,
1211 NULL, NULL, NULL, NULL,
1212 NULL, NULL, NULL, NULL,
1213 NULL, NULL, NULL, NULL,
1215 .msr = {
1216 .index = MSR_IA32_ARCH_CAPABILITIES,
1219 [FEAT_CORE_CAPABILITY] = {
1220 .type = MSR_FEATURE_WORD,
1221 .feat_names = {
1222 NULL, NULL, NULL, NULL,
1223 NULL, "split-lock-detect", NULL, NULL,
1224 NULL, NULL, NULL, NULL,
1225 NULL, NULL, NULL, NULL,
1226 NULL, NULL, NULL, NULL,
1227 NULL, NULL, NULL, NULL,
1228 NULL, NULL, NULL, NULL,
1229 NULL, NULL, NULL, NULL,
1231 .msr = {
1232 .index = MSR_IA32_CORE_CAPABILITY,
1236 [FEAT_VMX_PROCBASED_CTLS] = {
1237 .type = MSR_FEATURE_WORD,
1238 .feat_names = {
1239 NULL, NULL, "vmx-vintr-pending", "vmx-tsc-offset",
1240 NULL, NULL, NULL, "vmx-hlt-exit",
1241 NULL, "vmx-invlpg-exit", "vmx-mwait-exit", "vmx-rdpmc-exit",
1242 "vmx-rdtsc-exit", NULL, NULL, "vmx-cr3-load-noexit",
1243 "vmx-cr3-store-noexit", NULL, NULL, "vmx-cr8-load-exit",
1244 "vmx-cr8-store-exit", "vmx-flexpriority", "vmx-vnmi-pending", "vmx-movdr-exit",
1245 "vmx-io-exit", "vmx-io-bitmap", NULL, "vmx-mtf",
1246 "vmx-msr-bitmap", "vmx-monitor-exit", "vmx-pause-exit", "vmx-secondary-ctls",
1248 .msr = {
1249 .index = MSR_IA32_VMX_TRUE_PROCBASED_CTLS,
1253 [FEAT_VMX_SECONDARY_CTLS] = {
1254 .type = MSR_FEATURE_WORD,
1255 .feat_names = {
1256 "vmx-apicv-xapic", "vmx-ept", "vmx-desc-exit", "vmx-rdtscp-exit",
1257 "vmx-apicv-x2apic", "vmx-vpid", "vmx-wbinvd-exit", "vmx-unrestricted-guest",
1258 "vmx-apicv-register", "vmx-apicv-vid", "vmx-ple", "vmx-rdrand-exit",
1259 "vmx-invpcid-exit", "vmx-vmfunc", "vmx-shadow-vmcs", "vmx-encls-exit",
1260 "vmx-rdseed-exit", "vmx-pml", NULL, NULL,
1261 "vmx-xsaves", NULL, NULL, NULL,
1262 NULL, NULL, NULL, NULL,
1263 NULL, NULL, NULL, NULL,
1265 .msr = {
1266 .index = MSR_IA32_VMX_PROCBASED_CTLS2,
1270 [FEAT_VMX_PINBASED_CTLS] = {
1271 .type = MSR_FEATURE_WORD,
1272 .feat_names = {
1273 "vmx-intr-exit", NULL, NULL, "vmx-nmi-exit",
1274 NULL, "vmx-vnmi", "vmx-preemption-timer", "vmx-posted-intr",
1275 NULL, NULL, NULL, NULL,
1276 NULL, NULL, NULL, NULL,
1277 NULL, NULL, NULL, NULL,
1278 NULL, NULL, NULL, NULL,
1279 NULL, NULL, NULL, NULL,
1280 NULL, NULL, NULL, NULL,
1282 .msr = {
1283 .index = MSR_IA32_VMX_TRUE_PINBASED_CTLS,
1287 [FEAT_VMX_EXIT_CTLS] = {
1288 .type = MSR_FEATURE_WORD,
1290 * VMX_VM_EXIT_HOST_ADDR_SPACE_SIZE is copied from
1291 * the LM CPUID bit.
1293 .feat_names = {
1294 NULL, NULL, "vmx-exit-nosave-debugctl", NULL,
1295 NULL, NULL, NULL, NULL,
1296 NULL, NULL /* vmx-exit-host-addr-space-size */, NULL, NULL,
1297 "vmx-exit-load-perf-global-ctrl", NULL, NULL, "vmx-exit-ack-intr",
1298 NULL, NULL, "vmx-exit-save-pat", "vmx-exit-load-pat",
1299 "vmx-exit-save-efer", "vmx-exit-load-efer",
1300 "vmx-exit-save-preemption-timer", "vmx-exit-clear-bndcfgs",
1301 NULL, "vmx-exit-clear-rtit-ctl", NULL, NULL,
1302 NULL, NULL, NULL, NULL,
1304 .msr = {
1305 .index = MSR_IA32_VMX_TRUE_EXIT_CTLS,
1309 [FEAT_VMX_ENTRY_CTLS] = {
1310 .type = MSR_FEATURE_WORD,
1311 .feat_names = {
1312 NULL, NULL, "vmx-entry-noload-debugctl", NULL,
1313 NULL, NULL, NULL, NULL,
1314 NULL, "vmx-entry-ia32e-mode", NULL, NULL,
1315 NULL, "vmx-entry-load-perf-global-ctrl", "vmx-entry-load-pat", "vmx-entry-load-efer",
1316 "vmx-entry-load-bndcfgs", NULL, "vmx-entry-load-rtit-ctl", NULL,
1317 NULL, NULL, NULL, NULL,
1318 NULL, NULL, NULL, NULL,
1319 NULL, NULL, NULL, NULL,
1321 .msr = {
1322 .index = MSR_IA32_VMX_TRUE_ENTRY_CTLS,
1326 [FEAT_VMX_MISC] = {
1327 .type = MSR_FEATURE_WORD,
1328 .feat_names = {
1329 NULL, NULL, NULL, NULL,
1330 NULL, "vmx-store-lma", "vmx-activity-hlt", "vmx-activity-shutdown",
1331 "vmx-activity-wait-sipi", NULL, NULL, NULL,
1332 NULL, NULL, NULL, NULL,
1333 NULL, NULL, NULL, NULL,
1334 NULL, NULL, NULL, NULL,
1335 NULL, NULL, NULL, NULL,
1336 NULL, "vmx-vmwrite-vmexit-fields", "vmx-zero-len-inject", NULL,
1338 .msr = {
1339 .index = MSR_IA32_VMX_MISC,
1343 [FEAT_VMX_EPT_VPID_CAPS] = {
1344 .type = MSR_FEATURE_WORD,
1345 .feat_names = {
1346 "vmx-ept-execonly", NULL, NULL, NULL,
1347 NULL, NULL, "vmx-page-walk-4", "vmx-page-walk-5",
1348 NULL, NULL, NULL, NULL,
1349 NULL, NULL, NULL, NULL,
1350 "vmx-ept-2mb", "vmx-ept-1gb", NULL, NULL,
1351 "vmx-invept", "vmx-eptad", "vmx-ept-advanced-exitinfo", NULL,
1352 NULL, "vmx-invept-single-context", "vmx-invept-all-context", NULL,
1353 NULL, NULL, NULL, NULL,
1354 "vmx-invvpid", NULL, NULL, NULL,
1355 NULL, NULL, NULL, NULL,
1356 "vmx-invvpid-single-addr", "vmx-invept-single-context",
1357 "vmx-invvpid-all-context", "vmx-invept-single-context-noglobals",
1358 NULL, NULL, NULL, NULL,
1359 NULL, NULL, NULL, NULL,
1360 NULL, NULL, NULL, NULL,
1361 NULL, NULL, NULL, NULL,
1362 NULL, NULL, NULL, NULL,
1364 .msr = {
1365 .index = MSR_IA32_VMX_EPT_VPID_CAP,
1369 [FEAT_VMX_BASIC] = {
1370 .type = MSR_FEATURE_WORD,
1371 .feat_names = {
1372 [54] = "vmx-ins-outs",
1373 [55] = "vmx-true-ctls",
1375 .msr = {
1376 .index = MSR_IA32_VMX_BASIC,
1378 /* Just to be safe - we don't support setting the MSEG version field. */
1379 .no_autoenable_flags = MSR_VMX_BASIC_DUAL_MONITOR,
1382 [FEAT_VMX_VMFUNC] = {
1383 .type = MSR_FEATURE_WORD,
1384 .feat_names = {
1385 [0] = "vmx-eptp-switching",
1387 .msr = {
1388 .index = MSR_IA32_VMX_VMFUNC,
1394 typedef struct FeatureMask {
1395 FeatureWord index;
1396 uint64_t mask;
1397 } FeatureMask;
1399 typedef struct FeatureDep {
1400 FeatureMask from, to;
1401 } FeatureDep;
1403 static FeatureDep feature_dependencies[] = {
1405 .from = { FEAT_7_0_EDX, CPUID_7_0_EDX_ARCH_CAPABILITIES },
1406 .to = { FEAT_ARCH_CAPABILITIES, ~0ull },
1409 .from = { FEAT_7_0_EDX, CPUID_7_0_EDX_CORE_CAPABILITY },
1410 .to = { FEAT_CORE_CAPABILITY, ~0ull },
1413 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1414 .to = { FEAT_VMX_PROCBASED_CTLS, ~0ull },
1417 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1418 .to = { FEAT_VMX_PINBASED_CTLS, ~0ull },
1421 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1422 .to = { FEAT_VMX_EXIT_CTLS, ~0ull },
1425 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1426 .to = { FEAT_VMX_ENTRY_CTLS, ~0ull },
1429 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1430 .to = { FEAT_VMX_MISC, ~0ull },
1433 .from = { FEAT_1_ECX, CPUID_EXT_VMX },
1434 .to = { FEAT_VMX_BASIC, ~0ull },
1437 .from = { FEAT_8000_0001_EDX, CPUID_EXT2_LM },
1438 .to = { FEAT_VMX_ENTRY_CTLS, VMX_VM_ENTRY_IA32E_MODE },
1441 .from = { FEAT_VMX_PROCBASED_CTLS, VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS },
1442 .to = { FEAT_VMX_SECONDARY_CTLS, ~0ull },
1445 .from = { FEAT_XSAVE, CPUID_XSAVE_XSAVES },
1446 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_XSAVES },
1449 .from = { FEAT_1_ECX, CPUID_EXT_RDRAND },
1450 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDRAND_EXITING },
1453 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_INVPCID },
1454 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_INVPCID },
1457 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_RDSEED },
1458 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDSEED_EXITING },
1461 .from = { FEAT_8000_0001_EDX, CPUID_EXT2_RDTSCP },
1462 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDTSCP },
1465 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_EPT },
1466 .to = { FEAT_VMX_EPT_VPID_CAPS, 0xffffffffull },
1469 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_EPT },
1470 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST },
1473 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_VPID },
1474 .to = { FEAT_VMX_EPT_VPID_CAPS, 0xffffffffull << 32 },
1477 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_VMFUNC },
1478 .to = { FEAT_VMX_VMFUNC, ~0ull },
1482 typedef struct X86RegisterInfo32 {
1483 /* Name of register */
1484 const char *name;
1485 /* QAPI enum value register */
1486 X86CPURegister32 qapi_enum;
1487 } X86RegisterInfo32;
1489 #define REGISTER(reg) \
1490 [R_##reg] = { .name = #reg, .qapi_enum = X86_CPU_REGISTER32_##reg }
1491 static const X86RegisterInfo32 x86_reg_info_32[CPU_NB_REGS32] = {
1492 REGISTER(EAX),
1493 REGISTER(ECX),
1494 REGISTER(EDX),
1495 REGISTER(EBX),
1496 REGISTER(ESP),
1497 REGISTER(EBP),
1498 REGISTER(ESI),
1499 REGISTER(EDI),
1501 #undef REGISTER
1503 typedef struct ExtSaveArea {
1504 uint32_t feature, bits;
1505 uint32_t offset, size;
1506 } ExtSaveArea;
1508 static const ExtSaveArea x86_ext_save_areas[] = {
1509 [XSTATE_FP_BIT] = {
1510 /* x87 FP state component is always enabled if XSAVE is supported */
1511 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
1512 /* x87 state is in the legacy region of the XSAVE area */
1513 .offset = 0,
1514 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1516 [XSTATE_SSE_BIT] = {
1517 /* SSE state component is always enabled if XSAVE is supported */
1518 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
1519 /* SSE state is in the legacy region of the XSAVE area */
1520 .offset = 0,
1521 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1523 [XSTATE_YMM_BIT] =
1524 { .feature = FEAT_1_ECX, .bits = CPUID_EXT_AVX,
1525 .offset = offsetof(X86XSaveArea, avx_state),
1526 .size = sizeof(XSaveAVX) },
1527 [XSTATE_BNDREGS_BIT] =
1528 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
1529 .offset = offsetof(X86XSaveArea, bndreg_state),
1530 .size = sizeof(XSaveBNDREG) },
1531 [XSTATE_BNDCSR_BIT] =
1532 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
1533 .offset = offsetof(X86XSaveArea, bndcsr_state),
1534 .size = sizeof(XSaveBNDCSR) },
1535 [XSTATE_OPMASK_BIT] =
1536 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1537 .offset = offsetof(X86XSaveArea, opmask_state),
1538 .size = sizeof(XSaveOpmask) },
1539 [XSTATE_ZMM_Hi256_BIT] =
1540 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1541 .offset = offsetof(X86XSaveArea, zmm_hi256_state),
1542 .size = sizeof(XSaveZMM_Hi256) },
1543 [XSTATE_Hi16_ZMM_BIT] =
1544 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1545 .offset = offsetof(X86XSaveArea, hi16_zmm_state),
1546 .size = sizeof(XSaveHi16_ZMM) },
1547 [XSTATE_PKRU_BIT] =
1548 { .feature = FEAT_7_0_ECX, .bits = CPUID_7_0_ECX_PKU,
1549 .offset = offsetof(X86XSaveArea, pkru_state),
1550 .size = sizeof(XSavePKRU) },
1553 static uint32_t xsave_area_size(uint64_t mask)
1555 int i;
1556 uint64_t ret = 0;
1558 for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
1559 const ExtSaveArea *esa = &x86_ext_save_areas[i];
1560 if ((mask >> i) & 1) {
1561 ret = MAX(ret, esa->offset + esa->size);
1564 return ret;
1567 static inline bool accel_uses_host_cpuid(void)
1569 return kvm_enabled() || hvf_enabled();
1572 static inline uint64_t x86_cpu_xsave_components(X86CPU *cpu)
1574 return ((uint64_t)cpu->env.features[FEAT_XSAVE_COMP_HI]) << 32 |
1575 cpu->env.features[FEAT_XSAVE_COMP_LO];
1578 const char *get_register_name_32(unsigned int reg)
1580 if (reg >= CPU_NB_REGS32) {
1581 return NULL;
1583 return x86_reg_info_32[reg].name;
1587 * Returns the set of feature flags that are supported and migratable by
1588 * QEMU, for a given FeatureWord.
1590 static uint64_t x86_cpu_get_migratable_flags(FeatureWord w)
1592 FeatureWordInfo *wi = &feature_word_info[w];
1593 uint64_t r = 0;
1594 int i;
1596 for (i = 0; i < 64; i++) {
1597 uint64_t f = 1ULL << i;
1599 /* If the feature name is known, it is implicitly considered migratable,
1600 * unless it is explicitly set in unmigratable_flags */
1601 if ((wi->migratable_flags & f) ||
1602 (wi->feat_names[i] && !(wi->unmigratable_flags & f))) {
1603 r |= f;
1606 return r;
1609 void host_cpuid(uint32_t function, uint32_t count,
1610 uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
1612 uint32_t vec[4];
1614 #ifdef __x86_64__
1615 asm volatile("cpuid"
1616 : "=a"(vec[0]), "=b"(vec[1]),
1617 "=c"(vec[2]), "=d"(vec[3])
1618 : "0"(function), "c"(count) : "cc");
1619 #elif defined(__i386__)
1620 asm volatile("pusha \n\t"
1621 "cpuid \n\t"
1622 "mov %%eax, 0(%2) \n\t"
1623 "mov %%ebx, 4(%2) \n\t"
1624 "mov %%ecx, 8(%2) \n\t"
1625 "mov %%edx, 12(%2) \n\t"
1626 "popa"
1627 : : "a"(function), "c"(count), "S"(vec)
1628 : "memory", "cc");
1629 #else
1630 abort();
1631 #endif
1633 if (eax)
1634 *eax = vec[0];
1635 if (ebx)
1636 *ebx = vec[1];
1637 if (ecx)
1638 *ecx = vec[2];
1639 if (edx)
1640 *edx = vec[3];
1643 void host_vendor_fms(char *vendor, int *family, int *model, int *stepping)
1645 uint32_t eax, ebx, ecx, edx;
1647 host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx);
1648 x86_cpu_vendor_words2str(vendor, ebx, edx, ecx);
1650 host_cpuid(0x1, 0, &eax, &ebx, &ecx, &edx);
1651 if (family) {
1652 *family = ((eax >> 8) & 0x0F) + ((eax >> 20) & 0xFF);
1654 if (model) {
1655 *model = ((eax >> 4) & 0x0F) | ((eax & 0xF0000) >> 12);
1657 if (stepping) {
1658 *stepping = eax & 0x0F;
1662 /* CPU class name definitions: */
1664 /* Return type name for a given CPU model name
1665 * Caller is responsible for freeing the returned string.
1667 static char *x86_cpu_type_name(const char *model_name)
1669 return g_strdup_printf(X86_CPU_TYPE_NAME("%s"), model_name);
1672 static ObjectClass *x86_cpu_class_by_name(const char *cpu_model)
1674 ObjectClass *oc;
1675 char *typename = x86_cpu_type_name(cpu_model);
1676 oc = object_class_by_name(typename);
1677 g_free(typename);
1678 return oc;
1681 static char *x86_cpu_class_get_model_name(X86CPUClass *cc)
1683 const char *class_name = object_class_get_name(OBJECT_CLASS(cc));
1684 assert(g_str_has_suffix(class_name, X86_CPU_TYPE_SUFFIX));
1685 return g_strndup(class_name,
1686 strlen(class_name) - strlen(X86_CPU_TYPE_SUFFIX));
1689 typedef struct PropValue {
1690 const char *prop, *value;
1691 } PropValue;
1693 typedef struct X86CPUVersionDefinition {
1694 X86CPUVersion version;
1695 const char *alias;
1696 PropValue *props;
1697 } X86CPUVersionDefinition;
1699 /* Base definition for a CPU model */
1700 typedef struct X86CPUDefinition {
1701 const char *name;
1702 uint32_t level;
1703 uint32_t xlevel;
1704 /* vendor is zero-terminated, 12 character ASCII string */
1705 char vendor[CPUID_VENDOR_SZ + 1];
1706 int family;
1707 int model;
1708 int stepping;
1709 FeatureWordArray features;
1710 const char *model_id;
1711 CPUCaches *cache_info;
1713 * Definitions for alternative versions of CPU model.
1714 * List is terminated by item with version == 0.
1715 * If NULL, version 1 will be registered automatically.
1717 const X86CPUVersionDefinition *versions;
1718 } X86CPUDefinition;
1720 /* Reference to a specific CPU model version */
1721 struct X86CPUModel {
1722 /* Base CPU definition */
1723 X86CPUDefinition *cpudef;
1724 /* CPU model version */
1725 X86CPUVersion version;
1727 * If true, this is an alias CPU model.
1728 * This matters only for "-cpu help" and query-cpu-definitions
1730 bool is_alias;
1733 /* Get full model name for CPU version */
1734 static char *x86_cpu_versioned_model_name(X86CPUDefinition *cpudef,
1735 X86CPUVersion version)
1737 assert(version > 0);
1738 return g_strdup_printf("%s-v%d", cpudef->name, (int)version);
1741 static const X86CPUVersionDefinition *x86_cpu_def_get_versions(X86CPUDefinition *def)
1743 /* When X86CPUDefinition::versions is NULL, we register only v1 */
1744 static const X86CPUVersionDefinition default_version_list[] = {
1745 { 1 },
1746 { /* end of list */ }
1749 return def->versions ?: default_version_list;
1752 static CPUCaches epyc_cache_info = {
1753 .l1d_cache = &(CPUCacheInfo) {
1754 .type = DATA_CACHE,
1755 .level = 1,
1756 .size = 32 * KiB,
1757 .line_size = 64,
1758 .associativity = 8,
1759 .partitions = 1,
1760 .sets = 64,
1761 .lines_per_tag = 1,
1762 .self_init = 1,
1763 .no_invd_sharing = true,
1765 .l1i_cache = &(CPUCacheInfo) {
1766 .type = INSTRUCTION_CACHE,
1767 .level = 1,
1768 .size = 64 * KiB,
1769 .line_size = 64,
1770 .associativity = 4,
1771 .partitions = 1,
1772 .sets = 256,
1773 .lines_per_tag = 1,
1774 .self_init = 1,
1775 .no_invd_sharing = true,
1777 .l2_cache = &(CPUCacheInfo) {
1778 .type = UNIFIED_CACHE,
1779 .level = 2,
1780 .size = 512 * KiB,
1781 .line_size = 64,
1782 .associativity = 8,
1783 .partitions = 1,
1784 .sets = 1024,
1785 .lines_per_tag = 1,
1787 .l3_cache = &(CPUCacheInfo) {
1788 .type = UNIFIED_CACHE,
1789 .level = 3,
1790 .size = 8 * MiB,
1791 .line_size = 64,
1792 .associativity = 16,
1793 .partitions = 1,
1794 .sets = 8192,
1795 .lines_per_tag = 1,
1796 .self_init = true,
1797 .inclusive = true,
1798 .complex_indexing = true,
1802 static X86CPUDefinition builtin_x86_defs[] = {
1804 .name = "qemu64",
1805 .level = 0xd,
1806 .vendor = CPUID_VENDOR_AMD,
1807 .family = 6,
1808 .model = 6,
1809 .stepping = 3,
1810 .features[FEAT_1_EDX] =
1811 PPRO_FEATURES |
1812 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1813 CPUID_PSE36,
1814 .features[FEAT_1_ECX] =
1815 CPUID_EXT_SSE3 | CPUID_EXT_CX16,
1816 .features[FEAT_8000_0001_EDX] =
1817 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1818 .features[FEAT_8000_0001_ECX] =
1819 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM,
1820 .xlevel = 0x8000000A,
1821 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
1824 .name = "phenom",
1825 .level = 5,
1826 .vendor = CPUID_VENDOR_AMD,
1827 .family = 16,
1828 .model = 2,
1829 .stepping = 3,
1830 /* Missing: CPUID_HT */
1831 .features[FEAT_1_EDX] =
1832 PPRO_FEATURES |
1833 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1834 CPUID_PSE36 | CPUID_VME,
1835 .features[FEAT_1_ECX] =
1836 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_CX16 |
1837 CPUID_EXT_POPCNT,
1838 .features[FEAT_8000_0001_EDX] =
1839 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX |
1840 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_MMXEXT |
1841 CPUID_EXT2_FFXSR | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP,
1842 /* Missing: CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
1843 CPUID_EXT3_CR8LEG,
1844 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
1845 CPUID_EXT3_OSVW, CPUID_EXT3_IBS */
1846 .features[FEAT_8000_0001_ECX] =
1847 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM |
1848 CPUID_EXT3_ABM | CPUID_EXT3_SSE4A,
1849 /* Missing: CPUID_SVM_LBRV */
1850 .features[FEAT_SVM] =
1851 CPUID_SVM_NPT,
1852 .xlevel = 0x8000001A,
1853 .model_id = "AMD Phenom(tm) 9550 Quad-Core Processor"
1856 .name = "core2duo",
1857 .level = 10,
1858 .vendor = CPUID_VENDOR_INTEL,
1859 .family = 6,
1860 .model = 15,
1861 .stepping = 11,
1862 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
1863 .features[FEAT_1_EDX] =
1864 PPRO_FEATURES |
1865 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1866 CPUID_PSE36 | CPUID_VME | CPUID_ACPI | CPUID_SS,
1867 /* Missing: CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_EST,
1868 * CPUID_EXT_TM2, CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_VMX */
1869 .features[FEAT_1_ECX] =
1870 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
1871 CPUID_EXT_CX16,
1872 .features[FEAT_8000_0001_EDX] =
1873 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1874 .features[FEAT_8000_0001_ECX] =
1875 CPUID_EXT3_LAHF_LM,
1876 .xlevel = 0x80000008,
1877 .model_id = "Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz",
1880 .name = "kvm64",
1881 .level = 0xd,
1882 .vendor = CPUID_VENDOR_INTEL,
1883 .family = 15,
1884 .model = 6,
1885 .stepping = 1,
1886 /* Missing: CPUID_HT */
1887 .features[FEAT_1_EDX] =
1888 PPRO_FEATURES | CPUID_VME |
1889 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1890 CPUID_PSE36,
1891 /* Missing: CPUID_EXT_POPCNT, CPUID_EXT_MONITOR */
1892 .features[FEAT_1_ECX] =
1893 CPUID_EXT_SSE3 | CPUID_EXT_CX16,
1894 /* Missing: CPUID_EXT2_PDPE1GB, CPUID_EXT2_RDTSCP */
1895 .features[FEAT_8000_0001_EDX] =
1896 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1897 /* Missing: CPUID_EXT3_LAHF_LM, CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
1898 CPUID_EXT3_CR8LEG, CPUID_EXT3_ABM, CPUID_EXT3_SSE4A,
1899 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
1900 CPUID_EXT3_OSVW, CPUID_EXT3_IBS, CPUID_EXT3_SVM */
1901 .features[FEAT_8000_0001_ECX] =
1903 .xlevel = 0x80000008,
1904 .model_id = "Common KVM processor"
1907 .name = "qemu32",
1908 .level = 4,
1909 .vendor = CPUID_VENDOR_INTEL,
1910 .family = 6,
1911 .model = 6,
1912 .stepping = 3,
1913 .features[FEAT_1_EDX] =
1914 PPRO_FEATURES,
1915 .features[FEAT_1_ECX] =
1916 CPUID_EXT_SSE3,
1917 .xlevel = 0x80000004,
1918 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
1921 .name = "kvm32",
1922 .level = 5,
1923 .vendor = CPUID_VENDOR_INTEL,
1924 .family = 15,
1925 .model = 6,
1926 .stepping = 1,
1927 .features[FEAT_1_EDX] =
1928 PPRO_FEATURES | CPUID_VME |
1929 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_PSE36,
1930 .features[FEAT_1_ECX] =
1931 CPUID_EXT_SSE3,
1932 .features[FEAT_8000_0001_ECX] =
1934 .xlevel = 0x80000008,
1935 .model_id = "Common 32-bit KVM processor"
1938 .name = "coreduo",
1939 .level = 10,
1940 .vendor = CPUID_VENDOR_INTEL,
1941 .family = 6,
1942 .model = 14,
1943 .stepping = 8,
1944 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
1945 .features[FEAT_1_EDX] =
1946 PPRO_FEATURES | CPUID_VME |
1947 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_ACPI |
1948 CPUID_SS,
1949 /* Missing: CPUID_EXT_EST, CPUID_EXT_TM2 , CPUID_EXT_XTPR,
1950 * CPUID_EXT_PDCM, CPUID_EXT_VMX */
1951 .features[FEAT_1_ECX] =
1952 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR,
1953 .features[FEAT_8000_0001_EDX] =
1954 CPUID_EXT2_NX,
1955 .xlevel = 0x80000008,
1956 .model_id = "Genuine Intel(R) CPU T2600 @ 2.16GHz",
1959 .name = "486",
1960 .level = 1,
1961 .vendor = CPUID_VENDOR_INTEL,
1962 .family = 4,
1963 .model = 8,
1964 .stepping = 0,
1965 .features[FEAT_1_EDX] =
1966 I486_FEATURES,
1967 .xlevel = 0,
1968 .model_id = "",
1971 .name = "pentium",
1972 .level = 1,
1973 .vendor = CPUID_VENDOR_INTEL,
1974 .family = 5,
1975 .model = 4,
1976 .stepping = 3,
1977 .features[FEAT_1_EDX] =
1978 PENTIUM_FEATURES,
1979 .xlevel = 0,
1980 .model_id = "",
1983 .name = "pentium2",
1984 .level = 2,
1985 .vendor = CPUID_VENDOR_INTEL,
1986 .family = 6,
1987 .model = 5,
1988 .stepping = 2,
1989 .features[FEAT_1_EDX] =
1990 PENTIUM2_FEATURES,
1991 .xlevel = 0,
1992 .model_id = "",
1995 .name = "pentium3",
1996 .level = 3,
1997 .vendor = CPUID_VENDOR_INTEL,
1998 .family = 6,
1999 .model = 7,
2000 .stepping = 3,
2001 .features[FEAT_1_EDX] =
2002 PENTIUM3_FEATURES,
2003 .xlevel = 0,
2004 .model_id = "",
2007 .name = "athlon",
2008 .level = 2,
2009 .vendor = CPUID_VENDOR_AMD,
2010 .family = 6,
2011 .model = 2,
2012 .stepping = 3,
2013 .features[FEAT_1_EDX] =
2014 PPRO_FEATURES | CPUID_PSE36 | CPUID_VME | CPUID_MTRR |
2015 CPUID_MCA,
2016 .features[FEAT_8000_0001_EDX] =
2017 CPUID_EXT2_MMXEXT | CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT,
2018 .xlevel = 0x80000008,
2019 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
2022 .name = "n270",
2023 .level = 10,
2024 .vendor = CPUID_VENDOR_INTEL,
2025 .family = 6,
2026 .model = 28,
2027 .stepping = 2,
2028 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
2029 .features[FEAT_1_EDX] =
2030 PPRO_FEATURES |
2031 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_VME |
2032 CPUID_ACPI | CPUID_SS,
2033 /* Some CPUs got no CPUID_SEP */
2034 /* Missing: CPUID_EXT_DSCPL, CPUID_EXT_EST, CPUID_EXT_TM2,
2035 * CPUID_EXT_XTPR */
2036 .features[FEAT_1_ECX] =
2037 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
2038 CPUID_EXT_MOVBE,
2039 .features[FEAT_8000_0001_EDX] =
2040 CPUID_EXT2_NX,
2041 .features[FEAT_8000_0001_ECX] =
2042 CPUID_EXT3_LAHF_LM,
2043 .xlevel = 0x80000008,
2044 .model_id = "Intel(R) Atom(TM) CPU N270 @ 1.60GHz",
2047 .name = "Conroe",
2048 .level = 10,
2049 .vendor = CPUID_VENDOR_INTEL,
2050 .family = 6,
2051 .model = 15,
2052 .stepping = 3,
2053 .features[FEAT_1_EDX] =
2054 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2055 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2056 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2057 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2058 CPUID_DE | CPUID_FP87,
2059 .features[FEAT_1_ECX] =
2060 CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
2061 .features[FEAT_8000_0001_EDX] =
2062 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2063 .features[FEAT_8000_0001_ECX] =
2064 CPUID_EXT3_LAHF_LM,
2065 .xlevel = 0x80000008,
2066 .model_id = "Intel Celeron_4x0 (Conroe/Merom Class Core 2)",
2069 .name = "Penryn",
2070 .level = 10,
2071 .vendor = CPUID_VENDOR_INTEL,
2072 .family = 6,
2073 .model = 23,
2074 .stepping = 3,
2075 .features[FEAT_1_EDX] =
2076 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2077 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2078 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2079 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2080 CPUID_DE | CPUID_FP87,
2081 .features[FEAT_1_ECX] =
2082 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2083 CPUID_EXT_SSE3,
2084 .features[FEAT_8000_0001_EDX] =
2085 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2086 .features[FEAT_8000_0001_ECX] =
2087 CPUID_EXT3_LAHF_LM,
2088 .xlevel = 0x80000008,
2089 .model_id = "Intel Core 2 Duo P9xxx (Penryn Class Core 2)",
2092 .name = "Nehalem",
2093 .level = 11,
2094 .vendor = CPUID_VENDOR_INTEL,
2095 .family = 6,
2096 .model = 26,
2097 .stepping = 3,
2098 .features[FEAT_1_EDX] =
2099 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2100 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2101 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2102 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2103 CPUID_DE | CPUID_FP87,
2104 .features[FEAT_1_ECX] =
2105 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2106 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
2107 .features[FEAT_8000_0001_EDX] =
2108 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2109 .features[FEAT_8000_0001_ECX] =
2110 CPUID_EXT3_LAHF_LM,
2111 .xlevel = 0x80000008,
2112 .model_id = "Intel Core i7 9xx (Nehalem Class Core i7)",
2113 .versions = (X86CPUVersionDefinition[]) {
2114 { .version = 1 },
2116 .version = 2,
2117 .alias = "Nehalem-IBRS",
2118 .props = (PropValue[]) {
2119 { "spec-ctrl", "on" },
2120 { "model-id",
2121 "Intel Core i7 9xx (Nehalem Core i7, IBRS update)" },
2122 { /* end of list */ }
2125 { /* end of list */ }
2129 .name = "Westmere",
2130 .level = 11,
2131 .vendor = CPUID_VENDOR_INTEL,
2132 .family = 6,
2133 .model = 44,
2134 .stepping = 1,
2135 .features[FEAT_1_EDX] =
2136 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2137 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2138 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2139 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2140 CPUID_DE | CPUID_FP87,
2141 .features[FEAT_1_ECX] =
2142 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
2143 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2144 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
2145 .features[FEAT_8000_0001_EDX] =
2146 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2147 .features[FEAT_8000_0001_ECX] =
2148 CPUID_EXT3_LAHF_LM,
2149 .features[FEAT_6_EAX] =
2150 CPUID_6_EAX_ARAT,
2151 .xlevel = 0x80000008,
2152 .model_id = "Westmere E56xx/L56xx/X56xx (Nehalem-C)",
2153 .versions = (X86CPUVersionDefinition[]) {
2154 { .version = 1 },
2156 .version = 2,
2157 .alias = "Westmere-IBRS",
2158 .props = (PropValue[]) {
2159 { "spec-ctrl", "on" },
2160 { "model-id",
2161 "Westmere E56xx/L56xx/X56xx (IBRS update)" },
2162 { /* end of list */ }
2165 { /* end of list */ }
2169 .name = "SandyBridge",
2170 .level = 0xd,
2171 .vendor = CPUID_VENDOR_INTEL,
2172 .family = 6,
2173 .model = 42,
2174 .stepping = 1,
2175 .features[FEAT_1_EDX] =
2176 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2177 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2178 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2179 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2180 CPUID_DE | CPUID_FP87,
2181 .features[FEAT_1_ECX] =
2182 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2183 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
2184 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2185 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
2186 CPUID_EXT_SSE3,
2187 .features[FEAT_8000_0001_EDX] =
2188 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2189 CPUID_EXT2_SYSCALL,
2190 .features[FEAT_8000_0001_ECX] =
2191 CPUID_EXT3_LAHF_LM,
2192 .features[FEAT_XSAVE] =
2193 CPUID_XSAVE_XSAVEOPT,
2194 .features[FEAT_6_EAX] =
2195 CPUID_6_EAX_ARAT,
2196 .xlevel = 0x80000008,
2197 .model_id = "Intel Xeon E312xx (Sandy Bridge)",
2198 .versions = (X86CPUVersionDefinition[]) {
2199 { .version = 1 },
2201 .version = 2,
2202 .alias = "SandyBridge-IBRS",
2203 .props = (PropValue[]) {
2204 { "spec-ctrl", "on" },
2205 { "model-id",
2206 "Intel Xeon E312xx (Sandy Bridge, IBRS update)" },
2207 { /* end of list */ }
2210 { /* end of list */ }
2214 .name = "IvyBridge",
2215 .level = 0xd,
2216 .vendor = CPUID_VENDOR_INTEL,
2217 .family = 6,
2218 .model = 58,
2219 .stepping = 9,
2220 .features[FEAT_1_EDX] =
2221 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2222 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2223 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2224 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2225 CPUID_DE | CPUID_FP87,
2226 .features[FEAT_1_ECX] =
2227 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2228 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
2229 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2230 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
2231 CPUID_EXT_SSE3 | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2232 .features[FEAT_7_0_EBX] =
2233 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP |
2234 CPUID_7_0_EBX_ERMS,
2235 .features[FEAT_8000_0001_EDX] =
2236 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2237 CPUID_EXT2_SYSCALL,
2238 .features[FEAT_8000_0001_ECX] =
2239 CPUID_EXT3_LAHF_LM,
2240 .features[FEAT_XSAVE] =
2241 CPUID_XSAVE_XSAVEOPT,
2242 .features[FEAT_6_EAX] =
2243 CPUID_6_EAX_ARAT,
2244 .xlevel = 0x80000008,
2245 .model_id = "Intel Xeon E3-12xx v2 (Ivy Bridge)",
2246 .versions = (X86CPUVersionDefinition[]) {
2247 { .version = 1 },
2249 .version = 2,
2250 .alias = "IvyBridge-IBRS",
2251 .props = (PropValue[]) {
2252 { "spec-ctrl", "on" },
2253 { "model-id",
2254 "Intel Xeon E3-12xx v2 (Ivy Bridge, IBRS)" },
2255 { /* end of list */ }
2258 { /* end of list */ }
2262 .name = "Haswell",
2263 .level = 0xd,
2264 .vendor = CPUID_VENDOR_INTEL,
2265 .family = 6,
2266 .model = 60,
2267 .stepping = 4,
2268 .features[FEAT_1_EDX] =
2269 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2270 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2271 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2272 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2273 CPUID_DE | CPUID_FP87,
2274 .features[FEAT_1_ECX] =
2275 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2276 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2277 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2278 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2279 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2280 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2281 .features[FEAT_8000_0001_EDX] =
2282 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2283 CPUID_EXT2_SYSCALL,
2284 .features[FEAT_8000_0001_ECX] =
2285 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
2286 .features[FEAT_7_0_EBX] =
2287 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2288 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2289 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2290 CPUID_7_0_EBX_RTM,
2291 .features[FEAT_XSAVE] =
2292 CPUID_XSAVE_XSAVEOPT,
2293 .features[FEAT_6_EAX] =
2294 CPUID_6_EAX_ARAT,
2295 .xlevel = 0x80000008,
2296 .model_id = "Intel Core Processor (Haswell)",
2297 .versions = (X86CPUVersionDefinition[]) {
2298 { .version = 1 },
2300 .version = 2,
2301 .alias = "Haswell-noTSX",
2302 .props = (PropValue[]) {
2303 { "hle", "off" },
2304 { "rtm", "off" },
2305 { "stepping", "1" },
2306 { "model-id", "Intel Core Processor (Haswell, no TSX)", },
2307 { /* end of list */ }
2311 .version = 3,
2312 .alias = "Haswell-IBRS",
2313 .props = (PropValue[]) {
2314 /* Restore TSX features removed by -v2 above */
2315 { "hle", "on" },
2316 { "rtm", "on" },
2318 * Haswell and Haswell-IBRS had stepping=4 in
2319 * QEMU 4.0 and older
2321 { "stepping", "4" },
2322 { "spec-ctrl", "on" },
2323 { "model-id",
2324 "Intel Core Processor (Haswell, IBRS)" },
2325 { /* end of list */ }
2329 .version = 4,
2330 .alias = "Haswell-noTSX-IBRS",
2331 .props = (PropValue[]) {
2332 { "hle", "off" },
2333 { "rtm", "off" },
2334 /* spec-ctrl was already enabled by -v3 above */
2335 { "stepping", "1" },
2336 { "model-id",
2337 "Intel Core Processor (Haswell, no TSX, IBRS)" },
2338 { /* end of list */ }
2341 { /* end of list */ }
2345 .name = "Broadwell",
2346 .level = 0xd,
2347 .vendor = CPUID_VENDOR_INTEL,
2348 .family = 6,
2349 .model = 61,
2350 .stepping = 2,
2351 .features[FEAT_1_EDX] =
2352 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2353 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2354 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2355 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2356 CPUID_DE | CPUID_FP87,
2357 .features[FEAT_1_ECX] =
2358 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2359 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2360 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2361 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2362 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2363 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2364 .features[FEAT_8000_0001_EDX] =
2365 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2366 CPUID_EXT2_SYSCALL,
2367 .features[FEAT_8000_0001_ECX] =
2368 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2369 .features[FEAT_7_0_EBX] =
2370 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2371 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2372 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2373 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2374 CPUID_7_0_EBX_SMAP,
2375 .features[FEAT_XSAVE] =
2376 CPUID_XSAVE_XSAVEOPT,
2377 .features[FEAT_6_EAX] =
2378 CPUID_6_EAX_ARAT,
2379 .xlevel = 0x80000008,
2380 .model_id = "Intel Core Processor (Broadwell)",
2381 .versions = (X86CPUVersionDefinition[]) {
2382 { .version = 1 },
2384 .version = 2,
2385 .alias = "Broadwell-noTSX",
2386 .props = (PropValue[]) {
2387 { "hle", "off" },
2388 { "rtm", "off" },
2389 { "model-id", "Intel Core Processor (Broadwell, no TSX)", },
2390 { /* end of list */ }
2394 .version = 3,
2395 .alias = "Broadwell-IBRS",
2396 .props = (PropValue[]) {
2397 /* Restore TSX features removed by -v2 above */
2398 { "hle", "on" },
2399 { "rtm", "on" },
2400 { "spec-ctrl", "on" },
2401 { "model-id",
2402 "Intel Core Processor (Broadwell, IBRS)" },
2403 { /* end of list */ }
2407 .version = 4,
2408 .alias = "Broadwell-noTSX-IBRS",
2409 .props = (PropValue[]) {
2410 { "hle", "off" },
2411 { "rtm", "off" },
2412 /* spec-ctrl was already enabled by -v3 above */
2413 { "model-id",
2414 "Intel Core Processor (Broadwell, no TSX, IBRS)" },
2415 { /* end of list */ }
2418 { /* end of list */ }
2422 .name = "Skylake-Client",
2423 .level = 0xd,
2424 .vendor = CPUID_VENDOR_INTEL,
2425 .family = 6,
2426 .model = 94,
2427 .stepping = 3,
2428 .features[FEAT_1_EDX] =
2429 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2430 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2431 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2432 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2433 CPUID_DE | CPUID_FP87,
2434 .features[FEAT_1_ECX] =
2435 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2436 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2437 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2438 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2439 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2440 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2441 .features[FEAT_8000_0001_EDX] =
2442 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2443 CPUID_EXT2_SYSCALL,
2444 .features[FEAT_8000_0001_ECX] =
2445 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2446 .features[FEAT_7_0_EBX] =
2447 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2448 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2449 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2450 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2451 CPUID_7_0_EBX_SMAP,
2452 /* Missing: XSAVES (not supported by some Linux versions,
2453 * including v4.1 to v4.12).
2454 * KVM doesn't yet expose any XSAVES state save component,
2455 * and the only one defined in Skylake (processor tracing)
2456 * probably will block migration anyway.
2458 .features[FEAT_XSAVE] =
2459 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2460 CPUID_XSAVE_XGETBV1,
2461 .features[FEAT_6_EAX] =
2462 CPUID_6_EAX_ARAT,
2463 .xlevel = 0x80000008,
2464 .model_id = "Intel Core Processor (Skylake)",
2465 .versions = (X86CPUVersionDefinition[]) {
2466 { .version = 1 },
2468 .version = 2,
2469 .alias = "Skylake-Client-IBRS",
2470 .props = (PropValue[]) {
2471 { "spec-ctrl", "on" },
2472 { "model-id",
2473 "Intel Core Processor (Skylake, IBRS)" },
2474 { /* end of list */ }
2477 { /* end of list */ }
2481 .name = "Skylake-Server",
2482 .level = 0xd,
2483 .vendor = CPUID_VENDOR_INTEL,
2484 .family = 6,
2485 .model = 85,
2486 .stepping = 4,
2487 .features[FEAT_1_EDX] =
2488 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2489 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2490 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2491 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2492 CPUID_DE | CPUID_FP87,
2493 .features[FEAT_1_ECX] =
2494 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2495 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2496 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2497 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2498 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2499 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2500 .features[FEAT_8000_0001_EDX] =
2501 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
2502 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2503 .features[FEAT_8000_0001_ECX] =
2504 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2505 .features[FEAT_7_0_EBX] =
2506 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2507 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2508 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2509 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2510 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
2511 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
2512 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
2513 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
2514 .features[FEAT_7_0_ECX] =
2515 CPUID_7_0_ECX_PKU,
2516 /* Missing: XSAVES (not supported by some Linux versions,
2517 * including v4.1 to v4.12).
2518 * KVM doesn't yet expose any XSAVES state save component,
2519 * and the only one defined in Skylake (processor tracing)
2520 * probably will block migration anyway.
2522 .features[FEAT_XSAVE] =
2523 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2524 CPUID_XSAVE_XGETBV1,
2525 .features[FEAT_6_EAX] =
2526 CPUID_6_EAX_ARAT,
2527 .xlevel = 0x80000008,
2528 .model_id = "Intel Xeon Processor (Skylake)",
2529 .versions = (X86CPUVersionDefinition[]) {
2530 { .version = 1 },
2532 .version = 2,
2533 .alias = "Skylake-Server-IBRS",
2534 .props = (PropValue[]) {
2535 /* clflushopt was not added to Skylake-Server-IBRS */
2536 /* TODO: add -v3 including clflushopt */
2537 { "clflushopt", "off" },
2538 { "spec-ctrl", "on" },
2539 { "model-id",
2540 "Intel Xeon Processor (Skylake, IBRS)" },
2541 { /* end of list */ }
2544 { /* end of list */ }
2548 .name = "Cascadelake-Server",
2549 .level = 0xd,
2550 .vendor = CPUID_VENDOR_INTEL,
2551 .family = 6,
2552 .model = 85,
2553 .stepping = 6,
2554 .features[FEAT_1_EDX] =
2555 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2556 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2557 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2558 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2559 CPUID_DE | CPUID_FP87,
2560 .features[FEAT_1_ECX] =
2561 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2562 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2563 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2564 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2565 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2566 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2567 .features[FEAT_8000_0001_EDX] =
2568 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
2569 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2570 .features[FEAT_8000_0001_ECX] =
2571 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2572 .features[FEAT_7_0_EBX] =
2573 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2574 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2575 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2576 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2577 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
2578 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
2579 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
2580 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
2581 .features[FEAT_7_0_ECX] =
2582 CPUID_7_0_ECX_PKU |
2583 CPUID_7_0_ECX_AVX512VNNI,
2584 .features[FEAT_7_0_EDX] =
2585 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
2586 /* Missing: XSAVES (not supported by some Linux versions,
2587 * including v4.1 to v4.12).
2588 * KVM doesn't yet expose any XSAVES state save component,
2589 * and the only one defined in Skylake (processor tracing)
2590 * probably will block migration anyway.
2592 .features[FEAT_XSAVE] =
2593 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2594 CPUID_XSAVE_XGETBV1,
2595 .features[FEAT_6_EAX] =
2596 CPUID_6_EAX_ARAT,
2597 .xlevel = 0x80000008,
2598 .model_id = "Intel Xeon Processor (Cascadelake)",
2599 .versions = (X86CPUVersionDefinition[]) {
2600 { .version = 1 },
2601 { .version = 2,
2602 .props = (PropValue[]) {
2603 { "arch-capabilities", "on" },
2604 { "rdctl-no", "on" },
2605 { "ibrs-all", "on" },
2606 { "skip-l1dfl-vmentry", "on" },
2607 { "mds-no", "on" },
2608 { /* end of list */ }
2611 { /* end of list */ }
2615 .name = "Icelake-Client",
2616 .level = 0xd,
2617 .vendor = CPUID_VENDOR_INTEL,
2618 .family = 6,
2619 .model = 126,
2620 .stepping = 0,
2621 .features[FEAT_1_EDX] =
2622 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2623 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2624 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2625 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2626 CPUID_DE | CPUID_FP87,
2627 .features[FEAT_1_ECX] =
2628 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2629 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2630 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2631 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2632 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2633 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2634 .features[FEAT_8000_0001_EDX] =
2635 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2636 CPUID_EXT2_SYSCALL,
2637 .features[FEAT_8000_0001_ECX] =
2638 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2639 .features[FEAT_8000_0008_EBX] =
2640 CPUID_8000_0008_EBX_WBNOINVD,
2641 .features[FEAT_7_0_EBX] =
2642 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2643 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2644 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2645 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2646 CPUID_7_0_EBX_SMAP,
2647 .features[FEAT_7_0_ECX] =
2648 CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
2649 CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
2650 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
2651 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
2652 CPUID_7_0_ECX_AVX512_VPOPCNTDQ,
2653 .features[FEAT_7_0_EDX] =
2654 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
2655 /* Missing: XSAVES (not supported by some Linux versions,
2656 * including v4.1 to v4.12).
2657 * KVM doesn't yet expose any XSAVES state save component,
2658 * and the only one defined in Skylake (processor tracing)
2659 * probably will block migration anyway.
2661 .features[FEAT_XSAVE] =
2662 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2663 CPUID_XSAVE_XGETBV1,
2664 .features[FEAT_6_EAX] =
2665 CPUID_6_EAX_ARAT,
2666 .xlevel = 0x80000008,
2667 .model_id = "Intel Core Processor (Icelake)",
2670 .name = "Icelake-Server",
2671 .level = 0xd,
2672 .vendor = CPUID_VENDOR_INTEL,
2673 .family = 6,
2674 .model = 134,
2675 .stepping = 0,
2676 .features[FEAT_1_EDX] =
2677 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2678 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2679 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2680 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2681 CPUID_DE | CPUID_FP87,
2682 .features[FEAT_1_ECX] =
2683 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2684 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2685 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2686 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2687 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2688 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2689 .features[FEAT_8000_0001_EDX] =
2690 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
2691 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2692 .features[FEAT_8000_0001_ECX] =
2693 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2694 .features[FEAT_8000_0008_EBX] =
2695 CPUID_8000_0008_EBX_WBNOINVD,
2696 .features[FEAT_7_0_EBX] =
2697 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2698 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2699 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2700 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2701 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
2702 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
2703 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
2704 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
2705 .features[FEAT_7_0_ECX] =
2706 CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
2707 CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
2708 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
2709 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
2710 CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57,
2711 .features[FEAT_7_0_EDX] =
2712 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
2713 /* Missing: XSAVES (not supported by some Linux versions,
2714 * including v4.1 to v4.12).
2715 * KVM doesn't yet expose any XSAVES state save component,
2716 * and the only one defined in Skylake (processor tracing)
2717 * probably will block migration anyway.
2719 .features[FEAT_XSAVE] =
2720 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2721 CPUID_XSAVE_XGETBV1,
2722 .features[FEAT_6_EAX] =
2723 CPUID_6_EAX_ARAT,
2724 .xlevel = 0x80000008,
2725 .model_id = "Intel Xeon Processor (Icelake)",
2728 .name = "Denverton",
2729 .level = 21,
2730 .vendor = CPUID_VENDOR_INTEL,
2731 .family = 6,
2732 .model = 95,
2733 .stepping = 1,
2734 .features[FEAT_1_EDX] =
2735 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
2736 CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
2737 CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
2738 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
2739 CPUID_SSE | CPUID_SSE2,
2740 .features[FEAT_1_ECX] =
2741 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR |
2742 CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | CPUID_EXT_SSE41 |
2743 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
2744 CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER |
2745 CPUID_EXT_AES | CPUID_EXT_XSAVE | CPUID_EXT_RDRAND,
2746 .features[FEAT_8000_0001_EDX] =
2747 CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
2748 CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
2749 .features[FEAT_8000_0001_ECX] =
2750 CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2751 .features[FEAT_7_0_EBX] =
2752 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_ERMS |
2753 CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_SMAP |
2754 CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_SHA_NI,
2755 .features[FEAT_7_0_EDX] =
2756 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_ARCH_CAPABILITIES |
2757 CPUID_7_0_EDX_SPEC_CTRL_SSBD,
2759 * Missing: XSAVES (not supported by some Linux versions,
2760 * including v4.1 to v4.12).
2761 * KVM doesn't yet expose any XSAVES state save component,
2762 * and the only one defined in Skylake (processor tracing)
2763 * probably will block migration anyway.
2765 .features[FEAT_XSAVE] =
2766 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | CPUID_XSAVE_XGETBV1,
2767 .features[FEAT_6_EAX] =
2768 CPUID_6_EAX_ARAT,
2769 .features[FEAT_ARCH_CAPABILITIES] =
2770 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY,
2771 .xlevel = 0x80000008,
2772 .model_id = "Intel Atom Processor (Denverton)",
2775 .name = "Snowridge",
2776 .level = 27,
2777 .vendor = CPUID_VENDOR_INTEL,
2778 .family = 6,
2779 .model = 134,
2780 .stepping = 1,
2781 .features[FEAT_1_EDX] =
2782 /* missing: CPUID_PN CPUID_IA64 */
2783 /* missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
2784 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE |
2785 CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE |
2786 CPUID_CX8 | CPUID_APIC | CPUID_SEP |
2787 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
2788 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH |
2789 CPUID_MMX |
2790 CPUID_FXSR | CPUID_SSE | CPUID_SSE2,
2791 .features[FEAT_1_ECX] =
2792 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR |
2793 CPUID_EXT_SSSE3 |
2794 CPUID_EXT_CX16 |
2795 CPUID_EXT_SSE41 |
2796 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
2797 CPUID_EXT_POPCNT |
2798 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES | CPUID_EXT_XSAVE |
2799 CPUID_EXT_RDRAND,
2800 .features[FEAT_8000_0001_EDX] =
2801 CPUID_EXT2_SYSCALL |
2802 CPUID_EXT2_NX |
2803 CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
2804 CPUID_EXT2_LM,
2805 .features[FEAT_8000_0001_ECX] =
2806 CPUID_EXT3_LAHF_LM |
2807 CPUID_EXT3_3DNOWPREFETCH,
2808 .features[FEAT_7_0_EBX] =
2809 CPUID_7_0_EBX_FSGSBASE |
2810 CPUID_7_0_EBX_SMEP |
2811 CPUID_7_0_EBX_ERMS |
2812 CPUID_7_0_EBX_MPX | /* missing bits 13, 15 */
2813 CPUID_7_0_EBX_RDSEED |
2814 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
2815 CPUID_7_0_EBX_CLWB |
2816 CPUID_7_0_EBX_SHA_NI,
2817 .features[FEAT_7_0_ECX] =
2818 CPUID_7_0_ECX_UMIP |
2819 /* missing bit 5 */
2820 CPUID_7_0_ECX_GFNI |
2821 CPUID_7_0_ECX_MOVDIRI | CPUID_7_0_ECX_CLDEMOTE |
2822 CPUID_7_0_ECX_MOVDIR64B,
2823 .features[FEAT_7_0_EDX] =
2824 CPUID_7_0_EDX_SPEC_CTRL |
2825 CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD |
2826 CPUID_7_0_EDX_CORE_CAPABILITY,
2827 .features[FEAT_CORE_CAPABILITY] =
2828 MSR_CORE_CAP_SPLIT_LOCK_DETECT,
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] =
2840 CPUID_6_EAX_ARAT,
2841 .xlevel = 0x80000008,
2842 .model_id = "Intel Atom Processor (SnowRidge)",
2843 .versions = (X86CPUVersionDefinition[]) {
2844 { .version = 1 },
2846 .version = 2,
2847 .props = (PropValue[]) {
2848 { "mpx", "off" },
2849 { "model-id", "Intel Atom Processor (Snowridge, no MPX)" },
2850 { /* end of list */ },
2853 { /* end of list */ },
2857 .name = "KnightsMill",
2858 .level = 0xd,
2859 .vendor = CPUID_VENDOR_INTEL,
2860 .family = 6,
2861 .model = 133,
2862 .stepping = 0,
2863 .features[FEAT_1_EDX] =
2864 CPUID_VME | CPUID_SS | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR |
2865 CPUID_MMX | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV |
2866 CPUID_MCA | CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC |
2867 CPUID_CX8 | CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC |
2868 CPUID_PSE | CPUID_DE | CPUID_FP87,
2869 .features[FEAT_1_ECX] =
2870 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2871 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2872 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2873 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2874 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2875 CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2876 .features[FEAT_8000_0001_EDX] =
2877 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
2878 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2879 .features[FEAT_8000_0001_ECX] =
2880 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2881 .features[FEAT_7_0_EBX] =
2882 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
2883 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
2884 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_AVX512F |
2885 CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_AVX512PF |
2886 CPUID_7_0_EBX_AVX512ER,
2887 .features[FEAT_7_0_ECX] =
2888 CPUID_7_0_ECX_AVX512_VPOPCNTDQ,
2889 .features[FEAT_7_0_EDX] =
2890 CPUID_7_0_EDX_AVX512_4VNNIW | CPUID_7_0_EDX_AVX512_4FMAPS,
2891 .features[FEAT_XSAVE] =
2892 CPUID_XSAVE_XSAVEOPT,
2893 .features[FEAT_6_EAX] =
2894 CPUID_6_EAX_ARAT,
2895 .xlevel = 0x80000008,
2896 .model_id = "Intel Xeon Phi Processor (Knights Mill)",
2899 .name = "Opteron_G1",
2900 .level = 5,
2901 .vendor = CPUID_VENDOR_AMD,
2902 .family = 15,
2903 .model = 6,
2904 .stepping = 1,
2905 .features[FEAT_1_EDX] =
2906 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2907 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2908 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2909 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2910 CPUID_DE | CPUID_FP87,
2911 .features[FEAT_1_ECX] =
2912 CPUID_EXT_SSE3,
2913 .features[FEAT_8000_0001_EDX] =
2914 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2915 .xlevel = 0x80000008,
2916 .model_id = "AMD Opteron 240 (Gen 1 Class Opteron)",
2919 .name = "Opteron_G2",
2920 .level = 5,
2921 .vendor = CPUID_VENDOR_AMD,
2922 .family = 15,
2923 .model = 6,
2924 .stepping = 1,
2925 .features[FEAT_1_EDX] =
2926 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2927 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2928 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2929 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2930 CPUID_DE | CPUID_FP87,
2931 .features[FEAT_1_ECX] =
2932 CPUID_EXT_CX16 | CPUID_EXT_SSE3,
2933 .features[FEAT_8000_0001_EDX] =
2934 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2935 .features[FEAT_8000_0001_ECX] =
2936 CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
2937 .xlevel = 0x80000008,
2938 .model_id = "AMD Opteron 22xx (Gen 2 Class Opteron)",
2941 .name = "Opteron_G3",
2942 .level = 5,
2943 .vendor = CPUID_VENDOR_AMD,
2944 .family = 16,
2945 .model = 2,
2946 .stepping = 3,
2947 .features[FEAT_1_EDX] =
2948 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2949 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2950 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2951 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2952 CPUID_DE | CPUID_FP87,
2953 .features[FEAT_1_ECX] =
2954 CPUID_EXT_POPCNT | CPUID_EXT_CX16 | CPUID_EXT_MONITOR |
2955 CPUID_EXT_SSE3,
2956 .features[FEAT_8000_0001_EDX] =
2957 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL |
2958 CPUID_EXT2_RDTSCP,
2959 .features[FEAT_8000_0001_ECX] =
2960 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A |
2961 CPUID_EXT3_ABM | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
2962 .xlevel = 0x80000008,
2963 .model_id = "AMD Opteron 23xx (Gen 3 Class Opteron)",
2966 .name = "Opteron_G4",
2967 .level = 0xd,
2968 .vendor = CPUID_VENDOR_AMD,
2969 .family = 21,
2970 .model = 1,
2971 .stepping = 2,
2972 .features[FEAT_1_EDX] =
2973 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2974 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2975 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2976 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2977 CPUID_DE | CPUID_FP87,
2978 .features[FEAT_1_ECX] =
2979 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2980 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2981 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
2982 CPUID_EXT_SSE3,
2983 .features[FEAT_8000_0001_EDX] =
2984 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
2985 CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
2986 .features[FEAT_8000_0001_ECX] =
2987 CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
2988 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
2989 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
2990 CPUID_EXT3_LAHF_LM,
2991 .features[FEAT_SVM] =
2992 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
2993 /* no xsaveopt! */
2994 .xlevel = 0x8000001A,
2995 .model_id = "AMD Opteron 62xx class CPU",
2998 .name = "Opteron_G5",
2999 .level = 0xd,
3000 .vendor = CPUID_VENDOR_AMD,
3001 .family = 21,
3002 .model = 2,
3003 .stepping = 0,
3004 .features[FEAT_1_EDX] =
3005 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3006 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3007 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3008 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3009 CPUID_DE | CPUID_FP87,
3010 .features[FEAT_1_ECX] =
3011 CPUID_EXT_F16C | CPUID_EXT_AVX | CPUID_EXT_XSAVE |
3012 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
3013 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_FMA |
3014 CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
3015 .features[FEAT_8000_0001_EDX] =
3016 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
3017 CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
3018 .features[FEAT_8000_0001_ECX] =
3019 CPUID_EXT3_TBM | CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
3020 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
3021 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
3022 CPUID_EXT3_LAHF_LM,
3023 .features[FEAT_SVM] =
3024 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
3025 /* no xsaveopt! */
3026 .xlevel = 0x8000001A,
3027 .model_id = "AMD Opteron 63xx class CPU",
3030 .name = "EPYC",
3031 .level = 0xd,
3032 .vendor = CPUID_VENDOR_AMD,
3033 .family = 23,
3034 .model = 1,
3035 .stepping = 2,
3036 .features[FEAT_1_EDX] =
3037 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
3038 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
3039 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
3040 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
3041 CPUID_VME | CPUID_FP87,
3042 .features[FEAT_1_ECX] =
3043 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
3044 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
3045 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
3046 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
3047 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
3048 .features[FEAT_8000_0001_EDX] =
3049 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
3050 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
3051 CPUID_EXT2_SYSCALL,
3052 .features[FEAT_8000_0001_ECX] =
3053 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
3054 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
3055 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
3056 CPUID_EXT3_TOPOEXT,
3057 .features[FEAT_7_0_EBX] =
3058 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
3059 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
3060 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
3061 CPUID_7_0_EBX_SHA_NI,
3062 /* Missing: XSAVES (not supported by some Linux versions,
3063 * including v4.1 to v4.12).
3064 * KVM doesn't yet expose any XSAVES state save component.
3066 .features[FEAT_XSAVE] =
3067 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3068 CPUID_XSAVE_XGETBV1,
3069 .features[FEAT_6_EAX] =
3070 CPUID_6_EAX_ARAT,
3071 .features[FEAT_SVM] =
3072 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
3073 .xlevel = 0x8000001E,
3074 .model_id = "AMD EPYC Processor",
3075 .cache_info = &epyc_cache_info,
3076 .versions = (X86CPUVersionDefinition[]) {
3077 { .version = 1 },
3079 .version = 2,
3080 .alias = "EPYC-IBPB",
3081 .props = (PropValue[]) {
3082 { "ibpb", "on" },
3083 { "model-id",
3084 "AMD EPYC Processor (with IBPB)" },
3085 { /* end of list */ }
3088 { /* end of list */ }
3092 .name = "Dhyana",
3093 .level = 0xd,
3094 .vendor = CPUID_VENDOR_HYGON,
3095 .family = 24,
3096 .model = 0,
3097 .stepping = 1,
3098 .features[FEAT_1_EDX] =
3099 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
3100 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
3101 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
3102 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
3103 CPUID_VME | CPUID_FP87,
3104 .features[FEAT_1_ECX] =
3105 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
3106 CPUID_EXT_XSAVE | CPUID_EXT_POPCNT |
3107 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
3108 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
3109 CPUID_EXT_MONITOR | CPUID_EXT_SSE3,
3110 .features[FEAT_8000_0001_EDX] =
3111 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
3112 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
3113 CPUID_EXT2_SYSCALL,
3114 .features[FEAT_8000_0001_ECX] =
3115 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
3116 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
3117 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
3118 CPUID_EXT3_TOPOEXT,
3119 .features[FEAT_8000_0008_EBX] =
3120 CPUID_8000_0008_EBX_IBPB,
3121 .features[FEAT_7_0_EBX] =
3122 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
3123 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
3124 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT,
3126 * Missing: XSAVES (not supported by some Linux versions,
3127 * including v4.1 to v4.12).
3128 * KVM doesn't yet expose any XSAVES state save component.
3130 .features[FEAT_XSAVE] =
3131 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3132 CPUID_XSAVE_XGETBV1,
3133 .features[FEAT_6_EAX] =
3134 CPUID_6_EAX_ARAT,
3135 .features[FEAT_SVM] =
3136 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
3137 .xlevel = 0x8000001E,
3138 .model_id = "Hygon Dhyana Processor",
3139 .cache_info = &epyc_cache_info,
3143 /* KVM-specific features that are automatically added/removed
3144 * from all CPU models when KVM is enabled.
3146 static PropValue kvm_default_props[] = {
3147 { "kvmclock", "on" },
3148 { "kvm-nopiodelay", "on" },
3149 { "kvm-asyncpf", "on" },
3150 { "kvm-steal-time", "on" },
3151 { "kvm-pv-eoi", "on" },
3152 { "kvmclock-stable-bit", "on" },
3153 { "x2apic", "on" },
3154 { "acpi", "off" },
3155 { "monitor", "off" },
3156 { "svm", "off" },
3157 { NULL, NULL },
3160 /* TCG-specific defaults that override all CPU models when using TCG
3162 static PropValue tcg_default_props[] = {
3163 { "vme", "off" },
3164 { NULL, NULL },
3168 X86CPUVersion default_cpu_version = CPU_VERSION_LATEST;
3170 void x86_cpu_set_default_version(X86CPUVersion version)
3172 /* Translating CPU_VERSION_AUTO to CPU_VERSION_AUTO doesn't make sense */
3173 assert(version != CPU_VERSION_AUTO);
3174 default_cpu_version = version;
3177 static X86CPUVersion x86_cpu_model_last_version(const X86CPUModel *model)
3179 int v = 0;
3180 const X86CPUVersionDefinition *vdef =
3181 x86_cpu_def_get_versions(model->cpudef);
3182 while (vdef->version) {
3183 v = vdef->version;
3184 vdef++;
3186 return v;
3189 /* Return the actual version being used for a specific CPU model */
3190 static X86CPUVersion x86_cpu_model_resolve_version(const X86CPUModel *model)
3192 X86CPUVersion v = model->version;
3193 if (v == CPU_VERSION_AUTO) {
3194 v = default_cpu_version;
3196 if (v == CPU_VERSION_LATEST) {
3197 return x86_cpu_model_last_version(model);
3199 return v;
3202 void x86_cpu_change_kvm_default(const char *prop, const char *value)
3204 PropValue *pv;
3205 for (pv = kvm_default_props; pv->prop; pv++) {
3206 if (!strcmp(pv->prop, prop)) {
3207 pv->value = value;
3208 break;
3212 /* It is valid to call this function only for properties that
3213 * are already present in the kvm_default_props table.
3215 assert(pv->prop);
3218 static uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
3219 bool migratable_only);
3221 static bool lmce_supported(void)
3223 uint64_t mce_cap = 0;
3225 #ifdef CONFIG_KVM
3226 if (kvm_ioctl(kvm_state, KVM_X86_GET_MCE_CAP_SUPPORTED, &mce_cap) < 0) {
3227 return false;
3229 #endif
3231 return !!(mce_cap & MCG_LMCE_P);
3234 #define CPUID_MODEL_ID_SZ 48
3237 * cpu_x86_fill_model_id:
3238 * Get CPUID model ID string from host CPU.
3240 * @str should have at least CPUID_MODEL_ID_SZ bytes
3242 * The function does NOT add a null terminator to the string
3243 * automatically.
3245 static int cpu_x86_fill_model_id(char *str)
3247 uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0;
3248 int i;
3250 for (i = 0; i < 3; i++) {
3251 host_cpuid(0x80000002 + i, 0, &eax, &ebx, &ecx, &edx);
3252 memcpy(str + i * 16 + 0, &eax, 4);
3253 memcpy(str + i * 16 + 4, &ebx, 4);
3254 memcpy(str + i * 16 + 8, &ecx, 4);
3255 memcpy(str + i * 16 + 12, &edx, 4);
3257 return 0;
3260 static Property max_x86_cpu_properties[] = {
3261 DEFINE_PROP_BOOL("migratable", X86CPU, migratable, true),
3262 DEFINE_PROP_BOOL("host-cache-info", X86CPU, cache_info_passthrough, false),
3263 DEFINE_PROP_END_OF_LIST()
3266 static void max_x86_cpu_class_init(ObjectClass *oc, void *data)
3268 DeviceClass *dc = DEVICE_CLASS(oc);
3269 X86CPUClass *xcc = X86_CPU_CLASS(oc);
3271 xcc->ordering = 9;
3273 xcc->model_description =
3274 "Enables all features supported by the accelerator in the current host";
3276 dc->props = max_x86_cpu_properties;
3279 static void max_x86_cpu_initfn(Object *obj)
3281 X86CPU *cpu = X86_CPU(obj);
3282 CPUX86State *env = &cpu->env;
3283 KVMState *s = kvm_state;
3285 /* We can't fill the features array here because we don't know yet if
3286 * "migratable" is true or false.
3288 cpu->max_features = true;
3290 if (accel_uses_host_cpuid()) {
3291 char vendor[CPUID_VENDOR_SZ + 1] = { 0 };
3292 char model_id[CPUID_MODEL_ID_SZ + 1] = { 0 };
3293 int family, model, stepping;
3295 host_vendor_fms(vendor, &family, &model, &stepping);
3296 cpu_x86_fill_model_id(model_id);
3298 object_property_set_str(OBJECT(cpu), vendor, "vendor", &error_abort);
3299 object_property_set_int(OBJECT(cpu), family, "family", &error_abort);
3300 object_property_set_int(OBJECT(cpu), model, "model", &error_abort);
3301 object_property_set_int(OBJECT(cpu), stepping, "stepping",
3302 &error_abort);
3303 object_property_set_str(OBJECT(cpu), model_id, "model-id",
3304 &error_abort);
3306 if (kvm_enabled()) {
3307 env->cpuid_min_level =
3308 kvm_arch_get_supported_cpuid(s, 0x0, 0, R_EAX);
3309 env->cpuid_min_xlevel =
3310 kvm_arch_get_supported_cpuid(s, 0x80000000, 0, R_EAX);
3311 env->cpuid_min_xlevel2 =
3312 kvm_arch_get_supported_cpuid(s, 0xC0000000, 0, R_EAX);
3313 } else {
3314 env->cpuid_min_level =
3315 hvf_get_supported_cpuid(0x0, 0, R_EAX);
3316 env->cpuid_min_xlevel =
3317 hvf_get_supported_cpuid(0x80000000, 0, R_EAX);
3318 env->cpuid_min_xlevel2 =
3319 hvf_get_supported_cpuid(0xC0000000, 0, R_EAX);
3322 if (lmce_supported()) {
3323 object_property_set_bool(OBJECT(cpu), true, "lmce", &error_abort);
3325 } else {
3326 object_property_set_str(OBJECT(cpu), CPUID_VENDOR_AMD,
3327 "vendor", &error_abort);
3328 object_property_set_int(OBJECT(cpu), 6, "family", &error_abort);
3329 object_property_set_int(OBJECT(cpu), 6, "model", &error_abort);
3330 object_property_set_int(OBJECT(cpu), 3, "stepping", &error_abort);
3331 object_property_set_str(OBJECT(cpu),
3332 "QEMU TCG CPU version " QEMU_HW_VERSION,
3333 "model-id", &error_abort);
3336 object_property_set_bool(OBJECT(cpu), true, "pmu", &error_abort);
3339 static const TypeInfo max_x86_cpu_type_info = {
3340 .name = X86_CPU_TYPE_NAME("max"),
3341 .parent = TYPE_X86_CPU,
3342 .instance_init = max_x86_cpu_initfn,
3343 .class_init = max_x86_cpu_class_init,
3346 #if defined(CONFIG_KVM) || defined(CONFIG_HVF)
3347 static void host_x86_cpu_class_init(ObjectClass *oc, void *data)
3349 X86CPUClass *xcc = X86_CPU_CLASS(oc);
3351 xcc->host_cpuid_required = true;
3352 xcc->ordering = 8;
3354 #if defined(CONFIG_KVM)
3355 xcc->model_description =
3356 "KVM processor with all supported host features ";
3357 #elif defined(CONFIG_HVF)
3358 xcc->model_description =
3359 "HVF processor with all supported host features ";
3360 #endif
3363 static const TypeInfo host_x86_cpu_type_info = {
3364 .name = X86_CPU_TYPE_NAME("host"),
3365 .parent = X86_CPU_TYPE_NAME("max"),
3366 .class_init = host_x86_cpu_class_init,
3369 #endif
3371 static char *feature_word_description(FeatureWordInfo *f, uint32_t bit)
3373 assert(f->type == CPUID_FEATURE_WORD || f->type == MSR_FEATURE_WORD);
3375 switch (f->type) {
3376 case CPUID_FEATURE_WORD:
3378 const char *reg = get_register_name_32(f->cpuid.reg);
3379 assert(reg);
3380 return g_strdup_printf("CPUID.%02XH:%s",
3381 f->cpuid.eax, reg);
3383 case MSR_FEATURE_WORD:
3384 return g_strdup_printf("MSR(%02XH)",
3385 f->msr.index);
3388 return NULL;
3391 static bool x86_cpu_have_filtered_features(X86CPU *cpu)
3393 FeatureWord w;
3395 for (w = 0; w < FEATURE_WORDS; w++) {
3396 if (cpu->filtered_features[w]) {
3397 return true;
3401 return false;
3404 static void mark_unavailable_features(X86CPU *cpu, FeatureWord w, uint64_t mask,
3405 const char *verbose_prefix)
3407 CPUX86State *env = &cpu->env;
3408 FeatureWordInfo *f = &feature_word_info[w];
3409 int i;
3410 char *feat_word_str;
3412 if (!cpu->force_features) {
3413 env->features[w] &= ~mask;
3415 cpu->filtered_features[w] |= mask;
3417 if (!verbose_prefix) {
3418 return;
3421 for (i = 0; i < 64; ++i) {
3422 if ((1ULL << i) & mask) {
3423 feat_word_str = feature_word_description(f, i);
3424 warn_report("%s: %s%s%s [bit %d]",
3425 verbose_prefix,
3426 feat_word_str,
3427 f->feat_names[i] ? "." : "",
3428 f->feat_names[i] ? f->feat_names[i] : "", i);
3429 g_free(feat_word_str);
3434 static void x86_cpuid_version_get_family(Object *obj, Visitor *v,
3435 const char *name, void *opaque,
3436 Error **errp)
3438 X86CPU *cpu = X86_CPU(obj);
3439 CPUX86State *env = &cpu->env;
3440 int64_t value;
3442 value = (env->cpuid_version >> 8) & 0xf;
3443 if (value == 0xf) {
3444 value += (env->cpuid_version >> 20) & 0xff;
3446 visit_type_int(v, name, &value, errp);
3449 static void x86_cpuid_version_set_family(Object *obj, Visitor *v,
3450 const char *name, void *opaque,
3451 Error **errp)
3453 X86CPU *cpu = X86_CPU(obj);
3454 CPUX86State *env = &cpu->env;
3455 const int64_t min = 0;
3456 const int64_t max = 0xff + 0xf;
3457 Error *local_err = NULL;
3458 int64_t value;
3460 visit_type_int(v, name, &value, &local_err);
3461 if (local_err) {
3462 error_propagate(errp, local_err);
3463 return;
3465 if (value < min || value > max) {
3466 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
3467 name ? name : "null", value, min, max);
3468 return;
3471 env->cpuid_version &= ~0xff00f00;
3472 if (value > 0x0f) {
3473 env->cpuid_version |= 0xf00 | ((value - 0x0f) << 20);
3474 } else {
3475 env->cpuid_version |= value << 8;
3479 static void x86_cpuid_version_get_model(Object *obj, Visitor *v,
3480 const char *name, void *opaque,
3481 Error **errp)
3483 X86CPU *cpu = X86_CPU(obj);
3484 CPUX86State *env = &cpu->env;
3485 int64_t value;
3487 value = (env->cpuid_version >> 4) & 0xf;
3488 value |= ((env->cpuid_version >> 16) & 0xf) << 4;
3489 visit_type_int(v, name, &value, errp);
3492 static void x86_cpuid_version_set_model(Object *obj, Visitor *v,
3493 const char *name, void *opaque,
3494 Error **errp)
3496 X86CPU *cpu = X86_CPU(obj);
3497 CPUX86State *env = &cpu->env;
3498 const int64_t min = 0;
3499 const int64_t max = 0xff;
3500 Error *local_err = NULL;
3501 int64_t value;
3503 visit_type_int(v, name, &value, &local_err);
3504 if (local_err) {
3505 error_propagate(errp, local_err);
3506 return;
3508 if (value < min || value > max) {
3509 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
3510 name ? name : "null", value, min, max);
3511 return;
3514 env->cpuid_version &= ~0xf00f0;
3515 env->cpuid_version |= ((value & 0xf) << 4) | ((value >> 4) << 16);
3518 static void x86_cpuid_version_get_stepping(Object *obj, Visitor *v,
3519 const char *name, void *opaque,
3520 Error **errp)
3522 X86CPU *cpu = X86_CPU(obj);
3523 CPUX86State *env = &cpu->env;
3524 int64_t value;
3526 value = env->cpuid_version & 0xf;
3527 visit_type_int(v, name, &value, errp);
3530 static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v,
3531 const char *name, void *opaque,
3532 Error **errp)
3534 X86CPU *cpu = X86_CPU(obj);
3535 CPUX86State *env = &cpu->env;
3536 const int64_t min = 0;
3537 const int64_t max = 0xf;
3538 Error *local_err = NULL;
3539 int64_t value;
3541 visit_type_int(v, name, &value, &local_err);
3542 if (local_err) {
3543 error_propagate(errp, local_err);
3544 return;
3546 if (value < min || value > max) {
3547 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
3548 name ? name : "null", value, min, max);
3549 return;
3552 env->cpuid_version &= ~0xf;
3553 env->cpuid_version |= value & 0xf;
3556 static char *x86_cpuid_get_vendor(Object *obj, Error **errp)
3558 X86CPU *cpu = X86_CPU(obj);
3559 CPUX86State *env = &cpu->env;
3560 char *value;
3562 value = g_malloc(CPUID_VENDOR_SZ + 1);
3563 x86_cpu_vendor_words2str(value, env->cpuid_vendor1, env->cpuid_vendor2,
3564 env->cpuid_vendor3);
3565 return value;
3568 static void x86_cpuid_set_vendor(Object *obj, const char *value,
3569 Error **errp)
3571 X86CPU *cpu = X86_CPU(obj);
3572 CPUX86State *env = &cpu->env;
3573 int i;
3575 if (strlen(value) != CPUID_VENDOR_SZ) {
3576 error_setg(errp, QERR_PROPERTY_VALUE_BAD, "", "vendor", value);
3577 return;
3580 env->cpuid_vendor1 = 0;
3581 env->cpuid_vendor2 = 0;
3582 env->cpuid_vendor3 = 0;
3583 for (i = 0; i < 4; i++) {
3584 env->cpuid_vendor1 |= ((uint8_t)value[i ]) << (8 * i);
3585 env->cpuid_vendor2 |= ((uint8_t)value[i + 4]) << (8 * i);
3586 env->cpuid_vendor3 |= ((uint8_t)value[i + 8]) << (8 * i);
3590 static char *x86_cpuid_get_model_id(Object *obj, Error **errp)
3592 X86CPU *cpu = X86_CPU(obj);
3593 CPUX86State *env = &cpu->env;
3594 char *value;
3595 int i;
3597 value = g_malloc(48 + 1);
3598 for (i = 0; i < 48; i++) {
3599 value[i] = env->cpuid_model[i >> 2] >> (8 * (i & 3));
3601 value[48] = '\0';
3602 return value;
3605 static void x86_cpuid_set_model_id(Object *obj, const char *model_id,
3606 Error **errp)
3608 X86CPU *cpu = X86_CPU(obj);
3609 CPUX86State *env = &cpu->env;
3610 int c, len, i;
3612 if (model_id == NULL) {
3613 model_id = "";
3615 len = strlen(model_id);
3616 memset(env->cpuid_model, 0, 48);
3617 for (i = 0; i < 48; i++) {
3618 if (i >= len) {
3619 c = '\0';
3620 } else {
3621 c = (uint8_t)model_id[i];
3623 env->cpuid_model[i >> 2] |= c << (8 * (i & 3));
3627 static void x86_cpuid_get_tsc_freq(Object *obj, Visitor *v, const char *name,
3628 void *opaque, Error **errp)
3630 X86CPU *cpu = X86_CPU(obj);
3631 int64_t value;
3633 value = cpu->env.tsc_khz * 1000;
3634 visit_type_int(v, name, &value, errp);
3637 static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name,
3638 void *opaque, Error **errp)
3640 X86CPU *cpu = X86_CPU(obj);
3641 const int64_t min = 0;
3642 const int64_t max = INT64_MAX;
3643 Error *local_err = NULL;
3644 int64_t value;
3646 visit_type_int(v, name, &value, &local_err);
3647 if (local_err) {
3648 error_propagate(errp, local_err);
3649 return;
3651 if (value < min || value > max) {
3652 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
3653 name ? name : "null", value, min, max);
3654 return;
3657 cpu->env.tsc_khz = cpu->env.user_tsc_khz = value / 1000;
3660 /* Generic getter for "feature-words" and "filtered-features" properties */
3661 static void x86_cpu_get_feature_words(Object *obj, Visitor *v,
3662 const char *name, void *opaque,
3663 Error **errp)
3665 uint64_t *array = (uint64_t *)opaque;
3666 FeatureWord w;
3667 X86CPUFeatureWordInfo word_infos[FEATURE_WORDS] = { };
3668 X86CPUFeatureWordInfoList list_entries[FEATURE_WORDS] = { };
3669 X86CPUFeatureWordInfoList *list = NULL;
3671 for (w = 0; w < FEATURE_WORDS; w++) {
3672 FeatureWordInfo *wi = &feature_word_info[w];
3674 * We didn't have MSR features when "feature-words" was
3675 * introduced. Therefore skipped other type entries.
3677 if (wi->type != CPUID_FEATURE_WORD) {
3678 continue;
3680 X86CPUFeatureWordInfo *qwi = &word_infos[w];
3681 qwi->cpuid_input_eax = wi->cpuid.eax;
3682 qwi->has_cpuid_input_ecx = wi->cpuid.needs_ecx;
3683 qwi->cpuid_input_ecx = wi->cpuid.ecx;
3684 qwi->cpuid_register = x86_reg_info_32[wi->cpuid.reg].qapi_enum;
3685 qwi->features = array[w];
3687 /* List will be in reverse order, but order shouldn't matter */
3688 list_entries[w].next = list;
3689 list_entries[w].value = &word_infos[w];
3690 list = &list_entries[w];
3693 visit_type_X86CPUFeatureWordInfoList(v, "feature-words", &list, errp);
3696 /* Convert all '_' in a feature string option name to '-', to make feature
3697 * name conform to QOM property naming rule, which uses '-' instead of '_'.
3699 static inline void feat2prop(char *s)
3701 while ((s = strchr(s, '_'))) {
3702 *s = '-';
3706 /* Return the feature property name for a feature flag bit */
3707 static const char *x86_cpu_feature_name(FeatureWord w, int bitnr)
3709 const char *name;
3710 /* XSAVE components are automatically enabled by other features,
3711 * so return the original feature name instead
3713 if (w == FEAT_XSAVE_COMP_LO || w == FEAT_XSAVE_COMP_HI) {
3714 int comp = (w == FEAT_XSAVE_COMP_HI) ? bitnr + 32 : bitnr;
3716 if (comp < ARRAY_SIZE(x86_ext_save_areas) &&
3717 x86_ext_save_areas[comp].bits) {
3718 w = x86_ext_save_areas[comp].feature;
3719 bitnr = ctz32(x86_ext_save_areas[comp].bits);
3723 assert(bitnr < 64);
3724 assert(w < FEATURE_WORDS);
3725 name = feature_word_info[w].feat_names[bitnr];
3726 assert(bitnr < 32 || !(name && feature_word_info[w].type == CPUID_FEATURE_WORD));
3727 return name;
3730 /* Compatibily hack to maintain legacy +-feat semantic,
3731 * where +-feat overwrites any feature set by
3732 * feat=on|feat even if the later is parsed after +-feat
3733 * (i.e. "-x2apic,x2apic=on" will result in x2apic disabled)
3735 static GList *plus_features, *minus_features;
3737 static gint compare_string(gconstpointer a, gconstpointer b)
3739 return g_strcmp0(a, b);
3742 /* Parse "+feature,-feature,feature=foo" CPU feature string
3744 static void x86_cpu_parse_featurestr(const char *typename, char *features,
3745 Error **errp)
3747 char *featurestr; /* Single 'key=value" string being parsed */
3748 static bool cpu_globals_initialized;
3749 bool ambiguous = false;
3751 if (cpu_globals_initialized) {
3752 return;
3754 cpu_globals_initialized = true;
3756 if (!features) {
3757 return;
3760 for (featurestr = strtok(features, ",");
3761 featurestr;
3762 featurestr = strtok(NULL, ",")) {
3763 const char *name;
3764 const char *val = NULL;
3765 char *eq = NULL;
3766 char num[32];
3767 GlobalProperty *prop;
3769 /* Compatibility syntax: */
3770 if (featurestr[0] == '+') {
3771 plus_features = g_list_append(plus_features,
3772 g_strdup(featurestr + 1));
3773 continue;
3774 } else if (featurestr[0] == '-') {
3775 minus_features = g_list_append(minus_features,
3776 g_strdup(featurestr + 1));
3777 continue;
3780 eq = strchr(featurestr, '=');
3781 if (eq) {
3782 *eq++ = 0;
3783 val = eq;
3784 } else {
3785 val = "on";
3788 feat2prop(featurestr);
3789 name = featurestr;
3791 if (g_list_find_custom(plus_features, name, compare_string)) {
3792 warn_report("Ambiguous CPU model string. "
3793 "Don't mix both \"+%s\" and \"%s=%s\"",
3794 name, name, val);
3795 ambiguous = true;
3797 if (g_list_find_custom(minus_features, name, compare_string)) {
3798 warn_report("Ambiguous CPU model string. "
3799 "Don't mix both \"-%s\" and \"%s=%s\"",
3800 name, name, val);
3801 ambiguous = true;
3804 /* Special case: */
3805 if (!strcmp(name, "tsc-freq")) {
3806 int ret;
3807 uint64_t tsc_freq;
3809 ret = qemu_strtosz_metric(val, NULL, &tsc_freq);
3810 if (ret < 0 || tsc_freq > INT64_MAX) {
3811 error_setg(errp, "bad numerical value %s", val);
3812 return;
3814 snprintf(num, sizeof(num), "%" PRId64, tsc_freq);
3815 val = num;
3816 name = "tsc-frequency";
3819 prop = g_new0(typeof(*prop), 1);
3820 prop->driver = typename;
3821 prop->property = g_strdup(name);
3822 prop->value = g_strdup(val);
3823 qdev_prop_register_global(prop);
3826 if (ambiguous) {
3827 warn_report("Compatibility of ambiguous CPU model "
3828 "strings won't be kept on future QEMU versions");
3832 static void x86_cpu_expand_features(X86CPU *cpu, Error **errp);
3833 static void x86_cpu_filter_features(X86CPU *cpu, bool verbose);
3835 /* Build a list with the name of all features on a feature word array */
3836 static void x86_cpu_list_feature_names(FeatureWordArray features,
3837 strList **feat_names)
3839 FeatureWord w;
3840 strList **next = feat_names;
3842 for (w = 0; w < FEATURE_WORDS; w++) {
3843 uint64_t filtered = features[w];
3844 int i;
3845 for (i = 0; i < 64; i++) {
3846 if (filtered & (1ULL << i)) {
3847 strList *new = g_new0(strList, 1);
3848 new->value = g_strdup(x86_cpu_feature_name(w, i));
3849 *next = new;
3850 next = &new->next;
3856 static void x86_cpu_get_unavailable_features(Object *obj, Visitor *v,
3857 const char *name, void *opaque,
3858 Error **errp)
3860 X86CPU *xc = X86_CPU(obj);
3861 strList *result = NULL;
3863 x86_cpu_list_feature_names(xc->filtered_features, &result);
3864 visit_type_strList(v, "unavailable-features", &result, errp);
3867 /* Check for missing features that may prevent the CPU class from
3868 * running using the current machine and accelerator.
3870 static void x86_cpu_class_check_missing_features(X86CPUClass *xcc,
3871 strList **missing_feats)
3873 X86CPU *xc;
3874 Error *err = NULL;
3875 strList **next = missing_feats;
3877 if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
3878 strList *new = g_new0(strList, 1);
3879 new->value = g_strdup("kvm");
3880 *missing_feats = new;
3881 return;
3884 xc = X86_CPU(object_new(object_class_get_name(OBJECT_CLASS(xcc))));
3886 x86_cpu_expand_features(xc, &err);
3887 if (err) {
3888 /* Errors at x86_cpu_expand_features should never happen,
3889 * but in case it does, just report the model as not
3890 * runnable at all using the "type" property.
3892 strList *new = g_new0(strList, 1);
3893 new->value = g_strdup("type");
3894 *next = new;
3895 next = &new->next;
3898 x86_cpu_filter_features(xc, false);
3900 x86_cpu_list_feature_names(xc->filtered_features, next);
3902 object_unref(OBJECT(xc));
3905 /* Print all cpuid feature names in featureset
3907 static void listflags(GList *features)
3909 size_t len = 0;
3910 GList *tmp;
3912 for (tmp = features; tmp; tmp = tmp->next) {
3913 const char *name = tmp->data;
3914 if ((len + strlen(name) + 1) >= 75) {
3915 qemu_printf("\n");
3916 len = 0;
3918 qemu_printf("%s%s", len == 0 ? " " : " ", name);
3919 len += strlen(name) + 1;
3921 qemu_printf("\n");
3924 /* Sort alphabetically by type name, respecting X86CPUClass::ordering. */
3925 static gint x86_cpu_list_compare(gconstpointer a, gconstpointer b)
3927 ObjectClass *class_a = (ObjectClass *)a;
3928 ObjectClass *class_b = (ObjectClass *)b;
3929 X86CPUClass *cc_a = X86_CPU_CLASS(class_a);
3930 X86CPUClass *cc_b = X86_CPU_CLASS(class_b);
3931 char *name_a, *name_b;
3932 int ret;
3934 if (cc_a->ordering != cc_b->ordering) {
3935 ret = cc_a->ordering - cc_b->ordering;
3936 } else {
3937 name_a = x86_cpu_class_get_model_name(cc_a);
3938 name_b = x86_cpu_class_get_model_name(cc_b);
3939 ret = strcmp(name_a, name_b);
3940 g_free(name_a);
3941 g_free(name_b);
3943 return ret;
3946 static GSList *get_sorted_cpu_model_list(void)
3948 GSList *list = object_class_get_list(TYPE_X86_CPU, false);
3949 list = g_slist_sort(list, x86_cpu_list_compare);
3950 return list;
3953 static char *x86_cpu_class_get_model_id(X86CPUClass *xc)
3955 Object *obj = object_new(object_class_get_name(OBJECT_CLASS(xc)));
3956 char *r = object_property_get_str(obj, "model-id", &error_abort);
3957 object_unref(obj);
3958 return r;
3961 static char *x86_cpu_class_get_alias_of(X86CPUClass *cc)
3963 X86CPUVersion version;
3965 if (!cc->model || !cc->model->is_alias) {
3966 return NULL;
3968 version = x86_cpu_model_resolve_version(cc->model);
3969 if (version <= 0) {
3970 return NULL;
3972 return x86_cpu_versioned_model_name(cc->model->cpudef, version);
3975 static void x86_cpu_list_entry(gpointer data, gpointer user_data)
3977 ObjectClass *oc = data;
3978 X86CPUClass *cc = X86_CPU_CLASS(oc);
3979 char *name = x86_cpu_class_get_model_name(cc);
3980 char *desc = g_strdup(cc->model_description);
3981 char *alias_of = x86_cpu_class_get_alias_of(cc);
3983 if (!desc && alias_of) {
3984 if (cc->model && cc->model->version == CPU_VERSION_AUTO) {
3985 desc = g_strdup("(alias configured by machine type)");
3986 } else {
3987 desc = g_strdup_printf("(alias of %s)", alias_of);
3990 if (!desc) {
3991 desc = x86_cpu_class_get_model_id(cc);
3994 qemu_printf("x86 %-20s %-48s\n", name, desc);
3995 g_free(name);
3996 g_free(desc);
3997 g_free(alias_of);
4000 /* list available CPU models and flags */
4001 void x86_cpu_list(void)
4003 int i, j;
4004 GSList *list;
4005 GList *names = NULL;
4007 qemu_printf("Available CPUs:\n");
4008 list = get_sorted_cpu_model_list();
4009 g_slist_foreach(list, x86_cpu_list_entry, NULL);
4010 g_slist_free(list);
4012 names = NULL;
4013 for (i = 0; i < ARRAY_SIZE(feature_word_info); i++) {
4014 FeatureWordInfo *fw = &feature_word_info[i];
4015 for (j = 0; j < 64; j++) {
4016 if (fw->feat_names[j]) {
4017 names = g_list_append(names, (gpointer)fw->feat_names[j]);
4022 names = g_list_sort(names, (GCompareFunc)strcmp);
4024 qemu_printf("\nRecognized CPUID flags:\n");
4025 listflags(names);
4026 qemu_printf("\n");
4027 g_list_free(names);
4030 static void x86_cpu_definition_entry(gpointer data, gpointer user_data)
4032 ObjectClass *oc = data;
4033 X86CPUClass *cc = X86_CPU_CLASS(oc);
4034 CpuDefinitionInfoList **cpu_list = user_data;
4035 CpuDefinitionInfoList *entry;
4036 CpuDefinitionInfo *info;
4038 info = g_malloc0(sizeof(*info));
4039 info->name = x86_cpu_class_get_model_name(cc);
4040 x86_cpu_class_check_missing_features(cc, &info->unavailable_features);
4041 info->has_unavailable_features = true;
4042 info->q_typename = g_strdup(object_class_get_name(oc));
4043 info->migration_safe = cc->migration_safe;
4044 info->has_migration_safe = true;
4045 info->q_static = cc->static_model;
4047 * Old machine types won't report aliases, so that alias translation
4048 * doesn't break compatibility with previous QEMU versions.
4050 if (default_cpu_version != CPU_VERSION_LEGACY) {
4051 info->alias_of = x86_cpu_class_get_alias_of(cc);
4052 info->has_alias_of = !!info->alias_of;
4055 entry = g_malloc0(sizeof(*entry));
4056 entry->value = info;
4057 entry->next = *cpu_list;
4058 *cpu_list = entry;
4061 CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
4063 CpuDefinitionInfoList *cpu_list = NULL;
4064 GSList *list = get_sorted_cpu_model_list();
4065 g_slist_foreach(list, x86_cpu_definition_entry, &cpu_list);
4066 g_slist_free(list);
4067 return cpu_list;
4070 static uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
4071 bool migratable_only)
4073 FeatureWordInfo *wi = &feature_word_info[w];
4074 uint64_t r = 0;
4076 if (kvm_enabled()) {
4077 switch (wi->type) {
4078 case CPUID_FEATURE_WORD:
4079 r = kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid.eax,
4080 wi->cpuid.ecx,
4081 wi->cpuid.reg);
4082 break;
4083 case MSR_FEATURE_WORD:
4084 r = kvm_arch_get_supported_msr_feature(kvm_state,
4085 wi->msr.index);
4086 break;
4088 } else if (hvf_enabled()) {
4089 if (wi->type != CPUID_FEATURE_WORD) {
4090 return 0;
4092 r = hvf_get_supported_cpuid(wi->cpuid.eax,
4093 wi->cpuid.ecx,
4094 wi->cpuid.reg);
4095 } else if (tcg_enabled()) {
4096 r = wi->tcg_features;
4097 } else {
4098 return ~0;
4100 if (migratable_only) {
4101 r &= x86_cpu_get_migratable_flags(w);
4103 return r;
4106 static void x86_cpu_apply_props(X86CPU *cpu, PropValue *props)
4108 PropValue *pv;
4109 for (pv = props; pv->prop; pv++) {
4110 if (!pv->value) {
4111 continue;
4113 object_property_parse(OBJECT(cpu), pv->value, pv->prop,
4114 &error_abort);
4118 /* Apply properties for the CPU model version specified in model */
4119 static void x86_cpu_apply_version_props(X86CPU *cpu, X86CPUModel *model)
4121 const X86CPUVersionDefinition *vdef;
4122 X86CPUVersion version = x86_cpu_model_resolve_version(model);
4124 if (version == CPU_VERSION_LEGACY) {
4125 return;
4128 for (vdef = x86_cpu_def_get_versions(model->cpudef); vdef->version; vdef++) {
4129 PropValue *p;
4131 for (p = vdef->props; p && p->prop; p++) {
4132 object_property_parse(OBJECT(cpu), p->value, p->prop,
4133 &error_abort);
4136 if (vdef->version == version) {
4137 break;
4142 * If we reached the end of the list, version number was invalid
4144 assert(vdef->version == version);
4147 /* Load data from X86CPUDefinition into a X86CPU object
4149 static void x86_cpu_load_model(X86CPU *cpu, X86CPUModel *model, Error **errp)
4151 X86CPUDefinition *def = model->cpudef;
4152 CPUX86State *env = &cpu->env;
4153 const char *vendor;
4154 char host_vendor[CPUID_VENDOR_SZ + 1];
4155 FeatureWord w;
4157 /*NOTE: any property set by this function should be returned by
4158 * x86_cpu_static_props(), so static expansion of
4159 * query-cpu-model-expansion is always complete.
4162 /* CPU models only set _minimum_ values for level/xlevel: */
4163 object_property_set_uint(OBJECT(cpu), def->level, "min-level", errp);
4164 object_property_set_uint(OBJECT(cpu), def->xlevel, "min-xlevel", errp);
4166 object_property_set_int(OBJECT(cpu), def->family, "family", errp);
4167 object_property_set_int(OBJECT(cpu), def->model, "model", errp);
4168 object_property_set_int(OBJECT(cpu), def->stepping, "stepping", errp);
4169 object_property_set_str(OBJECT(cpu), def->model_id, "model-id", errp);
4170 for (w = 0; w < FEATURE_WORDS; w++) {
4171 env->features[w] = def->features[w];
4174 /* legacy-cache defaults to 'off' if CPU model provides cache info */
4175 cpu->legacy_cache = !def->cache_info;
4177 /* Special cases not set in the X86CPUDefinition structs: */
4178 /* TODO: in-kernel irqchip for hvf */
4179 if (kvm_enabled()) {
4180 if (!kvm_irqchip_in_kernel()) {
4181 x86_cpu_change_kvm_default("x2apic", "off");
4184 x86_cpu_apply_props(cpu, kvm_default_props);
4185 } else if (tcg_enabled()) {
4186 x86_cpu_apply_props(cpu, tcg_default_props);
4189 env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR;
4191 /* sysenter isn't supported in compatibility mode on AMD,
4192 * syscall isn't supported in compatibility mode on Intel.
4193 * Normally we advertise the actual CPU vendor, but you can
4194 * override this using the 'vendor' property if you want to use
4195 * KVM's sysenter/syscall emulation in compatibility mode and
4196 * when doing cross vendor migration
4198 vendor = def->vendor;
4199 if (accel_uses_host_cpuid()) {
4200 uint32_t ebx = 0, ecx = 0, edx = 0;
4201 host_cpuid(0, 0, NULL, &ebx, &ecx, &edx);
4202 x86_cpu_vendor_words2str(host_vendor, ebx, edx, ecx);
4203 vendor = host_vendor;
4206 object_property_set_str(OBJECT(cpu), vendor, "vendor", errp);
4208 x86_cpu_apply_version_props(cpu, model);
4211 #ifndef CONFIG_USER_ONLY
4212 /* Return a QDict containing keys for all properties that can be included
4213 * in static expansion of CPU models. All properties set by x86_cpu_load_model()
4214 * must be included in the dictionary.
4216 static QDict *x86_cpu_static_props(void)
4218 FeatureWord w;
4219 int i;
4220 static const char *props[] = {
4221 "min-level",
4222 "min-xlevel",
4223 "family",
4224 "model",
4225 "stepping",
4226 "model-id",
4227 "vendor",
4228 "lmce",
4229 NULL,
4231 static QDict *d;
4233 if (d) {
4234 return d;
4237 d = qdict_new();
4238 for (i = 0; props[i]; i++) {
4239 qdict_put_null(d, props[i]);
4242 for (w = 0; w < FEATURE_WORDS; w++) {
4243 FeatureWordInfo *fi = &feature_word_info[w];
4244 int bit;
4245 for (bit = 0; bit < 64; bit++) {
4246 if (!fi->feat_names[bit]) {
4247 continue;
4249 qdict_put_null(d, fi->feat_names[bit]);
4253 return d;
4256 /* Add an entry to @props dict, with the value for property. */
4257 static void x86_cpu_expand_prop(X86CPU *cpu, QDict *props, const char *prop)
4259 QObject *value = object_property_get_qobject(OBJECT(cpu), prop,
4260 &error_abort);
4262 qdict_put_obj(props, prop, value);
4265 /* Convert CPU model data from X86CPU object to a property dictionary
4266 * that can recreate exactly the same CPU model.
4268 static void x86_cpu_to_dict(X86CPU *cpu, QDict *props)
4270 QDict *sprops = x86_cpu_static_props();
4271 const QDictEntry *e;
4273 for (e = qdict_first(sprops); e; e = qdict_next(sprops, e)) {
4274 const char *prop = qdict_entry_key(e);
4275 x86_cpu_expand_prop(cpu, props, prop);
4279 /* Convert CPU model data from X86CPU object to a property dictionary
4280 * that can recreate exactly the same CPU model, including every
4281 * writeable QOM property.
4283 static void x86_cpu_to_dict_full(X86CPU *cpu, QDict *props)
4285 ObjectPropertyIterator iter;
4286 ObjectProperty *prop;
4288 object_property_iter_init(&iter, OBJECT(cpu));
4289 while ((prop = object_property_iter_next(&iter))) {
4290 /* skip read-only or write-only properties */
4291 if (!prop->get || !prop->set) {
4292 continue;
4295 /* "hotplugged" is the only property that is configurable
4296 * on the command-line but will be set differently on CPUs
4297 * created using "-cpu ... -smp ..." and by CPUs created
4298 * on the fly by x86_cpu_from_model() for querying. Skip it.
4300 if (!strcmp(prop->name, "hotplugged")) {
4301 continue;
4303 x86_cpu_expand_prop(cpu, props, prop->name);
4307 static void object_apply_props(Object *obj, QDict *props, Error **errp)
4309 const QDictEntry *prop;
4310 Error *err = NULL;
4312 for (prop = qdict_first(props); prop; prop = qdict_next(props, prop)) {
4313 object_property_set_qobject(obj, qdict_entry_value(prop),
4314 qdict_entry_key(prop), &err);
4315 if (err) {
4316 break;
4320 error_propagate(errp, err);
4323 /* Create X86CPU object according to model+props specification */
4324 static X86CPU *x86_cpu_from_model(const char *model, QDict *props, Error **errp)
4326 X86CPU *xc = NULL;
4327 X86CPUClass *xcc;
4328 Error *err = NULL;
4330 xcc = X86_CPU_CLASS(cpu_class_by_name(TYPE_X86_CPU, model));
4331 if (xcc == NULL) {
4332 error_setg(&err, "CPU model '%s' not found", model);
4333 goto out;
4336 xc = X86_CPU(object_new(object_class_get_name(OBJECT_CLASS(xcc))));
4337 if (props) {
4338 object_apply_props(OBJECT(xc), props, &err);
4339 if (err) {
4340 goto out;
4344 x86_cpu_expand_features(xc, &err);
4345 if (err) {
4346 goto out;
4349 out:
4350 if (err) {
4351 error_propagate(errp, err);
4352 object_unref(OBJECT(xc));
4353 xc = NULL;
4355 return xc;
4358 CpuModelExpansionInfo *
4359 qmp_query_cpu_model_expansion(CpuModelExpansionType type,
4360 CpuModelInfo *model,
4361 Error **errp)
4363 X86CPU *xc = NULL;
4364 Error *err = NULL;
4365 CpuModelExpansionInfo *ret = g_new0(CpuModelExpansionInfo, 1);
4366 QDict *props = NULL;
4367 const char *base_name;
4369 xc = x86_cpu_from_model(model->name,
4370 model->has_props ?
4371 qobject_to(QDict, model->props) :
4372 NULL, &err);
4373 if (err) {
4374 goto out;
4377 props = qdict_new();
4378 ret->model = g_new0(CpuModelInfo, 1);
4379 ret->model->props = QOBJECT(props);
4380 ret->model->has_props = true;
4382 switch (type) {
4383 case CPU_MODEL_EXPANSION_TYPE_STATIC:
4384 /* Static expansion will be based on "base" only */
4385 base_name = "base";
4386 x86_cpu_to_dict(xc, props);
4387 break;
4388 case CPU_MODEL_EXPANSION_TYPE_FULL:
4389 /* As we don't return every single property, full expansion needs
4390 * to keep the original model name+props, and add extra
4391 * properties on top of that.
4393 base_name = model->name;
4394 x86_cpu_to_dict_full(xc, props);
4395 break;
4396 default:
4397 error_setg(&err, "Unsupported expansion type");
4398 goto out;
4401 x86_cpu_to_dict(xc, props);
4403 ret->model->name = g_strdup(base_name);
4405 out:
4406 object_unref(OBJECT(xc));
4407 if (err) {
4408 error_propagate(errp, err);
4409 qapi_free_CpuModelExpansionInfo(ret);
4410 ret = NULL;
4412 return ret;
4414 #endif /* !CONFIG_USER_ONLY */
4416 static gchar *x86_gdb_arch_name(CPUState *cs)
4418 #ifdef TARGET_X86_64
4419 return g_strdup("i386:x86-64");
4420 #else
4421 return g_strdup("i386");
4422 #endif
4425 static void x86_cpu_cpudef_class_init(ObjectClass *oc, void *data)
4427 X86CPUModel *model = data;
4428 X86CPUClass *xcc = X86_CPU_CLASS(oc);
4430 xcc->model = model;
4431 xcc->migration_safe = true;
4434 static void x86_register_cpu_model_type(const char *name, X86CPUModel *model)
4436 char *typename = x86_cpu_type_name(name);
4437 TypeInfo ti = {
4438 .name = typename,
4439 .parent = TYPE_X86_CPU,
4440 .class_init = x86_cpu_cpudef_class_init,
4441 .class_data = model,
4444 type_register(&ti);
4445 g_free(typename);
4448 static void x86_register_cpudef_types(X86CPUDefinition *def)
4450 X86CPUModel *m;
4451 const X86CPUVersionDefinition *vdef;
4452 char *name;
4454 /* AMD aliases are handled at runtime based on CPUID vendor, so
4455 * they shouldn't be set on the CPU model table.
4457 assert(!(def->features[FEAT_8000_0001_EDX] & CPUID_EXT2_AMD_ALIASES));
4458 /* catch mistakes instead of silently truncating model_id when too long */
4459 assert(def->model_id && strlen(def->model_id) <= 48);
4461 /* Unversioned model: */
4462 m = g_new0(X86CPUModel, 1);
4463 m->cpudef = def;
4464 m->version = CPU_VERSION_AUTO;
4465 m->is_alias = true;
4466 x86_register_cpu_model_type(def->name, m);
4468 /* Versioned models: */
4470 for (vdef = x86_cpu_def_get_versions(def); vdef->version; vdef++) {
4471 X86CPUModel *m = g_new0(X86CPUModel, 1);
4472 m->cpudef = def;
4473 m->version = vdef->version;
4474 name = x86_cpu_versioned_model_name(def, vdef->version);
4475 x86_register_cpu_model_type(name, m);
4476 g_free(name);
4478 if (vdef->alias) {
4479 X86CPUModel *am = g_new0(X86CPUModel, 1);
4480 am->cpudef = def;
4481 am->version = vdef->version;
4482 am->is_alias = true;
4483 x86_register_cpu_model_type(vdef->alias, am);
4489 #if !defined(CONFIG_USER_ONLY)
4491 void cpu_clear_apic_feature(CPUX86State *env)
4493 env->features[FEAT_1_EDX] &= ~CPUID_APIC;
4496 #endif /* !CONFIG_USER_ONLY */
4498 void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
4499 uint32_t *eax, uint32_t *ebx,
4500 uint32_t *ecx, uint32_t *edx)
4502 X86CPU *cpu = env_archcpu(env);
4503 CPUState *cs = env_cpu(env);
4504 uint32_t die_offset;
4505 uint32_t limit;
4506 uint32_t signature[3];
4508 /* Calculate & apply limits for different index ranges */
4509 if (index >= 0xC0000000) {
4510 limit = env->cpuid_xlevel2;
4511 } else if (index >= 0x80000000) {
4512 limit = env->cpuid_xlevel;
4513 } else if (index >= 0x40000000) {
4514 limit = 0x40000001;
4515 } else {
4516 limit = env->cpuid_level;
4519 if (index > limit) {
4520 /* Intel documentation states that invalid EAX input will
4521 * return the same information as EAX=cpuid_level
4522 * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID)
4524 index = env->cpuid_level;
4527 switch(index) {
4528 case 0:
4529 *eax = env->cpuid_level;
4530 *ebx = env->cpuid_vendor1;
4531 *edx = env->cpuid_vendor2;
4532 *ecx = env->cpuid_vendor3;
4533 break;
4534 case 1:
4535 *eax = env->cpuid_version;
4536 *ebx = (cpu->apic_id << 24) |
4537 8 << 8; /* CLFLUSH size in quad words, Linux wants it. */
4538 *ecx = env->features[FEAT_1_ECX];
4539 if ((*ecx & CPUID_EXT_XSAVE) && (env->cr[4] & CR4_OSXSAVE_MASK)) {
4540 *ecx |= CPUID_EXT_OSXSAVE;
4542 *edx = env->features[FEAT_1_EDX];
4543 if (cs->nr_cores * cs->nr_threads > 1) {
4544 *ebx |= (cs->nr_cores * cs->nr_threads) << 16;
4545 *edx |= CPUID_HT;
4547 break;
4548 case 2:
4549 /* cache info: needed for Pentium Pro compatibility */
4550 if (cpu->cache_info_passthrough) {
4551 host_cpuid(index, 0, eax, ebx, ecx, edx);
4552 break;
4554 *eax = 1; /* Number of CPUID[EAX=2] calls required */
4555 *ebx = 0;
4556 if (!cpu->enable_l3_cache) {
4557 *ecx = 0;
4558 } else {
4559 *ecx = cpuid2_cache_descriptor(env->cache_info_cpuid2.l3_cache);
4561 *edx = (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1d_cache) << 16) |
4562 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1i_cache) << 8) |
4563 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l2_cache));
4564 break;
4565 case 4:
4566 /* cache info: needed for Core compatibility */
4567 if (cpu->cache_info_passthrough) {
4568 host_cpuid(index, count, eax, ebx, ecx, edx);
4569 /* QEMU gives out its own APIC IDs, never pass down bits 31..26. */
4570 *eax &= ~0xFC000000;
4571 if ((*eax & 31) && cs->nr_cores > 1) {
4572 *eax |= (cs->nr_cores - 1) << 26;
4574 } else {
4575 *eax = 0;
4576 switch (count) {
4577 case 0: /* L1 dcache info */
4578 encode_cache_cpuid4(env->cache_info_cpuid4.l1d_cache,
4579 1, cs->nr_cores,
4580 eax, ebx, ecx, edx);
4581 break;
4582 case 1: /* L1 icache info */
4583 encode_cache_cpuid4(env->cache_info_cpuid4.l1i_cache,
4584 1, cs->nr_cores,
4585 eax, ebx, ecx, edx);
4586 break;
4587 case 2: /* L2 cache info */
4588 encode_cache_cpuid4(env->cache_info_cpuid4.l2_cache,
4589 cs->nr_threads, cs->nr_cores,
4590 eax, ebx, ecx, edx);
4591 break;
4592 case 3: /* L3 cache info */
4593 die_offset = apicid_die_offset(env->nr_dies,
4594 cs->nr_cores, cs->nr_threads);
4595 if (cpu->enable_l3_cache) {
4596 encode_cache_cpuid4(env->cache_info_cpuid4.l3_cache,
4597 (1 << die_offset), cs->nr_cores,
4598 eax, ebx, ecx, edx);
4599 break;
4601 /* fall through */
4602 default: /* end of info */
4603 *eax = *ebx = *ecx = *edx = 0;
4604 break;
4607 break;
4608 case 5:
4609 /* MONITOR/MWAIT Leaf */
4610 *eax = cpu->mwait.eax; /* Smallest monitor-line size in bytes */
4611 *ebx = cpu->mwait.ebx; /* Largest monitor-line size in bytes */
4612 *ecx = cpu->mwait.ecx; /* flags */
4613 *edx = cpu->mwait.edx; /* mwait substates */
4614 break;
4615 case 6:
4616 /* Thermal and Power Leaf */
4617 *eax = env->features[FEAT_6_EAX];
4618 *ebx = 0;
4619 *ecx = 0;
4620 *edx = 0;
4621 break;
4622 case 7:
4623 /* Structured Extended Feature Flags Enumeration Leaf */
4624 if (count == 0) {
4625 /* Maximum ECX value for sub-leaves */
4626 *eax = env->cpuid_level_func7;
4627 *ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */
4628 *ecx = env->features[FEAT_7_0_ECX]; /* Feature flags */
4629 if ((*ecx & CPUID_7_0_ECX_PKU) && env->cr[4] & CR4_PKE_MASK) {
4630 *ecx |= CPUID_7_0_ECX_OSPKE;
4632 *edx = env->features[FEAT_7_0_EDX]; /* Feature flags */
4633 } else if (count == 1) {
4634 *eax = env->features[FEAT_7_1_EAX];
4635 *ebx = 0;
4636 *ecx = 0;
4637 *edx = 0;
4638 } else {
4639 *eax = 0;
4640 *ebx = 0;
4641 *ecx = 0;
4642 *edx = 0;
4644 break;
4645 case 9:
4646 /* Direct Cache Access Information Leaf */
4647 *eax = 0; /* Bits 0-31 in DCA_CAP MSR */
4648 *ebx = 0;
4649 *ecx = 0;
4650 *edx = 0;
4651 break;
4652 case 0xA:
4653 /* Architectural Performance Monitoring Leaf */
4654 if (kvm_enabled() && cpu->enable_pmu) {
4655 KVMState *s = cs->kvm_state;
4657 *eax = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EAX);
4658 *ebx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EBX);
4659 *ecx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_ECX);
4660 *edx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EDX);
4661 } else if (hvf_enabled() && cpu->enable_pmu) {
4662 *eax = hvf_get_supported_cpuid(0xA, count, R_EAX);
4663 *ebx = hvf_get_supported_cpuid(0xA, count, R_EBX);
4664 *ecx = hvf_get_supported_cpuid(0xA, count, R_ECX);
4665 *edx = hvf_get_supported_cpuid(0xA, count, R_EDX);
4666 } else {
4667 *eax = 0;
4668 *ebx = 0;
4669 *ecx = 0;
4670 *edx = 0;
4672 break;
4673 case 0xB:
4674 /* Extended Topology Enumeration Leaf */
4675 if (!cpu->enable_cpuid_0xb) {
4676 *eax = *ebx = *ecx = *edx = 0;
4677 break;
4680 *ecx = count & 0xff;
4681 *edx = cpu->apic_id;
4683 switch (count) {
4684 case 0:
4685 *eax = apicid_core_offset(env->nr_dies,
4686 cs->nr_cores, cs->nr_threads);
4687 *ebx = cs->nr_threads;
4688 *ecx |= CPUID_TOPOLOGY_LEVEL_SMT;
4689 break;
4690 case 1:
4691 *eax = apicid_pkg_offset(env->nr_dies,
4692 cs->nr_cores, cs->nr_threads);
4693 *ebx = cs->nr_cores * cs->nr_threads;
4694 *ecx |= CPUID_TOPOLOGY_LEVEL_CORE;
4695 break;
4696 default:
4697 *eax = 0;
4698 *ebx = 0;
4699 *ecx |= CPUID_TOPOLOGY_LEVEL_INVALID;
4702 assert(!(*eax & ~0x1f));
4703 *ebx &= 0xffff; /* The count doesn't need to be reliable. */
4704 break;
4705 case 0x1F:
4706 /* V2 Extended Topology Enumeration Leaf */
4707 if (env->nr_dies < 2) {
4708 *eax = *ebx = *ecx = *edx = 0;
4709 break;
4712 *ecx = count & 0xff;
4713 *edx = cpu->apic_id;
4714 switch (count) {
4715 case 0:
4716 *eax = apicid_core_offset(env->nr_dies, cs->nr_cores,
4717 cs->nr_threads);
4718 *ebx = cs->nr_threads;
4719 *ecx |= CPUID_TOPOLOGY_LEVEL_SMT;
4720 break;
4721 case 1:
4722 *eax = apicid_die_offset(env->nr_dies, cs->nr_cores,
4723 cs->nr_threads);
4724 *ebx = cs->nr_cores * cs->nr_threads;
4725 *ecx |= CPUID_TOPOLOGY_LEVEL_CORE;
4726 break;
4727 case 2:
4728 *eax = apicid_pkg_offset(env->nr_dies, cs->nr_cores,
4729 cs->nr_threads);
4730 *ebx = env->nr_dies * cs->nr_cores * cs->nr_threads;
4731 *ecx |= CPUID_TOPOLOGY_LEVEL_DIE;
4732 break;
4733 default:
4734 *eax = 0;
4735 *ebx = 0;
4736 *ecx |= CPUID_TOPOLOGY_LEVEL_INVALID;
4738 assert(!(*eax & ~0x1f));
4739 *ebx &= 0xffff; /* The count doesn't need to be reliable. */
4740 break;
4741 case 0xD: {
4742 /* Processor Extended State */
4743 *eax = 0;
4744 *ebx = 0;
4745 *ecx = 0;
4746 *edx = 0;
4747 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
4748 break;
4751 if (count == 0) {
4752 *ecx = xsave_area_size(x86_cpu_xsave_components(cpu));
4753 *eax = env->features[FEAT_XSAVE_COMP_LO];
4754 *edx = env->features[FEAT_XSAVE_COMP_HI];
4756 * The initial value of xcr0 and ebx == 0, On host without kvm
4757 * commit 412a3c41(e.g., CentOS 6), the ebx's value always == 0
4758 * even through guest update xcr0, this will crash some legacy guest
4759 * (e.g., CentOS 6), So set ebx == ecx to workaroud it.
4761 *ebx = kvm_enabled() ? *ecx : xsave_area_size(env->xcr0);
4762 } else if (count == 1) {
4763 *eax = env->features[FEAT_XSAVE];
4764 } else if (count < ARRAY_SIZE(x86_ext_save_areas)) {
4765 if ((x86_cpu_xsave_components(cpu) >> count) & 1) {
4766 const ExtSaveArea *esa = &x86_ext_save_areas[count];
4767 *eax = esa->size;
4768 *ebx = esa->offset;
4771 break;
4773 case 0x14: {
4774 /* Intel Processor Trace Enumeration */
4775 *eax = 0;
4776 *ebx = 0;
4777 *ecx = 0;
4778 *edx = 0;
4779 if (!(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) ||
4780 !kvm_enabled()) {
4781 break;
4784 if (count == 0) {
4785 *eax = INTEL_PT_MAX_SUBLEAF;
4786 *ebx = INTEL_PT_MINIMAL_EBX;
4787 *ecx = INTEL_PT_MINIMAL_ECX;
4788 } else if (count == 1) {
4789 *eax = INTEL_PT_MTC_BITMAP | INTEL_PT_ADDR_RANGES_NUM;
4790 *ebx = INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP;
4792 break;
4794 case 0x40000000:
4796 * CPUID code in kvm_arch_init_vcpu() ignores stuff
4797 * set here, but we restrict to TCG none the less.
4799 if (tcg_enabled() && cpu->expose_tcg) {
4800 memcpy(signature, "TCGTCGTCGTCG", 12);
4801 *eax = 0x40000001;
4802 *ebx = signature[0];
4803 *ecx = signature[1];
4804 *edx = signature[2];
4805 } else {
4806 *eax = 0;
4807 *ebx = 0;
4808 *ecx = 0;
4809 *edx = 0;
4811 break;
4812 case 0x40000001:
4813 *eax = 0;
4814 *ebx = 0;
4815 *ecx = 0;
4816 *edx = 0;
4817 break;
4818 case 0x80000000:
4819 *eax = env->cpuid_xlevel;
4820 *ebx = env->cpuid_vendor1;
4821 *edx = env->cpuid_vendor2;
4822 *ecx = env->cpuid_vendor3;
4823 break;
4824 case 0x80000001:
4825 *eax = env->cpuid_version;
4826 *ebx = 0;
4827 *ecx = env->features[FEAT_8000_0001_ECX];
4828 *edx = env->features[FEAT_8000_0001_EDX];
4830 /* The Linux kernel checks for the CMPLegacy bit and
4831 * discards multiple thread information if it is set.
4832 * So don't set it here for Intel to make Linux guests happy.
4834 if (cs->nr_cores * cs->nr_threads > 1) {
4835 if (env->cpuid_vendor1 != CPUID_VENDOR_INTEL_1 ||
4836 env->cpuid_vendor2 != CPUID_VENDOR_INTEL_2 ||
4837 env->cpuid_vendor3 != CPUID_VENDOR_INTEL_3) {
4838 *ecx |= 1 << 1; /* CmpLegacy bit */
4841 break;
4842 case 0x80000002:
4843 case 0x80000003:
4844 case 0x80000004:
4845 *eax = env->cpuid_model[(index - 0x80000002) * 4 + 0];
4846 *ebx = env->cpuid_model[(index - 0x80000002) * 4 + 1];
4847 *ecx = env->cpuid_model[(index - 0x80000002) * 4 + 2];
4848 *edx = env->cpuid_model[(index - 0x80000002) * 4 + 3];
4849 break;
4850 case 0x80000005:
4851 /* cache info (L1 cache) */
4852 if (cpu->cache_info_passthrough) {
4853 host_cpuid(index, 0, eax, ebx, ecx, edx);
4854 break;
4856 *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) | \
4857 (L1_ITLB_2M_ASSOC << 8) | (L1_ITLB_2M_ENTRIES);
4858 *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) | \
4859 (L1_ITLB_4K_ASSOC << 8) | (L1_ITLB_4K_ENTRIES);
4860 *ecx = encode_cache_cpuid80000005(env->cache_info_amd.l1d_cache);
4861 *edx = encode_cache_cpuid80000005(env->cache_info_amd.l1i_cache);
4862 break;
4863 case 0x80000006:
4864 /* cache info (L2 cache) */
4865 if (cpu->cache_info_passthrough) {
4866 host_cpuid(index, 0, eax, ebx, ecx, edx);
4867 break;
4869 *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) | \
4870 (L2_DTLB_2M_ENTRIES << 16) | \
4871 (AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) | \
4872 (L2_ITLB_2M_ENTRIES);
4873 *ebx = (AMD_ENC_ASSOC(L2_DTLB_4K_ASSOC) << 28) | \
4874 (L2_DTLB_4K_ENTRIES << 16) | \
4875 (AMD_ENC_ASSOC(L2_ITLB_4K_ASSOC) << 12) | \
4876 (L2_ITLB_4K_ENTRIES);
4877 encode_cache_cpuid80000006(env->cache_info_amd.l2_cache,
4878 cpu->enable_l3_cache ?
4879 env->cache_info_amd.l3_cache : NULL,
4880 ecx, edx);
4881 break;
4882 case 0x80000007:
4883 *eax = 0;
4884 *ebx = 0;
4885 *ecx = 0;
4886 *edx = env->features[FEAT_8000_0007_EDX];
4887 break;
4888 case 0x80000008:
4889 /* virtual & phys address size in low 2 bytes. */
4890 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
4891 /* 64 bit processor */
4892 *eax = cpu->phys_bits; /* configurable physical bits */
4893 if (env->features[FEAT_7_0_ECX] & CPUID_7_0_ECX_LA57) {
4894 *eax |= 0x00003900; /* 57 bits virtual */
4895 } else {
4896 *eax |= 0x00003000; /* 48 bits virtual */
4898 } else {
4899 *eax = cpu->phys_bits;
4901 *ebx = env->features[FEAT_8000_0008_EBX];
4902 *ecx = 0;
4903 *edx = 0;
4904 if (cs->nr_cores * cs->nr_threads > 1) {
4905 *ecx |= (cs->nr_cores * cs->nr_threads) - 1;
4907 break;
4908 case 0x8000000A:
4909 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
4910 *eax = 0x00000001; /* SVM Revision */
4911 *ebx = 0x00000010; /* nr of ASIDs */
4912 *ecx = 0;
4913 *edx = env->features[FEAT_SVM]; /* optional features */
4914 } else {
4915 *eax = 0;
4916 *ebx = 0;
4917 *ecx = 0;
4918 *edx = 0;
4920 break;
4921 case 0x8000001D:
4922 *eax = 0;
4923 if (cpu->cache_info_passthrough) {
4924 host_cpuid(index, count, eax, ebx, ecx, edx);
4925 break;
4927 switch (count) {
4928 case 0: /* L1 dcache info */
4929 encode_cache_cpuid8000001d(env->cache_info_amd.l1d_cache, cs,
4930 eax, ebx, ecx, edx);
4931 break;
4932 case 1: /* L1 icache info */
4933 encode_cache_cpuid8000001d(env->cache_info_amd.l1i_cache, cs,
4934 eax, ebx, ecx, edx);
4935 break;
4936 case 2: /* L2 cache info */
4937 encode_cache_cpuid8000001d(env->cache_info_amd.l2_cache, cs,
4938 eax, ebx, ecx, edx);
4939 break;
4940 case 3: /* L3 cache info */
4941 encode_cache_cpuid8000001d(env->cache_info_amd.l3_cache, cs,
4942 eax, ebx, ecx, edx);
4943 break;
4944 default: /* end of info */
4945 *eax = *ebx = *ecx = *edx = 0;
4946 break;
4948 break;
4949 case 0x8000001E:
4950 assert(cpu->core_id <= 255);
4951 encode_topo_cpuid8000001e(cs, cpu,
4952 eax, ebx, ecx, edx);
4953 break;
4954 case 0xC0000000:
4955 *eax = env->cpuid_xlevel2;
4956 *ebx = 0;
4957 *ecx = 0;
4958 *edx = 0;
4959 break;
4960 case 0xC0000001:
4961 /* Support for VIA CPU's CPUID instruction */
4962 *eax = env->cpuid_version;
4963 *ebx = 0;
4964 *ecx = 0;
4965 *edx = env->features[FEAT_C000_0001_EDX];
4966 break;
4967 case 0xC0000002:
4968 case 0xC0000003:
4969 case 0xC0000004:
4970 /* Reserved for the future, and now filled with zero */
4971 *eax = 0;
4972 *ebx = 0;
4973 *ecx = 0;
4974 *edx = 0;
4975 break;
4976 case 0x8000001F:
4977 *eax = sev_enabled() ? 0x2 : 0;
4978 *ebx = sev_get_cbit_position();
4979 *ebx |= sev_get_reduced_phys_bits() << 6;
4980 *ecx = 0;
4981 *edx = 0;
4982 break;
4983 default:
4984 /* reserved values: zero */
4985 *eax = 0;
4986 *ebx = 0;
4987 *ecx = 0;
4988 *edx = 0;
4989 break;
4993 /* CPUClass::reset() */
4994 static void x86_cpu_reset(CPUState *s)
4996 X86CPU *cpu = X86_CPU(s);
4997 X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu);
4998 CPUX86State *env = &cpu->env;
4999 target_ulong cr4;
5000 uint64_t xcr0;
5001 int i;
5003 xcc->parent_reset(s);
5005 memset(env, 0, offsetof(CPUX86State, end_reset_fields));
5007 env->old_exception = -1;
5009 /* init to reset state */
5011 env->hflags2 |= HF2_GIF_MASK;
5013 cpu_x86_update_cr0(env, 0x60000010);
5014 env->a20_mask = ~0x0;
5015 env->smbase = 0x30000;
5016 env->msr_smi_count = 0;
5018 env->idt.limit = 0xffff;
5019 env->gdt.limit = 0xffff;
5020 env->ldt.limit = 0xffff;
5021 env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT);
5022 env->tr.limit = 0xffff;
5023 env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT);
5025 cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff,
5026 DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK |
5027 DESC_R_MASK | DESC_A_MASK);
5028 cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff,
5029 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
5030 DESC_A_MASK);
5031 cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff,
5032 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
5033 DESC_A_MASK);
5034 cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff,
5035 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
5036 DESC_A_MASK);
5037 cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff,
5038 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
5039 DESC_A_MASK);
5040 cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff,
5041 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
5042 DESC_A_MASK);
5044 env->eip = 0xfff0;
5045 env->regs[R_EDX] = env->cpuid_version;
5047 env->eflags = 0x2;
5049 /* FPU init */
5050 for (i = 0; i < 8; i++) {
5051 env->fptags[i] = 1;
5053 cpu_set_fpuc(env, 0x37f);
5055 env->mxcsr = 0x1f80;
5056 /* All units are in INIT state. */
5057 env->xstate_bv = 0;
5059 env->pat = 0x0007040600070406ULL;
5060 env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT;
5061 if (env->features[FEAT_1_ECX] & CPUID_EXT_MONITOR) {
5062 env->msr_ia32_misc_enable |= MSR_IA32_MISC_ENABLE_MWAIT;
5065 memset(env->dr, 0, sizeof(env->dr));
5066 env->dr[6] = DR6_FIXED_1;
5067 env->dr[7] = DR7_FIXED_1;
5068 cpu_breakpoint_remove_all(s, BP_CPU);
5069 cpu_watchpoint_remove_all(s, BP_CPU);
5071 cr4 = 0;
5072 xcr0 = XSTATE_FP_MASK;
5074 #ifdef CONFIG_USER_ONLY
5075 /* Enable all the features for user-mode. */
5076 if (env->features[FEAT_1_EDX] & CPUID_SSE) {
5077 xcr0 |= XSTATE_SSE_MASK;
5079 for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
5080 const ExtSaveArea *esa = &x86_ext_save_areas[i];
5081 if (env->features[esa->feature] & esa->bits) {
5082 xcr0 |= 1ull << i;
5086 if (env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE) {
5087 cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK;
5089 if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_FSGSBASE) {
5090 cr4 |= CR4_FSGSBASE_MASK;
5092 #endif
5094 env->xcr0 = xcr0;
5095 cpu_x86_update_cr4(env, cr4);
5098 * SDM 11.11.5 requires:
5099 * - IA32_MTRR_DEF_TYPE MSR.E = 0
5100 * - IA32_MTRR_PHYSMASKn.V = 0
5101 * All other bits are undefined. For simplification, zero it all.
5103 env->mtrr_deftype = 0;
5104 memset(env->mtrr_var, 0, sizeof(env->mtrr_var));
5105 memset(env->mtrr_fixed, 0, sizeof(env->mtrr_fixed));
5107 env->interrupt_injected = -1;
5108 env->exception_nr = -1;
5109 env->exception_pending = 0;
5110 env->exception_injected = 0;
5111 env->exception_has_payload = false;
5112 env->exception_payload = 0;
5113 env->nmi_injected = false;
5114 #if !defined(CONFIG_USER_ONLY)
5115 /* We hard-wire the BSP to the first CPU. */
5116 apic_designate_bsp(cpu->apic_state, s->cpu_index == 0);
5118 s->halted = !cpu_is_bsp(cpu);
5120 if (kvm_enabled()) {
5121 kvm_arch_reset_vcpu(cpu);
5123 else if (hvf_enabled()) {
5124 hvf_reset_vcpu(s);
5126 #endif
5129 #ifndef CONFIG_USER_ONLY
5130 bool cpu_is_bsp(X86CPU *cpu)
5132 return cpu_get_apic_base(cpu->apic_state) & MSR_IA32_APICBASE_BSP;
5135 /* TODO: remove me, when reset over QOM tree is implemented */
5136 static void x86_cpu_machine_reset_cb(void *opaque)
5138 X86CPU *cpu = opaque;
5139 cpu_reset(CPU(cpu));
5141 #endif
5143 static void mce_init(X86CPU *cpu)
5145 CPUX86State *cenv = &cpu->env;
5146 unsigned int bank;
5148 if (((cenv->cpuid_version >> 8) & 0xf) >= 6
5149 && (cenv->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) ==
5150 (CPUID_MCE | CPUID_MCA)) {
5151 cenv->mcg_cap = MCE_CAP_DEF | MCE_BANKS_DEF |
5152 (cpu->enable_lmce ? MCG_LMCE_P : 0);
5153 cenv->mcg_ctl = ~(uint64_t)0;
5154 for (bank = 0; bank < MCE_BANKS_DEF; bank++) {
5155 cenv->mce_banks[bank * 4] = ~(uint64_t)0;
5160 #ifndef CONFIG_USER_ONLY
5161 APICCommonClass *apic_get_class(void)
5163 const char *apic_type = "apic";
5165 /* TODO: in-kernel irqchip for hvf */
5166 if (kvm_apic_in_kernel()) {
5167 apic_type = "kvm-apic";
5168 } else if (xen_enabled()) {
5169 apic_type = "xen-apic";
5172 return APIC_COMMON_CLASS(object_class_by_name(apic_type));
5175 static void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
5177 APICCommonState *apic;
5178 ObjectClass *apic_class = OBJECT_CLASS(apic_get_class());
5180 cpu->apic_state = DEVICE(object_new(object_class_get_name(apic_class)));
5182 object_property_add_child(OBJECT(cpu), "lapic",
5183 OBJECT(cpu->apic_state), &error_abort);
5184 object_unref(OBJECT(cpu->apic_state));
5186 qdev_prop_set_uint32(cpu->apic_state, "id", cpu->apic_id);
5187 /* TODO: convert to link<> */
5188 apic = APIC_COMMON(cpu->apic_state);
5189 apic->cpu = cpu;
5190 apic->apicbase = APIC_DEFAULT_ADDRESS | MSR_IA32_APICBASE_ENABLE;
5193 static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
5195 APICCommonState *apic;
5196 static bool apic_mmio_map_once;
5198 if (cpu->apic_state == NULL) {
5199 return;
5201 object_property_set_bool(OBJECT(cpu->apic_state), true, "realized",
5202 errp);
5204 /* Map APIC MMIO area */
5205 apic = APIC_COMMON(cpu->apic_state);
5206 if (!apic_mmio_map_once) {
5207 memory_region_add_subregion_overlap(get_system_memory(),
5208 apic->apicbase &
5209 MSR_IA32_APICBASE_BASE,
5210 &apic->io_memory,
5211 0x1000);
5212 apic_mmio_map_once = true;
5216 static void x86_cpu_machine_done(Notifier *n, void *unused)
5218 X86CPU *cpu = container_of(n, X86CPU, machine_done);
5219 MemoryRegion *smram =
5220 (MemoryRegion *) object_resolve_path("/machine/smram", NULL);
5222 if (smram) {
5223 cpu->smram = g_new(MemoryRegion, 1);
5224 memory_region_init_alias(cpu->smram, OBJECT(cpu), "smram",
5225 smram, 0, 1ull << 32);
5226 memory_region_set_enabled(cpu->smram, true);
5227 memory_region_add_subregion_overlap(cpu->cpu_as_root, 0, cpu->smram, 1);
5230 #else
5231 static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
5234 #endif
5236 /* Note: Only safe for use on x86(-64) hosts */
5237 static uint32_t x86_host_phys_bits(void)
5239 uint32_t eax;
5240 uint32_t host_phys_bits;
5242 host_cpuid(0x80000000, 0, &eax, NULL, NULL, NULL);
5243 if (eax >= 0x80000008) {
5244 host_cpuid(0x80000008, 0, &eax, NULL, NULL, NULL);
5245 /* Note: According to AMD doc 25481 rev 2.34 they have a field
5246 * at 23:16 that can specify a maximum physical address bits for
5247 * the guest that can override this value; but I've not seen
5248 * anything with that set.
5250 host_phys_bits = eax & 0xff;
5251 } else {
5252 /* It's an odd 64 bit machine that doesn't have the leaf for
5253 * physical address bits; fall back to 36 that's most older
5254 * Intel.
5256 host_phys_bits = 36;
5259 return host_phys_bits;
5262 static void x86_cpu_adjust_level(X86CPU *cpu, uint32_t *min, uint32_t value)
5264 if (*min < value) {
5265 *min = value;
5269 /* Increase cpuid_min_{level,xlevel,xlevel2} automatically, if appropriate */
5270 static void x86_cpu_adjust_feat_level(X86CPU *cpu, FeatureWord w)
5272 CPUX86State *env = &cpu->env;
5273 FeatureWordInfo *fi = &feature_word_info[w];
5274 uint32_t eax = fi->cpuid.eax;
5275 uint32_t region = eax & 0xF0000000;
5277 assert(feature_word_info[w].type == CPUID_FEATURE_WORD);
5278 if (!env->features[w]) {
5279 return;
5282 switch (region) {
5283 case 0x00000000:
5284 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, eax);
5285 break;
5286 case 0x80000000:
5287 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, eax);
5288 break;
5289 case 0xC0000000:
5290 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel2, eax);
5291 break;
5294 if (eax == 7) {
5295 x86_cpu_adjust_level(cpu, &env->cpuid_min_level_func7,
5296 fi->cpuid.ecx);
5300 /* Calculate XSAVE components based on the configured CPU feature flags */
5301 static void x86_cpu_enable_xsave_components(X86CPU *cpu)
5303 CPUX86State *env = &cpu->env;
5304 int i;
5305 uint64_t mask;
5307 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
5308 return;
5311 mask = 0;
5312 for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
5313 const ExtSaveArea *esa = &x86_ext_save_areas[i];
5314 if (env->features[esa->feature] & esa->bits) {
5315 mask |= (1ULL << i);
5319 env->features[FEAT_XSAVE_COMP_LO] = mask;
5320 env->features[FEAT_XSAVE_COMP_HI] = mask >> 32;
5323 /***** Steps involved on loading and filtering CPUID data
5325 * When initializing and realizing a CPU object, the steps
5326 * involved in setting up CPUID data are:
5328 * 1) Loading CPU model definition (X86CPUDefinition). This is
5329 * implemented by x86_cpu_load_model() and should be completely
5330 * transparent, as it is done automatically by instance_init.
5331 * No code should need to look at X86CPUDefinition structs
5332 * outside instance_init.
5334 * 2) CPU expansion. This is done by realize before CPUID
5335 * filtering, and will make sure host/accelerator data is
5336 * loaded for CPU models that depend on host capabilities
5337 * (e.g. "host"). Done by x86_cpu_expand_features().
5339 * 3) CPUID filtering. This initializes extra data related to
5340 * CPUID, and checks if the host supports all capabilities
5341 * required by the CPU. Runnability of a CPU model is
5342 * determined at this step. Done by x86_cpu_filter_features().
5344 * Some operations don't require all steps to be performed.
5345 * More precisely:
5347 * - CPU instance creation (instance_init) will run only CPU
5348 * model loading. CPU expansion can't run at instance_init-time
5349 * because host/accelerator data may be not available yet.
5350 * - CPU realization will perform both CPU model expansion and CPUID
5351 * filtering, and return an error in case one of them fails.
5352 * - query-cpu-definitions needs to run all 3 steps. It needs
5353 * to run CPUID filtering, as the 'unavailable-features'
5354 * field is set based on the filtering results.
5355 * - The query-cpu-model-expansion QMP command only needs to run
5356 * CPU model loading and CPU expansion. It should not filter
5357 * any CPUID data based on host capabilities.
5360 /* Expand CPU configuration data, based on configured features
5361 * and host/accelerator capabilities when appropriate.
5363 static void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
5365 CPUX86State *env = &cpu->env;
5366 FeatureWord w;
5367 int i;
5368 GList *l;
5369 Error *local_err = NULL;
5371 for (l = plus_features; l; l = l->next) {
5372 const char *prop = l->data;
5373 object_property_set_bool(OBJECT(cpu), true, prop, &local_err);
5374 if (local_err) {
5375 goto out;
5379 for (l = minus_features; l; l = l->next) {
5380 const char *prop = l->data;
5381 object_property_set_bool(OBJECT(cpu), false, prop, &local_err);
5382 if (local_err) {
5383 goto out;
5387 /*TODO: Now cpu->max_features doesn't overwrite features
5388 * set using QOM properties, and we can convert
5389 * plus_features & minus_features to global properties
5390 * inside x86_cpu_parse_featurestr() too.
5392 if (cpu->max_features) {
5393 for (w = 0; w < FEATURE_WORDS; w++) {
5394 /* Override only features that weren't set explicitly
5395 * by the user.
5397 env->features[w] |=
5398 x86_cpu_get_supported_feature_word(w, cpu->migratable) &
5399 ~env->user_features[w] & \
5400 ~feature_word_info[w].no_autoenable_flags;
5404 for (i = 0; i < ARRAY_SIZE(feature_dependencies); i++) {
5405 FeatureDep *d = &feature_dependencies[i];
5406 if (!(env->features[d->from.index] & d->from.mask)) {
5407 uint64_t unavailable_features = env->features[d->to.index] & d->to.mask;
5409 /* Not an error unless the dependent feature was added explicitly. */
5410 mark_unavailable_features(cpu, d->to.index,
5411 unavailable_features & env->user_features[d->to.index],
5412 "This feature depends on other features that were not requested");
5414 env->user_features[d->to.index] |= unavailable_features;
5415 env->features[d->to.index] &= ~unavailable_features;
5419 if (!kvm_enabled() || !cpu->expose_kvm) {
5420 env->features[FEAT_KVM] = 0;
5423 x86_cpu_enable_xsave_components(cpu);
5425 /* CPUID[EAX=7,ECX=0].EBX always increased level automatically: */
5426 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_EBX);
5427 if (cpu->full_cpuid_auto_level) {
5428 x86_cpu_adjust_feat_level(cpu, FEAT_1_EDX);
5429 x86_cpu_adjust_feat_level(cpu, FEAT_1_ECX);
5430 x86_cpu_adjust_feat_level(cpu, FEAT_6_EAX);
5431 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_ECX);
5432 x86_cpu_adjust_feat_level(cpu, FEAT_7_1_EAX);
5433 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_EDX);
5434 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_ECX);
5435 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0007_EDX);
5436 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0008_EBX);
5437 x86_cpu_adjust_feat_level(cpu, FEAT_C000_0001_EDX);
5438 x86_cpu_adjust_feat_level(cpu, FEAT_SVM);
5439 x86_cpu_adjust_feat_level(cpu, FEAT_XSAVE);
5441 /* Intel Processor Trace requires CPUID[0x14] */
5442 if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) &&
5443 kvm_enabled() && cpu->intel_pt_auto_level) {
5444 x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14);
5447 /* CPU topology with multi-dies support requires CPUID[0x1F] */
5448 if (env->nr_dies > 1) {
5449 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x1F);
5452 /* SVM requires CPUID[0x8000000A] */
5453 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
5454 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000000A);
5457 /* SEV requires CPUID[0x8000001F] */
5458 if (sev_enabled()) {
5459 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000001F);
5463 /* Set cpuid_*level* based on cpuid_min_*level, if not explicitly set */
5464 if (env->cpuid_level_func7 == UINT32_MAX) {
5465 env->cpuid_level_func7 = env->cpuid_min_level_func7;
5467 if (env->cpuid_level == UINT32_MAX) {
5468 env->cpuid_level = env->cpuid_min_level;
5470 if (env->cpuid_xlevel == UINT32_MAX) {
5471 env->cpuid_xlevel = env->cpuid_min_xlevel;
5473 if (env->cpuid_xlevel2 == UINT32_MAX) {
5474 env->cpuid_xlevel2 = env->cpuid_min_xlevel2;
5477 out:
5478 if (local_err != NULL) {
5479 error_propagate(errp, local_err);
5484 * Finishes initialization of CPUID data, filters CPU feature
5485 * words based on host availability of each feature.
5487 * Returns: 0 if all flags are supported by the host, non-zero otherwise.
5489 static void x86_cpu_filter_features(X86CPU *cpu, bool verbose)
5491 CPUX86State *env = &cpu->env;
5492 FeatureWord w;
5493 const char *prefix = NULL;
5495 if (verbose) {
5496 prefix = accel_uses_host_cpuid()
5497 ? "host doesn't support requested feature"
5498 : "TCG doesn't support requested feature";
5501 for (w = 0; w < FEATURE_WORDS; w++) {
5502 uint64_t host_feat =
5503 x86_cpu_get_supported_feature_word(w, false);
5504 uint64_t requested_features = env->features[w];
5505 uint64_t unavailable_features = requested_features & ~host_feat;
5506 mark_unavailable_features(cpu, w, unavailable_features, prefix);
5509 if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) &&
5510 kvm_enabled()) {
5511 KVMState *s = CPU(cpu)->kvm_state;
5512 uint32_t eax_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EAX);
5513 uint32_t ebx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EBX);
5514 uint32_t ecx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_ECX);
5515 uint32_t eax_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EAX);
5516 uint32_t ebx_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EBX);
5518 if (!eax_0 ||
5519 ((ebx_0 & INTEL_PT_MINIMAL_EBX) != INTEL_PT_MINIMAL_EBX) ||
5520 ((ecx_0 & INTEL_PT_MINIMAL_ECX) != INTEL_PT_MINIMAL_ECX) ||
5521 ((eax_1 & INTEL_PT_MTC_BITMAP) != INTEL_PT_MTC_BITMAP) ||
5522 ((eax_1 & INTEL_PT_ADDR_RANGES_NUM_MASK) <
5523 INTEL_PT_ADDR_RANGES_NUM) ||
5524 ((ebx_1 & (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) !=
5525 (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) ||
5526 (ecx_0 & INTEL_PT_IP_LIP)) {
5528 * Processor Trace capabilities aren't configurable, so if the
5529 * host can't emulate the capabilities we report on
5530 * cpu_x86_cpuid(), intel-pt can't be enabled on the current host.
5532 mark_unavailable_features(cpu, FEAT_7_0_EBX, CPUID_7_0_EBX_INTEL_PT, prefix);
5537 static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
5539 CPUState *cs = CPU(dev);
5540 X86CPU *cpu = X86_CPU(dev);
5541 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
5542 CPUX86State *env = &cpu->env;
5543 Error *local_err = NULL;
5544 static bool ht_warned;
5546 if (xcc->host_cpuid_required) {
5547 if (!accel_uses_host_cpuid()) {
5548 char *name = x86_cpu_class_get_model_name(xcc);
5549 error_setg(&local_err, "CPU model '%s' requires KVM", name);
5550 g_free(name);
5551 goto out;
5554 if (enable_cpu_pm) {
5555 host_cpuid(5, 0, &cpu->mwait.eax, &cpu->mwait.ebx,
5556 &cpu->mwait.ecx, &cpu->mwait.edx);
5557 env->features[FEAT_1_ECX] |= CPUID_EXT_MONITOR;
5561 /* mwait extended info: needed for Core compatibility */
5562 /* We always wake on interrupt even if host does not have the capability */
5563 cpu->mwait.ecx |= CPUID_MWAIT_EMX | CPUID_MWAIT_IBE;
5565 if (cpu->apic_id == UNASSIGNED_APIC_ID) {
5566 error_setg(errp, "apic-id property was not initialized properly");
5567 return;
5570 x86_cpu_expand_features(cpu, &local_err);
5571 if (local_err) {
5572 goto out;
5575 x86_cpu_filter_features(cpu, cpu->check_cpuid || cpu->enforce_cpuid);
5577 if (cpu->enforce_cpuid && x86_cpu_have_filtered_features(cpu)) {
5578 error_setg(&local_err,
5579 accel_uses_host_cpuid() ?
5580 "Host doesn't support requested features" :
5581 "TCG doesn't support requested features");
5582 goto out;
5585 /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on
5586 * CPUID[1].EDX.
5588 if (IS_AMD_CPU(env)) {
5589 env->features[FEAT_8000_0001_EDX] &= ~CPUID_EXT2_AMD_ALIASES;
5590 env->features[FEAT_8000_0001_EDX] |= (env->features[FEAT_1_EDX]
5591 & CPUID_EXT2_AMD_ALIASES);
5594 /* For 64bit systems think about the number of physical bits to present.
5595 * ideally this should be the same as the host; anything other than matching
5596 * the host can cause incorrect guest behaviour.
5597 * QEMU used to pick the magic value of 40 bits that corresponds to
5598 * consumer AMD devices but nothing else.
5600 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
5601 if (accel_uses_host_cpuid()) {
5602 uint32_t host_phys_bits = x86_host_phys_bits();
5603 static bool warned;
5605 /* Print a warning if the user set it to a value that's not the
5606 * host value.
5608 if (cpu->phys_bits != host_phys_bits && cpu->phys_bits != 0 &&
5609 !warned) {
5610 warn_report("Host physical bits (%u)"
5611 " does not match phys-bits property (%u)",
5612 host_phys_bits, cpu->phys_bits);
5613 warned = true;
5616 if (cpu->host_phys_bits) {
5617 /* The user asked for us to use the host physical bits */
5618 cpu->phys_bits = host_phys_bits;
5619 if (cpu->host_phys_bits_limit &&
5620 cpu->phys_bits > cpu->host_phys_bits_limit) {
5621 cpu->phys_bits = cpu->host_phys_bits_limit;
5625 if (cpu->phys_bits &&
5626 (cpu->phys_bits > TARGET_PHYS_ADDR_SPACE_BITS ||
5627 cpu->phys_bits < 32)) {
5628 error_setg(errp, "phys-bits should be between 32 and %u "
5629 " (but is %u)",
5630 TARGET_PHYS_ADDR_SPACE_BITS, cpu->phys_bits);
5631 return;
5633 } else {
5634 if (cpu->phys_bits && cpu->phys_bits != TCG_PHYS_ADDR_BITS) {
5635 error_setg(errp, "TCG only supports phys-bits=%u",
5636 TCG_PHYS_ADDR_BITS);
5637 return;
5640 /* 0 means it was not explicitly set by the user (or by machine
5641 * compat_props or by the host code above). In this case, the default
5642 * is the value used by TCG (40).
5644 if (cpu->phys_bits == 0) {
5645 cpu->phys_bits = TCG_PHYS_ADDR_BITS;
5647 } else {
5648 /* For 32 bit systems don't use the user set value, but keep
5649 * phys_bits consistent with what we tell the guest.
5651 if (cpu->phys_bits != 0) {
5652 error_setg(errp, "phys-bits is not user-configurable in 32 bit");
5653 return;
5656 if (env->features[FEAT_1_EDX] & CPUID_PSE36) {
5657 cpu->phys_bits = 36;
5658 } else {
5659 cpu->phys_bits = 32;
5663 /* Cache information initialization */
5664 if (!cpu->legacy_cache) {
5665 if (!xcc->model || !xcc->model->cpudef->cache_info) {
5666 char *name = x86_cpu_class_get_model_name(xcc);
5667 error_setg(errp,
5668 "CPU model '%s' doesn't support legacy-cache=off", name);
5669 g_free(name);
5670 return;
5672 env->cache_info_cpuid2 = env->cache_info_cpuid4 = env->cache_info_amd =
5673 *xcc->model->cpudef->cache_info;
5674 } else {
5675 /* Build legacy cache information */
5676 env->cache_info_cpuid2.l1d_cache = &legacy_l1d_cache;
5677 env->cache_info_cpuid2.l1i_cache = &legacy_l1i_cache;
5678 env->cache_info_cpuid2.l2_cache = &legacy_l2_cache_cpuid2;
5679 env->cache_info_cpuid2.l3_cache = &legacy_l3_cache;
5681 env->cache_info_cpuid4.l1d_cache = &legacy_l1d_cache;
5682 env->cache_info_cpuid4.l1i_cache = &legacy_l1i_cache;
5683 env->cache_info_cpuid4.l2_cache = &legacy_l2_cache;
5684 env->cache_info_cpuid4.l3_cache = &legacy_l3_cache;
5686 env->cache_info_amd.l1d_cache = &legacy_l1d_cache_amd;
5687 env->cache_info_amd.l1i_cache = &legacy_l1i_cache_amd;
5688 env->cache_info_amd.l2_cache = &legacy_l2_cache_amd;
5689 env->cache_info_amd.l3_cache = &legacy_l3_cache;
5693 cpu_exec_realizefn(cs, &local_err);
5694 if (local_err != NULL) {
5695 error_propagate(errp, local_err);
5696 return;
5699 #ifndef CONFIG_USER_ONLY
5700 MachineState *ms = MACHINE(qdev_get_machine());
5701 qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
5703 if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || ms->smp.cpus > 1) {
5704 x86_cpu_apic_create(cpu, &local_err);
5705 if (local_err != NULL) {
5706 goto out;
5709 #endif
5711 mce_init(cpu);
5713 #ifndef CONFIG_USER_ONLY
5714 if (tcg_enabled()) {
5715 cpu->cpu_as_mem = g_new(MemoryRegion, 1);
5716 cpu->cpu_as_root = g_new(MemoryRegion, 1);
5718 /* Outer container... */
5719 memory_region_init(cpu->cpu_as_root, OBJECT(cpu), "memory", ~0ull);
5720 memory_region_set_enabled(cpu->cpu_as_root, true);
5722 /* ... with two regions inside: normal system memory with low
5723 * priority, and...
5725 memory_region_init_alias(cpu->cpu_as_mem, OBJECT(cpu), "memory",
5726 get_system_memory(), 0, ~0ull);
5727 memory_region_add_subregion_overlap(cpu->cpu_as_root, 0, cpu->cpu_as_mem, 0);
5728 memory_region_set_enabled(cpu->cpu_as_mem, true);
5730 cs->num_ases = 2;
5731 cpu_address_space_init(cs, 0, "cpu-memory", cs->memory);
5732 cpu_address_space_init(cs, 1, "cpu-smm", cpu->cpu_as_root);
5734 /* ... SMRAM with higher priority, linked from /machine/smram. */
5735 cpu->machine_done.notify = x86_cpu_machine_done;
5736 qemu_add_machine_init_done_notifier(&cpu->machine_done);
5738 #endif
5740 qemu_init_vcpu(cs);
5743 * Most Intel and certain AMD CPUs support hyperthreading. Even though QEMU
5744 * fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
5745 * based on inputs (sockets,cores,threads), it is still better to give
5746 * users a warning.
5748 * NOTE: the following code has to follow qemu_init_vcpu(). Otherwise
5749 * cs->nr_threads hasn't be populated yet and the checking is incorrect.
5751 if (IS_AMD_CPU(env) &&
5752 !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
5753 cs->nr_threads > 1 && !ht_warned) {
5754 warn_report("This family of AMD CPU doesn't support "
5755 "hyperthreading(%d)",
5756 cs->nr_threads);
5757 error_printf("Please configure -smp options properly"
5758 " or try enabling topoext feature.\n");
5759 ht_warned = true;
5762 x86_cpu_apic_realize(cpu, &local_err);
5763 if (local_err != NULL) {
5764 goto out;
5766 cpu_reset(cs);
5768 xcc->parent_realize(dev, &local_err);
5770 out:
5771 if (local_err != NULL) {
5772 error_propagate(errp, local_err);
5773 return;
5777 static void x86_cpu_unrealizefn(DeviceState *dev, Error **errp)
5779 X86CPU *cpu = X86_CPU(dev);
5780 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
5781 Error *local_err = NULL;
5783 #ifndef CONFIG_USER_ONLY
5784 cpu_remove_sync(CPU(dev));
5785 qemu_unregister_reset(x86_cpu_machine_reset_cb, dev);
5786 #endif
5788 if (cpu->apic_state) {
5789 object_unparent(OBJECT(cpu->apic_state));
5790 cpu->apic_state = NULL;
5793 xcc->parent_unrealize(dev, &local_err);
5794 if (local_err != NULL) {
5795 error_propagate(errp, local_err);
5796 return;
5800 typedef struct BitProperty {
5801 FeatureWord w;
5802 uint64_t mask;
5803 } BitProperty;
5805 static void x86_cpu_get_bit_prop(Object *obj, Visitor *v, const char *name,
5806 void *opaque, Error **errp)
5808 X86CPU *cpu = X86_CPU(obj);
5809 BitProperty *fp = opaque;
5810 uint64_t f = cpu->env.features[fp->w];
5811 bool value = (f & fp->mask) == fp->mask;
5812 visit_type_bool(v, name, &value, errp);
5815 static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
5816 void *opaque, Error **errp)
5818 DeviceState *dev = DEVICE(obj);
5819 X86CPU *cpu = X86_CPU(obj);
5820 BitProperty *fp = opaque;
5821 Error *local_err = NULL;
5822 bool value;
5824 if (dev->realized) {
5825 qdev_prop_set_after_realize(dev, name, errp);
5826 return;
5829 visit_type_bool(v, name, &value, &local_err);
5830 if (local_err) {
5831 error_propagate(errp, local_err);
5832 return;
5835 if (value) {
5836 cpu->env.features[fp->w] |= fp->mask;
5837 } else {
5838 cpu->env.features[fp->w] &= ~fp->mask;
5840 cpu->env.user_features[fp->w] |= fp->mask;
5843 static void x86_cpu_release_bit_prop(Object *obj, const char *name,
5844 void *opaque)
5846 BitProperty *prop = opaque;
5847 g_free(prop);
5850 /* Register a boolean property to get/set a single bit in a uint32_t field.
5852 * The same property name can be registered multiple times to make it affect
5853 * multiple bits in the same FeatureWord. In that case, the getter will return
5854 * true only if all bits are set.
5856 static void x86_cpu_register_bit_prop(X86CPU *cpu,
5857 const char *prop_name,
5858 FeatureWord w,
5859 int bitnr)
5861 BitProperty *fp;
5862 ObjectProperty *op;
5863 uint64_t mask = (1ULL << bitnr);
5865 op = object_property_find(OBJECT(cpu), prop_name, NULL);
5866 if (op) {
5867 fp = op->opaque;
5868 assert(fp->w == w);
5869 fp->mask |= mask;
5870 } else {
5871 fp = g_new0(BitProperty, 1);
5872 fp->w = w;
5873 fp->mask = mask;
5874 object_property_add(OBJECT(cpu), prop_name, "bool",
5875 x86_cpu_get_bit_prop,
5876 x86_cpu_set_bit_prop,
5877 x86_cpu_release_bit_prop, fp, &error_abort);
5881 static void x86_cpu_register_feature_bit_props(X86CPU *cpu,
5882 FeatureWord w,
5883 int bitnr)
5885 FeatureWordInfo *fi = &feature_word_info[w];
5886 const char *name = fi->feat_names[bitnr];
5888 if (!name) {
5889 return;
5892 /* Property names should use "-" instead of "_".
5893 * Old names containing underscores are registered as aliases
5894 * using object_property_add_alias()
5896 assert(!strchr(name, '_'));
5897 /* aliases don't use "|" delimiters anymore, they are registered
5898 * manually using object_property_add_alias() */
5899 assert(!strchr(name, '|'));
5900 x86_cpu_register_bit_prop(cpu, name, w, bitnr);
5903 static GuestPanicInformation *x86_cpu_get_crash_info(CPUState *cs)
5905 X86CPU *cpu = X86_CPU(cs);
5906 CPUX86State *env = &cpu->env;
5907 GuestPanicInformation *panic_info = NULL;
5909 if (env->features[FEAT_HYPERV_EDX] & HV_GUEST_CRASH_MSR_AVAILABLE) {
5910 panic_info = g_malloc0(sizeof(GuestPanicInformation));
5912 panic_info->type = GUEST_PANIC_INFORMATION_TYPE_HYPER_V;
5914 assert(HV_CRASH_PARAMS >= 5);
5915 panic_info->u.hyper_v.arg1 = env->msr_hv_crash_params[0];
5916 panic_info->u.hyper_v.arg2 = env->msr_hv_crash_params[1];
5917 panic_info->u.hyper_v.arg3 = env->msr_hv_crash_params[2];
5918 panic_info->u.hyper_v.arg4 = env->msr_hv_crash_params[3];
5919 panic_info->u.hyper_v.arg5 = env->msr_hv_crash_params[4];
5922 return panic_info;
5924 static void x86_cpu_get_crash_info_qom(Object *obj, Visitor *v,
5925 const char *name, void *opaque,
5926 Error **errp)
5928 CPUState *cs = CPU(obj);
5929 GuestPanicInformation *panic_info;
5931 if (!cs->crash_occurred) {
5932 error_setg(errp, "No crash occured");
5933 return;
5936 panic_info = x86_cpu_get_crash_info(cs);
5937 if (panic_info == NULL) {
5938 error_setg(errp, "No crash information");
5939 return;
5942 visit_type_GuestPanicInformation(v, "crash-information", &panic_info,
5943 errp);
5944 qapi_free_GuestPanicInformation(panic_info);
5947 static void x86_cpu_initfn(Object *obj)
5949 X86CPU *cpu = X86_CPU(obj);
5950 X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
5951 CPUX86State *env = &cpu->env;
5952 FeatureWord w;
5954 env->nr_dies = 1;
5955 cpu_set_cpustate_pointers(cpu);
5957 object_property_add(obj, "family", "int",
5958 x86_cpuid_version_get_family,
5959 x86_cpuid_version_set_family, NULL, NULL, NULL);
5960 object_property_add(obj, "model", "int",
5961 x86_cpuid_version_get_model,
5962 x86_cpuid_version_set_model, NULL, NULL, NULL);
5963 object_property_add(obj, "stepping", "int",
5964 x86_cpuid_version_get_stepping,
5965 x86_cpuid_version_set_stepping, NULL, NULL, NULL);
5966 object_property_add_str(obj, "vendor",
5967 x86_cpuid_get_vendor,
5968 x86_cpuid_set_vendor, NULL);
5969 object_property_add_str(obj, "model-id",
5970 x86_cpuid_get_model_id,
5971 x86_cpuid_set_model_id, NULL);
5972 object_property_add(obj, "tsc-frequency", "int",
5973 x86_cpuid_get_tsc_freq,
5974 x86_cpuid_set_tsc_freq, NULL, NULL, NULL);
5975 object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo",
5976 x86_cpu_get_feature_words,
5977 NULL, NULL, (void *)env->features, NULL);
5978 object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo",
5979 x86_cpu_get_feature_words,
5980 NULL, NULL, (void *)cpu->filtered_features, NULL);
5982 * The "unavailable-features" property has the same semantics as
5983 * CpuDefinitionInfo.unavailable-features on the "query-cpu-definitions"
5984 * QMP command: they list the features that would have prevented the
5985 * CPU from running if the "enforce" flag was set.
5987 object_property_add(obj, "unavailable-features", "strList",
5988 x86_cpu_get_unavailable_features,
5989 NULL, NULL, NULL, &error_abort);
5991 object_property_add(obj, "crash-information", "GuestPanicInformation",
5992 x86_cpu_get_crash_info_qom, NULL, NULL, NULL, NULL);
5994 for (w = 0; w < FEATURE_WORDS; w++) {
5995 int bitnr;
5997 for (bitnr = 0; bitnr < 64; bitnr++) {
5998 x86_cpu_register_feature_bit_props(cpu, w, bitnr);
6002 object_property_add_alias(obj, "sse3", obj, "pni", &error_abort);
6003 object_property_add_alias(obj, "pclmuldq", obj, "pclmulqdq", &error_abort);
6004 object_property_add_alias(obj, "sse4-1", obj, "sse4.1", &error_abort);
6005 object_property_add_alias(obj, "sse4-2", obj, "sse4.2", &error_abort);
6006 object_property_add_alias(obj, "xd", obj, "nx", &error_abort);
6007 object_property_add_alias(obj, "ffxsr", obj, "fxsr-opt", &error_abort);
6008 object_property_add_alias(obj, "i64", obj, "lm", &error_abort);
6010 object_property_add_alias(obj, "ds_cpl", obj, "ds-cpl", &error_abort);
6011 object_property_add_alias(obj, "tsc_adjust", obj, "tsc-adjust", &error_abort);
6012 object_property_add_alias(obj, "fxsr_opt", obj, "fxsr-opt", &error_abort);
6013 object_property_add_alias(obj, "lahf_lm", obj, "lahf-lm", &error_abort);
6014 object_property_add_alias(obj, "cmp_legacy", obj, "cmp-legacy", &error_abort);
6015 object_property_add_alias(obj, "nodeid_msr", obj, "nodeid-msr", &error_abort);
6016 object_property_add_alias(obj, "perfctr_core", obj, "perfctr-core", &error_abort);
6017 object_property_add_alias(obj, "perfctr_nb", obj, "perfctr-nb", &error_abort);
6018 object_property_add_alias(obj, "kvm_nopiodelay", obj, "kvm-nopiodelay", &error_abort);
6019 object_property_add_alias(obj, "kvm_mmu", obj, "kvm-mmu", &error_abort);
6020 object_property_add_alias(obj, "kvm_asyncpf", obj, "kvm-asyncpf", &error_abort);
6021 object_property_add_alias(obj, "kvm_steal_time", obj, "kvm-steal-time", &error_abort);
6022 object_property_add_alias(obj, "kvm_pv_eoi", obj, "kvm-pv-eoi", &error_abort);
6023 object_property_add_alias(obj, "kvm_pv_unhalt", obj, "kvm-pv-unhalt", &error_abort);
6024 object_property_add_alias(obj, "kvm_poll_control", obj, "kvm-poll-control",
6025 &error_abort);
6026 object_property_add_alias(obj, "svm_lock", obj, "svm-lock", &error_abort);
6027 object_property_add_alias(obj, "nrip_save", obj, "nrip-save", &error_abort);
6028 object_property_add_alias(obj, "tsc_scale", obj, "tsc-scale", &error_abort);
6029 object_property_add_alias(obj, "vmcb_clean", obj, "vmcb-clean", &error_abort);
6030 object_property_add_alias(obj, "pause_filter", obj, "pause-filter", &error_abort);
6031 object_property_add_alias(obj, "sse4_1", obj, "sse4.1", &error_abort);
6032 object_property_add_alias(obj, "sse4_2", obj, "sse4.2", &error_abort);
6034 if (xcc->model) {
6035 x86_cpu_load_model(cpu, xcc->model, &error_abort);
6039 static int64_t x86_cpu_get_arch_id(CPUState *cs)
6041 X86CPU *cpu = X86_CPU(cs);
6043 return cpu->apic_id;
6046 static bool x86_cpu_get_paging_enabled(const CPUState *cs)
6048 X86CPU *cpu = X86_CPU(cs);
6050 return cpu->env.cr[0] & CR0_PG_MASK;
6053 static void x86_cpu_set_pc(CPUState *cs, vaddr value)
6055 X86CPU *cpu = X86_CPU(cs);
6057 cpu->env.eip = value;
6060 static void x86_cpu_synchronize_from_tb(CPUState *cs, TranslationBlock *tb)
6062 X86CPU *cpu = X86_CPU(cs);
6064 cpu->env.eip = tb->pc - tb->cs_base;
6067 int x86_cpu_pending_interrupt(CPUState *cs, int interrupt_request)
6069 X86CPU *cpu = X86_CPU(cs);
6070 CPUX86State *env = &cpu->env;
6072 #if !defined(CONFIG_USER_ONLY)
6073 if (interrupt_request & CPU_INTERRUPT_POLL) {
6074 return CPU_INTERRUPT_POLL;
6076 #endif
6077 if (interrupt_request & CPU_INTERRUPT_SIPI) {
6078 return CPU_INTERRUPT_SIPI;
6081 if (env->hflags2 & HF2_GIF_MASK) {
6082 if ((interrupt_request & CPU_INTERRUPT_SMI) &&
6083 !(env->hflags & HF_SMM_MASK)) {
6084 return CPU_INTERRUPT_SMI;
6085 } else if ((interrupt_request & CPU_INTERRUPT_NMI) &&
6086 !(env->hflags2 & HF2_NMI_MASK)) {
6087 return CPU_INTERRUPT_NMI;
6088 } else if (interrupt_request & CPU_INTERRUPT_MCE) {
6089 return CPU_INTERRUPT_MCE;
6090 } else if ((interrupt_request & CPU_INTERRUPT_HARD) &&
6091 (((env->hflags2 & HF2_VINTR_MASK) &&
6092 (env->hflags2 & HF2_HIF_MASK)) ||
6093 (!(env->hflags2 & HF2_VINTR_MASK) &&
6094 (env->eflags & IF_MASK &&
6095 !(env->hflags & HF_INHIBIT_IRQ_MASK))))) {
6096 return CPU_INTERRUPT_HARD;
6097 #if !defined(CONFIG_USER_ONLY)
6098 } else if ((interrupt_request & CPU_INTERRUPT_VIRQ) &&
6099 (env->eflags & IF_MASK) &&
6100 !(env->hflags & HF_INHIBIT_IRQ_MASK)) {
6101 return CPU_INTERRUPT_VIRQ;
6102 #endif
6106 return 0;
6109 static bool x86_cpu_has_work(CPUState *cs)
6111 return x86_cpu_pending_interrupt(cs, cs->interrupt_request) != 0;
6114 static void x86_disas_set_info(CPUState *cs, disassemble_info *info)
6116 X86CPU *cpu = X86_CPU(cs);
6117 CPUX86State *env = &cpu->env;
6119 info->mach = (env->hflags & HF_CS64_MASK ? bfd_mach_x86_64
6120 : env->hflags & HF_CS32_MASK ? bfd_mach_i386_i386
6121 : bfd_mach_i386_i8086);
6122 info->print_insn = print_insn_i386;
6124 info->cap_arch = CS_ARCH_X86;
6125 info->cap_mode = (env->hflags & HF_CS64_MASK ? CS_MODE_64
6126 : env->hflags & HF_CS32_MASK ? CS_MODE_32
6127 : CS_MODE_16);
6128 info->cap_insn_unit = 1;
6129 info->cap_insn_split = 8;
6132 void x86_update_hflags(CPUX86State *env)
6134 uint32_t hflags;
6135 #define HFLAG_COPY_MASK \
6136 ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
6137 HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
6138 HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
6139 HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK)
6141 hflags = env->hflags & HFLAG_COPY_MASK;
6142 hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
6143 hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
6144 hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
6145 (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
6146 hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
6148 if (env->cr[4] & CR4_OSFXSR_MASK) {
6149 hflags |= HF_OSFXSR_MASK;
6152 if (env->efer & MSR_EFER_LMA) {
6153 hflags |= HF_LMA_MASK;
6156 if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
6157 hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
6158 } else {
6159 hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
6160 (DESC_B_SHIFT - HF_CS32_SHIFT);
6161 hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
6162 (DESC_B_SHIFT - HF_SS32_SHIFT);
6163 if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) ||
6164 !(hflags & HF_CS32_MASK)) {
6165 hflags |= HF_ADDSEG_MASK;
6166 } else {
6167 hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base |
6168 env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
6171 env->hflags = hflags;
6174 static Property x86_cpu_properties[] = {
6175 #ifdef CONFIG_USER_ONLY
6176 /* apic_id = 0 by default for *-user, see commit 9886e834 */
6177 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, 0),
6178 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, 0),
6179 DEFINE_PROP_INT32("core-id", X86CPU, core_id, 0),
6180 DEFINE_PROP_INT32("die-id", X86CPU, die_id, 0),
6181 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, 0),
6182 #else
6183 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, UNASSIGNED_APIC_ID),
6184 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, -1),
6185 DEFINE_PROP_INT32("core-id", X86CPU, core_id, -1),
6186 DEFINE_PROP_INT32("die-id", X86CPU, die_id, -1),
6187 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, -1),
6188 #endif
6189 DEFINE_PROP_INT32("node-id", X86CPU, node_id, CPU_UNSET_NUMA_NODE_ID),
6190 DEFINE_PROP_BOOL("pmu", X86CPU, enable_pmu, false),
6192 DEFINE_PROP_UINT32("hv-spinlocks", X86CPU, hyperv_spinlock_attempts,
6193 HYPERV_SPINLOCK_NEVER_RETRY),
6194 DEFINE_PROP_BIT64("hv-relaxed", X86CPU, hyperv_features,
6195 HYPERV_FEAT_RELAXED, 0),
6196 DEFINE_PROP_BIT64("hv-vapic", X86CPU, hyperv_features,
6197 HYPERV_FEAT_VAPIC, 0),
6198 DEFINE_PROP_BIT64("hv-time", X86CPU, hyperv_features,
6199 HYPERV_FEAT_TIME, 0),
6200 DEFINE_PROP_BIT64("hv-crash", X86CPU, hyperv_features,
6201 HYPERV_FEAT_CRASH, 0),
6202 DEFINE_PROP_BIT64("hv-reset", X86CPU, hyperv_features,
6203 HYPERV_FEAT_RESET, 0),
6204 DEFINE_PROP_BIT64("hv-vpindex", X86CPU, hyperv_features,
6205 HYPERV_FEAT_VPINDEX, 0),
6206 DEFINE_PROP_BIT64("hv-runtime", X86CPU, hyperv_features,
6207 HYPERV_FEAT_RUNTIME, 0),
6208 DEFINE_PROP_BIT64("hv-synic", X86CPU, hyperv_features,
6209 HYPERV_FEAT_SYNIC, 0),
6210 DEFINE_PROP_BIT64("hv-stimer", X86CPU, hyperv_features,
6211 HYPERV_FEAT_STIMER, 0),
6212 DEFINE_PROP_BIT64("hv-frequencies", X86CPU, hyperv_features,
6213 HYPERV_FEAT_FREQUENCIES, 0),
6214 DEFINE_PROP_BIT64("hv-reenlightenment", X86CPU, hyperv_features,
6215 HYPERV_FEAT_REENLIGHTENMENT, 0),
6216 DEFINE_PROP_BIT64("hv-tlbflush", X86CPU, hyperv_features,
6217 HYPERV_FEAT_TLBFLUSH, 0),
6218 DEFINE_PROP_BIT64("hv-evmcs", X86CPU, hyperv_features,
6219 HYPERV_FEAT_EVMCS, 0),
6220 DEFINE_PROP_BIT64("hv-ipi", X86CPU, hyperv_features,
6221 HYPERV_FEAT_IPI, 0),
6222 DEFINE_PROP_BIT64("hv-stimer-direct", X86CPU, hyperv_features,
6223 HYPERV_FEAT_STIMER_DIRECT, 0),
6224 DEFINE_PROP_ON_OFF_AUTO("hv-no-nonarch-coresharing", X86CPU,
6225 hyperv_no_nonarch_cs, ON_OFF_AUTO_OFF),
6226 DEFINE_PROP_BOOL("hv-passthrough", X86CPU, hyperv_passthrough, false),
6228 DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true),
6229 DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
6230 DEFINE_PROP_BOOL("x-force-features", X86CPU, force_features, false),
6231 DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true),
6232 DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 0),
6233 DEFINE_PROP_BOOL("host-phys-bits", X86CPU, host_phys_bits, false),
6234 DEFINE_PROP_UINT8("host-phys-bits-limit", X86CPU, host_phys_bits_limit, 0),
6235 DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true),
6236 DEFINE_PROP_UINT32("level-func7", X86CPU, env.cpuid_level_func7,
6237 UINT32_MAX),
6238 DEFINE_PROP_UINT32("level", X86CPU, env.cpuid_level, UINT32_MAX),
6239 DEFINE_PROP_UINT32("xlevel", X86CPU, env.cpuid_xlevel, UINT32_MAX),
6240 DEFINE_PROP_UINT32("xlevel2", X86CPU, env.cpuid_xlevel2, UINT32_MAX),
6241 DEFINE_PROP_UINT32("min-level", X86CPU, env.cpuid_min_level, 0),
6242 DEFINE_PROP_UINT32("min-xlevel", X86CPU, env.cpuid_min_xlevel, 0),
6243 DEFINE_PROP_UINT32("min-xlevel2", X86CPU, env.cpuid_min_xlevel2, 0),
6244 DEFINE_PROP_BOOL("full-cpuid-auto-level", X86CPU, full_cpuid_auto_level, true),
6245 DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor_id),
6246 DEFINE_PROP_BOOL("cpuid-0xb", X86CPU, enable_cpuid_0xb, true),
6247 DEFINE_PROP_BOOL("lmce", X86CPU, enable_lmce, false),
6248 DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true),
6249 DEFINE_PROP_BOOL("kvm-no-smi-migration", X86CPU, kvm_no_smi_migration,
6250 false),
6251 DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true),
6252 DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true),
6253 DEFINE_PROP_BOOL("x-migrate-smi-count", X86CPU, migrate_smi_count,
6254 true),
6256 * lecacy_cache defaults to true unless the CPU model provides its
6257 * own cache information (see x86_cpu_load_def()).
6259 DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, true),
6262 * From "Requirements for Implementing the Microsoft
6263 * Hypervisor Interface":
6264 * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs
6266 * "Starting with Windows Server 2012 and Windows 8, if
6267 * CPUID.40000005.EAX contains a value of -1, Windows assumes that
6268 * the hypervisor imposes no specific limit to the number of VPs.
6269 * In this case, Windows Server 2012 guest VMs may use more than
6270 * 64 VPs, up to the maximum supported number of processors applicable
6271 * to the specific Windows version being used."
6273 DEFINE_PROP_INT32("x-hv-max-vps", X86CPU, hv_max_vps, -1),
6274 DEFINE_PROP_BOOL("x-hv-synic-kvm-only", X86CPU, hyperv_synic_kvm_only,
6275 false),
6276 DEFINE_PROP_BOOL("x-intel-pt-auto-level", X86CPU, intel_pt_auto_level,
6277 true),
6278 DEFINE_PROP_END_OF_LIST()
6281 static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
6283 X86CPUClass *xcc = X86_CPU_CLASS(oc);
6284 CPUClass *cc = CPU_CLASS(oc);
6285 DeviceClass *dc = DEVICE_CLASS(oc);
6287 device_class_set_parent_realize(dc, x86_cpu_realizefn,
6288 &xcc->parent_realize);
6289 device_class_set_parent_unrealize(dc, x86_cpu_unrealizefn,
6290 &xcc->parent_unrealize);
6291 dc->props = x86_cpu_properties;
6293 xcc->parent_reset = cc->reset;
6294 cc->reset = x86_cpu_reset;
6295 cc->reset_dump_flags = CPU_DUMP_FPU | CPU_DUMP_CCOP;
6297 cc->class_by_name = x86_cpu_class_by_name;
6298 cc->parse_features = x86_cpu_parse_featurestr;
6299 cc->has_work = x86_cpu_has_work;
6300 #ifdef CONFIG_TCG
6301 cc->do_interrupt = x86_cpu_do_interrupt;
6302 cc->cpu_exec_interrupt = x86_cpu_exec_interrupt;
6303 #endif
6304 cc->dump_state = x86_cpu_dump_state;
6305 cc->get_crash_info = x86_cpu_get_crash_info;
6306 cc->set_pc = x86_cpu_set_pc;
6307 cc->synchronize_from_tb = x86_cpu_synchronize_from_tb;
6308 cc->gdb_read_register = x86_cpu_gdb_read_register;
6309 cc->gdb_write_register = x86_cpu_gdb_write_register;
6310 cc->get_arch_id = x86_cpu_get_arch_id;
6311 cc->get_paging_enabled = x86_cpu_get_paging_enabled;
6312 #ifndef CONFIG_USER_ONLY
6313 cc->asidx_from_attrs = x86_asidx_from_attrs;
6314 cc->get_memory_mapping = x86_cpu_get_memory_mapping;
6315 cc->get_phys_page_attrs_debug = x86_cpu_get_phys_page_attrs_debug;
6316 cc->write_elf64_note = x86_cpu_write_elf64_note;
6317 cc->write_elf64_qemunote = x86_cpu_write_elf64_qemunote;
6318 cc->write_elf32_note = x86_cpu_write_elf32_note;
6319 cc->write_elf32_qemunote = x86_cpu_write_elf32_qemunote;
6320 cc->vmsd = &vmstate_x86_cpu;
6321 #endif
6322 cc->gdb_arch_name = x86_gdb_arch_name;
6323 #ifdef TARGET_X86_64
6324 cc->gdb_core_xml_file = "i386-64bit.xml";
6325 cc->gdb_num_core_regs = 66;
6326 #else
6327 cc->gdb_core_xml_file = "i386-32bit.xml";
6328 cc->gdb_num_core_regs = 50;
6329 #endif
6330 #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
6331 cc->debug_excp_handler = breakpoint_handler;
6332 #endif
6333 cc->cpu_exec_enter = x86_cpu_exec_enter;
6334 cc->cpu_exec_exit = x86_cpu_exec_exit;
6335 #ifdef CONFIG_TCG
6336 cc->tcg_initialize = tcg_x86_init;
6337 cc->tlb_fill = x86_cpu_tlb_fill;
6338 #endif
6339 cc->disas_set_info = x86_disas_set_info;
6341 dc->user_creatable = true;
6344 static const TypeInfo x86_cpu_type_info = {
6345 .name = TYPE_X86_CPU,
6346 .parent = TYPE_CPU,
6347 .instance_size = sizeof(X86CPU),
6348 .instance_init = x86_cpu_initfn,
6349 .abstract = true,
6350 .class_size = sizeof(X86CPUClass),
6351 .class_init = x86_cpu_common_class_init,
6355 /* "base" CPU model, used by query-cpu-model-expansion */
6356 static void x86_cpu_base_class_init(ObjectClass *oc, void *data)
6358 X86CPUClass *xcc = X86_CPU_CLASS(oc);
6360 xcc->static_model = true;
6361 xcc->migration_safe = true;
6362 xcc->model_description = "base CPU model type with no features enabled";
6363 xcc->ordering = 8;
6366 static const TypeInfo x86_base_cpu_type_info = {
6367 .name = X86_CPU_TYPE_NAME("base"),
6368 .parent = TYPE_X86_CPU,
6369 .class_init = x86_cpu_base_class_init,
6372 static void x86_cpu_register_types(void)
6374 int i;
6376 type_register_static(&x86_cpu_type_info);
6377 for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) {
6378 x86_register_cpudef_types(&builtin_x86_defs[i]);
6380 type_register_static(&max_x86_cpu_type_info);
6381 type_register_static(&x86_base_cpu_type_info);
6382 #if defined(CONFIG_KVM) || defined(CONFIG_HVF)
6383 type_register_static(&host_x86_cpu_type_info);
6384 #endif
6387 type_init(x86_cpu_register_types)