]> git.proxmox.com Git - mirror_qemu.git/blob - target/i386/cpu.c
Merge remote-tracking branch 'remotes/awilliam/tags/vfio-updates-20190311.0' into...
[mirror_qemu.git] / target / i386 / cpu.c
1 /*
2 * i386 CPUID helper functions
3 *
4 * Copyright (c) 2003 Fabrice Bellard
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include "qemu/osdep.h"
21 #include "qemu/units.h"
22 #include "qemu/cutils.h"
23 #include "qemu/bitops.h"
24
25 #include "cpu.h"
26 #include "exec/exec-all.h"
27 #include "sysemu/kvm.h"
28 #include "sysemu/hvf.h"
29 #include "sysemu/cpus.h"
30 #include "kvm_i386.h"
31 #include "sev_i386.h"
32
33 #include "qemu/error-report.h"
34 #include "qemu/option.h"
35 #include "qemu/config-file.h"
36 #include "qapi/error.h"
37 #include "qapi/qapi-visit-misc.h"
38 #include "qapi/qapi-visit-run-state.h"
39 #include "qapi/qmp/qdict.h"
40 #include "qapi/qmp/qerror.h"
41 #include "qapi/visitor.h"
42 #include "qom/qom-qobject.h"
43 #include "sysemu/arch_init.h"
44 #include "qapi/qapi-commands-target.h"
45
46 #include "standard-headers/asm-x86/kvm_para.h"
47
48 #include "sysemu/sysemu.h"
49 #include "hw/qdev-properties.h"
50 #include "hw/i386/topology.h"
51 #ifndef CONFIG_USER_ONLY
52 #include "exec/address-spaces.h"
53 #include "hw/hw.h"
54 #include "hw/xen/xen.h"
55 #include "hw/i386/apic_internal.h"
56 #endif
57
58 #include "disas/capstone.h"
59
60 /* Helpers for building CPUID[2] descriptors: */
61
62 struct CPUID2CacheDescriptorInfo {
63 enum CacheType type;
64 int level;
65 int size;
66 int line_size;
67 int associativity;
68 };
69
70 /*
71 * Known CPUID 2 cache descriptors.
72 * From Intel SDM Volume 2A, CPUID instruction
73 */
74 struct CPUID2CacheDescriptorInfo cpuid2_cache_descriptors[] = {
75 [0x06] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 8 * KiB,
76 .associativity = 4, .line_size = 32, },
77 [0x08] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 16 * KiB,
78 .associativity = 4, .line_size = 32, },
79 [0x09] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 32 * KiB,
80 .associativity = 4, .line_size = 64, },
81 [0x0A] = { .level = 1, .type = DATA_CACHE, .size = 8 * KiB,
82 .associativity = 2, .line_size = 32, },
83 [0x0C] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
84 .associativity = 4, .line_size = 32, },
85 [0x0D] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
86 .associativity = 4, .line_size = 64, },
87 [0x0E] = { .level = 1, .type = DATA_CACHE, .size = 24 * KiB,
88 .associativity = 6, .line_size = 64, },
89 [0x1D] = { .level = 2, .type = UNIFIED_CACHE, .size = 128 * KiB,
90 .associativity = 2, .line_size = 64, },
91 [0x21] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
92 .associativity = 8, .line_size = 64, },
93 /* lines per sector is not supported cpuid2_cache_descriptor(),
94 * so descriptors 0x22, 0x23 are not included
95 */
96 [0x24] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
97 .associativity = 16, .line_size = 64, },
98 /* lines per sector is not supported cpuid2_cache_descriptor(),
99 * so descriptors 0x25, 0x20 are not included
100 */
101 [0x2C] = { .level = 1, .type = DATA_CACHE, .size = 32 * KiB,
102 .associativity = 8, .line_size = 64, },
103 [0x30] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 32 * KiB,
104 .associativity = 8, .line_size = 64, },
105 [0x41] = { .level = 2, .type = UNIFIED_CACHE, .size = 128 * KiB,
106 .associativity = 4, .line_size = 32, },
107 [0x42] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
108 .associativity = 4, .line_size = 32, },
109 [0x43] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
110 .associativity = 4, .line_size = 32, },
111 [0x44] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
112 .associativity = 4, .line_size = 32, },
113 [0x45] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
114 .associativity = 4, .line_size = 32, },
115 [0x46] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
116 .associativity = 4, .line_size = 64, },
117 [0x47] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
118 .associativity = 8, .line_size = 64, },
119 [0x48] = { .level = 2, .type = UNIFIED_CACHE, .size = 3 * MiB,
120 .associativity = 12, .line_size = 64, },
121 /* Descriptor 0x49 depends on CPU family/model, so it is not included */
122 [0x4A] = { .level = 3, .type = UNIFIED_CACHE, .size = 6 * MiB,
123 .associativity = 12, .line_size = 64, },
124 [0x4B] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
125 .associativity = 16, .line_size = 64, },
126 [0x4C] = { .level = 3, .type = UNIFIED_CACHE, .size = 12 * MiB,
127 .associativity = 12, .line_size = 64, },
128 [0x4D] = { .level = 3, .type = UNIFIED_CACHE, .size = 16 * MiB,
129 .associativity = 16, .line_size = 64, },
130 [0x4E] = { .level = 2, .type = UNIFIED_CACHE, .size = 6 * MiB,
131 .associativity = 24, .line_size = 64, },
132 [0x60] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
133 .associativity = 8, .line_size = 64, },
134 [0x66] = { .level = 1, .type = DATA_CACHE, .size = 8 * KiB,
135 .associativity = 4, .line_size = 64, },
136 [0x67] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB,
137 .associativity = 4, .line_size = 64, },
138 [0x68] = { .level = 1, .type = DATA_CACHE, .size = 32 * KiB,
139 .associativity = 4, .line_size = 64, },
140 [0x78] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
141 .associativity = 4, .line_size = 64, },
142 /* lines per sector is not supported cpuid2_cache_descriptor(),
143 * so descriptors 0x79, 0x7A, 0x7B, 0x7C are not included.
144 */
145 [0x7D] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
146 .associativity = 8, .line_size = 64, },
147 [0x7F] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
148 .associativity = 2, .line_size = 64, },
149 [0x80] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
150 .associativity = 8, .line_size = 64, },
151 [0x82] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
152 .associativity = 8, .line_size = 32, },
153 [0x83] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
154 .associativity = 8, .line_size = 32, },
155 [0x84] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
156 .associativity = 8, .line_size = 32, },
157 [0x85] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
158 .associativity = 8, .line_size = 32, },
159 [0x86] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
160 .associativity = 4, .line_size = 64, },
161 [0x87] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
162 .associativity = 8, .line_size = 64, },
163 [0xD0] = { .level = 3, .type = UNIFIED_CACHE, .size = 512 * KiB,
164 .associativity = 4, .line_size = 64, },
165 [0xD1] = { .level = 3, .type = UNIFIED_CACHE, .size = 1 * MiB,
166 .associativity = 4, .line_size = 64, },
167 [0xD2] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
168 .associativity = 4, .line_size = 64, },
169 [0xD6] = { .level = 3, .type = UNIFIED_CACHE, .size = 1 * MiB,
170 .associativity = 8, .line_size = 64, },
171 [0xD7] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
172 .associativity = 8, .line_size = 64, },
173 [0xD8] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
174 .associativity = 8, .line_size = 64, },
175 [0xDC] = { .level = 3, .type = UNIFIED_CACHE, .size = 1.5 * MiB,
176 .associativity = 12, .line_size = 64, },
177 [0xDD] = { .level = 3, .type = UNIFIED_CACHE, .size = 3 * MiB,
178 .associativity = 12, .line_size = 64, },
179 [0xDE] = { .level = 3, .type = UNIFIED_CACHE, .size = 6 * MiB,
180 .associativity = 12, .line_size = 64, },
181 [0xE2] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
182 .associativity = 16, .line_size = 64, },
183 [0xE3] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
184 .associativity = 16, .line_size = 64, },
185 [0xE4] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
186 .associativity = 16, .line_size = 64, },
187 [0xEA] = { .level = 3, .type = UNIFIED_CACHE, .size = 12 * MiB,
188 .associativity = 24, .line_size = 64, },
189 [0xEB] = { .level = 3, .type = UNIFIED_CACHE, .size = 18 * MiB,
190 .associativity = 24, .line_size = 64, },
191 [0xEC] = { .level = 3, .type = UNIFIED_CACHE, .size = 24 * MiB,
192 .associativity = 24, .line_size = 64, },
193 };
194
195 /*
196 * "CPUID leaf 2 does not report cache descriptor information,
197 * use CPUID leaf 4 to query cache parameters"
198 */
199 #define CACHE_DESCRIPTOR_UNAVAILABLE 0xFF
200
201 /*
202 * Return a CPUID 2 cache descriptor for a given cache.
203 * If no known descriptor is found, return CACHE_DESCRIPTOR_UNAVAILABLE
204 */
205 static uint8_t cpuid2_cache_descriptor(CPUCacheInfo *cache)
206 {
207 int i;
208
209 assert(cache->size > 0);
210 assert(cache->level > 0);
211 assert(cache->line_size > 0);
212 assert(cache->associativity > 0);
213 for (i = 0; i < ARRAY_SIZE(cpuid2_cache_descriptors); i++) {
214 struct CPUID2CacheDescriptorInfo *d = &cpuid2_cache_descriptors[i];
215 if (d->level == cache->level && d->type == cache->type &&
216 d->size == cache->size && d->line_size == cache->line_size &&
217 d->associativity == cache->associativity) {
218 return i;
219 }
220 }
221
222 return CACHE_DESCRIPTOR_UNAVAILABLE;
223 }
224
225 /* CPUID Leaf 4 constants: */
226
227 /* EAX: */
228 #define CACHE_TYPE_D 1
229 #define CACHE_TYPE_I 2
230 #define CACHE_TYPE_UNIFIED 3
231
232 #define CACHE_LEVEL(l) (l << 5)
233
234 #define CACHE_SELF_INIT_LEVEL (1 << 8)
235
236 /* EDX: */
237 #define CACHE_NO_INVD_SHARING (1 << 0)
238 #define CACHE_INCLUSIVE (1 << 1)
239 #define CACHE_COMPLEX_IDX (1 << 2)
240
241 /* Encode CacheType for CPUID[4].EAX */
242 #define CACHE_TYPE(t) (((t) == DATA_CACHE) ? CACHE_TYPE_D : \
243 ((t) == INSTRUCTION_CACHE) ? CACHE_TYPE_I : \
244 ((t) == UNIFIED_CACHE) ? CACHE_TYPE_UNIFIED : \
245 0 /* Invalid value */)
246
247
248 /* Encode cache info for CPUID[4] */
249 static void encode_cache_cpuid4(CPUCacheInfo *cache,
250 int num_apic_ids, int num_cores,
251 uint32_t *eax, uint32_t *ebx,
252 uint32_t *ecx, uint32_t *edx)
253 {
254 assert(cache->size == cache->line_size * cache->associativity *
255 cache->partitions * cache->sets);
256
257 assert(num_apic_ids > 0);
258 *eax = CACHE_TYPE(cache->type) |
259 CACHE_LEVEL(cache->level) |
260 (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0) |
261 ((num_cores - 1) << 26) |
262 ((num_apic_ids - 1) << 14);
263
264 assert(cache->line_size > 0);
265 assert(cache->partitions > 0);
266 assert(cache->associativity > 0);
267 /* We don't implement fully-associative caches */
268 assert(cache->associativity < cache->sets);
269 *ebx = (cache->line_size - 1) |
270 ((cache->partitions - 1) << 12) |
271 ((cache->associativity - 1) << 22);
272
273 assert(cache->sets > 0);
274 *ecx = cache->sets - 1;
275
276 *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
277 (cache->inclusive ? CACHE_INCLUSIVE : 0) |
278 (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
279 }
280
281 /* Encode cache info for CPUID[0x80000005].ECX or CPUID[0x80000005].EDX */
282 static uint32_t encode_cache_cpuid80000005(CPUCacheInfo *cache)
283 {
284 assert(cache->size % 1024 == 0);
285 assert(cache->lines_per_tag > 0);
286 assert(cache->associativity > 0);
287 assert(cache->line_size > 0);
288 return ((cache->size / 1024) << 24) | (cache->associativity << 16) |
289 (cache->lines_per_tag << 8) | (cache->line_size);
290 }
291
292 #define ASSOC_FULL 0xFF
293
294 /* AMD associativity encoding used on CPUID Leaf 0x80000006: */
295 #define AMD_ENC_ASSOC(a) (a <= 1 ? a : \
296 a == 2 ? 0x2 : \
297 a == 4 ? 0x4 : \
298 a == 8 ? 0x6 : \
299 a == 16 ? 0x8 : \
300 a == 32 ? 0xA : \
301 a == 48 ? 0xB : \
302 a == 64 ? 0xC : \
303 a == 96 ? 0xD : \
304 a == 128 ? 0xE : \
305 a == ASSOC_FULL ? 0xF : \
306 0 /* invalid value */)
307
308 /*
309 * Encode cache info for CPUID[0x80000006].ECX and CPUID[0x80000006].EDX
310 * @l3 can be NULL.
311 */
312 static void encode_cache_cpuid80000006(CPUCacheInfo *l2,
313 CPUCacheInfo *l3,
314 uint32_t *ecx, uint32_t *edx)
315 {
316 assert(l2->size % 1024 == 0);
317 assert(l2->associativity > 0);
318 assert(l2->lines_per_tag > 0);
319 assert(l2->line_size > 0);
320 *ecx = ((l2->size / 1024) << 16) |
321 (AMD_ENC_ASSOC(l2->associativity) << 12) |
322 (l2->lines_per_tag << 8) | (l2->line_size);
323
324 if (l3) {
325 assert(l3->size % (512 * 1024) == 0);
326 assert(l3->associativity > 0);
327 assert(l3->lines_per_tag > 0);
328 assert(l3->line_size > 0);
329 *edx = ((l3->size / (512 * 1024)) << 18) |
330 (AMD_ENC_ASSOC(l3->associativity) << 12) |
331 (l3->lines_per_tag << 8) | (l3->line_size);
332 } else {
333 *edx = 0;
334 }
335 }
336
337 /*
338 * Definitions used for building CPUID Leaf 0x8000001D and 0x8000001E
339 * Please refer to the AMD64 Architecture Programmer’s Manual Volume 3.
340 * Define the constants to build the cpu topology. Right now, TOPOEXT
341 * feature is enabled only on EPYC. So, these constants are based on
342 * EPYC supported configurations. We may need to handle the cases if
343 * these values change in future.
344 */
345 /* Maximum core complexes in a node */
346 #define MAX_CCX 2
347 /* Maximum cores in a core complex */
348 #define MAX_CORES_IN_CCX 4
349 /* Maximum cores in a node */
350 #define MAX_CORES_IN_NODE 8
351 /* Maximum nodes in a socket */
352 #define MAX_NODES_PER_SOCKET 4
353
354 /*
355 * Figure out the number of nodes required to build this config.
356 * Max cores in a node is 8
357 */
358 static int nodes_in_socket(int nr_cores)
359 {
360 int nodes;
361
362 nodes = DIV_ROUND_UP(nr_cores, MAX_CORES_IN_NODE);
363
364 /* Hardware does not support config with 3 nodes, return 4 in that case */
365 return (nodes == 3) ? 4 : nodes;
366 }
367
368 /*
369 * Decide the number of cores in a core complex with the given nr_cores using
370 * following set constants MAX_CCX, MAX_CORES_IN_CCX, MAX_CORES_IN_NODE and
371 * MAX_NODES_PER_SOCKET. Maintain symmetry as much as possible
372 * L3 cache is shared across all cores in a core complex. So, this will also
373 * tell us how many cores are sharing the L3 cache.
374 */
375 static int cores_in_core_complex(int nr_cores)
376 {
377 int nodes;
378
379 /* Check if we can fit all the cores in one core complex */
380 if (nr_cores <= MAX_CORES_IN_CCX) {
381 return nr_cores;
382 }
383 /* Get the number of nodes required to build this config */
384 nodes = nodes_in_socket(nr_cores);
385
386 /*
387 * Divide the cores accros all the core complexes
388 * Return rounded up value
389 */
390 return DIV_ROUND_UP(nr_cores, nodes * MAX_CCX);
391 }
392
393 /* Encode cache info for CPUID[8000001D] */
394 static void encode_cache_cpuid8000001d(CPUCacheInfo *cache, CPUState *cs,
395 uint32_t *eax, uint32_t *ebx,
396 uint32_t *ecx, uint32_t *edx)
397 {
398 uint32_t l3_cores;
399 assert(cache->size == cache->line_size * cache->associativity *
400 cache->partitions * cache->sets);
401
402 *eax = CACHE_TYPE(cache->type) | CACHE_LEVEL(cache->level) |
403 (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0);
404
405 /* L3 is shared among multiple cores */
406 if (cache->level == 3) {
407 l3_cores = cores_in_core_complex(cs->nr_cores);
408 *eax |= ((l3_cores * cs->nr_threads) - 1) << 14;
409 } else {
410 *eax |= ((cs->nr_threads - 1) << 14);
411 }
412
413 assert(cache->line_size > 0);
414 assert(cache->partitions > 0);
415 assert(cache->associativity > 0);
416 /* We don't implement fully-associative caches */
417 assert(cache->associativity < cache->sets);
418 *ebx = (cache->line_size - 1) |
419 ((cache->partitions - 1) << 12) |
420 ((cache->associativity - 1) << 22);
421
422 assert(cache->sets > 0);
423 *ecx = cache->sets - 1;
424
425 *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
426 (cache->inclusive ? CACHE_INCLUSIVE : 0) |
427 (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
428 }
429
430 /* Data structure to hold the configuration info for a given core index */
431 struct core_topology {
432 /* core complex id of the current core index */
433 int ccx_id;
434 /*
435 * Adjusted core index for this core in the topology
436 * This can be 0,1,2,3 with max 4 cores in a core complex
437 */
438 int core_id;
439 /* Node id for this core index */
440 int node_id;
441 /* Number of nodes in this config */
442 int num_nodes;
443 };
444
445 /*
446 * Build the configuration closely match the EPYC hardware. Using the EPYC
447 * hardware configuration values (MAX_CCX, MAX_CORES_IN_CCX, MAX_CORES_IN_NODE)
448 * right now. This could change in future.
449 * nr_cores : Total number of cores in the config
450 * core_id : Core index of the current CPU
451 * topo : Data structure to hold all the config info for this core index
452 */
453 static void build_core_topology(int nr_cores, int core_id,
454 struct core_topology *topo)
455 {
456 int nodes, cores_in_ccx;
457
458 /* First get the number of nodes required */
459 nodes = nodes_in_socket(nr_cores);
460
461 cores_in_ccx = cores_in_core_complex(nr_cores);
462
463 topo->node_id = core_id / (cores_in_ccx * MAX_CCX);
464 topo->ccx_id = (core_id % (cores_in_ccx * MAX_CCX)) / cores_in_ccx;
465 topo->core_id = core_id % cores_in_ccx;
466 topo->num_nodes = nodes;
467 }
468
469 /* Encode cache info for CPUID[8000001E] */
470 static void encode_topo_cpuid8000001e(CPUState *cs, X86CPU *cpu,
471 uint32_t *eax, uint32_t *ebx,
472 uint32_t *ecx, uint32_t *edx)
473 {
474 struct core_topology topo = {0};
475 unsigned long nodes;
476 int shift;
477
478 build_core_topology(cs->nr_cores, cpu->core_id, &topo);
479 *eax = cpu->apic_id;
480 /*
481 * CPUID_Fn8000001E_EBX
482 * 31:16 Reserved
483 * 15:8 Threads per core (The number of threads per core is
484 * Threads per core + 1)
485 * 7:0 Core id (see bit decoding below)
486 * SMT:
487 * 4:3 node id
488 * 2 Core complex id
489 * 1:0 Core id
490 * Non SMT:
491 * 5:4 node id
492 * 3 Core complex id
493 * 1:0 Core id
494 */
495 if (cs->nr_threads - 1) {
496 *ebx = ((cs->nr_threads - 1) << 8) | (topo.node_id << 3) |
497 (topo.ccx_id << 2) | topo.core_id;
498 } else {
499 *ebx = (topo.node_id << 4) | (topo.ccx_id << 3) | topo.core_id;
500 }
501 /*
502 * CPUID_Fn8000001E_ECX
503 * 31:11 Reserved
504 * 10:8 Nodes per processor (Nodes per processor is number of nodes + 1)
505 * 7:0 Node id (see bit decoding below)
506 * 2 Socket id
507 * 1:0 Node id
508 */
509 if (topo.num_nodes <= 4) {
510 *ecx = ((topo.num_nodes - 1) << 8) | (cpu->socket_id << 2) |
511 topo.node_id;
512 } else {
513 /*
514 * Node id fix up. Actual hardware supports up to 4 nodes. But with
515 * more than 32 cores, we may end up with more than 4 nodes.
516 * Node id is a combination of socket id and node id. Only requirement
517 * here is that this number should be unique accross the system.
518 * Shift the socket id to accommodate more nodes. We dont expect both
519 * socket id and node id to be big number at the same time. This is not
520 * an ideal config but we need to to support it. Max nodes we can have
521 * is 32 (255/8) with 8 cores per node and 255 max cores. We only need
522 * 5 bits for nodes. Find the left most set bit to represent the total
523 * number of nodes. find_last_bit returns last set bit(0 based). Left
524 * shift(+1) the socket id to represent all the nodes.
525 */
526 nodes = topo.num_nodes - 1;
527 shift = find_last_bit(&nodes, 8);
528 *ecx = ((topo.num_nodes - 1) << 8) | (cpu->socket_id << (shift + 1)) |
529 topo.node_id;
530 }
531 *edx = 0;
532 }
533
534 /*
535 * Definitions of the hardcoded cache entries we expose:
536 * These are legacy cache values. If there is a need to change any
537 * of these values please use builtin_x86_defs
538 */
539
540 /* L1 data cache: */
541 static CPUCacheInfo legacy_l1d_cache = {
542 .type = DATA_CACHE,
543 .level = 1,
544 .size = 32 * KiB,
545 .self_init = 1,
546 .line_size = 64,
547 .associativity = 8,
548 .sets = 64,
549 .partitions = 1,
550 .no_invd_sharing = true,
551 };
552
553 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
554 static CPUCacheInfo legacy_l1d_cache_amd = {
555 .type = DATA_CACHE,
556 .level = 1,
557 .size = 64 * KiB,
558 .self_init = 1,
559 .line_size = 64,
560 .associativity = 2,
561 .sets = 512,
562 .partitions = 1,
563 .lines_per_tag = 1,
564 .no_invd_sharing = true,
565 };
566
567 /* L1 instruction cache: */
568 static CPUCacheInfo legacy_l1i_cache = {
569 .type = INSTRUCTION_CACHE,
570 .level = 1,
571 .size = 32 * KiB,
572 .self_init = 1,
573 .line_size = 64,
574 .associativity = 8,
575 .sets = 64,
576 .partitions = 1,
577 .no_invd_sharing = true,
578 };
579
580 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
581 static CPUCacheInfo legacy_l1i_cache_amd = {
582 .type = INSTRUCTION_CACHE,
583 .level = 1,
584 .size = 64 * KiB,
585 .self_init = 1,
586 .line_size = 64,
587 .associativity = 2,
588 .sets = 512,
589 .partitions = 1,
590 .lines_per_tag = 1,
591 .no_invd_sharing = true,
592 };
593
594 /* Level 2 unified cache: */
595 static CPUCacheInfo legacy_l2_cache = {
596 .type = UNIFIED_CACHE,
597 .level = 2,
598 .size = 4 * MiB,
599 .self_init = 1,
600 .line_size = 64,
601 .associativity = 16,
602 .sets = 4096,
603 .partitions = 1,
604 .no_invd_sharing = true,
605 };
606
607 /*FIXME: CPUID leaf 2 descriptor is inconsistent with CPUID leaf 4 */
608 static CPUCacheInfo legacy_l2_cache_cpuid2 = {
609 .type = UNIFIED_CACHE,
610 .level = 2,
611 .size = 2 * MiB,
612 .line_size = 64,
613 .associativity = 8,
614 };
615
616
617 /*FIXME: CPUID leaf 0x80000006 is inconsistent with leaves 2 & 4 */
618 static CPUCacheInfo legacy_l2_cache_amd = {
619 .type = UNIFIED_CACHE,
620 .level = 2,
621 .size = 512 * KiB,
622 .line_size = 64,
623 .lines_per_tag = 1,
624 .associativity = 16,
625 .sets = 512,
626 .partitions = 1,
627 };
628
629 /* Level 3 unified cache: */
630 static CPUCacheInfo legacy_l3_cache = {
631 .type = UNIFIED_CACHE,
632 .level = 3,
633 .size = 16 * MiB,
634 .line_size = 64,
635 .associativity = 16,
636 .sets = 16384,
637 .partitions = 1,
638 .lines_per_tag = 1,
639 .self_init = true,
640 .inclusive = true,
641 .complex_indexing = true,
642 };
643
644 /* TLB definitions: */
645
646 #define L1_DTLB_2M_ASSOC 1
647 #define L1_DTLB_2M_ENTRIES 255
648 #define L1_DTLB_4K_ASSOC 1
649 #define L1_DTLB_4K_ENTRIES 255
650
651 #define L1_ITLB_2M_ASSOC 1
652 #define L1_ITLB_2M_ENTRIES 255
653 #define L1_ITLB_4K_ASSOC 1
654 #define L1_ITLB_4K_ENTRIES 255
655
656 #define L2_DTLB_2M_ASSOC 0 /* disabled */
657 #define L2_DTLB_2M_ENTRIES 0 /* disabled */
658 #define L2_DTLB_4K_ASSOC 4
659 #define L2_DTLB_4K_ENTRIES 512
660
661 #define L2_ITLB_2M_ASSOC 0 /* disabled */
662 #define L2_ITLB_2M_ENTRIES 0 /* disabled */
663 #define L2_ITLB_4K_ASSOC 4
664 #define L2_ITLB_4K_ENTRIES 512
665
666 /* CPUID Leaf 0x14 constants: */
667 #define INTEL_PT_MAX_SUBLEAF 0x1
668 /*
669 * bit[00]: IA32_RTIT_CTL.CR3 filter can be set to 1 and IA32_RTIT_CR3_MATCH
670 * MSR can be accessed;
671 * bit[01]: Support Configurable PSB and Cycle-Accurate Mode;
672 * bit[02]: Support IP Filtering, TraceStop filtering, and preservation
673 * of Intel PT MSRs across warm reset;
674 * bit[03]: Support MTC timing packet and suppression of COFI-based packets;
675 */
676 #define INTEL_PT_MINIMAL_EBX 0xf
677 /*
678 * bit[00]: Tracing can be enabled with IA32_RTIT_CTL.ToPA = 1 and
679 * IA32_RTIT_OUTPUT_BASE and IA32_RTIT_OUTPUT_MASK_PTRS MSRs can be
680 * accessed;
681 * bit[01]: ToPA tables can hold any number of output entries, up to the
682 * maximum allowed by the MaskOrTableOffset field of
683 * IA32_RTIT_OUTPUT_MASK_PTRS;
684 * bit[02]: Support Single-Range Output scheme;
685 */
686 #define INTEL_PT_MINIMAL_ECX 0x7
687 /* generated packets which contain IP payloads have LIP values */
688 #define INTEL_PT_IP_LIP (1 << 31)
689 #define INTEL_PT_ADDR_RANGES_NUM 0x2 /* Number of configurable address ranges */
690 #define INTEL_PT_ADDR_RANGES_NUM_MASK 0x3
691 #define INTEL_PT_MTC_BITMAP (0x0249 << 16) /* Support ART(0,3,6,9) */
692 #define INTEL_PT_CYCLE_BITMAP 0x1fff /* Support 0,2^(0~11) */
693 #define INTEL_PT_PSB_BITMAP (0x003f << 16) /* Support 2K,4K,8K,16K,32K,64K */
694
695 static void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1,
696 uint32_t vendor2, uint32_t vendor3)
697 {
698 int i;
699 for (i = 0; i < 4; i++) {
700 dst[i] = vendor1 >> (8 * i);
701 dst[i + 4] = vendor2 >> (8 * i);
702 dst[i + 8] = vendor3 >> (8 * i);
703 }
704 dst[CPUID_VENDOR_SZ] = '\0';
705 }
706
707 #define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
708 #define PENTIUM_FEATURES (I486_FEATURES | CPUID_DE | CPUID_TSC | \
709 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_MMX | CPUID_APIC)
710 #define PENTIUM2_FEATURES (PENTIUM_FEATURES | CPUID_PAE | CPUID_SEP | \
711 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
712 CPUID_PSE36 | CPUID_FXSR)
713 #define PENTIUM3_FEATURES (PENTIUM2_FEATURES | CPUID_SSE)
714 #define PPRO_FEATURES (CPUID_FP87 | CPUID_DE | CPUID_PSE | CPUID_TSC | \
715 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_PGE | CPUID_CMOV | \
716 CPUID_PAT | CPUID_FXSR | CPUID_MMX | CPUID_SSE | CPUID_SSE2 | \
717 CPUID_PAE | CPUID_SEP | CPUID_APIC)
718
719 #define TCG_FEATURES (CPUID_FP87 | CPUID_PSE | CPUID_TSC | CPUID_MSR | \
720 CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | CPUID_SEP | \
721 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
722 CPUID_PSE36 | CPUID_CLFLUSH | CPUID_ACPI | CPUID_MMX | \
723 CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS | CPUID_DE)
724 /* partly implemented:
725 CPUID_MTRR, CPUID_MCA, CPUID_CLFLUSH (needed for Win64) */
726 /* missing:
727 CPUID_VME, CPUID_DTS, CPUID_SS, CPUID_HT, CPUID_TM, CPUID_PBE */
728 #define TCG_EXT_FEATURES (CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | \
729 CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | \
730 CPUID_EXT_SSE41 | CPUID_EXT_SSE42 | CPUID_EXT_POPCNT | \
731 CPUID_EXT_XSAVE | /* CPUID_EXT_OSXSAVE is dynamic */ \
732 CPUID_EXT_MOVBE | CPUID_EXT_AES | CPUID_EXT_HYPERVISOR)
733 /* missing:
734 CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_SMX,
735 CPUID_EXT_EST, CPUID_EXT_TM2, CPUID_EXT_CID, CPUID_EXT_FMA,
736 CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_PCID, CPUID_EXT_DCA,
737 CPUID_EXT_X2APIC, CPUID_EXT_TSC_DEADLINE_TIMER, CPUID_EXT_AVX,
738 CPUID_EXT_F16C, CPUID_EXT_RDRAND */
739
740 #ifdef TARGET_X86_64
741 #define TCG_EXT2_X86_64_FEATURES (CPUID_EXT2_SYSCALL | CPUID_EXT2_LM)
742 #else
743 #define TCG_EXT2_X86_64_FEATURES 0
744 #endif
745
746 #define TCG_EXT2_FEATURES ((TCG_FEATURES & CPUID_EXT2_AMD_ALIASES) | \
747 CPUID_EXT2_NX | CPUID_EXT2_MMXEXT | CPUID_EXT2_RDTSCP | \
748 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_PDPE1GB | \
749 TCG_EXT2_X86_64_FEATURES)
750 #define TCG_EXT3_FEATURES (CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | \
751 CPUID_EXT3_CR8LEG | CPUID_EXT3_ABM | CPUID_EXT3_SSE4A)
752 #define TCG_EXT4_FEATURES 0
753 #define TCG_SVM_FEATURES CPUID_SVM_NPT
754 #define TCG_KVM_FEATURES 0
755 #define TCG_7_0_EBX_FEATURES (CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_SMAP | \
756 CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX | \
757 CPUID_7_0_EBX_PCOMMIT | CPUID_7_0_EBX_CLFLUSHOPT | \
758 CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_FSGSBASE | \
759 CPUID_7_0_EBX_ERMS)
760 /* missing:
761 CPUID_7_0_EBX_HLE, CPUID_7_0_EBX_AVX2,
762 CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM,
763 CPUID_7_0_EBX_RDSEED */
764 #define TCG_7_0_ECX_FEATURES (CPUID_7_0_ECX_PKU | \
765 /* CPUID_7_0_ECX_OSPKE is dynamic */ \
766 CPUID_7_0_ECX_LA57)
767 #define TCG_7_0_EDX_FEATURES 0
768 #define TCG_APM_FEATURES 0
769 #define TCG_6_EAX_FEATURES CPUID_6_EAX_ARAT
770 #define TCG_XSAVE_FEATURES (CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XGETBV1)
771 /* missing:
772 CPUID_XSAVE_XSAVEC, CPUID_XSAVE_XSAVES */
773
774 typedef enum FeatureWordType {
775 CPUID_FEATURE_WORD,
776 MSR_FEATURE_WORD,
777 } FeatureWordType;
778
779 typedef struct FeatureWordInfo {
780 FeatureWordType type;
781 /* feature flags names are taken from "Intel Processor Identification and
782 * the CPUID Instruction" and AMD's "CPUID Specification".
783 * In cases of disagreement between feature naming conventions,
784 * aliases may be added.
785 */
786 const char *feat_names[32];
787 union {
788 /* If type==CPUID_FEATURE_WORD */
789 struct {
790 uint32_t eax; /* Input EAX for CPUID */
791 bool needs_ecx; /* CPUID instruction uses ECX as input */
792 uint32_t ecx; /* Input ECX value for CPUID */
793 int reg; /* output register (R_* constant) */
794 } cpuid;
795 /* If type==MSR_FEATURE_WORD */
796 struct {
797 uint32_t index;
798 struct { /*CPUID that enumerate this MSR*/
799 FeatureWord cpuid_class;
800 uint32_t cpuid_flag;
801 } cpuid_dep;
802 } msr;
803 };
804 uint32_t tcg_features; /* Feature flags supported by TCG */
805 uint32_t unmigratable_flags; /* Feature flags known to be unmigratable */
806 uint32_t migratable_flags; /* Feature flags known to be migratable */
807 /* Features that shouldn't be auto-enabled by "-cpu host" */
808 uint32_t no_autoenable_flags;
809 } FeatureWordInfo;
810
811 static FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
812 [FEAT_1_EDX] = {
813 .type = CPUID_FEATURE_WORD,
814 .feat_names = {
815 "fpu", "vme", "de", "pse",
816 "tsc", "msr", "pae", "mce",
817 "cx8", "apic", NULL, "sep",
818 "mtrr", "pge", "mca", "cmov",
819 "pat", "pse36", "pn" /* Intel psn */, "clflush" /* Intel clfsh */,
820 NULL, "ds" /* Intel dts */, "acpi", "mmx",
821 "fxsr", "sse", "sse2", "ss",
822 "ht" /* Intel htt */, "tm", "ia64", "pbe",
823 },
824 .cpuid = {.eax = 1, .reg = R_EDX, },
825 .tcg_features = TCG_FEATURES,
826 },
827 [FEAT_1_ECX] = {
828 .type = CPUID_FEATURE_WORD,
829 .feat_names = {
830 "pni" /* Intel,AMD sse3 */, "pclmulqdq", "dtes64", "monitor",
831 "ds-cpl", "vmx", "smx", "est",
832 "tm2", "ssse3", "cid", NULL,
833 "fma", "cx16", "xtpr", "pdcm",
834 NULL, "pcid", "dca", "sse4.1",
835 "sse4.2", "x2apic", "movbe", "popcnt",
836 "tsc-deadline", "aes", "xsave", NULL /* osxsave */,
837 "avx", "f16c", "rdrand", "hypervisor",
838 },
839 .cpuid = { .eax = 1, .reg = R_ECX, },
840 .tcg_features = TCG_EXT_FEATURES,
841 },
842 /* Feature names that are already defined on feature_name[] but
843 * are set on CPUID[8000_0001].EDX on AMD CPUs don't have their
844 * names on feat_names below. They are copied automatically
845 * to features[FEAT_8000_0001_EDX] if and only if CPU vendor is AMD.
846 */
847 [FEAT_8000_0001_EDX] = {
848 .type = CPUID_FEATURE_WORD,
849 .feat_names = {
850 NULL /* fpu */, NULL /* vme */, NULL /* de */, NULL /* pse */,
851 NULL /* tsc */, NULL /* msr */, NULL /* pae */, NULL /* mce */,
852 NULL /* cx8 */, NULL /* apic */, NULL, "syscall",
853 NULL /* mtrr */, NULL /* pge */, NULL /* mca */, NULL /* cmov */,
854 NULL /* pat */, NULL /* pse36 */, NULL, NULL /* Linux mp */,
855 "nx", NULL, "mmxext", NULL /* mmx */,
856 NULL /* fxsr */, "fxsr-opt", "pdpe1gb", "rdtscp",
857 NULL, "lm", "3dnowext", "3dnow",
858 },
859 .cpuid = { .eax = 0x80000001, .reg = R_EDX, },
860 .tcg_features = TCG_EXT2_FEATURES,
861 },
862 [FEAT_8000_0001_ECX] = {
863 .type = CPUID_FEATURE_WORD,
864 .feat_names = {
865 "lahf-lm", "cmp-legacy", "svm", "extapic",
866 "cr8legacy", "abm", "sse4a", "misalignsse",
867 "3dnowprefetch", "osvw", "ibs", "xop",
868 "skinit", "wdt", NULL, "lwp",
869 "fma4", "tce", NULL, "nodeid-msr",
870 NULL, "tbm", "topoext", "perfctr-core",
871 "perfctr-nb", NULL, NULL, NULL,
872 NULL, NULL, NULL, NULL,
873 },
874 .cpuid = { .eax = 0x80000001, .reg = R_ECX, },
875 .tcg_features = TCG_EXT3_FEATURES,
876 /*
877 * TOPOEXT is always allowed but can't be enabled blindly by
878 * "-cpu host", as it requires consistent cache topology info
879 * to be provided so it doesn't confuse guests.
880 */
881 .no_autoenable_flags = CPUID_EXT3_TOPOEXT,
882 },
883 [FEAT_C000_0001_EDX] = {
884 .type = CPUID_FEATURE_WORD,
885 .feat_names = {
886 NULL, NULL, "xstore", "xstore-en",
887 NULL, NULL, "xcrypt", "xcrypt-en",
888 "ace2", "ace2-en", "phe", "phe-en",
889 "pmm", "pmm-en", NULL, NULL,
890 NULL, NULL, NULL, NULL,
891 NULL, NULL, NULL, NULL,
892 NULL, NULL, NULL, NULL,
893 NULL, NULL, NULL, NULL,
894 },
895 .cpuid = { .eax = 0xC0000001, .reg = R_EDX, },
896 .tcg_features = TCG_EXT4_FEATURES,
897 },
898 [FEAT_KVM] = {
899 .type = CPUID_FEATURE_WORD,
900 .feat_names = {
901 "kvmclock", "kvm-nopiodelay", "kvm-mmu", "kvmclock",
902 "kvm-asyncpf", "kvm-steal-time", "kvm-pv-eoi", "kvm-pv-unhalt",
903 NULL, "kvm-pv-tlb-flush", NULL, "kvm-pv-ipi",
904 NULL, NULL, NULL, NULL,
905 NULL, NULL, NULL, NULL,
906 NULL, NULL, NULL, NULL,
907 "kvmclock-stable-bit", NULL, NULL, NULL,
908 NULL, NULL, NULL, NULL,
909 },
910 .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EAX, },
911 .tcg_features = TCG_KVM_FEATURES,
912 },
913 [FEAT_KVM_HINTS] = {
914 .type = CPUID_FEATURE_WORD,
915 .feat_names = {
916 "kvm-hint-dedicated", NULL, NULL, NULL,
917 NULL, NULL, NULL, NULL,
918 NULL, 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 },
925 .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EDX, },
926 .tcg_features = TCG_KVM_FEATURES,
927 /*
928 * KVM hints aren't auto-enabled by -cpu host, they need to be
929 * explicitly enabled in the command-line.
930 */
931 .no_autoenable_flags = ~0U,
932 },
933 /*
934 * .feat_names are commented out for Hyper-V enlightenments because we
935 * don't want to have two different ways for enabling them on QEMU command
936 * line. Some features (e.g. "hyperv_time", "hyperv_vapic", ...) require
937 * enabling several feature bits simultaneously, exposing these bits
938 * individually may just confuse guests.
939 */
940 [FEAT_HYPERV_EAX] = {
941 .type = CPUID_FEATURE_WORD,
942 .feat_names = {
943 NULL /* hv_msr_vp_runtime_access */, NULL /* hv_msr_time_refcount_access */,
944 NULL /* hv_msr_synic_access */, NULL /* hv_msr_stimer_access */,
945 NULL /* hv_msr_apic_access */, NULL /* hv_msr_hypercall_access */,
946 NULL /* hv_vpindex_access */, NULL /* hv_msr_reset_access */,
947 NULL /* hv_msr_stats_access */, NULL /* hv_reftsc_access */,
948 NULL /* hv_msr_idle_access */, NULL /* hv_msr_frequency_access */,
949 NULL /* hv_msr_debug_access */, NULL /* hv_msr_reenlightenment_access */,
950 NULL, NULL,
951 NULL, NULL, NULL, NULL,
952 NULL, NULL, NULL, NULL,
953 NULL, NULL, NULL, NULL,
954 NULL, NULL, NULL, NULL,
955 },
956 .cpuid = { .eax = 0x40000003, .reg = R_EAX, },
957 },
958 [FEAT_HYPERV_EBX] = {
959 .type = CPUID_FEATURE_WORD,
960 .feat_names = {
961 NULL /* hv_create_partitions */, NULL /* hv_access_partition_id */,
962 NULL /* hv_access_memory_pool */, NULL /* hv_adjust_message_buffers */,
963 NULL /* hv_post_messages */, NULL /* hv_signal_events */,
964 NULL /* hv_create_port */, NULL /* hv_connect_port */,
965 NULL /* hv_access_stats */, NULL, NULL, NULL /* hv_debugging */,
966 NULL /* hv_cpu_power_management */, NULL /* hv_configure_profiler */,
967 NULL, NULL,
968 NULL, NULL, NULL, NULL,
969 NULL, NULL, NULL, NULL,
970 NULL, NULL, NULL, NULL,
971 NULL, NULL, NULL, NULL,
972 },
973 .cpuid = { .eax = 0x40000003, .reg = R_EBX, },
974 },
975 [FEAT_HYPERV_EDX] = {
976 .type = CPUID_FEATURE_WORD,
977 .feat_names = {
978 NULL /* hv_mwait */, NULL /* hv_guest_debugging */,
979 NULL /* hv_perf_monitor */, NULL /* hv_cpu_dynamic_part */,
980 NULL /* hv_hypercall_params_xmm */, NULL /* hv_guest_idle_state */,
981 NULL, NULL,
982 NULL, NULL, NULL /* hv_guest_crash_msr */, NULL,
983 NULL, NULL, NULL, NULL,
984 NULL, NULL, NULL, NULL,
985 NULL, NULL, NULL, NULL,
986 NULL, NULL, NULL, NULL,
987 NULL, NULL, NULL, NULL,
988 },
989 .cpuid = { .eax = 0x40000003, .reg = R_EDX, },
990 },
991 [FEAT_HV_RECOMM_EAX] = {
992 .type = CPUID_FEATURE_WORD,
993 .feat_names = {
994 NULL /* hv_recommend_pv_as_switch */,
995 NULL /* hv_recommend_pv_tlbflush_local */,
996 NULL /* hv_recommend_pv_tlbflush_remote */,
997 NULL /* hv_recommend_msr_apic_access */,
998 NULL /* hv_recommend_msr_reset */,
999 NULL /* hv_recommend_relaxed_timing */,
1000 NULL /* hv_recommend_dma_remapping */,
1001 NULL /* hv_recommend_int_remapping */,
1002 NULL /* hv_recommend_x2apic_msrs */,
1003 NULL /* hv_recommend_autoeoi_deprecation */,
1004 NULL /* hv_recommend_pv_ipi */,
1005 NULL /* hv_recommend_ex_hypercalls */,
1006 NULL /* hv_hypervisor_is_nested */,
1007 NULL /* hv_recommend_int_mbec */,
1008 NULL /* hv_recommend_evmcs */,
1009 NULL,
1010 NULL, NULL, NULL, NULL,
1011 NULL, NULL, NULL, NULL,
1012 NULL, NULL, NULL, NULL,
1013 NULL, NULL, NULL, NULL,
1014 },
1015 .cpuid = { .eax = 0x40000004, .reg = R_EAX, },
1016 },
1017 [FEAT_HV_NESTED_EAX] = {
1018 .type = CPUID_FEATURE_WORD,
1019 .cpuid = { .eax = 0x4000000A, .reg = R_EAX, },
1020 },
1021 [FEAT_SVM] = {
1022 .type = CPUID_FEATURE_WORD,
1023 .feat_names = {
1024 "npt", "lbrv", "svm-lock", "nrip-save",
1025 "tsc-scale", "vmcb-clean", "flushbyasid", "decodeassists",
1026 NULL, NULL, "pause-filter", NULL,
1027 "pfthreshold", NULL, NULL, NULL,
1028 NULL, NULL, NULL, NULL,
1029 NULL, NULL, NULL, NULL,
1030 NULL, NULL, NULL, NULL,
1031 NULL, NULL, NULL, NULL,
1032 },
1033 .cpuid = { .eax = 0x8000000A, .reg = R_EDX, },
1034 .tcg_features = TCG_SVM_FEATURES,
1035 },
1036 [FEAT_7_0_EBX] = {
1037 .type = CPUID_FEATURE_WORD,
1038 .feat_names = {
1039 "fsgsbase", "tsc-adjust", NULL, "bmi1",
1040 "hle", "avx2", NULL, "smep",
1041 "bmi2", "erms", "invpcid", "rtm",
1042 NULL, NULL, "mpx", NULL,
1043 "avx512f", "avx512dq", "rdseed", "adx",
1044 "smap", "avx512ifma", "pcommit", "clflushopt",
1045 "clwb", "intel-pt", "avx512pf", "avx512er",
1046 "avx512cd", "sha-ni", "avx512bw", "avx512vl",
1047 },
1048 .cpuid = {
1049 .eax = 7,
1050 .needs_ecx = true, .ecx = 0,
1051 .reg = R_EBX,
1052 },
1053 .tcg_features = TCG_7_0_EBX_FEATURES,
1054 },
1055 [FEAT_7_0_ECX] = {
1056 .type = CPUID_FEATURE_WORD,
1057 .feat_names = {
1058 NULL, "avx512vbmi", "umip", "pku",
1059 NULL /* ospke */, NULL, "avx512vbmi2", NULL,
1060 "gfni", "vaes", "vpclmulqdq", "avx512vnni",
1061 "avx512bitalg", NULL, "avx512-vpopcntdq", NULL,
1062 "la57", NULL, NULL, NULL,
1063 NULL, NULL, "rdpid", NULL,
1064 NULL, "cldemote", NULL, "movdiri",
1065 "movdir64b", NULL, NULL, NULL,
1066 },
1067 .cpuid = {
1068 .eax = 7,
1069 .needs_ecx = true, .ecx = 0,
1070 .reg = R_ECX,
1071 },
1072 .tcg_features = TCG_7_0_ECX_FEATURES,
1073 },
1074 [FEAT_7_0_EDX] = {
1075 .type = CPUID_FEATURE_WORD,
1076 .feat_names = {
1077 NULL, NULL, "avx512-4vnniw", "avx512-4fmaps",
1078 NULL, NULL, NULL, NULL,
1079 NULL, NULL, NULL, NULL,
1080 NULL, NULL, NULL, NULL,
1081 NULL, NULL, NULL, NULL,
1082 NULL, NULL, NULL, NULL,
1083 NULL, NULL, "spec-ctrl", "stibp",
1084 NULL, "arch-capabilities", NULL, "ssbd",
1085 },
1086 .cpuid = {
1087 .eax = 7,
1088 .needs_ecx = true, .ecx = 0,
1089 .reg = R_EDX,
1090 },
1091 .tcg_features = TCG_7_0_EDX_FEATURES,
1092 .unmigratable_flags = CPUID_7_0_EDX_ARCH_CAPABILITIES,
1093 },
1094 [FEAT_8000_0007_EDX] = {
1095 .type = CPUID_FEATURE_WORD,
1096 .feat_names = {
1097 NULL, NULL, NULL, NULL,
1098 NULL, NULL, NULL, NULL,
1099 "invtsc", NULL, 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 },
1106 .cpuid = { .eax = 0x80000007, .reg = R_EDX, },
1107 .tcg_features = TCG_APM_FEATURES,
1108 .unmigratable_flags = CPUID_APM_INVTSC,
1109 },
1110 [FEAT_8000_0008_EBX] = {
1111 .type = CPUID_FEATURE_WORD,
1112 .feat_names = {
1113 NULL, NULL, NULL, NULL,
1114 NULL, NULL, NULL, NULL,
1115 NULL, "wbnoinvd", NULL, NULL,
1116 "ibpb", NULL, NULL, NULL,
1117 NULL, NULL, NULL, NULL,
1118 NULL, NULL, NULL, NULL,
1119 "amd-ssbd", "virt-ssbd", "amd-no-ssb", NULL,
1120 NULL, NULL, NULL, NULL,
1121 },
1122 .cpuid = { .eax = 0x80000008, .reg = R_EBX, },
1123 .tcg_features = 0,
1124 .unmigratable_flags = 0,
1125 },
1126 [FEAT_XSAVE] = {
1127 .type = CPUID_FEATURE_WORD,
1128 .feat_names = {
1129 "xsaveopt", "xsavec", "xgetbv1", "xsaves",
1130 NULL, NULL, NULL, NULL,
1131 NULL, NULL, NULL, NULL,
1132 NULL, NULL, NULL, NULL,
1133 NULL, NULL, NULL, NULL,
1134 NULL, NULL, NULL, NULL,
1135 NULL, NULL, NULL, NULL,
1136 NULL, NULL, NULL, NULL,
1137 },
1138 .cpuid = {
1139 .eax = 0xd,
1140 .needs_ecx = true, .ecx = 1,
1141 .reg = R_EAX,
1142 },
1143 .tcg_features = TCG_XSAVE_FEATURES,
1144 },
1145 [FEAT_6_EAX] = {
1146 .type = CPUID_FEATURE_WORD,
1147 .feat_names = {
1148 NULL, NULL, "arat", NULL,
1149 NULL, NULL, NULL, NULL,
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 },
1157 .cpuid = { .eax = 6, .reg = R_EAX, },
1158 .tcg_features = TCG_6_EAX_FEATURES,
1159 },
1160 [FEAT_XSAVE_COMP_LO] = {
1161 .type = CPUID_FEATURE_WORD,
1162 .cpuid = {
1163 .eax = 0xD,
1164 .needs_ecx = true, .ecx = 0,
1165 .reg = R_EAX,
1166 },
1167 .tcg_features = ~0U,
1168 .migratable_flags = XSTATE_FP_MASK | XSTATE_SSE_MASK |
1169 XSTATE_YMM_MASK | XSTATE_BNDREGS_MASK | XSTATE_BNDCSR_MASK |
1170 XSTATE_OPMASK_MASK | XSTATE_ZMM_Hi256_MASK | XSTATE_Hi16_ZMM_MASK |
1171 XSTATE_PKRU_MASK,
1172 },
1173 [FEAT_XSAVE_COMP_HI] = {
1174 .type = CPUID_FEATURE_WORD,
1175 .cpuid = {
1176 .eax = 0xD,
1177 .needs_ecx = true, .ecx = 0,
1178 .reg = R_EDX,
1179 },
1180 .tcg_features = ~0U,
1181 },
1182 /*Below are MSR exposed features*/
1183 [FEAT_ARCH_CAPABILITIES] = {
1184 .type = MSR_FEATURE_WORD,
1185 .feat_names = {
1186 "rdctl-no", "ibrs-all", "rsba", "skip-l1dfl-vmentry",
1187 "ssb-no", NULL, NULL, NULL,
1188 NULL, NULL, NULL, NULL,
1189 NULL, NULL, NULL, NULL,
1190 NULL, NULL, NULL, NULL,
1191 NULL, NULL, NULL, NULL,
1192 NULL, NULL, NULL, NULL,
1193 NULL, NULL, NULL, NULL,
1194 },
1195 .msr = {
1196 .index = MSR_IA32_ARCH_CAPABILITIES,
1197 .cpuid_dep = {
1198 FEAT_7_0_EDX,
1199 CPUID_7_0_EDX_ARCH_CAPABILITIES
1200 }
1201 },
1202 },
1203 };
1204
1205 typedef struct X86RegisterInfo32 {
1206 /* Name of register */
1207 const char *name;
1208 /* QAPI enum value register */
1209 X86CPURegister32 qapi_enum;
1210 } X86RegisterInfo32;
1211
1212 #define REGISTER(reg) \
1213 [R_##reg] = { .name = #reg, .qapi_enum = X86_CPU_REGISTER32_##reg }
1214 static const X86RegisterInfo32 x86_reg_info_32[CPU_NB_REGS32] = {
1215 REGISTER(EAX),
1216 REGISTER(ECX),
1217 REGISTER(EDX),
1218 REGISTER(EBX),
1219 REGISTER(ESP),
1220 REGISTER(EBP),
1221 REGISTER(ESI),
1222 REGISTER(EDI),
1223 };
1224 #undef REGISTER
1225
1226 typedef struct ExtSaveArea {
1227 uint32_t feature, bits;
1228 uint32_t offset, size;
1229 } ExtSaveArea;
1230
1231 static const ExtSaveArea x86_ext_save_areas[] = {
1232 [XSTATE_FP_BIT] = {
1233 /* x87 FP state component is always enabled if XSAVE is supported */
1234 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
1235 /* x87 state is in the legacy region of the XSAVE area */
1236 .offset = 0,
1237 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1238 },
1239 [XSTATE_SSE_BIT] = {
1240 /* SSE state component is always enabled if XSAVE is supported */
1241 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
1242 /* SSE state is in the legacy region of the XSAVE area */
1243 .offset = 0,
1244 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1245 },
1246 [XSTATE_YMM_BIT] =
1247 { .feature = FEAT_1_ECX, .bits = CPUID_EXT_AVX,
1248 .offset = offsetof(X86XSaveArea, avx_state),
1249 .size = sizeof(XSaveAVX) },
1250 [XSTATE_BNDREGS_BIT] =
1251 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
1252 .offset = offsetof(X86XSaveArea, bndreg_state),
1253 .size = sizeof(XSaveBNDREG) },
1254 [XSTATE_BNDCSR_BIT] =
1255 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
1256 .offset = offsetof(X86XSaveArea, bndcsr_state),
1257 .size = sizeof(XSaveBNDCSR) },
1258 [XSTATE_OPMASK_BIT] =
1259 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1260 .offset = offsetof(X86XSaveArea, opmask_state),
1261 .size = sizeof(XSaveOpmask) },
1262 [XSTATE_ZMM_Hi256_BIT] =
1263 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1264 .offset = offsetof(X86XSaveArea, zmm_hi256_state),
1265 .size = sizeof(XSaveZMM_Hi256) },
1266 [XSTATE_Hi16_ZMM_BIT] =
1267 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1268 .offset = offsetof(X86XSaveArea, hi16_zmm_state),
1269 .size = sizeof(XSaveHi16_ZMM) },
1270 [XSTATE_PKRU_BIT] =
1271 { .feature = FEAT_7_0_ECX, .bits = CPUID_7_0_ECX_PKU,
1272 .offset = offsetof(X86XSaveArea, pkru_state),
1273 .size = sizeof(XSavePKRU) },
1274 };
1275
1276 static uint32_t xsave_area_size(uint64_t mask)
1277 {
1278 int i;
1279 uint64_t ret = 0;
1280
1281 for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
1282 const ExtSaveArea *esa = &x86_ext_save_areas[i];
1283 if ((mask >> i) & 1) {
1284 ret = MAX(ret, esa->offset + esa->size);
1285 }
1286 }
1287 return ret;
1288 }
1289
1290 static inline bool accel_uses_host_cpuid(void)
1291 {
1292 return kvm_enabled() || hvf_enabled();
1293 }
1294
1295 static inline uint64_t x86_cpu_xsave_components(X86CPU *cpu)
1296 {
1297 return ((uint64_t)cpu->env.features[FEAT_XSAVE_COMP_HI]) << 32 |
1298 cpu->env.features[FEAT_XSAVE_COMP_LO];
1299 }
1300
1301 const char *get_register_name_32(unsigned int reg)
1302 {
1303 if (reg >= CPU_NB_REGS32) {
1304 return NULL;
1305 }
1306 return x86_reg_info_32[reg].name;
1307 }
1308
1309 /*
1310 * Returns the set of feature flags that are supported and migratable by
1311 * QEMU, for a given FeatureWord.
1312 */
1313 static uint32_t x86_cpu_get_migratable_flags(FeatureWord w)
1314 {
1315 FeatureWordInfo *wi = &feature_word_info[w];
1316 uint32_t r = 0;
1317 int i;
1318
1319 for (i = 0; i < 32; i++) {
1320 uint32_t f = 1U << i;
1321
1322 /* If the feature name is known, it is implicitly considered migratable,
1323 * unless it is explicitly set in unmigratable_flags */
1324 if ((wi->migratable_flags & f) ||
1325 (wi->feat_names[i] && !(wi->unmigratable_flags & f))) {
1326 r |= f;
1327 }
1328 }
1329 return r;
1330 }
1331
1332 void host_cpuid(uint32_t function, uint32_t count,
1333 uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
1334 {
1335 uint32_t vec[4];
1336
1337 #ifdef __x86_64__
1338 asm volatile("cpuid"
1339 : "=a"(vec[0]), "=b"(vec[1]),
1340 "=c"(vec[2]), "=d"(vec[3])
1341 : "0"(function), "c"(count) : "cc");
1342 #elif defined(__i386__)
1343 asm volatile("pusha \n\t"
1344 "cpuid \n\t"
1345 "mov %%eax, 0(%2) \n\t"
1346 "mov %%ebx, 4(%2) \n\t"
1347 "mov %%ecx, 8(%2) \n\t"
1348 "mov %%edx, 12(%2) \n\t"
1349 "popa"
1350 : : "a"(function), "c"(count), "S"(vec)
1351 : "memory", "cc");
1352 #else
1353 abort();
1354 #endif
1355
1356 if (eax)
1357 *eax = vec[0];
1358 if (ebx)
1359 *ebx = vec[1];
1360 if (ecx)
1361 *ecx = vec[2];
1362 if (edx)
1363 *edx = vec[3];
1364 }
1365
1366 void host_vendor_fms(char *vendor, int *family, int *model, int *stepping)
1367 {
1368 uint32_t eax, ebx, ecx, edx;
1369
1370 host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx);
1371 x86_cpu_vendor_words2str(vendor, ebx, edx, ecx);
1372
1373 host_cpuid(0x1, 0, &eax, &ebx, &ecx, &edx);
1374 if (family) {
1375 *family = ((eax >> 8) & 0x0F) + ((eax >> 20) & 0xFF);
1376 }
1377 if (model) {
1378 *model = ((eax >> 4) & 0x0F) | ((eax & 0xF0000) >> 12);
1379 }
1380 if (stepping) {
1381 *stepping = eax & 0x0F;
1382 }
1383 }
1384
1385 /* CPU class name definitions: */
1386
1387 /* Return type name for a given CPU model name
1388 * Caller is responsible for freeing the returned string.
1389 */
1390 static char *x86_cpu_type_name(const char *model_name)
1391 {
1392 return g_strdup_printf(X86_CPU_TYPE_NAME("%s"), model_name);
1393 }
1394
1395 static ObjectClass *x86_cpu_class_by_name(const char *cpu_model)
1396 {
1397 ObjectClass *oc;
1398 char *typename = x86_cpu_type_name(cpu_model);
1399 oc = object_class_by_name(typename);
1400 g_free(typename);
1401 return oc;
1402 }
1403
1404 static char *x86_cpu_class_get_model_name(X86CPUClass *cc)
1405 {
1406 const char *class_name = object_class_get_name(OBJECT_CLASS(cc));
1407 assert(g_str_has_suffix(class_name, X86_CPU_TYPE_SUFFIX));
1408 return g_strndup(class_name,
1409 strlen(class_name) - strlen(X86_CPU_TYPE_SUFFIX));
1410 }
1411
1412 struct X86CPUDefinition {
1413 const char *name;
1414 uint32_t level;
1415 uint32_t xlevel;
1416 /* vendor is zero-terminated, 12 character ASCII string */
1417 char vendor[CPUID_VENDOR_SZ + 1];
1418 int family;
1419 int model;
1420 int stepping;
1421 FeatureWordArray features;
1422 const char *model_id;
1423 CPUCaches *cache_info;
1424 };
1425
1426 static CPUCaches epyc_cache_info = {
1427 .l1d_cache = &(CPUCacheInfo) {
1428 .type = DATA_CACHE,
1429 .level = 1,
1430 .size = 32 * KiB,
1431 .line_size = 64,
1432 .associativity = 8,
1433 .partitions = 1,
1434 .sets = 64,
1435 .lines_per_tag = 1,
1436 .self_init = 1,
1437 .no_invd_sharing = true,
1438 },
1439 .l1i_cache = &(CPUCacheInfo) {
1440 .type = INSTRUCTION_CACHE,
1441 .level = 1,
1442 .size = 64 * KiB,
1443 .line_size = 64,
1444 .associativity = 4,
1445 .partitions = 1,
1446 .sets = 256,
1447 .lines_per_tag = 1,
1448 .self_init = 1,
1449 .no_invd_sharing = true,
1450 },
1451 .l2_cache = &(CPUCacheInfo) {
1452 .type = UNIFIED_CACHE,
1453 .level = 2,
1454 .size = 512 * KiB,
1455 .line_size = 64,
1456 .associativity = 8,
1457 .partitions = 1,
1458 .sets = 1024,
1459 .lines_per_tag = 1,
1460 },
1461 .l3_cache = &(CPUCacheInfo) {
1462 .type = UNIFIED_CACHE,
1463 .level = 3,
1464 .size = 8 * MiB,
1465 .line_size = 64,
1466 .associativity = 16,
1467 .partitions = 1,
1468 .sets = 8192,
1469 .lines_per_tag = 1,
1470 .self_init = true,
1471 .inclusive = true,
1472 .complex_indexing = true,
1473 },
1474 };
1475
1476 static X86CPUDefinition builtin_x86_defs[] = {
1477 {
1478 .name = "qemu64",
1479 .level = 0xd,
1480 .vendor = CPUID_VENDOR_AMD,
1481 .family = 6,
1482 .model = 6,
1483 .stepping = 3,
1484 .features[FEAT_1_EDX] =
1485 PPRO_FEATURES |
1486 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1487 CPUID_PSE36,
1488 .features[FEAT_1_ECX] =
1489 CPUID_EXT_SSE3 | CPUID_EXT_CX16,
1490 .features[FEAT_8000_0001_EDX] =
1491 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1492 .features[FEAT_8000_0001_ECX] =
1493 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM,
1494 .xlevel = 0x8000000A,
1495 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
1496 },
1497 {
1498 .name = "phenom",
1499 .level = 5,
1500 .vendor = CPUID_VENDOR_AMD,
1501 .family = 16,
1502 .model = 2,
1503 .stepping = 3,
1504 /* Missing: CPUID_HT */
1505 .features[FEAT_1_EDX] =
1506 PPRO_FEATURES |
1507 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1508 CPUID_PSE36 | CPUID_VME,
1509 .features[FEAT_1_ECX] =
1510 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_CX16 |
1511 CPUID_EXT_POPCNT,
1512 .features[FEAT_8000_0001_EDX] =
1513 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX |
1514 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_MMXEXT |
1515 CPUID_EXT2_FFXSR | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP,
1516 /* Missing: CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
1517 CPUID_EXT3_CR8LEG,
1518 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
1519 CPUID_EXT3_OSVW, CPUID_EXT3_IBS */
1520 .features[FEAT_8000_0001_ECX] =
1521 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM |
1522 CPUID_EXT3_ABM | CPUID_EXT3_SSE4A,
1523 /* Missing: CPUID_SVM_LBRV */
1524 .features[FEAT_SVM] =
1525 CPUID_SVM_NPT,
1526 .xlevel = 0x8000001A,
1527 .model_id = "AMD Phenom(tm) 9550 Quad-Core Processor"
1528 },
1529 {
1530 .name = "core2duo",
1531 .level = 10,
1532 .vendor = CPUID_VENDOR_INTEL,
1533 .family = 6,
1534 .model = 15,
1535 .stepping = 11,
1536 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
1537 .features[FEAT_1_EDX] =
1538 PPRO_FEATURES |
1539 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1540 CPUID_PSE36 | CPUID_VME | CPUID_ACPI | CPUID_SS,
1541 /* Missing: CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_EST,
1542 * CPUID_EXT_TM2, CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_VMX */
1543 .features[FEAT_1_ECX] =
1544 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
1545 CPUID_EXT_CX16,
1546 .features[FEAT_8000_0001_EDX] =
1547 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1548 .features[FEAT_8000_0001_ECX] =
1549 CPUID_EXT3_LAHF_LM,
1550 .xlevel = 0x80000008,
1551 .model_id = "Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz",
1552 },
1553 {
1554 .name = "kvm64",
1555 .level = 0xd,
1556 .vendor = CPUID_VENDOR_INTEL,
1557 .family = 15,
1558 .model = 6,
1559 .stepping = 1,
1560 /* Missing: CPUID_HT */
1561 .features[FEAT_1_EDX] =
1562 PPRO_FEATURES | CPUID_VME |
1563 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1564 CPUID_PSE36,
1565 /* Missing: CPUID_EXT_POPCNT, CPUID_EXT_MONITOR */
1566 .features[FEAT_1_ECX] =
1567 CPUID_EXT_SSE3 | CPUID_EXT_CX16,
1568 /* Missing: CPUID_EXT2_PDPE1GB, CPUID_EXT2_RDTSCP */
1569 .features[FEAT_8000_0001_EDX] =
1570 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1571 /* Missing: CPUID_EXT3_LAHF_LM, CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
1572 CPUID_EXT3_CR8LEG, CPUID_EXT3_ABM, CPUID_EXT3_SSE4A,
1573 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
1574 CPUID_EXT3_OSVW, CPUID_EXT3_IBS, CPUID_EXT3_SVM */
1575 .features[FEAT_8000_0001_ECX] =
1576 0,
1577 .xlevel = 0x80000008,
1578 .model_id = "Common KVM processor"
1579 },
1580 {
1581 .name = "qemu32",
1582 .level = 4,
1583 .vendor = CPUID_VENDOR_INTEL,
1584 .family = 6,
1585 .model = 6,
1586 .stepping = 3,
1587 .features[FEAT_1_EDX] =
1588 PPRO_FEATURES,
1589 .features[FEAT_1_ECX] =
1590 CPUID_EXT_SSE3,
1591 .xlevel = 0x80000004,
1592 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
1593 },
1594 {
1595 .name = "kvm32",
1596 .level = 5,
1597 .vendor = CPUID_VENDOR_INTEL,
1598 .family = 15,
1599 .model = 6,
1600 .stepping = 1,
1601 .features[FEAT_1_EDX] =
1602 PPRO_FEATURES | CPUID_VME |
1603 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_PSE36,
1604 .features[FEAT_1_ECX] =
1605 CPUID_EXT_SSE3,
1606 .features[FEAT_8000_0001_ECX] =
1607 0,
1608 .xlevel = 0x80000008,
1609 .model_id = "Common 32-bit KVM processor"
1610 },
1611 {
1612 .name = "coreduo",
1613 .level = 10,
1614 .vendor = CPUID_VENDOR_INTEL,
1615 .family = 6,
1616 .model = 14,
1617 .stepping = 8,
1618 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
1619 .features[FEAT_1_EDX] =
1620 PPRO_FEATURES | CPUID_VME |
1621 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_ACPI |
1622 CPUID_SS,
1623 /* Missing: CPUID_EXT_EST, CPUID_EXT_TM2 , CPUID_EXT_XTPR,
1624 * CPUID_EXT_PDCM, CPUID_EXT_VMX */
1625 .features[FEAT_1_ECX] =
1626 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR,
1627 .features[FEAT_8000_0001_EDX] =
1628 CPUID_EXT2_NX,
1629 .xlevel = 0x80000008,
1630 .model_id = "Genuine Intel(R) CPU T2600 @ 2.16GHz",
1631 },
1632 {
1633 .name = "486",
1634 .level = 1,
1635 .vendor = CPUID_VENDOR_INTEL,
1636 .family = 4,
1637 .model = 8,
1638 .stepping = 0,
1639 .features[FEAT_1_EDX] =
1640 I486_FEATURES,
1641 .xlevel = 0,
1642 .model_id = "",
1643 },
1644 {
1645 .name = "pentium",
1646 .level = 1,
1647 .vendor = CPUID_VENDOR_INTEL,
1648 .family = 5,
1649 .model = 4,
1650 .stepping = 3,
1651 .features[FEAT_1_EDX] =
1652 PENTIUM_FEATURES,
1653 .xlevel = 0,
1654 .model_id = "",
1655 },
1656 {
1657 .name = "pentium2",
1658 .level = 2,
1659 .vendor = CPUID_VENDOR_INTEL,
1660 .family = 6,
1661 .model = 5,
1662 .stepping = 2,
1663 .features[FEAT_1_EDX] =
1664 PENTIUM2_FEATURES,
1665 .xlevel = 0,
1666 .model_id = "",
1667 },
1668 {
1669 .name = "pentium3",
1670 .level = 3,
1671 .vendor = CPUID_VENDOR_INTEL,
1672 .family = 6,
1673 .model = 7,
1674 .stepping = 3,
1675 .features[FEAT_1_EDX] =
1676 PENTIUM3_FEATURES,
1677 .xlevel = 0,
1678 .model_id = "",
1679 },
1680 {
1681 .name = "athlon",
1682 .level = 2,
1683 .vendor = CPUID_VENDOR_AMD,
1684 .family = 6,
1685 .model = 2,
1686 .stepping = 3,
1687 .features[FEAT_1_EDX] =
1688 PPRO_FEATURES | CPUID_PSE36 | CPUID_VME | CPUID_MTRR |
1689 CPUID_MCA,
1690 .features[FEAT_8000_0001_EDX] =
1691 CPUID_EXT2_MMXEXT | CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT,
1692 .xlevel = 0x80000008,
1693 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
1694 },
1695 {
1696 .name = "n270",
1697 .level = 10,
1698 .vendor = CPUID_VENDOR_INTEL,
1699 .family = 6,
1700 .model = 28,
1701 .stepping = 2,
1702 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
1703 .features[FEAT_1_EDX] =
1704 PPRO_FEATURES |
1705 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_VME |
1706 CPUID_ACPI | CPUID_SS,
1707 /* Some CPUs got no CPUID_SEP */
1708 /* Missing: CPUID_EXT_DSCPL, CPUID_EXT_EST, CPUID_EXT_TM2,
1709 * CPUID_EXT_XTPR */
1710 .features[FEAT_1_ECX] =
1711 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
1712 CPUID_EXT_MOVBE,
1713 .features[FEAT_8000_0001_EDX] =
1714 CPUID_EXT2_NX,
1715 .features[FEAT_8000_0001_ECX] =
1716 CPUID_EXT3_LAHF_LM,
1717 .xlevel = 0x80000008,
1718 .model_id = "Intel(R) Atom(TM) CPU N270 @ 1.60GHz",
1719 },
1720 {
1721 .name = "Conroe",
1722 .level = 10,
1723 .vendor = CPUID_VENDOR_INTEL,
1724 .family = 6,
1725 .model = 15,
1726 .stepping = 3,
1727 .features[FEAT_1_EDX] =
1728 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1729 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1730 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1731 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1732 CPUID_DE | CPUID_FP87,
1733 .features[FEAT_1_ECX] =
1734 CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
1735 .features[FEAT_8000_0001_EDX] =
1736 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
1737 .features[FEAT_8000_0001_ECX] =
1738 CPUID_EXT3_LAHF_LM,
1739 .xlevel = 0x80000008,
1740 .model_id = "Intel Celeron_4x0 (Conroe/Merom Class Core 2)",
1741 },
1742 {
1743 .name = "Penryn",
1744 .level = 10,
1745 .vendor = CPUID_VENDOR_INTEL,
1746 .family = 6,
1747 .model = 23,
1748 .stepping = 3,
1749 .features[FEAT_1_EDX] =
1750 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1751 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1752 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1753 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1754 CPUID_DE | CPUID_FP87,
1755 .features[FEAT_1_ECX] =
1756 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
1757 CPUID_EXT_SSE3,
1758 .features[FEAT_8000_0001_EDX] =
1759 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
1760 .features[FEAT_8000_0001_ECX] =
1761 CPUID_EXT3_LAHF_LM,
1762 .xlevel = 0x80000008,
1763 .model_id = "Intel Core 2 Duo P9xxx (Penryn Class Core 2)",
1764 },
1765 {
1766 .name = "Nehalem",
1767 .level = 11,
1768 .vendor = CPUID_VENDOR_INTEL,
1769 .family = 6,
1770 .model = 26,
1771 .stepping = 3,
1772 .features[FEAT_1_EDX] =
1773 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1774 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1775 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1776 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1777 CPUID_DE | CPUID_FP87,
1778 .features[FEAT_1_ECX] =
1779 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
1780 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
1781 .features[FEAT_8000_0001_EDX] =
1782 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1783 .features[FEAT_8000_0001_ECX] =
1784 CPUID_EXT3_LAHF_LM,
1785 .xlevel = 0x80000008,
1786 .model_id = "Intel Core i7 9xx (Nehalem Class Core i7)",
1787 },
1788 {
1789 .name = "Nehalem-IBRS",
1790 .level = 11,
1791 .vendor = CPUID_VENDOR_INTEL,
1792 .family = 6,
1793 .model = 26,
1794 .stepping = 3,
1795 .features[FEAT_1_EDX] =
1796 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1797 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1798 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1799 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1800 CPUID_DE | CPUID_FP87,
1801 .features[FEAT_1_ECX] =
1802 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
1803 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
1804 .features[FEAT_7_0_EDX] =
1805 CPUID_7_0_EDX_SPEC_CTRL,
1806 .features[FEAT_8000_0001_EDX] =
1807 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1808 .features[FEAT_8000_0001_ECX] =
1809 CPUID_EXT3_LAHF_LM,
1810 .xlevel = 0x80000008,
1811 .model_id = "Intel Core i7 9xx (Nehalem Core i7, IBRS update)",
1812 },
1813 {
1814 .name = "Westmere",
1815 .level = 11,
1816 .vendor = CPUID_VENDOR_INTEL,
1817 .family = 6,
1818 .model = 44,
1819 .stepping = 1,
1820 .features[FEAT_1_EDX] =
1821 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1822 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1823 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1824 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1825 CPUID_DE | CPUID_FP87,
1826 .features[FEAT_1_ECX] =
1827 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
1828 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
1829 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
1830 .features[FEAT_8000_0001_EDX] =
1831 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1832 .features[FEAT_8000_0001_ECX] =
1833 CPUID_EXT3_LAHF_LM,
1834 .features[FEAT_6_EAX] =
1835 CPUID_6_EAX_ARAT,
1836 .xlevel = 0x80000008,
1837 .model_id = "Westmere E56xx/L56xx/X56xx (Nehalem-C)",
1838 },
1839 {
1840 .name = "Westmere-IBRS",
1841 .level = 11,
1842 .vendor = CPUID_VENDOR_INTEL,
1843 .family = 6,
1844 .model = 44,
1845 .stepping = 1,
1846 .features[FEAT_1_EDX] =
1847 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1848 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1849 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1850 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1851 CPUID_DE | CPUID_FP87,
1852 .features[FEAT_1_ECX] =
1853 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
1854 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
1855 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
1856 .features[FEAT_8000_0001_EDX] =
1857 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1858 .features[FEAT_8000_0001_ECX] =
1859 CPUID_EXT3_LAHF_LM,
1860 .features[FEAT_7_0_EDX] =
1861 CPUID_7_0_EDX_SPEC_CTRL,
1862 .features[FEAT_6_EAX] =
1863 CPUID_6_EAX_ARAT,
1864 .xlevel = 0x80000008,
1865 .model_id = "Westmere E56xx/L56xx/X56xx (IBRS update)",
1866 },
1867 {
1868 .name = "SandyBridge",
1869 .level = 0xd,
1870 .vendor = CPUID_VENDOR_INTEL,
1871 .family = 6,
1872 .model = 42,
1873 .stepping = 1,
1874 .features[FEAT_1_EDX] =
1875 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1876 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1877 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1878 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1879 CPUID_DE | CPUID_FP87,
1880 .features[FEAT_1_ECX] =
1881 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
1882 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
1883 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
1884 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
1885 CPUID_EXT_SSE3,
1886 .features[FEAT_8000_0001_EDX] =
1887 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
1888 CPUID_EXT2_SYSCALL,
1889 .features[FEAT_8000_0001_ECX] =
1890 CPUID_EXT3_LAHF_LM,
1891 .features[FEAT_XSAVE] =
1892 CPUID_XSAVE_XSAVEOPT,
1893 .features[FEAT_6_EAX] =
1894 CPUID_6_EAX_ARAT,
1895 .xlevel = 0x80000008,
1896 .model_id = "Intel Xeon E312xx (Sandy Bridge)",
1897 },
1898 {
1899 .name = "SandyBridge-IBRS",
1900 .level = 0xd,
1901 .vendor = CPUID_VENDOR_INTEL,
1902 .family = 6,
1903 .model = 42,
1904 .stepping = 1,
1905 .features[FEAT_1_EDX] =
1906 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1907 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1908 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1909 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1910 CPUID_DE | CPUID_FP87,
1911 .features[FEAT_1_ECX] =
1912 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
1913 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
1914 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
1915 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
1916 CPUID_EXT_SSE3,
1917 .features[FEAT_8000_0001_EDX] =
1918 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
1919 CPUID_EXT2_SYSCALL,
1920 .features[FEAT_8000_0001_ECX] =
1921 CPUID_EXT3_LAHF_LM,
1922 .features[FEAT_7_0_EDX] =
1923 CPUID_7_0_EDX_SPEC_CTRL,
1924 .features[FEAT_XSAVE] =
1925 CPUID_XSAVE_XSAVEOPT,
1926 .features[FEAT_6_EAX] =
1927 CPUID_6_EAX_ARAT,
1928 .xlevel = 0x80000008,
1929 .model_id = "Intel Xeon E312xx (Sandy Bridge, IBRS update)",
1930 },
1931 {
1932 .name = "IvyBridge",
1933 .level = 0xd,
1934 .vendor = CPUID_VENDOR_INTEL,
1935 .family = 6,
1936 .model = 58,
1937 .stepping = 9,
1938 .features[FEAT_1_EDX] =
1939 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1940 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1941 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1942 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1943 CPUID_DE | CPUID_FP87,
1944 .features[FEAT_1_ECX] =
1945 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
1946 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
1947 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
1948 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
1949 CPUID_EXT_SSE3 | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
1950 .features[FEAT_7_0_EBX] =
1951 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP |
1952 CPUID_7_0_EBX_ERMS,
1953 .features[FEAT_8000_0001_EDX] =
1954 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
1955 CPUID_EXT2_SYSCALL,
1956 .features[FEAT_8000_0001_ECX] =
1957 CPUID_EXT3_LAHF_LM,
1958 .features[FEAT_XSAVE] =
1959 CPUID_XSAVE_XSAVEOPT,
1960 .features[FEAT_6_EAX] =
1961 CPUID_6_EAX_ARAT,
1962 .xlevel = 0x80000008,
1963 .model_id = "Intel Xeon E3-12xx v2 (Ivy Bridge)",
1964 },
1965 {
1966 .name = "IvyBridge-IBRS",
1967 .level = 0xd,
1968 .vendor = CPUID_VENDOR_INTEL,
1969 .family = 6,
1970 .model = 58,
1971 .stepping = 9,
1972 .features[FEAT_1_EDX] =
1973 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1974 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1975 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1976 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1977 CPUID_DE | CPUID_FP87,
1978 .features[FEAT_1_ECX] =
1979 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
1980 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
1981 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
1982 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
1983 CPUID_EXT_SSE3 | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
1984 .features[FEAT_7_0_EBX] =
1985 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP |
1986 CPUID_7_0_EBX_ERMS,
1987 .features[FEAT_8000_0001_EDX] =
1988 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
1989 CPUID_EXT2_SYSCALL,
1990 .features[FEAT_8000_0001_ECX] =
1991 CPUID_EXT3_LAHF_LM,
1992 .features[FEAT_7_0_EDX] =
1993 CPUID_7_0_EDX_SPEC_CTRL,
1994 .features[FEAT_XSAVE] =
1995 CPUID_XSAVE_XSAVEOPT,
1996 .features[FEAT_6_EAX] =
1997 CPUID_6_EAX_ARAT,
1998 .xlevel = 0x80000008,
1999 .model_id = "Intel Xeon E3-12xx v2 (Ivy Bridge, IBRS)",
2000 },
2001 {
2002 .name = "Haswell-noTSX",
2003 .level = 0xd,
2004 .vendor = CPUID_VENDOR_INTEL,
2005 .family = 6,
2006 .model = 60,
2007 .stepping = 1,
2008 .features[FEAT_1_EDX] =
2009 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2010 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2011 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2012 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2013 CPUID_DE | CPUID_FP87,
2014 .features[FEAT_1_ECX] =
2015 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2016 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2017 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2018 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2019 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2020 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2021 .features[FEAT_8000_0001_EDX] =
2022 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2023 CPUID_EXT2_SYSCALL,
2024 .features[FEAT_8000_0001_ECX] =
2025 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
2026 .features[FEAT_7_0_EBX] =
2027 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2028 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2029 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID,
2030 .features[FEAT_XSAVE] =
2031 CPUID_XSAVE_XSAVEOPT,
2032 .features[FEAT_6_EAX] =
2033 CPUID_6_EAX_ARAT,
2034 .xlevel = 0x80000008,
2035 .model_id = "Intel Core Processor (Haswell, no TSX)",
2036 },
2037 {
2038 .name = "Haswell-noTSX-IBRS",
2039 .level = 0xd,
2040 .vendor = CPUID_VENDOR_INTEL,
2041 .family = 6,
2042 .model = 60,
2043 .stepping = 1,
2044 .features[FEAT_1_EDX] =
2045 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2046 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2047 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2048 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2049 CPUID_DE | CPUID_FP87,
2050 .features[FEAT_1_ECX] =
2051 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2052 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2053 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2054 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2055 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2056 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2057 .features[FEAT_8000_0001_EDX] =
2058 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2059 CPUID_EXT2_SYSCALL,
2060 .features[FEAT_8000_0001_ECX] =
2061 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
2062 .features[FEAT_7_0_EDX] =
2063 CPUID_7_0_EDX_SPEC_CTRL,
2064 .features[FEAT_7_0_EBX] =
2065 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2066 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2067 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID,
2068 .features[FEAT_XSAVE] =
2069 CPUID_XSAVE_XSAVEOPT,
2070 .features[FEAT_6_EAX] =
2071 CPUID_6_EAX_ARAT,
2072 .xlevel = 0x80000008,
2073 .model_id = "Intel Core Processor (Haswell, no TSX, IBRS)",
2074 },
2075 {
2076 .name = "Haswell",
2077 .level = 0xd,
2078 .vendor = CPUID_VENDOR_INTEL,
2079 .family = 6,
2080 .model = 60,
2081 .stepping = 4,
2082 .features[FEAT_1_EDX] =
2083 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2084 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2085 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2086 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2087 CPUID_DE | CPUID_FP87,
2088 .features[FEAT_1_ECX] =
2089 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2090 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2091 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2092 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2093 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2094 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2095 .features[FEAT_8000_0001_EDX] =
2096 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2097 CPUID_EXT2_SYSCALL,
2098 .features[FEAT_8000_0001_ECX] =
2099 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
2100 .features[FEAT_7_0_EBX] =
2101 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2102 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2103 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2104 CPUID_7_0_EBX_RTM,
2105 .features[FEAT_XSAVE] =
2106 CPUID_XSAVE_XSAVEOPT,
2107 .features[FEAT_6_EAX] =
2108 CPUID_6_EAX_ARAT,
2109 .xlevel = 0x80000008,
2110 .model_id = "Intel Core Processor (Haswell)",
2111 },
2112 {
2113 .name = "Haswell-IBRS",
2114 .level = 0xd,
2115 .vendor = CPUID_VENDOR_INTEL,
2116 .family = 6,
2117 .model = 60,
2118 .stepping = 4,
2119 .features[FEAT_1_EDX] =
2120 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2121 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2122 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2123 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2124 CPUID_DE | CPUID_FP87,
2125 .features[FEAT_1_ECX] =
2126 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2127 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2128 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2129 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2130 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2131 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2132 .features[FEAT_8000_0001_EDX] =
2133 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2134 CPUID_EXT2_SYSCALL,
2135 .features[FEAT_8000_0001_ECX] =
2136 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
2137 .features[FEAT_7_0_EDX] =
2138 CPUID_7_0_EDX_SPEC_CTRL,
2139 .features[FEAT_7_0_EBX] =
2140 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2141 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2142 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2143 CPUID_7_0_EBX_RTM,
2144 .features[FEAT_XSAVE] =
2145 CPUID_XSAVE_XSAVEOPT,
2146 .features[FEAT_6_EAX] =
2147 CPUID_6_EAX_ARAT,
2148 .xlevel = 0x80000008,
2149 .model_id = "Intel Core Processor (Haswell, IBRS)",
2150 },
2151 {
2152 .name = "Broadwell-noTSX",
2153 .level = 0xd,
2154 .vendor = CPUID_VENDOR_INTEL,
2155 .family = 6,
2156 .model = 61,
2157 .stepping = 2,
2158 .features[FEAT_1_EDX] =
2159 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2160 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2161 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2162 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2163 CPUID_DE | CPUID_FP87,
2164 .features[FEAT_1_ECX] =
2165 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2166 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2167 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2168 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2169 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2170 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2171 .features[FEAT_8000_0001_EDX] =
2172 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2173 CPUID_EXT2_SYSCALL,
2174 .features[FEAT_8000_0001_ECX] =
2175 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2176 .features[FEAT_7_0_EBX] =
2177 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2178 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2179 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2180 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2181 CPUID_7_0_EBX_SMAP,
2182 .features[FEAT_XSAVE] =
2183 CPUID_XSAVE_XSAVEOPT,
2184 .features[FEAT_6_EAX] =
2185 CPUID_6_EAX_ARAT,
2186 .xlevel = 0x80000008,
2187 .model_id = "Intel Core Processor (Broadwell, no TSX)",
2188 },
2189 {
2190 .name = "Broadwell-noTSX-IBRS",
2191 .level = 0xd,
2192 .vendor = CPUID_VENDOR_INTEL,
2193 .family = 6,
2194 .model = 61,
2195 .stepping = 2,
2196 .features[FEAT_1_EDX] =
2197 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2198 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2199 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2200 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2201 CPUID_DE | CPUID_FP87,
2202 .features[FEAT_1_ECX] =
2203 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2204 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2205 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2206 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2207 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2208 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2209 .features[FEAT_8000_0001_EDX] =
2210 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2211 CPUID_EXT2_SYSCALL,
2212 .features[FEAT_8000_0001_ECX] =
2213 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2214 .features[FEAT_7_0_EDX] =
2215 CPUID_7_0_EDX_SPEC_CTRL,
2216 .features[FEAT_7_0_EBX] =
2217 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2218 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2219 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2220 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2221 CPUID_7_0_EBX_SMAP,
2222 .features[FEAT_XSAVE] =
2223 CPUID_XSAVE_XSAVEOPT,
2224 .features[FEAT_6_EAX] =
2225 CPUID_6_EAX_ARAT,
2226 .xlevel = 0x80000008,
2227 .model_id = "Intel Core Processor (Broadwell, no TSX, IBRS)",
2228 },
2229 {
2230 .name = "Broadwell",
2231 .level = 0xd,
2232 .vendor = CPUID_VENDOR_INTEL,
2233 .family = 6,
2234 .model = 61,
2235 .stepping = 2,
2236 .features[FEAT_1_EDX] =
2237 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2238 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2239 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2240 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2241 CPUID_DE | CPUID_FP87,
2242 .features[FEAT_1_ECX] =
2243 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2244 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2245 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2246 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2247 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2248 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2249 .features[FEAT_8000_0001_EDX] =
2250 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2251 CPUID_EXT2_SYSCALL,
2252 .features[FEAT_8000_0001_ECX] =
2253 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2254 .features[FEAT_7_0_EBX] =
2255 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2256 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2257 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2258 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2259 CPUID_7_0_EBX_SMAP,
2260 .features[FEAT_XSAVE] =
2261 CPUID_XSAVE_XSAVEOPT,
2262 .features[FEAT_6_EAX] =
2263 CPUID_6_EAX_ARAT,
2264 .xlevel = 0x80000008,
2265 .model_id = "Intel Core Processor (Broadwell)",
2266 },
2267 {
2268 .name = "Broadwell-IBRS",
2269 .level = 0xd,
2270 .vendor = CPUID_VENDOR_INTEL,
2271 .family = 6,
2272 .model = 61,
2273 .stepping = 2,
2274 .features[FEAT_1_EDX] =
2275 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2276 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2277 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2278 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2279 CPUID_DE | CPUID_FP87,
2280 .features[FEAT_1_ECX] =
2281 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2282 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2283 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2284 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2285 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2286 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2287 .features[FEAT_8000_0001_EDX] =
2288 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2289 CPUID_EXT2_SYSCALL,
2290 .features[FEAT_8000_0001_ECX] =
2291 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2292 .features[FEAT_7_0_EDX] =
2293 CPUID_7_0_EDX_SPEC_CTRL,
2294 .features[FEAT_7_0_EBX] =
2295 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2296 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2297 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2298 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2299 CPUID_7_0_EBX_SMAP,
2300 .features[FEAT_XSAVE] =
2301 CPUID_XSAVE_XSAVEOPT,
2302 .features[FEAT_6_EAX] =
2303 CPUID_6_EAX_ARAT,
2304 .xlevel = 0x80000008,
2305 .model_id = "Intel Core Processor (Broadwell, IBRS)",
2306 },
2307 {
2308 .name = "Skylake-Client",
2309 .level = 0xd,
2310 .vendor = CPUID_VENDOR_INTEL,
2311 .family = 6,
2312 .model = 94,
2313 .stepping = 3,
2314 .features[FEAT_1_EDX] =
2315 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2316 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2317 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2318 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2319 CPUID_DE | CPUID_FP87,
2320 .features[FEAT_1_ECX] =
2321 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2322 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2323 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2324 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2325 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2326 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2327 .features[FEAT_8000_0001_EDX] =
2328 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2329 CPUID_EXT2_SYSCALL,
2330 .features[FEAT_8000_0001_ECX] =
2331 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2332 .features[FEAT_7_0_EBX] =
2333 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2334 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2335 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2336 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2337 CPUID_7_0_EBX_SMAP,
2338 /* Missing: XSAVES (not supported by some Linux versions,
2339 * including v4.1 to v4.12).
2340 * KVM doesn't yet expose any XSAVES state save component,
2341 * and the only one defined in Skylake (processor tracing)
2342 * probably will block migration anyway.
2343 */
2344 .features[FEAT_XSAVE] =
2345 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2346 CPUID_XSAVE_XGETBV1,
2347 .features[FEAT_6_EAX] =
2348 CPUID_6_EAX_ARAT,
2349 .xlevel = 0x80000008,
2350 .model_id = "Intel Core Processor (Skylake)",
2351 },
2352 {
2353 .name = "Skylake-Client-IBRS",
2354 .level = 0xd,
2355 .vendor = CPUID_VENDOR_INTEL,
2356 .family = 6,
2357 .model = 94,
2358 .stepping = 3,
2359 .features[FEAT_1_EDX] =
2360 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2361 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2362 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2363 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2364 CPUID_DE | CPUID_FP87,
2365 .features[FEAT_1_ECX] =
2366 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2367 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2368 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2369 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2370 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2371 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2372 .features[FEAT_8000_0001_EDX] =
2373 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2374 CPUID_EXT2_SYSCALL,
2375 .features[FEAT_8000_0001_ECX] =
2376 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2377 .features[FEAT_7_0_EDX] =
2378 CPUID_7_0_EDX_SPEC_CTRL,
2379 .features[FEAT_7_0_EBX] =
2380 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2381 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2382 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2383 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2384 CPUID_7_0_EBX_SMAP,
2385 /* Missing: XSAVES (not supported by some Linux versions,
2386 * including v4.1 to v4.12).
2387 * KVM doesn't yet expose any XSAVES state save component,
2388 * and the only one defined in Skylake (processor tracing)
2389 * probably will block migration anyway.
2390 */
2391 .features[FEAT_XSAVE] =
2392 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2393 CPUID_XSAVE_XGETBV1,
2394 .features[FEAT_6_EAX] =
2395 CPUID_6_EAX_ARAT,
2396 .xlevel = 0x80000008,
2397 .model_id = "Intel Core Processor (Skylake, IBRS)",
2398 },
2399 {
2400 .name = "Skylake-Server",
2401 .level = 0xd,
2402 .vendor = CPUID_VENDOR_INTEL,
2403 .family = 6,
2404 .model = 85,
2405 .stepping = 4,
2406 .features[FEAT_1_EDX] =
2407 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2408 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2409 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2410 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2411 CPUID_DE | CPUID_FP87,
2412 .features[FEAT_1_ECX] =
2413 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2414 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2415 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2416 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2417 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2418 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2419 .features[FEAT_8000_0001_EDX] =
2420 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
2421 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2422 .features[FEAT_8000_0001_ECX] =
2423 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2424 .features[FEAT_7_0_EBX] =
2425 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2426 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2427 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2428 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2429 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
2430 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
2431 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
2432 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
2433 .features[FEAT_7_0_ECX] =
2434 CPUID_7_0_ECX_PKU,
2435 /* Missing: XSAVES (not supported by some Linux versions,
2436 * including v4.1 to v4.12).
2437 * KVM doesn't yet expose any XSAVES state save component,
2438 * and the only one defined in Skylake (processor tracing)
2439 * probably will block migration anyway.
2440 */
2441 .features[FEAT_XSAVE] =
2442 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2443 CPUID_XSAVE_XGETBV1,
2444 .features[FEAT_6_EAX] =
2445 CPUID_6_EAX_ARAT,
2446 .xlevel = 0x80000008,
2447 .model_id = "Intel Xeon Processor (Skylake)",
2448 },
2449 {
2450 .name = "Skylake-Server-IBRS",
2451 .level = 0xd,
2452 .vendor = CPUID_VENDOR_INTEL,
2453 .family = 6,
2454 .model = 85,
2455 .stepping = 4,
2456 .features[FEAT_1_EDX] =
2457 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2458 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2459 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2460 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2461 CPUID_DE | CPUID_FP87,
2462 .features[FEAT_1_ECX] =
2463 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2464 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2465 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2466 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2467 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2468 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2469 .features[FEAT_8000_0001_EDX] =
2470 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
2471 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2472 .features[FEAT_8000_0001_ECX] =
2473 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2474 .features[FEAT_7_0_EDX] =
2475 CPUID_7_0_EDX_SPEC_CTRL,
2476 .features[FEAT_7_0_EBX] =
2477 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2478 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2479 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2480 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2481 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
2482 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
2483 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
2484 CPUID_7_0_EBX_AVX512VL,
2485 .features[FEAT_7_0_ECX] =
2486 CPUID_7_0_ECX_PKU,
2487 /* Missing: XSAVES (not supported by some Linux versions,
2488 * including v4.1 to v4.12).
2489 * KVM doesn't yet expose any XSAVES state save component,
2490 * and the only one defined in Skylake (processor tracing)
2491 * probably will block migration anyway.
2492 */
2493 .features[FEAT_XSAVE] =
2494 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2495 CPUID_XSAVE_XGETBV1,
2496 .features[FEAT_6_EAX] =
2497 CPUID_6_EAX_ARAT,
2498 .xlevel = 0x80000008,
2499 .model_id = "Intel Xeon Processor (Skylake, IBRS)",
2500 },
2501 {
2502 .name = "Cascadelake-Server",
2503 .level = 0xd,
2504 .vendor = CPUID_VENDOR_INTEL,
2505 .family = 6,
2506 .model = 85,
2507 .stepping = 6,
2508 .features[FEAT_1_EDX] =
2509 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2510 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2511 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2512 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2513 CPUID_DE | CPUID_FP87,
2514 .features[FEAT_1_ECX] =
2515 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2516 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2517 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2518 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2519 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2520 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2521 .features[FEAT_8000_0001_EDX] =
2522 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
2523 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2524 .features[FEAT_8000_0001_ECX] =
2525 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2526 .features[FEAT_7_0_EBX] =
2527 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2528 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2529 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2530 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2531 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
2532 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
2533 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
2534 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
2535 .features[FEAT_7_0_ECX] =
2536 CPUID_7_0_ECX_PKU | CPUID_7_0_ECX_OSPKE |
2537 CPUID_7_0_ECX_AVX512VNNI,
2538 .features[FEAT_7_0_EDX] =
2539 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
2540 /* Missing: XSAVES (not supported by some Linux versions,
2541 * including v4.1 to v4.12).
2542 * KVM doesn't yet expose any XSAVES state save component,
2543 * and the only one defined in Skylake (processor tracing)
2544 * probably will block migration anyway.
2545 */
2546 .features[FEAT_XSAVE] =
2547 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2548 CPUID_XSAVE_XGETBV1,
2549 .features[FEAT_6_EAX] =
2550 CPUID_6_EAX_ARAT,
2551 .xlevel = 0x80000008,
2552 .model_id = "Intel Xeon Processor (Cascadelake)",
2553 },
2554 {
2555 .name = "Icelake-Client",
2556 .level = 0xd,
2557 .vendor = CPUID_VENDOR_INTEL,
2558 .family = 6,
2559 .model = 126,
2560 .stepping = 0,
2561 .features[FEAT_1_EDX] =
2562 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2563 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2564 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2565 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2566 CPUID_DE | CPUID_FP87,
2567 .features[FEAT_1_ECX] =
2568 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2569 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2570 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2571 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2572 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2573 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2574 .features[FEAT_8000_0001_EDX] =
2575 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2576 CPUID_EXT2_SYSCALL,
2577 .features[FEAT_8000_0001_ECX] =
2578 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2579 .features[FEAT_8000_0008_EBX] =
2580 CPUID_8000_0008_EBX_WBNOINVD,
2581 .features[FEAT_7_0_EBX] =
2582 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2583 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2584 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2585 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2586 CPUID_7_0_EBX_SMAP,
2587 .features[FEAT_7_0_ECX] =
2588 CPUID_7_0_ECX_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
2589 CPUID_7_0_ECX_OSPKE | CPUID_7_0_ECX_VBMI2 | CPUID_7_0_ECX_GFNI |
2590 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
2591 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
2592 CPUID_7_0_ECX_AVX512_VPOPCNTDQ,
2593 .features[FEAT_7_0_EDX] =
2594 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
2595 /* Missing: XSAVES (not supported by some Linux versions,
2596 * including v4.1 to v4.12).
2597 * KVM doesn't yet expose any XSAVES state save component,
2598 * and the only one defined in Skylake (processor tracing)
2599 * probably will block migration anyway.
2600 */
2601 .features[FEAT_XSAVE] =
2602 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2603 CPUID_XSAVE_XGETBV1,
2604 .features[FEAT_6_EAX] =
2605 CPUID_6_EAX_ARAT,
2606 .xlevel = 0x80000008,
2607 .model_id = "Intel Core Processor (Icelake)",
2608 },
2609 {
2610 .name = "Icelake-Server",
2611 .level = 0xd,
2612 .vendor = CPUID_VENDOR_INTEL,
2613 .family = 6,
2614 .model = 134,
2615 .stepping = 0,
2616 .features[FEAT_1_EDX] =
2617 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2618 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2619 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2620 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2621 CPUID_DE | CPUID_FP87,
2622 .features[FEAT_1_ECX] =
2623 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2624 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2625 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2626 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2627 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2628 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2629 .features[FEAT_8000_0001_EDX] =
2630 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
2631 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2632 .features[FEAT_8000_0001_ECX] =
2633 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2634 .features[FEAT_8000_0008_EBX] =
2635 CPUID_8000_0008_EBX_WBNOINVD,
2636 .features[FEAT_7_0_EBX] =
2637 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2638 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2639 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2640 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2641 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
2642 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
2643 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
2644 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
2645 .features[FEAT_7_0_ECX] =
2646 CPUID_7_0_ECX_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
2647 CPUID_7_0_ECX_OSPKE | CPUID_7_0_ECX_VBMI2 | CPUID_7_0_ECX_GFNI |
2648 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
2649 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
2650 CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57,
2651 .features[FEAT_7_0_EDX] =
2652 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
2653 /* Missing: XSAVES (not supported by some Linux versions,
2654 * including v4.1 to v4.12).
2655 * KVM doesn't yet expose any XSAVES state save component,
2656 * and the only one defined in Skylake (processor tracing)
2657 * probably will block migration anyway.
2658 */
2659 .features[FEAT_XSAVE] =
2660 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2661 CPUID_XSAVE_XGETBV1,
2662 .features[FEAT_6_EAX] =
2663 CPUID_6_EAX_ARAT,
2664 .xlevel = 0x80000008,
2665 .model_id = "Intel Xeon Processor (Icelake)",
2666 },
2667 {
2668 .name = "KnightsMill",
2669 .level = 0xd,
2670 .vendor = CPUID_VENDOR_INTEL,
2671 .family = 6,
2672 .model = 133,
2673 .stepping = 0,
2674 .features[FEAT_1_EDX] =
2675 CPUID_VME | CPUID_SS | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR |
2676 CPUID_MMX | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV |
2677 CPUID_MCA | CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC |
2678 CPUID_CX8 | CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC |
2679 CPUID_PSE | CPUID_DE | CPUID_FP87,
2680 .features[FEAT_1_ECX] =
2681 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2682 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2683 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2684 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2685 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2686 CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2687 .features[FEAT_8000_0001_EDX] =
2688 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
2689 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2690 .features[FEAT_8000_0001_ECX] =
2691 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2692 .features[FEAT_7_0_EBX] =
2693 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
2694 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
2695 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_AVX512F |
2696 CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_AVX512PF |
2697 CPUID_7_0_EBX_AVX512ER,
2698 .features[FEAT_7_0_ECX] =
2699 CPUID_7_0_ECX_AVX512_VPOPCNTDQ,
2700 .features[FEAT_7_0_EDX] =
2701 CPUID_7_0_EDX_AVX512_4VNNIW | CPUID_7_0_EDX_AVX512_4FMAPS,
2702 .features[FEAT_XSAVE] =
2703 CPUID_XSAVE_XSAVEOPT,
2704 .features[FEAT_6_EAX] =
2705 CPUID_6_EAX_ARAT,
2706 .xlevel = 0x80000008,
2707 .model_id = "Intel Xeon Phi Processor (Knights Mill)",
2708 },
2709 {
2710 .name = "Opteron_G1",
2711 .level = 5,
2712 .vendor = CPUID_VENDOR_AMD,
2713 .family = 15,
2714 .model = 6,
2715 .stepping = 1,
2716 .features[FEAT_1_EDX] =
2717 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2718 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2719 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2720 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2721 CPUID_DE | CPUID_FP87,
2722 .features[FEAT_1_ECX] =
2723 CPUID_EXT_SSE3,
2724 .features[FEAT_8000_0001_EDX] =
2725 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2726 .xlevel = 0x80000008,
2727 .model_id = "AMD Opteron 240 (Gen 1 Class Opteron)",
2728 },
2729 {
2730 .name = "Opteron_G2",
2731 .level = 5,
2732 .vendor = CPUID_VENDOR_AMD,
2733 .family = 15,
2734 .model = 6,
2735 .stepping = 1,
2736 .features[FEAT_1_EDX] =
2737 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2738 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2739 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2740 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2741 CPUID_DE | CPUID_FP87,
2742 .features[FEAT_1_ECX] =
2743 CPUID_EXT_CX16 | CPUID_EXT_SSE3,
2744 .features[FEAT_8000_0001_EDX] =
2745 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2746 .features[FEAT_8000_0001_ECX] =
2747 CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
2748 .xlevel = 0x80000008,
2749 .model_id = "AMD Opteron 22xx (Gen 2 Class Opteron)",
2750 },
2751 {
2752 .name = "Opteron_G3",
2753 .level = 5,
2754 .vendor = CPUID_VENDOR_AMD,
2755 .family = 16,
2756 .model = 2,
2757 .stepping = 3,
2758 .features[FEAT_1_EDX] =
2759 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2760 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2761 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2762 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2763 CPUID_DE | CPUID_FP87,
2764 .features[FEAT_1_ECX] =
2765 CPUID_EXT_POPCNT | CPUID_EXT_CX16 | CPUID_EXT_MONITOR |
2766 CPUID_EXT_SSE3,
2767 .features[FEAT_8000_0001_EDX] =
2768 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL |
2769 CPUID_EXT2_RDTSCP,
2770 .features[FEAT_8000_0001_ECX] =
2771 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A |
2772 CPUID_EXT3_ABM | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
2773 .xlevel = 0x80000008,
2774 .model_id = "AMD Opteron 23xx (Gen 3 Class Opteron)",
2775 },
2776 {
2777 .name = "Opteron_G4",
2778 .level = 0xd,
2779 .vendor = CPUID_VENDOR_AMD,
2780 .family = 21,
2781 .model = 1,
2782 .stepping = 2,
2783 .features[FEAT_1_EDX] =
2784 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2785 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2786 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2787 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2788 CPUID_DE | CPUID_FP87,
2789 .features[FEAT_1_ECX] =
2790 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2791 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2792 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
2793 CPUID_EXT_SSE3,
2794 .features[FEAT_8000_0001_EDX] =
2795 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
2796 CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
2797 .features[FEAT_8000_0001_ECX] =
2798 CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
2799 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
2800 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
2801 CPUID_EXT3_LAHF_LM,
2802 .features[FEAT_SVM] =
2803 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
2804 /* no xsaveopt! */
2805 .xlevel = 0x8000001A,
2806 .model_id = "AMD Opteron 62xx class CPU",
2807 },
2808 {
2809 .name = "Opteron_G5",
2810 .level = 0xd,
2811 .vendor = CPUID_VENDOR_AMD,
2812 .family = 21,
2813 .model = 2,
2814 .stepping = 0,
2815 .features[FEAT_1_EDX] =
2816 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2817 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2818 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2819 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2820 CPUID_DE | CPUID_FP87,
2821 .features[FEAT_1_ECX] =
2822 CPUID_EXT_F16C | CPUID_EXT_AVX | CPUID_EXT_XSAVE |
2823 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
2824 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_FMA |
2825 CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
2826 .features[FEAT_8000_0001_EDX] =
2827 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
2828 CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
2829 .features[FEAT_8000_0001_ECX] =
2830 CPUID_EXT3_TBM | CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
2831 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
2832 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
2833 CPUID_EXT3_LAHF_LM,
2834 .features[FEAT_SVM] =
2835 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
2836 /* no xsaveopt! */
2837 .xlevel = 0x8000001A,
2838 .model_id = "AMD Opteron 63xx class CPU",
2839 },
2840 {
2841 .name = "EPYC",
2842 .level = 0xd,
2843 .vendor = CPUID_VENDOR_AMD,
2844 .family = 23,
2845 .model = 1,
2846 .stepping = 2,
2847 .features[FEAT_1_EDX] =
2848 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
2849 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
2850 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
2851 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
2852 CPUID_VME | CPUID_FP87,
2853 .features[FEAT_1_ECX] =
2854 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
2855 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
2856 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2857 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
2858 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
2859 .features[FEAT_8000_0001_EDX] =
2860 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
2861 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
2862 CPUID_EXT2_SYSCALL,
2863 .features[FEAT_8000_0001_ECX] =
2864 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
2865 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
2866 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
2867 CPUID_EXT3_TOPOEXT,
2868 .features[FEAT_7_0_EBX] =
2869 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
2870 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
2871 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
2872 CPUID_7_0_EBX_SHA_NI,
2873 /* Missing: XSAVES (not supported by some Linux versions,
2874 * including v4.1 to v4.12).
2875 * KVM doesn't yet expose any XSAVES state save component.
2876 */
2877 .features[FEAT_XSAVE] =
2878 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2879 CPUID_XSAVE_XGETBV1,
2880 .features[FEAT_6_EAX] =
2881 CPUID_6_EAX_ARAT,
2882 .features[FEAT_SVM] =
2883 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
2884 .xlevel = 0x8000001E,
2885 .model_id = "AMD EPYC Processor",
2886 .cache_info = &epyc_cache_info,
2887 },
2888 {
2889 .name = "EPYC-IBPB",
2890 .level = 0xd,
2891 .vendor = CPUID_VENDOR_AMD,
2892 .family = 23,
2893 .model = 1,
2894 .stepping = 2,
2895 .features[FEAT_1_EDX] =
2896 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
2897 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
2898 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
2899 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
2900 CPUID_VME | CPUID_FP87,
2901 .features[FEAT_1_ECX] =
2902 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
2903 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
2904 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2905 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
2906 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
2907 .features[FEAT_8000_0001_EDX] =
2908 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
2909 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
2910 CPUID_EXT2_SYSCALL,
2911 .features[FEAT_8000_0001_ECX] =
2912 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
2913 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
2914 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
2915 CPUID_EXT3_TOPOEXT,
2916 .features[FEAT_8000_0008_EBX] =
2917 CPUID_8000_0008_EBX_IBPB,
2918 .features[FEAT_7_0_EBX] =
2919 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
2920 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
2921 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
2922 CPUID_7_0_EBX_SHA_NI,
2923 /* Missing: XSAVES (not supported by some Linux versions,
2924 * including v4.1 to v4.12).
2925 * KVM doesn't yet expose any XSAVES state save component.
2926 */
2927 .features[FEAT_XSAVE] =
2928 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2929 CPUID_XSAVE_XGETBV1,
2930 .features[FEAT_6_EAX] =
2931 CPUID_6_EAX_ARAT,
2932 .features[FEAT_SVM] =
2933 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
2934 .xlevel = 0x8000001E,
2935 .model_id = "AMD EPYC Processor (with IBPB)",
2936 .cache_info = &epyc_cache_info,
2937 },
2938 };
2939
2940 typedef struct PropValue {
2941 const char *prop, *value;
2942 } PropValue;
2943
2944 /* KVM-specific features that are automatically added/removed
2945 * from all CPU models when KVM is enabled.
2946 */
2947 static PropValue kvm_default_props[] = {
2948 { "kvmclock", "on" },
2949 { "kvm-nopiodelay", "on" },
2950 { "kvm-asyncpf", "on" },
2951 { "kvm-steal-time", "on" },
2952 { "kvm-pv-eoi", "on" },
2953 { "kvmclock-stable-bit", "on" },
2954 { "x2apic", "on" },
2955 { "acpi", "off" },
2956 { "monitor", "off" },
2957 { "svm", "off" },
2958 { NULL, NULL },
2959 };
2960
2961 /* TCG-specific defaults that override all CPU models when using TCG
2962 */
2963 static PropValue tcg_default_props[] = {
2964 { "vme", "off" },
2965 { NULL, NULL },
2966 };
2967
2968
2969 void x86_cpu_change_kvm_default(const char *prop, const char *value)
2970 {
2971 PropValue *pv;
2972 for (pv = kvm_default_props; pv->prop; pv++) {
2973 if (!strcmp(pv->prop, prop)) {
2974 pv->value = value;
2975 break;
2976 }
2977 }
2978
2979 /* It is valid to call this function only for properties that
2980 * are already present in the kvm_default_props table.
2981 */
2982 assert(pv->prop);
2983 }
2984
2985 static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w,
2986 bool migratable_only);
2987
2988 static bool lmce_supported(void)
2989 {
2990 uint64_t mce_cap = 0;
2991
2992 #ifdef CONFIG_KVM
2993 if (kvm_ioctl(kvm_state, KVM_X86_GET_MCE_CAP_SUPPORTED, &mce_cap) < 0) {
2994 return false;
2995 }
2996 #endif
2997
2998 return !!(mce_cap & MCG_LMCE_P);
2999 }
3000
3001 #define CPUID_MODEL_ID_SZ 48
3002
3003 /**
3004 * cpu_x86_fill_model_id:
3005 * Get CPUID model ID string from host CPU.
3006 *
3007 * @str should have at least CPUID_MODEL_ID_SZ bytes
3008 *
3009 * The function does NOT add a null terminator to the string
3010 * automatically.
3011 */
3012 static int cpu_x86_fill_model_id(char *str)
3013 {
3014 uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0;
3015 int i;
3016
3017 for (i = 0; i < 3; i++) {
3018 host_cpuid(0x80000002 + i, 0, &eax, &ebx, &ecx, &edx);
3019 memcpy(str + i * 16 + 0, &eax, 4);
3020 memcpy(str + i * 16 + 4, &ebx, 4);
3021 memcpy(str + i * 16 + 8, &ecx, 4);
3022 memcpy(str + i * 16 + 12, &edx, 4);
3023 }
3024 return 0;
3025 }
3026
3027 static Property max_x86_cpu_properties[] = {
3028 DEFINE_PROP_BOOL("migratable", X86CPU, migratable, true),
3029 DEFINE_PROP_BOOL("host-cache-info", X86CPU, cache_info_passthrough, false),
3030 DEFINE_PROP_END_OF_LIST()
3031 };
3032
3033 static void max_x86_cpu_class_init(ObjectClass *oc, void *data)
3034 {
3035 DeviceClass *dc = DEVICE_CLASS(oc);
3036 X86CPUClass *xcc = X86_CPU_CLASS(oc);
3037
3038 xcc->ordering = 9;
3039
3040 xcc->model_description =
3041 "Enables all features supported by the accelerator in the current host";
3042
3043 dc->props = max_x86_cpu_properties;
3044 }
3045
3046 static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp);
3047
3048 static void max_x86_cpu_initfn(Object *obj)
3049 {
3050 X86CPU *cpu = X86_CPU(obj);
3051 CPUX86State *env = &cpu->env;
3052 KVMState *s = kvm_state;
3053
3054 /* We can't fill the features array here because we don't know yet if
3055 * "migratable" is true or false.
3056 */
3057 cpu->max_features = true;
3058
3059 if (accel_uses_host_cpuid()) {
3060 char vendor[CPUID_VENDOR_SZ + 1] = { 0 };
3061 char model_id[CPUID_MODEL_ID_SZ + 1] = { 0 };
3062 int family, model, stepping;
3063 X86CPUDefinition host_cpudef = { };
3064 uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0;
3065
3066 host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx);
3067 x86_cpu_vendor_words2str(host_cpudef.vendor, ebx, edx, ecx);
3068
3069 host_vendor_fms(vendor, &family, &model, &stepping);
3070
3071 cpu_x86_fill_model_id(model_id);
3072
3073 object_property_set_str(OBJECT(cpu), vendor, "vendor", &error_abort);
3074 object_property_set_int(OBJECT(cpu), family, "family", &error_abort);
3075 object_property_set_int(OBJECT(cpu), model, "model", &error_abort);
3076 object_property_set_int(OBJECT(cpu), stepping, "stepping",
3077 &error_abort);
3078 object_property_set_str(OBJECT(cpu), model_id, "model-id",
3079 &error_abort);
3080
3081 if (kvm_enabled()) {
3082 env->cpuid_min_level =
3083 kvm_arch_get_supported_cpuid(s, 0x0, 0, R_EAX);
3084 env->cpuid_min_xlevel =
3085 kvm_arch_get_supported_cpuid(s, 0x80000000, 0, R_EAX);
3086 env->cpuid_min_xlevel2 =
3087 kvm_arch_get_supported_cpuid(s, 0xC0000000, 0, R_EAX);
3088 } else {
3089 env->cpuid_min_level =
3090 hvf_get_supported_cpuid(0x0, 0, R_EAX);
3091 env->cpuid_min_xlevel =
3092 hvf_get_supported_cpuid(0x80000000, 0, R_EAX);
3093 env->cpuid_min_xlevel2 =
3094 hvf_get_supported_cpuid(0xC0000000, 0, R_EAX);
3095 }
3096
3097 if (lmce_supported()) {
3098 object_property_set_bool(OBJECT(cpu), true, "lmce", &error_abort);
3099 }
3100 } else {
3101 object_property_set_str(OBJECT(cpu), CPUID_VENDOR_AMD,
3102 "vendor", &error_abort);
3103 object_property_set_int(OBJECT(cpu), 6, "family", &error_abort);
3104 object_property_set_int(OBJECT(cpu), 6, "model", &error_abort);
3105 object_property_set_int(OBJECT(cpu), 3, "stepping", &error_abort);
3106 object_property_set_str(OBJECT(cpu),
3107 "QEMU TCG CPU version " QEMU_HW_VERSION,
3108 "model-id", &error_abort);
3109 }
3110
3111 object_property_set_bool(OBJECT(cpu), true, "pmu", &error_abort);
3112 }
3113
3114 static const TypeInfo max_x86_cpu_type_info = {
3115 .name = X86_CPU_TYPE_NAME("max"),
3116 .parent = TYPE_X86_CPU,
3117 .instance_init = max_x86_cpu_initfn,
3118 .class_init = max_x86_cpu_class_init,
3119 };
3120
3121 #if defined(CONFIG_KVM) || defined(CONFIG_HVF)
3122 static void host_x86_cpu_class_init(ObjectClass *oc, void *data)
3123 {
3124 X86CPUClass *xcc = X86_CPU_CLASS(oc);
3125
3126 xcc->host_cpuid_required = true;
3127 xcc->ordering = 8;
3128
3129 #if defined(CONFIG_KVM)
3130 xcc->model_description =
3131 "KVM processor with all supported host features ";
3132 #elif defined(CONFIG_HVF)
3133 xcc->model_description =
3134 "HVF processor with all supported host features ";
3135 #endif
3136 }
3137
3138 static const TypeInfo host_x86_cpu_type_info = {
3139 .name = X86_CPU_TYPE_NAME("host"),
3140 .parent = X86_CPU_TYPE_NAME("max"),
3141 .class_init = host_x86_cpu_class_init,
3142 };
3143
3144 #endif
3145
3146 static char *feature_word_description(FeatureWordInfo *f, uint32_t bit)
3147 {
3148 assert(f->type == CPUID_FEATURE_WORD || f->type == MSR_FEATURE_WORD);
3149
3150 switch (f->type) {
3151 case CPUID_FEATURE_WORD:
3152 {
3153 const char *reg = get_register_name_32(f->cpuid.reg);
3154 assert(reg);
3155 return g_strdup_printf("CPUID.%02XH:%s",
3156 f->cpuid.eax, reg);
3157 }
3158 case MSR_FEATURE_WORD:
3159 return g_strdup_printf("MSR(%02XH)",
3160 f->msr.index);
3161 }
3162
3163 return NULL;
3164 }
3165
3166 static void report_unavailable_features(FeatureWord w, uint32_t mask)
3167 {
3168 FeatureWordInfo *f = &feature_word_info[w];
3169 int i;
3170 char *feat_word_str;
3171
3172 for (i = 0; i < 32; ++i) {
3173 if ((1UL << i) & mask) {
3174 feat_word_str = feature_word_description(f, i);
3175 warn_report("%s doesn't support requested feature: %s%s%s [bit %d]",
3176 accel_uses_host_cpuid() ? "host" : "TCG",
3177 feat_word_str,
3178 f->feat_names[i] ? "." : "",
3179 f->feat_names[i] ? f->feat_names[i] : "", i);
3180 g_free(feat_word_str);
3181 }
3182 }
3183 }
3184
3185 static void x86_cpuid_version_get_family(Object *obj, Visitor *v,
3186 const char *name, void *opaque,
3187 Error **errp)
3188 {
3189 X86CPU *cpu = X86_CPU(obj);
3190 CPUX86State *env = &cpu->env;
3191 int64_t value;
3192
3193 value = (env->cpuid_version >> 8) & 0xf;
3194 if (value == 0xf) {
3195 value += (env->cpuid_version >> 20) & 0xff;
3196 }
3197 visit_type_int(v, name, &value, errp);
3198 }
3199
3200 static void x86_cpuid_version_set_family(Object *obj, Visitor *v,
3201 const char *name, void *opaque,
3202 Error **errp)
3203 {
3204 X86CPU *cpu = X86_CPU(obj);
3205 CPUX86State *env = &cpu->env;
3206 const int64_t min = 0;
3207 const int64_t max = 0xff + 0xf;
3208 Error *local_err = NULL;
3209 int64_t value;
3210
3211 visit_type_int(v, name, &value, &local_err);
3212 if (local_err) {
3213 error_propagate(errp, local_err);
3214 return;
3215 }
3216 if (value < min || value > max) {
3217 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
3218 name ? name : "null", value, min, max);
3219 return;
3220 }
3221
3222 env->cpuid_version &= ~0xff00f00;
3223 if (value > 0x0f) {
3224 env->cpuid_version |= 0xf00 | ((value - 0x0f) << 20);
3225 } else {
3226 env->cpuid_version |= value << 8;
3227 }
3228 }
3229
3230 static void x86_cpuid_version_get_model(Object *obj, Visitor *v,
3231 const char *name, void *opaque,
3232 Error **errp)
3233 {
3234 X86CPU *cpu = X86_CPU(obj);
3235 CPUX86State *env = &cpu->env;
3236 int64_t value;
3237
3238 value = (env->cpuid_version >> 4) & 0xf;
3239 value |= ((env->cpuid_version >> 16) & 0xf) << 4;
3240 visit_type_int(v, name, &value, errp);
3241 }
3242
3243 static void x86_cpuid_version_set_model(Object *obj, Visitor *v,
3244 const char *name, void *opaque,
3245 Error **errp)
3246 {
3247 X86CPU *cpu = X86_CPU(obj);
3248 CPUX86State *env = &cpu->env;
3249 const int64_t min = 0;
3250 const int64_t max = 0xff;
3251 Error *local_err = NULL;
3252 int64_t value;
3253
3254 visit_type_int(v, name, &value, &local_err);
3255 if (local_err) {
3256 error_propagate(errp, local_err);
3257 return;
3258 }
3259 if (value < min || value > max) {
3260 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
3261 name ? name : "null", value, min, max);
3262 return;
3263 }
3264
3265 env->cpuid_version &= ~0xf00f0;
3266 env->cpuid_version |= ((value & 0xf) << 4) | ((value >> 4) << 16);
3267 }
3268
3269 static void x86_cpuid_version_get_stepping(Object *obj, Visitor *v,
3270 const char *name, void *opaque,
3271 Error **errp)
3272 {
3273 X86CPU *cpu = X86_CPU(obj);
3274 CPUX86State *env = &cpu->env;
3275 int64_t value;
3276
3277 value = env->cpuid_version & 0xf;
3278 visit_type_int(v, name, &value, errp);
3279 }
3280
3281 static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v,
3282 const char *name, void *opaque,
3283 Error **errp)
3284 {
3285 X86CPU *cpu = X86_CPU(obj);
3286 CPUX86State *env = &cpu->env;
3287 const int64_t min = 0;
3288 const int64_t max = 0xf;
3289 Error *local_err = NULL;
3290 int64_t value;
3291
3292 visit_type_int(v, name, &value, &local_err);
3293 if (local_err) {
3294 error_propagate(errp, local_err);
3295 return;
3296 }
3297 if (value < min || value > max) {
3298 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
3299 name ? name : "null", value, min, max);
3300 return;
3301 }
3302
3303 env->cpuid_version &= ~0xf;
3304 env->cpuid_version |= value & 0xf;
3305 }
3306
3307 static char *x86_cpuid_get_vendor(Object *obj, Error **errp)
3308 {
3309 X86CPU *cpu = X86_CPU(obj);
3310 CPUX86State *env = &cpu->env;
3311 char *value;
3312
3313 value = g_malloc(CPUID_VENDOR_SZ + 1);
3314 x86_cpu_vendor_words2str(value, env->cpuid_vendor1, env->cpuid_vendor2,
3315 env->cpuid_vendor3);
3316 return value;
3317 }
3318
3319 static void x86_cpuid_set_vendor(Object *obj, const char *value,
3320 Error **errp)
3321 {
3322 X86CPU *cpu = X86_CPU(obj);
3323 CPUX86State *env = &cpu->env;
3324 int i;
3325
3326 if (strlen(value) != CPUID_VENDOR_SZ) {
3327 error_setg(errp, QERR_PROPERTY_VALUE_BAD, "", "vendor", value);
3328 return;
3329 }
3330
3331 env->cpuid_vendor1 = 0;
3332 env->cpuid_vendor2 = 0;
3333 env->cpuid_vendor3 = 0;
3334 for (i = 0; i < 4; i++) {
3335 env->cpuid_vendor1 |= ((uint8_t)value[i ]) << (8 * i);
3336 env->cpuid_vendor2 |= ((uint8_t)value[i + 4]) << (8 * i);
3337 env->cpuid_vendor3 |= ((uint8_t)value[i + 8]) << (8 * i);
3338 }
3339 }
3340
3341 static char *x86_cpuid_get_model_id(Object *obj, Error **errp)
3342 {
3343 X86CPU *cpu = X86_CPU(obj);
3344 CPUX86State *env = &cpu->env;
3345 char *value;
3346 int i;
3347
3348 value = g_malloc(48 + 1);
3349 for (i = 0; i < 48; i++) {
3350 value[i] = env->cpuid_model[i >> 2] >> (8 * (i & 3));
3351 }
3352 value[48] = '\0';
3353 return value;
3354 }
3355
3356 static void x86_cpuid_set_model_id(Object *obj, const char *model_id,
3357 Error **errp)
3358 {
3359 X86CPU *cpu = X86_CPU(obj);
3360 CPUX86State *env = &cpu->env;
3361 int c, len, i;
3362
3363 if (model_id == NULL) {
3364 model_id = "";
3365 }
3366 len = strlen(model_id);
3367 memset(env->cpuid_model, 0, 48);
3368 for (i = 0; i < 48; i++) {
3369 if (i >= len) {
3370 c = '\0';
3371 } else {
3372 c = (uint8_t)model_id[i];
3373 }
3374 env->cpuid_model[i >> 2] |= c << (8 * (i & 3));
3375 }
3376 }
3377
3378 static void x86_cpuid_get_tsc_freq(Object *obj, Visitor *v, const char *name,
3379 void *opaque, Error **errp)
3380 {
3381 X86CPU *cpu = X86_CPU(obj);
3382 int64_t value;
3383
3384 value = cpu->env.tsc_khz * 1000;
3385 visit_type_int(v, name, &value, errp);
3386 }
3387
3388 static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name,
3389 void *opaque, Error **errp)
3390 {
3391 X86CPU *cpu = X86_CPU(obj);
3392 const int64_t min = 0;
3393 const int64_t max = INT64_MAX;
3394 Error *local_err = NULL;
3395 int64_t value;
3396
3397 visit_type_int(v, name, &value, &local_err);
3398 if (local_err) {
3399 error_propagate(errp, local_err);
3400 return;
3401 }
3402 if (value < min || value > max) {
3403 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
3404 name ? name : "null", value, min, max);
3405 return;
3406 }
3407
3408 cpu->env.tsc_khz = cpu->env.user_tsc_khz = value / 1000;
3409 }
3410
3411 /* Generic getter for "feature-words" and "filtered-features" properties */
3412 static void x86_cpu_get_feature_words(Object *obj, Visitor *v,
3413 const char *name, void *opaque,
3414 Error **errp)
3415 {
3416 uint32_t *array = (uint32_t *)opaque;
3417 FeatureWord w;
3418 X86CPUFeatureWordInfo word_infos[FEATURE_WORDS] = { };
3419 X86CPUFeatureWordInfoList list_entries[FEATURE_WORDS] = { };
3420 X86CPUFeatureWordInfoList *list = NULL;
3421
3422 for (w = 0; w < FEATURE_WORDS; w++) {
3423 FeatureWordInfo *wi = &feature_word_info[w];
3424 /*
3425 * We didn't have MSR features when "feature-words" was
3426 * introduced. Therefore skipped other type entries.
3427 */
3428 if (wi->type != CPUID_FEATURE_WORD) {
3429 continue;
3430 }
3431 X86CPUFeatureWordInfo *qwi = &word_infos[w];
3432 qwi->cpuid_input_eax = wi->cpuid.eax;
3433 qwi->has_cpuid_input_ecx = wi->cpuid.needs_ecx;
3434 qwi->cpuid_input_ecx = wi->cpuid.ecx;
3435 qwi->cpuid_register = x86_reg_info_32[wi->cpuid.reg].qapi_enum;
3436 qwi->features = array[w];
3437
3438 /* List will be in reverse order, but order shouldn't matter */
3439 list_entries[w].next = list;
3440 list_entries[w].value = &word_infos[w];
3441 list = &list_entries[w];
3442 }
3443
3444 visit_type_X86CPUFeatureWordInfoList(v, "feature-words", &list, errp);
3445 }
3446
3447 static void x86_get_hv_spinlocks(Object *obj, Visitor *v, const char *name,
3448 void *opaque, Error **errp)
3449 {
3450 X86CPU *cpu = X86_CPU(obj);
3451 int64_t value = cpu->hyperv_spinlock_attempts;
3452
3453 visit_type_int(v, name, &value, errp);
3454 }
3455
3456 static void x86_set_hv_spinlocks(Object *obj, Visitor *v, const char *name,
3457 void *opaque, Error **errp)
3458 {
3459 const int64_t min = 0xFFF;
3460 const int64_t max = UINT_MAX;
3461 X86CPU *cpu = X86_CPU(obj);
3462 Error *err = NULL;
3463 int64_t value;
3464
3465 visit_type_int(v, name, &value, &err);
3466 if (err) {
3467 error_propagate(errp, err);
3468 return;
3469 }
3470
3471 if (value < min || value > max) {
3472 error_setg(errp, "Property %s.%s doesn't take value %" PRId64
3473 " (minimum: %" PRId64 ", maximum: %" PRId64 ")",
3474 object_get_typename(obj), name ? name : "null",
3475 value, min, max);
3476 return;
3477 }
3478 cpu->hyperv_spinlock_attempts = value;
3479 }
3480
3481 static const PropertyInfo qdev_prop_spinlocks = {
3482 .name = "int",
3483 .get = x86_get_hv_spinlocks,
3484 .set = x86_set_hv_spinlocks,
3485 };
3486
3487 /* Convert all '_' in a feature string option name to '-', to make feature
3488 * name conform to QOM property naming rule, which uses '-' instead of '_'.
3489 */
3490 static inline void feat2prop(char *s)
3491 {
3492 while ((s = strchr(s, '_'))) {
3493 *s = '-';
3494 }
3495 }
3496
3497 /* Return the feature property name for a feature flag bit */
3498 static const char *x86_cpu_feature_name(FeatureWord w, int bitnr)
3499 {
3500 /* XSAVE components are automatically enabled by other features,
3501 * so return the original feature name instead
3502 */
3503 if (w == FEAT_XSAVE_COMP_LO || w == FEAT_XSAVE_COMP_HI) {
3504 int comp = (w == FEAT_XSAVE_COMP_HI) ? bitnr + 32 : bitnr;
3505
3506 if (comp < ARRAY_SIZE(x86_ext_save_areas) &&
3507 x86_ext_save_areas[comp].bits) {
3508 w = x86_ext_save_areas[comp].feature;
3509 bitnr = ctz32(x86_ext_save_areas[comp].bits);
3510 }
3511 }
3512
3513 assert(bitnr < 32);
3514 assert(w < FEATURE_WORDS);
3515 return feature_word_info[w].feat_names[bitnr];
3516 }
3517
3518 /* Compatibily hack to maintain legacy +-feat semantic,
3519 * where +-feat overwrites any feature set by
3520 * feat=on|feat even if the later is parsed after +-feat
3521 * (i.e. "-x2apic,x2apic=on" will result in x2apic disabled)
3522 */
3523 static GList *plus_features, *minus_features;
3524
3525 static gint compare_string(gconstpointer a, gconstpointer b)
3526 {
3527 return g_strcmp0(a, b);
3528 }
3529
3530 /* Parse "+feature,-feature,feature=foo" CPU feature string
3531 */
3532 static void x86_cpu_parse_featurestr(const char *typename, char *features,
3533 Error **errp)
3534 {
3535 char *featurestr; /* Single 'key=value" string being parsed */
3536 static bool cpu_globals_initialized;
3537 bool ambiguous = false;
3538
3539 if (cpu_globals_initialized) {
3540 return;
3541 }
3542 cpu_globals_initialized = true;
3543
3544 if (!features) {
3545 return;
3546 }
3547
3548 for (featurestr = strtok(features, ",");
3549 featurestr;
3550 featurestr = strtok(NULL, ",")) {
3551 const char *name;
3552 const char *val = NULL;
3553 char *eq = NULL;
3554 char num[32];
3555 GlobalProperty *prop;
3556
3557 /* Compatibility syntax: */
3558 if (featurestr[0] == '+') {
3559 plus_features = g_list_append(plus_features,
3560 g_strdup(featurestr + 1));
3561 continue;
3562 } else if (featurestr[0] == '-') {
3563 minus_features = g_list_append(minus_features,
3564 g_strdup(featurestr + 1));
3565 continue;
3566 }
3567
3568 eq = strchr(featurestr, '=');
3569 if (eq) {
3570 *eq++ = 0;
3571 val = eq;
3572 } else {
3573 val = "on";
3574 }
3575
3576 feat2prop(featurestr);
3577 name = featurestr;
3578
3579 if (g_list_find_custom(plus_features, name, compare_string)) {
3580 warn_report("Ambiguous CPU model string. "
3581 "Don't mix both \"+%s\" and \"%s=%s\"",
3582 name, name, val);
3583 ambiguous = true;
3584 }
3585 if (g_list_find_custom(minus_features, name, compare_string)) {
3586 warn_report("Ambiguous CPU model string. "
3587 "Don't mix both \"-%s\" and \"%s=%s\"",
3588 name, name, val);
3589 ambiguous = true;
3590 }
3591
3592 /* Special case: */
3593 if (!strcmp(name, "tsc-freq")) {
3594 int ret;
3595 uint64_t tsc_freq;
3596
3597 ret = qemu_strtosz_metric(val, NULL, &tsc_freq);
3598 if (ret < 0 || tsc_freq > INT64_MAX) {
3599 error_setg(errp, "bad numerical value %s", val);
3600 return;
3601 }
3602 snprintf(num, sizeof(num), "%" PRId64, tsc_freq);
3603 val = num;
3604 name = "tsc-frequency";
3605 }
3606
3607 prop = g_new0(typeof(*prop), 1);
3608 prop->driver = typename;
3609 prop->property = g_strdup(name);
3610 prop->value = g_strdup(val);
3611 qdev_prop_register_global(prop);
3612 }
3613
3614 if (ambiguous) {
3615 warn_report("Compatibility of ambiguous CPU model "
3616 "strings won't be kept on future QEMU versions");
3617 }
3618 }
3619
3620 static void x86_cpu_expand_features(X86CPU *cpu, Error **errp);
3621 static int x86_cpu_filter_features(X86CPU *cpu);
3622
3623 /* Check for missing features that may prevent the CPU class from
3624 * running using the current machine and accelerator.
3625 */
3626 static void x86_cpu_class_check_missing_features(X86CPUClass *xcc,
3627 strList **missing_feats)
3628 {
3629 X86CPU *xc;
3630 FeatureWord w;
3631 Error *err = NULL;
3632 strList **next = missing_feats;
3633
3634 if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
3635 strList *new = g_new0(strList, 1);
3636 new->value = g_strdup("kvm");
3637 *missing_feats = new;
3638 return;
3639 }
3640
3641 xc = X86_CPU(object_new(object_class_get_name(OBJECT_CLASS(xcc))));
3642
3643 x86_cpu_expand_features(xc, &err);
3644 if (err) {
3645 /* Errors at x86_cpu_expand_features should never happen,
3646 * but in case it does, just report the model as not
3647 * runnable at all using the "type" property.
3648 */
3649 strList *new = g_new0(strList, 1);
3650 new->value = g_strdup("type");
3651 *next = new;
3652 next = &new->next;
3653 }
3654
3655 x86_cpu_filter_features(xc);
3656
3657 for (w = 0; w < FEATURE_WORDS; w++) {
3658 uint32_t filtered = xc->filtered_features[w];
3659 int i;
3660 for (i = 0; i < 32; i++) {
3661 if (filtered & (1UL << i)) {
3662 strList *new = g_new0(strList, 1);
3663 new->value = g_strdup(x86_cpu_feature_name(w, i));
3664 *next = new;
3665 next = &new->next;
3666 }
3667 }
3668 }
3669
3670 object_unref(OBJECT(xc));
3671 }
3672
3673 /* Print all cpuid feature names in featureset
3674 */
3675 static void listflags(FILE *f, fprintf_function print, GList *features)
3676 {
3677 size_t len = 0;
3678 GList *tmp;
3679
3680 for (tmp = features; tmp; tmp = tmp->next) {
3681 const char *name = tmp->data;
3682 if ((len + strlen(name) + 1) >= 75) {
3683 print(f, "\n");
3684 len = 0;
3685 }
3686 print(f, "%s%s", len == 0 ? " " : " ", name);
3687 len += strlen(name) + 1;
3688 }
3689 print(f, "\n");
3690 }
3691
3692 /* Sort alphabetically by type name, respecting X86CPUClass::ordering. */
3693 static gint x86_cpu_list_compare(gconstpointer a, gconstpointer b)
3694 {
3695 ObjectClass *class_a = (ObjectClass *)a;
3696 ObjectClass *class_b = (ObjectClass *)b;
3697 X86CPUClass *cc_a = X86_CPU_CLASS(class_a);
3698 X86CPUClass *cc_b = X86_CPU_CLASS(class_b);
3699 char *name_a, *name_b;
3700 int ret;
3701
3702 if (cc_a->ordering != cc_b->ordering) {
3703 ret = cc_a->ordering - cc_b->ordering;
3704 } else {
3705 name_a = x86_cpu_class_get_model_name(cc_a);
3706 name_b = x86_cpu_class_get_model_name(cc_b);
3707 ret = strcmp(name_a, name_b);
3708 g_free(name_a);
3709 g_free(name_b);
3710 }
3711 return ret;
3712 }
3713
3714 static GSList *get_sorted_cpu_model_list(void)
3715 {
3716 GSList *list = object_class_get_list(TYPE_X86_CPU, false);
3717 list = g_slist_sort(list, x86_cpu_list_compare);
3718 return list;
3719 }
3720
3721 static void x86_cpu_list_entry(gpointer data, gpointer user_data)
3722 {
3723 ObjectClass *oc = data;
3724 X86CPUClass *cc = X86_CPU_CLASS(oc);
3725 CPUListState *s = user_data;
3726 char *name = x86_cpu_class_get_model_name(cc);
3727 const char *desc = cc->model_description;
3728 if (!desc && cc->cpu_def) {
3729 desc = cc->cpu_def->model_id;
3730 }
3731
3732 (*s->cpu_fprintf)(s->file, "x86 %-20s %-48s\n",
3733 name, desc);
3734 g_free(name);
3735 }
3736
3737 /* list available CPU models and flags */
3738 void x86_cpu_list(FILE *f, fprintf_function cpu_fprintf)
3739 {
3740 int i, j;
3741 CPUListState s = {
3742 .file = f,
3743 .cpu_fprintf = cpu_fprintf,
3744 };
3745 GSList *list;
3746 GList *names = NULL;
3747
3748 (*cpu_fprintf)(f, "Available CPUs:\n");
3749 list = get_sorted_cpu_model_list();
3750 g_slist_foreach(list, x86_cpu_list_entry, &s);
3751 g_slist_free(list);
3752
3753 names = NULL;
3754 for (i = 0; i < ARRAY_SIZE(feature_word_info); i++) {
3755 FeatureWordInfo *fw = &feature_word_info[i];
3756 for (j = 0; j < 32; j++) {
3757 if (fw->feat_names[j]) {
3758 names = g_list_append(names, (gpointer)fw->feat_names[j]);
3759 }
3760 }
3761 }
3762
3763 names = g_list_sort(names, (GCompareFunc)strcmp);
3764
3765 (*cpu_fprintf)(f, "\nRecognized CPUID flags:\n");
3766 listflags(f, cpu_fprintf, names);
3767 (*cpu_fprintf)(f, "\n");
3768 g_list_free(names);
3769 }
3770
3771 static void x86_cpu_definition_entry(gpointer data, gpointer user_data)
3772 {
3773 ObjectClass *oc = data;
3774 X86CPUClass *cc = X86_CPU_CLASS(oc);
3775 CpuDefinitionInfoList **cpu_list = user_data;
3776 CpuDefinitionInfoList *entry;
3777 CpuDefinitionInfo *info;
3778
3779 info = g_malloc0(sizeof(*info));
3780 info->name = x86_cpu_class_get_model_name(cc);
3781 x86_cpu_class_check_missing_features(cc, &info->unavailable_features);
3782 info->has_unavailable_features = true;
3783 info->q_typename = g_strdup(object_class_get_name(oc));
3784 info->migration_safe = cc->migration_safe;
3785 info->has_migration_safe = true;
3786 info->q_static = cc->static_model;
3787
3788 entry = g_malloc0(sizeof(*entry));
3789 entry->value = info;
3790 entry->next = *cpu_list;
3791 *cpu_list = entry;
3792 }
3793
3794 CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
3795 {
3796 CpuDefinitionInfoList *cpu_list = NULL;
3797 GSList *list = get_sorted_cpu_model_list();
3798 g_slist_foreach(list, x86_cpu_definition_entry, &cpu_list);
3799 g_slist_free(list);
3800 return cpu_list;
3801 }
3802
3803 static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w,
3804 bool migratable_only)
3805 {
3806 FeatureWordInfo *wi = &feature_word_info[w];
3807 uint32_t r = 0;
3808
3809 if (kvm_enabled()) {
3810 switch (wi->type) {
3811 case CPUID_FEATURE_WORD:
3812 r = kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid.eax,
3813 wi->cpuid.ecx,
3814 wi->cpuid.reg);
3815 break;
3816 case MSR_FEATURE_WORD:
3817 r = kvm_arch_get_supported_msr_feature(kvm_state,
3818 wi->msr.index);
3819 break;
3820 }
3821 } else if (hvf_enabled()) {
3822 if (wi->type != CPUID_FEATURE_WORD) {
3823 return 0;
3824 }
3825 r = hvf_get_supported_cpuid(wi->cpuid.eax,
3826 wi->cpuid.ecx,
3827 wi->cpuid.reg);
3828 } else if (tcg_enabled()) {
3829 r = wi->tcg_features;
3830 } else {
3831 return ~0;
3832 }
3833 if (migratable_only) {
3834 r &= x86_cpu_get_migratable_flags(w);
3835 }
3836 return r;
3837 }
3838
3839 static void x86_cpu_report_filtered_features(X86CPU *cpu)
3840 {
3841 FeatureWord w;
3842
3843 for (w = 0; w < FEATURE_WORDS; w++) {
3844 report_unavailable_features(w, cpu->filtered_features[w]);
3845 }
3846 }
3847
3848 static void x86_cpu_apply_props(X86CPU *cpu, PropValue *props)
3849 {
3850 PropValue *pv;
3851 for (pv = props; pv->prop; pv++) {
3852 if (!pv->value) {
3853 continue;
3854 }
3855 object_property_parse(OBJECT(cpu), pv->value, pv->prop,
3856 &error_abort);
3857 }
3858 }
3859
3860 /* Load data from X86CPUDefinition into a X86CPU object
3861 */
3862 static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp)
3863 {
3864 CPUX86State *env = &cpu->env;
3865 const char *vendor;
3866 char host_vendor[CPUID_VENDOR_SZ + 1];
3867 FeatureWord w;
3868
3869 /*NOTE: any property set by this function should be returned by
3870 * x86_cpu_static_props(), so static expansion of
3871 * query-cpu-model-expansion is always complete.
3872 */
3873
3874 /* CPU models only set _minimum_ values for level/xlevel: */
3875 object_property_set_uint(OBJECT(cpu), def->level, "min-level", errp);
3876 object_property_set_uint(OBJECT(cpu), def->xlevel, "min-xlevel", errp);
3877
3878 object_property_set_int(OBJECT(cpu), def->family, "family", errp);
3879 object_property_set_int(OBJECT(cpu), def->model, "model", errp);
3880 object_property_set_int(OBJECT(cpu), def->stepping, "stepping", errp);
3881 object_property_set_str(OBJECT(cpu), def->model_id, "model-id", errp);
3882 for (w = 0; w < FEATURE_WORDS; w++) {
3883 env->features[w] = def->features[w];
3884 }
3885
3886 /* legacy-cache defaults to 'off' if CPU model provides cache info */
3887 cpu->legacy_cache = !def->cache_info;
3888
3889 /* Special cases not set in the X86CPUDefinition structs: */
3890 /* TODO: in-kernel irqchip for hvf */
3891 if (kvm_enabled()) {
3892 if (!kvm_irqchip_in_kernel()) {
3893 x86_cpu_change_kvm_default("x2apic", "off");
3894 }
3895
3896 x86_cpu_apply_props(cpu, kvm_default_props);
3897 } else if (tcg_enabled()) {
3898 x86_cpu_apply_props(cpu, tcg_default_props);
3899 }
3900
3901 env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR;
3902
3903 /* sysenter isn't supported in compatibility mode on AMD,
3904 * syscall isn't supported in compatibility mode on Intel.
3905 * Normally we advertise the actual CPU vendor, but you can
3906 * override this using the 'vendor' property if you want to use
3907 * KVM's sysenter/syscall emulation in compatibility mode and
3908 * when doing cross vendor migration
3909 */
3910 vendor = def->vendor;
3911 if (accel_uses_host_cpuid()) {
3912 uint32_t ebx = 0, ecx = 0, edx = 0;
3913 host_cpuid(0, 0, NULL, &ebx, &ecx, &edx);
3914 x86_cpu_vendor_words2str(host_vendor, ebx, edx, ecx);
3915 vendor = host_vendor;
3916 }
3917
3918 object_property_set_str(OBJECT(cpu), vendor, "vendor", errp);
3919
3920 }
3921
3922 #ifndef CONFIG_USER_ONLY
3923 /* Return a QDict containing keys for all properties that can be included
3924 * in static expansion of CPU models. All properties set by x86_cpu_load_def()
3925 * must be included in the dictionary.
3926 */
3927 static QDict *x86_cpu_static_props(void)
3928 {
3929 FeatureWord w;
3930 int i;
3931 static const char *props[] = {
3932 "min-level",
3933 "min-xlevel",
3934 "family",
3935 "model",
3936 "stepping",
3937 "model-id",
3938 "vendor",
3939 "lmce",
3940 NULL,
3941 };
3942 static QDict *d;
3943
3944 if (d) {
3945 return d;
3946 }
3947
3948 d = qdict_new();
3949 for (i = 0; props[i]; i++) {
3950 qdict_put_null(d, props[i]);
3951 }
3952
3953 for (w = 0; w < FEATURE_WORDS; w++) {
3954 FeatureWordInfo *fi = &feature_word_info[w];
3955 int bit;
3956 for (bit = 0; bit < 32; bit++) {
3957 if (!fi->feat_names[bit]) {
3958 continue;
3959 }
3960 qdict_put_null(d, fi->feat_names[bit]);
3961 }
3962 }
3963
3964 return d;
3965 }
3966
3967 /* Add an entry to @props dict, with the value for property. */
3968 static void x86_cpu_expand_prop(X86CPU *cpu, QDict *props, const char *prop)
3969 {
3970 QObject *value = object_property_get_qobject(OBJECT(cpu), prop,
3971 &error_abort);
3972
3973 qdict_put_obj(props, prop, value);
3974 }
3975
3976 /* Convert CPU model data from X86CPU object to a property dictionary
3977 * that can recreate exactly the same CPU model.
3978 */
3979 static void x86_cpu_to_dict(X86CPU *cpu, QDict *props)
3980 {
3981 QDict *sprops = x86_cpu_static_props();
3982 const QDictEntry *e;
3983
3984 for (e = qdict_first(sprops); e; e = qdict_next(sprops, e)) {
3985 const char *prop = qdict_entry_key(e);
3986 x86_cpu_expand_prop(cpu, props, prop);
3987 }
3988 }
3989
3990 /* Convert CPU model data from X86CPU object to a property dictionary
3991 * that can recreate exactly the same CPU model, including every
3992 * writeable QOM property.
3993 */
3994 static void x86_cpu_to_dict_full(X86CPU *cpu, QDict *props)
3995 {
3996 ObjectPropertyIterator iter;
3997 ObjectProperty *prop;
3998
3999 object_property_iter_init(&iter, OBJECT(cpu));
4000 while ((prop = object_property_iter_next(&iter))) {
4001 /* skip read-only or write-only properties */
4002 if (!prop->get || !prop->set) {
4003 continue;
4004 }
4005
4006 /* "hotplugged" is the only property that is configurable
4007 * on the command-line but will be set differently on CPUs
4008 * created using "-cpu ... -smp ..." and by CPUs created
4009 * on the fly by x86_cpu_from_model() for querying. Skip it.
4010 */
4011 if (!strcmp(prop->name, "hotplugged")) {
4012 continue;
4013 }
4014 x86_cpu_expand_prop(cpu, props, prop->name);
4015 }
4016 }
4017
4018 static void object_apply_props(Object *obj, QDict *props, Error **errp)
4019 {
4020 const QDictEntry *prop;
4021 Error *err = NULL;
4022
4023 for (prop = qdict_first(props); prop; prop = qdict_next(props, prop)) {
4024 object_property_set_qobject(obj, qdict_entry_value(prop),
4025 qdict_entry_key(prop), &err);
4026 if (err) {
4027 break;
4028 }
4029 }
4030
4031 error_propagate(errp, err);
4032 }
4033
4034 /* Create X86CPU object according to model+props specification */
4035 static X86CPU *x86_cpu_from_model(const char *model, QDict *props, Error **errp)
4036 {
4037 X86CPU *xc = NULL;
4038 X86CPUClass *xcc;
4039 Error *err = NULL;
4040
4041 xcc = X86_CPU_CLASS(cpu_class_by_name(TYPE_X86_CPU, model));
4042 if (xcc == NULL) {
4043 error_setg(&err, "CPU model '%s' not found", model);
4044 goto out;
4045 }
4046
4047 xc = X86_CPU(object_new(object_class_get_name(OBJECT_CLASS(xcc))));
4048 if (props) {
4049 object_apply_props(OBJECT(xc), props, &err);
4050 if (err) {
4051 goto out;
4052 }
4053 }
4054
4055 x86_cpu_expand_features(xc, &err);
4056 if (err) {
4057 goto out;
4058 }
4059
4060 out:
4061 if (err) {
4062 error_propagate(errp, err);
4063 object_unref(OBJECT(xc));
4064 xc = NULL;
4065 }
4066 return xc;
4067 }
4068
4069 CpuModelExpansionInfo *
4070 qmp_query_cpu_model_expansion(CpuModelExpansionType type,
4071 CpuModelInfo *model,
4072 Error **errp)
4073 {
4074 X86CPU *xc = NULL;
4075 Error *err = NULL;
4076 CpuModelExpansionInfo *ret = g_new0(CpuModelExpansionInfo, 1);
4077 QDict *props = NULL;
4078 const char *base_name;
4079
4080 xc = x86_cpu_from_model(model->name,
4081 model->has_props ?
4082 qobject_to(QDict, model->props) :
4083 NULL, &err);
4084 if (err) {
4085 goto out;
4086 }
4087
4088 props = qdict_new();
4089 ret->model = g_new0(CpuModelInfo, 1);
4090 ret->model->props = QOBJECT(props);
4091 ret->model->has_props = true;
4092
4093 switch (type) {
4094 case CPU_MODEL_EXPANSION_TYPE_STATIC:
4095 /* Static expansion will be based on "base" only */
4096 base_name = "base";
4097 x86_cpu_to_dict(xc, props);
4098 break;
4099 case CPU_MODEL_EXPANSION_TYPE_FULL:
4100 /* As we don't return every single property, full expansion needs
4101 * to keep the original model name+props, and add extra
4102 * properties on top of that.
4103 */
4104 base_name = model->name;
4105 x86_cpu_to_dict_full(xc, props);
4106 break;
4107 default:
4108 error_setg(&err, "Unsupported expansion type");
4109 goto out;
4110 }
4111
4112 x86_cpu_to_dict(xc, props);
4113
4114 ret->model->name = g_strdup(base_name);
4115
4116 out:
4117 object_unref(OBJECT(xc));
4118 if (err) {
4119 error_propagate(errp, err);
4120 qapi_free_CpuModelExpansionInfo(ret);
4121 ret = NULL;
4122 }
4123 return ret;
4124 }
4125 #endif /* !CONFIG_USER_ONLY */
4126
4127 static gchar *x86_gdb_arch_name(CPUState *cs)
4128 {
4129 #ifdef TARGET_X86_64
4130 return g_strdup("i386:x86-64");
4131 #else
4132 return g_strdup("i386");
4133 #endif
4134 }
4135
4136 static void x86_cpu_cpudef_class_init(ObjectClass *oc, void *data)
4137 {
4138 X86CPUDefinition *cpudef = data;
4139 X86CPUClass *xcc = X86_CPU_CLASS(oc);
4140
4141 xcc->cpu_def = cpudef;
4142 xcc->migration_safe = true;
4143 }
4144
4145 static void x86_register_cpudef_type(X86CPUDefinition *def)
4146 {
4147 char *typename = x86_cpu_type_name(def->name);
4148 TypeInfo ti = {
4149 .name = typename,
4150 .parent = TYPE_X86_CPU,
4151 .class_init = x86_cpu_cpudef_class_init,
4152 .class_data = def,
4153 };
4154
4155 /* AMD aliases are handled at runtime based on CPUID vendor, so
4156 * they shouldn't be set on the CPU model table.
4157 */
4158 assert(!(def->features[FEAT_8000_0001_EDX] & CPUID_EXT2_AMD_ALIASES));
4159 /* catch mistakes instead of silently truncating model_id when too long */
4160 assert(def->model_id && strlen(def->model_id) <= 48);
4161
4162
4163 type_register(&ti);
4164 g_free(typename);
4165 }
4166
4167 #if !defined(CONFIG_USER_ONLY)
4168
4169 void cpu_clear_apic_feature(CPUX86State *env)
4170 {
4171 env->features[FEAT_1_EDX] &= ~CPUID_APIC;
4172 }
4173
4174 #endif /* !CONFIG_USER_ONLY */
4175
4176 void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
4177 uint32_t *eax, uint32_t *ebx,
4178 uint32_t *ecx, uint32_t *edx)
4179 {
4180 X86CPU *cpu = x86_env_get_cpu(env);
4181 CPUState *cs = CPU(cpu);
4182 uint32_t pkg_offset;
4183 uint32_t limit;
4184 uint32_t signature[3];
4185
4186 /* Calculate & apply limits for different index ranges */
4187 if (index >= 0xC0000000) {
4188 limit = env->cpuid_xlevel2;
4189 } else if (index >= 0x80000000) {
4190 limit = env->cpuid_xlevel;
4191 } else if (index >= 0x40000000) {
4192 limit = 0x40000001;
4193 } else {
4194 limit = env->cpuid_level;
4195 }
4196
4197 if (index > limit) {
4198 /* Intel documentation states that invalid EAX input will
4199 * return the same information as EAX=cpuid_level
4200 * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID)
4201 */
4202 index = env->cpuid_level;
4203 }
4204
4205 switch(index) {
4206 case 0:
4207 *eax = env->cpuid_level;
4208 *ebx = env->cpuid_vendor1;
4209 *edx = env->cpuid_vendor2;
4210 *ecx = env->cpuid_vendor3;
4211 break;
4212 case 1:
4213 *eax = env->cpuid_version;
4214 *ebx = (cpu->apic_id << 24) |
4215 8 << 8; /* CLFLUSH size in quad words, Linux wants it. */
4216 *ecx = env->features[FEAT_1_ECX];
4217 if ((*ecx & CPUID_EXT_XSAVE) && (env->cr[4] & CR4_OSXSAVE_MASK)) {
4218 *ecx |= CPUID_EXT_OSXSAVE;
4219 }
4220 *edx = env->features[FEAT_1_EDX];
4221 if (cs->nr_cores * cs->nr_threads > 1) {
4222 *ebx |= (cs->nr_cores * cs->nr_threads) << 16;
4223 *edx |= CPUID_HT;
4224 }
4225 break;
4226 case 2:
4227 /* cache info: needed for Pentium Pro compatibility */
4228 if (cpu->cache_info_passthrough) {
4229 host_cpuid(index, 0, eax, ebx, ecx, edx);
4230 break;
4231 }
4232 *eax = 1; /* Number of CPUID[EAX=2] calls required */
4233 *ebx = 0;
4234 if (!cpu->enable_l3_cache) {
4235 *ecx = 0;
4236 } else {
4237 *ecx = cpuid2_cache_descriptor(env->cache_info_cpuid2.l3_cache);
4238 }
4239 *edx = (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1d_cache) << 16) |
4240 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1i_cache) << 8) |
4241 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l2_cache));
4242 break;
4243 case 4:
4244 /* cache info: needed for Core compatibility */
4245 if (cpu->cache_info_passthrough) {
4246 host_cpuid(index, count, eax, ebx, ecx, edx);
4247 /* QEMU gives out its own APIC IDs, never pass down bits 31..26. */
4248 *eax &= ~0xFC000000;
4249 if ((*eax & 31) && cs->nr_cores > 1) {
4250 *eax |= (cs->nr_cores - 1) << 26;
4251 }
4252 } else {
4253 *eax = 0;
4254 switch (count) {
4255 case 0: /* L1 dcache info */
4256 encode_cache_cpuid4(env->cache_info_cpuid4.l1d_cache,
4257 1, cs->nr_cores,
4258 eax, ebx, ecx, edx);
4259 break;
4260 case 1: /* L1 icache info */
4261 encode_cache_cpuid4(env->cache_info_cpuid4.l1i_cache,
4262 1, cs->nr_cores,
4263 eax, ebx, ecx, edx);
4264 break;
4265 case 2: /* L2 cache info */
4266 encode_cache_cpuid4(env->cache_info_cpuid4.l2_cache,
4267 cs->nr_threads, cs->nr_cores,
4268 eax, ebx, ecx, edx);
4269 break;
4270 case 3: /* L3 cache info */
4271 pkg_offset = apicid_pkg_offset(cs->nr_cores, cs->nr_threads);
4272 if (cpu->enable_l3_cache) {
4273 encode_cache_cpuid4(env->cache_info_cpuid4.l3_cache,
4274 (1 << pkg_offset), cs->nr_cores,
4275 eax, ebx, ecx, edx);
4276 break;
4277 }
4278 /* fall through */
4279 default: /* end of info */
4280 *eax = *ebx = *ecx = *edx = 0;
4281 break;
4282 }
4283 }
4284 break;
4285 case 5:
4286 /* MONITOR/MWAIT Leaf */
4287 *eax = cpu->mwait.eax; /* Smallest monitor-line size in bytes */
4288 *ebx = cpu->mwait.ebx; /* Largest monitor-line size in bytes */
4289 *ecx = cpu->mwait.ecx; /* flags */
4290 *edx = cpu->mwait.edx; /* mwait substates */
4291 break;
4292 case 6:
4293 /* Thermal and Power Leaf */
4294 *eax = env->features[FEAT_6_EAX];
4295 *ebx = 0;
4296 *ecx = 0;
4297 *edx = 0;
4298 break;
4299 case 7:
4300 /* Structured Extended Feature Flags Enumeration Leaf */
4301 if (count == 0) {
4302 *eax = 0; /* Maximum ECX value for sub-leaves */
4303 *ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */
4304 *ecx = env->features[FEAT_7_0_ECX]; /* Feature flags */
4305 if ((*ecx & CPUID_7_0_ECX_PKU) && env->cr[4] & CR4_PKE_MASK) {
4306 *ecx |= CPUID_7_0_ECX_OSPKE;
4307 }
4308 *edx = env->features[FEAT_7_0_EDX]; /* Feature flags */
4309 } else {
4310 *eax = 0;
4311 *ebx = 0;
4312 *ecx = 0;
4313 *edx = 0;
4314 }
4315 break;
4316 case 9:
4317 /* Direct Cache Access Information Leaf */
4318 *eax = 0; /* Bits 0-31 in DCA_CAP MSR */
4319 *ebx = 0;
4320 *ecx = 0;
4321 *edx = 0;
4322 break;
4323 case 0xA:
4324 /* Architectural Performance Monitoring Leaf */
4325 if (kvm_enabled() && cpu->enable_pmu) {
4326 KVMState *s = cs->kvm_state;
4327
4328 *eax = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EAX);
4329 *ebx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EBX);
4330 *ecx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_ECX);
4331 *edx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EDX);
4332 } else if (hvf_enabled() && cpu->enable_pmu) {
4333 *eax = hvf_get_supported_cpuid(0xA, count, R_EAX);
4334 *ebx = hvf_get_supported_cpuid(0xA, count, R_EBX);
4335 *ecx = hvf_get_supported_cpuid(0xA, count, R_ECX);
4336 *edx = hvf_get_supported_cpuid(0xA, count, R_EDX);
4337 } else {
4338 *eax = 0;
4339 *ebx = 0;
4340 *ecx = 0;
4341 *edx = 0;
4342 }
4343 break;
4344 case 0xB:
4345 /* Extended Topology Enumeration Leaf */
4346 if (!cpu->enable_cpuid_0xb) {
4347 *eax = *ebx = *ecx = *edx = 0;
4348 break;
4349 }
4350
4351 *ecx = count & 0xff;
4352 *edx = cpu->apic_id;
4353
4354 switch (count) {
4355 case 0:
4356 *eax = apicid_core_offset(cs->nr_cores, cs->nr_threads);
4357 *ebx = cs->nr_threads;
4358 *ecx |= CPUID_TOPOLOGY_LEVEL_SMT;
4359 break;
4360 case 1:
4361 *eax = apicid_pkg_offset(cs->nr_cores, cs->nr_threads);
4362 *ebx = cs->nr_cores * cs->nr_threads;
4363 *ecx |= CPUID_TOPOLOGY_LEVEL_CORE;
4364 break;
4365 default:
4366 *eax = 0;
4367 *ebx = 0;
4368 *ecx |= CPUID_TOPOLOGY_LEVEL_INVALID;
4369 }
4370
4371 assert(!(*eax & ~0x1f));
4372 *ebx &= 0xffff; /* The count doesn't need to be reliable. */
4373 break;
4374 case 0xD: {
4375 /* Processor Extended State */
4376 *eax = 0;
4377 *ebx = 0;
4378 *ecx = 0;
4379 *edx = 0;
4380 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
4381 break;
4382 }
4383
4384 if (count == 0) {
4385 *ecx = xsave_area_size(x86_cpu_xsave_components(cpu));
4386 *eax = env->features[FEAT_XSAVE_COMP_LO];
4387 *edx = env->features[FEAT_XSAVE_COMP_HI];
4388 *ebx = xsave_area_size(env->xcr0);
4389 } else if (count == 1) {
4390 *eax = env->features[FEAT_XSAVE];
4391 } else if (count < ARRAY_SIZE(x86_ext_save_areas)) {
4392 if ((x86_cpu_xsave_components(cpu) >> count) & 1) {
4393 const ExtSaveArea *esa = &x86_ext_save_areas[count];
4394 *eax = esa->size;
4395 *ebx = esa->offset;
4396 }
4397 }
4398 break;
4399 }
4400 case 0x14: {
4401 /* Intel Processor Trace Enumeration */
4402 *eax = 0;
4403 *ebx = 0;
4404 *ecx = 0;
4405 *edx = 0;
4406 if (!(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) ||
4407 !kvm_enabled()) {
4408 break;
4409 }
4410
4411 if (count == 0) {
4412 *eax = INTEL_PT_MAX_SUBLEAF;
4413 *ebx = INTEL_PT_MINIMAL_EBX;
4414 *ecx = INTEL_PT_MINIMAL_ECX;
4415 } else if (count == 1) {
4416 *eax = INTEL_PT_MTC_BITMAP | INTEL_PT_ADDR_RANGES_NUM;
4417 *ebx = INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP;
4418 }
4419 break;
4420 }
4421 case 0x40000000:
4422 /*
4423 * CPUID code in kvm_arch_init_vcpu() ignores stuff
4424 * set here, but we restrict to TCG none the less.
4425 */
4426 if (tcg_enabled() && cpu->expose_tcg) {
4427 memcpy(signature, "TCGTCGTCGTCG", 12);
4428 *eax = 0x40000001;
4429 *ebx = signature[0];
4430 *ecx = signature[1];
4431 *edx = signature[2];
4432 } else {
4433 *eax = 0;
4434 *ebx = 0;
4435 *ecx = 0;
4436 *edx = 0;
4437 }
4438 break;
4439 case 0x40000001:
4440 *eax = 0;
4441 *ebx = 0;
4442 *ecx = 0;
4443 *edx = 0;
4444 break;
4445 case 0x80000000:
4446 *eax = env->cpuid_xlevel;
4447 *ebx = env->cpuid_vendor1;
4448 *edx = env->cpuid_vendor2;
4449 *ecx = env->cpuid_vendor3;
4450 break;
4451 case 0x80000001:
4452 *eax = env->cpuid_version;
4453 *ebx = 0;
4454 *ecx = env->features[FEAT_8000_0001_ECX];
4455 *edx = env->features[FEAT_8000_0001_EDX];
4456
4457 /* The Linux kernel checks for the CMPLegacy bit and
4458 * discards multiple thread information if it is set.
4459 * So don't set it here for Intel to make Linux guests happy.
4460 */
4461 if (cs->nr_cores * cs->nr_threads > 1) {
4462 if (env->cpuid_vendor1 != CPUID_VENDOR_INTEL_1 ||
4463 env->cpuid_vendor2 != CPUID_VENDOR_INTEL_2 ||
4464 env->cpuid_vendor3 != CPUID_VENDOR_INTEL_3) {
4465 *ecx |= 1 << 1; /* CmpLegacy bit */
4466 }
4467 }
4468 break;
4469 case 0x80000002:
4470 case 0x80000003:
4471 case 0x80000004:
4472 *eax = env->cpuid_model[(index - 0x80000002) * 4 + 0];
4473 *ebx = env->cpuid_model[(index - 0x80000002) * 4 + 1];
4474 *ecx = env->cpuid_model[(index - 0x80000002) * 4 + 2];
4475 *edx = env->cpuid_model[(index - 0x80000002) * 4 + 3];
4476 break;
4477 case 0x80000005:
4478 /* cache info (L1 cache) */
4479 if (cpu->cache_info_passthrough) {
4480 host_cpuid(index, 0, eax, ebx, ecx, edx);
4481 break;
4482 }
4483 *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) | \
4484 (L1_ITLB_2M_ASSOC << 8) | (L1_ITLB_2M_ENTRIES);
4485 *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) | \
4486 (L1_ITLB_4K_ASSOC << 8) | (L1_ITLB_4K_ENTRIES);
4487 *ecx = encode_cache_cpuid80000005(env->cache_info_amd.l1d_cache);
4488 *edx = encode_cache_cpuid80000005(env->cache_info_amd.l1i_cache);
4489 break;
4490 case 0x80000006:
4491 /* cache info (L2 cache) */
4492 if (cpu->cache_info_passthrough) {
4493 host_cpuid(index, 0, eax, ebx, ecx, edx);
4494 break;
4495 }
4496 *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) | \
4497 (L2_DTLB_2M_ENTRIES << 16) | \
4498 (AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) | \
4499 (L2_ITLB_2M_ENTRIES);
4500 *ebx = (AMD_ENC_ASSOC(L2_DTLB_4K_ASSOC) << 28) | \
4501 (L2_DTLB_4K_ENTRIES << 16) | \
4502 (AMD_ENC_ASSOC(L2_ITLB_4K_ASSOC) << 12) | \
4503 (L2_ITLB_4K_ENTRIES);
4504 encode_cache_cpuid80000006(env->cache_info_amd.l2_cache,
4505 cpu->enable_l3_cache ?
4506 env->cache_info_amd.l3_cache : NULL,
4507 ecx, edx);
4508 break;
4509 case 0x80000007:
4510 *eax = 0;
4511 *ebx = 0;
4512 *ecx = 0;
4513 *edx = env->features[FEAT_8000_0007_EDX];
4514 break;
4515 case 0x80000008:
4516 /* virtual & phys address size in low 2 bytes. */
4517 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
4518 /* 64 bit processor */
4519 *eax = cpu->phys_bits; /* configurable physical bits */
4520 if (env->features[FEAT_7_0_ECX] & CPUID_7_0_ECX_LA57) {
4521 *eax |= 0x00003900; /* 57 bits virtual */
4522 } else {
4523 *eax |= 0x00003000; /* 48 bits virtual */
4524 }
4525 } else {
4526 *eax = cpu->phys_bits;
4527 }
4528 *ebx = env->features[FEAT_8000_0008_EBX];
4529 *ecx = 0;
4530 *edx = 0;
4531 if (cs->nr_cores * cs->nr_threads > 1) {
4532 *ecx |= (cs->nr_cores * cs->nr_threads) - 1;
4533 }
4534 break;
4535 case 0x8000000A:
4536 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
4537 *eax = 0x00000001; /* SVM Revision */
4538 *ebx = 0x00000010; /* nr of ASIDs */
4539 *ecx = 0;
4540 *edx = env->features[FEAT_SVM]; /* optional features */
4541 } else {
4542 *eax = 0;
4543 *ebx = 0;
4544 *ecx = 0;
4545 *edx = 0;
4546 }
4547 break;
4548 case 0x8000001D:
4549 *eax = 0;
4550 switch (count) {
4551 case 0: /* L1 dcache info */
4552 encode_cache_cpuid8000001d(env->cache_info_amd.l1d_cache, cs,
4553 eax, ebx, ecx, edx);
4554 break;
4555 case 1: /* L1 icache info */
4556 encode_cache_cpuid8000001d(env->cache_info_amd.l1i_cache, cs,
4557 eax, ebx, ecx, edx);
4558 break;
4559 case 2: /* L2 cache info */
4560 encode_cache_cpuid8000001d(env->cache_info_amd.l2_cache, cs,
4561 eax, ebx, ecx, edx);
4562 break;
4563 case 3: /* L3 cache info */
4564 encode_cache_cpuid8000001d(env->cache_info_amd.l3_cache, cs,
4565 eax, ebx, ecx, edx);
4566 break;
4567 default: /* end of info */
4568 *eax = *ebx = *ecx = *edx = 0;
4569 break;
4570 }
4571 break;
4572 case 0x8000001E:
4573 assert(cpu->core_id <= 255);
4574 encode_topo_cpuid8000001e(cs, cpu,
4575 eax, ebx, ecx, edx);
4576 break;
4577 case 0xC0000000:
4578 *eax = env->cpuid_xlevel2;
4579 *ebx = 0;
4580 *ecx = 0;
4581 *edx = 0;
4582 break;
4583 case 0xC0000001:
4584 /* Support for VIA CPU's CPUID instruction */
4585 *eax = env->cpuid_version;
4586 *ebx = 0;
4587 *ecx = 0;
4588 *edx = env->features[FEAT_C000_0001_EDX];
4589 break;
4590 case 0xC0000002:
4591 case 0xC0000003:
4592 case 0xC0000004:
4593 /* Reserved for the future, and now filled with zero */
4594 *eax = 0;
4595 *ebx = 0;
4596 *ecx = 0;
4597 *edx = 0;
4598 break;
4599 case 0x8000001F:
4600 *eax = sev_enabled() ? 0x2 : 0;
4601 *ebx = sev_get_cbit_position();
4602 *ebx |= sev_get_reduced_phys_bits() << 6;
4603 *ecx = 0;
4604 *edx = 0;
4605 break;
4606 default:
4607 /* reserved values: zero */
4608 *eax = 0;
4609 *ebx = 0;
4610 *ecx = 0;
4611 *edx = 0;
4612 break;
4613 }
4614 }
4615
4616 /* CPUClass::reset() */
4617 static void x86_cpu_reset(CPUState *s)
4618 {
4619 X86CPU *cpu = X86_CPU(s);
4620 X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu);
4621 CPUX86State *env = &cpu->env;
4622 target_ulong cr4;
4623 uint64_t xcr0;
4624 int i;
4625
4626 xcc->parent_reset(s);
4627
4628 memset(env, 0, offsetof(CPUX86State, end_reset_fields));
4629
4630 env->old_exception = -1;
4631
4632 /* init to reset state */
4633
4634 env->hflags2 |= HF2_GIF_MASK;
4635
4636 cpu_x86_update_cr0(env, 0x60000010);
4637 env->a20_mask = ~0x0;
4638 env->smbase = 0x30000;
4639 env->msr_smi_count = 0;
4640
4641 env->idt.limit = 0xffff;
4642 env->gdt.limit = 0xffff;
4643 env->ldt.limit = 0xffff;
4644 env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT);
4645 env->tr.limit = 0xffff;
4646 env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT);
4647
4648 cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff,
4649 DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK |
4650 DESC_R_MASK | DESC_A_MASK);
4651 cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff,
4652 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
4653 DESC_A_MASK);
4654 cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff,
4655 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
4656 DESC_A_MASK);
4657 cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff,
4658 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
4659 DESC_A_MASK);
4660 cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff,
4661 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
4662 DESC_A_MASK);
4663 cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff,
4664 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
4665 DESC_A_MASK);
4666
4667 env->eip = 0xfff0;
4668 env->regs[R_EDX] = env->cpuid_version;
4669
4670 env->eflags = 0x2;
4671
4672 /* FPU init */
4673 for (i = 0; i < 8; i++) {
4674 env->fptags[i] = 1;
4675 }
4676 cpu_set_fpuc(env, 0x37f);
4677
4678 env->mxcsr = 0x1f80;
4679 /* All units are in INIT state. */
4680 env->xstate_bv = 0;
4681
4682 env->pat = 0x0007040600070406ULL;
4683 env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT;
4684
4685 memset(env->dr, 0, sizeof(env->dr));
4686 env->dr[6] = DR6_FIXED_1;
4687 env->dr[7] = DR7_FIXED_1;
4688 cpu_breakpoint_remove_all(s, BP_CPU);
4689 cpu_watchpoint_remove_all(s, BP_CPU);
4690
4691 cr4 = 0;
4692 xcr0 = XSTATE_FP_MASK;
4693
4694 #ifdef CONFIG_USER_ONLY
4695 /* Enable all the features for user-mode. */
4696 if (env->features[FEAT_1_EDX] & CPUID_SSE) {
4697 xcr0 |= XSTATE_SSE_MASK;
4698 }
4699 for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
4700 const ExtSaveArea *esa = &x86_ext_save_areas[i];
4701 if (env->features[esa->feature] & esa->bits) {
4702 xcr0 |= 1ull << i;
4703 }
4704 }
4705
4706 if (env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE) {
4707 cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK;
4708 }
4709 if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_FSGSBASE) {
4710 cr4 |= CR4_FSGSBASE_MASK;
4711 }
4712 #endif
4713
4714 env->xcr0 = xcr0;
4715 cpu_x86_update_cr4(env, cr4);
4716
4717 /*
4718 * SDM 11.11.5 requires:
4719 * - IA32_MTRR_DEF_TYPE MSR.E = 0
4720 * - IA32_MTRR_PHYSMASKn.V = 0
4721 * All other bits are undefined. For simplification, zero it all.
4722 */
4723 env->mtrr_deftype = 0;
4724 memset(env->mtrr_var, 0, sizeof(env->mtrr_var));
4725 memset(env->mtrr_fixed, 0, sizeof(env->mtrr_fixed));
4726
4727 env->interrupt_injected = -1;
4728 env->exception_injected = -1;
4729 env->nmi_injected = false;
4730 #if !defined(CONFIG_USER_ONLY)
4731 /* We hard-wire the BSP to the first CPU. */
4732 apic_designate_bsp(cpu->apic_state, s->cpu_index == 0);
4733
4734 s->halted = !cpu_is_bsp(cpu);
4735
4736 if (kvm_enabled()) {
4737 kvm_arch_reset_vcpu(cpu);
4738 }
4739 else if (hvf_enabled()) {
4740 hvf_reset_vcpu(s);
4741 }
4742 #endif
4743 }
4744
4745 #ifndef CONFIG_USER_ONLY
4746 bool cpu_is_bsp(X86CPU *cpu)
4747 {
4748 return cpu_get_apic_base(cpu->apic_state) & MSR_IA32_APICBASE_BSP;
4749 }
4750
4751 /* TODO: remove me, when reset over QOM tree is implemented */
4752 static void x86_cpu_machine_reset_cb(void *opaque)
4753 {
4754 X86CPU *cpu = opaque;
4755 cpu_reset(CPU(cpu));
4756 }
4757 #endif
4758
4759 static void mce_init(X86CPU *cpu)
4760 {
4761 CPUX86State *cenv = &cpu->env;
4762 unsigned int bank;
4763
4764 if (((cenv->cpuid_version >> 8) & 0xf) >= 6
4765 && (cenv->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) ==
4766 (CPUID_MCE | CPUID_MCA)) {
4767 cenv->mcg_cap = MCE_CAP_DEF | MCE_BANKS_DEF |
4768 (cpu->enable_lmce ? MCG_LMCE_P : 0);
4769 cenv->mcg_ctl = ~(uint64_t)0;
4770 for (bank = 0; bank < MCE_BANKS_DEF; bank++) {
4771 cenv->mce_banks[bank * 4] = ~(uint64_t)0;
4772 }
4773 }
4774 }
4775
4776 #ifndef CONFIG_USER_ONLY
4777 APICCommonClass *apic_get_class(void)
4778 {
4779 const char *apic_type = "apic";
4780
4781 /* TODO: in-kernel irqchip for hvf */
4782 if (kvm_apic_in_kernel()) {
4783 apic_type = "kvm-apic";
4784 } else if (xen_enabled()) {
4785 apic_type = "xen-apic";
4786 }
4787
4788 return APIC_COMMON_CLASS(object_class_by_name(apic_type));
4789 }
4790
4791 static void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
4792 {
4793 APICCommonState *apic;
4794 ObjectClass *apic_class = OBJECT_CLASS(apic_get_class());
4795
4796 cpu->apic_state = DEVICE(object_new(object_class_get_name(apic_class)));
4797
4798 object_property_add_child(OBJECT(cpu), "lapic",
4799 OBJECT(cpu->apic_state), &error_abort);
4800 object_unref(OBJECT(cpu->apic_state));
4801
4802 qdev_prop_set_uint32(cpu->apic_state, "id", cpu->apic_id);
4803 /* TODO: convert to link<> */
4804 apic = APIC_COMMON(cpu->apic_state);
4805 apic->cpu = cpu;
4806 apic->apicbase = APIC_DEFAULT_ADDRESS | MSR_IA32_APICBASE_ENABLE;
4807 }
4808
4809 static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
4810 {
4811 APICCommonState *apic;
4812 static bool apic_mmio_map_once;
4813
4814 if (cpu->apic_state == NULL) {
4815 return;
4816 }
4817 object_property_set_bool(OBJECT(cpu->apic_state), true, "realized",
4818 errp);
4819
4820 /* Map APIC MMIO area */
4821 apic = APIC_COMMON(cpu->apic_state);
4822 if (!apic_mmio_map_once) {
4823 memory_region_add_subregion_overlap(get_system_memory(),
4824 apic->apicbase &
4825 MSR_IA32_APICBASE_BASE,
4826 &apic->io_memory,
4827 0x1000);
4828 apic_mmio_map_once = true;
4829 }
4830 }
4831
4832 static void x86_cpu_machine_done(Notifier *n, void *unused)
4833 {
4834 X86CPU *cpu = container_of(n, X86CPU, machine_done);
4835 MemoryRegion *smram =
4836 (MemoryRegion *) object_resolve_path("/machine/smram", NULL);
4837
4838 if (smram) {
4839 cpu->smram = g_new(MemoryRegion, 1);
4840 memory_region_init_alias(cpu->smram, OBJECT(cpu), "smram",
4841 smram, 0, 1ull << 32);
4842 memory_region_set_enabled(cpu->smram, true);
4843 memory_region_add_subregion_overlap(cpu->cpu_as_root, 0, cpu->smram, 1);
4844 }
4845 }
4846 #else
4847 static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
4848 {
4849 }
4850 #endif
4851
4852 /* Note: Only safe for use on x86(-64) hosts */
4853 static uint32_t x86_host_phys_bits(void)
4854 {
4855 uint32_t eax;
4856 uint32_t host_phys_bits;
4857
4858 host_cpuid(0x80000000, 0, &eax, NULL, NULL, NULL);
4859 if (eax >= 0x80000008) {
4860 host_cpuid(0x80000008, 0, &eax, NULL, NULL, NULL);
4861 /* Note: According to AMD doc 25481 rev 2.34 they have a field
4862 * at 23:16 that can specify a maximum physical address bits for
4863 * the guest that can override this value; but I've not seen
4864 * anything with that set.
4865 */
4866 host_phys_bits = eax & 0xff;
4867 } else {
4868 /* It's an odd 64 bit machine that doesn't have the leaf for
4869 * physical address bits; fall back to 36 that's most older
4870 * Intel.
4871 */
4872 host_phys_bits = 36;
4873 }
4874
4875 return host_phys_bits;
4876 }
4877
4878 static void x86_cpu_adjust_level(X86CPU *cpu, uint32_t *min, uint32_t value)
4879 {
4880 if (*min < value) {
4881 *min = value;
4882 }
4883 }
4884
4885 /* Increase cpuid_min_{level,xlevel,xlevel2} automatically, if appropriate */
4886 static void x86_cpu_adjust_feat_level(X86CPU *cpu, FeatureWord w)
4887 {
4888 CPUX86State *env = &cpu->env;
4889 FeatureWordInfo *fi = &feature_word_info[w];
4890 uint32_t eax = fi->cpuid.eax;
4891 uint32_t region = eax & 0xF0000000;
4892
4893 assert(feature_word_info[w].type == CPUID_FEATURE_WORD);
4894 if (!env->features[w]) {
4895 return;
4896 }
4897
4898 switch (region) {
4899 case 0x00000000:
4900 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, eax);
4901 break;
4902 case 0x80000000:
4903 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, eax);
4904 break;
4905 case 0xC0000000:
4906 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel2, eax);
4907 break;
4908 }
4909 }
4910
4911 /* Calculate XSAVE components based on the configured CPU feature flags */
4912 static void x86_cpu_enable_xsave_components(X86CPU *cpu)
4913 {
4914 CPUX86State *env = &cpu->env;
4915 int i;
4916 uint64_t mask;
4917
4918 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
4919 return;
4920 }
4921
4922 mask = 0;
4923 for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
4924 const ExtSaveArea *esa = &x86_ext_save_areas[i];
4925 if (env->features[esa->feature] & esa->bits) {
4926 mask |= (1ULL << i);
4927 }
4928 }
4929
4930 env->features[FEAT_XSAVE_COMP_LO] = mask;
4931 env->features[FEAT_XSAVE_COMP_HI] = mask >> 32;
4932 }
4933
4934 /***** Steps involved on loading and filtering CPUID data
4935 *
4936 * When initializing and realizing a CPU object, the steps
4937 * involved in setting up CPUID data are:
4938 *
4939 * 1) Loading CPU model definition (X86CPUDefinition). This is
4940 * implemented by x86_cpu_load_def() and should be completely
4941 * transparent, as it is done automatically by instance_init.
4942 * No code should need to look at X86CPUDefinition structs
4943 * outside instance_init.
4944 *
4945 * 2) CPU expansion. This is done by realize before CPUID
4946 * filtering, and will make sure host/accelerator data is
4947 * loaded for CPU models that depend on host capabilities
4948 * (e.g. "host"). Done by x86_cpu_expand_features().
4949 *
4950 * 3) CPUID filtering. This initializes extra data related to
4951 * CPUID, and checks if the host supports all capabilities
4952 * required by the CPU. Runnability of a CPU model is
4953 * determined at this step. Done by x86_cpu_filter_features().
4954 *
4955 * Some operations don't require all steps to be performed.
4956 * More precisely:
4957 *
4958 * - CPU instance creation (instance_init) will run only CPU
4959 * model loading. CPU expansion can't run at instance_init-time
4960 * because host/accelerator data may be not available yet.
4961 * - CPU realization will perform both CPU model expansion and CPUID
4962 * filtering, and return an error in case one of them fails.
4963 * - query-cpu-definitions needs to run all 3 steps. It needs
4964 * to run CPUID filtering, as the 'unavailable-features'
4965 * field is set based on the filtering results.
4966 * - The query-cpu-model-expansion QMP command only needs to run
4967 * CPU model loading and CPU expansion. It should not filter
4968 * any CPUID data based on host capabilities.
4969 */
4970
4971 /* Expand CPU configuration data, based on configured features
4972 * and host/accelerator capabilities when appropriate.
4973 */
4974 static void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
4975 {
4976 CPUX86State *env = &cpu->env;
4977 FeatureWord w;
4978 GList *l;
4979 Error *local_err = NULL;
4980
4981 /*TODO: Now cpu->max_features doesn't overwrite features
4982 * set using QOM properties, and we can convert
4983 * plus_features & minus_features to global properties
4984 * inside x86_cpu_parse_featurestr() too.
4985 */
4986 if (cpu->max_features) {
4987 for (w = 0; w < FEATURE_WORDS; w++) {
4988 /* Override only features that weren't set explicitly
4989 * by the user.
4990 */
4991 env->features[w] |=
4992 x86_cpu_get_supported_feature_word(w, cpu->migratable) &
4993 ~env->user_features[w] & \
4994 ~feature_word_info[w].no_autoenable_flags;
4995 }
4996 }
4997
4998 for (l = plus_features; l; l = l->next) {
4999 const char *prop = l->data;
5000 object_property_set_bool(OBJECT(cpu), true, prop, &local_err);
5001 if (local_err) {
5002 goto out;
5003 }
5004 }
5005
5006 for (l = minus_features; l; l = l->next) {
5007 const char *prop = l->data;
5008 object_property_set_bool(OBJECT(cpu), false, prop, &local_err);
5009 if (local_err) {
5010 goto out;
5011 }
5012 }
5013
5014 if (!kvm_enabled() || !cpu->expose_kvm) {
5015 env->features[FEAT_KVM] = 0;
5016 }
5017
5018 x86_cpu_enable_xsave_components(cpu);
5019
5020 /* CPUID[EAX=7,ECX=0].EBX always increased level automatically: */
5021 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_EBX);
5022 if (cpu->full_cpuid_auto_level) {
5023 x86_cpu_adjust_feat_level(cpu, FEAT_1_EDX);
5024 x86_cpu_adjust_feat_level(cpu, FEAT_1_ECX);
5025 x86_cpu_adjust_feat_level(cpu, FEAT_6_EAX);
5026 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_ECX);
5027 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_EDX);
5028 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_ECX);
5029 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0007_EDX);
5030 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0008_EBX);
5031 x86_cpu_adjust_feat_level(cpu, FEAT_C000_0001_EDX);
5032 x86_cpu_adjust_feat_level(cpu, FEAT_SVM);
5033 x86_cpu_adjust_feat_level(cpu, FEAT_XSAVE);
5034
5035 /* Intel Processor Trace requires CPUID[0x14] */
5036 if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) &&
5037 kvm_enabled() && cpu->intel_pt_auto_level) {
5038 x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14);
5039 }
5040
5041 /* SVM requires CPUID[0x8000000A] */
5042 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
5043 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000000A);
5044 }
5045
5046 /* SEV requires CPUID[0x8000001F] */
5047 if (sev_enabled()) {
5048 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000001F);
5049 }
5050 }
5051
5052 /* Set cpuid_*level* based on cpuid_min_*level, if not explicitly set */
5053 if (env->cpuid_level == UINT32_MAX) {
5054 env->cpuid_level = env->cpuid_min_level;
5055 }
5056 if (env->cpuid_xlevel == UINT32_MAX) {
5057 env->cpuid_xlevel = env->cpuid_min_xlevel;
5058 }
5059 if (env->cpuid_xlevel2 == UINT32_MAX) {
5060 env->cpuid_xlevel2 = env->cpuid_min_xlevel2;
5061 }
5062
5063 out:
5064 if (local_err != NULL) {
5065 error_propagate(errp, local_err);
5066 }
5067 }
5068
5069 /*
5070 * Finishes initialization of CPUID data, filters CPU feature
5071 * words based on host availability of each feature.
5072 *
5073 * Returns: 0 if all flags are supported by the host, non-zero otherwise.
5074 */
5075 static int x86_cpu_filter_features(X86CPU *cpu)
5076 {
5077 CPUX86State *env = &cpu->env;
5078 FeatureWord w;
5079 int rv = 0;
5080
5081 for (w = 0; w < FEATURE_WORDS; w++) {
5082 uint32_t host_feat =
5083 x86_cpu_get_supported_feature_word(w, false);
5084 uint32_t requested_features = env->features[w];
5085 env->features[w] &= host_feat;
5086 cpu->filtered_features[w] = requested_features & ~env->features[w];
5087 if (cpu->filtered_features[w]) {
5088 rv = 1;
5089 }
5090 }
5091
5092 if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) &&
5093 kvm_enabled()) {
5094 KVMState *s = CPU(cpu)->kvm_state;
5095 uint32_t eax_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EAX);
5096 uint32_t ebx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EBX);
5097 uint32_t ecx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_ECX);
5098 uint32_t eax_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EAX);
5099 uint32_t ebx_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EBX);
5100
5101 if (!eax_0 ||
5102 ((ebx_0 & INTEL_PT_MINIMAL_EBX) != INTEL_PT_MINIMAL_EBX) ||
5103 ((ecx_0 & INTEL_PT_MINIMAL_ECX) != INTEL_PT_MINIMAL_ECX) ||
5104 ((eax_1 & INTEL_PT_MTC_BITMAP) != INTEL_PT_MTC_BITMAP) ||
5105 ((eax_1 & INTEL_PT_ADDR_RANGES_NUM_MASK) <
5106 INTEL_PT_ADDR_RANGES_NUM) ||
5107 ((ebx_1 & (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) !=
5108 (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) ||
5109 (ecx_0 & INTEL_PT_IP_LIP)) {
5110 /*
5111 * Processor Trace capabilities aren't configurable, so if the
5112 * host can't emulate the capabilities we report on
5113 * cpu_x86_cpuid(), intel-pt can't be enabled on the current host.
5114 */
5115 env->features[FEAT_7_0_EBX] &= ~CPUID_7_0_EBX_INTEL_PT;
5116 cpu->filtered_features[FEAT_7_0_EBX] |= CPUID_7_0_EBX_INTEL_PT;
5117 rv = 1;
5118 }
5119 }
5120
5121 return rv;
5122 }
5123
5124 #define IS_INTEL_CPU(env) ((env)->cpuid_vendor1 == CPUID_VENDOR_INTEL_1 && \
5125 (env)->cpuid_vendor2 == CPUID_VENDOR_INTEL_2 && \
5126 (env)->cpuid_vendor3 == CPUID_VENDOR_INTEL_3)
5127 #define IS_AMD_CPU(env) ((env)->cpuid_vendor1 == CPUID_VENDOR_AMD_1 && \
5128 (env)->cpuid_vendor2 == CPUID_VENDOR_AMD_2 && \
5129 (env)->cpuid_vendor3 == CPUID_VENDOR_AMD_3)
5130 static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
5131 {
5132 CPUState *cs = CPU(dev);
5133 X86CPU *cpu = X86_CPU(dev);
5134 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
5135 CPUX86State *env = &cpu->env;
5136 Error *local_err = NULL;
5137 static bool ht_warned;
5138
5139 if (xcc->host_cpuid_required) {
5140 if (!accel_uses_host_cpuid()) {
5141 char *name = x86_cpu_class_get_model_name(xcc);
5142 error_setg(&local_err, "CPU model '%s' requires KVM", name);
5143 g_free(name);
5144 goto out;
5145 }
5146
5147 if (enable_cpu_pm) {
5148 host_cpuid(5, 0, &cpu->mwait.eax, &cpu->mwait.ebx,
5149 &cpu->mwait.ecx, &cpu->mwait.edx);
5150 env->features[FEAT_1_ECX] |= CPUID_EXT_MONITOR;
5151 }
5152 }
5153
5154 /* mwait extended info: needed for Core compatibility */
5155 /* We always wake on interrupt even if host does not have the capability */
5156 cpu->mwait.ecx |= CPUID_MWAIT_EMX | CPUID_MWAIT_IBE;
5157
5158 if (cpu->apic_id == UNASSIGNED_APIC_ID) {
5159 error_setg(errp, "apic-id property was not initialized properly");
5160 return;
5161 }
5162
5163 x86_cpu_expand_features(cpu, &local_err);
5164 if (local_err) {
5165 goto out;
5166 }
5167
5168 if (x86_cpu_filter_features(cpu) &&
5169 (cpu->check_cpuid || cpu->enforce_cpuid)) {
5170 x86_cpu_report_filtered_features(cpu);
5171 if (cpu->enforce_cpuid) {
5172 error_setg(&local_err,
5173 accel_uses_host_cpuid() ?
5174 "Host doesn't support requested features" :
5175 "TCG doesn't support requested features");
5176 goto out;
5177 }
5178 }
5179
5180 /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on
5181 * CPUID[1].EDX.
5182 */
5183 if (IS_AMD_CPU(env)) {
5184 env->features[FEAT_8000_0001_EDX] &= ~CPUID_EXT2_AMD_ALIASES;
5185 env->features[FEAT_8000_0001_EDX] |= (env->features[FEAT_1_EDX]
5186 & CPUID_EXT2_AMD_ALIASES);
5187 }
5188
5189 /* For 64bit systems think about the number of physical bits to present.
5190 * ideally this should be the same as the host; anything other than matching
5191 * the host can cause incorrect guest behaviour.
5192 * QEMU used to pick the magic value of 40 bits that corresponds to
5193 * consumer AMD devices but nothing else.
5194 */
5195 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
5196 if (accel_uses_host_cpuid()) {
5197 uint32_t host_phys_bits = x86_host_phys_bits();
5198 static bool warned;
5199
5200 if (cpu->host_phys_bits) {
5201 /* The user asked for us to use the host physical bits */
5202 cpu->phys_bits = host_phys_bits;
5203 if (cpu->host_phys_bits_limit &&
5204 cpu->phys_bits > cpu->host_phys_bits_limit) {
5205 cpu->phys_bits = cpu->host_phys_bits_limit;
5206 }
5207 }
5208
5209 /* Print a warning if the user set it to a value that's not the
5210 * host value.
5211 */
5212 if (cpu->phys_bits != host_phys_bits && cpu->phys_bits != 0 &&
5213 !warned) {
5214 warn_report("Host physical bits (%u)"
5215 " does not match phys-bits property (%u)",
5216 host_phys_bits, cpu->phys_bits);
5217 warned = true;
5218 }
5219
5220 if (cpu->phys_bits &&
5221 (cpu->phys_bits > TARGET_PHYS_ADDR_SPACE_BITS ||
5222 cpu->phys_bits < 32)) {
5223 error_setg(errp, "phys-bits should be between 32 and %u "
5224 " (but is %u)",
5225 TARGET_PHYS_ADDR_SPACE_BITS, cpu->phys_bits);
5226 return;
5227 }
5228 } else {
5229 if (cpu->phys_bits && cpu->phys_bits != TCG_PHYS_ADDR_BITS) {
5230 error_setg(errp, "TCG only supports phys-bits=%u",
5231 TCG_PHYS_ADDR_BITS);
5232 return;
5233 }
5234 }
5235 /* 0 means it was not explicitly set by the user (or by machine
5236 * compat_props or by the host code above). In this case, the default
5237 * is the value used by TCG (40).
5238 */
5239 if (cpu->phys_bits == 0) {
5240 cpu->phys_bits = TCG_PHYS_ADDR_BITS;
5241 }
5242 } else {
5243 /* For 32 bit systems don't use the user set value, but keep
5244 * phys_bits consistent with what we tell the guest.
5245 */
5246 if (cpu->phys_bits != 0) {
5247 error_setg(errp, "phys-bits is not user-configurable in 32 bit");
5248 return;
5249 }
5250
5251 if (env->features[FEAT_1_EDX] & CPUID_PSE36) {
5252 cpu->phys_bits = 36;
5253 } else {
5254 cpu->phys_bits = 32;
5255 }
5256 }
5257
5258 /* Cache information initialization */
5259 if (!cpu->legacy_cache) {
5260 if (!xcc->cpu_def || !xcc->cpu_def->cache_info) {
5261 char *name = x86_cpu_class_get_model_name(xcc);
5262 error_setg(errp,
5263 "CPU model '%s' doesn't support legacy-cache=off", name);
5264 g_free(name);
5265 return;
5266 }
5267 env->cache_info_cpuid2 = env->cache_info_cpuid4 = env->cache_info_amd =
5268 *xcc->cpu_def->cache_info;
5269 } else {
5270 /* Build legacy cache information */
5271 env->cache_info_cpuid2.l1d_cache = &legacy_l1d_cache;
5272 env->cache_info_cpuid2.l1i_cache = &legacy_l1i_cache;
5273 env->cache_info_cpuid2.l2_cache = &legacy_l2_cache_cpuid2;
5274 env->cache_info_cpuid2.l3_cache = &legacy_l3_cache;
5275
5276 env->cache_info_cpuid4.l1d_cache = &legacy_l1d_cache;
5277 env->cache_info_cpuid4.l1i_cache = &legacy_l1i_cache;
5278 env->cache_info_cpuid4.l2_cache = &legacy_l2_cache;
5279 env->cache_info_cpuid4.l3_cache = &legacy_l3_cache;
5280
5281 env->cache_info_amd.l1d_cache = &legacy_l1d_cache_amd;
5282 env->cache_info_amd.l1i_cache = &legacy_l1i_cache_amd;
5283 env->cache_info_amd.l2_cache = &legacy_l2_cache_amd;
5284 env->cache_info_amd.l3_cache = &legacy_l3_cache;
5285 }
5286
5287
5288 cpu_exec_realizefn(cs, &local_err);
5289 if (local_err != NULL) {
5290 error_propagate(errp, local_err);
5291 return;
5292 }
5293
5294 #ifndef CONFIG_USER_ONLY
5295 qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
5296
5297 if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || smp_cpus > 1) {
5298 x86_cpu_apic_create(cpu, &local_err);
5299 if (local_err != NULL) {
5300 goto out;
5301 }
5302 }
5303 #endif
5304
5305 mce_init(cpu);
5306
5307 #ifndef CONFIG_USER_ONLY
5308 if (tcg_enabled()) {
5309 cpu->cpu_as_mem = g_new(MemoryRegion, 1);
5310 cpu->cpu_as_root = g_new(MemoryRegion, 1);
5311
5312 /* Outer container... */
5313 memory_region_init(cpu->cpu_as_root, OBJECT(cpu), "memory", ~0ull);
5314 memory_region_set_enabled(cpu->cpu_as_root, true);
5315
5316 /* ... with two regions inside: normal system memory with low
5317 * priority, and...
5318 */
5319 memory_region_init_alias(cpu->cpu_as_mem, OBJECT(cpu), "memory",
5320 get_system_memory(), 0, ~0ull);
5321 memory_region_add_subregion_overlap(cpu->cpu_as_root, 0, cpu->cpu_as_mem, 0);
5322 memory_region_set_enabled(cpu->cpu_as_mem, true);
5323
5324 cs->num_ases = 2;
5325 cpu_address_space_init(cs, 0, "cpu-memory", cs->memory);
5326 cpu_address_space_init(cs, 1, "cpu-smm", cpu->cpu_as_root);
5327
5328 /* ... SMRAM with higher priority, linked from /machine/smram. */
5329 cpu->machine_done.notify = x86_cpu_machine_done;
5330 qemu_add_machine_init_done_notifier(&cpu->machine_done);
5331 }
5332 #endif
5333
5334 qemu_init_vcpu(cs);
5335
5336 /*
5337 * Most Intel and certain AMD CPUs support hyperthreading. Even though QEMU
5338 * fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
5339 * based on inputs (sockets,cores,threads), it is still better to give
5340 * users a warning.
5341 *
5342 * NOTE: the following code has to follow qemu_init_vcpu(). Otherwise
5343 * cs->nr_threads hasn't be populated yet and the checking is incorrect.
5344 */
5345 if (IS_AMD_CPU(env) &&
5346 !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
5347 cs->nr_threads > 1 && !ht_warned) {
5348 warn_report("This family of AMD CPU doesn't support "
5349 "hyperthreading(%d)",
5350 cs->nr_threads);
5351 error_printf("Please configure -smp options properly"
5352 " or try enabling topoext feature.\n");
5353 ht_warned = true;
5354 }
5355
5356 x86_cpu_apic_realize(cpu, &local_err);
5357 if (local_err != NULL) {
5358 goto out;
5359 }
5360 cpu_reset(cs);
5361
5362 xcc->parent_realize(dev, &local_err);
5363
5364 out:
5365 if (local_err != NULL) {
5366 error_propagate(errp, local_err);
5367 return;
5368 }
5369 }
5370
5371 static void x86_cpu_unrealizefn(DeviceState *dev, Error **errp)
5372 {
5373 X86CPU *cpu = X86_CPU(dev);
5374 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
5375 Error *local_err = NULL;
5376
5377 #ifndef CONFIG_USER_ONLY
5378 cpu_remove_sync(CPU(dev));
5379 qemu_unregister_reset(x86_cpu_machine_reset_cb, dev);
5380 #endif
5381
5382 if (cpu->apic_state) {
5383 object_unparent(OBJECT(cpu->apic_state));
5384 cpu->apic_state = NULL;
5385 }
5386
5387 xcc->parent_unrealize(dev, &local_err);
5388 if (local_err != NULL) {
5389 error_propagate(errp, local_err);
5390 return;
5391 }
5392 }
5393
5394 typedef struct BitProperty {
5395 FeatureWord w;
5396 uint32_t mask;
5397 } BitProperty;
5398
5399 static void x86_cpu_get_bit_prop(Object *obj, Visitor *v, const char *name,
5400 void *opaque, Error **errp)
5401 {
5402 X86CPU *cpu = X86_CPU(obj);
5403 BitProperty *fp = opaque;
5404 uint32_t f = cpu->env.features[fp->w];
5405 bool value = (f & fp->mask) == fp->mask;
5406 visit_type_bool(v, name, &value, errp);
5407 }
5408
5409 static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
5410 void *opaque, Error **errp)
5411 {
5412 DeviceState *dev = DEVICE(obj);
5413 X86CPU *cpu = X86_CPU(obj);
5414 BitProperty *fp = opaque;
5415 Error *local_err = NULL;
5416 bool value;
5417
5418 if (dev->realized) {
5419 qdev_prop_set_after_realize(dev, name, errp);
5420 return;
5421 }
5422
5423 visit_type_bool(v, name, &value, &local_err);
5424 if (local_err) {
5425 error_propagate(errp, local_err);
5426 return;
5427 }
5428
5429 if (value) {
5430 cpu->env.features[fp->w] |= fp->mask;
5431 } else {
5432 cpu->env.features[fp->w] &= ~fp->mask;
5433 }
5434 cpu->env.user_features[fp->w] |= fp->mask;
5435 }
5436
5437 static void x86_cpu_release_bit_prop(Object *obj, const char *name,
5438 void *opaque)
5439 {
5440 BitProperty *prop = opaque;
5441 g_free(prop);
5442 }
5443
5444 /* Register a boolean property to get/set a single bit in a uint32_t field.
5445 *
5446 * The same property name can be registered multiple times to make it affect
5447 * multiple bits in the same FeatureWord. In that case, the getter will return
5448 * true only if all bits are set.
5449 */
5450 static void x86_cpu_register_bit_prop(X86CPU *cpu,
5451 const char *prop_name,
5452 FeatureWord w,
5453 int bitnr)
5454 {
5455 BitProperty *fp;
5456 ObjectProperty *op;
5457 uint32_t mask = (1UL << bitnr);
5458
5459 op = object_property_find(OBJECT(cpu), prop_name, NULL);
5460 if (op) {
5461 fp = op->opaque;
5462 assert(fp->w == w);
5463 fp->mask |= mask;
5464 } else {
5465 fp = g_new0(BitProperty, 1);
5466 fp->w = w;
5467 fp->mask = mask;
5468 object_property_add(OBJECT(cpu), prop_name, "bool",
5469 x86_cpu_get_bit_prop,
5470 x86_cpu_set_bit_prop,
5471 x86_cpu_release_bit_prop, fp, &error_abort);
5472 }
5473 }
5474
5475 static void x86_cpu_register_feature_bit_props(X86CPU *cpu,
5476 FeatureWord w,
5477 int bitnr)
5478 {
5479 FeatureWordInfo *fi = &feature_word_info[w];
5480 const char *name = fi->feat_names[bitnr];
5481
5482 if (!name) {
5483 return;
5484 }
5485
5486 /* Property names should use "-" instead of "_".
5487 * Old names containing underscores are registered as aliases
5488 * using object_property_add_alias()
5489 */
5490 assert(!strchr(name, '_'));
5491 /* aliases don't use "|" delimiters anymore, they are registered
5492 * manually using object_property_add_alias() */
5493 assert(!strchr(name, '|'));
5494 x86_cpu_register_bit_prop(cpu, name, w, bitnr);
5495 }
5496
5497 static GuestPanicInformation *x86_cpu_get_crash_info(CPUState *cs)
5498 {
5499 X86CPU *cpu = X86_CPU(cs);
5500 CPUX86State *env = &cpu->env;
5501 GuestPanicInformation *panic_info = NULL;
5502
5503 if (env->features[FEAT_HYPERV_EDX] & HV_GUEST_CRASH_MSR_AVAILABLE) {
5504 panic_info = g_malloc0(sizeof(GuestPanicInformation));
5505
5506 panic_info->type = GUEST_PANIC_INFORMATION_TYPE_HYPER_V;
5507
5508 assert(HV_CRASH_PARAMS >= 5);
5509 panic_info->u.hyper_v.arg1 = env->msr_hv_crash_params[0];
5510 panic_info->u.hyper_v.arg2 = env->msr_hv_crash_params[1];
5511 panic_info->u.hyper_v.arg3 = env->msr_hv_crash_params[2];
5512 panic_info->u.hyper_v.arg4 = env->msr_hv_crash_params[3];
5513 panic_info->u.hyper_v.arg5 = env->msr_hv_crash_params[4];
5514 }
5515
5516 return panic_info;
5517 }
5518 static void x86_cpu_get_crash_info_qom(Object *obj, Visitor *v,
5519 const char *name, void *opaque,
5520 Error **errp)
5521 {
5522 CPUState *cs = CPU(obj);
5523 GuestPanicInformation *panic_info;
5524
5525 if (!cs->crash_occurred) {
5526 error_setg(errp, "No crash occured");
5527 return;
5528 }
5529
5530 panic_info = x86_cpu_get_crash_info(cs);
5531 if (panic_info == NULL) {
5532 error_setg(errp, "No crash information");
5533 return;
5534 }
5535
5536 visit_type_GuestPanicInformation(v, "crash-information", &panic_info,
5537 errp);
5538 qapi_free_GuestPanicInformation(panic_info);
5539 }
5540
5541 static void x86_cpu_initfn(Object *obj)
5542 {
5543 CPUState *cs = CPU(obj);
5544 X86CPU *cpu = X86_CPU(obj);
5545 X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
5546 CPUX86State *env = &cpu->env;
5547 FeatureWord w;
5548
5549 cs->env_ptr = env;
5550
5551 object_property_add(obj, "family", "int",
5552 x86_cpuid_version_get_family,
5553 x86_cpuid_version_set_family, NULL, NULL, NULL);
5554 object_property_add(obj, "model", "int",
5555 x86_cpuid_version_get_model,
5556 x86_cpuid_version_set_model, NULL, NULL, NULL);
5557 object_property_add(obj, "stepping", "int",
5558 x86_cpuid_version_get_stepping,
5559 x86_cpuid_version_set_stepping, NULL, NULL, NULL);
5560 object_property_add_str(obj, "vendor",
5561 x86_cpuid_get_vendor,
5562 x86_cpuid_set_vendor, NULL);
5563 object_property_add_str(obj, "model-id",
5564 x86_cpuid_get_model_id,
5565 x86_cpuid_set_model_id, NULL);
5566 object_property_add(obj, "tsc-frequency", "int",
5567 x86_cpuid_get_tsc_freq,
5568 x86_cpuid_set_tsc_freq, NULL, NULL, NULL);
5569 object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo",
5570 x86_cpu_get_feature_words,
5571 NULL, NULL, (void *)env->features, NULL);
5572 object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo",
5573 x86_cpu_get_feature_words,
5574 NULL, NULL, (void *)cpu->filtered_features, NULL);
5575
5576 object_property_add(obj, "crash-information", "GuestPanicInformation",
5577 x86_cpu_get_crash_info_qom, NULL, NULL, NULL, NULL);
5578
5579 cpu->hyperv_spinlock_attempts = HYPERV_SPINLOCK_NEVER_RETRY;
5580
5581 for (w = 0; w < FEATURE_WORDS; w++) {
5582 int bitnr;
5583
5584 for (bitnr = 0; bitnr < 32; bitnr++) {
5585 x86_cpu_register_feature_bit_props(cpu, w, bitnr);
5586 }
5587 }
5588
5589 object_property_add_alias(obj, "sse3", obj, "pni", &error_abort);
5590 object_property_add_alias(obj, "pclmuldq", obj, "pclmulqdq", &error_abort);
5591 object_property_add_alias(obj, "sse4-1", obj, "sse4.1", &error_abort);
5592 object_property_add_alias(obj, "sse4-2", obj, "sse4.2", &error_abort);
5593 object_property_add_alias(obj, "xd", obj, "nx", &error_abort);
5594 object_property_add_alias(obj, "ffxsr", obj, "fxsr-opt", &error_abort);
5595 object_property_add_alias(obj, "i64", obj, "lm", &error_abort);
5596
5597 object_property_add_alias(obj, "ds_cpl", obj, "ds-cpl", &error_abort);
5598 object_property_add_alias(obj, "tsc_adjust", obj, "tsc-adjust", &error_abort);
5599 object_property_add_alias(obj, "fxsr_opt", obj, "fxsr-opt", &error_abort);
5600 object_property_add_alias(obj, "lahf_lm", obj, "lahf-lm", &error_abort);
5601 object_property_add_alias(obj, "cmp_legacy", obj, "cmp-legacy", &error_abort);
5602 object_property_add_alias(obj, "nodeid_msr", obj, "nodeid-msr", &error_abort);
5603 object_property_add_alias(obj, "perfctr_core", obj, "perfctr-core", &error_abort);
5604 object_property_add_alias(obj, "perfctr_nb", obj, "perfctr-nb", &error_abort);
5605 object_property_add_alias(obj, "kvm_nopiodelay", obj, "kvm-nopiodelay", &error_abort);
5606 object_property_add_alias(obj, "kvm_mmu", obj, "kvm-mmu", &error_abort);
5607 object_property_add_alias(obj, "kvm_asyncpf", obj, "kvm-asyncpf", &error_abort);
5608 object_property_add_alias(obj, "kvm_steal_time", obj, "kvm-steal-time", &error_abort);
5609 object_property_add_alias(obj, "kvm_pv_eoi", obj, "kvm-pv-eoi", &error_abort);
5610 object_property_add_alias(obj, "kvm_pv_unhalt", obj, "kvm-pv-unhalt", &error_abort);
5611 object_property_add_alias(obj, "svm_lock", obj, "svm-lock", &error_abort);
5612 object_property_add_alias(obj, "nrip_save", obj, "nrip-save", &error_abort);
5613 object_property_add_alias(obj, "tsc_scale", obj, "tsc-scale", &error_abort);
5614 object_property_add_alias(obj, "vmcb_clean", obj, "vmcb-clean", &error_abort);
5615 object_property_add_alias(obj, "pause_filter", obj, "pause-filter", &error_abort);
5616 object_property_add_alias(obj, "sse4_1", obj, "sse4.1", &error_abort);
5617 object_property_add_alias(obj, "sse4_2", obj, "sse4.2", &error_abort);
5618
5619 if (xcc->cpu_def) {
5620 x86_cpu_load_def(cpu, xcc->cpu_def, &error_abort);
5621 }
5622 }
5623
5624 static int64_t x86_cpu_get_arch_id(CPUState *cs)
5625 {
5626 X86CPU *cpu = X86_CPU(cs);
5627
5628 return cpu->apic_id;
5629 }
5630
5631 static bool x86_cpu_get_paging_enabled(const CPUState *cs)
5632 {
5633 X86CPU *cpu = X86_CPU(cs);
5634
5635 return cpu->env.cr[0] & CR0_PG_MASK;
5636 }
5637
5638 static void x86_cpu_set_pc(CPUState *cs, vaddr value)
5639 {
5640 X86CPU *cpu = X86_CPU(cs);
5641
5642 cpu->env.eip = value;
5643 }
5644
5645 static void x86_cpu_synchronize_from_tb(CPUState *cs, TranslationBlock *tb)
5646 {
5647 X86CPU *cpu = X86_CPU(cs);
5648
5649 cpu->env.eip = tb->pc - tb->cs_base;
5650 }
5651
5652 int x86_cpu_pending_interrupt(CPUState *cs, int interrupt_request)
5653 {
5654 X86CPU *cpu = X86_CPU(cs);
5655 CPUX86State *env = &cpu->env;
5656
5657 #if !defined(CONFIG_USER_ONLY)
5658 if (interrupt_request & CPU_INTERRUPT_POLL) {
5659 return CPU_INTERRUPT_POLL;
5660 }
5661 #endif
5662 if (interrupt_request & CPU_INTERRUPT_SIPI) {
5663 return CPU_INTERRUPT_SIPI;
5664 }
5665
5666 if (env->hflags2 & HF2_GIF_MASK) {
5667 if ((interrupt_request & CPU_INTERRUPT_SMI) &&
5668 !(env->hflags & HF_SMM_MASK)) {
5669 return CPU_INTERRUPT_SMI;
5670 } else if ((interrupt_request & CPU_INTERRUPT_NMI) &&
5671 !(env->hflags2 & HF2_NMI_MASK)) {
5672 return CPU_INTERRUPT_NMI;
5673 } else if (interrupt_request & CPU_INTERRUPT_MCE) {
5674 return CPU_INTERRUPT_MCE;
5675 } else if ((interrupt_request & CPU_INTERRUPT_HARD) &&
5676 (((env->hflags2 & HF2_VINTR_MASK) &&
5677 (env->hflags2 & HF2_HIF_MASK)) ||
5678 (!(env->hflags2 & HF2_VINTR_MASK) &&
5679 (env->eflags & IF_MASK &&
5680 !(env->hflags & HF_INHIBIT_IRQ_MASK))))) {
5681 return CPU_INTERRUPT_HARD;
5682 #if !defined(CONFIG_USER_ONLY)
5683 } else if ((interrupt_request & CPU_INTERRUPT_VIRQ) &&
5684 (env->eflags & IF_MASK) &&
5685 !(env->hflags & HF_INHIBIT_IRQ_MASK)) {
5686 return CPU_INTERRUPT_VIRQ;
5687 #endif
5688 }
5689 }
5690
5691 return 0;
5692 }
5693
5694 static bool x86_cpu_has_work(CPUState *cs)
5695 {
5696 return x86_cpu_pending_interrupt(cs, cs->interrupt_request) != 0;
5697 }
5698
5699 static void x86_disas_set_info(CPUState *cs, disassemble_info *info)
5700 {
5701 X86CPU *cpu = X86_CPU(cs);
5702 CPUX86State *env = &cpu->env;
5703
5704 info->mach = (env->hflags & HF_CS64_MASK ? bfd_mach_x86_64
5705 : env->hflags & HF_CS32_MASK ? bfd_mach_i386_i386
5706 : bfd_mach_i386_i8086);
5707 info->print_insn = print_insn_i386;
5708
5709 info->cap_arch = CS_ARCH_X86;
5710 info->cap_mode = (env->hflags & HF_CS64_MASK ? CS_MODE_64
5711 : env->hflags & HF_CS32_MASK ? CS_MODE_32
5712 : CS_MODE_16);
5713 info->cap_insn_unit = 1;
5714 info->cap_insn_split = 8;
5715 }
5716
5717 void x86_update_hflags(CPUX86State *env)
5718 {
5719 uint32_t hflags;
5720 #define HFLAG_COPY_MASK \
5721 ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
5722 HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
5723 HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
5724 HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK)
5725
5726 hflags = env->hflags & HFLAG_COPY_MASK;
5727 hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
5728 hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
5729 hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
5730 (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
5731 hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
5732
5733 if (env->cr[4] & CR4_OSFXSR_MASK) {
5734 hflags |= HF_OSFXSR_MASK;
5735 }
5736
5737 if (env->efer & MSR_EFER_LMA) {
5738 hflags |= HF_LMA_MASK;
5739 }
5740
5741 if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
5742 hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
5743 } else {
5744 hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
5745 (DESC_B_SHIFT - HF_CS32_SHIFT);
5746 hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
5747 (DESC_B_SHIFT - HF_SS32_SHIFT);
5748 if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) ||
5749 !(hflags & HF_CS32_MASK)) {
5750 hflags |= HF_ADDSEG_MASK;
5751 } else {
5752 hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base |
5753 env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
5754 }
5755 }
5756 env->hflags = hflags;
5757 }
5758
5759 static Property x86_cpu_properties[] = {
5760 #ifdef CONFIG_USER_ONLY
5761 /* apic_id = 0 by default for *-user, see commit 9886e834 */
5762 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, 0),
5763 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, 0),
5764 DEFINE_PROP_INT32("core-id", X86CPU, core_id, 0),
5765 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, 0),
5766 #else
5767 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, UNASSIGNED_APIC_ID),
5768 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, -1),
5769 DEFINE_PROP_INT32("core-id", X86CPU, core_id, -1),
5770 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, -1),
5771 #endif
5772 DEFINE_PROP_INT32("node-id", X86CPU, node_id, CPU_UNSET_NUMA_NODE_ID),
5773 DEFINE_PROP_BOOL("pmu", X86CPU, enable_pmu, false),
5774 { .name = "hv-spinlocks", .info = &qdev_prop_spinlocks },
5775 DEFINE_PROP_BOOL("hv-relaxed", X86CPU, hyperv_relaxed_timing, false),
5776 DEFINE_PROP_BOOL("hv-vapic", X86CPU, hyperv_vapic, false),
5777 DEFINE_PROP_BOOL("hv-time", X86CPU, hyperv_time, false),
5778 DEFINE_PROP_BOOL("hv-crash", X86CPU, hyperv_crash, false),
5779 DEFINE_PROP_BOOL("hv-reset", X86CPU, hyperv_reset, false),
5780 DEFINE_PROP_BOOL("hv-vpindex", X86CPU, hyperv_vpindex, false),
5781 DEFINE_PROP_BOOL("hv-runtime", X86CPU, hyperv_runtime, false),
5782 DEFINE_PROP_BOOL("hv-synic", X86CPU, hyperv_synic, false),
5783 DEFINE_PROP_BOOL("hv-stimer", X86CPU, hyperv_stimer, false),
5784 DEFINE_PROP_BOOL("hv-frequencies", X86CPU, hyperv_frequencies, false),
5785 DEFINE_PROP_BOOL("hv-reenlightenment", X86CPU, hyperv_reenlightenment, false),
5786 DEFINE_PROP_BOOL("hv-tlbflush", X86CPU, hyperv_tlbflush, false),
5787 DEFINE_PROP_BOOL("hv-evmcs", X86CPU, hyperv_evmcs, false),
5788 DEFINE_PROP_BOOL("hv-ipi", X86CPU, hyperv_ipi, false),
5789 DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true),
5790 DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
5791 DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true),
5792 DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 0),
5793 DEFINE_PROP_BOOL("host-phys-bits", X86CPU, host_phys_bits, false),
5794 DEFINE_PROP_UINT8("host-phys-bits-limit", X86CPU, host_phys_bits_limit, 0),
5795 DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true),
5796 DEFINE_PROP_UINT32("level", X86CPU, env.cpuid_level, UINT32_MAX),
5797 DEFINE_PROP_UINT32("xlevel", X86CPU, env.cpuid_xlevel, UINT32_MAX),
5798 DEFINE_PROP_UINT32("xlevel2", X86CPU, env.cpuid_xlevel2, UINT32_MAX),
5799 DEFINE_PROP_UINT32("min-level", X86CPU, env.cpuid_min_level, 0),
5800 DEFINE_PROP_UINT32("min-xlevel", X86CPU, env.cpuid_min_xlevel, 0),
5801 DEFINE_PROP_UINT32("min-xlevel2", X86CPU, env.cpuid_min_xlevel2, 0),
5802 DEFINE_PROP_BOOL("full-cpuid-auto-level", X86CPU, full_cpuid_auto_level, true),
5803 DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor_id),
5804 DEFINE_PROP_BOOL("cpuid-0xb", X86CPU, enable_cpuid_0xb, true),
5805 DEFINE_PROP_BOOL("lmce", X86CPU, enable_lmce, false),
5806 DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true),
5807 DEFINE_PROP_BOOL("kvm-no-smi-migration", X86CPU, kvm_no_smi_migration,
5808 false),
5809 DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true),
5810 DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true),
5811 DEFINE_PROP_BOOL("x-migrate-smi-count", X86CPU, migrate_smi_count,
5812 true),
5813 /*
5814 * lecacy_cache defaults to true unless the CPU model provides its
5815 * own cache information (see x86_cpu_load_def()).
5816 */
5817 DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, true),
5818
5819 /*
5820 * From "Requirements for Implementing the Microsoft
5821 * Hypervisor Interface":
5822 * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs
5823 *
5824 * "Starting with Windows Server 2012 and Windows 8, if
5825 * CPUID.40000005.EAX contains a value of -1, Windows assumes that
5826 * the hypervisor imposes no specific limit to the number of VPs.
5827 * In this case, Windows Server 2012 guest VMs may use more than
5828 * 64 VPs, up to the maximum supported number of processors applicable
5829 * to the specific Windows version being used."
5830 */
5831 DEFINE_PROP_INT32("x-hv-max-vps", X86CPU, hv_max_vps, -1),
5832 DEFINE_PROP_BOOL("x-hv-synic-kvm-only", X86CPU, hyperv_synic_kvm_only,
5833 false),
5834 DEFINE_PROP_BOOL("x-intel-pt-auto-level", X86CPU, intel_pt_auto_level,
5835 true),
5836 DEFINE_PROP_END_OF_LIST()
5837 };
5838
5839 static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
5840 {
5841 X86CPUClass *xcc = X86_CPU_CLASS(oc);
5842 CPUClass *cc = CPU_CLASS(oc);
5843 DeviceClass *dc = DEVICE_CLASS(oc);
5844
5845 device_class_set_parent_realize(dc, x86_cpu_realizefn,
5846 &xcc->parent_realize);
5847 device_class_set_parent_unrealize(dc, x86_cpu_unrealizefn,
5848 &xcc->parent_unrealize);
5849 dc->props = x86_cpu_properties;
5850
5851 xcc->parent_reset = cc->reset;
5852 cc->reset = x86_cpu_reset;
5853 cc->reset_dump_flags = CPU_DUMP_FPU | CPU_DUMP_CCOP;
5854
5855 cc->class_by_name = x86_cpu_class_by_name;
5856 cc->parse_features = x86_cpu_parse_featurestr;
5857 cc->has_work = x86_cpu_has_work;
5858 #ifdef CONFIG_TCG
5859 cc->do_interrupt = x86_cpu_do_interrupt;
5860 cc->cpu_exec_interrupt = x86_cpu_exec_interrupt;
5861 #endif
5862 cc->dump_state = x86_cpu_dump_state;
5863 cc->get_crash_info = x86_cpu_get_crash_info;
5864 cc->set_pc = x86_cpu_set_pc;
5865 cc->synchronize_from_tb = x86_cpu_synchronize_from_tb;
5866 cc->gdb_read_register = x86_cpu_gdb_read_register;
5867 cc->gdb_write_register = x86_cpu_gdb_write_register;
5868 cc->get_arch_id = x86_cpu_get_arch_id;
5869 cc->get_paging_enabled = x86_cpu_get_paging_enabled;
5870 #ifdef CONFIG_USER_ONLY
5871 cc->handle_mmu_fault = x86_cpu_handle_mmu_fault;
5872 #else
5873 cc->asidx_from_attrs = x86_asidx_from_attrs;
5874 cc->get_memory_mapping = x86_cpu_get_memory_mapping;
5875 cc->get_phys_page_debug = x86_cpu_get_phys_page_debug;
5876 cc->write_elf64_note = x86_cpu_write_elf64_note;
5877 cc->write_elf64_qemunote = x86_cpu_write_elf64_qemunote;
5878 cc->write_elf32_note = x86_cpu_write_elf32_note;
5879 cc->write_elf32_qemunote = x86_cpu_write_elf32_qemunote;
5880 cc->vmsd = &vmstate_x86_cpu;
5881 #endif
5882 cc->gdb_arch_name = x86_gdb_arch_name;
5883 #ifdef TARGET_X86_64
5884 cc->gdb_core_xml_file = "i386-64bit.xml";
5885 cc->gdb_num_core_regs = 66;
5886 #else
5887 cc->gdb_core_xml_file = "i386-32bit.xml";
5888 cc->gdb_num_core_regs = 50;
5889 #endif
5890 #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
5891 cc->debug_excp_handler = breakpoint_handler;
5892 #endif
5893 cc->cpu_exec_enter = x86_cpu_exec_enter;
5894 cc->cpu_exec_exit = x86_cpu_exec_exit;
5895 #ifdef CONFIG_TCG
5896 cc->tcg_initialize = tcg_x86_init;
5897 #endif
5898 cc->disas_set_info = x86_disas_set_info;
5899
5900 dc->user_creatable = true;
5901 }
5902
5903 static const TypeInfo x86_cpu_type_info = {
5904 .name = TYPE_X86_CPU,
5905 .parent = TYPE_CPU,
5906 .instance_size = sizeof(X86CPU),
5907 .instance_init = x86_cpu_initfn,
5908 .abstract = true,
5909 .class_size = sizeof(X86CPUClass),
5910 .class_init = x86_cpu_common_class_init,
5911 };
5912
5913
5914 /* "base" CPU model, used by query-cpu-model-expansion */
5915 static void x86_cpu_base_class_init(ObjectClass *oc, void *data)
5916 {
5917 X86CPUClass *xcc = X86_CPU_CLASS(oc);
5918
5919 xcc->static_model = true;
5920 xcc->migration_safe = true;
5921 xcc->model_description = "base CPU model type with no features enabled";
5922 xcc->ordering = 8;
5923 }
5924
5925 static const TypeInfo x86_base_cpu_type_info = {
5926 .name = X86_CPU_TYPE_NAME("base"),
5927 .parent = TYPE_X86_CPU,
5928 .class_init = x86_cpu_base_class_init,
5929 };
5930
5931 static void x86_cpu_register_types(void)
5932 {
5933 int i;
5934
5935 type_register_static(&x86_cpu_type_info);
5936 for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) {
5937 x86_register_cpudef_type(&builtin_x86_defs[i]);
5938 }
5939 type_register_static(&max_x86_cpu_type_info);
5940 type_register_static(&x86_base_cpu_type_info);
5941 #if defined(CONFIG_KVM) || defined(CONFIG_HVF)
5942 type_register_static(&host_x86_cpu_type_info);
5943 #endif
5944 }
5945
5946 type_init(x86_cpu_register_types)