xref: /openbmc/qemu/target/i386/cpu.c (revision 6b8f9c6e)
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 #include "qemu/qemu-print.h"
25 
26 #include "cpu.h"
27 #include "exec/exec-all.h"
28 #include "sysemu/kvm.h"
29 #include "sysemu/hvf.h"
30 #include "sysemu/cpus.h"
31 #include "kvm_i386.h"
32 #include "sev_i386.h"
33 
34 #include "qemu/error-report.h"
35 #include "qemu/option.h"
36 #include "qemu/config-file.h"
37 #include "qapi/error.h"
38 #include "qapi/qapi-visit-misc.h"
39 #include "qapi/qapi-visit-run-state.h"
40 #include "qapi/qmp/qdict.h"
41 #include "qapi/qmp/qerror.h"
42 #include "qapi/visitor.h"
43 #include "qom/qom-qobject.h"
44 #include "sysemu/arch_init.h"
45 #include "qapi/qapi-commands-target.h"
46 
47 #include "standard-headers/asm-x86/kvm_para.h"
48 
49 #include "sysemu/sysemu.h"
50 #include "hw/qdev-properties.h"
51 #include "hw/i386/topology.h"
52 #ifndef CONFIG_USER_ONLY
53 #include "exec/address-spaces.h"
54 #include "hw/hw.h"
55 #include "hw/xen/xen.h"
56 #include "hw/i386/apic_internal.h"
57 #endif
58 
59 #include "disas/capstone.h"
60 
61 /* Helpers for building CPUID[2] descriptors: */
62 
63 struct CPUID2CacheDescriptorInfo {
64     enum CacheType type;
65     int level;
66     int size;
67     int line_size;
68     int associativity;
69 };
70 
71 /*
72  * Known CPUID 2 cache descriptors.
73  * From Intel SDM Volume 2A, CPUID instruction
74  */
75 struct CPUID2CacheDescriptorInfo cpuid2_cache_descriptors[] = {
76     [0x06] = { .level = 1, .type = INSTRUCTION_CACHE, .size =   8 * KiB,
77                .associativity = 4,  .line_size = 32, },
78     [0x08] = { .level = 1, .type = INSTRUCTION_CACHE, .size =  16 * KiB,
79                .associativity = 4,  .line_size = 32, },
80     [0x09] = { .level = 1, .type = INSTRUCTION_CACHE, .size =  32 * KiB,
81                .associativity = 4,  .line_size = 64, },
82     [0x0A] = { .level = 1, .type = DATA_CACHE,        .size =   8 * KiB,
83                .associativity = 2,  .line_size = 32, },
84     [0x0C] = { .level = 1, .type = DATA_CACHE,        .size =  16 * KiB,
85                .associativity = 4,  .line_size = 32, },
86     [0x0D] = { .level = 1, .type = DATA_CACHE,        .size =  16 * KiB,
87                .associativity = 4,  .line_size = 64, },
88     [0x0E] = { .level = 1, .type = DATA_CACHE,        .size =  24 * KiB,
89                .associativity = 6,  .line_size = 64, },
90     [0x1D] = { .level = 2, .type = UNIFIED_CACHE,     .size = 128 * KiB,
91                .associativity = 2,  .line_size = 64, },
92     [0x21] = { .level = 2, .type = UNIFIED_CACHE,     .size = 256 * KiB,
93                .associativity = 8,  .line_size = 64, },
94     /* lines per sector is not supported cpuid2_cache_descriptor(),
95     * so descriptors 0x22, 0x23 are not included
96     */
97     [0x24] = { .level = 2, .type = UNIFIED_CACHE,     .size =   1 * MiB,
98                .associativity = 16, .line_size = 64, },
99     /* lines per sector is not supported cpuid2_cache_descriptor(),
100     * so descriptors 0x25, 0x20 are not included
101     */
102     [0x2C] = { .level = 1, .type = DATA_CACHE,        .size =  32 * KiB,
103                .associativity = 8,  .line_size = 64, },
104     [0x30] = { .level = 1, .type = INSTRUCTION_CACHE, .size =  32 * KiB,
105                .associativity = 8,  .line_size = 64, },
106     [0x41] = { .level = 2, .type = UNIFIED_CACHE,     .size = 128 * KiB,
107                .associativity = 4,  .line_size = 32, },
108     [0x42] = { .level = 2, .type = UNIFIED_CACHE,     .size = 256 * KiB,
109                .associativity = 4,  .line_size = 32, },
110     [0x43] = { .level = 2, .type = UNIFIED_CACHE,     .size = 512 * KiB,
111                .associativity = 4,  .line_size = 32, },
112     [0x44] = { .level = 2, .type = UNIFIED_CACHE,     .size =   1 * MiB,
113                .associativity = 4,  .line_size = 32, },
114     [0x45] = { .level = 2, .type = UNIFIED_CACHE,     .size =   2 * MiB,
115                .associativity = 4,  .line_size = 32, },
116     [0x46] = { .level = 3, .type = UNIFIED_CACHE,     .size =   4 * MiB,
117                .associativity = 4,  .line_size = 64, },
118     [0x47] = { .level = 3, .type = UNIFIED_CACHE,     .size =   8 * MiB,
119                .associativity = 8,  .line_size = 64, },
120     [0x48] = { .level = 2, .type = UNIFIED_CACHE,     .size =   3 * MiB,
121                .associativity = 12, .line_size = 64, },
122     /* Descriptor 0x49 depends on CPU family/model, so it is not included */
123     [0x4A] = { .level = 3, .type = UNIFIED_CACHE,     .size =   6 * MiB,
124                .associativity = 12, .line_size = 64, },
125     [0x4B] = { .level = 3, .type = UNIFIED_CACHE,     .size =   8 * MiB,
126                .associativity = 16, .line_size = 64, },
127     [0x4C] = { .level = 3, .type = UNIFIED_CACHE,     .size =  12 * MiB,
128                .associativity = 12, .line_size = 64, },
129     [0x4D] = { .level = 3, .type = UNIFIED_CACHE,     .size =  16 * MiB,
130                .associativity = 16, .line_size = 64, },
131     [0x4E] = { .level = 2, .type = UNIFIED_CACHE,     .size =   6 * MiB,
132                .associativity = 24, .line_size = 64, },
133     [0x60] = { .level = 1, .type = DATA_CACHE,        .size =  16 * KiB,
134                .associativity = 8,  .line_size = 64, },
135     [0x66] = { .level = 1, .type = DATA_CACHE,        .size =   8 * KiB,
136                .associativity = 4,  .line_size = 64, },
137     [0x67] = { .level = 1, .type = DATA_CACHE,        .size =  16 * KiB,
138                .associativity = 4,  .line_size = 64, },
139     [0x68] = { .level = 1, .type = DATA_CACHE,        .size =  32 * KiB,
140                .associativity = 4,  .line_size = 64, },
141     [0x78] = { .level = 2, .type = UNIFIED_CACHE,     .size =   1 * MiB,
142                .associativity = 4,  .line_size = 64, },
143     /* lines per sector is not supported cpuid2_cache_descriptor(),
144     * so descriptors 0x79, 0x7A, 0x7B, 0x7C are not included.
145     */
146     [0x7D] = { .level = 2, .type = UNIFIED_CACHE,     .size =   2 * MiB,
147                .associativity = 8,  .line_size = 64, },
148     [0x7F] = { .level = 2, .type = UNIFIED_CACHE,     .size = 512 * KiB,
149                .associativity = 2,  .line_size = 64, },
150     [0x80] = { .level = 2, .type = UNIFIED_CACHE,     .size = 512 * KiB,
151                .associativity = 8,  .line_size = 64, },
152     [0x82] = { .level = 2, .type = UNIFIED_CACHE,     .size = 256 * KiB,
153                .associativity = 8,  .line_size = 32, },
154     [0x83] = { .level = 2, .type = UNIFIED_CACHE,     .size = 512 * KiB,
155                .associativity = 8,  .line_size = 32, },
156     [0x84] = { .level = 2, .type = UNIFIED_CACHE,     .size =   1 * MiB,
157                .associativity = 8,  .line_size = 32, },
158     [0x85] = { .level = 2, .type = UNIFIED_CACHE,     .size =   2 * MiB,
159                .associativity = 8,  .line_size = 32, },
160     [0x86] = { .level = 2, .type = UNIFIED_CACHE,     .size = 512 * KiB,
161                .associativity = 4,  .line_size = 64, },
162     [0x87] = { .level = 2, .type = UNIFIED_CACHE,     .size =   1 * MiB,
163                .associativity = 8,  .line_size = 64, },
164     [0xD0] = { .level = 3, .type = UNIFIED_CACHE,     .size = 512 * KiB,
165                .associativity = 4,  .line_size = 64, },
166     [0xD1] = { .level = 3, .type = UNIFIED_CACHE,     .size =   1 * MiB,
167                .associativity = 4,  .line_size = 64, },
168     [0xD2] = { .level = 3, .type = UNIFIED_CACHE,     .size =   2 * MiB,
169                .associativity = 4,  .line_size = 64, },
170     [0xD6] = { .level = 3, .type = UNIFIED_CACHE,     .size =   1 * MiB,
171                .associativity = 8,  .line_size = 64, },
172     [0xD7] = { .level = 3, .type = UNIFIED_CACHE,     .size =   2 * MiB,
173                .associativity = 8,  .line_size = 64, },
174     [0xD8] = { .level = 3, .type = UNIFIED_CACHE,     .size =   4 * MiB,
175                .associativity = 8,  .line_size = 64, },
176     [0xDC] = { .level = 3, .type = UNIFIED_CACHE,     .size = 1.5 * MiB,
177                .associativity = 12, .line_size = 64, },
178     [0xDD] = { .level = 3, .type = UNIFIED_CACHE,     .size =   3 * MiB,
179                .associativity = 12, .line_size = 64, },
180     [0xDE] = { .level = 3, .type = UNIFIED_CACHE,     .size =   6 * MiB,
181                .associativity = 12, .line_size = 64, },
182     [0xE2] = { .level = 3, .type = UNIFIED_CACHE,     .size =   2 * MiB,
183                .associativity = 16, .line_size = 64, },
184     [0xE3] = { .level = 3, .type = UNIFIED_CACHE,     .size =   4 * MiB,
185                .associativity = 16, .line_size = 64, },
186     [0xE4] = { .level = 3, .type = UNIFIED_CACHE,     .size =   8 * MiB,
187                .associativity = 16, .line_size = 64, },
188     [0xEA] = { .level = 3, .type = UNIFIED_CACHE,     .size =  12 * MiB,
189                .associativity = 24, .line_size = 64, },
190     [0xEB] = { .level = 3, .type = UNIFIED_CACHE,     .size =  18 * MiB,
191                .associativity = 24, .line_size = 64, },
192     [0xEC] = { .level = 3, .type = UNIFIED_CACHE,     .size =  24 * MiB,
193                .associativity = 24, .line_size = 64, },
194 };
195 
196 /*
197  * "CPUID leaf 2 does not report cache descriptor information,
198  * use CPUID leaf 4 to query cache parameters"
199  */
200 #define CACHE_DESCRIPTOR_UNAVAILABLE 0xFF
201 
202 /*
203  * Return a CPUID 2 cache descriptor for a given cache.
204  * If no known descriptor is found, return CACHE_DESCRIPTOR_UNAVAILABLE
205  */
206 static uint8_t cpuid2_cache_descriptor(CPUCacheInfo *cache)
207 {
208     int i;
209 
210     assert(cache->size > 0);
211     assert(cache->level > 0);
212     assert(cache->line_size > 0);
213     assert(cache->associativity > 0);
214     for (i = 0; i < ARRAY_SIZE(cpuid2_cache_descriptors); i++) {
215         struct CPUID2CacheDescriptorInfo *d = &cpuid2_cache_descriptors[i];
216         if (d->level == cache->level && d->type == cache->type &&
217             d->size == cache->size && d->line_size == cache->line_size &&
218             d->associativity == cache->associativity) {
219                 return i;
220             }
221     }
222 
223     return CACHE_DESCRIPTOR_UNAVAILABLE;
224 }
225 
226 /* CPUID Leaf 4 constants: */
227 
228 /* EAX: */
229 #define CACHE_TYPE_D    1
230 #define CACHE_TYPE_I    2
231 #define CACHE_TYPE_UNIFIED   3
232 
233 #define CACHE_LEVEL(l)        (l << 5)
234 
235 #define CACHE_SELF_INIT_LEVEL (1 << 8)
236 
237 /* EDX: */
238 #define CACHE_NO_INVD_SHARING   (1 << 0)
239 #define CACHE_INCLUSIVE       (1 << 1)
240 #define CACHE_COMPLEX_IDX     (1 << 2)
241 
242 /* Encode CacheType for CPUID[4].EAX */
243 #define CACHE_TYPE(t) (((t) == DATA_CACHE) ? CACHE_TYPE_D : \
244                        ((t) == INSTRUCTION_CACHE) ? CACHE_TYPE_I : \
245                        ((t) == UNIFIED_CACHE) ? CACHE_TYPE_UNIFIED : \
246                        0 /* Invalid value */)
247 
248 
249 /* Encode cache info for CPUID[4] */
250 static void encode_cache_cpuid4(CPUCacheInfo *cache,
251                                 int num_apic_ids, int num_cores,
252                                 uint32_t *eax, uint32_t *ebx,
253                                 uint32_t *ecx, uint32_t *edx)
254 {
255     assert(cache->size == cache->line_size * cache->associativity *
256                           cache->partitions * cache->sets);
257 
258     assert(num_apic_ids > 0);
259     *eax = CACHE_TYPE(cache->type) |
260            CACHE_LEVEL(cache->level) |
261            (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0) |
262            ((num_cores - 1) << 26) |
263            ((num_apic_ids - 1) << 14);
264 
265     assert(cache->line_size > 0);
266     assert(cache->partitions > 0);
267     assert(cache->associativity > 0);
268     /* We don't implement fully-associative caches */
269     assert(cache->associativity < cache->sets);
270     *ebx = (cache->line_size - 1) |
271            ((cache->partitions - 1) << 12) |
272            ((cache->associativity - 1) << 22);
273 
274     assert(cache->sets > 0);
275     *ecx = cache->sets - 1;
276 
277     *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
278            (cache->inclusive ? CACHE_INCLUSIVE : 0) |
279            (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
280 }
281 
282 /* Encode cache info for CPUID[0x80000005].ECX or CPUID[0x80000005].EDX */
283 static uint32_t encode_cache_cpuid80000005(CPUCacheInfo *cache)
284 {
285     assert(cache->size % 1024 == 0);
286     assert(cache->lines_per_tag > 0);
287     assert(cache->associativity > 0);
288     assert(cache->line_size > 0);
289     return ((cache->size / 1024) << 24) | (cache->associativity << 16) |
290            (cache->lines_per_tag << 8) | (cache->line_size);
291 }
292 
293 #define ASSOC_FULL 0xFF
294 
295 /* AMD associativity encoding used on CPUID Leaf 0x80000006: */
296 #define AMD_ENC_ASSOC(a) (a <=   1 ? a   : \
297                           a ==   2 ? 0x2 : \
298                           a ==   4 ? 0x4 : \
299                           a ==   8 ? 0x6 : \
300                           a ==  16 ? 0x8 : \
301                           a ==  32 ? 0xA : \
302                           a ==  48 ? 0xB : \
303                           a ==  64 ? 0xC : \
304                           a ==  96 ? 0xD : \
305                           a == 128 ? 0xE : \
306                           a == ASSOC_FULL ? 0xF : \
307                           0 /* invalid value */)
308 
309 /*
310  * Encode cache info for CPUID[0x80000006].ECX and CPUID[0x80000006].EDX
311  * @l3 can be NULL.
312  */
313 static void encode_cache_cpuid80000006(CPUCacheInfo *l2,
314                                        CPUCacheInfo *l3,
315                                        uint32_t *ecx, uint32_t *edx)
316 {
317     assert(l2->size % 1024 == 0);
318     assert(l2->associativity > 0);
319     assert(l2->lines_per_tag > 0);
320     assert(l2->line_size > 0);
321     *ecx = ((l2->size / 1024) << 16) |
322            (AMD_ENC_ASSOC(l2->associativity) << 12) |
323            (l2->lines_per_tag << 8) | (l2->line_size);
324 
325     if (l3) {
326         assert(l3->size % (512 * 1024) == 0);
327         assert(l3->associativity > 0);
328         assert(l3->lines_per_tag > 0);
329         assert(l3->line_size > 0);
330         *edx = ((l3->size / (512 * 1024)) << 18) |
331                (AMD_ENC_ASSOC(l3->associativity) << 12) |
332                (l3->lines_per_tag << 8) | (l3->line_size);
333     } else {
334         *edx = 0;
335     }
336 }
337 
338 /*
339  * Definitions used for building CPUID Leaf 0x8000001D and 0x8000001E
340  * Please refer to the AMD64 Architecture Programmer’s Manual Volume 3.
341  * Define the constants to build the cpu topology. Right now, TOPOEXT
342  * feature is enabled only on EPYC. So, these constants are based on
343  * EPYC supported configurations. We may need to handle the cases if
344  * these values change in future.
345  */
346 /* Maximum core complexes in a node */
347 #define MAX_CCX 2
348 /* Maximum cores in a core complex */
349 #define MAX_CORES_IN_CCX 4
350 /* Maximum cores in a node */
351 #define MAX_CORES_IN_NODE 8
352 /* Maximum nodes in a socket */
353 #define MAX_NODES_PER_SOCKET 4
354 
355 /*
356  * Figure out the number of nodes required to build this config.
357  * Max cores in a node is 8
358  */
359 static int nodes_in_socket(int nr_cores)
360 {
361     int nodes;
362 
363     nodes = DIV_ROUND_UP(nr_cores, MAX_CORES_IN_NODE);
364 
365    /* Hardware does not support config with 3 nodes, return 4 in that case */
366     return (nodes == 3) ? 4 : nodes;
367 }
368 
369 /*
370  * Decide the number of cores in a core complex with the given nr_cores using
371  * following set constants MAX_CCX, MAX_CORES_IN_CCX, MAX_CORES_IN_NODE and
372  * MAX_NODES_PER_SOCKET. Maintain symmetry as much as possible
373  * L3 cache is shared across all cores in a core complex. So, this will also
374  * tell us how many cores are sharing the L3 cache.
375  */
376 static int cores_in_core_complex(int nr_cores)
377 {
378     int nodes;
379 
380     /* Check if we can fit all the cores in one core complex */
381     if (nr_cores <= MAX_CORES_IN_CCX) {
382         return nr_cores;
383     }
384     /* Get the number of nodes required to build this config */
385     nodes = nodes_in_socket(nr_cores);
386 
387     /*
388      * Divide the cores accros all the core complexes
389      * Return rounded up value
390      */
391     return DIV_ROUND_UP(nr_cores, nodes * MAX_CCX);
392 }
393 
394 /* Encode cache info for CPUID[8000001D] */
395 static void encode_cache_cpuid8000001d(CPUCacheInfo *cache, CPUState *cs,
396                                 uint32_t *eax, uint32_t *ebx,
397                                 uint32_t *ecx, uint32_t *edx)
398 {
399     uint32_t l3_cores;
400     assert(cache->size == cache->line_size * cache->associativity *
401                           cache->partitions * cache->sets);
402 
403     *eax = CACHE_TYPE(cache->type) | CACHE_LEVEL(cache->level) |
404                (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0);
405 
406     /* L3 is shared among multiple cores */
407     if (cache->level == 3) {
408         l3_cores = cores_in_core_complex(cs->nr_cores);
409         *eax |= ((l3_cores * cs->nr_threads) - 1) << 14;
410     } else {
411         *eax |= ((cs->nr_threads - 1) << 14);
412     }
413 
414     assert(cache->line_size > 0);
415     assert(cache->partitions > 0);
416     assert(cache->associativity > 0);
417     /* We don't implement fully-associative caches */
418     assert(cache->associativity < cache->sets);
419     *ebx = (cache->line_size - 1) |
420            ((cache->partitions - 1) << 12) |
421            ((cache->associativity - 1) << 22);
422 
423     assert(cache->sets > 0);
424     *ecx = cache->sets - 1;
425 
426     *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
427            (cache->inclusive ? CACHE_INCLUSIVE : 0) |
428            (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
429 }
430 
431 /* Data structure to hold the configuration info for a given core index */
432 struct core_topology {
433     /* core complex id of the current core index */
434     int ccx_id;
435     /*
436      * Adjusted core index for this core in the topology
437      * This can be 0,1,2,3 with max 4 cores in a core complex
438      */
439     int core_id;
440     /* Node id for this core index */
441     int node_id;
442     /* Number of nodes in this config */
443     int num_nodes;
444 };
445 
446 /*
447  * Build the configuration closely match the EPYC hardware. Using the EPYC
448  * hardware configuration values (MAX_CCX, MAX_CORES_IN_CCX, MAX_CORES_IN_NODE)
449  * right now. This could change in future.
450  * nr_cores : Total number of cores in the config
451  * core_id  : Core index of the current CPU
452  * topo     : Data structure to hold all the config info for this core index
453  */
454 static void build_core_topology(int nr_cores, int core_id,
455                                 struct core_topology *topo)
456 {
457     int nodes, cores_in_ccx;
458 
459     /* First get the number of nodes required */
460     nodes = nodes_in_socket(nr_cores);
461 
462     cores_in_ccx = cores_in_core_complex(nr_cores);
463 
464     topo->node_id = core_id / (cores_in_ccx * MAX_CCX);
465     topo->ccx_id = (core_id % (cores_in_ccx * MAX_CCX)) / cores_in_ccx;
466     topo->core_id = core_id % cores_in_ccx;
467     topo->num_nodes = nodes;
468 }
469 
470 /* Encode cache info for CPUID[8000001E] */
471 static void encode_topo_cpuid8000001e(CPUState *cs, X86CPU *cpu,
472                                        uint32_t *eax, uint32_t *ebx,
473                                        uint32_t *ecx, uint32_t *edx)
474 {
475     struct core_topology topo = {0};
476     unsigned long nodes;
477     int shift;
478 
479     build_core_topology(cs->nr_cores, cpu->core_id, &topo);
480     *eax = cpu->apic_id;
481     /*
482      * CPUID_Fn8000001E_EBX
483      * 31:16 Reserved
484      * 15:8  Threads per core (The number of threads per core is
485      *       Threads per core + 1)
486      *  7:0  Core id (see bit decoding below)
487      *       SMT:
488      *           4:3 node id
489      *             2 Core complex id
490      *           1:0 Core id
491      *       Non SMT:
492      *           5:4 node id
493      *             3 Core complex id
494      *           1:0 Core id
495      */
496     if (cs->nr_threads - 1) {
497         *ebx = ((cs->nr_threads - 1) << 8) | (topo.node_id << 3) |
498                 (topo.ccx_id << 2) | topo.core_id;
499     } else {
500         *ebx = (topo.node_id << 4) | (topo.ccx_id << 3) | topo.core_id;
501     }
502     /*
503      * CPUID_Fn8000001E_ECX
504      * 31:11 Reserved
505      * 10:8  Nodes per processor (Nodes per processor is number of nodes + 1)
506      *  7:0  Node id (see bit decoding below)
507      *         2  Socket id
508      *       1:0  Node id
509      */
510     if (topo.num_nodes <= 4) {
511         *ecx = ((topo.num_nodes - 1) << 8) | (cpu->socket_id << 2) |
512                 topo.node_id;
513     } else {
514         /*
515          * Node id fix up. Actual hardware supports up to 4 nodes. But with
516          * more than 32 cores, we may end up with more than 4 nodes.
517          * Node id is a combination of socket id and node id. Only requirement
518          * here is that this number should be unique accross the system.
519          * Shift the socket id to accommodate more nodes. We dont expect both
520          * socket id and node id to be big number at the same time. This is not
521          * an ideal config but we need to to support it. Max nodes we can have
522          * is 32 (255/8) with 8 cores per node and 255 max cores. We only need
523          * 5 bits for nodes. Find the left most set bit to represent the total
524          * number of nodes. find_last_bit returns last set bit(0 based). Left
525          * shift(+1) the socket id to represent all the nodes.
526          */
527         nodes = topo.num_nodes - 1;
528         shift = find_last_bit(&nodes, 8);
529         *ecx = ((topo.num_nodes - 1) << 8) | (cpu->socket_id << (shift + 1)) |
530                 topo.node_id;
531     }
532     *edx = 0;
533 }
534 
535 /*
536  * Definitions of the hardcoded cache entries we expose:
537  * These are legacy cache values. If there is a need to change any
538  * of these values please use builtin_x86_defs
539  */
540 
541 /* L1 data cache: */
542 static CPUCacheInfo legacy_l1d_cache = {
543     .type = DATA_CACHE,
544     .level = 1,
545     .size = 32 * KiB,
546     .self_init = 1,
547     .line_size = 64,
548     .associativity = 8,
549     .sets = 64,
550     .partitions = 1,
551     .no_invd_sharing = true,
552 };
553 
554 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
555 static CPUCacheInfo legacy_l1d_cache_amd = {
556     .type = DATA_CACHE,
557     .level = 1,
558     .size = 64 * KiB,
559     .self_init = 1,
560     .line_size = 64,
561     .associativity = 2,
562     .sets = 512,
563     .partitions = 1,
564     .lines_per_tag = 1,
565     .no_invd_sharing = true,
566 };
567 
568 /* L1 instruction cache: */
569 static CPUCacheInfo legacy_l1i_cache = {
570     .type = INSTRUCTION_CACHE,
571     .level = 1,
572     .size = 32 * KiB,
573     .self_init = 1,
574     .line_size = 64,
575     .associativity = 8,
576     .sets = 64,
577     .partitions = 1,
578     .no_invd_sharing = true,
579 };
580 
581 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
582 static CPUCacheInfo legacy_l1i_cache_amd = {
583     .type = INSTRUCTION_CACHE,
584     .level = 1,
585     .size = 64 * KiB,
586     .self_init = 1,
587     .line_size = 64,
588     .associativity = 2,
589     .sets = 512,
590     .partitions = 1,
591     .lines_per_tag = 1,
592     .no_invd_sharing = true,
593 };
594 
595 /* Level 2 unified cache: */
596 static CPUCacheInfo legacy_l2_cache = {
597     .type = UNIFIED_CACHE,
598     .level = 2,
599     .size = 4 * MiB,
600     .self_init = 1,
601     .line_size = 64,
602     .associativity = 16,
603     .sets = 4096,
604     .partitions = 1,
605     .no_invd_sharing = true,
606 };
607 
608 /*FIXME: CPUID leaf 2 descriptor is inconsistent with CPUID leaf 4 */
609 static CPUCacheInfo legacy_l2_cache_cpuid2 = {
610     .type = UNIFIED_CACHE,
611     .level = 2,
612     .size = 2 * MiB,
613     .line_size = 64,
614     .associativity = 8,
615 };
616 
617 
618 /*FIXME: CPUID leaf 0x80000006 is inconsistent with leaves 2 & 4 */
619 static CPUCacheInfo legacy_l2_cache_amd = {
620     .type = UNIFIED_CACHE,
621     .level = 2,
622     .size = 512 * KiB,
623     .line_size = 64,
624     .lines_per_tag = 1,
625     .associativity = 16,
626     .sets = 512,
627     .partitions = 1,
628 };
629 
630 /* Level 3 unified cache: */
631 static CPUCacheInfo legacy_l3_cache = {
632     .type = UNIFIED_CACHE,
633     .level = 3,
634     .size = 16 * MiB,
635     .line_size = 64,
636     .associativity = 16,
637     .sets = 16384,
638     .partitions = 1,
639     .lines_per_tag = 1,
640     .self_init = true,
641     .inclusive = true,
642     .complex_indexing = true,
643 };
644 
645 /* TLB definitions: */
646 
647 #define L1_DTLB_2M_ASSOC       1
648 #define L1_DTLB_2M_ENTRIES   255
649 #define L1_DTLB_4K_ASSOC       1
650 #define L1_DTLB_4K_ENTRIES   255
651 
652 #define L1_ITLB_2M_ASSOC       1
653 #define L1_ITLB_2M_ENTRIES   255
654 #define L1_ITLB_4K_ASSOC       1
655 #define L1_ITLB_4K_ENTRIES   255
656 
657 #define L2_DTLB_2M_ASSOC       0 /* disabled */
658 #define L2_DTLB_2M_ENTRIES     0 /* disabled */
659 #define L2_DTLB_4K_ASSOC       4
660 #define L2_DTLB_4K_ENTRIES   512
661 
662 #define L2_ITLB_2M_ASSOC       0 /* disabled */
663 #define L2_ITLB_2M_ENTRIES     0 /* disabled */
664 #define L2_ITLB_4K_ASSOC       4
665 #define L2_ITLB_4K_ENTRIES   512
666 
667 /* CPUID Leaf 0x14 constants: */
668 #define INTEL_PT_MAX_SUBLEAF     0x1
669 /*
670  * bit[00]: IA32_RTIT_CTL.CR3 filter can be set to 1 and IA32_RTIT_CR3_MATCH
671  *          MSR can be accessed;
672  * bit[01]: Support Configurable PSB and Cycle-Accurate Mode;
673  * bit[02]: Support IP Filtering, TraceStop filtering, and preservation
674  *          of Intel PT MSRs across warm reset;
675  * bit[03]: Support MTC timing packet and suppression of COFI-based packets;
676  */
677 #define INTEL_PT_MINIMAL_EBX     0xf
678 /*
679  * bit[00]: Tracing can be enabled with IA32_RTIT_CTL.ToPA = 1 and
680  *          IA32_RTIT_OUTPUT_BASE and IA32_RTIT_OUTPUT_MASK_PTRS MSRs can be
681  *          accessed;
682  * bit[01]: ToPA tables can hold any number of output entries, up to the
683  *          maximum allowed by the MaskOrTableOffset field of
684  *          IA32_RTIT_OUTPUT_MASK_PTRS;
685  * bit[02]: Support Single-Range Output scheme;
686  */
687 #define INTEL_PT_MINIMAL_ECX     0x7
688 /* generated packets which contain IP payloads have LIP values */
689 #define INTEL_PT_IP_LIP          (1 << 31)
690 #define INTEL_PT_ADDR_RANGES_NUM 0x2 /* Number of configurable address ranges */
691 #define INTEL_PT_ADDR_RANGES_NUM_MASK 0x3
692 #define INTEL_PT_MTC_BITMAP      (0x0249 << 16) /* Support ART(0,3,6,9) */
693 #define INTEL_PT_CYCLE_BITMAP    0x1fff         /* Support 0,2^(0~11) */
694 #define INTEL_PT_PSB_BITMAP      (0x003f << 16) /* Support 2K,4K,8K,16K,32K,64K */
695 
696 static void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1,
697                                      uint32_t vendor2, uint32_t vendor3)
698 {
699     int i;
700     for (i = 0; i < 4; i++) {
701         dst[i] = vendor1 >> (8 * i);
702         dst[i + 4] = vendor2 >> (8 * i);
703         dst[i + 8] = vendor3 >> (8 * i);
704     }
705     dst[CPUID_VENDOR_SZ] = '\0';
706 }
707 
708 #define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
709 #define PENTIUM_FEATURES (I486_FEATURES | CPUID_DE | CPUID_TSC | \
710           CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_MMX | CPUID_APIC)
711 #define PENTIUM2_FEATURES (PENTIUM_FEATURES | CPUID_PAE | CPUID_SEP | \
712           CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
713           CPUID_PSE36 | CPUID_FXSR)
714 #define PENTIUM3_FEATURES (PENTIUM2_FEATURES | CPUID_SSE)
715 #define PPRO_FEATURES (CPUID_FP87 | CPUID_DE | CPUID_PSE | CPUID_TSC | \
716           CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_PGE | CPUID_CMOV | \
717           CPUID_PAT | CPUID_FXSR | CPUID_MMX | CPUID_SSE | CPUID_SSE2 | \
718           CPUID_PAE | CPUID_SEP | CPUID_APIC)
719 
720 #define TCG_FEATURES (CPUID_FP87 | CPUID_PSE | CPUID_TSC | CPUID_MSR | \
721           CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | CPUID_SEP | \
722           CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
723           CPUID_PSE36 | CPUID_CLFLUSH | CPUID_ACPI | CPUID_MMX | \
724           CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS | CPUID_DE)
725           /* partly implemented:
726           CPUID_MTRR, CPUID_MCA, CPUID_CLFLUSH (needed for Win64) */
727           /* missing:
728           CPUID_VME, CPUID_DTS, CPUID_SS, CPUID_HT, CPUID_TM, CPUID_PBE */
729 #define TCG_EXT_FEATURES (CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | \
730           CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | \
731           CPUID_EXT_SSE41 | CPUID_EXT_SSE42 | CPUID_EXT_POPCNT | \
732           CPUID_EXT_XSAVE | /* CPUID_EXT_OSXSAVE is dynamic */   \
733           CPUID_EXT_MOVBE | CPUID_EXT_AES | CPUID_EXT_HYPERVISOR)
734           /* missing:
735           CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_SMX,
736           CPUID_EXT_EST, CPUID_EXT_TM2, CPUID_EXT_CID, CPUID_EXT_FMA,
737           CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_PCID, CPUID_EXT_DCA,
738           CPUID_EXT_X2APIC, CPUID_EXT_TSC_DEADLINE_TIMER, CPUID_EXT_AVX,
739           CPUID_EXT_F16C, CPUID_EXT_RDRAND */
740 
741 #ifdef TARGET_X86_64
742 #define TCG_EXT2_X86_64_FEATURES (CPUID_EXT2_SYSCALL | CPUID_EXT2_LM)
743 #else
744 #define TCG_EXT2_X86_64_FEATURES 0
745 #endif
746 
747 #define TCG_EXT2_FEATURES ((TCG_FEATURES & CPUID_EXT2_AMD_ALIASES) | \
748           CPUID_EXT2_NX | CPUID_EXT2_MMXEXT | CPUID_EXT2_RDTSCP | \
749           CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_PDPE1GB | \
750           TCG_EXT2_X86_64_FEATURES)
751 #define TCG_EXT3_FEATURES (CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | \
752           CPUID_EXT3_CR8LEG | CPUID_EXT3_ABM | CPUID_EXT3_SSE4A)
753 #define TCG_EXT4_FEATURES 0
754 #define TCG_SVM_FEATURES CPUID_SVM_NPT
755 #define TCG_KVM_FEATURES 0
756 #define TCG_7_0_EBX_FEATURES (CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_SMAP | \
757           CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX | \
758           CPUID_7_0_EBX_PCOMMIT | CPUID_7_0_EBX_CLFLUSHOPT |            \
759           CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_FSGSBASE | \
760           CPUID_7_0_EBX_ERMS)
761           /* missing:
762           CPUID_7_0_EBX_HLE, CPUID_7_0_EBX_AVX2,
763           CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM,
764           CPUID_7_0_EBX_RDSEED */
765 #define TCG_7_0_ECX_FEATURES (CPUID_7_0_ECX_PKU | \
766           /* CPUID_7_0_ECX_OSPKE is dynamic */ \
767           CPUID_7_0_ECX_LA57)
768 #define TCG_7_0_EDX_FEATURES 0
769 #define TCG_APM_FEATURES 0
770 #define TCG_6_EAX_FEATURES CPUID_6_EAX_ARAT
771 #define TCG_XSAVE_FEATURES (CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XGETBV1)
772           /* missing:
773           CPUID_XSAVE_XSAVEC, CPUID_XSAVE_XSAVES */
774 
775 typedef enum FeatureWordType {
776    CPUID_FEATURE_WORD,
777    MSR_FEATURE_WORD,
778 } FeatureWordType;
779 
780 typedef struct FeatureWordInfo {
781     FeatureWordType type;
782     /* feature flags names are taken from "Intel Processor Identification and
783      * the CPUID Instruction" and AMD's "CPUID Specification".
784      * In cases of disagreement between feature naming conventions,
785      * aliases may be added.
786      */
787     const char *feat_names[32];
788     union {
789         /* If type==CPUID_FEATURE_WORD */
790         struct {
791             uint32_t eax;   /* Input EAX for CPUID */
792             bool needs_ecx; /* CPUID instruction uses ECX as input */
793             uint32_t ecx;   /* Input ECX value for CPUID */
794             int reg;        /* output register (R_* constant) */
795         } cpuid;
796         /* If type==MSR_FEATURE_WORD */
797         struct {
798             uint32_t index;
799             struct {   /*CPUID that enumerate this MSR*/
800                 FeatureWord cpuid_class;
801                 uint32_t    cpuid_flag;
802             } cpuid_dep;
803         } msr;
804     };
805     uint32_t tcg_features; /* Feature flags supported by TCG */
806     uint32_t unmigratable_flags; /* Feature flags known to be unmigratable */
807     uint32_t migratable_flags; /* Feature flags known to be migratable */
808     /* Features that shouldn't be auto-enabled by "-cpu host" */
809     uint32_t no_autoenable_flags;
810 } FeatureWordInfo;
811 
812 static FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
813     [FEAT_1_EDX] = {
814         .type = CPUID_FEATURE_WORD,
815         .feat_names = {
816             "fpu", "vme", "de", "pse",
817             "tsc", "msr", "pae", "mce",
818             "cx8", "apic", NULL, "sep",
819             "mtrr", "pge", "mca", "cmov",
820             "pat", "pse36", "pn" /* Intel psn */, "clflush" /* Intel clfsh */,
821             NULL, "ds" /* Intel dts */, "acpi", "mmx",
822             "fxsr", "sse", "sse2", "ss",
823             "ht" /* Intel htt */, "tm", "ia64", "pbe",
824         },
825         .cpuid = {.eax = 1, .reg = R_EDX, },
826         .tcg_features = TCG_FEATURES,
827     },
828     [FEAT_1_ECX] = {
829         .type = CPUID_FEATURE_WORD,
830         .feat_names = {
831             "pni" /* Intel,AMD sse3 */, "pclmulqdq", "dtes64", "monitor",
832             "ds-cpl", "vmx", "smx", "est",
833             "tm2", "ssse3", "cid", NULL,
834             "fma", "cx16", "xtpr", "pdcm",
835             NULL, "pcid", "dca", "sse4.1",
836             "sse4.2", "x2apic", "movbe", "popcnt",
837             "tsc-deadline", "aes", "xsave", NULL /* osxsave */,
838             "avx", "f16c", "rdrand", "hypervisor",
839         },
840         .cpuid = { .eax = 1, .reg = R_ECX, },
841         .tcg_features = TCG_EXT_FEATURES,
842     },
843     /* Feature names that are already defined on feature_name[] but
844      * are set on CPUID[8000_0001].EDX on AMD CPUs don't have their
845      * names on feat_names below. They are copied automatically
846      * to features[FEAT_8000_0001_EDX] if and only if CPU vendor is AMD.
847      */
848     [FEAT_8000_0001_EDX] = {
849         .type = CPUID_FEATURE_WORD,
850         .feat_names = {
851             NULL /* fpu */, NULL /* vme */, NULL /* de */, NULL /* pse */,
852             NULL /* tsc */, NULL /* msr */, NULL /* pae */, NULL /* mce */,
853             NULL /* cx8 */, NULL /* apic */, NULL, "syscall",
854             NULL /* mtrr */, NULL /* pge */, NULL /* mca */, NULL /* cmov */,
855             NULL /* pat */, NULL /* pse36 */, NULL, NULL /* Linux mp */,
856             "nx", NULL, "mmxext", NULL /* mmx */,
857             NULL /* fxsr */, "fxsr-opt", "pdpe1gb", "rdtscp",
858             NULL, "lm", "3dnowext", "3dnow",
859         },
860         .cpuid = { .eax = 0x80000001, .reg = R_EDX, },
861         .tcg_features = TCG_EXT2_FEATURES,
862     },
863     [FEAT_8000_0001_ECX] = {
864         .type = CPUID_FEATURE_WORD,
865         .feat_names = {
866             "lahf-lm", "cmp-legacy", "svm", "extapic",
867             "cr8legacy", "abm", "sse4a", "misalignsse",
868             "3dnowprefetch", "osvw", "ibs", "xop",
869             "skinit", "wdt", NULL, "lwp",
870             "fma4", "tce", NULL, "nodeid-msr",
871             NULL, "tbm", "topoext", "perfctr-core",
872             "perfctr-nb", NULL, NULL, NULL,
873             NULL, NULL, NULL, NULL,
874         },
875         .cpuid = { .eax = 0x80000001, .reg = R_ECX, },
876         .tcg_features = TCG_EXT3_FEATURES,
877         /*
878          * TOPOEXT is always allowed but can't be enabled blindly by
879          * "-cpu host", as it requires consistent cache topology info
880          * to be provided so it doesn't confuse guests.
881          */
882         .no_autoenable_flags = CPUID_EXT3_TOPOEXT,
883     },
884     [FEAT_C000_0001_EDX] = {
885         .type = CPUID_FEATURE_WORD,
886         .feat_names = {
887             NULL, NULL, "xstore", "xstore-en",
888             NULL, NULL, "xcrypt", "xcrypt-en",
889             "ace2", "ace2-en", "phe", "phe-en",
890             "pmm", "pmm-en", NULL, NULL,
891             NULL, NULL, NULL, NULL,
892             NULL, NULL, NULL, NULL,
893             NULL, NULL, NULL, NULL,
894             NULL, NULL, NULL, NULL,
895         },
896         .cpuid = { .eax = 0xC0000001, .reg = R_EDX, },
897         .tcg_features = TCG_EXT4_FEATURES,
898     },
899     [FEAT_KVM] = {
900         .type = CPUID_FEATURE_WORD,
901         .feat_names = {
902             "kvmclock", "kvm-nopiodelay", "kvm-mmu", "kvmclock",
903             "kvm-asyncpf", "kvm-steal-time", "kvm-pv-eoi", "kvm-pv-unhalt",
904             NULL, "kvm-pv-tlb-flush", NULL, "kvm-pv-ipi",
905             NULL, NULL, NULL, NULL,
906             NULL, NULL, NULL, NULL,
907             NULL, NULL, NULL, NULL,
908             "kvmclock-stable-bit", NULL, NULL, NULL,
909             NULL, NULL, NULL, NULL,
910         },
911         .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EAX, },
912         .tcg_features = TCG_KVM_FEATURES,
913     },
914     [FEAT_KVM_HINTS] = {
915         .type = CPUID_FEATURE_WORD,
916         .feat_names = {
917             "kvm-hint-dedicated", 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             NULL, NULL, NULL, NULL,
925         },
926         .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EDX, },
927         .tcg_features = TCG_KVM_FEATURES,
928         /*
929          * KVM hints aren't auto-enabled by -cpu host, they need to be
930          * explicitly enabled in the command-line.
931          */
932         .no_autoenable_flags = ~0U,
933     },
934     /*
935      * .feat_names are commented out for Hyper-V enlightenments because we
936      * don't want to have two different ways for enabling them on QEMU command
937      * line. Some features (e.g. "hyperv_time", "hyperv_vapic", ...) require
938      * enabling several feature bits simultaneously, exposing these bits
939      * individually may just confuse guests.
940      */
941     [FEAT_HYPERV_EAX] = {
942         .type = CPUID_FEATURE_WORD,
943         .feat_names = {
944             NULL /* hv_msr_vp_runtime_access */, NULL /* hv_msr_time_refcount_access */,
945             NULL /* hv_msr_synic_access */, NULL /* hv_msr_stimer_access */,
946             NULL /* hv_msr_apic_access */, NULL /* hv_msr_hypercall_access */,
947             NULL /* hv_vpindex_access */, NULL /* hv_msr_reset_access */,
948             NULL /* hv_msr_stats_access */, NULL /* hv_reftsc_access */,
949             NULL /* hv_msr_idle_access */, NULL /* hv_msr_frequency_access */,
950             NULL /* hv_msr_debug_access */, NULL /* hv_msr_reenlightenment_access */,
951             NULL, NULL,
952             NULL, NULL, NULL, NULL,
953             NULL, NULL, NULL, NULL,
954             NULL, NULL, NULL, NULL,
955             NULL, NULL, NULL, NULL,
956         },
957         .cpuid = { .eax = 0x40000003, .reg = R_EAX, },
958     },
959     [FEAT_HYPERV_EBX] = {
960         .type = CPUID_FEATURE_WORD,
961         .feat_names = {
962             NULL /* hv_create_partitions */, NULL /* hv_access_partition_id */,
963             NULL /* hv_access_memory_pool */, NULL /* hv_adjust_message_buffers */,
964             NULL /* hv_post_messages */, NULL /* hv_signal_events */,
965             NULL /* hv_create_port */, NULL /* hv_connect_port */,
966             NULL /* hv_access_stats */, NULL, NULL, NULL /* hv_debugging */,
967             NULL /* hv_cpu_power_management */, NULL /* hv_configure_profiler */,
968             NULL, NULL,
969             NULL, NULL, NULL, NULL,
970             NULL, NULL, NULL, NULL,
971             NULL, NULL, NULL, NULL,
972             NULL, NULL, NULL, NULL,
973         },
974         .cpuid = { .eax = 0x40000003, .reg = R_EBX, },
975     },
976     [FEAT_HYPERV_EDX] = {
977         .type = CPUID_FEATURE_WORD,
978         .feat_names = {
979             NULL /* hv_mwait */, NULL /* hv_guest_debugging */,
980             NULL /* hv_perf_monitor */, NULL /* hv_cpu_dynamic_part */,
981             NULL /* hv_hypercall_params_xmm */, NULL /* hv_guest_idle_state */,
982             NULL, NULL,
983             NULL, NULL, NULL /* hv_guest_crash_msr */, NULL,
984             NULL, NULL, NULL, NULL,
985             NULL, NULL, NULL, NULL,
986             NULL, NULL, NULL, NULL,
987             NULL, NULL, NULL, NULL,
988             NULL, NULL, NULL, NULL,
989         },
990         .cpuid = { .eax = 0x40000003, .reg = R_EDX, },
991     },
992     [FEAT_HV_RECOMM_EAX] = {
993         .type = CPUID_FEATURE_WORD,
994         .feat_names = {
995             NULL /* hv_recommend_pv_as_switch */,
996             NULL /* hv_recommend_pv_tlbflush_local */,
997             NULL /* hv_recommend_pv_tlbflush_remote */,
998             NULL /* hv_recommend_msr_apic_access */,
999             NULL /* hv_recommend_msr_reset */,
1000             NULL /* hv_recommend_relaxed_timing */,
1001             NULL /* hv_recommend_dma_remapping */,
1002             NULL /* hv_recommend_int_remapping */,
1003             NULL /* hv_recommend_x2apic_msrs */,
1004             NULL /* hv_recommend_autoeoi_deprecation */,
1005             NULL /* hv_recommend_pv_ipi */,
1006             NULL /* hv_recommend_ex_hypercalls */,
1007             NULL /* hv_hypervisor_is_nested */,
1008             NULL /* hv_recommend_int_mbec */,
1009             NULL /* hv_recommend_evmcs */,
1010             NULL,
1011             NULL, NULL, NULL, NULL,
1012             NULL, NULL, NULL, NULL,
1013             NULL, NULL, NULL, NULL,
1014             NULL, NULL, NULL, NULL,
1015         },
1016         .cpuid = { .eax = 0x40000004, .reg = R_EAX, },
1017     },
1018     [FEAT_HV_NESTED_EAX] = {
1019         .type = CPUID_FEATURE_WORD,
1020         .cpuid = { .eax = 0x4000000A, .reg = R_EAX, },
1021     },
1022     [FEAT_SVM] = {
1023         .type = CPUID_FEATURE_WORD,
1024         .feat_names = {
1025             "npt", "lbrv", "svm-lock", "nrip-save",
1026             "tsc-scale", "vmcb-clean",  "flushbyasid", "decodeassists",
1027             NULL, NULL, "pause-filter", NULL,
1028             "pfthreshold", NULL, NULL, NULL,
1029             NULL, NULL, NULL, NULL,
1030             NULL, NULL, NULL, NULL,
1031             NULL, NULL, NULL, NULL,
1032             NULL, NULL, NULL, NULL,
1033         },
1034         .cpuid = { .eax = 0x8000000A, .reg = R_EDX, },
1035         .tcg_features = TCG_SVM_FEATURES,
1036     },
1037     [FEAT_7_0_EBX] = {
1038         .type = CPUID_FEATURE_WORD,
1039         .feat_names = {
1040             "fsgsbase", "tsc-adjust", NULL, "bmi1",
1041             "hle", "avx2", NULL, "smep",
1042             "bmi2", "erms", "invpcid", "rtm",
1043             NULL, NULL, "mpx", NULL,
1044             "avx512f", "avx512dq", "rdseed", "adx",
1045             "smap", "avx512ifma", "pcommit", "clflushopt",
1046             "clwb", "intel-pt", "avx512pf", "avx512er",
1047             "avx512cd", "sha-ni", "avx512bw", "avx512vl",
1048         },
1049         .cpuid = {
1050             .eax = 7,
1051             .needs_ecx = true, .ecx = 0,
1052             .reg = R_EBX,
1053         },
1054         .tcg_features = TCG_7_0_EBX_FEATURES,
1055     },
1056     [FEAT_7_0_ECX] = {
1057         .type = CPUID_FEATURE_WORD,
1058         .feat_names = {
1059             NULL, "avx512vbmi", "umip", "pku",
1060             NULL /* ospke */, NULL, "avx512vbmi2", NULL,
1061             "gfni", "vaes", "vpclmulqdq", "avx512vnni",
1062             "avx512bitalg", NULL, "avx512-vpopcntdq", NULL,
1063             "la57", NULL, NULL, NULL,
1064             NULL, NULL, "rdpid", NULL,
1065             NULL, "cldemote", NULL, "movdiri",
1066             "movdir64b", NULL, NULL, NULL,
1067         },
1068         .cpuid = {
1069             .eax = 7,
1070             .needs_ecx = true, .ecx = 0,
1071             .reg = R_ECX,
1072         },
1073         .tcg_features = TCG_7_0_ECX_FEATURES,
1074     },
1075     [FEAT_7_0_EDX] = {
1076         .type = CPUID_FEATURE_WORD,
1077         .feat_names = {
1078             NULL, NULL, "avx512-4vnniw", "avx512-4fmaps",
1079             NULL, NULL, NULL, NULL,
1080             NULL, NULL, NULL, NULL,
1081             NULL, NULL, NULL, NULL,
1082             NULL, NULL, NULL, NULL,
1083             NULL, NULL, NULL, NULL,
1084             NULL, NULL, "spec-ctrl", "stibp",
1085             NULL, "arch-capabilities", NULL, "ssbd",
1086         },
1087         .cpuid = {
1088             .eax = 7,
1089             .needs_ecx = true, .ecx = 0,
1090             .reg = R_EDX,
1091         },
1092         .tcg_features = TCG_7_0_EDX_FEATURES,
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 |
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_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_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         .name = "Dhyana",
2940         .level = 0xd,
2941         .vendor = CPUID_VENDOR_HYGON,
2942         .family = 24,
2943         .model = 0,
2944         .stepping = 1,
2945         .features[FEAT_1_EDX] =
2946             CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
2947             CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
2948             CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
2949             CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
2950             CPUID_VME | CPUID_FP87,
2951         .features[FEAT_1_ECX] =
2952             CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
2953             CPUID_EXT_XSAVE | CPUID_EXT_POPCNT |
2954             CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2955             CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
2956             CPUID_EXT_MONITOR | CPUID_EXT_SSE3,
2957         .features[FEAT_8000_0001_EDX] =
2958             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
2959             CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
2960             CPUID_EXT2_SYSCALL,
2961         .features[FEAT_8000_0001_ECX] =
2962             CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
2963             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
2964             CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
2965             CPUID_EXT3_TOPOEXT,
2966         .features[FEAT_8000_0008_EBX] =
2967             CPUID_8000_0008_EBX_IBPB,
2968         .features[FEAT_7_0_EBX] =
2969             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
2970             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
2971             CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT,
2972         /*
2973          * Missing: XSAVES (not supported by some Linux versions,
2974          * including v4.1 to v4.12).
2975          * KVM doesn't yet expose any XSAVES state save component.
2976          */
2977         .features[FEAT_XSAVE] =
2978             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2979             CPUID_XSAVE_XGETBV1,
2980         .features[FEAT_6_EAX] =
2981             CPUID_6_EAX_ARAT,
2982         .features[FEAT_SVM] =
2983             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
2984         .xlevel = 0x8000001E,
2985         .model_id = "Hygon Dhyana Processor",
2986         .cache_info = &epyc_cache_info,
2987     },
2988 };
2989 
2990 typedef struct PropValue {
2991     const char *prop, *value;
2992 } PropValue;
2993 
2994 /* KVM-specific features that are automatically added/removed
2995  * from all CPU models when KVM is enabled.
2996  */
2997 static PropValue kvm_default_props[] = {
2998     { "kvmclock", "on" },
2999     { "kvm-nopiodelay", "on" },
3000     { "kvm-asyncpf", "on" },
3001     { "kvm-steal-time", "on" },
3002     { "kvm-pv-eoi", "on" },
3003     { "kvmclock-stable-bit", "on" },
3004     { "x2apic", "on" },
3005     { "acpi", "off" },
3006     { "monitor", "off" },
3007     { "svm", "off" },
3008     { NULL, NULL },
3009 };
3010 
3011 /* TCG-specific defaults that override all CPU models when using TCG
3012  */
3013 static PropValue tcg_default_props[] = {
3014     { "vme", "off" },
3015     { NULL, NULL },
3016 };
3017 
3018 
3019 void x86_cpu_change_kvm_default(const char *prop, const char *value)
3020 {
3021     PropValue *pv;
3022     for (pv = kvm_default_props; pv->prop; pv++) {
3023         if (!strcmp(pv->prop, prop)) {
3024             pv->value = value;
3025             break;
3026         }
3027     }
3028 
3029     /* It is valid to call this function only for properties that
3030      * are already present in the kvm_default_props table.
3031      */
3032     assert(pv->prop);
3033 }
3034 
3035 static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w,
3036                                                    bool migratable_only);
3037 
3038 static bool lmce_supported(void)
3039 {
3040     uint64_t mce_cap = 0;
3041 
3042 #ifdef CONFIG_KVM
3043     if (kvm_ioctl(kvm_state, KVM_X86_GET_MCE_CAP_SUPPORTED, &mce_cap) < 0) {
3044         return false;
3045     }
3046 #endif
3047 
3048     return !!(mce_cap & MCG_LMCE_P);
3049 }
3050 
3051 #define CPUID_MODEL_ID_SZ 48
3052 
3053 /**
3054  * cpu_x86_fill_model_id:
3055  * Get CPUID model ID string from host CPU.
3056  *
3057  * @str should have at least CPUID_MODEL_ID_SZ bytes
3058  *
3059  * The function does NOT add a null terminator to the string
3060  * automatically.
3061  */
3062 static int cpu_x86_fill_model_id(char *str)
3063 {
3064     uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0;
3065     int i;
3066 
3067     for (i = 0; i < 3; i++) {
3068         host_cpuid(0x80000002 + i, 0, &eax, &ebx, &ecx, &edx);
3069         memcpy(str + i * 16 +  0, &eax, 4);
3070         memcpy(str + i * 16 +  4, &ebx, 4);
3071         memcpy(str + i * 16 +  8, &ecx, 4);
3072         memcpy(str + i * 16 + 12, &edx, 4);
3073     }
3074     return 0;
3075 }
3076 
3077 static Property max_x86_cpu_properties[] = {
3078     DEFINE_PROP_BOOL("migratable", X86CPU, migratable, true),
3079     DEFINE_PROP_BOOL("host-cache-info", X86CPU, cache_info_passthrough, false),
3080     DEFINE_PROP_END_OF_LIST()
3081 };
3082 
3083 static void max_x86_cpu_class_init(ObjectClass *oc, void *data)
3084 {
3085     DeviceClass *dc = DEVICE_CLASS(oc);
3086     X86CPUClass *xcc = X86_CPU_CLASS(oc);
3087 
3088     xcc->ordering = 9;
3089 
3090     xcc->model_description =
3091         "Enables all features supported by the accelerator in the current host";
3092 
3093     dc->props = max_x86_cpu_properties;
3094 }
3095 
3096 static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp);
3097 
3098 static void max_x86_cpu_initfn(Object *obj)
3099 {
3100     X86CPU *cpu = X86_CPU(obj);
3101     CPUX86State *env = &cpu->env;
3102     KVMState *s = kvm_state;
3103 
3104     /* We can't fill the features array here because we don't know yet if
3105      * "migratable" is true or false.
3106      */
3107     cpu->max_features = true;
3108 
3109     if (accel_uses_host_cpuid()) {
3110         char vendor[CPUID_VENDOR_SZ + 1] = { 0 };
3111         char model_id[CPUID_MODEL_ID_SZ + 1] = { 0 };
3112         int family, model, stepping;
3113         X86CPUDefinition host_cpudef = { };
3114         uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0;
3115 
3116         host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx);
3117         x86_cpu_vendor_words2str(host_cpudef.vendor, ebx, edx, ecx);
3118 
3119         host_vendor_fms(vendor, &family, &model, &stepping);
3120 
3121         cpu_x86_fill_model_id(model_id);
3122 
3123         object_property_set_str(OBJECT(cpu), vendor, "vendor", &error_abort);
3124         object_property_set_int(OBJECT(cpu), family, "family", &error_abort);
3125         object_property_set_int(OBJECT(cpu), model, "model", &error_abort);
3126         object_property_set_int(OBJECT(cpu), stepping, "stepping",
3127                                 &error_abort);
3128         object_property_set_str(OBJECT(cpu), model_id, "model-id",
3129                                 &error_abort);
3130 
3131         if (kvm_enabled()) {
3132             env->cpuid_min_level =
3133                 kvm_arch_get_supported_cpuid(s, 0x0, 0, R_EAX);
3134             env->cpuid_min_xlevel =
3135                 kvm_arch_get_supported_cpuid(s, 0x80000000, 0, R_EAX);
3136             env->cpuid_min_xlevel2 =
3137                 kvm_arch_get_supported_cpuid(s, 0xC0000000, 0, R_EAX);
3138         } else {
3139             env->cpuid_min_level =
3140                 hvf_get_supported_cpuid(0x0, 0, R_EAX);
3141             env->cpuid_min_xlevel =
3142                 hvf_get_supported_cpuid(0x80000000, 0, R_EAX);
3143             env->cpuid_min_xlevel2 =
3144                 hvf_get_supported_cpuid(0xC0000000, 0, R_EAX);
3145         }
3146 
3147         if (lmce_supported()) {
3148             object_property_set_bool(OBJECT(cpu), true, "lmce", &error_abort);
3149         }
3150     } else {
3151         object_property_set_str(OBJECT(cpu), CPUID_VENDOR_AMD,
3152                                 "vendor", &error_abort);
3153         object_property_set_int(OBJECT(cpu), 6, "family", &error_abort);
3154         object_property_set_int(OBJECT(cpu), 6, "model", &error_abort);
3155         object_property_set_int(OBJECT(cpu), 3, "stepping", &error_abort);
3156         object_property_set_str(OBJECT(cpu),
3157                                 "QEMU TCG CPU version " QEMU_HW_VERSION,
3158                                 "model-id", &error_abort);
3159     }
3160 
3161     object_property_set_bool(OBJECT(cpu), true, "pmu", &error_abort);
3162 }
3163 
3164 static const TypeInfo max_x86_cpu_type_info = {
3165     .name = X86_CPU_TYPE_NAME("max"),
3166     .parent = TYPE_X86_CPU,
3167     .instance_init = max_x86_cpu_initfn,
3168     .class_init = max_x86_cpu_class_init,
3169 };
3170 
3171 #if defined(CONFIG_KVM) || defined(CONFIG_HVF)
3172 static void host_x86_cpu_class_init(ObjectClass *oc, void *data)
3173 {
3174     X86CPUClass *xcc = X86_CPU_CLASS(oc);
3175 
3176     xcc->host_cpuid_required = true;
3177     xcc->ordering = 8;
3178 
3179 #if defined(CONFIG_KVM)
3180     xcc->model_description =
3181         "KVM processor with all supported host features ";
3182 #elif defined(CONFIG_HVF)
3183     xcc->model_description =
3184         "HVF processor with all supported host features ";
3185 #endif
3186 }
3187 
3188 static const TypeInfo host_x86_cpu_type_info = {
3189     .name = X86_CPU_TYPE_NAME("host"),
3190     .parent = X86_CPU_TYPE_NAME("max"),
3191     .class_init = host_x86_cpu_class_init,
3192 };
3193 
3194 #endif
3195 
3196 static char *feature_word_description(FeatureWordInfo *f, uint32_t bit)
3197 {
3198     assert(f->type == CPUID_FEATURE_WORD || f->type == MSR_FEATURE_WORD);
3199 
3200     switch (f->type) {
3201     case CPUID_FEATURE_WORD:
3202         {
3203             const char *reg = get_register_name_32(f->cpuid.reg);
3204             assert(reg);
3205             return g_strdup_printf("CPUID.%02XH:%s",
3206                                    f->cpuid.eax, reg);
3207         }
3208     case MSR_FEATURE_WORD:
3209         return g_strdup_printf("MSR(%02XH)",
3210                                f->msr.index);
3211     }
3212 
3213     return NULL;
3214 }
3215 
3216 static void report_unavailable_features(FeatureWord w, uint32_t mask)
3217 {
3218     FeatureWordInfo *f = &feature_word_info[w];
3219     int i;
3220     char *feat_word_str;
3221 
3222     for (i = 0; i < 32; ++i) {
3223         if ((1UL << i) & mask) {
3224             feat_word_str = feature_word_description(f, i);
3225             warn_report("%s doesn't support requested feature: %s%s%s [bit %d]",
3226                         accel_uses_host_cpuid() ? "host" : "TCG",
3227                         feat_word_str,
3228                         f->feat_names[i] ? "." : "",
3229                         f->feat_names[i] ? f->feat_names[i] : "", i);
3230             g_free(feat_word_str);
3231         }
3232     }
3233 }
3234 
3235 static void x86_cpuid_version_get_family(Object *obj, Visitor *v,
3236                                          const char *name, void *opaque,
3237                                          Error **errp)
3238 {
3239     X86CPU *cpu = X86_CPU(obj);
3240     CPUX86State *env = &cpu->env;
3241     int64_t value;
3242 
3243     value = (env->cpuid_version >> 8) & 0xf;
3244     if (value == 0xf) {
3245         value += (env->cpuid_version >> 20) & 0xff;
3246     }
3247     visit_type_int(v, name, &value, errp);
3248 }
3249 
3250 static void x86_cpuid_version_set_family(Object *obj, Visitor *v,
3251                                          const char *name, void *opaque,
3252                                          Error **errp)
3253 {
3254     X86CPU *cpu = X86_CPU(obj);
3255     CPUX86State *env = &cpu->env;
3256     const int64_t min = 0;
3257     const int64_t max = 0xff + 0xf;
3258     Error *local_err = NULL;
3259     int64_t value;
3260 
3261     visit_type_int(v, name, &value, &local_err);
3262     if (local_err) {
3263         error_propagate(errp, local_err);
3264         return;
3265     }
3266     if (value < min || value > max) {
3267         error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
3268                    name ? name : "null", value, min, max);
3269         return;
3270     }
3271 
3272     env->cpuid_version &= ~0xff00f00;
3273     if (value > 0x0f) {
3274         env->cpuid_version |= 0xf00 | ((value - 0x0f) << 20);
3275     } else {
3276         env->cpuid_version |= value << 8;
3277     }
3278 }
3279 
3280 static void x86_cpuid_version_get_model(Object *obj, Visitor *v,
3281                                         const char *name, void *opaque,
3282                                         Error **errp)
3283 {
3284     X86CPU *cpu = X86_CPU(obj);
3285     CPUX86State *env = &cpu->env;
3286     int64_t value;
3287 
3288     value = (env->cpuid_version >> 4) & 0xf;
3289     value |= ((env->cpuid_version >> 16) & 0xf) << 4;
3290     visit_type_int(v, name, &value, errp);
3291 }
3292 
3293 static void x86_cpuid_version_set_model(Object *obj, Visitor *v,
3294                                         const char *name, void *opaque,
3295                                         Error **errp)
3296 {
3297     X86CPU *cpu = X86_CPU(obj);
3298     CPUX86State *env = &cpu->env;
3299     const int64_t min = 0;
3300     const int64_t max = 0xff;
3301     Error *local_err = NULL;
3302     int64_t value;
3303 
3304     visit_type_int(v, name, &value, &local_err);
3305     if (local_err) {
3306         error_propagate(errp, local_err);
3307         return;
3308     }
3309     if (value < min || value > max) {
3310         error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
3311                    name ? name : "null", value, min, max);
3312         return;
3313     }
3314 
3315     env->cpuid_version &= ~0xf00f0;
3316     env->cpuid_version |= ((value & 0xf) << 4) | ((value >> 4) << 16);
3317 }
3318 
3319 static void x86_cpuid_version_get_stepping(Object *obj, Visitor *v,
3320                                            const char *name, void *opaque,
3321                                            Error **errp)
3322 {
3323     X86CPU *cpu = X86_CPU(obj);
3324     CPUX86State *env = &cpu->env;
3325     int64_t value;
3326 
3327     value = env->cpuid_version & 0xf;
3328     visit_type_int(v, name, &value, errp);
3329 }
3330 
3331 static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v,
3332                                            const char *name, void *opaque,
3333                                            Error **errp)
3334 {
3335     X86CPU *cpu = X86_CPU(obj);
3336     CPUX86State *env = &cpu->env;
3337     const int64_t min = 0;
3338     const int64_t max = 0xf;
3339     Error *local_err = NULL;
3340     int64_t value;
3341 
3342     visit_type_int(v, name, &value, &local_err);
3343     if (local_err) {
3344         error_propagate(errp, local_err);
3345         return;
3346     }
3347     if (value < min || value > max) {
3348         error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
3349                    name ? name : "null", value, min, max);
3350         return;
3351     }
3352 
3353     env->cpuid_version &= ~0xf;
3354     env->cpuid_version |= value & 0xf;
3355 }
3356 
3357 static char *x86_cpuid_get_vendor(Object *obj, Error **errp)
3358 {
3359     X86CPU *cpu = X86_CPU(obj);
3360     CPUX86State *env = &cpu->env;
3361     char *value;
3362 
3363     value = g_malloc(CPUID_VENDOR_SZ + 1);
3364     x86_cpu_vendor_words2str(value, env->cpuid_vendor1, env->cpuid_vendor2,
3365                              env->cpuid_vendor3);
3366     return value;
3367 }
3368 
3369 static void x86_cpuid_set_vendor(Object *obj, const char *value,
3370                                  Error **errp)
3371 {
3372     X86CPU *cpu = X86_CPU(obj);
3373     CPUX86State *env = &cpu->env;
3374     int i;
3375 
3376     if (strlen(value) != CPUID_VENDOR_SZ) {
3377         error_setg(errp, QERR_PROPERTY_VALUE_BAD, "", "vendor", value);
3378         return;
3379     }
3380 
3381     env->cpuid_vendor1 = 0;
3382     env->cpuid_vendor2 = 0;
3383     env->cpuid_vendor3 = 0;
3384     for (i = 0; i < 4; i++) {
3385         env->cpuid_vendor1 |= ((uint8_t)value[i    ]) << (8 * i);
3386         env->cpuid_vendor2 |= ((uint8_t)value[i + 4]) << (8 * i);
3387         env->cpuid_vendor3 |= ((uint8_t)value[i + 8]) << (8 * i);
3388     }
3389 }
3390 
3391 static char *x86_cpuid_get_model_id(Object *obj, Error **errp)
3392 {
3393     X86CPU *cpu = X86_CPU(obj);
3394     CPUX86State *env = &cpu->env;
3395     char *value;
3396     int i;
3397 
3398     value = g_malloc(48 + 1);
3399     for (i = 0; i < 48; i++) {
3400         value[i] = env->cpuid_model[i >> 2] >> (8 * (i & 3));
3401     }
3402     value[48] = '\0';
3403     return value;
3404 }
3405 
3406 static void x86_cpuid_set_model_id(Object *obj, const char *model_id,
3407                                    Error **errp)
3408 {
3409     X86CPU *cpu = X86_CPU(obj);
3410     CPUX86State *env = &cpu->env;
3411     int c, len, i;
3412 
3413     if (model_id == NULL) {
3414         model_id = "";
3415     }
3416     len = strlen(model_id);
3417     memset(env->cpuid_model, 0, 48);
3418     for (i = 0; i < 48; i++) {
3419         if (i >= len) {
3420             c = '\0';
3421         } else {
3422             c = (uint8_t)model_id[i];
3423         }
3424         env->cpuid_model[i >> 2] |= c << (8 * (i & 3));
3425     }
3426 }
3427 
3428 static void x86_cpuid_get_tsc_freq(Object *obj, Visitor *v, const char *name,
3429                                    void *opaque, Error **errp)
3430 {
3431     X86CPU *cpu = X86_CPU(obj);
3432     int64_t value;
3433 
3434     value = cpu->env.tsc_khz * 1000;
3435     visit_type_int(v, name, &value, errp);
3436 }
3437 
3438 static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name,
3439                                    void *opaque, Error **errp)
3440 {
3441     X86CPU *cpu = X86_CPU(obj);
3442     const int64_t min = 0;
3443     const int64_t max = INT64_MAX;
3444     Error *local_err = NULL;
3445     int64_t value;
3446 
3447     visit_type_int(v, name, &value, &local_err);
3448     if (local_err) {
3449         error_propagate(errp, local_err);
3450         return;
3451     }
3452     if (value < min || value > max) {
3453         error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
3454                    name ? name : "null", value, min, max);
3455         return;
3456     }
3457 
3458     cpu->env.tsc_khz = cpu->env.user_tsc_khz = value / 1000;
3459 }
3460 
3461 /* Generic getter for "feature-words" and "filtered-features" properties */
3462 static void x86_cpu_get_feature_words(Object *obj, Visitor *v,
3463                                       const char *name, void *opaque,
3464                                       Error **errp)
3465 {
3466     uint32_t *array = (uint32_t *)opaque;
3467     FeatureWord w;
3468     X86CPUFeatureWordInfo word_infos[FEATURE_WORDS] = { };
3469     X86CPUFeatureWordInfoList list_entries[FEATURE_WORDS] = { };
3470     X86CPUFeatureWordInfoList *list = NULL;
3471 
3472     for (w = 0; w < FEATURE_WORDS; w++) {
3473         FeatureWordInfo *wi = &feature_word_info[w];
3474         /*
3475                 * We didn't have MSR features when "feature-words" was
3476                 *  introduced. Therefore skipped other type entries.
3477                 */
3478         if (wi->type != CPUID_FEATURE_WORD) {
3479             continue;
3480         }
3481         X86CPUFeatureWordInfo *qwi = &word_infos[w];
3482         qwi->cpuid_input_eax = wi->cpuid.eax;
3483         qwi->has_cpuid_input_ecx = wi->cpuid.needs_ecx;
3484         qwi->cpuid_input_ecx = wi->cpuid.ecx;
3485         qwi->cpuid_register = x86_reg_info_32[wi->cpuid.reg].qapi_enum;
3486         qwi->features = array[w];
3487 
3488         /* List will be in reverse order, but order shouldn't matter */
3489         list_entries[w].next = list;
3490         list_entries[w].value = &word_infos[w];
3491         list = &list_entries[w];
3492     }
3493 
3494     visit_type_X86CPUFeatureWordInfoList(v, "feature-words", &list, errp);
3495 }
3496 
3497 static void x86_get_hv_spinlocks(Object *obj, Visitor *v, const char *name,
3498                                  void *opaque, Error **errp)
3499 {
3500     X86CPU *cpu = X86_CPU(obj);
3501     int64_t value = cpu->hyperv_spinlock_attempts;
3502 
3503     visit_type_int(v, name, &value, errp);
3504 }
3505 
3506 static void x86_set_hv_spinlocks(Object *obj, Visitor *v, const char *name,
3507                                  void *opaque, Error **errp)
3508 {
3509     const int64_t min = 0xFFF;
3510     const int64_t max = UINT_MAX;
3511     X86CPU *cpu = X86_CPU(obj);
3512     Error *err = NULL;
3513     int64_t value;
3514 
3515     visit_type_int(v, name, &value, &err);
3516     if (err) {
3517         error_propagate(errp, err);
3518         return;
3519     }
3520 
3521     if (value < min || value > max) {
3522         error_setg(errp, "Property %s.%s doesn't take value %" PRId64
3523                    " (minimum: %" PRId64 ", maximum: %" PRId64 ")",
3524                    object_get_typename(obj), name ? name : "null",
3525                    value, min, max);
3526         return;
3527     }
3528     cpu->hyperv_spinlock_attempts = value;
3529 }
3530 
3531 static const PropertyInfo qdev_prop_spinlocks = {
3532     .name  = "int",
3533     .get   = x86_get_hv_spinlocks,
3534     .set   = x86_set_hv_spinlocks,
3535 };
3536 
3537 /* Convert all '_' in a feature string option name to '-', to make feature
3538  * name conform to QOM property naming rule, which uses '-' instead of '_'.
3539  */
3540 static inline void feat2prop(char *s)
3541 {
3542     while ((s = strchr(s, '_'))) {
3543         *s = '-';
3544     }
3545 }
3546 
3547 /* Return the feature property name for a feature flag bit */
3548 static const char *x86_cpu_feature_name(FeatureWord w, int bitnr)
3549 {
3550     /* XSAVE components are automatically enabled by other features,
3551      * so return the original feature name instead
3552      */
3553     if (w == FEAT_XSAVE_COMP_LO || w == FEAT_XSAVE_COMP_HI) {
3554         int comp = (w == FEAT_XSAVE_COMP_HI) ? bitnr + 32 : bitnr;
3555 
3556         if (comp < ARRAY_SIZE(x86_ext_save_areas) &&
3557             x86_ext_save_areas[comp].bits) {
3558             w = x86_ext_save_areas[comp].feature;
3559             bitnr = ctz32(x86_ext_save_areas[comp].bits);
3560         }
3561     }
3562 
3563     assert(bitnr < 32);
3564     assert(w < FEATURE_WORDS);
3565     return feature_word_info[w].feat_names[bitnr];
3566 }
3567 
3568 /* Compatibily hack to maintain legacy +-feat semantic,
3569  * where +-feat overwrites any feature set by
3570  * feat=on|feat even if the later is parsed after +-feat
3571  * (i.e. "-x2apic,x2apic=on" will result in x2apic disabled)
3572  */
3573 static GList *plus_features, *minus_features;
3574 
3575 static gint compare_string(gconstpointer a, gconstpointer b)
3576 {
3577     return g_strcmp0(a, b);
3578 }
3579 
3580 /* Parse "+feature,-feature,feature=foo" CPU feature string
3581  */
3582 static void x86_cpu_parse_featurestr(const char *typename, char *features,
3583                                      Error **errp)
3584 {
3585     char *featurestr; /* Single 'key=value" string being parsed */
3586     static bool cpu_globals_initialized;
3587     bool ambiguous = false;
3588 
3589     if (cpu_globals_initialized) {
3590         return;
3591     }
3592     cpu_globals_initialized = true;
3593 
3594     if (!features) {
3595         return;
3596     }
3597 
3598     for (featurestr = strtok(features, ",");
3599          featurestr;
3600          featurestr = strtok(NULL, ",")) {
3601         const char *name;
3602         const char *val = NULL;
3603         char *eq = NULL;
3604         char num[32];
3605         GlobalProperty *prop;
3606 
3607         /* Compatibility syntax: */
3608         if (featurestr[0] == '+') {
3609             plus_features = g_list_append(plus_features,
3610                                           g_strdup(featurestr + 1));
3611             continue;
3612         } else if (featurestr[0] == '-') {
3613             minus_features = g_list_append(minus_features,
3614                                            g_strdup(featurestr + 1));
3615             continue;
3616         }
3617 
3618         eq = strchr(featurestr, '=');
3619         if (eq) {
3620             *eq++ = 0;
3621             val = eq;
3622         } else {
3623             val = "on";
3624         }
3625 
3626         feat2prop(featurestr);
3627         name = featurestr;
3628 
3629         if (g_list_find_custom(plus_features, name, compare_string)) {
3630             warn_report("Ambiguous CPU model string. "
3631                         "Don't mix both \"+%s\" and \"%s=%s\"",
3632                         name, name, val);
3633             ambiguous = true;
3634         }
3635         if (g_list_find_custom(minus_features, name, compare_string)) {
3636             warn_report("Ambiguous CPU model string. "
3637                         "Don't mix both \"-%s\" and \"%s=%s\"",
3638                         name, name, val);
3639             ambiguous = true;
3640         }
3641 
3642         /* Special case: */
3643         if (!strcmp(name, "tsc-freq")) {
3644             int ret;
3645             uint64_t tsc_freq;
3646 
3647             ret = qemu_strtosz_metric(val, NULL, &tsc_freq);
3648             if (ret < 0 || tsc_freq > INT64_MAX) {
3649                 error_setg(errp, "bad numerical value %s", val);
3650                 return;
3651             }
3652             snprintf(num, sizeof(num), "%" PRId64, tsc_freq);
3653             val = num;
3654             name = "tsc-frequency";
3655         }
3656 
3657         prop = g_new0(typeof(*prop), 1);
3658         prop->driver = typename;
3659         prop->property = g_strdup(name);
3660         prop->value = g_strdup(val);
3661         qdev_prop_register_global(prop);
3662     }
3663 
3664     if (ambiguous) {
3665         warn_report("Compatibility of ambiguous CPU model "
3666                     "strings won't be kept on future QEMU versions");
3667     }
3668 }
3669 
3670 static void x86_cpu_expand_features(X86CPU *cpu, Error **errp);
3671 static int x86_cpu_filter_features(X86CPU *cpu);
3672 
3673 /* Check for missing features that may prevent the CPU class from
3674  * running using the current machine and accelerator.
3675  */
3676 static void x86_cpu_class_check_missing_features(X86CPUClass *xcc,
3677                                                  strList **missing_feats)
3678 {
3679     X86CPU *xc;
3680     FeatureWord w;
3681     Error *err = NULL;
3682     strList **next = missing_feats;
3683 
3684     if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
3685         strList *new = g_new0(strList, 1);
3686         new->value = g_strdup("kvm");
3687         *missing_feats = new;
3688         return;
3689     }
3690 
3691     xc = X86_CPU(object_new(object_class_get_name(OBJECT_CLASS(xcc))));
3692 
3693     x86_cpu_expand_features(xc, &err);
3694     if (err) {
3695         /* Errors at x86_cpu_expand_features should never happen,
3696          * but in case it does, just report the model as not
3697          * runnable at all using the "type" property.
3698          */
3699         strList *new = g_new0(strList, 1);
3700         new->value = g_strdup("type");
3701         *next = new;
3702         next = &new->next;
3703     }
3704 
3705     x86_cpu_filter_features(xc);
3706 
3707     for (w = 0; w < FEATURE_WORDS; w++) {
3708         uint32_t filtered = xc->filtered_features[w];
3709         int i;
3710         for (i = 0; i < 32; i++) {
3711             if (filtered & (1UL << i)) {
3712                 strList *new = g_new0(strList, 1);
3713                 new->value = g_strdup(x86_cpu_feature_name(w, i));
3714                 *next = new;
3715                 next = &new->next;
3716             }
3717         }
3718     }
3719 
3720     object_unref(OBJECT(xc));
3721 }
3722 
3723 /* Print all cpuid feature names in featureset
3724  */
3725 static void listflags(GList *features)
3726 {
3727     size_t len = 0;
3728     GList *tmp;
3729 
3730     for (tmp = features; tmp; tmp = tmp->next) {
3731         const char *name = tmp->data;
3732         if ((len + strlen(name) + 1) >= 75) {
3733             qemu_printf("\n");
3734             len = 0;
3735         }
3736         qemu_printf("%s%s", len == 0 ? "  " : " ", name);
3737         len += strlen(name) + 1;
3738     }
3739     qemu_printf("\n");
3740 }
3741 
3742 /* Sort alphabetically by type name, respecting X86CPUClass::ordering. */
3743 static gint x86_cpu_list_compare(gconstpointer a, gconstpointer b)
3744 {
3745     ObjectClass *class_a = (ObjectClass *)a;
3746     ObjectClass *class_b = (ObjectClass *)b;
3747     X86CPUClass *cc_a = X86_CPU_CLASS(class_a);
3748     X86CPUClass *cc_b = X86_CPU_CLASS(class_b);
3749     char *name_a, *name_b;
3750     int ret;
3751 
3752     if (cc_a->ordering != cc_b->ordering) {
3753         ret = cc_a->ordering - cc_b->ordering;
3754     } else {
3755         name_a = x86_cpu_class_get_model_name(cc_a);
3756         name_b = x86_cpu_class_get_model_name(cc_b);
3757         ret = strcmp(name_a, name_b);
3758         g_free(name_a);
3759         g_free(name_b);
3760     }
3761     return ret;
3762 }
3763 
3764 static GSList *get_sorted_cpu_model_list(void)
3765 {
3766     GSList *list = object_class_get_list(TYPE_X86_CPU, false);
3767     list = g_slist_sort(list, x86_cpu_list_compare);
3768     return list;
3769 }
3770 
3771 static void x86_cpu_list_entry(gpointer data, gpointer user_data)
3772 {
3773     ObjectClass *oc = data;
3774     X86CPUClass *cc = X86_CPU_CLASS(oc);
3775     char *name = x86_cpu_class_get_model_name(cc);
3776     const char *desc = cc->model_description;
3777     if (!desc && cc->cpu_def) {
3778         desc = cc->cpu_def->model_id;
3779     }
3780 
3781     qemu_printf("x86 %-20s  %-48s\n", name, desc);
3782     g_free(name);
3783 }
3784 
3785 /* list available CPU models and flags */
3786 void x86_cpu_list(void)
3787 {
3788     int i, j;
3789     GSList *list;
3790     GList *names = NULL;
3791 
3792     qemu_printf("Available CPUs:\n");
3793     list = get_sorted_cpu_model_list();
3794     g_slist_foreach(list, x86_cpu_list_entry, NULL);
3795     g_slist_free(list);
3796 
3797     names = NULL;
3798     for (i = 0; i < ARRAY_SIZE(feature_word_info); i++) {
3799         FeatureWordInfo *fw = &feature_word_info[i];
3800         for (j = 0; j < 32; j++) {
3801             if (fw->feat_names[j]) {
3802                 names = g_list_append(names, (gpointer)fw->feat_names[j]);
3803             }
3804         }
3805     }
3806 
3807     names = g_list_sort(names, (GCompareFunc)strcmp);
3808 
3809     qemu_printf("\nRecognized CPUID flags:\n");
3810     listflags(names);
3811     qemu_printf("\n");
3812     g_list_free(names);
3813 }
3814 
3815 static void x86_cpu_definition_entry(gpointer data, gpointer user_data)
3816 {
3817     ObjectClass *oc = data;
3818     X86CPUClass *cc = X86_CPU_CLASS(oc);
3819     CpuDefinitionInfoList **cpu_list = user_data;
3820     CpuDefinitionInfoList *entry;
3821     CpuDefinitionInfo *info;
3822 
3823     info = g_malloc0(sizeof(*info));
3824     info->name = x86_cpu_class_get_model_name(cc);
3825     x86_cpu_class_check_missing_features(cc, &info->unavailable_features);
3826     info->has_unavailable_features = true;
3827     info->q_typename = g_strdup(object_class_get_name(oc));
3828     info->migration_safe = cc->migration_safe;
3829     info->has_migration_safe = true;
3830     info->q_static = cc->static_model;
3831 
3832     entry = g_malloc0(sizeof(*entry));
3833     entry->value = info;
3834     entry->next = *cpu_list;
3835     *cpu_list = entry;
3836 }
3837 
3838 CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
3839 {
3840     CpuDefinitionInfoList *cpu_list = NULL;
3841     GSList *list = get_sorted_cpu_model_list();
3842     g_slist_foreach(list, x86_cpu_definition_entry, &cpu_list);
3843     g_slist_free(list);
3844     return cpu_list;
3845 }
3846 
3847 static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w,
3848                                                    bool migratable_only)
3849 {
3850     FeatureWordInfo *wi = &feature_word_info[w];
3851     uint32_t r = 0;
3852 
3853     if (kvm_enabled()) {
3854         switch (wi->type) {
3855         case CPUID_FEATURE_WORD:
3856             r = kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid.eax,
3857                                                         wi->cpuid.ecx,
3858                                                         wi->cpuid.reg);
3859             break;
3860         case MSR_FEATURE_WORD:
3861             r = kvm_arch_get_supported_msr_feature(kvm_state,
3862                         wi->msr.index);
3863             break;
3864         }
3865     } else if (hvf_enabled()) {
3866         if (wi->type != CPUID_FEATURE_WORD) {
3867             return 0;
3868         }
3869         r = hvf_get_supported_cpuid(wi->cpuid.eax,
3870                                     wi->cpuid.ecx,
3871                                     wi->cpuid.reg);
3872     } else if (tcg_enabled()) {
3873         r = wi->tcg_features;
3874     } else {
3875         return ~0;
3876     }
3877     if (migratable_only) {
3878         r &= x86_cpu_get_migratable_flags(w);
3879     }
3880     return r;
3881 }
3882 
3883 static void x86_cpu_report_filtered_features(X86CPU *cpu)
3884 {
3885     FeatureWord w;
3886 
3887     for (w = 0; w < FEATURE_WORDS; w++) {
3888         report_unavailable_features(w, cpu->filtered_features[w]);
3889     }
3890 }
3891 
3892 static void x86_cpu_apply_props(X86CPU *cpu, PropValue *props)
3893 {
3894     PropValue *pv;
3895     for (pv = props; pv->prop; pv++) {
3896         if (!pv->value) {
3897             continue;
3898         }
3899         object_property_parse(OBJECT(cpu), pv->value, pv->prop,
3900                               &error_abort);
3901     }
3902 }
3903 
3904 /* Load data from X86CPUDefinition into a X86CPU object
3905  */
3906 static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp)
3907 {
3908     CPUX86State *env = &cpu->env;
3909     const char *vendor;
3910     char host_vendor[CPUID_VENDOR_SZ + 1];
3911     FeatureWord w;
3912 
3913     /*NOTE: any property set by this function should be returned by
3914      * x86_cpu_static_props(), so static expansion of
3915      * query-cpu-model-expansion is always complete.
3916      */
3917 
3918     /* CPU models only set _minimum_ values for level/xlevel: */
3919     object_property_set_uint(OBJECT(cpu), def->level, "min-level", errp);
3920     object_property_set_uint(OBJECT(cpu), def->xlevel, "min-xlevel", errp);
3921 
3922     object_property_set_int(OBJECT(cpu), def->family, "family", errp);
3923     object_property_set_int(OBJECT(cpu), def->model, "model", errp);
3924     object_property_set_int(OBJECT(cpu), def->stepping, "stepping", errp);
3925     object_property_set_str(OBJECT(cpu), def->model_id, "model-id", errp);
3926     for (w = 0; w < FEATURE_WORDS; w++) {
3927         env->features[w] = def->features[w];
3928     }
3929 
3930     /* legacy-cache defaults to 'off' if CPU model provides cache info */
3931     cpu->legacy_cache = !def->cache_info;
3932 
3933     /* Special cases not set in the X86CPUDefinition structs: */
3934     /* TODO: in-kernel irqchip for hvf */
3935     if (kvm_enabled()) {
3936         if (!kvm_irqchip_in_kernel()) {
3937             x86_cpu_change_kvm_default("x2apic", "off");
3938         }
3939 
3940         x86_cpu_apply_props(cpu, kvm_default_props);
3941     } else if (tcg_enabled()) {
3942         x86_cpu_apply_props(cpu, tcg_default_props);
3943     }
3944 
3945     env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR;
3946 
3947     /* sysenter isn't supported in compatibility mode on AMD,
3948      * syscall isn't supported in compatibility mode on Intel.
3949      * Normally we advertise the actual CPU vendor, but you can
3950      * override this using the 'vendor' property if you want to use
3951      * KVM's sysenter/syscall emulation in compatibility mode and
3952      * when doing cross vendor migration
3953      */
3954     vendor = def->vendor;
3955     if (accel_uses_host_cpuid()) {
3956         uint32_t  ebx = 0, ecx = 0, edx = 0;
3957         host_cpuid(0, 0, NULL, &ebx, &ecx, &edx);
3958         x86_cpu_vendor_words2str(host_vendor, ebx, edx, ecx);
3959         vendor = host_vendor;
3960     }
3961 
3962     object_property_set_str(OBJECT(cpu), vendor, "vendor", errp);
3963 
3964 }
3965 
3966 #ifndef CONFIG_USER_ONLY
3967 /* Return a QDict containing keys for all properties that can be included
3968  * in static expansion of CPU models. All properties set by x86_cpu_load_def()
3969  * must be included in the dictionary.
3970  */
3971 static QDict *x86_cpu_static_props(void)
3972 {
3973     FeatureWord w;
3974     int i;
3975     static const char *props[] = {
3976         "min-level",
3977         "min-xlevel",
3978         "family",
3979         "model",
3980         "stepping",
3981         "model-id",
3982         "vendor",
3983         "lmce",
3984         NULL,
3985     };
3986     static QDict *d;
3987 
3988     if (d) {
3989         return d;
3990     }
3991 
3992     d = qdict_new();
3993     for (i = 0; props[i]; i++) {
3994         qdict_put_null(d, props[i]);
3995     }
3996 
3997     for (w = 0; w < FEATURE_WORDS; w++) {
3998         FeatureWordInfo *fi = &feature_word_info[w];
3999         int bit;
4000         for (bit = 0; bit < 32; bit++) {
4001             if (!fi->feat_names[bit]) {
4002                 continue;
4003             }
4004             qdict_put_null(d, fi->feat_names[bit]);
4005         }
4006     }
4007 
4008     return d;
4009 }
4010 
4011 /* Add an entry to @props dict, with the value for property. */
4012 static void x86_cpu_expand_prop(X86CPU *cpu, QDict *props, const char *prop)
4013 {
4014     QObject *value = object_property_get_qobject(OBJECT(cpu), prop,
4015                                                  &error_abort);
4016 
4017     qdict_put_obj(props, prop, value);
4018 }
4019 
4020 /* Convert CPU model data from X86CPU object to a property dictionary
4021  * that can recreate exactly the same CPU model.
4022  */
4023 static void x86_cpu_to_dict(X86CPU *cpu, QDict *props)
4024 {
4025     QDict *sprops = x86_cpu_static_props();
4026     const QDictEntry *e;
4027 
4028     for (e = qdict_first(sprops); e; e = qdict_next(sprops, e)) {
4029         const char *prop = qdict_entry_key(e);
4030         x86_cpu_expand_prop(cpu, props, prop);
4031     }
4032 }
4033 
4034 /* Convert CPU model data from X86CPU object to a property dictionary
4035  * that can recreate exactly the same CPU model, including every
4036  * writeable QOM property.
4037  */
4038 static void x86_cpu_to_dict_full(X86CPU *cpu, QDict *props)
4039 {
4040     ObjectPropertyIterator iter;
4041     ObjectProperty *prop;
4042 
4043     object_property_iter_init(&iter, OBJECT(cpu));
4044     while ((prop = object_property_iter_next(&iter))) {
4045         /* skip read-only or write-only properties */
4046         if (!prop->get || !prop->set) {
4047             continue;
4048         }
4049 
4050         /* "hotplugged" is the only property that is configurable
4051          * on the command-line but will be set differently on CPUs
4052          * created using "-cpu ... -smp ..." and by CPUs created
4053          * on the fly by x86_cpu_from_model() for querying. Skip it.
4054          */
4055         if (!strcmp(prop->name, "hotplugged")) {
4056             continue;
4057         }
4058         x86_cpu_expand_prop(cpu, props, prop->name);
4059     }
4060 }
4061 
4062 static void object_apply_props(Object *obj, QDict *props, Error **errp)
4063 {
4064     const QDictEntry *prop;
4065     Error *err = NULL;
4066 
4067     for (prop = qdict_first(props); prop; prop = qdict_next(props, prop)) {
4068         object_property_set_qobject(obj, qdict_entry_value(prop),
4069                                          qdict_entry_key(prop), &err);
4070         if (err) {
4071             break;
4072         }
4073     }
4074 
4075     error_propagate(errp, err);
4076 }
4077 
4078 /* Create X86CPU object according to model+props specification */
4079 static X86CPU *x86_cpu_from_model(const char *model, QDict *props, Error **errp)
4080 {
4081     X86CPU *xc = NULL;
4082     X86CPUClass *xcc;
4083     Error *err = NULL;
4084 
4085     xcc = X86_CPU_CLASS(cpu_class_by_name(TYPE_X86_CPU, model));
4086     if (xcc == NULL) {
4087         error_setg(&err, "CPU model '%s' not found", model);
4088         goto out;
4089     }
4090 
4091     xc = X86_CPU(object_new(object_class_get_name(OBJECT_CLASS(xcc))));
4092     if (props) {
4093         object_apply_props(OBJECT(xc), props, &err);
4094         if (err) {
4095             goto out;
4096         }
4097     }
4098 
4099     x86_cpu_expand_features(xc, &err);
4100     if (err) {
4101         goto out;
4102     }
4103 
4104 out:
4105     if (err) {
4106         error_propagate(errp, err);
4107         object_unref(OBJECT(xc));
4108         xc = NULL;
4109     }
4110     return xc;
4111 }
4112 
4113 CpuModelExpansionInfo *
4114 qmp_query_cpu_model_expansion(CpuModelExpansionType type,
4115                                                       CpuModelInfo *model,
4116                                                       Error **errp)
4117 {
4118     X86CPU *xc = NULL;
4119     Error *err = NULL;
4120     CpuModelExpansionInfo *ret = g_new0(CpuModelExpansionInfo, 1);
4121     QDict *props = NULL;
4122     const char *base_name;
4123 
4124     xc = x86_cpu_from_model(model->name,
4125                             model->has_props ?
4126                                 qobject_to(QDict, model->props) :
4127                                 NULL, &err);
4128     if (err) {
4129         goto out;
4130     }
4131 
4132     props = qdict_new();
4133     ret->model = g_new0(CpuModelInfo, 1);
4134     ret->model->props = QOBJECT(props);
4135     ret->model->has_props = true;
4136 
4137     switch (type) {
4138     case CPU_MODEL_EXPANSION_TYPE_STATIC:
4139         /* Static expansion will be based on "base" only */
4140         base_name = "base";
4141         x86_cpu_to_dict(xc, props);
4142     break;
4143     case CPU_MODEL_EXPANSION_TYPE_FULL:
4144         /* As we don't return every single property, full expansion needs
4145          * to keep the original model name+props, and add extra
4146          * properties on top of that.
4147          */
4148         base_name = model->name;
4149         x86_cpu_to_dict_full(xc, props);
4150     break;
4151     default:
4152         error_setg(&err, "Unsupported expansion type");
4153         goto out;
4154     }
4155 
4156     x86_cpu_to_dict(xc, props);
4157 
4158     ret->model->name = g_strdup(base_name);
4159 
4160 out:
4161     object_unref(OBJECT(xc));
4162     if (err) {
4163         error_propagate(errp, err);
4164         qapi_free_CpuModelExpansionInfo(ret);
4165         ret = NULL;
4166     }
4167     return ret;
4168 }
4169 #endif  /* !CONFIG_USER_ONLY */
4170 
4171 static gchar *x86_gdb_arch_name(CPUState *cs)
4172 {
4173 #ifdef TARGET_X86_64
4174     return g_strdup("i386:x86-64");
4175 #else
4176     return g_strdup("i386");
4177 #endif
4178 }
4179 
4180 static void x86_cpu_cpudef_class_init(ObjectClass *oc, void *data)
4181 {
4182     X86CPUDefinition *cpudef = data;
4183     X86CPUClass *xcc = X86_CPU_CLASS(oc);
4184 
4185     xcc->cpu_def = cpudef;
4186     xcc->migration_safe = true;
4187 }
4188 
4189 static void x86_register_cpudef_type(X86CPUDefinition *def)
4190 {
4191     char *typename = x86_cpu_type_name(def->name);
4192     TypeInfo ti = {
4193         .name = typename,
4194         .parent = TYPE_X86_CPU,
4195         .class_init = x86_cpu_cpudef_class_init,
4196         .class_data = def,
4197     };
4198 
4199     /* AMD aliases are handled at runtime based on CPUID vendor, so
4200      * they shouldn't be set on the CPU model table.
4201      */
4202     assert(!(def->features[FEAT_8000_0001_EDX] & CPUID_EXT2_AMD_ALIASES));
4203     /* catch mistakes instead of silently truncating model_id when too long */
4204     assert(def->model_id && strlen(def->model_id) <= 48);
4205 
4206 
4207     type_register(&ti);
4208     g_free(typename);
4209 }
4210 
4211 #if !defined(CONFIG_USER_ONLY)
4212 
4213 void cpu_clear_apic_feature(CPUX86State *env)
4214 {
4215     env->features[FEAT_1_EDX] &= ~CPUID_APIC;
4216 }
4217 
4218 #endif /* !CONFIG_USER_ONLY */
4219 
4220 void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
4221                    uint32_t *eax, uint32_t *ebx,
4222                    uint32_t *ecx, uint32_t *edx)
4223 {
4224     X86CPU *cpu = x86_env_get_cpu(env);
4225     CPUState *cs = CPU(cpu);
4226     uint32_t pkg_offset;
4227     uint32_t limit;
4228     uint32_t signature[3];
4229 
4230     /* Calculate & apply limits for different index ranges */
4231     if (index >= 0xC0000000) {
4232         limit = env->cpuid_xlevel2;
4233     } else if (index >= 0x80000000) {
4234         limit = env->cpuid_xlevel;
4235     } else if (index >= 0x40000000) {
4236         limit = 0x40000001;
4237     } else {
4238         limit = env->cpuid_level;
4239     }
4240 
4241     if (index > limit) {
4242         /* Intel documentation states that invalid EAX input will
4243          * return the same information as EAX=cpuid_level
4244          * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID)
4245          */
4246         index = env->cpuid_level;
4247     }
4248 
4249     switch(index) {
4250     case 0:
4251         *eax = env->cpuid_level;
4252         *ebx = env->cpuid_vendor1;
4253         *edx = env->cpuid_vendor2;
4254         *ecx = env->cpuid_vendor3;
4255         break;
4256     case 1:
4257         *eax = env->cpuid_version;
4258         *ebx = (cpu->apic_id << 24) |
4259                8 << 8; /* CLFLUSH size in quad words, Linux wants it. */
4260         *ecx = env->features[FEAT_1_ECX];
4261         if ((*ecx & CPUID_EXT_XSAVE) && (env->cr[4] & CR4_OSXSAVE_MASK)) {
4262             *ecx |= CPUID_EXT_OSXSAVE;
4263         }
4264         *edx = env->features[FEAT_1_EDX];
4265         if (cs->nr_cores * cs->nr_threads > 1) {
4266             *ebx |= (cs->nr_cores * cs->nr_threads) << 16;
4267             *edx |= CPUID_HT;
4268         }
4269         break;
4270     case 2:
4271         /* cache info: needed for Pentium Pro compatibility */
4272         if (cpu->cache_info_passthrough) {
4273             host_cpuid(index, 0, eax, ebx, ecx, edx);
4274             break;
4275         }
4276         *eax = 1; /* Number of CPUID[EAX=2] calls required */
4277         *ebx = 0;
4278         if (!cpu->enable_l3_cache) {
4279             *ecx = 0;
4280         } else {
4281             *ecx = cpuid2_cache_descriptor(env->cache_info_cpuid2.l3_cache);
4282         }
4283         *edx = (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1d_cache) << 16) |
4284                (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1i_cache) <<  8) |
4285                (cpuid2_cache_descriptor(env->cache_info_cpuid2.l2_cache));
4286         break;
4287     case 4:
4288         /* cache info: needed for Core compatibility */
4289         if (cpu->cache_info_passthrough) {
4290             host_cpuid(index, count, eax, ebx, ecx, edx);
4291             /* QEMU gives out its own APIC IDs, never pass down bits 31..26.  */
4292             *eax &= ~0xFC000000;
4293             if ((*eax & 31) && cs->nr_cores > 1) {
4294                 *eax |= (cs->nr_cores - 1) << 26;
4295             }
4296         } else {
4297             *eax = 0;
4298             switch (count) {
4299             case 0: /* L1 dcache info */
4300                 encode_cache_cpuid4(env->cache_info_cpuid4.l1d_cache,
4301                                     1, cs->nr_cores,
4302                                     eax, ebx, ecx, edx);
4303                 break;
4304             case 1: /* L1 icache info */
4305                 encode_cache_cpuid4(env->cache_info_cpuid4.l1i_cache,
4306                                     1, cs->nr_cores,
4307                                     eax, ebx, ecx, edx);
4308                 break;
4309             case 2: /* L2 cache info */
4310                 encode_cache_cpuid4(env->cache_info_cpuid4.l2_cache,
4311                                     cs->nr_threads, cs->nr_cores,
4312                                     eax, ebx, ecx, edx);
4313                 break;
4314             case 3: /* L3 cache info */
4315                 pkg_offset = apicid_pkg_offset(cs->nr_cores, cs->nr_threads);
4316                 if (cpu->enable_l3_cache) {
4317                     encode_cache_cpuid4(env->cache_info_cpuid4.l3_cache,
4318                                         (1 << pkg_offset), cs->nr_cores,
4319                                         eax, ebx, ecx, edx);
4320                     break;
4321                 }
4322                 /* fall through */
4323             default: /* end of info */
4324                 *eax = *ebx = *ecx = *edx = 0;
4325                 break;
4326             }
4327         }
4328         break;
4329     case 5:
4330         /* MONITOR/MWAIT Leaf */
4331         *eax = cpu->mwait.eax; /* Smallest monitor-line size in bytes */
4332         *ebx = cpu->mwait.ebx; /* Largest monitor-line size in bytes */
4333         *ecx = cpu->mwait.ecx; /* flags */
4334         *edx = cpu->mwait.edx; /* mwait substates */
4335         break;
4336     case 6:
4337         /* Thermal and Power Leaf */
4338         *eax = env->features[FEAT_6_EAX];
4339         *ebx = 0;
4340         *ecx = 0;
4341         *edx = 0;
4342         break;
4343     case 7:
4344         /* Structured Extended Feature Flags Enumeration Leaf */
4345         if (count == 0) {
4346             *eax = 0; /* Maximum ECX value for sub-leaves */
4347             *ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */
4348             *ecx = env->features[FEAT_7_0_ECX]; /* Feature flags */
4349             if ((*ecx & CPUID_7_0_ECX_PKU) && env->cr[4] & CR4_PKE_MASK) {
4350                 *ecx |= CPUID_7_0_ECX_OSPKE;
4351             }
4352             *edx = env->features[FEAT_7_0_EDX]; /* Feature flags */
4353         } else {
4354             *eax = 0;
4355             *ebx = 0;
4356             *ecx = 0;
4357             *edx = 0;
4358         }
4359         break;
4360     case 9:
4361         /* Direct Cache Access Information Leaf */
4362         *eax = 0; /* Bits 0-31 in DCA_CAP MSR */
4363         *ebx = 0;
4364         *ecx = 0;
4365         *edx = 0;
4366         break;
4367     case 0xA:
4368         /* Architectural Performance Monitoring Leaf */
4369         if (kvm_enabled() && cpu->enable_pmu) {
4370             KVMState *s = cs->kvm_state;
4371 
4372             *eax = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EAX);
4373             *ebx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EBX);
4374             *ecx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_ECX);
4375             *edx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EDX);
4376         } else if (hvf_enabled() && cpu->enable_pmu) {
4377             *eax = hvf_get_supported_cpuid(0xA, count, R_EAX);
4378             *ebx = hvf_get_supported_cpuid(0xA, count, R_EBX);
4379             *ecx = hvf_get_supported_cpuid(0xA, count, R_ECX);
4380             *edx = hvf_get_supported_cpuid(0xA, count, R_EDX);
4381         } else {
4382             *eax = 0;
4383             *ebx = 0;
4384             *ecx = 0;
4385             *edx = 0;
4386         }
4387         break;
4388     case 0xB:
4389         /* Extended Topology Enumeration Leaf */
4390         if (!cpu->enable_cpuid_0xb) {
4391                 *eax = *ebx = *ecx = *edx = 0;
4392                 break;
4393         }
4394 
4395         *ecx = count & 0xff;
4396         *edx = cpu->apic_id;
4397 
4398         switch (count) {
4399         case 0:
4400             *eax = apicid_core_offset(cs->nr_cores, cs->nr_threads);
4401             *ebx = cs->nr_threads;
4402             *ecx |= CPUID_TOPOLOGY_LEVEL_SMT;
4403             break;
4404         case 1:
4405             *eax = apicid_pkg_offset(cs->nr_cores, cs->nr_threads);
4406             *ebx = cs->nr_cores * cs->nr_threads;
4407             *ecx |= CPUID_TOPOLOGY_LEVEL_CORE;
4408             break;
4409         default:
4410             *eax = 0;
4411             *ebx = 0;
4412             *ecx |= CPUID_TOPOLOGY_LEVEL_INVALID;
4413         }
4414 
4415         assert(!(*eax & ~0x1f));
4416         *ebx &= 0xffff; /* The count doesn't need to be reliable. */
4417         break;
4418     case 0xD: {
4419         /* Processor Extended State */
4420         *eax = 0;
4421         *ebx = 0;
4422         *ecx = 0;
4423         *edx = 0;
4424         if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
4425             break;
4426         }
4427 
4428         if (count == 0) {
4429             *ecx = xsave_area_size(x86_cpu_xsave_components(cpu));
4430             *eax = env->features[FEAT_XSAVE_COMP_LO];
4431             *edx = env->features[FEAT_XSAVE_COMP_HI];
4432             *ebx = xsave_area_size(env->xcr0);
4433         } else if (count == 1) {
4434             *eax = env->features[FEAT_XSAVE];
4435         } else if (count < ARRAY_SIZE(x86_ext_save_areas)) {
4436             if ((x86_cpu_xsave_components(cpu) >> count) & 1) {
4437                 const ExtSaveArea *esa = &x86_ext_save_areas[count];
4438                 *eax = esa->size;
4439                 *ebx = esa->offset;
4440             }
4441         }
4442         break;
4443     }
4444     case 0x14: {
4445         /* Intel Processor Trace Enumeration */
4446         *eax = 0;
4447         *ebx = 0;
4448         *ecx = 0;
4449         *edx = 0;
4450         if (!(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) ||
4451             !kvm_enabled()) {
4452             break;
4453         }
4454 
4455         if (count == 0) {
4456             *eax = INTEL_PT_MAX_SUBLEAF;
4457             *ebx = INTEL_PT_MINIMAL_EBX;
4458             *ecx = INTEL_PT_MINIMAL_ECX;
4459         } else if (count == 1) {
4460             *eax = INTEL_PT_MTC_BITMAP | INTEL_PT_ADDR_RANGES_NUM;
4461             *ebx = INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP;
4462         }
4463         break;
4464     }
4465     case 0x40000000:
4466         /*
4467          * CPUID code in kvm_arch_init_vcpu() ignores stuff
4468          * set here, but we restrict to TCG none the less.
4469          */
4470         if (tcg_enabled() && cpu->expose_tcg) {
4471             memcpy(signature, "TCGTCGTCGTCG", 12);
4472             *eax = 0x40000001;
4473             *ebx = signature[0];
4474             *ecx = signature[1];
4475             *edx = signature[2];
4476         } else {
4477             *eax = 0;
4478             *ebx = 0;
4479             *ecx = 0;
4480             *edx = 0;
4481         }
4482         break;
4483     case 0x40000001:
4484         *eax = 0;
4485         *ebx = 0;
4486         *ecx = 0;
4487         *edx = 0;
4488         break;
4489     case 0x80000000:
4490         *eax = env->cpuid_xlevel;
4491         *ebx = env->cpuid_vendor1;
4492         *edx = env->cpuid_vendor2;
4493         *ecx = env->cpuid_vendor3;
4494         break;
4495     case 0x80000001:
4496         *eax = env->cpuid_version;
4497         *ebx = 0;
4498         *ecx = env->features[FEAT_8000_0001_ECX];
4499         *edx = env->features[FEAT_8000_0001_EDX];
4500 
4501         /* The Linux kernel checks for the CMPLegacy bit and
4502          * discards multiple thread information if it is set.
4503          * So don't set it here for Intel to make Linux guests happy.
4504          */
4505         if (cs->nr_cores * cs->nr_threads > 1) {
4506             if (env->cpuid_vendor1 != CPUID_VENDOR_INTEL_1 ||
4507                 env->cpuid_vendor2 != CPUID_VENDOR_INTEL_2 ||
4508                 env->cpuid_vendor3 != CPUID_VENDOR_INTEL_3) {
4509                 *ecx |= 1 << 1;    /* CmpLegacy bit */
4510             }
4511         }
4512         break;
4513     case 0x80000002:
4514     case 0x80000003:
4515     case 0x80000004:
4516         *eax = env->cpuid_model[(index - 0x80000002) * 4 + 0];
4517         *ebx = env->cpuid_model[(index - 0x80000002) * 4 + 1];
4518         *ecx = env->cpuid_model[(index - 0x80000002) * 4 + 2];
4519         *edx = env->cpuid_model[(index - 0x80000002) * 4 + 3];
4520         break;
4521     case 0x80000005:
4522         /* cache info (L1 cache) */
4523         if (cpu->cache_info_passthrough) {
4524             host_cpuid(index, 0, eax, ebx, ecx, edx);
4525             break;
4526         }
4527         *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) | \
4528                (L1_ITLB_2M_ASSOC <<  8) | (L1_ITLB_2M_ENTRIES);
4529         *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) | \
4530                (L1_ITLB_4K_ASSOC <<  8) | (L1_ITLB_4K_ENTRIES);
4531         *ecx = encode_cache_cpuid80000005(env->cache_info_amd.l1d_cache);
4532         *edx = encode_cache_cpuid80000005(env->cache_info_amd.l1i_cache);
4533         break;
4534     case 0x80000006:
4535         /* cache info (L2 cache) */
4536         if (cpu->cache_info_passthrough) {
4537             host_cpuid(index, 0, eax, ebx, ecx, edx);
4538             break;
4539         }
4540         *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) | \
4541                (L2_DTLB_2M_ENTRIES << 16) | \
4542                (AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) | \
4543                (L2_ITLB_2M_ENTRIES);
4544         *ebx = (AMD_ENC_ASSOC(L2_DTLB_4K_ASSOC) << 28) | \
4545                (L2_DTLB_4K_ENTRIES << 16) | \
4546                (AMD_ENC_ASSOC(L2_ITLB_4K_ASSOC) << 12) | \
4547                (L2_ITLB_4K_ENTRIES);
4548         encode_cache_cpuid80000006(env->cache_info_amd.l2_cache,
4549                                    cpu->enable_l3_cache ?
4550                                    env->cache_info_amd.l3_cache : NULL,
4551                                    ecx, edx);
4552         break;
4553     case 0x80000007:
4554         *eax = 0;
4555         *ebx = 0;
4556         *ecx = 0;
4557         *edx = env->features[FEAT_8000_0007_EDX];
4558         break;
4559     case 0x80000008:
4560         /* virtual & phys address size in low 2 bytes. */
4561         if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
4562             /* 64 bit processor */
4563             *eax = cpu->phys_bits; /* configurable physical bits */
4564             if  (env->features[FEAT_7_0_ECX] & CPUID_7_0_ECX_LA57) {
4565                 *eax |= 0x00003900; /* 57 bits virtual */
4566             } else {
4567                 *eax |= 0x00003000; /* 48 bits virtual */
4568             }
4569         } else {
4570             *eax = cpu->phys_bits;
4571         }
4572         *ebx = env->features[FEAT_8000_0008_EBX];
4573         *ecx = 0;
4574         *edx = 0;
4575         if (cs->nr_cores * cs->nr_threads > 1) {
4576             *ecx |= (cs->nr_cores * cs->nr_threads) - 1;
4577         }
4578         break;
4579     case 0x8000000A:
4580         if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
4581             *eax = 0x00000001; /* SVM Revision */
4582             *ebx = 0x00000010; /* nr of ASIDs */
4583             *ecx = 0;
4584             *edx = env->features[FEAT_SVM]; /* optional features */
4585         } else {
4586             *eax = 0;
4587             *ebx = 0;
4588             *ecx = 0;
4589             *edx = 0;
4590         }
4591         break;
4592     case 0x8000001D:
4593         *eax = 0;
4594         if (cpu->cache_info_passthrough) {
4595             host_cpuid(index, count, eax, ebx, ecx, edx);
4596             break;
4597         }
4598         switch (count) {
4599         case 0: /* L1 dcache info */
4600             encode_cache_cpuid8000001d(env->cache_info_amd.l1d_cache, cs,
4601                                        eax, ebx, ecx, edx);
4602             break;
4603         case 1: /* L1 icache info */
4604             encode_cache_cpuid8000001d(env->cache_info_amd.l1i_cache, cs,
4605                                        eax, ebx, ecx, edx);
4606             break;
4607         case 2: /* L2 cache info */
4608             encode_cache_cpuid8000001d(env->cache_info_amd.l2_cache, cs,
4609                                        eax, ebx, ecx, edx);
4610             break;
4611         case 3: /* L3 cache info */
4612             encode_cache_cpuid8000001d(env->cache_info_amd.l3_cache, cs,
4613                                        eax, ebx, ecx, edx);
4614             break;
4615         default: /* end of info */
4616             *eax = *ebx = *ecx = *edx = 0;
4617             break;
4618         }
4619         break;
4620     case 0x8000001E:
4621         assert(cpu->core_id <= 255);
4622         encode_topo_cpuid8000001e(cs, cpu,
4623                                   eax, ebx, ecx, edx);
4624         break;
4625     case 0xC0000000:
4626         *eax = env->cpuid_xlevel2;
4627         *ebx = 0;
4628         *ecx = 0;
4629         *edx = 0;
4630         break;
4631     case 0xC0000001:
4632         /* Support for VIA CPU's CPUID instruction */
4633         *eax = env->cpuid_version;
4634         *ebx = 0;
4635         *ecx = 0;
4636         *edx = env->features[FEAT_C000_0001_EDX];
4637         break;
4638     case 0xC0000002:
4639     case 0xC0000003:
4640     case 0xC0000004:
4641         /* Reserved for the future, and now filled with zero */
4642         *eax = 0;
4643         *ebx = 0;
4644         *ecx = 0;
4645         *edx = 0;
4646         break;
4647     case 0x8000001F:
4648         *eax = sev_enabled() ? 0x2 : 0;
4649         *ebx = sev_get_cbit_position();
4650         *ebx |= sev_get_reduced_phys_bits() << 6;
4651         *ecx = 0;
4652         *edx = 0;
4653         break;
4654     default:
4655         /* reserved values: zero */
4656         *eax = 0;
4657         *ebx = 0;
4658         *ecx = 0;
4659         *edx = 0;
4660         break;
4661     }
4662 }
4663 
4664 /* CPUClass::reset() */
4665 static void x86_cpu_reset(CPUState *s)
4666 {
4667     X86CPU *cpu = X86_CPU(s);
4668     X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu);
4669     CPUX86State *env = &cpu->env;
4670     target_ulong cr4;
4671     uint64_t xcr0;
4672     int i;
4673 
4674     xcc->parent_reset(s);
4675 
4676     memset(env, 0, offsetof(CPUX86State, end_reset_fields));
4677 
4678     env->old_exception = -1;
4679 
4680     /* init to reset state */
4681 
4682     env->hflags2 |= HF2_GIF_MASK;
4683 
4684     cpu_x86_update_cr0(env, 0x60000010);
4685     env->a20_mask = ~0x0;
4686     env->smbase = 0x30000;
4687     env->msr_smi_count = 0;
4688 
4689     env->idt.limit = 0xffff;
4690     env->gdt.limit = 0xffff;
4691     env->ldt.limit = 0xffff;
4692     env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT);
4693     env->tr.limit = 0xffff;
4694     env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT);
4695 
4696     cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff,
4697                            DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK |
4698                            DESC_R_MASK | DESC_A_MASK);
4699     cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff,
4700                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
4701                            DESC_A_MASK);
4702     cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff,
4703                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
4704                            DESC_A_MASK);
4705     cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff,
4706                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
4707                            DESC_A_MASK);
4708     cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff,
4709                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
4710                            DESC_A_MASK);
4711     cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff,
4712                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
4713                            DESC_A_MASK);
4714 
4715     env->eip = 0xfff0;
4716     env->regs[R_EDX] = env->cpuid_version;
4717 
4718     env->eflags = 0x2;
4719 
4720     /* FPU init */
4721     for (i = 0; i < 8; i++) {
4722         env->fptags[i] = 1;
4723     }
4724     cpu_set_fpuc(env, 0x37f);
4725 
4726     env->mxcsr = 0x1f80;
4727     /* All units are in INIT state.  */
4728     env->xstate_bv = 0;
4729 
4730     env->pat = 0x0007040600070406ULL;
4731     env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT;
4732 
4733     memset(env->dr, 0, sizeof(env->dr));
4734     env->dr[6] = DR6_FIXED_1;
4735     env->dr[7] = DR7_FIXED_1;
4736     cpu_breakpoint_remove_all(s, BP_CPU);
4737     cpu_watchpoint_remove_all(s, BP_CPU);
4738 
4739     cr4 = 0;
4740     xcr0 = XSTATE_FP_MASK;
4741 
4742 #ifdef CONFIG_USER_ONLY
4743     /* Enable all the features for user-mode.  */
4744     if (env->features[FEAT_1_EDX] & CPUID_SSE) {
4745         xcr0 |= XSTATE_SSE_MASK;
4746     }
4747     for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
4748         const ExtSaveArea *esa = &x86_ext_save_areas[i];
4749         if (env->features[esa->feature] & esa->bits) {
4750             xcr0 |= 1ull << i;
4751         }
4752     }
4753 
4754     if (env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE) {
4755         cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK;
4756     }
4757     if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_FSGSBASE) {
4758         cr4 |= CR4_FSGSBASE_MASK;
4759     }
4760 #endif
4761 
4762     env->xcr0 = xcr0;
4763     cpu_x86_update_cr4(env, cr4);
4764 
4765     /*
4766      * SDM 11.11.5 requires:
4767      *  - IA32_MTRR_DEF_TYPE MSR.E = 0
4768      *  - IA32_MTRR_PHYSMASKn.V = 0
4769      * All other bits are undefined.  For simplification, zero it all.
4770      */
4771     env->mtrr_deftype = 0;
4772     memset(env->mtrr_var, 0, sizeof(env->mtrr_var));
4773     memset(env->mtrr_fixed, 0, sizeof(env->mtrr_fixed));
4774 
4775     env->interrupt_injected = -1;
4776     env->exception_injected = -1;
4777     env->nmi_injected = false;
4778 #if !defined(CONFIG_USER_ONLY)
4779     /* We hard-wire the BSP to the first CPU. */
4780     apic_designate_bsp(cpu->apic_state, s->cpu_index == 0);
4781 
4782     s->halted = !cpu_is_bsp(cpu);
4783 
4784     if (kvm_enabled()) {
4785         kvm_arch_reset_vcpu(cpu);
4786     }
4787     else if (hvf_enabled()) {
4788         hvf_reset_vcpu(s);
4789     }
4790 #endif
4791 }
4792 
4793 #ifndef CONFIG_USER_ONLY
4794 bool cpu_is_bsp(X86CPU *cpu)
4795 {
4796     return cpu_get_apic_base(cpu->apic_state) & MSR_IA32_APICBASE_BSP;
4797 }
4798 
4799 /* TODO: remove me, when reset over QOM tree is implemented */
4800 static void x86_cpu_machine_reset_cb(void *opaque)
4801 {
4802     X86CPU *cpu = opaque;
4803     cpu_reset(CPU(cpu));
4804 }
4805 #endif
4806 
4807 static void mce_init(X86CPU *cpu)
4808 {
4809     CPUX86State *cenv = &cpu->env;
4810     unsigned int bank;
4811 
4812     if (((cenv->cpuid_version >> 8) & 0xf) >= 6
4813         && (cenv->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) ==
4814             (CPUID_MCE | CPUID_MCA)) {
4815         cenv->mcg_cap = MCE_CAP_DEF | MCE_BANKS_DEF |
4816                         (cpu->enable_lmce ? MCG_LMCE_P : 0);
4817         cenv->mcg_ctl = ~(uint64_t)0;
4818         for (bank = 0; bank < MCE_BANKS_DEF; bank++) {
4819             cenv->mce_banks[bank * 4] = ~(uint64_t)0;
4820         }
4821     }
4822 }
4823 
4824 #ifndef CONFIG_USER_ONLY
4825 APICCommonClass *apic_get_class(void)
4826 {
4827     const char *apic_type = "apic";
4828 
4829     /* TODO: in-kernel irqchip for hvf */
4830     if (kvm_apic_in_kernel()) {
4831         apic_type = "kvm-apic";
4832     } else if (xen_enabled()) {
4833         apic_type = "xen-apic";
4834     }
4835 
4836     return APIC_COMMON_CLASS(object_class_by_name(apic_type));
4837 }
4838 
4839 static void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
4840 {
4841     APICCommonState *apic;
4842     ObjectClass *apic_class = OBJECT_CLASS(apic_get_class());
4843 
4844     cpu->apic_state = DEVICE(object_new(object_class_get_name(apic_class)));
4845 
4846     object_property_add_child(OBJECT(cpu), "lapic",
4847                               OBJECT(cpu->apic_state), &error_abort);
4848     object_unref(OBJECT(cpu->apic_state));
4849 
4850     qdev_prop_set_uint32(cpu->apic_state, "id", cpu->apic_id);
4851     /* TODO: convert to link<> */
4852     apic = APIC_COMMON(cpu->apic_state);
4853     apic->cpu = cpu;
4854     apic->apicbase = APIC_DEFAULT_ADDRESS | MSR_IA32_APICBASE_ENABLE;
4855 }
4856 
4857 static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
4858 {
4859     APICCommonState *apic;
4860     static bool apic_mmio_map_once;
4861 
4862     if (cpu->apic_state == NULL) {
4863         return;
4864     }
4865     object_property_set_bool(OBJECT(cpu->apic_state), true, "realized",
4866                              errp);
4867 
4868     /* Map APIC MMIO area */
4869     apic = APIC_COMMON(cpu->apic_state);
4870     if (!apic_mmio_map_once) {
4871         memory_region_add_subregion_overlap(get_system_memory(),
4872                                             apic->apicbase &
4873                                             MSR_IA32_APICBASE_BASE,
4874                                             &apic->io_memory,
4875                                             0x1000);
4876         apic_mmio_map_once = true;
4877      }
4878 }
4879 
4880 static void x86_cpu_machine_done(Notifier *n, void *unused)
4881 {
4882     X86CPU *cpu = container_of(n, X86CPU, machine_done);
4883     MemoryRegion *smram =
4884         (MemoryRegion *) object_resolve_path("/machine/smram", NULL);
4885 
4886     if (smram) {
4887         cpu->smram = g_new(MemoryRegion, 1);
4888         memory_region_init_alias(cpu->smram, OBJECT(cpu), "smram",
4889                                  smram, 0, 1ull << 32);
4890         memory_region_set_enabled(cpu->smram, true);
4891         memory_region_add_subregion_overlap(cpu->cpu_as_root, 0, cpu->smram, 1);
4892     }
4893 }
4894 #else
4895 static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
4896 {
4897 }
4898 #endif
4899 
4900 /* Note: Only safe for use on x86(-64) hosts */
4901 static uint32_t x86_host_phys_bits(void)
4902 {
4903     uint32_t eax;
4904     uint32_t host_phys_bits;
4905 
4906     host_cpuid(0x80000000, 0, &eax, NULL, NULL, NULL);
4907     if (eax >= 0x80000008) {
4908         host_cpuid(0x80000008, 0, &eax, NULL, NULL, NULL);
4909         /* Note: According to AMD doc 25481 rev 2.34 they have a field
4910          * at 23:16 that can specify a maximum physical address bits for
4911          * the guest that can override this value; but I've not seen
4912          * anything with that set.
4913          */
4914         host_phys_bits = eax & 0xff;
4915     } else {
4916         /* It's an odd 64 bit machine that doesn't have the leaf for
4917          * physical address bits; fall back to 36 that's most older
4918          * Intel.
4919          */
4920         host_phys_bits = 36;
4921     }
4922 
4923     return host_phys_bits;
4924 }
4925 
4926 static void x86_cpu_adjust_level(X86CPU *cpu, uint32_t *min, uint32_t value)
4927 {
4928     if (*min < value) {
4929         *min = value;
4930     }
4931 }
4932 
4933 /* Increase cpuid_min_{level,xlevel,xlevel2} automatically, if appropriate */
4934 static void x86_cpu_adjust_feat_level(X86CPU *cpu, FeatureWord w)
4935 {
4936     CPUX86State *env = &cpu->env;
4937     FeatureWordInfo *fi = &feature_word_info[w];
4938     uint32_t eax = fi->cpuid.eax;
4939     uint32_t region = eax & 0xF0000000;
4940 
4941     assert(feature_word_info[w].type == CPUID_FEATURE_WORD);
4942     if (!env->features[w]) {
4943         return;
4944     }
4945 
4946     switch (region) {
4947     case 0x00000000:
4948         x86_cpu_adjust_level(cpu, &env->cpuid_min_level, eax);
4949     break;
4950     case 0x80000000:
4951         x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, eax);
4952     break;
4953     case 0xC0000000:
4954         x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel2, eax);
4955     break;
4956     }
4957 }
4958 
4959 /* Calculate XSAVE components based on the configured CPU feature flags */
4960 static void x86_cpu_enable_xsave_components(X86CPU *cpu)
4961 {
4962     CPUX86State *env = &cpu->env;
4963     int i;
4964     uint64_t mask;
4965 
4966     if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
4967         return;
4968     }
4969 
4970     mask = 0;
4971     for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
4972         const ExtSaveArea *esa = &x86_ext_save_areas[i];
4973         if (env->features[esa->feature] & esa->bits) {
4974             mask |= (1ULL << i);
4975         }
4976     }
4977 
4978     env->features[FEAT_XSAVE_COMP_LO] = mask;
4979     env->features[FEAT_XSAVE_COMP_HI] = mask >> 32;
4980 }
4981 
4982 /***** Steps involved on loading and filtering CPUID data
4983  *
4984  * When initializing and realizing a CPU object, the steps
4985  * involved in setting up CPUID data are:
4986  *
4987  * 1) Loading CPU model definition (X86CPUDefinition). This is
4988  *    implemented by x86_cpu_load_def() and should be completely
4989  *    transparent, as it is done automatically by instance_init.
4990  *    No code should need to look at X86CPUDefinition structs
4991  *    outside instance_init.
4992  *
4993  * 2) CPU expansion. This is done by realize before CPUID
4994  *    filtering, and will make sure host/accelerator data is
4995  *    loaded for CPU models that depend on host capabilities
4996  *    (e.g. "host"). Done by x86_cpu_expand_features().
4997  *
4998  * 3) CPUID filtering. This initializes extra data related to
4999  *    CPUID, and checks if the host supports all capabilities
5000  *    required by the CPU. Runnability of a CPU model is
5001  *    determined at this step. Done by x86_cpu_filter_features().
5002  *
5003  * Some operations don't require all steps to be performed.
5004  * More precisely:
5005  *
5006  * - CPU instance creation (instance_init) will run only CPU
5007  *   model loading. CPU expansion can't run at instance_init-time
5008  *   because host/accelerator data may be not available yet.
5009  * - CPU realization will perform both CPU model expansion and CPUID
5010  *   filtering, and return an error in case one of them fails.
5011  * - query-cpu-definitions needs to run all 3 steps. It needs
5012  *   to run CPUID filtering, as the 'unavailable-features'
5013  *   field is set based on the filtering results.
5014  * - The query-cpu-model-expansion QMP command only needs to run
5015  *   CPU model loading and CPU expansion. It should not filter
5016  *   any CPUID data based on host capabilities.
5017  */
5018 
5019 /* Expand CPU configuration data, based on configured features
5020  * and host/accelerator capabilities when appropriate.
5021  */
5022 static void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
5023 {
5024     CPUX86State *env = &cpu->env;
5025     FeatureWord w;
5026     GList *l;
5027     Error *local_err = NULL;
5028 
5029     /*TODO: Now cpu->max_features doesn't overwrite features
5030      * set using QOM properties, and we can convert
5031      * plus_features & minus_features to global properties
5032      * inside x86_cpu_parse_featurestr() too.
5033      */
5034     if (cpu->max_features) {
5035         for (w = 0; w < FEATURE_WORDS; w++) {
5036             /* Override only features that weren't set explicitly
5037              * by the user.
5038              */
5039             env->features[w] |=
5040                 x86_cpu_get_supported_feature_word(w, cpu->migratable) &
5041                 ~env->user_features[w] & \
5042                 ~feature_word_info[w].no_autoenable_flags;
5043         }
5044     }
5045 
5046     for (l = plus_features; l; l = l->next) {
5047         const char *prop = l->data;
5048         object_property_set_bool(OBJECT(cpu), true, prop, &local_err);
5049         if (local_err) {
5050             goto out;
5051         }
5052     }
5053 
5054     for (l = minus_features; l; l = l->next) {
5055         const char *prop = l->data;
5056         object_property_set_bool(OBJECT(cpu), false, prop, &local_err);
5057         if (local_err) {
5058             goto out;
5059         }
5060     }
5061 
5062     if (!kvm_enabled() || !cpu->expose_kvm) {
5063         env->features[FEAT_KVM] = 0;
5064     }
5065 
5066     x86_cpu_enable_xsave_components(cpu);
5067 
5068     /* CPUID[EAX=7,ECX=0].EBX always increased level automatically: */
5069     x86_cpu_adjust_feat_level(cpu, FEAT_7_0_EBX);
5070     if (cpu->full_cpuid_auto_level) {
5071         x86_cpu_adjust_feat_level(cpu, FEAT_1_EDX);
5072         x86_cpu_adjust_feat_level(cpu, FEAT_1_ECX);
5073         x86_cpu_adjust_feat_level(cpu, FEAT_6_EAX);
5074         x86_cpu_adjust_feat_level(cpu, FEAT_7_0_ECX);
5075         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_EDX);
5076         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_ECX);
5077         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0007_EDX);
5078         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0008_EBX);
5079         x86_cpu_adjust_feat_level(cpu, FEAT_C000_0001_EDX);
5080         x86_cpu_adjust_feat_level(cpu, FEAT_SVM);
5081         x86_cpu_adjust_feat_level(cpu, FEAT_XSAVE);
5082 
5083         /* Intel Processor Trace requires CPUID[0x14] */
5084         if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) &&
5085              kvm_enabled() && cpu->intel_pt_auto_level) {
5086             x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14);
5087         }
5088 
5089         /* SVM requires CPUID[0x8000000A] */
5090         if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
5091             x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000000A);
5092         }
5093 
5094         /* SEV requires CPUID[0x8000001F] */
5095         if (sev_enabled()) {
5096             x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000001F);
5097         }
5098     }
5099 
5100     /* Set cpuid_*level* based on cpuid_min_*level, if not explicitly set */
5101     if (env->cpuid_level == UINT32_MAX) {
5102         env->cpuid_level = env->cpuid_min_level;
5103     }
5104     if (env->cpuid_xlevel == UINT32_MAX) {
5105         env->cpuid_xlevel = env->cpuid_min_xlevel;
5106     }
5107     if (env->cpuid_xlevel2 == UINT32_MAX) {
5108         env->cpuid_xlevel2 = env->cpuid_min_xlevel2;
5109     }
5110 
5111 out:
5112     if (local_err != NULL) {
5113         error_propagate(errp, local_err);
5114     }
5115 }
5116 
5117 /*
5118  * Finishes initialization of CPUID data, filters CPU feature
5119  * words based on host availability of each feature.
5120  *
5121  * Returns: 0 if all flags are supported by the host, non-zero otherwise.
5122  */
5123 static int x86_cpu_filter_features(X86CPU *cpu)
5124 {
5125     CPUX86State *env = &cpu->env;
5126     FeatureWord w;
5127     int rv = 0;
5128 
5129     for (w = 0; w < FEATURE_WORDS; w++) {
5130         uint32_t host_feat =
5131             x86_cpu_get_supported_feature_word(w, false);
5132         uint32_t requested_features = env->features[w];
5133         env->features[w] &= host_feat;
5134         cpu->filtered_features[w] = requested_features & ~env->features[w];
5135         if (cpu->filtered_features[w]) {
5136             rv = 1;
5137         }
5138     }
5139 
5140     if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) &&
5141         kvm_enabled()) {
5142         KVMState *s = CPU(cpu)->kvm_state;
5143         uint32_t eax_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EAX);
5144         uint32_t ebx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EBX);
5145         uint32_t ecx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_ECX);
5146         uint32_t eax_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EAX);
5147         uint32_t ebx_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EBX);
5148 
5149         if (!eax_0 ||
5150            ((ebx_0 & INTEL_PT_MINIMAL_EBX) != INTEL_PT_MINIMAL_EBX) ||
5151            ((ecx_0 & INTEL_PT_MINIMAL_ECX) != INTEL_PT_MINIMAL_ECX) ||
5152            ((eax_1 & INTEL_PT_MTC_BITMAP) != INTEL_PT_MTC_BITMAP) ||
5153            ((eax_1 & INTEL_PT_ADDR_RANGES_NUM_MASK) <
5154                                            INTEL_PT_ADDR_RANGES_NUM) ||
5155            ((ebx_1 & (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) !=
5156                 (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) ||
5157            (ecx_0 & INTEL_PT_IP_LIP)) {
5158             /*
5159              * Processor Trace capabilities aren't configurable, so if the
5160              * host can't emulate the capabilities we report on
5161              * cpu_x86_cpuid(), intel-pt can't be enabled on the current host.
5162              */
5163             env->features[FEAT_7_0_EBX] &= ~CPUID_7_0_EBX_INTEL_PT;
5164             cpu->filtered_features[FEAT_7_0_EBX] |= CPUID_7_0_EBX_INTEL_PT;
5165             rv = 1;
5166         }
5167     }
5168 
5169     return rv;
5170 }
5171 
5172 #define IS_INTEL_CPU(env) ((env)->cpuid_vendor1 == CPUID_VENDOR_INTEL_1 && \
5173                            (env)->cpuid_vendor2 == CPUID_VENDOR_INTEL_2 && \
5174                            (env)->cpuid_vendor3 == CPUID_VENDOR_INTEL_3)
5175 #define IS_AMD_CPU(env) ((env)->cpuid_vendor1 == CPUID_VENDOR_AMD_1 && \
5176                          (env)->cpuid_vendor2 == CPUID_VENDOR_AMD_2 && \
5177                          (env)->cpuid_vendor3 == CPUID_VENDOR_AMD_3)
5178 static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
5179 {
5180     CPUState *cs = CPU(dev);
5181     X86CPU *cpu = X86_CPU(dev);
5182     X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
5183     CPUX86State *env = &cpu->env;
5184     Error *local_err = NULL;
5185     static bool ht_warned;
5186 
5187     if (xcc->host_cpuid_required) {
5188         if (!accel_uses_host_cpuid()) {
5189             char *name = x86_cpu_class_get_model_name(xcc);
5190             error_setg(&local_err, "CPU model '%s' requires KVM", name);
5191             g_free(name);
5192             goto out;
5193         }
5194 
5195         if (enable_cpu_pm) {
5196             host_cpuid(5, 0, &cpu->mwait.eax, &cpu->mwait.ebx,
5197                        &cpu->mwait.ecx, &cpu->mwait.edx);
5198             env->features[FEAT_1_ECX] |= CPUID_EXT_MONITOR;
5199         }
5200     }
5201 
5202     /* mwait extended info: needed for Core compatibility */
5203     /* We always wake on interrupt even if host does not have the capability */
5204     cpu->mwait.ecx |= CPUID_MWAIT_EMX | CPUID_MWAIT_IBE;
5205 
5206     if (cpu->apic_id == UNASSIGNED_APIC_ID) {
5207         error_setg(errp, "apic-id property was not initialized properly");
5208         return;
5209     }
5210 
5211     x86_cpu_expand_features(cpu, &local_err);
5212     if (local_err) {
5213         goto out;
5214     }
5215 
5216     if (x86_cpu_filter_features(cpu) &&
5217         (cpu->check_cpuid || cpu->enforce_cpuid)) {
5218         x86_cpu_report_filtered_features(cpu);
5219         if (cpu->enforce_cpuid) {
5220             error_setg(&local_err,
5221                        accel_uses_host_cpuid() ?
5222                            "Host doesn't support requested features" :
5223                            "TCG doesn't support requested features");
5224             goto out;
5225         }
5226     }
5227 
5228     /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on
5229      * CPUID[1].EDX.
5230      */
5231     if (IS_AMD_CPU(env)) {
5232         env->features[FEAT_8000_0001_EDX] &= ~CPUID_EXT2_AMD_ALIASES;
5233         env->features[FEAT_8000_0001_EDX] |= (env->features[FEAT_1_EDX]
5234            & CPUID_EXT2_AMD_ALIASES);
5235     }
5236 
5237     /* For 64bit systems think about the number of physical bits to present.
5238      * ideally this should be the same as the host; anything other than matching
5239      * the host can cause incorrect guest behaviour.
5240      * QEMU used to pick the magic value of 40 bits that corresponds to
5241      * consumer AMD devices but nothing else.
5242      */
5243     if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
5244         if (accel_uses_host_cpuid()) {
5245             uint32_t host_phys_bits = x86_host_phys_bits();
5246             static bool warned;
5247 
5248             if (cpu->host_phys_bits) {
5249                 /* The user asked for us to use the host physical bits */
5250                 cpu->phys_bits = host_phys_bits;
5251                 if (cpu->host_phys_bits_limit &&
5252                     cpu->phys_bits > cpu->host_phys_bits_limit) {
5253                     cpu->phys_bits = cpu->host_phys_bits_limit;
5254                 }
5255             }
5256 
5257             /* Print a warning if the user set it to a value that's not the
5258              * host value.
5259              */
5260             if (cpu->phys_bits != host_phys_bits && cpu->phys_bits != 0 &&
5261                 !warned) {
5262                 warn_report("Host physical bits (%u)"
5263                             " does not match phys-bits property (%u)",
5264                             host_phys_bits, cpu->phys_bits);
5265                 warned = true;
5266             }
5267 
5268             if (cpu->phys_bits &&
5269                 (cpu->phys_bits > TARGET_PHYS_ADDR_SPACE_BITS ||
5270                 cpu->phys_bits < 32)) {
5271                 error_setg(errp, "phys-bits should be between 32 and %u "
5272                                  " (but is %u)",
5273                                  TARGET_PHYS_ADDR_SPACE_BITS, cpu->phys_bits);
5274                 return;
5275             }
5276         } else {
5277             if (cpu->phys_bits && cpu->phys_bits != TCG_PHYS_ADDR_BITS) {
5278                 error_setg(errp, "TCG only supports phys-bits=%u",
5279                                   TCG_PHYS_ADDR_BITS);
5280                 return;
5281             }
5282         }
5283         /* 0 means it was not explicitly set by the user (or by machine
5284          * compat_props or by the host code above). In this case, the default
5285          * is the value used by TCG (40).
5286          */
5287         if (cpu->phys_bits == 0) {
5288             cpu->phys_bits = TCG_PHYS_ADDR_BITS;
5289         }
5290     } else {
5291         /* For 32 bit systems don't use the user set value, but keep
5292          * phys_bits consistent with what we tell the guest.
5293          */
5294         if (cpu->phys_bits != 0) {
5295             error_setg(errp, "phys-bits is not user-configurable in 32 bit");
5296             return;
5297         }
5298 
5299         if (env->features[FEAT_1_EDX] & CPUID_PSE36) {
5300             cpu->phys_bits = 36;
5301         } else {
5302             cpu->phys_bits = 32;
5303         }
5304     }
5305 
5306     /* Cache information initialization */
5307     if (!cpu->legacy_cache) {
5308         if (!xcc->cpu_def || !xcc->cpu_def->cache_info) {
5309             char *name = x86_cpu_class_get_model_name(xcc);
5310             error_setg(errp,
5311                        "CPU model '%s' doesn't support legacy-cache=off", name);
5312             g_free(name);
5313             return;
5314         }
5315         env->cache_info_cpuid2 = env->cache_info_cpuid4 = env->cache_info_amd =
5316             *xcc->cpu_def->cache_info;
5317     } else {
5318         /* Build legacy cache information */
5319         env->cache_info_cpuid2.l1d_cache = &legacy_l1d_cache;
5320         env->cache_info_cpuid2.l1i_cache = &legacy_l1i_cache;
5321         env->cache_info_cpuid2.l2_cache = &legacy_l2_cache_cpuid2;
5322         env->cache_info_cpuid2.l3_cache = &legacy_l3_cache;
5323 
5324         env->cache_info_cpuid4.l1d_cache = &legacy_l1d_cache;
5325         env->cache_info_cpuid4.l1i_cache = &legacy_l1i_cache;
5326         env->cache_info_cpuid4.l2_cache = &legacy_l2_cache;
5327         env->cache_info_cpuid4.l3_cache = &legacy_l3_cache;
5328 
5329         env->cache_info_amd.l1d_cache = &legacy_l1d_cache_amd;
5330         env->cache_info_amd.l1i_cache = &legacy_l1i_cache_amd;
5331         env->cache_info_amd.l2_cache = &legacy_l2_cache_amd;
5332         env->cache_info_amd.l3_cache = &legacy_l3_cache;
5333     }
5334 
5335 
5336     cpu_exec_realizefn(cs, &local_err);
5337     if (local_err != NULL) {
5338         error_propagate(errp, local_err);
5339         return;
5340     }
5341 
5342 #ifndef CONFIG_USER_ONLY
5343     qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
5344 
5345     if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || smp_cpus > 1) {
5346         x86_cpu_apic_create(cpu, &local_err);
5347         if (local_err != NULL) {
5348             goto out;
5349         }
5350     }
5351 #endif
5352 
5353     mce_init(cpu);
5354 
5355 #ifndef CONFIG_USER_ONLY
5356     if (tcg_enabled()) {
5357         cpu->cpu_as_mem = g_new(MemoryRegion, 1);
5358         cpu->cpu_as_root = g_new(MemoryRegion, 1);
5359 
5360         /* Outer container... */
5361         memory_region_init(cpu->cpu_as_root, OBJECT(cpu), "memory", ~0ull);
5362         memory_region_set_enabled(cpu->cpu_as_root, true);
5363 
5364         /* ... with two regions inside: normal system memory with low
5365          * priority, and...
5366          */
5367         memory_region_init_alias(cpu->cpu_as_mem, OBJECT(cpu), "memory",
5368                                  get_system_memory(), 0, ~0ull);
5369         memory_region_add_subregion_overlap(cpu->cpu_as_root, 0, cpu->cpu_as_mem, 0);
5370         memory_region_set_enabled(cpu->cpu_as_mem, true);
5371 
5372         cs->num_ases = 2;
5373         cpu_address_space_init(cs, 0, "cpu-memory", cs->memory);
5374         cpu_address_space_init(cs, 1, "cpu-smm", cpu->cpu_as_root);
5375 
5376         /* ... SMRAM with higher priority, linked from /machine/smram.  */
5377         cpu->machine_done.notify = x86_cpu_machine_done;
5378         qemu_add_machine_init_done_notifier(&cpu->machine_done);
5379     }
5380 #endif
5381 
5382     qemu_init_vcpu(cs);
5383 
5384     /*
5385      * Most Intel and certain AMD CPUs support hyperthreading. Even though QEMU
5386      * fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
5387      * based on inputs (sockets,cores,threads), it is still better to give
5388      * users a warning.
5389      *
5390      * NOTE: the following code has to follow qemu_init_vcpu(). Otherwise
5391      * cs->nr_threads hasn't be populated yet and the checking is incorrect.
5392      */
5393     if (IS_AMD_CPU(env) &&
5394         !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
5395         cs->nr_threads > 1 && !ht_warned) {
5396             warn_report("This family of AMD CPU doesn't support "
5397                         "hyperthreading(%d)",
5398                         cs->nr_threads);
5399             error_printf("Please configure -smp options properly"
5400                          " or try enabling topoext feature.\n");
5401             ht_warned = true;
5402     }
5403 
5404     x86_cpu_apic_realize(cpu, &local_err);
5405     if (local_err != NULL) {
5406         goto out;
5407     }
5408     cpu_reset(cs);
5409 
5410     xcc->parent_realize(dev, &local_err);
5411 
5412 out:
5413     if (local_err != NULL) {
5414         error_propagate(errp, local_err);
5415         return;
5416     }
5417 }
5418 
5419 static void x86_cpu_unrealizefn(DeviceState *dev, Error **errp)
5420 {
5421     X86CPU *cpu = X86_CPU(dev);
5422     X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
5423     Error *local_err = NULL;
5424 
5425 #ifndef CONFIG_USER_ONLY
5426     cpu_remove_sync(CPU(dev));
5427     qemu_unregister_reset(x86_cpu_machine_reset_cb, dev);
5428 #endif
5429 
5430     if (cpu->apic_state) {
5431         object_unparent(OBJECT(cpu->apic_state));
5432         cpu->apic_state = NULL;
5433     }
5434 
5435     xcc->parent_unrealize(dev, &local_err);
5436     if (local_err != NULL) {
5437         error_propagate(errp, local_err);
5438         return;
5439     }
5440 }
5441 
5442 typedef struct BitProperty {
5443     FeatureWord w;
5444     uint32_t mask;
5445 } BitProperty;
5446 
5447 static void x86_cpu_get_bit_prop(Object *obj, Visitor *v, const char *name,
5448                                  void *opaque, Error **errp)
5449 {
5450     X86CPU *cpu = X86_CPU(obj);
5451     BitProperty *fp = opaque;
5452     uint32_t f = cpu->env.features[fp->w];
5453     bool value = (f & fp->mask) == fp->mask;
5454     visit_type_bool(v, name, &value, errp);
5455 }
5456 
5457 static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
5458                                  void *opaque, Error **errp)
5459 {
5460     DeviceState *dev = DEVICE(obj);
5461     X86CPU *cpu = X86_CPU(obj);
5462     BitProperty *fp = opaque;
5463     Error *local_err = NULL;
5464     bool value;
5465 
5466     if (dev->realized) {
5467         qdev_prop_set_after_realize(dev, name, errp);
5468         return;
5469     }
5470 
5471     visit_type_bool(v, name, &value, &local_err);
5472     if (local_err) {
5473         error_propagate(errp, local_err);
5474         return;
5475     }
5476 
5477     if (value) {
5478         cpu->env.features[fp->w] |= fp->mask;
5479     } else {
5480         cpu->env.features[fp->w] &= ~fp->mask;
5481     }
5482     cpu->env.user_features[fp->w] |= fp->mask;
5483 }
5484 
5485 static void x86_cpu_release_bit_prop(Object *obj, const char *name,
5486                                      void *opaque)
5487 {
5488     BitProperty *prop = opaque;
5489     g_free(prop);
5490 }
5491 
5492 /* Register a boolean property to get/set a single bit in a uint32_t field.
5493  *
5494  * The same property name can be registered multiple times to make it affect
5495  * multiple bits in the same FeatureWord. In that case, the getter will return
5496  * true only if all bits are set.
5497  */
5498 static void x86_cpu_register_bit_prop(X86CPU *cpu,
5499                                       const char *prop_name,
5500                                       FeatureWord w,
5501                                       int bitnr)
5502 {
5503     BitProperty *fp;
5504     ObjectProperty *op;
5505     uint32_t mask = (1UL << bitnr);
5506 
5507     op = object_property_find(OBJECT(cpu), prop_name, NULL);
5508     if (op) {
5509         fp = op->opaque;
5510         assert(fp->w == w);
5511         fp->mask |= mask;
5512     } else {
5513         fp = g_new0(BitProperty, 1);
5514         fp->w = w;
5515         fp->mask = mask;
5516         object_property_add(OBJECT(cpu), prop_name, "bool",
5517                             x86_cpu_get_bit_prop,
5518                             x86_cpu_set_bit_prop,
5519                             x86_cpu_release_bit_prop, fp, &error_abort);
5520     }
5521 }
5522 
5523 static void x86_cpu_register_feature_bit_props(X86CPU *cpu,
5524                                                FeatureWord w,
5525                                                int bitnr)
5526 {
5527     FeatureWordInfo *fi = &feature_word_info[w];
5528     const char *name = fi->feat_names[bitnr];
5529 
5530     if (!name) {
5531         return;
5532     }
5533 
5534     /* Property names should use "-" instead of "_".
5535      * Old names containing underscores are registered as aliases
5536      * using object_property_add_alias()
5537      */
5538     assert(!strchr(name, '_'));
5539     /* aliases don't use "|" delimiters anymore, they are registered
5540      * manually using object_property_add_alias() */
5541     assert(!strchr(name, '|'));
5542     x86_cpu_register_bit_prop(cpu, name, w, bitnr);
5543 }
5544 
5545 static GuestPanicInformation *x86_cpu_get_crash_info(CPUState *cs)
5546 {
5547     X86CPU *cpu = X86_CPU(cs);
5548     CPUX86State *env = &cpu->env;
5549     GuestPanicInformation *panic_info = NULL;
5550 
5551     if (env->features[FEAT_HYPERV_EDX] & HV_GUEST_CRASH_MSR_AVAILABLE) {
5552         panic_info = g_malloc0(sizeof(GuestPanicInformation));
5553 
5554         panic_info->type = GUEST_PANIC_INFORMATION_TYPE_HYPER_V;
5555 
5556         assert(HV_CRASH_PARAMS >= 5);
5557         panic_info->u.hyper_v.arg1 = env->msr_hv_crash_params[0];
5558         panic_info->u.hyper_v.arg2 = env->msr_hv_crash_params[1];
5559         panic_info->u.hyper_v.arg3 = env->msr_hv_crash_params[2];
5560         panic_info->u.hyper_v.arg4 = env->msr_hv_crash_params[3];
5561         panic_info->u.hyper_v.arg5 = env->msr_hv_crash_params[4];
5562     }
5563 
5564     return panic_info;
5565 }
5566 static void x86_cpu_get_crash_info_qom(Object *obj, Visitor *v,
5567                                        const char *name, void *opaque,
5568                                        Error **errp)
5569 {
5570     CPUState *cs = CPU(obj);
5571     GuestPanicInformation *panic_info;
5572 
5573     if (!cs->crash_occurred) {
5574         error_setg(errp, "No crash occured");
5575         return;
5576     }
5577 
5578     panic_info = x86_cpu_get_crash_info(cs);
5579     if (panic_info == NULL) {
5580         error_setg(errp, "No crash information");
5581         return;
5582     }
5583 
5584     visit_type_GuestPanicInformation(v, "crash-information", &panic_info,
5585                                      errp);
5586     qapi_free_GuestPanicInformation(panic_info);
5587 }
5588 
5589 static void x86_cpu_initfn(Object *obj)
5590 {
5591     CPUState *cs = CPU(obj);
5592     X86CPU *cpu = X86_CPU(obj);
5593     X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
5594     CPUX86State *env = &cpu->env;
5595     FeatureWord w;
5596 
5597     cs->env_ptr = env;
5598 
5599     object_property_add(obj, "family", "int",
5600                         x86_cpuid_version_get_family,
5601                         x86_cpuid_version_set_family, NULL, NULL, NULL);
5602     object_property_add(obj, "model", "int",
5603                         x86_cpuid_version_get_model,
5604                         x86_cpuid_version_set_model, NULL, NULL, NULL);
5605     object_property_add(obj, "stepping", "int",
5606                         x86_cpuid_version_get_stepping,
5607                         x86_cpuid_version_set_stepping, NULL, NULL, NULL);
5608     object_property_add_str(obj, "vendor",
5609                             x86_cpuid_get_vendor,
5610                             x86_cpuid_set_vendor, NULL);
5611     object_property_add_str(obj, "model-id",
5612                             x86_cpuid_get_model_id,
5613                             x86_cpuid_set_model_id, NULL);
5614     object_property_add(obj, "tsc-frequency", "int",
5615                         x86_cpuid_get_tsc_freq,
5616                         x86_cpuid_set_tsc_freq, NULL, NULL, NULL);
5617     object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo",
5618                         x86_cpu_get_feature_words,
5619                         NULL, NULL, (void *)env->features, NULL);
5620     object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo",
5621                         x86_cpu_get_feature_words,
5622                         NULL, NULL, (void *)cpu->filtered_features, NULL);
5623 
5624     object_property_add(obj, "crash-information", "GuestPanicInformation",
5625                         x86_cpu_get_crash_info_qom, NULL, NULL, NULL, NULL);
5626 
5627     cpu->hyperv_spinlock_attempts = HYPERV_SPINLOCK_NEVER_RETRY;
5628 
5629     for (w = 0; w < FEATURE_WORDS; w++) {
5630         int bitnr;
5631 
5632         for (bitnr = 0; bitnr < 32; bitnr++) {
5633             x86_cpu_register_feature_bit_props(cpu, w, bitnr);
5634         }
5635     }
5636 
5637     object_property_add_alias(obj, "sse3", obj, "pni", &error_abort);
5638     object_property_add_alias(obj, "pclmuldq", obj, "pclmulqdq", &error_abort);
5639     object_property_add_alias(obj, "sse4-1", obj, "sse4.1", &error_abort);
5640     object_property_add_alias(obj, "sse4-2", obj, "sse4.2", &error_abort);
5641     object_property_add_alias(obj, "xd", obj, "nx", &error_abort);
5642     object_property_add_alias(obj, "ffxsr", obj, "fxsr-opt", &error_abort);
5643     object_property_add_alias(obj, "i64", obj, "lm", &error_abort);
5644 
5645     object_property_add_alias(obj, "ds_cpl", obj, "ds-cpl", &error_abort);
5646     object_property_add_alias(obj, "tsc_adjust", obj, "tsc-adjust", &error_abort);
5647     object_property_add_alias(obj, "fxsr_opt", obj, "fxsr-opt", &error_abort);
5648     object_property_add_alias(obj, "lahf_lm", obj, "lahf-lm", &error_abort);
5649     object_property_add_alias(obj, "cmp_legacy", obj, "cmp-legacy", &error_abort);
5650     object_property_add_alias(obj, "nodeid_msr", obj, "nodeid-msr", &error_abort);
5651     object_property_add_alias(obj, "perfctr_core", obj, "perfctr-core", &error_abort);
5652     object_property_add_alias(obj, "perfctr_nb", obj, "perfctr-nb", &error_abort);
5653     object_property_add_alias(obj, "kvm_nopiodelay", obj, "kvm-nopiodelay", &error_abort);
5654     object_property_add_alias(obj, "kvm_mmu", obj, "kvm-mmu", &error_abort);
5655     object_property_add_alias(obj, "kvm_asyncpf", obj, "kvm-asyncpf", &error_abort);
5656     object_property_add_alias(obj, "kvm_steal_time", obj, "kvm-steal-time", &error_abort);
5657     object_property_add_alias(obj, "kvm_pv_eoi", obj, "kvm-pv-eoi", &error_abort);
5658     object_property_add_alias(obj, "kvm_pv_unhalt", obj, "kvm-pv-unhalt", &error_abort);
5659     object_property_add_alias(obj, "svm_lock", obj, "svm-lock", &error_abort);
5660     object_property_add_alias(obj, "nrip_save", obj, "nrip-save", &error_abort);
5661     object_property_add_alias(obj, "tsc_scale", obj, "tsc-scale", &error_abort);
5662     object_property_add_alias(obj, "vmcb_clean", obj, "vmcb-clean", &error_abort);
5663     object_property_add_alias(obj, "pause_filter", obj, "pause-filter", &error_abort);
5664     object_property_add_alias(obj, "sse4_1", obj, "sse4.1", &error_abort);
5665     object_property_add_alias(obj, "sse4_2", obj, "sse4.2", &error_abort);
5666 
5667     if (xcc->cpu_def) {
5668         x86_cpu_load_def(cpu, xcc->cpu_def, &error_abort);
5669     }
5670 }
5671 
5672 static int64_t x86_cpu_get_arch_id(CPUState *cs)
5673 {
5674     X86CPU *cpu = X86_CPU(cs);
5675 
5676     return cpu->apic_id;
5677 }
5678 
5679 static bool x86_cpu_get_paging_enabled(const CPUState *cs)
5680 {
5681     X86CPU *cpu = X86_CPU(cs);
5682 
5683     return cpu->env.cr[0] & CR0_PG_MASK;
5684 }
5685 
5686 static void x86_cpu_set_pc(CPUState *cs, vaddr value)
5687 {
5688     X86CPU *cpu = X86_CPU(cs);
5689 
5690     cpu->env.eip = value;
5691 }
5692 
5693 static void x86_cpu_synchronize_from_tb(CPUState *cs, TranslationBlock *tb)
5694 {
5695     X86CPU *cpu = X86_CPU(cs);
5696 
5697     cpu->env.eip = tb->pc - tb->cs_base;
5698 }
5699 
5700 int x86_cpu_pending_interrupt(CPUState *cs, int interrupt_request)
5701 {
5702     X86CPU *cpu = X86_CPU(cs);
5703     CPUX86State *env = &cpu->env;
5704 
5705 #if !defined(CONFIG_USER_ONLY)
5706     if (interrupt_request & CPU_INTERRUPT_POLL) {
5707         return CPU_INTERRUPT_POLL;
5708     }
5709 #endif
5710     if (interrupt_request & CPU_INTERRUPT_SIPI) {
5711         return CPU_INTERRUPT_SIPI;
5712     }
5713 
5714     if (env->hflags2 & HF2_GIF_MASK) {
5715         if ((interrupt_request & CPU_INTERRUPT_SMI) &&
5716             !(env->hflags & HF_SMM_MASK)) {
5717             return CPU_INTERRUPT_SMI;
5718         } else if ((interrupt_request & CPU_INTERRUPT_NMI) &&
5719                    !(env->hflags2 & HF2_NMI_MASK)) {
5720             return CPU_INTERRUPT_NMI;
5721         } else if (interrupt_request & CPU_INTERRUPT_MCE) {
5722             return CPU_INTERRUPT_MCE;
5723         } else if ((interrupt_request & CPU_INTERRUPT_HARD) &&
5724                    (((env->hflags2 & HF2_VINTR_MASK) &&
5725                      (env->hflags2 & HF2_HIF_MASK)) ||
5726                     (!(env->hflags2 & HF2_VINTR_MASK) &&
5727                      (env->eflags & IF_MASK &&
5728                       !(env->hflags & HF_INHIBIT_IRQ_MASK))))) {
5729             return CPU_INTERRUPT_HARD;
5730 #if !defined(CONFIG_USER_ONLY)
5731         } else if ((interrupt_request & CPU_INTERRUPT_VIRQ) &&
5732                    (env->eflags & IF_MASK) &&
5733                    !(env->hflags & HF_INHIBIT_IRQ_MASK)) {
5734             return CPU_INTERRUPT_VIRQ;
5735 #endif
5736         }
5737     }
5738 
5739     return 0;
5740 }
5741 
5742 static bool x86_cpu_has_work(CPUState *cs)
5743 {
5744     return x86_cpu_pending_interrupt(cs, cs->interrupt_request) != 0;
5745 }
5746 
5747 static void x86_disas_set_info(CPUState *cs, disassemble_info *info)
5748 {
5749     X86CPU *cpu = X86_CPU(cs);
5750     CPUX86State *env = &cpu->env;
5751 
5752     info->mach = (env->hflags & HF_CS64_MASK ? bfd_mach_x86_64
5753                   : env->hflags & HF_CS32_MASK ? bfd_mach_i386_i386
5754                   : bfd_mach_i386_i8086);
5755     info->print_insn = print_insn_i386;
5756 
5757     info->cap_arch = CS_ARCH_X86;
5758     info->cap_mode = (env->hflags & HF_CS64_MASK ? CS_MODE_64
5759                       : env->hflags & HF_CS32_MASK ? CS_MODE_32
5760                       : CS_MODE_16);
5761     info->cap_insn_unit = 1;
5762     info->cap_insn_split = 8;
5763 }
5764 
5765 void x86_update_hflags(CPUX86State *env)
5766 {
5767    uint32_t hflags;
5768 #define HFLAG_COPY_MASK \
5769     ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
5770        HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
5771        HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
5772        HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK)
5773 
5774     hflags = env->hflags & HFLAG_COPY_MASK;
5775     hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
5776     hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
5777     hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
5778                 (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
5779     hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
5780 
5781     if (env->cr[4] & CR4_OSFXSR_MASK) {
5782         hflags |= HF_OSFXSR_MASK;
5783     }
5784 
5785     if (env->efer & MSR_EFER_LMA) {
5786         hflags |= HF_LMA_MASK;
5787     }
5788 
5789     if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
5790         hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
5791     } else {
5792         hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
5793                     (DESC_B_SHIFT - HF_CS32_SHIFT);
5794         hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
5795                     (DESC_B_SHIFT - HF_SS32_SHIFT);
5796         if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) ||
5797             !(hflags & HF_CS32_MASK)) {
5798             hflags |= HF_ADDSEG_MASK;
5799         } else {
5800             hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base |
5801                         env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
5802         }
5803     }
5804     env->hflags = hflags;
5805 }
5806 
5807 static Property x86_cpu_properties[] = {
5808 #ifdef CONFIG_USER_ONLY
5809     /* apic_id = 0 by default for *-user, see commit 9886e834 */
5810     DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, 0),
5811     DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, 0),
5812     DEFINE_PROP_INT32("core-id", X86CPU, core_id, 0),
5813     DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, 0),
5814 #else
5815     DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, UNASSIGNED_APIC_ID),
5816     DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, -1),
5817     DEFINE_PROP_INT32("core-id", X86CPU, core_id, -1),
5818     DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, -1),
5819 #endif
5820     DEFINE_PROP_INT32("node-id", X86CPU, node_id, CPU_UNSET_NUMA_NODE_ID),
5821     DEFINE_PROP_BOOL("pmu", X86CPU, enable_pmu, false),
5822     { .name  = "hv-spinlocks", .info  = &qdev_prop_spinlocks },
5823     DEFINE_PROP_BOOL("hv-relaxed", X86CPU, hyperv_relaxed_timing, false),
5824     DEFINE_PROP_BOOL("hv-vapic", X86CPU, hyperv_vapic, false),
5825     DEFINE_PROP_BOOL("hv-time", X86CPU, hyperv_time, false),
5826     DEFINE_PROP_BOOL("hv-crash", X86CPU, hyperv_crash, false),
5827     DEFINE_PROP_BOOL("hv-reset", X86CPU, hyperv_reset, false),
5828     DEFINE_PROP_BOOL("hv-vpindex", X86CPU, hyperv_vpindex, false),
5829     DEFINE_PROP_BOOL("hv-runtime", X86CPU, hyperv_runtime, false),
5830     DEFINE_PROP_BOOL("hv-synic", X86CPU, hyperv_synic, false),
5831     DEFINE_PROP_BOOL("hv-stimer", X86CPU, hyperv_stimer, false),
5832     DEFINE_PROP_BOOL("hv-frequencies", X86CPU, hyperv_frequencies, false),
5833     DEFINE_PROP_BOOL("hv-reenlightenment", X86CPU, hyperv_reenlightenment, false),
5834     DEFINE_PROP_BOOL("hv-tlbflush", X86CPU, hyperv_tlbflush, false),
5835     DEFINE_PROP_BOOL("hv-evmcs", X86CPU, hyperv_evmcs, false),
5836     DEFINE_PROP_BOOL("hv-ipi", X86CPU, hyperv_ipi, false),
5837     DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true),
5838     DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
5839     DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true),
5840     DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 0),
5841     DEFINE_PROP_BOOL("host-phys-bits", X86CPU, host_phys_bits, false),
5842     DEFINE_PROP_UINT8("host-phys-bits-limit", X86CPU, host_phys_bits_limit, 0),
5843     DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true),
5844     DEFINE_PROP_UINT32("level", X86CPU, env.cpuid_level, UINT32_MAX),
5845     DEFINE_PROP_UINT32("xlevel", X86CPU, env.cpuid_xlevel, UINT32_MAX),
5846     DEFINE_PROP_UINT32("xlevel2", X86CPU, env.cpuid_xlevel2, UINT32_MAX),
5847     DEFINE_PROP_UINT32("min-level", X86CPU, env.cpuid_min_level, 0),
5848     DEFINE_PROP_UINT32("min-xlevel", X86CPU, env.cpuid_min_xlevel, 0),
5849     DEFINE_PROP_UINT32("min-xlevel2", X86CPU, env.cpuid_min_xlevel2, 0),
5850     DEFINE_PROP_BOOL("full-cpuid-auto-level", X86CPU, full_cpuid_auto_level, true),
5851     DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor_id),
5852     DEFINE_PROP_BOOL("cpuid-0xb", X86CPU, enable_cpuid_0xb, true),
5853     DEFINE_PROP_BOOL("lmce", X86CPU, enable_lmce, false),
5854     DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true),
5855     DEFINE_PROP_BOOL("kvm-no-smi-migration", X86CPU, kvm_no_smi_migration,
5856                      false),
5857     DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true),
5858     DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true),
5859     DEFINE_PROP_BOOL("x-migrate-smi-count", X86CPU, migrate_smi_count,
5860                      true),
5861     /*
5862      * lecacy_cache defaults to true unless the CPU model provides its
5863      * own cache information (see x86_cpu_load_def()).
5864      */
5865     DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, true),
5866 
5867     /*
5868      * From "Requirements for Implementing the Microsoft
5869      * Hypervisor Interface":
5870      * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs
5871      *
5872      * "Starting with Windows Server 2012 and Windows 8, if
5873      * CPUID.40000005.EAX contains a value of -1, Windows assumes that
5874      * the hypervisor imposes no specific limit to the number of VPs.
5875      * In this case, Windows Server 2012 guest VMs may use more than
5876      * 64 VPs, up to the maximum supported number of processors applicable
5877      * to the specific Windows version being used."
5878      */
5879     DEFINE_PROP_INT32("x-hv-max-vps", X86CPU, hv_max_vps, -1),
5880     DEFINE_PROP_BOOL("x-hv-synic-kvm-only", X86CPU, hyperv_synic_kvm_only,
5881                      false),
5882     DEFINE_PROP_BOOL("x-intel-pt-auto-level", X86CPU, intel_pt_auto_level,
5883                      true),
5884     DEFINE_PROP_END_OF_LIST()
5885 };
5886 
5887 static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
5888 {
5889     X86CPUClass *xcc = X86_CPU_CLASS(oc);
5890     CPUClass *cc = CPU_CLASS(oc);
5891     DeviceClass *dc = DEVICE_CLASS(oc);
5892 
5893     device_class_set_parent_realize(dc, x86_cpu_realizefn,
5894                                     &xcc->parent_realize);
5895     device_class_set_parent_unrealize(dc, x86_cpu_unrealizefn,
5896                                       &xcc->parent_unrealize);
5897     dc->props = x86_cpu_properties;
5898 
5899     xcc->parent_reset = cc->reset;
5900     cc->reset = x86_cpu_reset;
5901     cc->reset_dump_flags = CPU_DUMP_FPU | CPU_DUMP_CCOP;
5902 
5903     cc->class_by_name = x86_cpu_class_by_name;
5904     cc->parse_features = x86_cpu_parse_featurestr;
5905     cc->has_work = x86_cpu_has_work;
5906 #ifdef CONFIG_TCG
5907     cc->do_interrupt = x86_cpu_do_interrupt;
5908     cc->cpu_exec_interrupt = x86_cpu_exec_interrupt;
5909 #endif
5910     cc->dump_state = x86_cpu_dump_state;
5911     cc->get_crash_info = x86_cpu_get_crash_info;
5912     cc->set_pc = x86_cpu_set_pc;
5913     cc->synchronize_from_tb = x86_cpu_synchronize_from_tb;
5914     cc->gdb_read_register = x86_cpu_gdb_read_register;
5915     cc->gdb_write_register = x86_cpu_gdb_write_register;
5916     cc->get_arch_id = x86_cpu_get_arch_id;
5917     cc->get_paging_enabled = x86_cpu_get_paging_enabled;
5918 #ifndef CONFIG_USER_ONLY
5919     cc->asidx_from_attrs = x86_asidx_from_attrs;
5920     cc->get_memory_mapping = x86_cpu_get_memory_mapping;
5921     cc->get_phys_page_debug = x86_cpu_get_phys_page_debug;
5922     cc->write_elf64_note = x86_cpu_write_elf64_note;
5923     cc->write_elf64_qemunote = x86_cpu_write_elf64_qemunote;
5924     cc->write_elf32_note = x86_cpu_write_elf32_note;
5925     cc->write_elf32_qemunote = x86_cpu_write_elf32_qemunote;
5926     cc->vmsd = &vmstate_x86_cpu;
5927 #endif
5928     cc->gdb_arch_name = x86_gdb_arch_name;
5929 #ifdef TARGET_X86_64
5930     cc->gdb_core_xml_file = "i386-64bit.xml";
5931     cc->gdb_num_core_regs = 66;
5932 #else
5933     cc->gdb_core_xml_file = "i386-32bit.xml";
5934     cc->gdb_num_core_regs = 50;
5935 #endif
5936 #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
5937     cc->debug_excp_handler = breakpoint_handler;
5938 #endif
5939     cc->cpu_exec_enter = x86_cpu_exec_enter;
5940     cc->cpu_exec_exit = x86_cpu_exec_exit;
5941 #ifdef CONFIG_TCG
5942     cc->tcg_initialize = tcg_x86_init;
5943     cc->tlb_fill = x86_cpu_tlb_fill;
5944 #endif
5945     cc->disas_set_info = x86_disas_set_info;
5946 
5947     dc->user_creatable = true;
5948 }
5949 
5950 static const TypeInfo x86_cpu_type_info = {
5951     .name = TYPE_X86_CPU,
5952     .parent = TYPE_CPU,
5953     .instance_size = sizeof(X86CPU),
5954     .instance_init = x86_cpu_initfn,
5955     .abstract = true,
5956     .class_size = sizeof(X86CPUClass),
5957     .class_init = x86_cpu_common_class_init,
5958 };
5959 
5960 
5961 /* "base" CPU model, used by query-cpu-model-expansion */
5962 static void x86_cpu_base_class_init(ObjectClass *oc, void *data)
5963 {
5964     X86CPUClass *xcc = X86_CPU_CLASS(oc);
5965 
5966     xcc->static_model = true;
5967     xcc->migration_safe = true;
5968     xcc->model_description = "base CPU model type with no features enabled";
5969     xcc->ordering = 8;
5970 }
5971 
5972 static const TypeInfo x86_base_cpu_type_info = {
5973         .name = X86_CPU_TYPE_NAME("base"),
5974         .parent = TYPE_X86_CPU,
5975         .class_init = x86_cpu_base_class_init,
5976 };
5977 
5978 static void x86_cpu_register_types(void)
5979 {
5980     int i;
5981 
5982     type_register_static(&x86_cpu_type_info);
5983     for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) {
5984         x86_register_cpudef_type(&builtin_x86_defs[i]);
5985     }
5986     type_register_static(&max_x86_cpu_type_info);
5987     type_register_static(&x86_base_cpu_type_info);
5988 #if defined(CONFIG_KVM) || defined(CONFIG_HVF)
5989     type_register_static(&host_x86_cpu_type_info);
5990 #endif
5991 }
5992 
5993 type_init(x86_cpu_register_types)
5994