xref: /openbmc/qemu/target/i386/cpu.c (revision 0fd05c8d)
1 /*
2  *  i386 CPUID, CPU class, definitions, models
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.1 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/qemu-print.h"
24 #include "qemu/hw-version.h"
25 #include "cpu.h"
26 #include "tcg/helper-tcg.h"
27 #include "sysemu/hvf.h"
28 #include "hvf/hvf-i386.h"
29 #include "kvm/kvm_i386.h"
30 #include "sev.h"
31 #include "qapi/error.h"
32 #include "qemu/error-report.h"
33 #include "qapi/qapi-visit-machine.h"
34 #include "qapi/qmp/qerror.h"
35 #include "standard-headers/asm-x86/kvm_para.h"
36 #include "hw/qdev-properties.h"
37 #include "hw/i386/topology.h"
38 #ifndef CONFIG_USER_ONLY
39 #include "sysemu/reset.h"
40 #include "qapi/qapi-commands-machine-target.h"
41 #include "exec/address-spaces.h"
42 #include "hw/boards.h"
43 #include "hw/i386/sgx-epc.h"
44 #endif
45 
46 #include "disas/capstone.h"
47 #include "cpu-internal.h"
48 
49 static void x86_cpu_realizefn(DeviceState *dev, Error **errp);
50 
51 /* Helpers for building CPUID[2] descriptors: */
52 
53 struct CPUID2CacheDescriptorInfo {
54     enum CacheType type;
55     int level;
56     int size;
57     int line_size;
58     int associativity;
59 };
60 
61 /*
62  * Known CPUID 2 cache descriptors.
63  * From Intel SDM Volume 2A, CPUID instruction
64  */
65 struct CPUID2CacheDescriptorInfo cpuid2_cache_descriptors[] = {
66     [0x06] = { .level = 1, .type = INSTRUCTION_CACHE, .size =   8 * KiB,
67                .associativity = 4,  .line_size = 32, },
68     [0x08] = { .level = 1, .type = INSTRUCTION_CACHE, .size =  16 * KiB,
69                .associativity = 4,  .line_size = 32, },
70     [0x09] = { .level = 1, .type = INSTRUCTION_CACHE, .size =  32 * KiB,
71                .associativity = 4,  .line_size = 64, },
72     [0x0A] = { .level = 1, .type = DATA_CACHE,        .size =   8 * KiB,
73                .associativity = 2,  .line_size = 32, },
74     [0x0C] = { .level = 1, .type = DATA_CACHE,        .size =  16 * KiB,
75                .associativity = 4,  .line_size = 32, },
76     [0x0D] = { .level = 1, .type = DATA_CACHE,        .size =  16 * KiB,
77                .associativity = 4,  .line_size = 64, },
78     [0x0E] = { .level = 1, .type = DATA_CACHE,        .size =  24 * KiB,
79                .associativity = 6,  .line_size = 64, },
80     [0x1D] = { .level = 2, .type = UNIFIED_CACHE,     .size = 128 * KiB,
81                .associativity = 2,  .line_size = 64, },
82     [0x21] = { .level = 2, .type = UNIFIED_CACHE,     .size = 256 * KiB,
83                .associativity = 8,  .line_size = 64, },
84     /* lines per sector is not supported cpuid2_cache_descriptor(),
85     * so descriptors 0x22, 0x23 are not included
86     */
87     [0x24] = { .level = 2, .type = UNIFIED_CACHE,     .size =   1 * MiB,
88                .associativity = 16, .line_size = 64, },
89     /* lines per sector is not supported cpuid2_cache_descriptor(),
90     * so descriptors 0x25, 0x20 are not included
91     */
92     [0x2C] = { .level = 1, .type = DATA_CACHE,        .size =  32 * KiB,
93                .associativity = 8,  .line_size = 64, },
94     [0x30] = { .level = 1, .type = INSTRUCTION_CACHE, .size =  32 * KiB,
95                .associativity = 8,  .line_size = 64, },
96     [0x41] = { .level = 2, .type = UNIFIED_CACHE,     .size = 128 * KiB,
97                .associativity = 4,  .line_size = 32, },
98     [0x42] = { .level = 2, .type = UNIFIED_CACHE,     .size = 256 * KiB,
99                .associativity = 4,  .line_size = 32, },
100     [0x43] = { .level = 2, .type = UNIFIED_CACHE,     .size = 512 * KiB,
101                .associativity = 4,  .line_size = 32, },
102     [0x44] = { .level = 2, .type = UNIFIED_CACHE,     .size =   1 * MiB,
103                .associativity = 4,  .line_size = 32, },
104     [0x45] = { .level = 2, .type = UNIFIED_CACHE,     .size =   2 * MiB,
105                .associativity = 4,  .line_size = 32, },
106     [0x46] = { .level = 3, .type = UNIFIED_CACHE,     .size =   4 * MiB,
107                .associativity = 4,  .line_size = 64, },
108     [0x47] = { .level = 3, .type = UNIFIED_CACHE,     .size =   8 * MiB,
109                .associativity = 8,  .line_size = 64, },
110     [0x48] = { .level = 2, .type = UNIFIED_CACHE,     .size =   3 * MiB,
111                .associativity = 12, .line_size = 64, },
112     /* Descriptor 0x49 depends on CPU family/model, so it is not included */
113     [0x4A] = { .level = 3, .type = UNIFIED_CACHE,     .size =   6 * MiB,
114                .associativity = 12, .line_size = 64, },
115     [0x4B] = { .level = 3, .type = UNIFIED_CACHE,     .size =   8 * MiB,
116                .associativity = 16, .line_size = 64, },
117     [0x4C] = { .level = 3, .type = UNIFIED_CACHE,     .size =  12 * MiB,
118                .associativity = 12, .line_size = 64, },
119     [0x4D] = { .level = 3, .type = UNIFIED_CACHE,     .size =  16 * MiB,
120                .associativity = 16, .line_size = 64, },
121     [0x4E] = { .level = 2, .type = UNIFIED_CACHE,     .size =   6 * MiB,
122                .associativity = 24, .line_size = 64, },
123     [0x60] = { .level = 1, .type = DATA_CACHE,        .size =  16 * KiB,
124                .associativity = 8,  .line_size = 64, },
125     [0x66] = { .level = 1, .type = DATA_CACHE,        .size =   8 * KiB,
126                .associativity = 4,  .line_size = 64, },
127     [0x67] = { .level = 1, .type = DATA_CACHE,        .size =  16 * KiB,
128                .associativity = 4,  .line_size = 64, },
129     [0x68] = { .level = 1, .type = DATA_CACHE,        .size =  32 * KiB,
130                .associativity = 4,  .line_size = 64, },
131     [0x78] = { .level = 2, .type = UNIFIED_CACHE,     .size =   1 * MiB,
132                .associativity = 4,  .line_size = 64, },
133     /* lines per sector is not supported cpuid2_cache_descriptor(),
134     * so descriptors 0x79, 0x7A, 0x7B, 0x7C are not included.
135     */
136     [0x7D] = { .level = 2, .type = UNIFIED_CACHE,     .size =   2 * MiB,
137                .associativity = 8,  .line_size = 64, },
138     [0x7F] = { .level = 2, .type = UNIFIED_CACHE,     .size = 512 * KiB,
139                .associativity = 2,  .line_size = 64, },
140     [0x80] = { .level = 2, .type = UNIFIED_CACHE,     .size = 512 * KiB,
141                .associativity = 8,  .line_size = 64, },
142     [0x82] = { .level = 2, .type = UNIFIED_CACHE,     .size = 256 * KiB,
143                .associativity = 8,  .line_size = 32, },
144     [0x83] = { .level = 2, .type = UNIFIED_CACHE,     .size = 512 * KiB,
145                .associativity = 8,  .line_size = 32, },
146     [0x84] = { .level = 2, .type = UNIFIED_CACHE,     .size =   1 * MiB,
147                .associativity = 8,  .line_size = 32, },
148     [0x85] = { .level = 2, .type = UNIFIED_CACHE,     .size =   2 * MiB,
149                .associativity = 8,  .line_size = 32, },
150     [0x86] = { .level = 2, .type = UNIFIED_CACHE,     .size = 512 * KiB,
151                .associativity = 4,  .line_size = 64, },
152     [0x87] = { .level = 2, .type = UNIFIED_CACHE,     .size =   1 * MiB,
153                .associativity = 8,  .line_size = 64, },
154     [0xD0] = { .level = 3, .type = UNIFIED_CACHE,     .size = 512 * KiB,
155                .associativity = 4,  .line_size = 64, },
156     [0xD1] = { .level = 3, .type = UNIFIED_CACHE,     .size =   1 * MiB,
157                .associativity = 4,  .line_size = 64, },
158     [0xD2] = { .level = 3, .type = UNIFIED_CACHE,     .size =   2 * MiB,
159                .associativity = 4,  .line_size = 64, },
160     [0xD6] = { .level = 3, .type = UNIFIED_CACHE,     .size =   1 * MiB,
161                .associativity = 8,  .line_size = 64, },
162     [0xD7] = { .level = 3, .type = UNIFIED_CACHE,     .size =   2 * MiB,
163                .associativity = 8,  .line_size = 64, },
164     [0xD8] = { .level = 3, .type = UNIFIED_CACHE,     .size =   4 * MiB,
165                .associativity = 8,  .line_size = 64, },
166     [0xDC] = { .level = 3, .type = UNIFIED_CACHE,     .size = 1.5 * MiB,
167                .associativity = 12, .line_size = 64, },
168     [0xDD] = { .level = 3, .type = UNIFIED_CACHE,     .size =   3 * MiB,
169                .associativity = 12, .line_size = 64, },
170     [0xDE] = { .level = 3, .type = UNIFIED_CACHE,     .size =   6 * MiB,
171                .associativity = 12, .line_size = 64, },
172     [0xE2] = { .level = 3, .type = UNIFIED_CACHE,     .size =   2 * MiB,
173                .associativity = 16, .line_size = 64, },
174     [0xE3] = { .level = 3, .type = UNIFIED_CACHE,     .size =   4 * MiB,
175                .associativity = 16, .line_size = 64, },
176     [0xE4] = { .level = 3, .type = UNIFIED_CACHE,     .size =   8 * MiB,
177                .associativity = 16, .line_size = 64, },
178     [0xEA] = { .level = 3, .type = UNIFIED_CACHE,     .size =  12 * MiB,
179                .associativity = 24, .line_size = 64, },
180     [0xEB] = { .level = 3, .type = UNIFIED_CACHE,     .size =  18 * MiB,
181                .associativity = 24, .line_size = 64, },
182     [0xEC] = { .level = 3, .type = UNIFIED_CACHE,     .size =  24 * MiB,
183                .associativity = 24, .line_size = 64, },
184 };
185 
186 /*
187  * "CPUID leaf 2 does not report cache descriptor information,
188  * use CPUID leaf 4 to query cache parameters"
189  */
190 #define CACHE_DESCRIPTOR_UNAVAILABLE 0xFF
191 
192 /*
193  * Return a CPUID 2 cache descriptor for a given cache.
194  * If no known descriptor is found, return CACHE_DESCRIPTOR_UNAVAILABLE
195  */
196 static uint8_t cpuid2_cache_descriptor(CPUCacheInfo *cache)
197 {
198     int i;
199 
200     assert(cache->size > 0);
201     assert(cache->level > 0);
202     assert(cache->line_size > 0);
203     assert(cache->associativity > 0);
204     for (i = 0; i < ARRAY_SIZE(cpuid2_cache_descriptors); i++) {
205         struct CPUID2CacheDescriptorInfo *d = &cpuid2_cache_descriptors[i];
206         if (d->level == cache->level && d->type == cache->type &&
207             d->size == cache->size && d->line_size == cache->line_size &&
208             d->associativity == cache->associativity) {
209                 return i;
210             }
211     }
212 
213     return CACHE_DESCRIPTOR_UNAVAILABLE;
214 }
215 
216 /* CPUID Leaf 4 constants: */
217 
218 /* EAX: */
219 #define CACHE_TYPE_D    1
220 #define CACHE_TYPE_I    2
221 #define CACHE_TYPE_UNIFIED   3
222 
223 #define CACHE_LEVEL(l)        (l << 5)
224 
225 #define CACHE_SELF_INIT_LEVEL (1 << 8)
226 
227 /* EDX: */
228 #define CACHE_NO_INVD_SHARING   (1 << 0)
229 #define CACHE_INCLUSIVE       (1 << 1)
230 #define CACHE_COMPLEX_IDX     (1 << 2)
231 
232 /* Encode CacheType for CPUID[4].EAX */
233 #define CACHE_TYPE(t) (((t) == DATA_CACHE) ? CACHE_TYPE_D : \
234                        ((t) == INSTRUCTION_CACHE) ? CACHE_TYPE_I : \
235                        ((t) == UNIFIED_CACHE) ? CACHE_TYPE_UNIFIED : \
236                        0 /* Invalid value */)
237 
238 static uint32_t max_thread_ids_for_cache(X86CPUTopoInfo *topo_info,
239                                          enum CPUTopoLevel share_level)
240 {
241     uint32_t num_ids = 0;
242 
243     switch (share_level) {
244     case CPU_TOPO_LEVEL_CORE:
245         num_ids = 1 << apicid_core_offset(topo_info);
246         break;
247     case CPU_TOPO_LEVEL_DIE:
248         num_ids = 1 << apicid_die_offset(topo_info);
249         break;
250     case CPU_TOPO_LEVEL_PACKAGE:
251         num_ids = 1 << apicid_pkg_offset(topo_info);
252         break;
253     default:
254         /*
255          * Currently there is no use case for SMT and MODULE, so use
256          * assert directly to facilitate debugging.
257          */
258         g_assert_not_reached();
259     }
260 
261     return num_ids - 1;
262 }
263 
264 static uint32_t max_core_ids_in_package(X86CPUTopoInfo *topo_info)
265 {
266     uint32_t num_cores = 1 << (apicid_pkg_offset(topo_info) -
267                                apicid_core_offset(topo_info));
268     return num_cores - 1;
269 }
270 
271 /* Encode cache info for CPUID[4] */
272 static void encode_cache_cpuid4(CPUCacheInfo *cache,
273                                 X86CPUTopoInfo *topo_info,
274                                 uint32_t *eax, uint32_t *ebx,
275                                 uint32_t *ecx, uint32_t *edx)
276 {
277     assert(cache->size == cache->line_size * cache->associativity *
278                           cache->partitions * cache->sets);
279 
280     *eax = CACHE_TYPE(cache->type) |
281            CACHE_LEVEL(cache->level) |
282            (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0) |
283            (max_core_ids_in_package(topo_info) << 26) |
284            (max_thread_ids_for_cache(topo_info, cache->share_level) << 14);
285 
286     assert(cache->line_size > 0);
287     assert(cache->partitions > 0);
288     assert(cache->associativity > 0);
289     /* We don't implement fully-associative caches */
290     assert(cache->associativity < cache->sets);
291     *ebx = (cache->line_size - 1) |
292            ((cache->partitions - 1) << 12) |
293            ((cache->associativity - 1) << 22);
294 
295     assert(cache->sets > 0);
296     *ecx = cache->sets - 1;
297 
298     *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
299            (cache->inclusive ? CACHE_INCLUSIVE : 0) |
300            (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
301 }
302 
303 static uint32_t num_threads_by_topo_level(X86CPUTopoInfo *topo_info,
304                                           enum CPUTopoLevel topo_level)
305 {
306     switch (topo_level) {
307     case CPU_TOPO_LEVEL_SMT:
308         return 1;
309     case CPU_TOPO_LEVEL_CORE:
310         return topo_info->threads_per_core;
311     case CPU_TOPO_LEVEL_MODULE:
312         return topo_info->threads_per_core * topo_info->cores_per_module;
313     case CPU_TOPO_LEVEL_DIE:
314         return topo_info->threads_per_core * topo_info->cores_per_module *
315                topo_info->modules_per_die;
316     case CPU_TOPO_LEVEL_PACKAGE:
317         return topo_info->threads_per_core * topo_info->cores_per_module *
318                topo_info->modules_per_die * topo_info->dies_per_pkg;
319     default:
320         g_assert_not_reached();
321     }
322     return 0;
323 }
324 
325 static uint32_t apicid_offset_by_topo_level(X86CPUTopoInfo *topo_info,
326                                             enum CPUTopoLevel topo_level)
327 {
328     switch (topo_level) {
329     case CPU_TOPO_LEVEL_SMT:
330         return 0;
331     case CPU_TOPO_LEVEL_CORE:
332         return apicid_core_offset(topo_info);
333     case CPU_TOPO_LEVEL_MODULE:
334         return apicid_module_offset(topo_info);
335     case CPU_TOPO_LEVEL_DIE:
336         return apicid_die_offset(topo_info);
337     case CPU_TOPO_LEVEL_PACKAGE:
338         return apicid_pkg_offset(topo_info);
339     default:
340         g_assert_not_reached();
341     }
342     return 0;
343 }
344 
345 static uint32_t cpuid1f_topo_type(enum CPUTopoLevel topo_level)
346 {
347     switch (topo_level) {
348     case CPU_TOPO_LEVEL_INVALID:
349         return CPUID_1F_ECX_TOPO_LEVEL_INVALID;
350     case CPU_TOPO_LEVEL_SMT:
351         return CPUID_1F_ECX_TOPO_LEVEL_SMT;
352     case CPU_TOPO_LEVEL_CORE:
353         return CPUID_1F_ECX_TOPO_LEVEL_CORE;
354     case CPU_TOPO_LEVEL_MODULE:
355         return CPUID_1F_ECX_TOPO_LEVEL_MODULE;
356     case CPU_TOPO_LEVEL_DIE:
357         return CPUID_1F_ECX_TOPO_LEVEL_DIE;
358     default:
359         /* Other types are not supported in QEMU. */
360         g_assert_not_reached();
361     }
362     return 0;
363 }
364 
365 static void encode_topo_cpuid1f(CPUX86State *env, uint32_t count,
366                                 X86CPUTopoInfo *topo_info,
367                                 uint32_t *eax, uint32_t *ebx,
368                                 uint32_t *ecx, uint32_t *edx)
369 {
370     X86CPU *cpu = env_archcpu(env);
371     unsigned long level, next_level;
372     uint32_t num_threads_next_level, offset_next_level;
373 
374     assert(count + 1 < CPU_TOPO_LEVEL_MAX);
375 
376     /*
377      * Find the No.(count + 1) topology level in avail_cpu_topo bitmap.
378      * The search starts from bit 1 (CPU_TOPO_LEVEL_INVALID + 1).
379      */
380     level = CPU_TOPO_LEVEL_INVALID;
381     for (int i = 0; i <= count; i++) {
382         level = find_next_bit(env->avail_cpu_topo,
383                               CPU_TOPO_LEVEL_PACKAGE,
384                               level + 1);
385 
386         /*
387          * CPUID[0x1f] doesn't explicitly encode the package level,
388          * and it just encodes the invalid level (all fields are 0)
389          * into the last subleaf of 0x1f.
390          */
391         if (level == CPU_TOPO_LEVEL_PACKAGE) {
392             level = CPU_TOPO_LEVEL_INVALID;
393             break;
394         }
395     }
396 
397     if (level == CPU_TOPO_LEVEL_INVALID) {
398         num_threads_next_level = 0;
399         offset_next_level = 0;
400     } else {
401         next_level = find_next_bit(env->avail_cpu_topo,
402                                    CPU_TOPO_LEVEL_PACKAGE,
403                                    level + 1);
404         num_threads_next_level = num_threads_by_topo_level(topo_info,
405                                                            next_level);
406         offset_next_level = apicid_offset_by_topo_level(topo_info,
407                                                         next_level);
408     }
409 
410     *eax = offset_next_level;
411     /* The count (bits 15-00) doesn't need to be reliable. */
412     *ebx = num_threads_next_level & 0xffff;
413     *ecx = (count & 0xff) | (cpuid1f_topo_type(level) << 8);
414     *edx = cpu->apic_id;
415 
416     assert(!(*eax & ~0x1f));
417 }
418 
419 /* Encode cache info for CPUID[0x80000005].ECX or CPUID[0x80000005].EDX */
420 static uint32_t encode_cache_cpuid80000005(CPUCacheInfo *cache)
421 {
422     assert(cache->size % 1024 == 0);
423     assert(cache->lines_per_tag > 0);
424     assert(cache->associativity > 0);
425     assert(cache->line_size > 0);
426     return ((cache->size / 1024) << 24) | (cache->associativity << 16) |
427            (cache->lines_per_tag << 8) | (cache->line_size);
428 }
429 
430 #define ASSOC_FULL 0xFF
431 
432 /* AMD associativity encoding used on CPUID Leaf 0x80000006: */
433 #define AMD_ENC_ASSOC(a) (a <=   1 ? a   : \
434                           a ==   2 ? 0x2 : \
435                           a ==   4 ? 0x4 : \
436                           a ==   8 ? 0x6 : \
437                           a ==  16 ? 0x8 : \
438                           a ==  32 ? 0xA : \
439                           a ==  48 ? 0xB : \
440                           a ==  64 ? 0xC : \
441                           a ==  96 ? 0xD : \
442                           a == 128 ? 0xE : \
443                           a == ASSOC_FULL ? 0xF : \
444                           0 /* invalid value */)
445 
446 /*
447  * Encode cache info for CPUID[0x80000006].ECX and CPUID[0x80000006].EDX
448  * @l3 can be NULL.
449  */
450 static void encode_cache_cpuid80000006(CPUCacheInfo *l2,
451                                        CPUCacheInfo *l3,
452                                        uint32_t *ecx, uint32_t *edx)
453 {
454     assert(l2->size % 1024 == 0);
455     assert(l2->associativity > 0);
456     assert(l2->lines_per_tag > 0);
457     assert(l2->line_size > 0);
458     *ecx = ((l2->size / 1024) << 16) |
459            (AMD_ENC_ASSOC(l2->associativity) << 12) |
460            (l2->lines_per_tag << 8) | (l2->line_size);
461 
462     if (l3) {
463         assert(l3->size % (512 * 1024) == 0);
464         assert(l3->associativity > 0);
465         assert(l3->lines_per_tag > 0);
466         assert(l3->line_size > 0);
467         *edx = ((l3->size / (512 * 1024)) << 18) |
468                (AMD_ENC_ASSOC(l3->associativity) << 12) |
469                (l3->lines_per_tag << 8) | (l3->line_size);
470     } else {
471         *edx = 0;
472     }
473 }
474 
475 /* Encode cache info for CPUID[8000001D] */
476 static void encode_cache_cpuid8000001d(CPUCacheInfo *cache,
477                                        X86CPUTopoInfo *topo_info,
478                                        uint32_t *eax, uint32_t *ebx,
479                                        uint32_t *ecx, uint32_t *edx)
480 {
481     assert(cache->size == cache->line_size * cache->associativity *
482                           cache->partitions * cache->sets);
483 
484     *eax = CACHE_TYPE(cache->type) | CACHE_LEVEL(cache->level) |
485                (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0);
486     *eax |= max_thread_ids_for_cache(topo_info, cache->share_level) << 14;
487 
488     assert(cache->line_size > 0);
489     assert(cache->partitions > 0);
490     assert(cache->associativity > 0);
491     /* We don't implement fully-associative caches */
492     assert(cache->associativity < cache->sets);
493     *ebx = (cache->line_size - 1) |
494            ((cache->partitions - 1) << 12) |
495            ((cache->associativity - 1) << 22);
496 
497     assert(cache->sets > 0);
498     *ecx = cache->sets - 1;
499 
500     *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
501            (cache->inclusive ? CACHE_INCLUSIVE : 0) |
502            (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
503 }
504 
505 /* Encode cache info for CPUID[8000001E] */
506 static void encode_topo_cpuid8000001e(X86CPU *cpu, X86CPUTopoInfo *topo_info,
507                                       uint32_t *eax, uint32_t *ebx,
508                                       uint32_t *ecx, uint32_t *edx)
509 {
510     X86CPUTopoIDs topo_ids;
511 
512     x86_topo_ids_from_apicid(cpu->apic_id, topo_info, &topo_ids);
513 
514     *eax = cpu->apic_id;
515 
516     /*
517      * CPUID_Fn8000001E_EBX [Core Identifiers] (CoreId)
518      * Read-only. Reset: 0000_XXXXh.
519      * See Core::X86::Cpuid::ExtApicId.
520      * Core::X86::Cpuid::CoreId_lthree[1:0]_core[3:0]_thread[1:0];
521      * Bits Description
522      * 31:16 Reserved.
523      * 15:8 ThreadsPerCore: threads per core. Read-only. Reset: XXh.
524      *      The number of threads per core is ThreadsPerCore+1.
525      *  7:0 CoreId: core ID. Read-only. Reset: XXh.
526      *
527      *  NOTE: CoreId is already part of apic_id. Just use it. We can
528      *  use all the 8 bits to represent the core_id here.
529      */
530     *ebx = ((topo_info->threads_per_core - 1) << 8) | (topo_ids.core_id & 0xFF);
531 
532     /*
533      * CPUID_Fn8000001E_ECX [Node Identifiers] (NodeId)
534      * Read-only. Reset: 0000_0XXXh.
535      * Core::X86::Cpuid::NodeId_lthree[1:0]_core[3:0]_thread[1:0];
536      * Bits Description
537      * 31:11 Reserved.
538      * 10:8 NodesPerProcessor: Node per processor. Read-only. Reset: XXXb.
539      *      ValidValues:
540      *      Value   Description
541      *      0h      1 node per processor.
542      *      7h-1h   Reserved.
543      *  7:0 NodeId: Node ID. Read-only. Reset: XXh.
544      *
545      * NOTE: Hardware reserves 3 bits for number of nodes per processor.
546      * But users can create more nodes than the actual hardware can
547      * support. To genaralize we can use all the upper 8 bits for nodes.
548      * NodeId is combination of node and socket_id which is already decoded
549      * in apic_id. Just use it by shifting.
550      */
551     if (cpu->legacy_multi_node) {
552         *ecx = ((topo_info->dies_per_pkg - 1) << 8) |
553                ((cpu->apic_id >> apicid_die_offset(topo_info)) & 0xFF);
554     } else {
555         *ecx = (cpu->apic_id >> apicid_pkg_offset(topo_info)) & 0xFF;
556     }
557 
558     *edx = 0;
559 }
560 
561 /*
562  * Definitions of the hardcoded cache entries we expose:
563  * These are legacy cache values. If there is a need to change any
564  * of these values please use builtin_x86_defs
565  */
566 
567 /* L1 data cache: */
568 static CPUCacheInfo legacy_l1d_cache = {
569     .type = DATA_CACHE,
570     .level = 1,
571     .size = 32 * KiB,
572     .self_init = 1,
573     .line_size = 64,
574     .associativity = 8,
575     .sets = 64,
576     .partitions = 1,
577     .no_invd_sharing = true,
578     .share_level = CPU_TOPO_LEVEL_CORE,
579 };
580 
581 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
582 static CPUCacheInfo legacy_l1d_cache_amd = {
583     .type = DATA_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     .share_level = CPU_TOPO_LEVEL_CORE,
594 };
595 
596 /* L1 instruction cache: */
597 static CPUCacheInfo legacy_l1i_cache = {
598     .type = INSTRUCTION_CACHE,
599     .level = 1,
600     .size = 32 * KiB,
601     .self_init = 1,
602     .line_size = 64,
603     .associativity = 8,
604     .sets = 64,
605     .partitions = 1,
606     .no_invd_sharing = true,
607     .share_level = CPU_TOPO_LEVEL_CORE,
608 };
609 
610 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
611 static CPUCacheInfo legacy_l1i_cache_amd = {
612     .type = INSTRUCTION_CACHE,
613     .level = 1,
614     .size = 64 * KiB,
615     .self_init = 1,
616     .line_size = 64,
617     .associativity = 2,
618     .sets = 512,
619     .partitions = 1,
620     .lines_per_tag = 1,
621     .no_invd_sharing = true,
622     .share_level = CPU_TOPO_LEVEL_CORE,
623 };
624 
625 /* Level 2 unified cache: */
626 static CPUCacheInfo legacy_l2_cache = {
627     .type = UNIFIED_CACHE,
628     .level = 2,
629     .size = 4 * MiB,
630     .self_init = 1,
631     .line_size = 64,
632     .associativity = 16,
633     .sets = 4096,
634     .partitions = 1,
635     .no_invd_sharing = true,
636     .share_level = CPU_TOPO_LEVEL_CORE,
637 };
638 
639 /*FIXME: CPUID leaf 2 descriptor is inconsistent with CPUID leaf 4 */
640 static CPUCacheInfo legacy_l2_cache_cpuid2 = {
641     .type = UNIFIED_CACHE,
642     .level = 2,
643     .size = 2 * MiB,
644     .line_size = 64,
645     .associativity = 8,
646     .share_level = CPU_TOPO_LEVEL_INVALID,
647 };
648 
649 
650 /*FIXME: CPUID leaf 0x80000006 is inconsistent with leaves 2 & 4 */
651 static CPUCacheInfo legacy_l2_cache_amd = {
652     .type = UNIFIED_CACHE,
653     .level = 2,
654     .size = 512 * KiB,
655     .line_size = 64,
656     .lines_per_tag = 1,
657     .associativity = 16,
658     .sets = 512,
659     .partitions = 1,
660     .share_level = CPU_TOPO_LEVEL_CORE,
661 };
662 
663 /* Level 3 unified cache: */
664 static CPUCacheInfo legacy_l3_cache = {
665     .type = UNIFIED_CACHE,
666     .level = 3,
667     .size = 16 * MiB,
668     .line_size = 64,
669     .associativity = 16,
670     .sets = 16384,
671     .partitions = 1,
672     .lines_per_tag = 1,
673     .self_init = true,
674     .inclusive = true,
675     .complex_indexing = true,
676     .share_level = CPU_TOPO_LEVEL_DIE,
677 };
678 
679 /* TLB definitions: */
680 
681 #define L1_DTLB_2M_ASSOC       1
682 #define L1_DTLB_2M_ENTRIES   255
683 #define L1_DTLB_4K_ASSOC       1
684 #define L1_DTLB_4K_ENTRIES   255
685 
686 #define L1_ITLB_2M_ASSOC       1
687 #define L1_ITLB_2M_ENTRIES   255
688 #define L1_ITLB_4K_ASSOC       1
689 #define L1_ITLB_4K_ENTRIES   255
690 
691 #define L2_DTLB_2M_ASSOC       0 /* disabled */
692 #define L2_DTLB_2M_ENTRIES     0 /* disabled */
693 #define L2_DTLB_4K_ASSOC       4
694 #define L2_DTLB_4K_ENTRIES   512
695 
696 #define L2_ITLB_2M_ASSOC       0 /* disabled */
697 #define L2_ITLB_2M_ENTRIES     0 /* disabled */
698 #define L2_ITLB_4K_ASSOC       4
699 #define L2_ITLB_4K_ENTRIES   512
700 
701 /* CPUID Leaf 0x14 constants: */
702 #define INTEL_PT_MAX_SUBLEAF     0x1
703 /*
704  * bit[00]: IA32_RTIT_CTL.CR3 filter can be set to 1 and IA32_RTIT_CR3_MATCH
705  *          MSR can be accessed;
706  * bit[01]: Support Configurable PSB and Cycle-Accurate Mode;
707  * bit[02]: Support IP Filtering, TraceStop filtering, and preservation
708  *          of Intel PT MSRs across warm reset;
709  * bit[03]: Support MTC timing packet and suppression of COFI-based packets;
710  */
711 #define INTEL_PT_MINIMAL_EBX     0xf
712 /*
713  * bit[00]: Tracing can be enabled with IA32_RTIT_CTL.ToPA = 1 and
714  *          IA32_RTIT_OUTPUT_BASE and IA32_RTIT_OUTPUT_MASK_PTRS MSRs can be
715  *          accessed;
716  * bit[01]: ToPA tables can hold any number of output entries, up to the
717  *          maximum allowed by the MaskOrTableOffset field of
718  *          IA32_RTIT_OUTPUT_MASK_PTRS;
719  * bit[02]: Support Single-Range Output scheme;
720  */
721 #define INTEL_PT_MINIMAL_ECX     0x7
722 /* generated packets which contain IP payloads have LIP values */
723 #define INTEL_PT_IP_LIP          (1 << 31)
724 #define INTEL_PT_ADDR_RANGES_NUM 0x2 /* Number of configurable address ranges */
725 #define INTEL_PT_ADDR_RANGES_NUM_MASK 0x3
726 #define INTEL_PT_MTC_BITMAP      (0x0249 << 16) /* Support ART(0,3,6,9) */
727 #define INTEL_PT_CYCLE_BITMAP    0x1fff         /* Support 0,2^(0~11) */
728 #define INTEL_PT_PSB_BITMAP      (0x003f << 16) /* Support 2K,4K,8K,16K,32K,64K */
729 
730 /* CPUID Leaf 0x1D constants: */
731 #define INTEL_AMX_TILE_MAX_SUBLEAF     0x1
732 #define INTEL_AMX_TOTAL_TILE_BYTES     0x2000
733 #define INTEL_AMX_BYTES_PER_TILE       0x400
734 #define INTEL_AMX_BYTES_PER_ROW        0x40
735 #define INTEL_AMX_TILE_MAX_NAMES       0x8
736 #define INTEL_AMX_TILE_MAX_ROWS        0x10
737 
738 /* CPUID Leaf 0x1E constants: */
739 #define INTEL_AMX_TMUL_MAX_K           0x10
740 #define INTEL_AMX_TMUL_MAX_N           0x40
741 
742 void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1,
743                               uint32_t vendor2, uint32_t vendor3)
744 {
745     int i;
746     for (i = 0; i < 4; i++) {
747         dst[i] = vendor1 >> (8 * i);
748         dst[i + 4] = vendor2 >> (8 * i);
749         dst[i + 8] = vendor3 >> (8 * i);
750     }
751     dst[CPUID_VENDOR_SZ] = '\0';
752 }
753 
754 #define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
755 #define PENTIUM_FEATURES (I486_FEATURES | CPUID_DE | CPUID_TSC | \
756           CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_MMX | CPUID_APIC)
757 #define PENTIUM2_FEATURES (PENTIUM_FEATURES | CPUID_PAE | CPUID_SEP | \
758           CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
759           CPUID_PSE36 | CPUID_FXSR)
760 #define PENTIUM3_FEATURES (PENTIUM2_FEATURES | CPUID_SSE)
761 #define PPRO_FEATURES (CPUID_FP87 | CPUID_DE | CPUID_PSE | CPUID_TSC | \
762           CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_PGE | CPUID_CMOV | \
763           CPUID_PAT | CPUID_FXSR | CPUID_MMX | CPUID_SSE | CPUID_SSE2 | \
764           CPUID_PAE | CPUID_SEP | CPUID_APIC)
765 
766 #define TCG_FEATURES (CPUID_FP87 | CPUID_PSE | CPUID_TSC | CPUID_MSR | \
767           CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | CPUID_SEP | \
768           CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
769           CPUID_PSE36 | CPUID_CLFLUSH | CPUID_ACPI | CPUID_MMX | \
770           CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS | CPUID_DE)
771           /* partly implemented:
772           CPUID_MTRR, CPUID_MCA, CPUID_CLFLUSH (needed for Win64) */
773           /* missing:
774           CPUID_VME, CPUID_DTS, CPUID_SS, CPUID_HT, CPUID_TM, CPUID_PBE */
775 
776 /*
777  * Kernel-only features that can be shown to usermode programs even if
778  * they aren't actually supported by TCG, because qemu-user only runs
779  * in CPL=3; remove them if they are ever implemented for system emulation.
780  */
781 #if defined CONFIG_USER_ONLY
782 #define CPUID_EXT_KERNEL_FEATURES \
783           (CPUID_EXT_PCID | CPUID_EXT_TSC_DEADLINE_TIMER)
784 #else
785 #define CPUID_EXT_KERNEL_FEATURES 0
786 #endif
787 #define TCG_EXT_FEATURES (CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | \
788           CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | \
789           CPUID_EXT_SSE41 | CPUID_EXT_SSE42 | CPUID_EXT_POPCNT | \
790           CPUID_EXT_XSAVE | /* CPUID_EXT_OSXSAVE is dynamic */   \
791           CPUID_EXT_MOVBE | CPUID_EXT_AES | CPUID_EXT_HYPERVISOR | \
792           CPUID_EXT_RDRAND | CPUID_EXT_AVX | CPUID_EXT_F16C | \
793           CPUID_EXT_FMA | CPUID_EXT_X2APIC | CPUID_EXT_KERNEL_FEATURES)
794           /* missing:
795           CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_SMX,
796           CPUID_EXT_EST, CPUID_EXT_TM2, CPUID_EXT_CID,
797           CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_PCID, CPUID_EXT_DCA,
798           CPUID_EXT_TSC_DEADLINE_TIMER
799           */
800 
801 #ifdef TARGET_X86_64
802 #define TCG_EXT2_X86_64_FEATURES CPUID_EXT2_LM
803 #else
804 #define TCG_EXT2_X86_64_FEATURES 0
805 #endif
806 
807 /*
808  * CPUID_*_KERNEL_FEATURES denotes bits and features that are not usable
809  * in usermode or by 32-bit programs.  Those are added to supported
810  * TCG features unconditionally in user-mode emulation mode.  This may
811  * indeed seem strange or incorrect, but it works because code running
812  * under usermode emulation cannot access them.
813  *
814  * Even for long mode, qemu-i386 is not running "a userspace program on a
815  * 32-bit CPU"; it's running "a userspace program with a 32-bit code segment"
816  * and therefore using the 32-bit ABI; the CPU itself might be 64-bit
817  * but again the difference is only visible in kernel mode.
818  */
819 #if defined CONFIG_LINUX_USER
820 #define CPUID_EXT2_KERNEL_FEATURES (CPUID_EXT2_LM | CPUID_EXT2_FFXSR)
821 #elif defined CONFIG_USER_ONLY
822 /* FIXME: Long mode not yet supported for i386 bsd-user */
823 #define CPUID_EXT2_KERNEL_FEATURES CPUID_EXT2_FFXSR
824 #else
825 #define CPUID_EXT2_KERNEL_FEATURES 0
826 #endif
827 
828 #define TCG_EXT2_FEATURES ((TCG_FEATURES & CPUID_EXT2_AMD_ALIASES) | \
829           CPUID_EXT2_NX | CPUID_EXT2_MMXEXT | CPUID_EXT2_RDTSCP | \
830           CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_PDPE1GB | \
831           CPUID_EXT2_SYSCALL | TCG_EXT2_X86_64_FEATURES | \
832           CPUID_EXT2_KERNEL_FEATURES)
833 
834 #if defined CONFIG_USER_ONLY
835 #define CPUID_EXT3_KERNEL_FEATURES CPUID_EXT3_OSVW
836 #else
837 #define CPUID_EXT3_KERNEL_FEATURES 0
838 #endif
839 
840 #define TCG_EXT3_FEATURES (CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | \
841           CPUID_EXT3_CR8LEG | CPUID_EXT3_ABM | CPUID_EXT3_SSE4A | \
842           CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_KERNEL_FEATURES)
843 
844 #define TCG_EXT4_FEATURES 0
845 
846 #if defined CONFIG_USER_ONLY
847 #define CPUID_SVM_KERNEL_FEATURES (CPUID_SVM_NRIPSAVE | CPUID_SVM_VNMI)
848 #else
849 #define CPUID_SVM_KERNEL_FEATURES 0
850 #endif
851 #define TCG_SVM_FEATURES (CPUID_SVM_NPT | CPUID_SVM_VGIF | \
852           CPUID_SVM_SVME_ADDR_CHK | CPUID_SVM_KERNEL_FEATURES)
853 
854 #define TCG_KVM_FEATURES 0
855 
856 #if defined CONFIG_USER_ONLY
857 #define CPUID_7_0_EBX_KERNEL_FEATURES CPUID_7_0_EBX_INVPCID
858 #else
859 #define CPUID_7_0_EBX_KERNEL_FEATURES 0
860 #endif
861 #define TCG_7_0_EBX_FEATURES (CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_SMAP | \
862           CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX | \
863           CPUID_7_0_EBX_CLFLUSHOPT |            \
864           CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_FSGSBASE | \
865           CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_RDSEED | \
866           CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_KERNEL_FEATURES)
867           /* missing:
868           CPUID_7_0_EBX_HLE
869           CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM */
870 
871 #if !defined CONFIG_USER_ONLY || defined CONFIG_LINUX
872 #define TCG_7_0_ECX_RDPID CPUID_7_0_ECX_RDPID
873 #else
874 #define TCG_7_0_ECX_RDPID 0
875 #endif
876 #define TCG_7_0_ECX_FEATURES (CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | \
877           /* CPUID_7_0_ECX_OSPKE is dynamic */ \
878           CPUID_7_0_ECX_LA57 | CPUID_7_0_ECX_PKS | CPUID_7_0_ECX_VAES | \
879           TCG_7_0_ECX_RDPID)
880 
881 #if defined CONFIG_USER_ONLY
882 #define CPUID_7_0_EDX_KERNEL_FEATURES (CPUID_7_0_EDX_SPEC_CTRL | \
883           CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD)
884 #else
885 #define CPUID_7_0_EDX_KERNEL_FEATURES 0
886 #endif
887 #define TCG_7_0_EDX_FEATURES (CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_KERNEL_FEATURES)
888 
889 #define TCG_7_1_EAX_FEATURES (CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | \
890           CPUID_7_1_EAX_FSRC | CPUID_7_1_EAX_CMPCCXADD)
891 #define TCG_7_1_EDX_FEATURES 0
892 #define TCG_7_2_EDX_FEATURES 0
893 #define TCG_APM_FEATURES 0
894 #define TCG_6_EAX_FEATURES CPUID_6_EAX_ARAT
895 #define TCG_XSAVE_FEATURES (CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XGETBV1)
896           /* missing:
897           CPUID_XSAVE_XSAVEC, CPUID_XSAVE_XSAVES */
898 #define TCG_14_0_ECX_FEATURES 0
899 #define TCG_SGX_12_0_EAX_FEATURES 0
900 #define TCG_SGX_12_0_EBX_FEATURES 0
901 #define TCG_SGX_12_1_EAX_FEATURES 0
902 
903 #if defined CONFIG_USER_ONLY
904 #define CPUID_8000_0008_EBX_KERNEL_FEATURES (CPUID_8000_0008_EBX_IBPB | \
905           CPUID_8000_0008_EBX_IBRS | CPUID_8000_0008_EBX_STIBP | \
906           CPUID_8000_0008_EBX_STIBP_ALWAYS_ON | CPUID_8000_0008_EBX_AMD_SSBD | \
907           CPUID_8000_0008_EBX_AMD_PSFD)
908 #else
909 #define CPUID_8000_0008_EBX_KERNEL_FEATURES 0
910 #endif
911 
912 #define TCG_8000_0008_EBX  (CPUID_8000_0008_EBX_XSAVEERPTR | \
913           CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_KERNEL_FEATURES)
914 
915 FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
916     [FEAT_1_EDX] = {
917         .type = CPUID_FEATURE_WORD,
918         .feat_names = {
919             "fpu", "vme", "de", "pse",
920             "tsc", "msr", "pae", "mce",
921             "cx8", "apic", NULL, "sep",
922             "mtrr", "pge", "mca", "cmov",
923             "pat", "pse36", "pn" /* Intel psn */, "clflush" /* Intel clfsh */,
924             NULL, "ds" /* Intel dts */, "acpi", "mmx",
925             "fxsr", "sse", "sse2", "ss",
926             "ht" /* Intel htt */, "tm", "ia64", "pbe",
927         },
928         .cpuid = {.eax = 1, .reg = R_EDX, },
929         .tcg_features = TCG_FEATURES,
930         .no_autoenable_flags = CPUID_HT,
931     },
932     [FEAT_1_ECX] = {
933         .type = CPUID_FEATURE_WORD,
934         .feat_names = {
935             "pni" /* Intel,AMD sse3 */, "pclmulqdq", "dtes64", "monitor",
936             "ds-cpl", "vmx", "smx", "est",
937             "tm2", "ssse3", "cid", NULL,
938             "fma", "cx16", "xtpr", "pdcm",
939             NULL, "pcid", "dca", "sse4.1",
940             "sse4.2", "x2apic", "movbe", "popcnt",
941             "tsc-deadline", "aes", "xsave", NULL /* osxsave */,
942             "avx", "f16c", "rdrand", "hypervisor",
943         },
944         .cpuid = { .eax = 1, .reg = R_ECX, },
945         .tcg_features = TCG_EXT_FEATURES,
946     },
947     /* Feature names that are already defined on feature_name[] but
948      * are set on CPUID[8000_0001].EDX on AMD CPUs don't have their
949      * names on feat_names below. They are copied automatically
950      * to features[FEAT_8000_0001_EDX] if and only if CPU vendor is AMD.
951      */
952     [FEAT_8000_0001_EDX] = {
953         .type = CPUID_FEATURE_WORD,
954         .feat_names = {
955             NULL /* fpu */, NULL /* vme */, NULL /* de */, NULL /* pse */,
956             NULL /* tsc */, NULL /* msr */, NULL /* pae */, NULL /* mce */,
957             NULL /* cx8 */, NULL /* apic */, NULL, "syscall",
958             NULL /* mtrr */, NULL /* pge */, NULL /* mca */, NULL /* cmov */,
959             NULL /* pat */, NULL /* pse36 */, NULL, NULL /* Linux mp */,
960             "nx", NULL, "mmxext", NULL /* mmx */,
961             NULL /* fxsr */, "fxsr-opt", "pdpe1gb", "rdtscp",
962             NULL, "lm", "3dnowext", "3dnow",
963         },
964         .cpuid = { .eax = 0x80000001, .reg = R_EDX, },
965         .tcg_features = TCG_EXT2_FEATURES,
966     },
967     [FEAT_8000_0001_ECX] = {
968         .type = CPUID_FEATURE_WORD,
969         .feat_names = {
970             "lahf-lm", "cmp-legacy", "svm", "extapic",
971             "cr8legacy", "abm", "sse4a", "misalignsse",
972             "3dnowprefetch", "osvw", "ibs", "xop",
973             "skinit", "wdt", NULL, "lwp",
974             "fma4", "tce", NULL, "nodeid-msr",
975             NULL, "tbm", "topoext", "perfctr-core",
976             "perfctr-nb", NULL, NULL, NULL,
977             NULL, NULL, NULL, NULL,
978         },
979         .cpuid = { .eax = 0x80000001, .reg = R_ECX, },
980         .tcg_features = TCG_EXT3_FEATURES,
981         /*
982          * TOPOEXT is always allowed but can't be enabled blindly by
983          * "-cpu host", as it requires consistent cache topology info
984          * to be provided so it doesn't confuse guests.
985          */
986         .no_autoenable_flags = CPUID_EXT3_TOPOEXT,
987     },
988     [FEAT_C000_0001_EDX] = {
989         .type = CPUID_FEATURE_WORD,
990         .feat_names = {
991             NULL, NULL, "xstore", "xstore-en",
992             NULL, NULL, "xcrypt", "xcrypt-en",
993             "ace2", "ace2-en", "phe", "phe-en",
994             "pmm", "pmm-en", NULL, NULL,
995             NULL, NULL, NULL, NULL,
996             NULL, NULL, NULL, NULL,
997             NULL, NULL, NULL, NULL,
998             NULL, NULL, NULL, NULL,
999         },
1000         .cpuid = { .eax = 0xC0000001, .reg = R_EDX, },
1001         .tcg_features = TCG_EXT4_FEATURES,
1002     },
1003     [FEAT_KVM] = {
1004         .type = CPUID_FEATURE_WORD,
1005         .feat_names = {
1006             "kvmclock", "kvm-nopiodelay", "kvm-mmu", "kvmclock",
1007             "kvm-asyncpf", "kvm-steal-time", "kvm-pv-eoi", "kvm-pv-unhalt",
1008             NULL, "kvm-pv-tlb-flush", "kvm-asyncpf-vmexit", "kvm-pv-ipi",
1009             "kvm-poll-control", "kvm-pv-sched-yield", "kvm-asyncpf-int", "kvm-msi-ext-dest-id",
1010             NULL, NULL, NULL, NULL,
1011             NULL, NULL, NULL, NULL,
1012             "kvmclock-stable-bit", NULL, NULL, NULL,
1013             NULL, NULL, NULL, NULL,
1014         },
1015         .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EAX, },
1016         .tcg_features = TCG_KVM_FEATURES,
1017     },
1018     [FEAT_KVM_HINTS] = {
1019         .type = CPUID_FEATURE_WORD,
1020         .feat_names = {
1021             "kvm-hint-dedicated", NULL, NULL, NULL,
1022             NULL, NULL, NULL, NULL,
1023             NULL, NULL, NULL, NULL,
1024             NULL, NULL, NULL, NULL,
1025             NULL, NULL, NULL, NULL,
1026             NULL, NULL, NULL, NULL,
1027             NULL, NULL, NULL, NULL,
1028             NULL, NULL, NULL, NULL,
1029         },
1030         .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EDX, },
1031         .tcg_features = TCG_KVM_FEATURES,
1032         /*
1033          * KVM hints aren't auto-enabled by -cpu host, they need to be
1034          * explicitly enabled in the command-line.
1035          */
1036         .no_autoenable_flags = ~0U,
1037     },
1038     [FEAT_SVM] = {
1039         .type = CPUID_FEATURE_WORD,
1040         .feat_names = {
1041             "npt", "lbrv", "svm-lock", "nrip-save",
1042             "tsc-scale", "vmcb-clean",  "flushbyasid", "decodeassists",
1043             NULL, NULL, "pause-filter", NULL,
1044             "pfthreshold", "avic", NULL, "v-vmsave-vmload",
1045             "vgif", NULL, NULL, NULL,
1046             NULL, NULL, NULL, NULL,
1047             NULL, "vnmi", NULL, NULL,
1048             "svme-addr-chk", NULL, NULL, NULL,
1049         },
1050         .cpuid = { .eax = 0x8000000A, .reg = R_EDX, },
1051         .tcg_features = TCG_SVM_FEATURES,
1052     },
1053     [FEAT_7_0_EBX] = {
1054         .type = CPUID_FEATURE_WORD,
1055         .feat_names = {
1056             "fsgsbase", "tsc-adjust", "sgx", "bmi1",
1057             "hle", "avx2", NULL, "smep",
1058             "bmi2", "erms", "invpcid", "rtm",
1059             NULL, NULL, "mpx", NULL,
1060             "avx512f", "avx512dq", "rdseed", "adx",
1061             "smap", "avx512ifma", "pcommit", "clflushopt",
1062             "clwb", "intel-pt", "avx512pf", "avx512er",
1063             "avx512cd", "sha-ni", "avx512bw", "avx512vl",
1064         },
1065         .cpuid = {
1066             .eax = 7,
1067             .needs_ecx = true, .ecx = 0,
1068             .reg = R_EBX,
1069         },
1070         .tcg_features = TCG_7_0_EBX_FEATURES,
1071     },
1072     [FEAT_7_0_ECX] = {
1073         .type = CPUID_FEATURE_WORD,
1074         .feat_names = {
1075             NULL, "avx512vbmi", "umip", "pku",
1076             NULL /* ospke */, "waitpkg", "avx512vbmi2", NULL,
1077             "gfni", "vaes", "vpclmulqdq", "avx512vnni",
1078             "avx512bitalg", NULL, "avx512-vpopcntdq", NULL,
1079             "la57", NULL, NULL, NULL,
1080             NULL, NULL, "rdpid", NULL,
1081             "bus-lock-detect", "cldemote", NULL, "movdiri",
1082             "movdir64b", NULL, "sgxlc", "pks",
1083         },
1084         .cpuid = {
1085             .eax = 7,
1086             .needs_ecx = true, .ecx = 0,
1087             .reg = R_ECX,
1088         },
1089         .tcg_features = TCG_7_0_ECX_FEATURES,
1090     },
1091     [FEAT_7_0_EDX] = {
1092         .type = CPUID_FEATURE_WORD,
1093         .feat_names = {
1094             NULL, NULL, "avx512-4vnniw", "avx512-4fmaps",
1095             "fsrm", NULL, NULL, NULL,
1096             "avx512-vp2intersect", NULL, "md-clear", NULL,
1097             NULL, NULL, "serialize", NULL,
1098             "tsx-ldtrk", NULL, NULL /* pconfig */, "arch-lbr",
1099             NULL, NULL, "amx-bf16", "avx512-fp16",
1100             "amx-tile", "amx-int8", "spec-ctrl", "stibp",
1101             "flush-l1d", "arch-capabilities", "core-capability", "ssbd",
1102         },
1103         .cpuid = {
1104             .eax = 7,
1105             .needs_ecx = true, .ecx = 0,
1106             .reg = R_EDX,
1107         },
1108         .tcg_features = TCG_7_0_EDX_FEATURES,
1109     },
1110     [FEAT_7_1_EAX] = {
1111         .type = CPUID_FEATURE_WORD,
1112         .feat_names = {
1113             NULL, NULL, NULL, NULL,
1114             "avx-vnni", "avx512-bf16", NULL, "cmpccxadd",
1115             NULL, NULL, "fzrm", "fsrs",
1116             "fsrc", NULL, NULL, NULL,
1117             NULL, NULL, NULL, NULL,
1118             NULL, "amx-fp16", NULL, "avx-ifma",
1119             NULL, NULL, "lam", NULL,
1120             NULL, NULL, NULL, NULL,
1121         },
1122         .cpuid = {
1123             .eax = 7,
1124             .needs_ecx = true, .ecx = 1,
1125             .reg = R_EAX,
1126         },
1127         .tcg_features = TCG_7_1_EAX_FEATURES,
1128     },
1129     [FEAT_7_1_EDX] = {
1130         .type = CPUID_FEATURE_WORD,
1131         .feat_names = {
1132             NULL, NULL, NULL, NULL,
1133             "avx-vnni-int8", "avx-ne-convert", NULL, NULL,
1134             "amx-complex", NULL, NULL, NULL,
1135             NULL, NULL, "prefetchiti", NULL,
1136             NULL, NULL, NULL, NULL,
1137             NULL, NULL, NULL, NULL,
1138             NULL, NULL, NULL, NULL,
1139             NULL, NULL, NULL, NULL,
1140         },
1141         .cpuid = {
1142             .eax = 7,
1143             .needs_ecx = true, .ecx = 1,
1144             .reg = R_EDX,
1145         },
1146         .tcg_features = TCG_7_1_EDX_FEATURES,
1147     },
1148     [FEAT_7_2_EDX] = {
1149         .type = CPUID_FEATURE_WORD,
1150         .feat_names = {
1151             NULL, NULL, NULL, NULL,
1152             NULL, "mcdt-no", NULL, NULL,
1153             NULL, NULL, NULL, NULL,
1154             NULL, NULL, NULL, NULL,
1155             NULL, NULL, NULL, NULL,
1156             NULL, NULL, NULL, NULL,
1157             NULL, NULL, NULL, NULL,
1158             NULL, NULL, NULL, NULL,
1159         },
1160         .cpuid = {
1161             .eax = 7,
1162             .needs_ecx = true, .ecx = 2,
1163             .reg = R_EDX,
1164         },
1165         .tcg_features = TCG_7_2_EDX_FEATURES,
1166     },
1167     [FEAT_8000_0007_EDX] = {
1168         .type = CPUID_FEATURE_WORD,
1169         .feat_names = {
1170             NULL, NULL, NULL, NULL,
1171             NULL, NULL, NULL, NULL,
1172             "invtsc", NULL, NULL, NULL,
1173             NULL, NULL, NULL, NULL,
1174             NULL, NULL, NULL, NULL,
1175             NULL, NULL, NULL, NULL,
1176             NULL, NULL, NULL, NULL,
1177             NULL, NULL, NULL, NULL,
1178         },
1179         .cpuid = { .eax = 0x80000007, .reg = R_EDX, },
1180         .tcg_features = TCG_APM_FEATURES,
1181         .unmigratable_flags = CPUID_APM_INVTSC,
1182     },
1183     [FEAT_8000_0008_EBX] = {
1184         .type = CPUID_FEATURE_WORD,
1185         .feat_names = {
1186             "clzero", NULL, "xsaveerptr", NULL,
1187             NULL, NULL, NULL, NULL,
1188             NULL, "wbnoinvd", NULL, NULL,
1189             "ibpb", NULL, "ibrs", "amd-stibp",
1190             NULL, "stibp-always-on", NULL, NULL,
1191             NULL, NULL, NULL, NULL,
1192             "amd-ssbd", "virt-ssbd", "amd-no-ssb", NULL,
1193             "amd-psfd", NULL, NULL, NULL,
1194         },
1195         .cpuid = { .eax = 0x80000008, .reg = R_EBX, },
1196         .tcg_features = TCG_8000_0008_EBX,
1197         .unmigratable_flags = 0,
1198     },
1199     [FEAT_8000_0021_EAX] = {
1200         .type = CPUID_FEATURE_WORD,
1201         .feat_names = {
1202             "no-nested-data-bp", NULL, "lfence-always-serializing", NULL,
1203             NULL, NULL, "null-sel-clr-base", NULL,
1204             "auto-ibrs", NULL, NULL, NULL,
1205             NULL, NULL, NULL, NULL,
1206             NULL, NULL, NULL, NULL,
1207             NULL, NULL, NULL, NULL,
1208             NULL, NULL, NULL, NULL,
1209             NULL, NULL, NULL, NULL,
1210         },
1211         .cpuid = { .eax = 0x80000021, .reg = R_EAX, },
1212         .tcg_features = 0,
1213         .unmigratable_flags = 0,
1214     },
1215     [FEAT_XSAVE] = {
1216         .type = CPUID_FEATURE_WORD,
1217         .feat_names = {
1218             "xsaveopt", "xsavec", "xgetbv1", "xsaves",
1219             "xfd", NULL, NULL, NULL,
1220             NULL, NULL, NULL, NULL,
1221             NULL, NULL, NULL, NULL,
1222             NULL, NULL, NULL, NULL,
1223             NULL, NULL, NULL, NULL,
1224             NULL, NULL, NULL, NULL,
1225             NULL, NULL, NULL, NULL,
1226         },
1227         .cpuid = {
1228             .eax = 0xd,
1229             .needs_ecx = true, .ecx = 1,
1230             .reg = R_EAX,
1231         },
1232         .tcg_features = TCG_XSAVE_FEATURES,
1233     },
1234     [FEAT_XSAVE_XSS_LO] = {
1235         .type = CPUID_FEATURE_WORD,
1236         .feat_names = {
1237             NULL, NULL, NULL, NULL,
1238             NULL, NULL, NULL, NULL,
1239             NULL, NULL, NULL, NULL,
1240             NULL, NULL, NULL, NULL,
1241             NULL, NULL, NULL, NULL,
1242             NULL, NULL, NULL, NULL,
1243             NULL, NULL, NULL, NULL,
1244             NULL, NULL, NULL, NULL,
1245         },
1246         .cpuid = {
1247             .eax = 0xD,
1248             .needs_ecx = true,
1249             .ecx = 1,
1250             .reg = R_ECX,
1251         },
1252     },
1253     [FEAT_XSAVE_XSS_HI] = {
1254         .type = CPUID_FEATURE_WORD,
1255         .cpuid = {
1256             .eax = 0xD,
1257             .needs_ecx = true,
1258             .ecx = 1,
1259             .reg = R_EDX
1260         },
1261     },
1262     [FEAT_6_EAX] = {
1263         .type = CPUID_FEATURE_WORD,
1264         .feat_names = {
1265             NULL, NULL, "arat", NULL,
1266             NULL, NULL, NULL, NULL,
1267             NULL, NULL, NULL, NULL,
1268             NULL, NULL, NULL, NULL,
1269             NULL, NULL, NULL, NULL,
1270             NULL, NULL, NULL, NULL,
1271             NULL, NULL, NULL, NULL,
1272             NULL, NULL, NULL, NULL,
1273         },
1274         .cpuid = { .eax = 6, .reg = R_EAX, },
1275         .tcg_features = TCG_6_EAX_FEATURES,
1276     },
1277     [FEAT_XSAVE_XCR0_LO] = {
1278         .type = CPUID_FEATURE_WORD,
1279         .cpuid = {
1280             .eax = 0xD,
1281             .needs_ecx = true, .ecx = 0,
1282             .reg = R_EAX,
1283         },
1284         .tcg_features = ~0U,
1285         .migratable_flags = XSTATE_FP_MASK | XSTATE_SSE_MASK |
1286             XSTATE_YMM_MASK | XSTATE_BNDREGS_MASK | XSTATE_BNDCSR_MASK |
1287             XSTATE_OPMASK_MASK | XSTATE_ZMM_Hi256_MASK | XSTATE_Hi16_ZMM_MASK |
1288             XSTATE_PKRU_MASK,
1289     },
1290     [FEAT_XSAVE_XCR0_HI] = {
1291         .type = CPUID_FEATURE_WORD,
1292         .cpuid = {
1293             .eax = 0xD,
1294             .needs_ecx = true, .ecx = 0,
1295             .reg = R_EDX,
1296         },
1297         .tcg_features = ~0U,
1298     },
1299     /*Below are MSR exposed features*/
1300     [FEAT_ARCH_CAPABILITIES] = {
1301         .type = MSR_FEATURE_WORD,
1302         .feat_names = {
1303             "rdctl-no", "ibrs-all", "rsba", "skip-l1dfl-vmentry",
1304             "ssb-no", "mds-no", "pschange-mc-no", "tsx-ctrl",
1305             "taa-no", NULL, NULL, NULL,
1306             NULL, "sbdr-ssdp-no", "fbsdp-no", "psdp-no",
1307             NULL, "fb-clear", NULL, NULL,
1308             NULL, NULL, NULL, NULL,
1309             "pbrsb-no", NULL, "gds-no", "rfds-no",
1310             "rfds-clear", NULL, NULL, NULL,
1311         },
1312         .msr = {
1313             .index = MSR_IA32_ARCH_CAPABILITIES,
1314         },
1315         /*
1316          * FEAT_ARCH_CAPABILITIES only affects a read-only MSR, which
1317          * cannot be read from user mode.  Therefore, it has no impact
1318          > on any user-mode operation, and warnings about unsupported
1319          * features do not matter.
1320          */
1321         .tcg_features = ~0U,
1322     },
1323     [FEAT_CORE_CAPABILITY] = {
1324         .type = MSR_FEATURE_WORD,
1325         .feat_names = {
1326             NULL, NULL, NULL, NULL,
1327             NULL, "split-lock-detect", NULL, NULL,
1328             NULL, NULL, NULL, NULL,
1329             NULL, NULL, NULL, NULL,
1330             NULL, NULL, NULL, NULL,
1331             NULL, NULL, NULL, NULL,
1332             NULL, NULL, NULL, NULL,
1333             NULL, NULL, NULL, NULL,
1334         },
1335         .msr = {
1336             .index = MSR_IA32_CORE_CAPABILITY,
1337         },
1338     },
1339     [FEAT_PERF_CAPABILITIES] = {
1340         .type = MSR_FEATURE_WORD,
1341         .feat_names = {
1342             NULL, NULL, NULL, NULL,
1343             NULL, NULL, NULL, NULL,
1344             NULL, NULL, NULL, NULL,
1345             NULL, "full-width-write", NULL, NULL,
1346             NULL, NULL, NULL, NULL,
1347             NULL, NULL, NULL, NULL,
1348             NULL, NULL, NULL, NULL,
1349             NULL, NULL, NULL, NULL,
1350         },
1351         .msr = {
1352             .index = MSR_IA32_PERF_CAPABILITIES,
1353         },
1354     },
1355 
1356     [FEAT_VMX_PROCBASED_CTLS] = {
1357         .type = MSR_FEATURE_WORD,
1358         .feat_names = {
1359             NULL, NULL, "vmx-vintr-pending", "vmx-tsc-offset",
1360             NULL, NULL, NULL, "vmx-hlt-exit",
1361             NULL, "vmx-invlpg-exit", "vmx-mwait-exit", "vmx-rdpmc-exit",
1362             "vmx-rdtsc-exit", NULL, NULL, "vmx-cr3-load-noexit",
1363             "vmx-cr3-store-noexit", NULL, NULL, "vmx-cr8-load-exit",
1364             "vmx-cr8-store-exit", "vmx-flexpriority", "vmx-vnmi-pending", "vmx-movdr-exit",
1365             "vmx-io-exit", "vmx-io-bitmap", NULL, "vmx-mtf",
1366             "vmx-msr-bitmap", "vmx-monitor-exit", "vmx-pause-exit", "vmx-secondary-ctls",
1367         },
1368         .msr = {
1369             .index = MSR_IA32_VMX_TRUE_PROCBASED_CTLS,
1370         }
1371     },
1372 
1373     [FEAT_VMX_SECONDARY_CTLS] = {
1374         .type = MSR_FEATURE_WORD,
1375         .feat_names = {
1376             "vmx-apicv-xapic", "vmx-ept", "vmx-desc-exit", "vmx-rdtscp-exit",
1377             "vmx-apicv-x2apic", "vmx-vpid", "vmx-wbinvd-exit", "vmx-unrestricted-guest",
1378             "vmx-apicv-register", "vmx-apicv-vid", "vmx-ple", "vmx-rdrand-exit",
1379             "vmx-invpcid-exit", "vmx-vmfunc", "vmx-shadow-vmcs", "vmx-encls-exit",
1380             "vmx-rdseed-exit", "vmx-pml", NULL, NULL,
1381             "vmx-xsaves", NULL, NULL, NULL,
1382             NULL, "vmx-tsc-scaling", "vmx-enable-user-wait-pause", NULL,
1383             NULL, NULL, NULL, NULL,
1384         },
1385         .msr = {
1386             .index = MSR_IA32_VMX_PROCBASED_CTLS2,
1387         }
1388     },
1389 
1390     [FEAT_VMX_PINBASED_CTLS] = {
1391         .type = MSR_FEATURE_WORD,
1392         .feat_names = {
1393             "vmx-intr-exit", NULL, NULL, "vmx-nmi-exit",
1394             NULL, "vmx-vnmi", "vmx-preemption-timer", "vmx-posted-intr",
1395             NULL, NULL, NULL, NULL,
1396             NULL, NULL, NULL, NULL,
1397             NULL, NULL, NULL, NULL,
1398             NULL, NULL, NULL, NULL,
1399             NULL, NULL, NULL, NULL,
1400             NULL, NULL, NULL, NULL,
1401         },
1402         .msr = {
1403             .index = MSR_IA32_VMX_TRUE_PINBASED_CTLS,
1404         }
1405     },
1406 
1407     [FEAT_VMX_EXIT_CTLS] = {
1408         .type = MSR_FEATURE_WORD,
1409         /*
1410          * VMX_VM_EXIT_HOST_ADDR_SPACE_SIZE is copied from
1411          * the LM CPUID bit.
1412          */
1413         .feat_names = {
1414             NULL, NULL, "vmx-exit-nosave-debugctl", NULL,
1415             NULL, NULL, NULL, NULL,
1416             NULL, NULL /* vmx-exit-host-addr-space-size */, NULL, NULL,
1417             "vmx-exit-load-perf-global-ctrl", NULL, NULL, "vmx-exit-ack-intr",
1418             NULL, NULL, "vmx-exit-save-pat", "vmx-exit-load-pat",
1419             "vmx-exit-save-efer", "vmx-exit-load-efer",
1420                 "vmx-exit-save-preemption-timer", "vmx-exit-clear-bndcfgs",
1421             NULL, "vmx-exit-clear-rtit-ctl", NULL, NULL,
1422             NULL, "vmx-exit-load-pkrs", NULL, NULL,
1423         },
1424         .msr = {
1425             .index = MSR_IA32_VMX_TRUE_EXIT_CTLS,
1426         }
1427     },
1428 
1429     [FEAT_VMX_ENTRY_CTLS] = {
1430         .type = MSR_FEATURE_WORD,
1431         .feat_names = {
1432             NULL, NULL, "vmx-entry-noload-debugctl", NULL,
1433             NULL, NULL, NULL, NULL,
1434             NULL, "vmx-entry-ia32e-mode", NULL, NULL,
1435             NULL, "vmx-entry-load-perf-global-ctrl", "vmx-entry-load-pat", "vmx-entry-load-efer",
1436             "vmx-entry-load-bndcfgs", NULL, "vmx-entry-load-rtit-ctl", NULL,
1437             NULL, NULL, "vmx-entry-load-pkrs", NULL,
1438             NULL, NULL, NULL, NULL,
1439             NULL, NULL, NULL, NULL,
1440         },
1441         .msr = {
1442             .index = MSR_IA32_VMX_TRUE_ENTRY_CTLS,
1443         }
1444     },
1445 
1446     [FEAT_VMX_MISC] = {
1447         .type = MSR_FEATURE_WORD,
1448         .feat_names = {
1449             NULL, NULL, NULL, NULL,
1450             NULL, "vmx-store-lma", "vmx-activity-hlt", "vmx-activity-shutdown",
1451             "vmx-activity-wait-sipi", NULL, NULL, NULL,
1452             NULL, NULL, NULL, NULL,
1453             NULL, NULL, NULL, NULL,
1454             NULL, NULL, NULL, NULL,
1455             NULL, NULL, NULL, NULL,
1456             NULL, "vmx-vmwrite-vmexit-fields", "vmx-zero-len-inject", NULL,
1457         },
1458         .msr = {
1459             .index = MSR_IA32_VMX_MISC,
1460         }
1461     },
1462 
1463     [FEAT_VMX_EPT_VPID_CAPS] = {
1464         .type = MSR_FEATURE_WORD,
1465         .feat_names = {
1466             "vmx-ept-execonly", NULL, NULL, NULL,
1467             NULL, NULL, "vmx-page-walk-4", "vmx-page-walk-5",
1468             NULL, NULL, NULL, NULL,
1469             NULL, NULL, NULL, NULL,
1470             "vmx-ept-2mb", "vmx-ept-1gb", NULL, NULL,
1471             "vmx-invept", "vmx-eptad", "vmx-ept-advanced-exitinfo", NULL,
1472             NULL, "vmx-invept-single-context", "vmx-invept-all-context", NULL,
1473             NULL, NULL, NULL, NULL,
1474             "vmx-invvpid", NULL, NULL, NULL,
1475             NULL, NULL, NULL, NULL,
1476             "vmx-invvpid-single-addr", "vmx-invept-single-context",
1477                 "vmx-invvpid-all-context", "vmx-invept-single-context-noglobals",
1478             NULL, NULL, NULL, NULL,
1479             NULL, NULL, NULL, NULL,
1480             NULL, NULL, NULL, NULL,
1481             NULL, NULL, NULL, NULL,
1482             NULL, NULL, NULL, NULL,
1483         },
1484         .msr = {
1485             .index = MSR_IA32_VMX_EPT_VPID_CAP,
1486         }
1487     },
1488 
1489     [FEAT_VMX_BASIC] = {
1490         .type = MSR_FEATURE_WORD,
1491         .feat_names = {
1492             [54] = "vmx-ins-outs",
1493             [55] = "vmx-true-ctls",
1494             [56] = "vmx-any-errcode",
1495         },
1496         .msr = {
1497             .index = MSR_IA32_VMX_BASIC,
1498         },
1499         /* Just to be safe - we don't support setting the MSEG version field.  */
1500         .no_autoenable_flags = MSR_VMX_BASIC_DUAL_MONITOR,
1501     },
1502 
1503     [FEAT_VMX_VMFUNC] = {
1504         .type = MSR_FEATURE_WORD,
1505         .feat_names = {
1506             [0] = "vmx-eptp-switching",
1507         },
1508         .msr = {
1509             .index = MSR_IA32_VMX_VMFUNC,
1510         }
1511     },
1512 
1513     [FEAT_14_0_ECX] = {
1514         .type = CPUID_FEATURE_WORD,
1515         .feat_names = {
1516             NULL, NULL, NULL, NULL,
1517             NULL, NULL, NULL, NULL,
1518             NULL, NULL, NULL, NULL,
1519             NULL, NULL, NULL, NULL,
1520             NULL, NULL, NULL, NULL,
1521             NULL, NULL, NULL, NULL,
1522             NULL, NULL, NULL, NULL,
1523             NULL, NULL, NULL, "intel-pt-lip",
1524         },
1525         .cpuid = {
1526             .eax = 0x14,
1527             .needs_ecx = true, .ecx = 0,
1528             .reg = R_ECX,
1529         },
1530         .tcg_features = TCG_14_0_ECX_FEATURES,
1531      },
1532 
1533     [FEAT_SGX_12_0_EAX] = {
1534         .type = CPUID_FEATURE_WORD,
1535         .feat_names = {
1536             "sgx1", "sgx2", NULL, NULL,
1537             NULL, NULL, NULL, NULL,
1538             NULL, NULL, NULL, "sgx-edeccssa",
1539             NULL, NULL, NULL, NULL,
1540             NULL, NULL, NULL, NULL,
1541             NULL, NULL, NULL, NULL,
1542             NULL, NULL, NULL, NULL,
1543             NULL, NULL, NULL, NULL,
1544         },
1545         .cpuid = {
1546             .eax = 0x12,
1547             .needs_ecx = true, .ecx = 0,
1548             .reg = R_EAX,
1549         },
1550         .tcg_features = TCG_SGX_12_0_EAX_FEATURES,
1551     },
1552 
1553     [FEAT_SGX_12_0_EBX] = {
1554         .type = CPUID_FEATURE_WORD,
1555         .feat_names = {
1556             "sgx-exinfo" , NULL, NULL, NULL,
1557             NULL, NULL, NULL, NULL,
1558             NULL, NULL, NULL, NULL,
1559             NULL, NULL, NULL, NULL,
1560             NULL, NULL, NULL, NULL,
1561             NULL, NULL, NULL, NULL,
1562             NULL, NULL, NULL, NULL,
1563             NULL, NULL, NULL, NULL,
1564         },
1565         .cpuid = {
1566             .eax = 0x12,
1567             .needs_ecx = true, .ecx = 0,
1568             .reg = R_EBX,
1569         },
1570         .tcg_features = TCG_SGX_12_0_EBX_FEATURES,
1571     },
1572 
1573     [FEAT_SGX_12_1_EAX] = {
1574         .type = CPUID_FEATURE_WORD,
1575         .feat_names = {
1576             NULL, "sgx-debug", "sgx-mode64", NULL,
1577             "sgx-provisionkey", "sgx-tokenkey", NULL, "sgx-kss",
1578             NULL, NULL, "sgx-aex-notify", NULL,
1579             NULL, NULL, NULL, NULL,
1580             NULL, NULL, NULL, NULL,
1581             NULL, NULL, NULL, NULL,
1582             NULL, NULL, NULL, NULL,
1583             NULL, NULL, NULL, NULL,
1584         },
1585         .cpuid = {
1586             .eax = 0x12,
1587             .needs_ecx = true, .ecx = 1,
1588             .reg = R_EAX,
1589         },
1590         .tcg_features = TCG_SGX_12_1_EAX_FEATURES,
1591     },
1592 };
1593 
1594 typedef struct FeatureMask {
1595     FeatureWord index;
1596     uint64_t mask;
1597 } FeatureMask;
1598 
1599 typedef struct FeatureDep {
1600     FeatureMask from, to;
1601 } FeatureDep;
1602 
1603 static FeatureDep feature_dependencies[] = {
1604     {
1605         .from = { FEAT_7_0_EDX,             CPUID_7_0_EDX_ARCH_CAPABILITIES },
1606         .to = { FEAT_ARCH_CAPABILITIES,     ~0ull },
1607     },
1608     {
1609         .from = { FEAT_7_0_EDX,             CPUID_7_0_EDX_CORE_CAPABILITY },
1610         .to = { FEAT_CORE_CAPABILITY,       ~0ull },
1611     },
1612     {
1613         .from = { FEAT_1_ECX,             CPUID_EXT_PDCM },
1614         .to = { FEAT_PERF_CAPABILITIES,       ~0ull },
1615     },
1616     {
1617         .from = { FEAT_1_ECX,               CPUID_EXT_VMX },
1618         .to = { FEAT_VMX_PROCBASED_CTLS,    ~0ull },
1619     },
1620     {
1621         .from = { FEAT_1_ECX,               CPUID_EXT_VMX },
1622         .to = { FEAT_VMX_PINBASED_CTLS,     ~0ull },
1623     },
1624     {
1625         .from = { FEAT_1_ECX,               CPUID_EXT_VMX },
1626         .to = { FEAT_VMX_EXIT_CTLS,         ~0ull },
1627     },
1628     {
1629         .from = { FEAT_1_ECX,               CPUID_EXT_VMX },
1630         .to = { FEAT_VMX_ENTRY_CTLS,        ~0ull },
1631     },
1632     {
1633         .from = { FEAT_1_ECX,               CPUID_EXT_VMX },
1634         .to = { FEAT_VMX_MISC,              ~0ull },
1635     },
1636     {
1637         .from = { FEAT_1_ECX,               CPUID_EXT_VMX },
1638         .to = { FEAT_VMX_BASIC,             ~0ull },
1639     },
1640     {
1641         .from = { FEAT_8000_0001_EDX,       CPUID_EXT2_LM },
1642         .to = { FEAT_VMX_ENTRY_CTLS,        VMX_VM_ENTRY_IA32E_MODE },
1643     },
1644     {
1645         .from = { FEAT_VMX_PROCBASED_CTLS,  VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS },
1646         .to = { FEAT_VMX_SECONDARY_CTLS,    ~0ull },
1647     },
1648     {
1649         .from = { FEAT_XSAVE,               CPUID_XSAVE_XSAVES },
1650         .to = { FEAT_VMX_SECONDARY_CTLS,    VMX_SECONDARY_EXEC_XSAVES },
1651     },
1652     {
1653         .from = { FEAT_1_ECX,               CPUID_EXT_RDRAND },
1654         .to = { FEAT_VMX_SECONDARY_CTLS,    VMX_SECONDARY_EXEC_RDRAND_EXITING },
1655     },
1656     {
1657         .from = { FEAT_7_0_EBX,             CPUID_7_0_EBX_INVPCID },
1658         .to = { FEAT_VMX_SECONDARY_CTLS,    VMX_SECONDARY_EXEC_ENABLE_INVPCID },
1659     },
1660     {
1661         .from = { FEAT_7_0_EBX,             CPUID_7_0_EBX_MPX },
1662         .to = { FEAT_VMX_EXIT_CTLS,         VMX_VM_EXIT_CLEAR_BNDCFGS },
1663     },
1664     {
1665         .from = { FEAT_7_0_EBX,             CPUID_7_0_EBX_MPX },
1666         .to = { FEAT_VMX_ENTRY_CTLS,        VMX_VM_ENTRY_LOAD_BNDCFGS },
1667     },
1668     {
1669         .from = { FEAT_7_0_EBX,             CPUID_7_0_EBX_RDSEED },
1670         .to = { FEAT_VMX_SECONDARY_CTLS,    VMX_SECONDARY_EXEC_RDSEED_EXITING },
1671     },
1672     {
1673         .from = { FEAT_7_0_EBX,             CPUID_7_0_EBX_INTEL_PT },
1674         .to = { FEAT_14_0_ECX,              ~0ull },
1675     },
1676     {
1677         .from = { FEAT_8000_0001_EDX,       CPUID_EXT2_RDTSCP },
1678         .to = { FEAT_VMX_SECONDARY_CTLS,    VMX_SECONDARY_EXEC_RDTSCP },
1679     },
1680     {
1681         .from = { FEAT_VMX_SECONDARY_CTLS,  VMX_SECONDARY_EXEC_ENABLE_EPT },
1682         .to = { FEAT_VMX_EPT_VPID_CAPS,     0xffffffffull },
1683     },
1684     {
1685         .from = { FEAT_VMX_SECONDARY_CTLS,  VMX_SECONDARY_EXEC_ENABLE_EPT },
1686         .to = { FEAT_VMX_SECONDARY_CTLS,    VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST },
1687     },
1688     {
1689         .from = { FEAT_VMX_SECONDARY_CTLS,  VMX_SECONDARY_EXEC_ENABLE_VPID },
1690         .to = { FEAT_VMX_EPT_VPID_CAPS,     0xffffffffull << 32 },
1691     },
1692     {
1693         .from = { FEAT_VMX_SECONDARY_CTLS,  VMX_SECONDARY_EXEC_ENABLE_VMFUNC },
1694         .to = { FEAT_VMX_VMFUNC,            ~0ull },
1695     },
1696     {
1697         .from = { FEAT_8000_0001_ECX,       CPUID_EXT3_SVM },
1698         .to = { FEAT_SVM,                   ~0ull },
1699     },
1700     {
1701         .from = { FEAT_7_0_ECX,             CPUID_7_0_ECX_WAITPKG },
1702         .to = { FEAT_VMX_SECONDARY_CTLS,    VMX_SECONDARY_EXEC_ENABLE_USER_WAIT_PAUSE },
1703     },
1704 };
1705 
1706 typedef struct X86RegisterInfo32 {
1707     /* Name of register */
1708     const char *name;
1709     /* QAPI enum value register */
1710     X86CPURegister32 qapi_enum;
1711 } X86RegisterInfo32;
1712 
1713 #define REGISTER(reg) \
1714     [R_##reg] = { .name = #reg, .qapi_enum = X86_CPU_REGISTER32_##reg }
1715 static const X86RegisterInfo32 x86_reg_info_32[CPU_NB_REGS32] = {
1716     REGISTER(EAX),
1717     REGISTER(ECX),
1718     REGISTER(EDX),
1719     REGISTER(EBX),
1720     REGISTER(ESP),
1721     REGISTER(EBP),
1722     REGISTER(ESI),
1723     REGISTER(EDI),
1724 };
1725 #undef REGISTER
1726 
1727 /* CPUID feature bits available in XSS */
1728 #define CPUID_XSTATE_XSS_MASK    (XSTATE_ARCH_LBR_MASK)
1729 
1730 ExtSaveArea x86_ext_save_areas[XSAVE_STATE_AREA_COUNT] = {
1731     [XSTATE_FP_BIT] = {
1732         /* x87 FP state component is always enabled if XSAVE is supported */
1733         .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
1734         .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1735     },
1736     [XSTATE_SSE_BIT] = {
1737         /* SSE state component is always enabled if XSAVE is supported */
1738         .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
1739         .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1740     },
1741     [XSTATE_YMM_BIT] =
1742           { .feature = FEAT_1_ECX, .bits = CPUID_EXT_AVX,
1743             .size = sizeof(XSaveAVX) },
1744     [XSTATE_BNDREGS_BIT] =
1745           { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
1746             .size = sizeof(XSaveBNDREG)  },
1747     [XSTATE_BNDCSR_BIT] =
1748           { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
1749             .size = sizeof(XSaveBNDCSR)  },
1750     [XSTATE_OPMASK_BIT] =
1751           { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1752             .size = sizeof(XSaveOpmask) },
1753     [XSTATE_ZMM_Hi256_BIT] =
1754           { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1755             .size = sizeof(XSaveZMM_Hi256) },
1756     [XSTATE_Hi16_ZMM_BIT] =
1757           { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1758             .size = sizeof(XSaveHi16_ZMM) },
1759     [XSTATE_PKRU_BIT] =
1760           { .feature = FEAT_7_0_ECX, .bits = CPUID_7_0_ECX_PKU,
1761             .size = sizeof(XSavePKRU) },
1762     [XSTATE_ARCH_LBR_BIT] = {
1763             .feature = FEAT_7_0_EDX, .bits = CPUID_7_0_EDX_ARCH_LBR,
1764             .offset = 0 /*supervisor mode component, offset = 0 */,
1765             .size = sizeof(XSavesArchLBR) },
1766     [XSTATE_XTILE_CFG_BIT] = {
1767         .feature = FEAT_7_0_EDX, .bits = CPUID_7_0_EDX_AMX_TILE,
1768         .size = sizeof(XSaveXTILECFG),
1769     },
1770     [XSTATE_XTILE_DATA_BIT] = {
1771         .feature = FEAT_7_0_EDX, .bits = CPUID_7_0_EDX_AMX_TILE,
1772         .size = sizeof(XSaveXTILEDATA)
1773     },
1774 };
1775 
1776 uint32_t xsave_area_size(uint64_t mask, bool compacted)
1777 {
1778     uint64_t ret = x86_ext_save_areas[0].size;
1779     const ExtSaveArea *esa;
1780     uint32_t offset = 0;
1781     int i;
1782 
1783     for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
1784         esa = &x86_ext_save_areas[i];
1785         if ((mask >> i) & 1) {
1786             offset = compacted ? ret : esa->offset;
1787             ret = MAX(ret, offset + esa->size);
1788         }
1789     }
1790     return ret;
1791 }
1792 
1793 static inline bool accel_uses_host_cpuid(void)
1794 {
1795     return kvm_enabled() || hvf_enabled();
1796 }
1797 
1798 static inline uint64_t x86_cpu_xsave_xcr0_components(X86CPU *cpu)
1799 {
1800     return ((uint64_t)cpu->env.features[FEAT_XSAVE_XCR0_HI]) << 32 |
1801            cpu->env.features[FEAT_XSAVE_XCR0_LO];
1802 }
1803 
1804 /* Return name of 32-bit register, from a R_* constant */
1805 static const char *get_register_name_32(unsigned int reg)
1806 {
1807     if (reg >= CPU_NB_REGS32) {
1808         return NULL;
1809     }
1810     return x86_reg_info_32[reg].name;
1811 }
1812 
1813 static inline uint64_t x86_cpu_xsave_xss_components(X86CPU *cpu)
1814 {
1815     return ((uint64_t)cpu->env.features[FEAT_XSAVE_XSS_HI]) << 32 |
1816            cpu->env.features[FEAT_XSAVE_XSS_LO];
1817 }
1818 
1819 /*
1820  * Returns the set of feature flags that are supported and migratable by
1821  * QEMU, for a given FeatureWord.
1822  */
1823 static uint64_t x86_cpu_get_migratable_flags(FeatureWord w)
1824 {
1825     FeatureWordInfo *wi = &feature_word_info[w];
1826     uint64_t r = 0;
1827     int i;
1828 
1829     for (i = 0; i < 64; i++) {
1830         uint64_t f = 1ULL << i;
1831 
1832         /* If the feature name is known, it is implicitly considered migratable,
1833          * unless it is explicitly set in unmigratable_flags */
1834         if ((wi->migratable_flags & f) ||
1835             (wi->feat_names[i] && !(wi->unmigratable_flags & f))) {
1836             r |= f;
1837         }
1838     }
1839     return r;
1840 }
1841 
1842 void host_cpuid(uint32_t function, uint32_t count,
1843                 uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
1844 {
1845     uint32_t vec[4];
1846 
1847 #ifdef __x86_64__
1848     asm volatile("cpuid"
1849                  : "=a"(vec[0]), "=b"(vec[1]),
1850                    "=c"(vec[2]), "=d"(vec[3])
1851                  : "0"(function), "c"(count) : "cc");
1852 #elif defined(__i386__)
1853     asm volatile("pusha \n\t"
1854                  "cpuid \n\t"
1855                  "mov %%eax, 0(%2) \n\t"
1856                  "mov %%ebx, 4(%2) \n\t"
1857                  "mov %%ecx, 8(%2) \n\t"
1858                  "mov %%edx, 12(%2) \n\t"
1859                  "popa"
1860                  : : "a"(function), "c"(count), "S"(vec)
1861                  : "memory", "cc");
1862 #else
1863     abort();
1864 #endif
1865 
1866     if (eax)
1867         *eax = vec[0];
1868     if (ebx)
1869         *ebx = vec[1];
1870     if (ecx)
1871         *ecx = vec[2];
1872     if (edx)
1873         *edx = vec[3];
1874 }
1875 
1876 /* CPU class name definitions: */
1877 
1878 /* Return type name for a given CPU model name
1879  * Caller is responsible for freeing the returned string.
1880  */
1881 static char *x86_cpu_type_name(const char *model_name)
1882 {
1883     return g_strdup_printf(X86_CPU_TYPE_NAME("%s"), model_name);
1884 }
1885 
1886 static ObjectClass *x86_cpu_class_by_name(const char *cpu_model)
1887 {
1888     g_autofree char *typename = x86_cpu_type_name(cpu_model);
1889     return object_class_by_name(typename);
1890 }
1891 
1892 static char *x86_cpu_class_get_model_name(X86CPUClass *cc)
1893 {
1894     const char *class_name = object_class_get_name(OBJECT_CLASS(cc));
1895     assert(g_str_has_suffix(class_name, X86_CPU_TYPE_SUFFIX));
1896     return cpu_model_from_type(class_name);
1897 }
1898 
1899 typedef struct X86CPUVersionDefinition {
1900     X86CPUVersion version;
1901     const char *alias;
1902     const char *note;
1903     PropValue *props;
1904     const CPUCaches *const cache_info;
1905 } X86CPUVersionDefinition;
1906 
1907 /* Base definition for a CPU model */
1908 typedef struct X86CPUDefinition {
1909     const char *name;
1910     uint32_t level;
1911     uint32_t xlevel;
1912     /* vendor is zero-terminated, 12 character ASCII string */
1913     char vendor[CPUID_VENDOR_SZ + 1];
1914     int family;
1915     int model;
1916     int stepping;
1917     FeatureWordArray features;
1918     const char *model_id;
1919     const CPUCaches *const cache_info;
1920     /*
1921      * Definitions for alternative versions of CPU model.
1922      * List is terminated by item with version == 0.
1923      * If NULL, version 1 will be registered automatically.
1924      */
1925     const X86CPUVersionDefinition *versions;
1926     const char *deprecation_note;
1927 } X86CPUDefinition;
1928 
1929 /* Reference to a specific CPU model version */
1930 struct X86CPUModel {
1931     /* Base CPU definition */
1932     const X86CPUDefinition *cpudef;
1933     /* CPU model version */
1934     X86CPUVersion version;
1935     const char *note;
1936     /*
1937      * If true, this is an alias CPU model.
1938      * This matters only for "-cpu help" and query-cpu-definitions
1939      */
1940     bool is_alias;
1941 };
1942 
1943 /* Get full model name for CPU version */
1944 static char *x86_cpu_versioned_model_name(const X86CPUDefinition *cpudef,
1945                                           X86CPUVersion version)
1946 {
1947     assert(version > 0);
1948     return g_strdup_printf("%s-v%d", cpudef->name, (int)version);
1949 }
1950 
1951 static const X86CPUVersionDefinition *
1952 x86_cpu_def_get_versions(const X86CPUDefinition *def)
1953 {
1954     /* When X86CPUDefinition::versions is NULL, we register only v1 */
1955     static const X86CPUVersionDefinition default_version_list[] = {
1956         { 1 },
1957         { /* end of list */ }
1958     };
1959 
1960     return def->versions ?: default_version_list;
1961 }
1962 
1963 static const CPUCaches epyc_cache_info = {
1964     .l1d_cache = &(CPUCacheInfo) {
1965         .type = DATA_CACHE,
1966         .level = 1,
1967         .size = 32 * KiB,
1968         .line_size = 64,
1969         .associativity = 8,
1970         .partitions = 1,
1971         .sets = 64,
1972         .lines_per_tag = 1,
1973         .self_init = 1,
1974         .no_invd_sharing = true,
1975         .share_level = CPU_TOPO_LEVEL_CORE,
1976     },
1977     .l1i_cache = &(CPUCacheInfo) {
1978         .type = INSTRUCTION_CACHE,
1979         .level = 1,
1980         .size = 64 * KiB,
1981         .line_size = 64,
1982         .associativity = 4,
1983         .partitions = 1,
1984         .sets = 256,
1985         .lines_per_tag = 1,
1986         .self_init = 1,
1987         .no_invd_sharing = true,
1988         .share_level = CPU_TOPO_LEVEL_CORE,
1989     },
1990     .l2_cache = &(CPUCacheInfo) {
1991         .type = UNIFIED_CACHE,
1992         .level = 2,
1993         .size = 512 * KiB,
1994         .line_size = 64,
1995         .associativity = 8,
1996         .partitions = 1,
1997         .sets = 1024,
1998         .lines_per_tag = 1,
1999         .share_level = CPU_TOPO_LEVEL_CORE,
2000     },
2001     .l3_cache = &(CPUCacheInfo) {
2002         .type = UNIFIED_CACHE,
2003         .level = 3,
2004         .size = 8 * MiB,
2005         .line_size = 64,
2006         .associativity = 16,
2007         .partitions = 1,
2008         .sets = 8192,
2009         .lines_per_tag = 1,
2010         .self_init = true,
2011         .inclusive = true,
2012         .complex_indexing = true,
2013         .share_level = CPU_TOPO_LEVEL_DIE,
2014     },
2015 };
2016 
2017 static CPUCaches epyc_v4_cache_info = {
2018     .l1d_cache = &(CPUCacheInfo) {
2019         .type = DATA_CACHE,
2020         .level = 1,
2021         .size = 32 * KiB,
2022         .line_size = 64,
2023         .associativity = 8,
2024         .partitions = 1,
2025         .sets = 64,
2026         .lines_per_tag = 1,
2027         .self_init = 1,
2028         .no_invd_sharing = true,
2029         .share_level = CPU_TOPO_LEVEL_CORE,
2030     },
2031     .l1i_cache = &(CPUCacheInfo) {
2032         .type = INSTRUCTION_CACHE,
2033         .level = 1,
2034         .size = 64 * KiB,
2035         .line_size = 64,
2036         .associativity = 4,
2037         .partitions = 1,
2038         .sets = 256,
2039         .lines_per_tag = 1,
2040         .self_init = 1,
2041         .no_invd_sharing = true,
2042         .share_level = CPU_TOPO_LEVEL_CORE,
2043     },
2044     .l2_cache = &(CPUCacheInfo) {
2045         .type = UNIFIED_CACHE,
2046         .level = 2,
2047         .size = 512 * KiB,
2048         .line_size = 64,
2049         .associativity = 8,
2050         .partitions = 1,
2051         .sets = 1024,
2052         .lines_per_tag = 1,
2053         .share_level = CPU_TOPO_LEVEL_CORE,
2054     },
2055     .l3_cache = &(CPUCacheInfo) {
2056         .type = UNIFIED_CACHE,
2057         .level = 3,
2058         .size = 8 * MiB,
2059         .line_size = 64,
2060         .associativity = 16,
2061         .partitions = 1,
2062         .sets = 8192,
2063         .lines_per_tag = 1,
2064         .self_init = true,
2065         .inclusive = true,
2066         .complex_indexing = false,
2067         .share_level = CPU_TOPO_LEVEL_DIE,
2068     },
2069 };
2070 
2071 static const CPUCaches epyc_rome_cache_info = {
2072     .l1d_cache = &(CPUCacheInfo) {
2073         .type = DATA_CACHE,
2074         .level = 1,
2075         .size = 32 * KiB,
2076         .line_size = 64,
2077         .associativity = 8,
2078         .partitions = 1,
2079         .sets = 64,
2080         .lines_per_tag = 1,
2081         .self_init = 1,
2082         .no_invd_sharing = true,
2083         .share_level = CPU_TOPO_LEVEL_CORE,
2084     },
2085     .l1i_cache = &(CPUCacheInfo) {
2086         .type = INSTRUCTION_CACHE,
2087         .level = 1,
2088         .size = 32 * KiB,
2089         .line_size = 64,
2090         .associativity = 8,
2091         .partitions = 1,
2092         .sets = 64,
2093         .lines_per_tag = 1,
2094         .self_init = 1,
2095         .no_invd_sharing = true,
2096         .share_level = CPU_TOPO_LEVEL_CORE,
2097     },
2098     .l2_cache = &(CPUCacheInfo) {
2099         .type = UNIFIED_CACHE,
2100         .level = 2,
2101         .size = 512 * KiB,
2102         .line_size = 64,
2103         .associativity = 8,
2104         .partitions = 1,
2105         .sets = 1024,
2106         .lines_per_tag = 1,
2107         .share_level = CPU_TOPO_LEVEL_CORE,
2108     },
2109     .l3_cache = &(CPUCacheInfo) {
2110         .type = UNIFIED_CACHE,
2111         .level = 3,
2112         .size = 16 * MiB,
2113         .line_size = 64,
2114         .associativity = 16,
2115         .partitions = 1,
2116         .sets = 16384,
2117         .lines_per_tag = 1,
2118         .self_init = true,
2119         .inclusive = true,
2120         .complex_indexing = true,
2121         .share_level = CPU_TOPO_LEVEL_DIE,
2122     },
2123 };
2124 
2125 static const CPUCaches epyc_rome_v3_cache_info = {
2126     .l1d_cache = &(CPUCacheInfo) {
2127         .type = DATA_CACHE,
2128         .level = 1,
2129         .size = 32 * KiB,
2130         .line_size = 64,
2131         .associativity = 8,
2132         .partitions = 1,
2133         .sets = 64,
2134         .lines_per_tag = 1,
2135         .self_init = 1,
2136         .no_invd_sharing = true,
2137         .share_level = CPU_TOPO_LEVEL_CORE,
2138     },
2139     .l1i_cache = &(CPUCacheInfo) {
2140         .type = INSTRUCTION_CACHE,
2141         .level = 1,
2142         .size = 32 * KiB,
2143         .line_size = 64,
2144         .associativity = 8,
2145         .partitions = 1,
2146         .sets = 64,
2147         .lines_per_tag = 1,
2148         .self_init = 1,
2149         .no_invd_sharing = true,
2150         .share_level = CPU_TOPO_LEVEL_CORE,
2151     },
2152     .l2_cache = &(CPUCacheInfo) {
2153         .type = UNIFIED_CACHE,
2154         .level = 2,
2155         .size = 512 * KiB,
2156         .line_size = 64,
2157         .associativity = 8,
2158         .partitions = 1,
2159         .sets = 1024,
2160         .lines_per_tag = 1,
2161         .share_level = CPU_TOPO_LEVEL_CORE,
2162     },
2163     .l3_cache = &(CPUCacheInfo) {
2164         .type = UNIFIED_CACHE,
2165         .level = 3,
2166         .size = 16 * MiB,
2167         .line_size = 64,
2168         .associativity = 16,
2169         .partitions = 1,
2170         .sets = 16384,
2171         .lines_per_tag = 1,
2172         .self_init = true,
2173         .inclusive = true,
2174         .complex_indexing = false,
2175         .share_level = CPU_TOPO_LEVEL_DIE,
2176     },
2177 };
2178 
2179 static const CPUCaches epyc_milan_cache_info = {
2180     .l1d_cache = &(CPUCacheInfo) {
2181         .type = DATA_CACHE,
2182         .level = 1,
2183         .size = 32 * KiB,
2184         .line_size = 64,
2185         .associativity = 8,
2186         .partitions = 1,
2187         .sets = 64,
2188         .lines_per_tag = 1,
2189         .self_init = 1,
2190         .no_invd_sharing = true,
2191         .share_level = CPU_TOPO_LEVEL_CORE,
2192     },
2193     .l1i_cache = &(CPUCacheInfo) {
2194         .type = INSTRUCTION_CACHE,
2195         .level = 1,
2196         .size = 32 * KiB,
2197         .line_size = 64,
2198         .associativity = 8,
2199         .partitions = 1,
2200         .sets = 64,
2201         .lines_per_tag = 1,
2202         .self_init = 1,
2203         .no_invd_sharing = true,
2204         .share_level = CPU_TOPO_LEVEL_CORE,
2205     },
2206     .l2_cache = &(CPUCacheInfo) {
2207         .type = UNIFIED_CACHE,
2208         .level = 2,
2209         .size = 512 * KiB,
2210         .line_size = 64,
2211         .associativity = 8,
2212         .partitions = 1,
2213         .sets = 1024,
2214         .lines_per_tag = 1,
2215         .share_level = CPU_TOPO_LEVEL_CORE,
2216     },
2217     .l3_cache = &(CPUCacheInfo) {
2218         .type = UNIFIED_CACHE,
2219         .level = 3,
2220         .size = 32 * MiB,
2221         .line_size = 64,
2222         .associativity = 16,
2223         .partitions = 1,
2224         .sets = 32768,
2225         .lines_per_tag = 1,
2226         .self_init = true,
2227         .inclusive = true,
2228         .complex_indexing = true,
2229         .share_level = CPU_TOPO_LEVEL_DIE,
2230     },
2231 };
2232 
2233 static const CPUCaches epyc_milan_v2_cache_info = {
2234     .l1d_cache = &(CPUCacheInfo) {
2235         .type = DATA_CACHE,
2236         .level = 1,
2237         .size = 32 * KiB,
2238         .line_size = 64,
2239         .associativity = 8,
2240         .partitions = 1,
2241         .sets = 64,
2242         .lines_per_tag = 1,
2243         .self_init = 1,
2244         .no_invd_sharing = true,
2245         .share_level = CPU_TOPO_LEVEL_CORE,
2246     },
2247     .l1i_cache = &(CPUCacheInfo) {
2248         .type = INSTRUCTION_CACHE,
2249         .level = 1,
2250         .size = 32 * KiB,
2251         .line_size = 64,
2252         .associativity = 8,
2253         .partitions = 1,
2254         .sets = 64,
2255         .lines_per_tag = 1,
2256         .self_init = 1,
2257         .no_invd_sharing = true,
2258         .share_level = CPU_TOPO_LEVEL_CORE,
2259     },
2260     .l2_cache = &(CPUCacheInfo) {
2261         .type = UNIFIED_CACHE,
2262         .level = 2,
2263         .size = 512 * KiB,
2264         .line_size = 64,
2265         .associativity = 8,
2266         .partitions = 1,
2267         .sets = 1024,
2268         .lines_per_tag = 1,
2269         .share_level = CPU_TOPO_LEVEL_CORE,
2270     },
2271     .l3_cache = &(CPUCacheInfo) {
2272         .type = UNIFIED_CACHE,
2273         .level = 3,
2274         .size = 32 * MiB,
2275         .line_size = 64,
2276         .associativity = 16,
2277         .partitions = 1,
2278         .sets = 32768,
2279         .lines_per_tag = 1,
2280         .self_init = true,
2281         .inclusive = true,
2282         .complex_indexing = false,
2283         .share_level = CPU_TOPO_LEVEL_DIE,
2284     },
2285 };
2286 
2287 static const CPUCaches epyc_genoa_cache_info = {
2288     .l1d_cache = &(CPUCacheInfo) {
2289         .type = DATA_CACHE,
2290         .level = 1,
2291         .size = 32 * KiB,
2292         .line_size = 64,
2293         .associativity = 8,
2294         .partitions = 1,
2295         .sets = 64,
2296         .lines_per_tag = 1,
2297         .self_init = 1,
2298         .no_invd_sharing = true,
2299         .share_level = CPU_TOPO_LEVEL_CORE,
2300     },
2301     .l1i_cache = &(CPUCacheInfo) {
2302         .type = INSTRUCTION_CACHE,
2303         .level = 1,
2304         .size = 32 * KiB,
2305         .line_size = 64,
2306         .associativity = 8,
2307         .partitions = 1,
2308         .sets = 64,
2309         .lines_per_tag = 1,
2310         .self_init = 1,
2311         .no_invd_sharing = true,
2312         .share_level = CPU_TOPO_LEVEL_CORE,
2313     },
2314     .l2_cache = &(CPUCacheInfo) {
2315         .type = UNIFIED_CACHE,
2316         .level = 2,
2317         .size = 1 * MiB,
2318         .line_size = 64,
2319         .associativity = 8,
2320         .partitions = 1,
2321         .sets = 2048,
2322         .lines_per_tag = 1,
2323         .share_level = CPU_TOPO_LEVEL_CORE,
2324     },
2325     .l3_cache = &(CPUCacheInfo) {
2326         .type = UNIFIED_CACHE,
2327         .level = 3,
2328         .size = 32 * MiB,
2329         .line_size = 64,
2330         .associativity = 16,
2331         .partitions = 1,
2332         .sets = 32768,
2333         .lines_per_tag = 1,
2334         .self_init = true,
2335         .inclusive = true,
2336         .complex_indexing = false,
2337         .share_level = CPU_TOPO_LEVEL_DIE,
2338     },
2339 };
2340 
2341 /* The following VMX features are not supported by KVM and are left out in the
2342  * CPU definitions:
2343  *
2344  *  Dual-monitor support (all processors)
2345  *  Entry to SMM
2346  *  Deactivate dual-monitor treatment
2347  *  Number of CR3-target values
2348  *  Shutdown activity state
2349  *  Wait-for-SIPI activity state
2350  *  PAUSE-loop exiting (Westmere and newer)
2351  *  EPT-violation #VE (Broadwell and newer)
2352  *  Inject event with insn length=0 (Skylake and newer)
2353  *  Conceal non-root operation from PT
2354  *  Conceal VM exits from PT
2355  *  Conceal VM entries from PT
2356  *  Enable ENCLS exiting
2357  *  Mode-based execute control (XS/XU)
2358  *  TSC scaling (Skylake Server and newer)
2359  *  GPA translation for PT (IceLake and newer)
2360  *  User wait and pause
2361  *  ENCLV exiting
2362  *  Load IA32_RTIT_CTL
2363  *  Clear IA32_RTIT_CTL
2364  *  Advanced VM-exit information for EPT violations
2365  *  Sub-page write permissions
2366  *  PT in VMX operation
2367  */
2368 
2369 static const X86CPUDefinition builtin_x86_defs[] = {
2370     {
2371         .name = "qemu64",
2372         .level = 0xd,
2373         .vendor = CPUID_VENDOR_AMD,
2374         .family = 15,
2375         .model = 107,
2376         .stepping = 1,
2377         .features[FEAT_1_EDX] =
2378             PPRO_FEATURES |
2379             CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
2380             CPUID_PSE36,
2381         .features[FEAT_1_ECX] =
2382             CPUID_EXT_SSE3 | CPUID_EXT_CX16,
2383         .features[FEAT_8000_0001_EDX] =
2384             CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2385         .features[FEAT_8000_0001_ECX] =
2386             CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM,
2387         .xlevel = 0x8000000A,
2388         .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
2389     },
2390     {
2391         .name = "phenom",
2392         .level = 5,
2393         .vendor = CPUID_VENDOR_AMD,
2394         .family = 16,
2395         .model = 2,
2396         .stepping = 3,
2397         /* Missing: CPUID_HT */
2398         .features[FEAT_1_EDX] =
2399             PPRO_FEATURES |
2400             CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
2401             CPUID_PSE36 | CPUID_VME,
2402         .features[FEAT_1_ECX] =
2403             CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_CX16 |
2404             CPUID_EXT_POPCNT,
2405         .features[FEAT_8000_0001_EDX] =
2406             CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX |
2407             CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_MMXEXT |
2408             CPUID_EXT2_FFXSR | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP,
2409         /* Missing: CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
2410                     CPUID_EXT3_CR8LEG,
2411                     CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
2412                     CPUID_EXT3_OSVW, CPUID_EXT3_IBS */
2413         .features[FEAT_8000_0001_ECX] =
2414             CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM |
2415             CPUID_EXT3_ABM | CPUID_EXT3_SSE4A,
2416         /* Missing: CPUID_SVM_LBRV */
2417         .features[FEAT_SVM] =
2418             CPUID_SVM_NPT,
2419         .xlevel = 0x8000001A,
2420         .model_id = "AMD Phenom(tm) 9550 Quad-Core Processor"
2421     },
2422     {
2423         .name = "core2duo",
2424         .level = 10,
2425         .vendor = CPUID_VENDOR_INTEL,
2426         .family = 6,
2427         .model = 15,
2428         .stepping = 11,
2429         /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
2430         .features[FEAT_1_EDX] =
2431             PPRO_FEATURES |
2432             CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
2433             CPUID_PSE36 | CPUID_VME | CPUID_ACPI | CPUID_SS,
2434         /* Missing: CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_EST,
2435          * CPUID_EXT_TM2, CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_VMX */
2436         .features[FEAT_1_ECX] =
2437             CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
2438             CPUID_EXT_CX16,
2439         .features[FEAT_8000_0001_EDX] =
2440             CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2441         .features[FEAT_8000_0001_ECX] =
2442             CPUID_EXT3_LAHF_LM,
2443         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
2444         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
2445         .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
2446         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2447         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2448              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
2449         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2450              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2451              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2452              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2453              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2454              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2455              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2456              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2457              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2458              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2459         .features[FEAT_VMX_SECONDARY_CTLS] =
2460              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES,
2461         .xlevel = 0x80000008,
2462         .model_id = "Intel(R) Core(TM)2 Duo CPU     T7700  @ 2.40GHz",
2463     },
2464     {
2465         .name = "kvm64",
2466         .level = 0xd,
2467         .vendor = CPUID_VENDOR_INTEL,
2468         .family = 15,
2469         .model = 6,
2470         .stepping = 1,
2471         /* Missing: CPUID_HT */
2472         .features[FEAT_1_EDX] =
2473             PPRO_FEATURES | CPUID_VME |
2474             CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
2475             CPUID_PSE36,
2476         /* Missing: CPUID_EXT_POPCNT, CPUID_EXT_MONITOR */
2477         .features[FEAT_1_ECX] =
2478             CPUID_EXT_SSE3 | CPUID_EXT_CX16,
2479         /* Missing: CPUID_EXT2_PDPE1GB, CPUID_EXT2_RDTSCP */
2480         .features[FEAT_8000_0001_EDX] =
2481             CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2482         /* Missing: CPUID_EXT3_LAHF_LM, CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
2483                     CPUID_EXT3_CR8LEG, CPUID_EXT3_ABM, CPUID_EXT3_SSE4A,
2484                     CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
2485                     CPUID_EXT3_OSVW, CPUID_EXT3_IBS, CPUID_EXT3_SVM */
2486         .features[FEAT_8000_0001_ECX] =
2487             0,
2488         /* VMX features from Cedar Mill/Prescott */
2489         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
2490         .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
2491         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2492         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2493              VMX_PIN_BASED_NMI_EXITING,
2494         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2495              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2496              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2497              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2498              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2499              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2500              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2501              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING,
2502         .xlevel = 0x80000008,
2503         .model_id = "Common KVM processor"
2504     },
2505     {
2506         .name = "qemu32",
2507         .level = 4,
2508         .vendor = CPUID_VENDOR_INTEL,
2509         .family = 6,
2510         .model = 6,
2511         .stepping = 3,
2512         .features[FEAT_1_EDX] =
2513             PPRO_FEATURES,
2514         .features[FEAT_1_ECX] =
2515             CPUID_EXT_SSE3,
2516         .xlevel = 0x80000004,
2517         .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
2518     },
2519     {
2520         .name = "kvm32",
2521         .level = 5,
2522         .vendor = CPUID_VENDOR_INTEL,
2523         .family = 15,
2524         .model = 6,
2525         .stepping = 1,
2526         .features[FEAT_1_EDX] =
2527             PPRO_FEATURES | CPUID_VME |
2528             CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_PSE36,
2529         .features[FEAT_1_ECX] =
2530             CPUID_EXT_SSE3,
2531         .features[FEAT_8000_0001_ECX] =
2532             0,
2533         /* VMX features from Yonah */
2534         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
2535         .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
2536         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2537         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2538              VMX_PIN_BASED_NMI_EXITING,
2539         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2540              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2541              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2542              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2543              VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
2544              VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
2545              VMX_CPU_BASED_PAUSE_EXITING | VMX_CPU_BASED_USE_MSR_BITMAPS,
2546         .xlevel = 0x80000008,
2547         .model_id = "Common 32-bit KVM processor"
2548     },
2549     {
2550         .name = "coreduo",
2551         .level = 10,
2552         .vendor = CPUID_VENDOR_INTEL,
2553         .family = 6,
2554         .model = 14,
2555         .stepping = 8,
2556         /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
2557         .features[FEAT_1_EDX] =
2558             PPRO_FEATURES | CPUID_VME |
2559             CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_ACPI |
2560             CPUID_SS,
2561         /* Missing: CPUID_EXT_EST, CPUID_EXT_TM2 , CPUID_EXT_XTPR,
2562          * CPUID_EXT_PDCM, CPUID_EXT_VMX */
2563         .features[FEAT_1_ECX] =
2564             CPUID_EXT_SSE3 | CPUID_EXT_MONITOR,
2565         .features[FEAT_8000_0001_EDX] =
2566             CPUID_EXT2_NX,
2567         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
2568         .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
2569         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2570         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2571              VMX_PIN_BASED_NMI_EXITING,
2572         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2573              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2574              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2575              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2576              VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
2577              VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
2578              VMX_CPU_BASED_PAUSE_EXITING | VMX_CPU_BASED_USE_MSR_BITMAPS,
2579         .xlevel = 0x80000008,
2580         .model_id = "Genuine Intel(R) CPU           T2600  @ 2.16GHz",
2581     },
2582     {
2583         .name = "486",
2584         .level = 1,
2585         .vendor = CPUID_VENDOR_INTEL,
2586         .family = 4,
2587         .model = 8,
2588         .stepping = 0,
2589         .features[FEAT_1_EDX] =
2590             I486_FEATURES,
2591         .xlevel = 0,
2592         .model_id = "",
2593     },
2594     {
2595         .name = "pentium",
2596         .level = 1,
2597         .vendor = CPUID_VENDOR_INTEL,
2598         .family = 5,
2599         .model = 4,
2600         .stepping = 3,
2601         .features[FEAT_1_EDX] =
2602             PENTIUM_FEATURES,
2603         .xlevel = 0,
2604         .model_id = "",
2605     },
2606     {
2607         .name = "pentium2",
2608         .level = 2,
2609         .vendor = CPUID_VENDOR_INTEL,
2610         .family = 6,
2611         .model = 5,
2612         .stepping = 2,
2613         .features[FEAT_1_EDX] =
2614             PENTIUM2_FEATURES,
2615         .xlevel = 0,
2616         .model_id = "",
2617     },
2618     {
2619         .name = "pentium3",
2620         .level = 3,
2621         .vendor = CPUID_VENDOR_INTEL,
2622         .family = 6,
2623         .model = 7,
2624         .stepping = 3,
2625         .features[FEAT_1_EDX] =
2626             PENTIUM3_FEATURES,
2627         .xlevel = 0,
2628         .model_id = "",
2629     },
2630     {
2631         .name = "athlon",
2632         .level = 2,
2633         .vendor = CPUID_VENDOR_AMD,
2634         .family = 6,
2635         .model = 2,
2636         .stepping = 3,
2637         .features[FEAT_1_EDX] =
2638             PPRO_FEATURES | CPUID_PSE36 | CPUID_VME | CPUID_MTRR |
2639             CPUID_MCA,
2640         .features[FEAT_8000_0001_EDX] =
2641             CPUID_EXT2_MMXEXT | CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT,
2642         .xlevel = 0x80000008,
2643         .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
2644     },
2645     {
2646         .name = "n270",
2647         .level = 10,
2648         .vendor = CPUID_VENDOR_INTEL,
2649         .family = 6,
2650         .model = 28,
2651         .stepping = 2,
2652         /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
2653         .features[FEAT_1_EDX] =
2654             PPRO_FEATURES |
2655             CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_VME |
2656             CPUID_ACPI | CPUID_SS,
2657             /* Some CPUs got no CPUID_SEP */
2658         /* Missing: CPUID_EXT_DSCPL, CPUID_EXT_EST, CPUID_EXT_TM2,
2659          * CPUID_EXT_XTPR */
2660         .features[FEAT_1_ECX] =
2661             CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
2662             CPUID_EXT_MOVBE,
2663         .features[FEAT_8000_0001_EDX] =
2664             CPUID_EXT2_NX,
2665         .features[FEAT_8000_0001_ECX] =
2666             CPUID_EXT3_LAHF_LM,
2667         .xlevel = 0x80000008,
2668         .model_id = "Intel(R) Atom(TM) CPU N270   @ 1.60GHz",
2669     },
2670     {
2671         .name = "Conroe",
2672         .level = 10,
2673         .vendor = CPUID_VENDOR_INTEL,
2674         .family = 6,
2675         .model = 15,
2676         .stepping = 3,
2677         .features[FEAT_1_EDX] =
2678             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2679             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2680             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2681             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2682             CPUID_DE | CPUID_FP87,
2683         .features[FEAT_1_ECX] =
2684             CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
2685         .features[FEAT_8000_0001_EDX] =
2686             CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2687         .features[FEAT_8000_0001_ECX] =
2688             CPUID_EXT3_LAHF_LM,
2689         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
2690         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
2691         .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
2692         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2693         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2694              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
2695         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2696              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2697              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2698              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2699              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2700              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2701              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2702              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2703              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2704              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2705         .features[FEAT_VMX_SECONDARY_CTLS] =
2706              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES,
2707         .xlevel = 0x80000008,
2708         .model_id = "Intel Celeron_4x0 (Conroe/Merom Class Core 2)",
2709     },
2710     {
2711         .name = "Penryn",
2712         .level = 10,
2713         .vendor = CPUID_VENDOR_INTEL,
2714         .family = 6,
2715         .model = 23,
2716         .stepping = 3,
2717         .features[FEAT_1_EDX] =
2718             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2719             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2720             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2721             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2722             CPUID_DE | CPUID_FP87,
2723         .features[FEAT_1_ECX] =
2724             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2725             CPUID_EXT_SSE3,
2726         .features[FEAT_8000_0001_EDX] =
2727             CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2728         .features[FEAT_8000_0001_ECX] =
2729             CPUID_EXT3_LAHF_LM,
2730         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
2731         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2732              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL,
2733         .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT |
2734              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL,
2735         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2736         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2737              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
2738         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2739              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2740              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2741              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2742              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2743              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2744              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2745              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2746              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2747              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2748         .features[FEAT_VMX_SECONDARY_CTLS] =
2749              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2750              VMX_SECONDARY_EXEC_WBINVD_EXITING,
2751         .xlevel = 0x80000008,
2752         .model_id = "Intel Core 2 Duo P9xxx (Penryn Class Core 2)",
2753     },
2754     {
2755         .name = "Nehalem",
2756         .level = 11,
2757         .vendor = CPUID_VENDOR_INTEL,
2758         .family = 6,
2759         .model = 26,
2760         .stepping = 3,
2761         .features[FEAT_1_EDX] =
2762             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2763             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2764             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2765             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2766             CPUID_DE | CPUID_FP87,
2767         .features[FEAT_1_ECX] =
2768             CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2769             CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
2770         .features[FEAT_8000_0001_EDX] =
2771             CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2772         .features[FEAT_8000_0001_ECX] =
2773             CPUID_EXT3_LAHF_LM,
2774         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2775              MSR_VMX_BASIC_TRUE_CTLS,
2776         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2777              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2778              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2779         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2780              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2781              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2782              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2783              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2784              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2785              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
2786         .features[FEAT_VMX_EXIT_CTLS] =
2787              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2788              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2789              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2790              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2791              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2792         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
2793         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2794              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2795              VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
2796         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2797              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2798              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2799              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2800              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2801              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2802              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2803              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2804              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2805              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2806              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2807              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2808         .features[FEAT_VMX_SECONDARY_CTLS] =
2809              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2810              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2811              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2812              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2813              VMX_SECONDARY_EXEC_ENABLE_VPID,
2814         .xlevel = 0x80000008,
2815         .model_id = "Intel Core i7 9xx (Nehalem Class Core i7)",
2816         .versions = (X86CPUVersionDefinition[]) {
2817             { .version = 1 },
2818             {
2819                 .version = 2,
2820                 .alias = "Nehalem-IBRS",
2821                 .props = (PropValue[]) {
2822                     { "spec-ctrl", "on" },
2823                     { "model-id",
2824                       "Intel Core i7 9xx (Nehalem Core i7, IBRS update)" },
2825                     { /* end of list */ }
2826                 }
2827             },
2828             { /* end of list */ }
2829         }
2830     },
2831     {
2832         .name = "Westmere",
2833         .level = 11,
2834         .vendor = CPUID_VENDOR_INTEL,
2835         .family = 6,
2836         .model = 44,
2837         .stepping = 1,
2838         .features[FEAT_1_EDX] =
2839             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2840             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2841             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2842             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2843             CPUID_DE | CPUID_FP87,
2844         .features[FEAT_1_ECX] =
2845             CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
2846             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2847             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
2848         .features[FEAT_8000_0001_EDX] =
2849             CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2850         .features[FEAT_8000_0001_ECX] =
2851             CPUID_EXT3_LAHF_LM,
2852         .features[FEAT_6_EAX] =
2853             CPUID_6_EAX_ARAT,
2854         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2855              MSR_VMX_BASIC_TRUE_CTLS,
2856         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2857              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2858              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2859         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2860              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2861              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2862              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2863              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2864              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2865              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
2866         .features[FEAT_VMX_EXIT_CTLS] =
2867              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2868              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2869              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2870              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2871              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2872         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2873              MSR_VMX_MISC_STORE_LMA,
2874         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2875              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2876              VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
2877         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2878              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2879              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2880              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2881              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2882              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2883              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2884              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2885              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2886              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2887              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2888              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2889         .features[FEAT_VMX_SECONDARY_CTLS] =
2890              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2891              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2892              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2893              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2894              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST,
2895         .xlevel = 0x80000008,
2896         .model_id = "Westmere E56xx/L56xx/X56xx (Nehalem-C)",
2897         .versions = (X86CPUVersionDefinition[]) {
2898             { .version = 1 },
2899             {
2900                 .version = 2,
2901                 .alias = "Westmere-IBRS",
2902                 .props = (PropValue[]) {
2903                     { "spec-ctrl", "on" },
2904                     { "model-id",
2905                       "Westmere E56xx/L56xx/X56xx (IBRS update)" },
2906                     { /* end of list */ }
2907                 }
2908             },
2909             { /* end of list */ }
2910         }
2911     },
2912     {
2913         .name = "SandyBridge",
2914         .level = 0xd,
2915         .vendor = CPUID_VENDOR_INTEL,
2916         .family = 6,
2917         .model = 42,
2918         .stepping = 1,
2919         .features[FEAT_1_EDX] =
2920             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2921             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2922             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2923             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2924             CPUID_DE | CPUID_FP87,
2925         .features[FEAT_1_ECX] =
2926             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2927             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
2928             CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2929             CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
2930             CPUID_EXT_SSE3,
2931         .features[FEAT_8000_0001_EDX] =
2932             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2933             CPUID_EXT2_SYSCALL,
2934         .features[FEAT_8000_0001_ECX] =
2935             CPUID_EXT3_LAHF_LM,
2936         .features[FEAT_XSAVE] =
2937             CPUID_XSAVE_XSAVEOPT,
2938         .features[FEAT_6_EAX] =
2939             CPUID_6_EAX_ARAT,
2940         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
2941              MSR_VMX_BASIC_TRUE_CTLS,
2942         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
2943              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
2944              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
2945         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
2946              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
2947              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
2948              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
2949              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
2950              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
2951              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
2952         .features[FEAT_VMX_EXIT_CTLS] =
2953              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
2954              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
2955              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
2956              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
2957              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
2958         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
2959              MSR_VMX_MISC_STORE_LMA,
2960         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
2961              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
2962              VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
2963         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
2964              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
2965              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
2966              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
2967              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
2968              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
2969              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
2970              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
2971              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
2972              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
2973              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
2974              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
2975         .features[FEAT_VMX_SECONDARY_CTLS] =
2976              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2977              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
2978              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
2979              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
2980              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST,
2981         .xlevel = 0x80000008,
2982         .model_id = "Intel Xeon E312xx (Sandy Bridge)",
2983         .versions = (X86CPUVersionDefinition[]) {
2984             { .version = 1 },
2985             {
2986                 .version = 2,
2987                 .alias = "SandyBridge-IBRS",
2988                 .props = (PropValue[]) {
2989                     { "spec-ctrl", "on" },
2990                     { "model-id",
2991                       "Intel Xeon E312xx (Sandy Bridge, IBRS update)" },
2992                     { /* end of list */ }
2993                 }
2994             },
2995             { /* end of list */ }
2996         }
2997     },
2998     {
2999         .name = "IvyBridge",
3000         .level = 0xd,
3001         .vendor = CPUID_VENDOR_INTEL,
3002         .family = 6,
3003         .model = 58,
3004         .stepping = 9,
3005         .features[FEAT_1_EDX] =
3006             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3007             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3008             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3009             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3010             CPUID_DE | CPUID_FP87,
3011         .features[FEAT_1_ECX] =
3012             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3013             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
3014             CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
3015             CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
3016             CPUID_EXT_SSE3 | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3017         .features[FEAT_7_0_EBX] =
3018             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP |
3019             CPUID_7_0_EBX_ERMS,
3020         .features[FEAT_8000_0001_EDX] =
3021             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
3022             CPUID_EXT2_SYSCALL,
3023         .features[FEAT_8000_0001_ECX] =
3024             CPUID_EXT3_LAHF_LM,
3025         .features[FEAT_XSAVE] =
3026             CPUID_XSAVE_XSAVEOPT,
3027         .features[FEAT_6_EAX] =
3028             CPUID_6_EAX_ARAT,
3029         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3030              MSR_VMX_BASIC_TRUE_CTLS,
3031         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3032              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3033              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3034         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3035              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3036              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3037              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3038              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3039              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3040              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
3041         .features[FEAT_VMX_EXIT_CTLS] =
3042              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3043              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3044              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3045              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3046              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3047         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3048              MSR_VMX_MISC_STORE_LMA,
3049         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3050              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3051              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3052         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3053              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3054              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3055              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3056              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3057              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3058              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3059              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3060              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3061              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3062              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3063              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3064         .features[FEAT_VMX_SECONDARY_CTLS] =
3065              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3066              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3067              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3068              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3069              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3070              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3071              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3072              VMX_SECONDARY_EXEC_RDRAND_EXITING,
3073         .xlevel = 0x80000008,
3074         .model_id = "Intel Xeon E3-12xx v2 (Ivy Bridge)",
3075         .versions = (X86CPUVersionDefinition[]) {
3076             { .version = 1 },
3077             {
3078                 .version = 2,
3079                 .alias = "IvyBridge-IBRS",
3080                 .props = (PropValue[]) {
3081                     { "spec-ctrl", "on" },
3082                     { "model-id",
3083                       "Intel Xeon E3-12xx v2 (Ivy Bridge, IBRS)" },
3084                     { /* end of list */ }
3085                 }
3086             },
3087             { /* end of list */ }
3088         }
3089     },
3090     {
3091         .name = "Haswell",
3092         .level = 0xd,
3093         .vendor = CPUID_VENDOR_INTEL,
3094         .family = 6,
3095         .model = 60,
3096         .stepping = 4,
3097         .features[FEAT_1_EDX] =
3098             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3099             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3100             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3101             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3102             CPUID_DE | CPUID_FP87,
3103         .features[FEAT_1_ECX] =
3104             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3105             CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3106             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3107             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3108             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3109             CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3110         .features[FEAT_8000_0001_EDX] =
3111             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
3112             CPUID_EXT2_SYSCALL,
3113         .features[FEAT_8000_0001_ECX] =
3114             CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
3115         .features[FEAT_7_0_EBX] =
3116             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3117             CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3118             CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3119             CPUID_7_0_EBX_RTM,
3120         .features[FEAT_XSAVE] =
3121             CPUID_XSAVE_XSAVEOPT,
3122         .features[FEAT_6_EAX] =
3123             CPUID_6_EAX_ARAT,
3124         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3125              MSR_VMX_BASIC_TRUE_CTLS,
3126         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3127              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3128              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3129         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3130              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3131              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3132              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3133              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3134              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3135              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3136         .features[FEAT_VMX_EXIT_CTLS] =
3137              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3138              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3139              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3140              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3141              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3142         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3143              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3144         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3145              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3146              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3147         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3148              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3149              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3150              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3151              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3152              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3153              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3154              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3155              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3156              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3157              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3158              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3159         .features[FEAT_VMX_SECONDARY_CTLS] =
3160              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3161              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3162              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3163              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3164              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3165              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3166              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3167              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3168              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS,
3169         .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3170         .xlevel = 0x80000008,
3171         .model_id = "Intel Core Processor (Haswell)",
3172         .versions = (X86CPUVersionDefinition[]) {
3173             { .version = 1 },
3174             {
3175                 .version = 2,
3176                 .alias = "Haswell-noTSX",
3177                 .props = (PropValue[]) {
3178                     { "hle", "off" },
3179                     { "rtm", "off" },
3180                     { "stepping", "1" },
3181                     { "model-id", "Intel Core Processor (Haswell, no TSX)", },
3182                     { /* end of list */ }
3183                 },
3184             },
3185             {
3186                 .version = 3,
3187                 .alias = "Haswell-IBRS",
3188                 .props = (PropValue[]) {
3189                     /* Restore TSX features removed by -v2 above */
3190                     { "hle", "on" },
3191                     { "rtm", "on" },
3192                     /*
3193                      * Haswell and Haswell-IBRS had stepping=4 in
3194                      * QEMU 4.0 and older
3195                      */
3196                     { "stepping", "4" },
3197                     { "spec-ctrl", "on" },
3198                     { "model-id",
3199                       "Intel Core Processor (Haswell, IBRS)" },
3200                     { /* end of list */ }
3201                 }
3202             },
3203             {
3204                 .version = 4,
3205                 .alias = "Haswell-noTSX-IBRS",
3206                 .props = (PropValue[]) {
3207                     { "hle", "off" },
3208                     { "rtm", "off" },
3209                     /* spec-ctrl was already enabled by -v3 above */
3210                     { "stepping", "1" },
3211                     { "model-id",
3212                       "Intel Core Processor (Haswell, no TSX, IBRS)" },
3213                     { /* end of list */ }
3214                 }
3215             },
3216             { /* end of list */ }
3217         }
3218     },
3219     {
3220         .name = "Broadwell",
3221         .level = 0xd,
3222         .vendor = CPUID_VENDOR_INTEL,
3223         .family = 6,
3224         .model = 61,
3225         .stepping = 2,
3226         .features[FEAT_1_EDX] =
3227             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3228             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3229             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3230             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3231             CPUID_DE | CPUID_FP87,
3232         .features[FEAT_1_ECX] =
3233             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3234             CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3235             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3236             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3237             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3238             CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3239         .features[FEAT_8000_0001_EDX] =
3240             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
3241             CPUID_EXT2_SYSCALL,
3242         .features[FEAT_8000_0001_ECX] =
3243             CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3244         .features[FEAT_7_0_EBX] =
3245             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3246             CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3247             CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3248             CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3249             CPUID_7_0_EBX_SMAP,
3250         .features[FEAT_XSAVE] =
3251             CPUID_XSAVE_XSAVEOPT,
3252         .features[FEAT_6_EAX] =
3253             CPUID_6_EAX_ARAT,
3254         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3255              MSR_VMX_BASIC_TRUE_CTLS,
3256         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3257              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3258              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3259         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3260              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3261              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3262              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3263              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3264              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3265              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3266         .features[FEAT_VMX_EXIT_CTLS] =
3267              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3268              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3269              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3270              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3271              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3272         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3273              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3274         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3275              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3276              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3277         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3278              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3279              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3280              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3281              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3282              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3283              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3284              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3285              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3286              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3287              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3288              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3289         .features[FEAT_VMX_SECONDARY_CTLS] =
3290              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3291              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3292              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3293              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3294              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3295              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3296              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3297              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3298              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3299              VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3300         .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3301         .xlevel = 0x80000008,
3302         .model_id = "Intel Core Processor (Broadwell)",
3303         .versions = (X86CPUVersionDefinition[]) {
3304             { .version = 1 },
3305             {
3306                 .version = 2,
3307                 .alias = "Broadwell-noTSX",
3308                 .props = (PropValue[]) {
3309                     { "hle", "off" },
3310                     { "rtm", "off" },
3311                     { "model-id", "Intel Core Processor (Broadwell, no TSX)", },
3312                     { /* end of list */ }
3313                 },
3314             },
3315             {
3316                 .version = 3,
3317                 .alias = "Broadwell-IBRS",
3318                 .props = (PropValue[]) {
3319                     /* Restore TSX features removed by -v2 above */
3320                     { "hle", "on" },
3321                     { "rtm", "on" },
3322                     { "spec-ctrl", "on" },
3323                     { "model-id",
3324                       "Intel Core Processor (Broadwell, IBRS)" },
3325                     { /* end of list */ }
3326                 }
3327             },
3328             {
3329                 .version = 4,
3330                 .alias = "Broadwell-noTSX-IBRS",
3331                 .props = (PropValue[]) {
3332                     { "hle", "off" },
3333                     { "rtm", "off" },
3334                     /* spec-ctrl was already enabled by -v3 above */
3335                     { "model-id",
3336                       "Intel Core Processor (Broadwell, no TSX, IBRS)" },
3337                     { /* end of list */ }
3338                 }
3339             },
3340             { /* end of list */ }
3341         }
3342     },
3343     {
3344         .name = "Skylake-Client",
3345         .level = 0xd,
3346         .vendor = CPUID_VENDOR_INTEL,
3347         .family = 6,
3348         .model = 94,
3349         .stepping = 3,
3350         .features[FEAT_1_EDX] =
3351             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3352             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3353             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3354             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3355             CPUID_DE | CPUID_FP87,
3356         .features[FEAT_1_ECX] =
3357             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3358             CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3359             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3360             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3361             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3362             CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3363         .features[FEAT_8000_0001_EDX] =
3364             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
3365             CPUID_EXT2_SYSCALL,
3366         .features[FEAT_8000_0001_ECX] =
3367             CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3368         .features[FEAT_7_0_EBX] =
3369             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3370             CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3371             CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3372             CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3373             CPUID_7_0_EBX_SMAP,
3374         /* XSAVES is added in version 4 */
3375         .features[FEAT_XSAVE] =
3376             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3377             CPUID_XSAVE_XGETBV1,
3378         .features[FEAT_6_EAX] =
3379             CPUID_6_EAX_ARAT,
3380         /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3381         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3382              MSR_VMX_BASIC_TRUE_CTLS,
3383         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3384              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3385              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3386         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3387              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3388              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3389              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3390              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3391              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3392              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3393         .features[FEAT_VMX_EXIT_CTLS] =
3394              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3395              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3396              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3397              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3398              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3399         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3400              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3401         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3402              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3403              VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
3404         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3405              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3406              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3407              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3408              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3409              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3410              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3411              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3412              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3413              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3414              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3415              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3416         .features[FEAT_VMX_SECONDARY_CTLS] =
3417              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3418              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3419              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3420              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3421              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3422              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3423              VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3424         .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3425         .xlevel = 0x80000008,
3426         .model_id = "Intel Core Processor (Skylake)",
3427         .versions = (X86CPUVersionDefinition[]) {
3428             { .version = 1 },
3429             {
3430                 .version = 2,
3431                 .alias = "Skylake-Client-IBRS",
3432                 .props = (PropValue[]) {
3433                     { "spec-ctrl", "on" },
3434                     { "model-id",
3435                       "Intel Core Processor (Skylake, IBRS)" },
3436                     { /* end of list */ }
3437                 }
3438             },
3439             {
3440                 .version = 3,
3441                 .alias = "Skylake-Client-noTSX-IBRS",
3442                 .props = (PropValue[]) {
3443                     { "hle", "off" },
3444                     { "rtm", "off" },
3445                     { "model-id",
3446                       "Intel Core Processor (Skylake, IBRS, no TSX)" },
3447                     { /* end of list */ }
3448                 }
3449             },
3450             {
3451                 .version = 4,
3452                 .note = "IBRS, XSAVES, no TSX",
3453                 .props = (PropValue[]) {
3454                     { "xsaves", "on" },
3455                     { "vmx-xsaves", "on" },
3456                     { /* end of list */ }
3457                 }
3458             },
3459             { /* end of list */ }
3460         }
3461     },
3462     {
3463         .name = "Skylake-Server",
3464         .level = 0xd,
3465         .vendor = CPUID_VENDOR_INTEL,
3466         .family = 6,
3467         .model = 85,
3468         .stepping = 4,
3469         .features[FEAT_1_EDX] =
3470             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3471             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3472             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3473             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3474             CPUID_DE | CPUID_FP87,
3475         .features[FEAT_1_ECX] =
3476             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3477             CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3478             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3479             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3480             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3481             CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3482         .features[FEAT_8000_0001_EDX] =
3483             CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3484             CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3485         .features[FEAT_8000_0001_ECX] =
3486             CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3487         .features[FEAT_7_0_EBX] =
3488             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3489             CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3490             CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3491             CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3492             CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
3493             CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
3494             CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
3495             CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
3496         .features[FEAT_7_0_ECX] =
3497             CPUID_7_0_ECX_PKU,
3498         /* XSAVES is added in version 5 */
3499         .features[FEAT_XSAVE] =
3500             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3501             CPUID_XSAVE_XGETBV1,
3502         .features[FEAT_6_EAX] =
3503             CPUID_6_EAX_ARAT,
3504         /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3505         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3506              MSR_VMX_BASIC_TRUE_CTLS,
3507         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3508              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3509              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3510         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3511              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3512              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3513              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3514              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3515              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3516              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3517         .features[FEAT_VMX_EXIT_CTLS] =
3518              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3519              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3520              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3521              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3522              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3523         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3524              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3525         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3526              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3527              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3528         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3529              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3530              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3531              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3532              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3533              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3534              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3535              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3536              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3537              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3538              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3539              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3540         .features[FEAT_VMX_SECONDARY_CTLS] =
3541              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3542              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3543              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3544              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3545              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3546              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3547              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3548              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3549              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3550              VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3551         .xlevel = 0x80000008,
3552         .model_id = "Intel Xeon Processor (Skylake)",
3553         .versions = (X86CPUVersionDefinition[]) {
3554             { .version = 1 },
3555             {
3556                 .version = 2,
3557                 .alias = "Skylake-Server-IBRS",
3558                 .props = (PropValue[]) {
3559                     /* clflushopt was not added to Skylake-Server-IBRS */
3560                     /* TODO: add -v3 including clflushopt */
3561                     { "clflushopt", "off" },
3562                     { "spec-ctrl", "on" },
3563                     { "model-id",
3564                       "Intel Xeon Processor (Skylake, IBRS)" },
3565                     { /* end of list */ }
3566                 }
3567             },
3568             {
3569                 .version = 3,
3570                 .alias = "Skylake-Server-noTSX-IBRS",
3571                 .props = (PropValue[]) {
3572                     { "hle", "off" },
3573                     { "rtm", "off" },
3574                     { "model-id",
3575                       "Intel Xeon Processor (Skylake, IBRS, no TSX)" },
3576                     { /* end of list */ }
3577                 }
3578             },
3579             {
3580                 .version = 4,
3581                 .props = (PropValue[]) {
3582                     { "vmx-eptp-switching", "on" },
3583                     { /* end of list */ }
3584                 }
3585             },
3586             {
3587                 .version = 5,
3588                 .note = "IBRS, XSAVES, EPT switching, no TSX",
3589                 .props = (PropValue[]) {
3590                     { "xsaves", "on" },
3591                     { "vmx-xsaves", "on" },
3592                     { /* end of list */ }
3593                 }
3594             },
3595             { /* end of list */ }
3596         }
3597     },
3598     {
3599         .name = "Cascadelake-Server",
3600         .level = 0xd,
3601         .vendor = CPUID_VENDOR_INTEL,
3602         .family = 6,
3603         .model = 85,
3604         .stepping = 6,
3605         .features[FEAT_1_EDX] =
3606             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3607             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3608             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3609             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3610             CPUID_DE | CPUID_FP87,
3611         .features[FEAT_1_ECX] =
3612             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3613             CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3614             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3615             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3616             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3617             CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3618         .features[FEAT_8000_0001_EDX] =
3619             CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3620             CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3621         .features[FEAT_8000_0001_ECX] =
3622             CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3623         .features[FEAT_7_0_EBX] =
3624             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3625             CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3626             CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3627             CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3628             CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
3629             CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
3630             CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
3631             CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
3632         .features[FEAT_7_0_ECX] =
3633             CPUID_7_0_ECX_PKU |
3634             CPUID_7_0_ECX_AVX512VNNI,
3635         .features[FEAT_7_0_EDX] =
3636             CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
3637         /* XSAVES is added in version 5 */
3638         .features[FEAT_XSAVE] =
3639             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3640             CPUID_XSAVE_XGETBV1,
3641         .features[FEAT_6_EAX] =
3642             CPUID_6_EAX_ARAT,
3643         /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3644         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3645              MSR_VMX_BASIC_TRUE_CTLS,
3646         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3647              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3648              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3649         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3650              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3651              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3652              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3653              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3654              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3655              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3656         .features[FEAT_VMX_EXIT_CTLS] =
3657              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3658              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3659              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3660              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3661              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3662         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3663              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3664         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3665              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3666              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3667         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3668              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3669              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3670              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3671              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3672              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3673              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3674              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3675              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3676              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3677              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3678              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3679         .features[FEAT_VMX_SECONDARY_CTLS] =
3680              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3681              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3682              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3683              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3684              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3685              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3686              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3687              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3688              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3689              VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3690         .xlevel = 0x80000008,
3691         .model_id = "Intel Xeon Processor (Cascadelake)",
3692         .versions = (X86CPUVersionDefinition[]) {
3693             { .version = 1 },
3694             { .version = 2,
3695               .note = "ARCH_CAPABILITIES",
3696               .props = (PropValue[]) {
3697                   { "arch-capabilities", "on" },
3698                   { "rdctl-no", "on" },
3699                   { "ibrs-all", "on" },
3700                   { "skip-l1dfl-vmentry", "on" },
3701                   { "mds-no", "on" },
3702                   { /* end of list */ }
3703               },
3704             },
3705             { .version = 3,
3706               .alias = "Cascadelake-Server-noTSX",
3707               .note = "ARCH_CAPABILITIES, no TSX",
3708               .props = (PropValue[]) {
3709                   { "hle", "off" },
3710                   { "rtm", "off" },
3711                   { /* end of list */ }
3712               },
3713             },
3714             { .version = 4,
3715               .note = "ARCH_CAPABILITIES, no TSX",
3716               .props = (PropValue[]) {
3717                   { "vmx-eptp-switching", "on" },
3718                   { /* end of list */ }
3719               },
3720             },
3721             { .version = 5,
3722               .note = "ARCH_CAPABILITIES, EPT switching, XSAVES, no TSX",
3723               .props = (PropValue[]) {
3724                   { "xsaves", "on" },
3725                   { "vmx-xsaves", "on" },
3726                   { /* end of list */ }
3727               },
3728             },
3729             { /* end of list */ }
3730         }
3731     },
3732     {
3733         .name = "Cooperlake",
3734         .level = 0xd,
3735         .vendor = CPUID_VENDOR_INTEL,
3736         .family = 6,
3737         .model = 85,
3738         .stepping = 10,
3739         .features[FEAT_1_EDX] =
3740             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3741             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3742             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3743             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3744             CPUID_DE | CPUID_FP87,
3745         .features[FEAT_1_ECX] =
3746             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3747             CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3748             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3749             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3750             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3751             CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3752         .features[FEAT_8000_0001_EDX] =
3753             CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3754             CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3755         .features[FEAT_8000_0001_ECX] =
3756             CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3757         .features[FEAT_7_0_EBX] =
3758             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3759             CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3760             CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3761             CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3762             CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
3763             CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
3764             CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
3765             CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
3766         .features[FEAT_7_0_ECX] =
3767             CPUID_7_0_ECX_PKU |
3768             CPUID_7_0_ECX_AVX512VNNI,
3769         .features[FEAT_7_0_EDX] =
3770             CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_STIBP |
3771             CPUID_7_0_EDX_SPEC_CTRL_SSBD | CPUID_7_0_EDX_ARCH_CAPABILITIES,
3772         .features[FEAT_ARCH_CAPABILITIES] =
3773             MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
3774             MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
3775             MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO,
3776         .features[FEAT_7_1_EAX] =
3777             CPUID_7_1_EAX_AVX512_BF16,
3778         /* XSAVES is added in version 2 */
3779         .features[FEAT_XSAVE] =
3780             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3781             CPUID_XSAVE_XGETBV1,
3782         .features[FEAT_6_EAX] =
3783             CPUID_6_EAX_ARAT,
3784         /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3785         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3786              MSR_VMX_BASIC_TRUE_CTLS,
3787         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3788              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3789              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3790         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3791              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3792              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3793              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3794              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3795              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3796              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3797         .features[FEAT_VMX_EXIT_CTLS] =
3798              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3799              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3800              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3801              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3802              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3803         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3804              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3805         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3806              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3807              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3808         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3809              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3810              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3811              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3812              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3813              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3814              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3815              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3816              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3817              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3818              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3819              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3820         .features[FEAT_VMX_SECONDARY_CTLS] =
3821              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3822              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3823              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3824              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3825              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3826              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3827              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3828              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3829              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3830              VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3831         .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3832         .xlevel = 0x80000008,
3833         .model_id = "Intel Xeon Processor (Cooperlake)",
3834         .versions = (X86CPUVersionDefinition[]) {
3835             { .version = 1 },
3836             { .version = 2,
3837               .note = "XSAVES",
3838               .props = (PropValue[]) {
3839                   { "xsaves", "on" },
3840                   { "vmx-xsaves", "on" },
3841                   { /* end of list */ }
3842               },
3843             },
3844             { /* end of list */ }
3845         }
3846     },
3847     {
3848         .name = "Icelake-Server",
3849         .level = 0xd,
3850         .vendor = CPUID_VENDOR_INTEL,
3851         .family = 6,
3852         .model = 134,
3853         .stepping = 0,
3854         .features[FEAT_1_EDX] =
3855             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3856             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3857             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3858             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3859             CPUID_DE | CPUID_FP87,
3860         .features[FEAT_1_ECX] =
3861             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3862             CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3863             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3864             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3865             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3866             CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3867         .features[FEAT_8000_0001_EDX] =
3868             CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3869             CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3870         .features[FEAT_8000_0001_ECX] =
3871             CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3872         .features[FEAT_8000_0008_EBX] =
3873             CPUID_8000_0008_EBX_WBNOINVD,
3874         .features[FEAT_7_0_EBX] =
3875             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3876             CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3877             CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3878             CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3879             CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
3880             CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
3881             CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
3882             CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
3883         .features[FEAT_7_0_ECX] =
3884             CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
3885             CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
3886             CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
3887             CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
3888             CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57,
3889         .features[FEAT_7_0_EDX] =
3890             CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
3891         /* XSAVES is added in version 5 */
3892         .features[FEAT_XSAVE] =
3893             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3894             CPUID_XSAVE_XGETBV1,
3895         .features[FEAT_6_EAX] =
3896             CPUID_6_EAX_ARAT,
3897         /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
3898         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
3899              MSR_VMX_BASIC_TRUE_CTLS,
3900         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
3901              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
3902              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
3903         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
3904              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
3905              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
3906              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3907              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3908              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3909              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
3910         .features[FEAT_VMX_EXIT_CTLS] =
3911              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3912              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3913              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
3914              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3915              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3916         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
3917              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
3918         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
3919              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
3920              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
3921         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3922              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3923              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3924              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3925              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3926              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
3927              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
3928              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
3929              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
3930              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3931              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3932              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3933         .features[FEAT_VMX_SECONDARY_CTLS] =
3934              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3935              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
3936              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
3937              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3938              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3939              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3940              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3941              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3942              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS,
3943         .xlevel = 0x80000008,
3944         .model_id = "Intel Xeon Processor (Icelake)",
3945         .versions = (X86CPUVersionDefinition[]) {
3946             { .version = 1 },
3947             {
3948                 .version = 2,
3949                 .note = "no TSX",
3950                 .alias = "Icelake-Server-noTSX",
3951                 .props = (PropValue[]) {
3952                     { "hle", "off" },
3953                     { "rtm", "off" },
3954                     { /* end of list */ }
3955                 },
3956             },
3957             {
3958                 .version = 3,
3959                 .props = (PropValue[]) {
3960                     { "arch-capabilities", "on" },
3961                     { "rdctl-no", "on" },
3962                     { "ibrs-all", "on" },
3963                     { "skip-l1dfl-vmentry", "on" },
3964                     { "mds-no", "on" },
3965                     { "pschange-mc-no", "on" },
3966                     { "taa-no", "on" },
3967                     { /* end of list */ }
3968                 },
3969             },
3970             {
3971                 .version = 4,
3972                 .props = (PropValue[]) {
3973                     { "sha-ni", "on" },
3974                     { "avx512ifma", "on" },
3975                     { "rdpid", "on" },
3976                     { "fsrm", "on" },
3977                     { "vmx-rdseed-exit", "on" },
3978                     { "vmx-pml", "on" },
3979                     { "vmx-eptp-switching", "on" },
3980                     { "model", "106" },
3981                     { /* end of list */ }
3982                 },
3983             },
3984             {
3985                 .version = 5,
3986                 .note = "XSAVES",
3987                 .props = (PropValue[]) {
3988                     { "xsaves", "on" },
3989                     { "vmx-xsaves", "on" },
3990                     { /* end of list */ }
3991                 },
3992             },
3993             {
3994                 .version = 6,
3995                 .note = "5-level EPT",
3996                 .props = (PropValue[]) {
3997                     { "vmx-page-walk-5", "on" },
3998                     { /* end of list */ }
3999                 },
4000             },
4001             {
4002                 .version = 7,
4003                 .note = "TSX, taa-no",
4004                 .props = (PropValue[]) {
4005                     /* Restore TSX features removed by -v2 above */
4006                     { "hle", "on" },
4007                     { "rtm", "on" },
4008                     { /* end of list */ }
4009                 },
4010             },
4011             { /* end of list */ }
4012         }
4013     },
4014     {
4015         .name = "SapphireRapids",
4016         .level = 0x20,
4017         .vendor = CPUID_VENDOR_INTEL,
4018         .family = 6,
4019         .model = 143,
4020         .stepping = 4,
4021         /*
4022          * please keep the ascending order so that we can have a clear view of
4023          * bit position of each feature.
4024          */
4025         .features[FEAT_1_EDX] =
4026             CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
4027             CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
4028             CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
4029             CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
4030             CPUID_SSE | CPUID_SSE2,
4031         .features[FEAT_1_ECX] =
4032             CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 |
4033             CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 |
4034             CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
4035             CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES |
4036             CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
4037         .features[FEAT_8000_0001_EDX] =
4038             CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
4039             CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
4040         .features[FEAT_8000_0001_ECX] =
4041             CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH,
4042         .features[FEAT_8000_0008_EBX] =
4043             CPUID_8000_0008_EBX_WBNOINVD,
4044         .features[FEAT_7_0_EBX] =
4045             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_HLE |
4046             CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 |
4047             CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_RTM |
4048             CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
4049             CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP |
4050             CPUID_7_0_EBX_AVX512IFMA | CPUID_7_0_EBX_CLFLUSHOPT |
4051             CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_SHA_NI |
4052             CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512VL,
4053         .features[FEAT_7_0_ECX] =
4054             CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
4055             CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
4056             CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
4057             CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
4058             CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57 |
4059             CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT,
4060         .features[FEAT_7_0_EDX] =
4061             CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE |
4062             CPUID_7_0_EDX_TSX_LDTRK | CPUID_7_0_EDX_AMX_BF16 |
4063             CPUID_7_0_EDX_AVX512_FP16 | CPUID_7_0_EDX_AMX_TILE |
4064             CPUID_7_0_EDX_AMX_INT8 | CPUID_7_0_EDX_SPEC_CTRL |
4065             CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
4066         .features[FEAT_ARCH_CAPABILITIES] =
4067             MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
4068             MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
4069             MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO,
4070         .features[FEAT_XSAVE] =
4071             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4072             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES | CPUID_D_1_EAX_XFD,
4073         .features[FEAT_6_EAX] =
4074             CPUID_6_EAX_ARAT,
4075         .features[FEAT_7_1_EAX] =
4076             CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_AVX512_BF16 |
4077             CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_FSRC,
4078         .features[FEAT_VMX_BASIC] =
4079             MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS,
4080         .features[FEAT_VMX_ENTRY_CTLS] =
4081             VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE |
4082             VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL |
4083             VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER,
4084         .features[FEAT_VMX_EPT_VPID_CAPS] =
4085             MSR_VMX_EPT_EXECONLY |
4086             MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_PAGE_WALK_LENGTH_5 |
4087             MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB |
4088             MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS |
4089             MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
4090             MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
4091             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT |
4092             MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
4093             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
4094         .features[FEAT_VMX_EXIT_CTLS] =
4095             VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
4096             VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
4097             VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT |
4098             VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
4099             VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
4100         .features[FEAT_VMX_MISC] =
4101             MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT |
4102             MSR_VMX_MISC_VMWRITE_VMEXIT,
4103         .features[FEAT_VMX_PINBASED_CTLS] =
4104             VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING |
4105             VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER |
4106             VMX_PIN_BASED_POSTED_INTR,
4107         .features[FEAT_VMX_PROCBASED_CTLS] =
4108             VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
4109             VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
4110             VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
4111             VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
4112             VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
4113             VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
4114             VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING |
4115             VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
4116             VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG |
4117             VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
4118             VMX_CPU_BASED_PAUSE_EXITING |
4119             VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
4120         .features[FEAT_VMX_SECONDARY_CTLS] =
4121             VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
4122             VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC |
4123             VMX_SECONDARY_EXEC_RDTSCP |
4124             VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
4125             VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING |
4126             VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
4127             VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
4128             VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
4129             VMX_SECONDARY_EXEC_RDRAND_EXITING |
4130             VMX_SECONDARY_EXEC_ENABLE_INVPCID |
4131             VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
4132             VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML |
4133             VMX_SECONDARY_EXEC_XSAVES,
4134         .features[FEAT_VMX_VMFUNC] =
4135             MSR_VMX_VMFUNC_EPT_SWITCHING,
4136         .xlevel = 0x80000008,
4137         .model_id = "Intel Xeon Processor (SapphireRapids)",
4138         .versions = (X86CPUVersionDefinition[]) {
4139             { .version = 1 },
4140             {
4141                 .version = 2,
4142                 .props = (PropValue[]) {
4143                     { "sbdr-ssdp-no", "on" },
4144                     { "fbsdp-no", "on" },
4145                     { "psdp-no", "on" },
4146                     { /* end of list */ }
4147                 }
4148             },
4149             {
4150                 .version = 3,
4151                 .props = (PropValue[]) {
4152                     { "ss", "on" },
4153                     { "tsc-adjust", "on" },
4154                     { "cldemote", "on" },
4155                     { "movdiri", "on" },
4156                     { "movdir64b", "on" },
4157                     { /* end of list */ }
4158                 }
4159             },
4160             { /* end of list */ }
4161         }
4162     },
4163     {
4164         .name = "GraniteRapids",
4165         .level = 0x20,
4166         .vendor = CPUID_VENDOR_INTEL,
4167         .family = 6,
4168         .model = 173,
4169         .stepping = 0,
4170         /*
4171          * please keep the ascending order so that we can have a clear view of
4172          * bit position of each feature.
4173          */
4174         .features[FEAT_1_EDX] =
4175             CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
4176             CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
4177             CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
4178             CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
4179             CPUID_SSE | CPUID_SSE2,
4180         .features[FEAT_1_ECX] =
4181             CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 |
4182             CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 |
4183             CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
4184             CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES |
4185             CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
4186         .features[FEAT_8000_0001_EDX] =
4187             CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
4188             CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
4189         .features[FEAT_8000_0001_ECX] =
4190             CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH,
4191         .features[FEAT_8000_0008_EBX] =
4192             CPUID_8000_0008_EBX_WBNOINVD,
4193         .features[FEAT_7_0_EBX] =
4194             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_HLE |
4195             CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 |
4196             CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_RTM |
4197             CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
4198             CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP |
4199             CPUID_7_0_EBX_AVX512IFMA | CPUID_7_0_EBX_CLFLUSHOPT |
4200             CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_SHA_NI |
4201             CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512VL,
4202         .features[FEAT_7_0_ECX] =
4203             CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
4204             CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
4205             CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
4206             CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
4207             CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57 |
4208             CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT,
4209         .features[FEAT_7_0_EDX] =
4210             CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE |
4211             CPUID_7_0_EDX_TSX_LDTRK | CPUID_7_0_EDX_AMX_BF16 |
4212             CPUID_7_0_EDX_AVX512_FP16 | CPUID_7_0_EDX_AMX_TILE |
4213             CPUID_7_0_EDX_AMX_INT8 | CPUID_7_0_EDX_SPEC_CTRL |
4214             CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
4215         .features[FEAT_ARCH_CAPABILITIES] =
4216             MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
4217             MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
4218             MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO |
4219             MSR_ARCH_CAP_SBDR_SSDP_NO | MSR_ARCH_CAP_FBSDP_NO |
4220             MSR_ARCH_CAP_PSDP_NO | MSR_ARCH_CAP_PBRSB_NO,
4221         .features[FEAT_XSAVE] =
4222             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4223             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES | CPUID_D_1_EAX_XFD,
4224         .features[FEAT_6_EAX] =
4225             CPUID_6_EAX_ARAT,
4226         .features[FEAT_7_1_EAX] =
4227             CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_AVX512_BF16 |
4228             CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_FSRC |
4229             CPUID_7_1_EAX_AMX_FP16,
4230         .features[FEAT_7_1_EDX] =
4231             CPUID_7_1_EDX_PREFETCHITI,
4232         .features[FEAT_7_2_EDX] =
4233             CPUID_7_2_EDX_MCDT_NO,
4234         .features[FEAT_VMX_BASIC] =
4235             MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS,
4236         .features[FEAT_VMX_ENTRY_CTLS] =
4237             VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE |
4238             VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL |
4239             VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER,
4240         .features[FEAT_VMX_EPT_VPID_CAPS] =
4241             MSR_VMX_EPT_EXECONLY |
4242             MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_PAGE_WALK_LENGTH_5 |
4243             MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB |
4244             MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS |
4245             MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
4246             MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
4247             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT |
4248             MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
4249             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
4250         .features[FEAT_VMX_EXIT_CTLS] =
4251             VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
4252             VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
4253             VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT |
4254             VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
4255             VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
4256         .features[FEAT_VMX_MISC] =
4257             MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT |
4258             MSR_VMX_MISC_VMWRITE_VMEXIT,
4259         .features[FEAT_VMX_PINBASED_CTLS] =
4260             VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING |
4261             VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER |
4262             VMX_PIN_BASED_POSTED_INTR,
4263         .features[FEAT_VMX_PROCBASED_CTLS] =
4264             VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
4265             VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
4266             VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
4267             VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
4268             VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
4269             VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
4270             VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING |
4271             VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
4272             VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG |
4273             VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
4274             VMX_CPU_BASED_PAUSE_EXITING |
4275             VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
4276         .features[FEAT_VMX_SECONDARY_CTLS] =
4277             VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
4278             VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC |
4279             VMX_SECONDARY_EXEC_RDTSCP |
4280             VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
4281             VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING |
4282             VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
4283             VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
4284             VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
4285             VMX_SECONDARY_EXEC_RDRAND_EXITING |
4286             VMX_SECONDARY_EXEC_ENABLE_INVPCID |
4287             VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
4288             VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML |
4289             VMX_SECONDARY_EXEC_XSAVES,
4290         .features[FEAT_VMX_VMFUNC] =
4291             MSR_VMX_VMFUNC_EPT_SWITCHING,
4292         .xlevel = 0x80000008,
4293         .model_id = "Intel Xeon Processor (GraniteRapids)",
4294         .versions = (X86CPUVersionDefinition[]) {
4295             { .version = 1 },
4296             { /* end of list */ },
4297         },
4298     },
4299     {
4300         .name = "SierraForest",
4301         .level = 0x23,
4302         .vendor = CPUID_VENDOR_INTEL,
4303         .family = 6,
4304         .model = 175,
4305         .stepping = 0,
4306         /*
4307          * please keep the ascending order so that we can have a clear view of
4308          * bit position of each feature.
4309          */
4310         .features[FEAT_1_EDX] =
4311             CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
4312             CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
4313             CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
4314             CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
4315             CPUID_SSE | CPUID_SSE2,
4316         .features[FEAT_1_ECX] =
4317             CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 |
4318             CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 |
4319             CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
4320             CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES |
4321             CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
4322         .features[FEAT_8000_0001_EDX] =
4323             CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
4324             CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
4325         .features[FEAT_8000_0001_ECX] =
4326             CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH,
4327         .features[FEAT_8000_0008_EBX] =
4328             CPUID_8000_0008_EBX_WBNOINVD,
4329         .features[FEAT_7_0_EBX] =
4330             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4331             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
4332             CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
4333             CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_CLWB |
4334             CPUID_7_0_EBX_SHA_NI,
4335         .features[FEAT_7_0_ECX] =
4336             CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | CPUID_7_0_ECX_GFNI |
4337             CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
4338             CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT,
4339         .features[FEAT_7_0_EDX] =
4340             CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE |
4341             CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_ARCH_CAPABILITIES |
4342             CPUID_7_0_EDX_SPEC_CTRL_SSBD,
4343         .features[FEAT_ARCH_CAPABILITIES] =
4344             MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
4345             MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
4346             MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_SBDR_SSDP_NO |
4347             MSR_ARCH_CAP_FBSDP_NO | MSR_ARCH_CAP_PSDP_NO |
4348             MSR_ARCH_CAP_PBRSB_NO,
4349         .features[FEAT_XSAVE] =
4350             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4351             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
4352         .features[FEAT_6_EAX] =
4353             CPUID_6_EAX_ARAT,
4354         .features[FEAT_7_1_EAX] =
4355             CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_CMPCCXADD |
4356             CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_AVX_IFMA,
4357         .features[FEAT_7_1_EDX] =
4358             CPUID_7_1_EDX_AVX_VNNI_INT8 | CPUID_7_1_EDX_AVX_NE_CONVERT,
4359         .features[FEAT_7_2_EDX] =
4360             CPUID_7_2_EDX_MCDT_NO,
4361         .features[FEAT_VMX_BASIC] =
4362             MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS,
4363         .features[FEAT_VMX_ENTRY_CTLS] =
4364             VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE |
4365             VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL |
4366             VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER,
4367         .features[FEAT_VMX_EPT_VPID_CAPS] =
4368             MSR_VMX_EPT_EXECONLY | MSR_VMX_EPT_PAGE_WALK_LENGTH_4 |
4369             MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB |
4370             MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS |
4371             MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
4372             MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
4373             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT |
4374             MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
4375             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
4376         .features[FEAT_VMX_EXIT_CTLS] =
4377             VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
4378             VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
4379             VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT |
4380             VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
4381             VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
4382         .features[FEAT_VMX_MISC] =
4383             MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT |
4384             MSR_VMX_MISC_VMWRITE_VMEXIT,
4385         .features[FEAT_VMX_PINBASED_CTLS] =
4386             VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING |
4387             VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER |
4388             VMX_PIN_BASED_POSTED_INTR,
4389         .features[FEAT_VMX_PROCBASED_CTLS] =
4390             VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
4391             VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
4392             VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
4393             VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
4394             VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
4395             VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
4396             VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING |
4397             VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
4398             VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG |
4399             VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
4400             VMX_CPU_BASED_PAUSE_EXITING |
4401             VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
4402         .features[FEAT_VMX_SECONDARY_CTLS] =
4403             VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
4404             VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC |
4405             VMX_SECONDARY_EXEC_RDTSCP |
4406             VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
4407             VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING |
4408             VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
4409             VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
4410             VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
4411             VMX_SECONDARY_EXEC_RDRAND_EXITING |
4412             VMX_SECONDARY_EXEC_ENABLE_INVPCID |
4413             VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
4414             VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML |
4415             VMX_SECONDARY_EXEC_XSAVES,
4416         .features[FEAT_VMX_VMFUNC] =
4417             MSR_VMX_VMFUNC_EPT_SWITCHING,
4418         .xlevel = 0x80000008,
4419         .model_id = "Intel Xeon Processor (SierraForest)",
4420         .versions = (X86CPUVersionDefinition[]) {
4421             { .version = 1 },
4422             { /* end of list */ },
4423         },
4424     },
4425     {
4426         .name = "Denverton",
4427         .level = 21,
4428         .vendor = CPUID_VENDOR_INTEL,
4429         .family = 6,
4430         .model = 95,
4431         .stepping = 1,
4432         .features[FEAT_1_EDX] =
4433             CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
4434             CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
4435             CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
4436             CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
4437             CPUID_SSE | CPUID_SSE2,
4438         .features[FEAT_1_ECX] =
4439             CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR |
4440             CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | CPUID_EXT_SSE41 |
4441             CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
4442             CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER |
4443             CPUID_EXT_AES | CPUID_EXT_XSAVE | CPUID_EXT_RDRAND,
4444         .features[FEAT_8000_0001_EDX] =
4445             CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
4446             CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
4447         .features[FEAT_8000_0001_ECX] =
4448             CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
4449         .features[FEAT_7_0_EBX] =
4450             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_ERMS |
4451             CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_SMAP |
4452             CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_SHA_NI,
4453         .features[FEAT_7_0_EDX] =
4454             CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_ARCH_CAPABILITIES |
4455             CPUID_7_0_EDX_SPEC_CTRL_SSBD,
4456         /* XSAVES is added in version 3 */
4457         .features[FEAT_XSAVE] =
4458             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | CPUID_XSAVE_XGETBV1,
4459         .features[FEAT_6_EAX] =
4460             CPUID_6_EAX_ARAT,
4461         .features[FEAT_ARCH_CAPABILITIES] =
4462             MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY,
4463         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
4464              MSR_VMX_BASIC_TRUE_CTLS,
4465         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
4466              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
4467              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
4468         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
4469              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
4470              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
4471              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
4472              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
4473              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
4474              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
4475         .features[FEAT_VMX_EXIT_CTLS] =
4476              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
4477              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
4478              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
4479              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
4480              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
4481         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
4482              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
4483         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
4484              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
4485              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
4486         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
4487              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
4488              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
4489              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
4490              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
4491              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
4492              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
4493              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
4494              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
4495              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
4496              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
4497              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
4498         .features[FEAT_VMX_SECONDARY_CTLS] =
4499              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
4500              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
4501              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
4502              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
4503              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
4504              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
4505              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
4506              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
4507              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
4508              VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
4509         .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
4510         .xlevel = 0x80000008,
4511         .model_id = "Intel Atom Processor (Denverton)",
4512         .versions = (X86CPUVersionDefinition[]) {
4513             { .version = 1 },
4514             {
4515                 .version = 2,
4516                 .note = "no MPX, no MONITOR",
4517                 .props = (PropValue[]) {
4518                     { "monitor", "off" },
4519                     { "mpx", "off" },
4520                     { /* end of list */ },
4521                 },
4522             },
4523             {
4524                 .version = 3,
4525                 .note = "XSAVES, no MPX, no MONITOR",
4526                 .props = (PropValue[]) {
4527                     { "xsaves", "on" },
4528                     { "vmx-xsaves", "on" },
4529                     { /* end of list */ },
4530                 },
4531             },
4532             { /* end of list */ },
4533         },
4534     },
4535     {
4536         .name = "Snowridge",
4537         .level = 27,
4538         .vendor = CPUID_VENDOR_INTEL,
4539         .family = 6,
4540         .model = 134,
4541         .stepping = 1,
4542         .features[FEAT_1_EDX] =
4543             /* missing: CPUID_PN CPUID_IA64 */
4544             /* missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
4545             CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE |
4546             CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE |
4547             CPUID_CX8 | CPUID_APIC | CPUID_SEP |
4548             CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
4549             CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH |
4550             CPUID_MMX |
4551             CPUID_FXSR | CPUID_SSE | CPUID_SSE2,
4552         .features[FEAT_1_ECX] =
4553             CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR |
4554             CPUID_EXT_SSSE3 |
4555             CPUID_EXT_CX16 |
4556             CPUID_EXT_SSE41 |
4557             CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
4558             CPUID_EXT_POPCNT |
4559             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES | CPUID_EXT_XSAVE |
4560             CPUID_EXT_RDRAND,
4561         .features[FEAT_8000_0001_EDX] =
4562             CPUID_EXT2_SYSCALL |
4563             CPUID_EXT2_NX |
4564             CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
4565             CPUID_EXT2_LM,
4566         .features[FEAT_8000_0001_ECX] =
4567             CPUID_EXT3_LAHF_LM |
4568             CPUID_EXT3_3DNOWPREFETCH,
4569         .features[FEAT_7_0_EBX] =
4570             CPUID_7_0_EBX_FSGSBASE |
4571             CPUID_7_0_EBX_SMEP |
4572             CPUID_7_0_EBX_ERMS |
4573             CPUID_7_0_EBX_MPX |  /* missing bits 13, 15 */
4574             CPUID_7_0_EBX_RDSEED |
4575             CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
4576             CPUID_7_0_EBX_CLWB |
4577             CPUID_7_0_EBX_SHA_NI,
4578         .features[FEAT_7_0_ECX] =
4579             CPUID_7_0_ECX_UMIP |
4580             /* missing bit 5 */
4581             CPUID_7_0_ECX_GFNI |
4582             CPUID_7_0_ECX_MOVDIRI | CPUID_7_0_ECX_CLDEMOTE |
4583             CPUID_7_0_ECX_MOVDIR64B,
4584         .features[FEAT_7_0_EDX] =
4585             CPUID_7_0_EDX_SPEC_CTRL |
4586             CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD |
4587             CPUID_7_0_EDX_CORE_CAPABILITY,
4588         .features[FEAT_CORE_CAPABILITY] =
4589             MSR_CORE_CAP_SPLIT_LOCK_DETECT,
4590         /* XSAVES is added in version 3 */
4591         .features[FEAT_XSAVE] =
4592             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4593             CPUID_XSAVE_XGETBV1,
4594         .features[FEAT_6_EAX] =
4595             CPUID_6_EAX_ARAT,
4596         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
4597              MSR_VMX_BASIC_TRUE_CTLS,
4598         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
4599              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
4600              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
4601         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
4602              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
4603              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
4604              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
4605              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
4606              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
4607              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
4608         .features[FEAT_VMX_EXIT_CTLS] =
4609              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
4610              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
4611              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
4612              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
4613              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
4614         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
4615              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
4616         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
4617              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
4618              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
4619         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
4620              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
4621              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
4622              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
4623              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
4624              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
4625              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
4626              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
4627              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
4628              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
4629              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
4630              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
4631         .features[FEAT_VMX_SECONDARY_CTLS] =
4632              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
4633              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
4634              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
4635              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
4636              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
4637              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
4638              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
4639              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
4640              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
4641              VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
4642         .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
4643         .xlevel = 0x80000008,
4644         .model_id = "Intel Atom Processor (SnowRidge)",
4645         .versions = (X86CPUVersionDefinition[]) {
4646             { .version = 1 },
4647             {
4648                 .version = 2,
4649                 .props = (PropValue[]) {
4650                     { "mpx", "off" },
4651                     { "model-id", "Intel Atom Processor (Snowridge, no MPX)" },
4652                     { /* end of list */ },
4653                 },
4654             },
4655             {
4656                 .version = 3,
4657                 .note = "XSAVES, no MPX",
4658                 .props = (PropValue[]) {
4659                     { "xsaves", "on" },
4660                     { "vmx-xsaves", "on" },
4661                     { /* end of list */ },
4662                 },
4663             },
4664             {
4665                 .version = 4,
4666                 .note = "no split lock detect, no core-capability",
4667                 .props = (PropValue[]) {
4668                     { "split-lock-detect", "off" },
4669                     { "core-capability", "off" },
4670                     { /* end of list */ },
4671                 },
4672             },
4673             { /* end of list */ },
4674         },
4675     },
4676     {
4677         .name = "KnightsMill",
4678         .level = 0xd,
4679         .vendor = CPUID_VENDOR_INTEL,
4680         .family = 6,
4681         .model = 133,
4682         .stepping = 0,
4683         .features[FEAT_1_EDX] =
4684             CPUID_VME | CPUID_SS | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR |
4685             CPUID_MMX | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV |
4686             CPUID_MCA | CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC |
4687             CPUID_CX8 | CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC |
4688             CPUID_PSE | CPUID_DE | CPUID_FP87,
4689         .features[FEAT_1_ECX] =
4690             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
4691             CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
4692             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
4693             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
4694             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
4695             CPUID_EXT_F16C | CPUID_EXT_RDRAND,
4696         .features[FEAT_8000_0001_EDX] =
4697             CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
4698             CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
4699         .features[FEAT_8000_0001_ECX] =
4700             CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
4701         .features[FEAT_7_0_EBX] =
4702             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4703             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
4704             CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_AVX512F |
4705             CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_AVX512PF |
4706             CPUID_7_0_EBX_AVX512ER,
4707         .features[FEAT_7_0_ECX] =
4708             CPUID_7_0_ECX_AVX512_VPOPCNTDQ,
4709         .features[FEAT_7_0_EDX] =
4710             CPUID_7_0_EDX_AVX512_4VNNIW | CPUID_7_0_EDX_AVX512_4FMAPS,
4711         .features[FEAT_XSAVE] =
4712             CPUID_XSAVE_XSAVEOPT,
4713         .features[FEAT_6_EAX] =
4714             CPUID_6_EAX_ARAT,
4715         .xlevel = 0x80000008,
4716         .model_id = "Intel Xeon Phi Processor (Knights Mill)",
4717     },
4718     {
4719         .name = "Opteron_G1",
4720         .level = 5,
4721         .vendor = CPUID_VENDOR_AMD,
4722         .family = 15,
4723         .model = 6,
4724         .stepping = 1,
4725         .features[FEAT_1_EDX] =
4726             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4727             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4728             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4729             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4730             CPUID_DE | CPUID_FP87,
4731         .features[FEAT_1_ECX] =
4732             CPUID_EXT_SSE3,
4733         .features[FEAT_8000_0001_EDX] =
4734             CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
4735         .xlevel = 0x80000008,
4736         .model_id = "AMD Opteron 240 (Gen 1 Class Opteron)",
4737     },
4738     {
4739         .name = "Opteron_G2",
4740         .level = 5,
4741         .vendor = CPUID_VENDOR_AMD,
4742         .family = 15,
4743         .model = 6,
4744         .stepping = 1,
4745         .features[FEAT_1_EDX] =
4746             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4747             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4748             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4749             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4750             CPUID_DE | CPUID_FP87,
4751         .features[FEAT_1_ECX] =
4752             CPUID_EXT_CX16 | CPUID_EXT_SSE3,
4753         .features[FEAT_8000_0001_EDX] =
4754             CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
4755         .features[FEAT_8000_0001_ECX] =
4756             CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
4757         .xlevel = 0x80000008,
4758         .model_id = "AMD Opteron 22xx (Gen 2 Class Opteron)",
4759     },
4760     {
4761         .name = "Opteron_G3",
4762         .level = 5,
4763         .vendor = CPUID_VENDOR_AMD,
4764         .family = 16,
4765         .model = 2,
4766         .stepping = 3,
4767         .features[FEAT_1_EDX] =
4768             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4769             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4770             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4771             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4772             CPUID_DE | CPUID_FP87,
4773         .features[FEAT_1_ECX] =
4774             CPUID_EXT_POPCNT | CPUID_EXT_CX16 | CPUID_EXT_MONITOR |
4775             CPUID_EXT_SSE3,
4776         .features[FEAT_8000_0001_EDX] =
4777             CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL |
4778             CPUID_EXT2_RDTSCP,
4779         .features[FEAT_8000_0001_ECX] =
4780             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A |
4781             CPUID_EXT3_ABM | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
4782         .xlevel = 0x80000008,
4783         .model_id = "AMD Opteron 23xx (Gen 3 Class Opteron)",
4784     },
4785     {
4786         .name = "Opteron_G4",
4787         .level = 0xd,
4788         .vendor = CPUID_VENDOR_AMD,
4789         .family = 21,
4790         .model = 1,
4791         .stepping = 2,
4792         .features[FEAT_1_EDX] =
4793             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4794             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4795             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4796             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4797             CPUID_DE | CPUID_FP87,
4798         .features[FEAT_1_ECX] =
4799             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
4800             CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4801             CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
4802             CPUID_EXT_SSE3,
4803         .features[FEAT_8000_0001_EDX] =
4804             CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
4805             CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
4806         .features[FEAT_8000_0001_ECX] =
4807             CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
4808             CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
4809             CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
4810             CPUID_EXT3_LAHF_LM,
4811         .features[FEAT_SVM] =
4812             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4813         /* no xsaveopt! */
4814         .xlevel = 0x8000001A,
4815         .model_id = "AMD Opteron 62xx class CPU",
4816     },
4817     {
4818         .name = "Opteron_G5",
4819         .level = 0xd,
4820         .vendor = CPUID_VENDOR_AMD,
4821         .family = 21,
4822         .model = 2,
4823         .stepping = 0,
4824         .features[FEAT_1_EDX] =
4825             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4826             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4827             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4828             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4829             CPUID_DE | CPUID_FP87,
4830         .features[FEAT_1_ECX] =
4831             CPUID_EXT_F16C | CPUID_EXT_AVX | CPUID_EXT_XSAVE |
4832             CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
4833             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_FMA |
4834             CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
4835         .features[FEAT_8000_0001_EDX] =
4836             CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
4837             CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
4838         .features[FEAT_8000_0001_ECX] =
4839             CPUID_EXT3_TBM | CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
4840             CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
4841             CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
4842             CPUID_EXT3_LAHF_LM,
4843         .features[FEAT_SVM] =
4844             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4845         /* no xsaveopt! */
4846         .xlevel = 0x8000001A,
4847         .model_id = "AMD Opteron 63xx class CPU",
4848     },
4849     {
4850         .name = "EPYC",
4851         .level = 0xd,
4852         .vendor = CPUID_VENDOR_AMD,
4853         .family = 23,
4854         .model = 1,
4855         .stepping = 2,
4856         .features[FEAT_1_EDX] =
4857             CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
4858             CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
4859             CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
4860             CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
4861             CPUID_VME | CPUID_FP87,
4862         .features[FEAT_1_ECX] =
4863             CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
4864             CPUID_EXT_XSAVE | CPUID_EXT_AES |  CPUID_EXT_POPCNT |
4865             CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4866             CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
4867             CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
4868         .features[FEAT_8000_0001_EDX] =
4869             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
4870             CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
4871             CPUID_EXT2_SYSCALL,
4872         .features[FEAT_8000_0001_ECX] =
4873             CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
4874             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
4875             CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
4876             CPUID_EXT3_TOPOEXT,
4877         .features[FEAT_7_0_EBX] =
4878             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4879             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
4880             CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
4881             CPUID_7_0_EBX_SHA_NI,
4882         .features[FEAT_XSAVE] =
4883             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4884             CPUID_XSAVE_XGETBV1,
4885         .features[FEAT_6_EAX] =
4886             CPUID_6_EAX_ARAT,
4887         .features[FEAT_SVM] =
4888             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4889         .xlevel = 0x8000001E,
4890         .model_id = "AMD EPYC Processor",
4891         .cache_info = &epyc_cache_info,
4892         .versions = (X86CPUVersionDefinition[]) {
4893             { .version = 1 },
4894             {
4895                 .version = 2,
4896                 .alias = "EPYC-IBPB",
4897                 .props = (PropValue[]) {
4898                     { "ibpb", "on" },
4899                     { "model-id",
4900                       "AMD EPYC Processor (with IBPB)" },
4901                     { /* end of list */ }
4902                 }
4903             },
4904             {
4905                 .version = 3,
4906                 .props = (PropValue[]) {
4907                     { "ibpb", "on" },
4908                     { "perfctr-core", "on" },
4909                     { "clzero", "on" },
4910                     { "xsaveerptr", "on" },
4911                     { "xsaves", "on" },
4912                     { "model-id",
4913                       "AMD EPYC Processor" },
4914                     { /* end of list */ }
4915                 }
4916             },
4917             {
4918                 .version = 4,
4919                 .props = (PropValue[]) {
4920                     { "model-id",
4921                       "AMD EPYC-v4 Processor" },
4922                     { /* end of list */ }
4923                 },
4924                 .cache_info = &epyc_v4_cache_info
4925             },
4926             { /* end of list */ }
4927         }
4928     },
4929     {
4930         .name = "Dhyana",
4931         .level = 0xd,
4932         .vendor = CPUID_VENDOR_HYGON,
4933         .family = 24,
4934         .model = 0,
4935         .stepping = 1,
4936         .features[FEAT_1_EDX] =
4937             CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
4938             CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
4939             CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
4940             CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
4941             CPUID_VME | CPUID_FP87,
4942         .features[FEAT_1_ECX] =
4943             CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
4944             CPUID_EXT_XSAVE | CPUID_EXT_POPCNT |
4945             CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4946             CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
4947             CPUID_EXT_MONITOR | CPUID_EXT_SSE3,
4948         .features[FEAT_8000_0001_EDX] =
4949             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
4950             CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
4951             CPUID_EXT2_SYSCALL,
4952         .features[FEAT_8000_0001_ECX] =
4953             CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
4954             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
4955             CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
4956             CPUID_EXT3_TOPOEXT,
4957         .features[FEAT_8000_0008_EBX] =
4958             CPUID_8000_0008_EBX_IBPB,
4959         .features[FEAT_7_0_EBX] =
4960             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4961             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
4962             CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT,
4963         /* XSAVES is added in version 2 */
4964         .features[FEAT_XSAVE] =
4965             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4966             CPUID_XSAVE_XGETBV1,
4967         .features[FEAT_6_EAX] =
4968             CPUID_6_EAX_ARAT,
4969         .features[FEAT_SVM] =
4970             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4971         .xlevel = 0x8000001E,
4972         .model_id = "Hygon Dhyana Processor",
4973         .cache_info = &epyc_cache_info,
4974         .versions = (X86CPUVersionDefinition[]) {
4975             { .version = 1 },
4976             { .version = 2,
4977               .note = "XSAVES",
4978               .props = (PropValue[]) {
4979                   { "xsaves", "on" },
4980                   { /* end of list */ }
4981               },
4982             },
4983             { /* end of list */ }
4984         }
4985     },
4986     {
4987         .name = "EPYC-Rome",
4988         .level = 0xd,
4989         .vendor = CPUID_VENDOR_AMD,
4990         .family = 23,
4991         .model = 49,
4992         .stepping = 0,
4993         .features[FEAT_1_EDX] =
4994             CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
4995             CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
4996             CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
4997             CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
4998             CPUID_VME | CPUID_FP87,
4999         .features[FEAT_1_ECX] =
5000             CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
5001             CPUID_EXT_XSAVE | CPUID_EXT_AES |  CPUID_EXT_POPCNT |
5002             CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
5003             CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
5004             CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
5005         .features[FEAT_8000_0001_EDX] =
5006             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
5007             CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
5008             CPUID_EXT2_SYSCALL,
5009         .features[FEAT_8000_0001_ECX] =
5010             CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
5011             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
5012             CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
5013             CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
5014         .features[FEAT_8000_0008_EBX] =
5015             CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
5016             CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
5017             CPUID_8000_0008_EBX_STIBP,
5018         .features[FEAT_7_0_EBX] =
5019             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
5020             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
5021             CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
5022             CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_CLWB,
5023         .features[FEAT_7_0_ECX] =
5024             CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_RDPID,
5025         .features[FEAT_XSAVE] =
5026             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
5027             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
5028         .features[FEAT_6_EAX] =
5029             CPUID_6_EAX_ARAT,
5030         .features[FEAT_SVM] =
5031             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
5032         .xlevel = 0x8000001E,
5033         .model_id = "AMD EPYC-Rome Processor",
5034         .cache_info = &epyc_rome_cache_info,
5035         .versions = (X86CPUVersionDefinition[]) {
5036             { .version = 1 },
5037             {
5038                 .version = 2,
5039                 .props = (PropValue[]) {
5040                     { "ibrs", "on" },
5041                     { "amd-ssbd", "on" },
5042                     { /* end of list */ }
5043                 }
5044             },
5045             {
5046                 .version = 3,
5047                 .props = (PropValue[]) {
5048                     { "model-id",
5049                       "AMD EPYC-Rome-v3 Processor" },
5050                     { /* end of list */ }
5051                 },
5052                 .cache_info = &epyc_rome_v3_cache_info
5053             },
5054             {
5055                 .version = 4,
5056                 .props = (PropValue[]) {
5057                     /* Erratum 1386 */
5058                     { "model-id",
5059                       "AMD EPYC-Rome-v4 Processor (no XSAVES)" },
5060                     { "xsaves", "off" },
5061                     { /* end of list */ }
5062                 },
5063             },
5064             { /* end of list */ }
5065         }
5066     },
5067     {
5068         .name = "EPYC-Milan",
5069         .level = 0xd,
5070         .vendor = CPUID_VENDOR_AMD,
5071         .family = 25,
5072         .model = 1,
5073         .stepping = 1,
5074         .features[FEAT_1_EDX] =
5075             CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
5076             CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
5077             CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
5078             CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
5079             CPUID_VME | CPUID_FP87,
5080         .features[FEAT_1_ECX] =
5081             CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
5082             CPUID_EXT_XSAVE | CPUID_EXT_AES |  CPUID_EXT_POPCNT |
5083             CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
5084             CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
5085             CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
5086             CPUID_EXT_PCID,
5087         .features[FEAT_8000_0001_EDX] =
5088             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
5089             CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
5090             CPUID_EXT2_SYSCALL,
5091         .features[FEAT_8000_0001_ECX] =
5092             CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
5093             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
5094             CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
5095             CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
5096         .features[FEAT_8000_0008_EBX] =
5097             CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
5098             CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
5099             CPUID_8000_0008_EBX_IBRS | CPUID_8000_0008_EBX_STIBP |
5100             CPUID_8000_0008_EBX_AMD_SSBD,
5101         .features[FEAT_7_0_EBX] =
5102             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
5103             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
5104             CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
5105             CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_ERMS |
5106             CPUID_7_0_EBX_INVPCID,
5107         .features[FEAT_7_0_ECX] =
5108             CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_PKU,
5109         .features[FEAT_7_0_EDX] =
5110             CPUID_7_0_EDX_FSRM,
5111         .features[FEAT_XSAVE] =
5112             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
5113             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
5114         .features[FEAT_6_EAX] =
5115             CPUID_6_EAX_ARAT,
5116         .features[FEAT_SVM] =
5117             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE | CPUID_SVM_SVME_ADDR_CHK,
5118         .xlevel = 0x8000001E,
5119         .model_id = "AMD EPYC-Milan Processor",
5120         .cache_info = &epyc_milan_cache_info,
5121         .versions = (X86CPUVersionDefinition[]) {
5122             { .version = 1 },
5123             {
5124                 .version = 2,
5125                 .props = (PropValue[]) {
5126                     { "model-id",
5127                       "AMD EPYC-Milan-v2 Processor" },
5128                     { "vaes", "on" },
5129                     { "vpclmulqdq", "on" },
5130                     { "stibp-always-on", "on" },
5131                     { "amd-psfd", "on" },
5132                     { "no-nested-data-bp", "on" },
5133                     { "lfence-always-serializing", "on" },
5134                     { "null-sel-clr-base", "on" },
5135                     { /* end of list */ }
5136                 },
5137                 .cache_info = &epyc_milan_v2_cache_info
5138             },
5139             { /* end of list */ }
5140         }
5141     },
5142     {
5143         .name = "EPYC-Genoa",
5144         .level = 0xd,
5145         .vendor = CPUID_VENDOR_AMD,
5146         .family = 25,
5147         .model = 17,
5148         .stepping = 0,
5149         .features[FEAT_1_EDX] =
5150             CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
5151             CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
5152             CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
5153             CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
5154             CPUID_VME | CPUID_FP87,
5155         .features[FEAT_1_ECX] =
5156             CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
5157             CPUID_EXT_XSAVE | CPUID_EXT_AES |  CPUID_EXT_POPCNT |
5158             CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
5159             CPUID_EXT_PCID | CPUID_EXT_CX16 | CPUID_EXT_FMA |
5160             CPUID_EXT_SSSE3 | CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ |
5161             CPUID_EXT_SSE3,
5162         .features[FEAT_8000_0001_EDX] =
5163             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
5164             CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
5165             CPUID_EXT2_SYSCALL,
5166         .features[FEAT_8000_0001_ECX] =
5167             CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
5168             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
5169             CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
5170             CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
5171         .features[FEAT_8000_0008_EBX] =
5172             CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
5173             CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
5174             CPUID_8000_0008_EBX_IBRS | CPUID_8000_0008_EBX_STIBP |
5175             CPUID_8000_0008_EBX_STIBP_ALWAYS_ON |
5176             CPUID_8000_0008_EBX_AMD_SSBD | CPUID_8000_0008_EBX_AMD_PSFD,
5177         .features[FEAT_8000_0021_EAX] =
5178             CPUID_8000_0021_EAX_No_NESTED_DATA_BP |
5179             CPUID_8000_0021_EAX_LFENCE_ALWAYS_SERIALIZING |
5180             CPUID_8000_0021_EAX_NULL_SEL_CLR_BASE |
5181             CPUID_8000_0021_EAX_AUTO_IBRS,
5182         .features[FEAT_7_0_EBX] =
5183             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
5184             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
5185             CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_AVX512F |
5186             CPUID_7_0_EBX_AVX512DQ | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
5187             CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_AVX512IFMA |
5188             CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_CLWB |
5189             CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_SHA_NI |
5190             CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512VL,
5191         .features[FEAT_7_0_ECX] =
5192             CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
5193             CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
5194             CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
5195             CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
5196             CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57 |
5197             CPUID_7_0_ECX_RDPID,
5198         .features[FEAT_7_0_EDX] =
5199             CPUID_7_0_EDX_FSRM,
5200         .features[FEAT_7_1_EAX] =
5201             CPUID_7_1_EAX_AVX512_BF16,
5202         .features[FEAT_XSAVE] =
5203             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
5204             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
5205         .features[FEAT_6_EAX] =
5206             CPUID_6_EAX_ARAT,
5207         .features[FEAT_SVM] =
5208             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE | CPUID_SVM_VNMI |
5209             CPUID_SVM_SVME_ADDR_CHK,
5210         .xlevel = 0x80000022,
5211         .model_id = "AMD EPYC-Genoa Processor",
5212         .cache_info = &epyc_genoa_cache_info,
5213     },
5214 };
5215 
5216 /*
5217  * We resolve CPU model aliases using -v1 when using "-machine
5218  * none", but this is just for compatibility while libvirt isn't
5219  * adapted to resolve CPU model versions before creating VMs.
5220  * See "Runnability guarantee of CPU models" at
5221  * docs/about/deprecated.rst.
5222  */
5223 X86CPUVersion default_cpu_version = 1;
5224 
5225 void x86_cpu_set_default_version(X86CPUVersion version)
5226 {
5227     /* Translating CPU_VERSION_AUTO to CPU_VERSION_AUTO doesn't make sense */
5228     assert(version != CPU_VERSION_AUTO);
5229     default_cpu_version = version;
5230 }
5231 
5232 static X86CPUVersion x86_cpu_model_last_version(const X86CPUModel *model)
5233 {
5234     int v = 0;
5235     const X86CPUVersionDefinition *vdef =
5236         x86_cpu_def_get_versions(model->cpudef);
5237     while (vdef->version) {
5238         v = vdef->version;
5239         vdef++;
5240     }
5241     return v;
5242 }
5243 
5244 /* Return the actual version being used for a specific CPU model */
5245 static X86CPUVersion x86_cpu_model_resolve_version(const X86CPUModel *model)
5246 {
5247     X86CPUVersion v = model->version;
5248     if (v == CPU_VERSION_AUTO) {
5249         v = default_cpu_version;
5250     }
5251     if (v == CPU_VERSION_LATEST) {
5252         return x86_cpu_model_last_version(model);
5253     }
5254     return v;
5255 }
5256 
5257 static Property max_x86_cpu_properties[] = {
5258     DEFINE_PROP_BOOL("migratable", X86CPU, migratable, true),
5259     DEFINE_PROP_BOOL("host-cache-info", X86CPU, cache_info_passthrough, false),
5260     DEFINE_PROP_END_OF_LIST()
5261 };
5262 
5263 static void max_x86_cpu_realize(DeviceState *dev, Error **errp)
5264 {
5265     Object *obj = OBJECT(dev);
5266 
5267     if (!object_property_get_int(obj, "family", &error_abort)) {
5268         if (X86_CPU(obj)->env.features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
5269             object_property_set_int(obj, "family", 15, &error_abort);
5270             object_property_set_int(obj, "model", 107, &error_abort);
5271             object_property_set_int(obj, "stepping", 1, &error_abort);
5272         } else {
5273             object_property_set_int(obj, "family", 6, &error_abort);
5274             object_property_set_int(obj, "model", 6, &error_abort);
5275             object_property_set_int(obj, "stepping", 3, &error_abort);
5276         }
5277     }
5278 
5279     x86_cpu_realizefn(dev, errp);
5280 }
5281 
5282 static void max_x86_cpu_class_init(ObjectClass *oc, void *data)
5283 {
5284     DeviceClass *dc = DEVICE_CLASS(oc);
5285     X86CPUClass *xcc = X86_CPU_CLASS(oc);
5286 
5287     xcc->ordering = 9;
5288 
5289     xcc->model_description =
5290         "Enables all features supported by the accelerator in the current host";
5291 
5292     device_class_set_props(dc, max_x86_cpu_properties);
5293     dc->realize = max_x86_cpu_realize;
5294 }
5295 
5296 static void max_x86_cpu_initfn(Object *obj)
5297 {
5298     X86CPU *cpu = X86_CPU(obj);
5299 
5300     /* We can't fill the features array here because we don't know yet if
5301      * "migratable" is true or false.
5302      */
5303     cpu->max_features = true;
5304     object_property_set_bool(OBJECT(cpu), "pmu", true, &error_abort);
5305 
5306     /*
5307      * these defaults are used for TCG and all other accelerators
5308      * besides KVM and HVF, which overwrite these values
5309      */
5310     object_property_set_str(OBJECT(cpu), "vendor", CPUID_VENDOR_AMD,
5311                             &error_abort);
5312     object_property_set_str(OBJECT(cpu), "model-id",
5313                             "QEMU TCG CPU version " QEMU_HW_VERSION,
5314                             &error_abort);
5315 }
5316 
5317 static const TypeInfo max_x86_cpu_type_info = {
5318     .name = X86_CPU_TYPE_NAME("max"),
5319     .parent = TYPE_X86_CPU,
5320     .instance_init = max_x86_cpu_initfn,
5321     .class_init = max_x86_cpu_class_init,
5322 };
5323 
5324 static char *feature_word_description(FeatureWordInfo *f, uint32_t bit)
5325 {
5326     assert(f->type == CPUID_FEATURE_WORD || f->type == MSR_FEATURE_WORD);
5327 
5328     switch (f->type) {
5329     case CPUID_FEATURE_WORD:
5330         {
5331             const char *reg = get_register_name_32(f->cpuid.reg);
5332             assert(reg);
5333             return g_strdup_printf("CPUID.%02XH:%s",
5334                                    f->cpuid.eax, reg);
5335         }
5336     case MSR_FEATURE_WORD:
5337         return g_strdup_printf("MSR(%02XH)",
5338                                f->msr.index);
5339     }
5340 
5341     return NULL;
5342 }
5343 
5344 static bool x86_cpu_have_filtered_features(X86CPU *cpu)
5345 {
5346     FeatureWord w;
5347 
5348     for (w = 0; w < FEATURE_WORDS; w++) {
5349         if (cpu->filtered_features[w]) {
5350             return true;
5351         }
5352     }
5353 
5354     return false;
5355 }
5356 
5357 static void mark_unavailable_features(X86CPU *cpu, FeatureWord w, uint64_t mask,
5358                                       const char *verbose_prefix)
5359 {
5360     CPUX86State *env = &cpu->env;
5361     FeatureWordInfo *f = &feature_word_info[w];
5362     int i;
5363 
5364     if (!cpu->force_features) {
5365         env->features[w] &= ~mask;
5366     }
5367     cpu->filtered_features[w] |= mask;
5368 
5369     if (!verbose_prefix) {
5370         return;
5371     }
5372 
5373     for (i = 0; i < 64; ++i) {
5374         if ((1ULL << i) & mask) {
5375             g_autofree char *feat_word_str = feature_word_description(f, i);
5376             warn_report("%s: %s%s%s [bit %d]",
5377                         verbose_prefix,
5378                         feat_word_str,
5379                         f->feat_names[i] ? "." : "",
5380                         f->feat_names[i] ? f->feat_names[i] : "", i);
5381         }
5382     }
5383 }
5384 
5385 static void x86_cpuid_version_get_family(Object *obj, Visitor *v,
5386                                          const char *name, void *opaque,
5387                                          Error **errp)
5388 {
5389     X86CPU *cpu = X86_CPU(obj);
5390     CPUX86State *env = &cpu->env;
5391     int64_t value;
5392 
5393     value = (env->cpuid_version >> 8) & 0xf;
5394     if (value == 0xf) {
5395         value += (env->cpuid_version >> 20) & 0xff;
5396     }
5397     visit_type_int(v, name, &value, errp);
5398 }
5399 
5400 static void x86_cpuid_version_set_family(Object *obj, Visitor *v,
5401                                          const char *name, void *opaque,
5402                                          Error **errp)
5403 {
5404     X86CPU *cpu = X86_CPU(obj);
5405     CPUX86State *env = &cpu->env;
5406     const int64_t min = 0;
5407     const int64_t max = 0xff + 0xf;
5408     int64_t value;
5409 
5410     if (!visit_type_int(v, name, &value, errp)) {
5411         return;
5412     }
5413     if (value < min || value > max) {
5414         error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
5415                    name ? name : "null", value, min, max);
5416         return;
5417     }
5418 
5419     env->cpuid_version &= ~0xff00f00;
5420     if (value > 0x0f) {
5421         env->cpuid_version |= 0xf00 | ((value - 0x0f) << 20);
5422     } else {
5423         env->cpuid_version |= value << 8;
5424     }
5425 }
5426 
5427 static void x86_cpuid_version_get_model(Object *obj, Visitor *v,
5428                                         const char *name, void *opaque,
5429                                         Error **errp)
5430 {
5431     X86CPU *cpu = X86_CPU(obj);
5432     CPUX86State *env = &cpu->env;
5433     int64_t value;
5434 
5435     value = (env->cpuid_version >> 4) & 0xf;
5436     value |= ((env->cpuid_version >> 16) & 0xf) << 4;
5437     visit_type_int(v, name, &value, errp);
5438 }
5439 
5440 static void x86_cpuid_version_set_model(Object *obj, Visitor *v,
5441                                         const char *name, void *opaque,
5442                                         Error **errp)
5443 {
5444     X86CPU *cpu = X86_CPU(obj);
5445     CPUX86State *env = &cpu->env;
5446     const int64_t min = 0;
5447     const int64_t max = 0xff;
5448     int64_t value;
5449 
5450     if (!visit_type_int(v, name, &value, errp)) {
5451         return;
5452     }
5453     if (value < min || value > max) {
5454         error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
5455                    name ? name : "null", value, min, max);
5456         return;
5457     }
5458 
5459     env->cpuid_version &= ~0xf00f0;
5460     env->cpuid_version |= ((value & 0xf) << 4) | ((value >> 4) << 16);
5461 }
5462 
5463 static void x86_cpuid_version_get_stepping(Object *obj, Visitor *v,
5464                                            const char *name, void *opaque,
5465                                            Error **errp)
5466 {
5467     X86CPU *cpu = X86_CPU(obj);
5468     CPUX86State *env = &cpu->env;
5469     int64_t value;
5470 
5471     value = env->cpuid_version & 0xf;
5472     visit_type_int(v, name, &value, errp);
5473 }
5474 
5475 static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v,
5476                                            const char *name, void *opaque,
5477                                            Error **errp)
5478 {
5479     X86CPU *cpu = X86_CPU(obj);
5480     CPUX86State *env = &cpu->env;
5481     const int64_t min = 0;
5482     const int64_t max = 0xf;
5483     int64_t value;
5484 
5485     if (!visit_type_int(v, name, &value, errp)) {
5486         return;
5487     }
5488     if (value < min || value > max) {
5489         error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
5490                    name ? name : "null", value, min, max);
5491         return;
5492     }
5493 
5494     env->cpuid_version &= ~0xf;
5495     env->cpuid_version |= value & 0xf;
5496 }
5497 
5498 static char *x86_cpuid_get_vendor(Object *obj, Error **errp)
5499 {
5500     X86CPU *cpu = X86_CPU(obj);
5501     CPUX86State *env = &cpu->env;
5502     char *value;
5503 
5504     value = g_malloc(CPUID_VENDOR_SZ + 1);
5505     x86_cpu_vendor_words2str(value, env->cpuid_vendor1, env->cpuid_vendor2,
5506                              env->cpuid_vendor3);
5507     return value;
5508 }
5509 
5510 static void x86_cpuid_set_vendor(Object *obj, const char *value,
5511                                  Error **errp)
5512 {
5513     X86CPU *cpu = X86_CPU(obj);
5514     CPUX86State *env = &cpu->env;
5515     int i;
5516 
5517     if (strlen(value) != CPUID_VENDOR_SZ) {
5518         error_setg(errp, "value of property 'vendor' must consist of"
5519                    " exactly " stringify(CPUID_VENDOR_SZ) " characters");
5520         return;
5521     }
5522 
5523     env->cpuid_vendor1 = 0;
5524     env->cpuid_vendor2 = 0;
5525     env->cpuid_vendor3 = 0;
5526     for (i = 0; i < 4; i++) {
5527         env->cpuid_vendor1 |= ((uint8_t)value[i    ]) << (8 * i);
5528         env->cpuid_vendor2 |= ((uint8_t)value[i + 4]) << (8 * i);
5529         env->cpuid_vendor3 |= ((uint8_t)value[i + 8]) << (8 * i);
5530     }
5531 }
5532 
5533 static char *x86_cpuid_get_model_id(Object *obj, Error **errp)
5534 {
5535     X86CPU *cpu = X86_CPU(obj);
5536     CPUX86State *env = &cpu->env;
5537     char *value;
5538     int i;
5539 
5540     value = g_malloc(48 + 1);
5541     for (i = 0; i < 48; i++) {
5542         value[i] = env->cpuid_model[i >> 2] >> (8 * (i & 3));
5543     }
5544     value[48] = '\0';
5545     return value;
5546 }
5547 
5548 static void x86_cpuid_set_model_id(Object *obj, const char *model_id,
5549                                    Error **errp)
5550 {
5551     X86CPU *cpu = X86_CPU(obj);
5552     CPUX86State *env = &cpu->env;
5553     int c, len, i;
5554 
5555     if (model_id == NULL) {
5556         model_id = "";
5557     }
5558     len = strlen(model_id);
5559     memset(env->cpuid_model, 0, 48);
5560     for (i = 0; i < 48; i++) {
5561         if (i >= len) {
5562             c = '\0';
5563         } else {
5564             c = (uint8_t)model_id[i];
5565         }
5566         env->cpuid_model[i >> 2] |= c << (8 * (i & 3));
5567     }
5568 }
5569 
5570 static void x86_cpuid_get_tsc_freq(Object *obj, Visitor *v, const char *name,
5571                                    void *opaque, Error **errp)
5572 {
5573     X86CPU *cpu = X86_CPU(obj);
5574     int64_t value;
5575 
5576     value = cpu->env.tsc_khz * 1000;
5577     visit_type_int(v, name, &value, errp);
5578 }
5579 
5580 static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name,
5581                                    void *opaque, Error **errp)
5582 {
5583     X86CPU *cpu = X86_CPU(obj);
5584     const int64_t min = 0;
5585     const int64_t max = INT64_MAX;
5586     int64_t value;
5587 
5588     if (!visit_type_int(v, name, &value, errp)) {
5589         return;
5590     }
5591     if (value < min || value > max) {
5592         error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
5593                    name ? name : "null", value, min, max);
5594         return;
5595     }
5596 
5597     cpu->env.tsc_khz = cpu->env.user_tsc_khz = value / 1000;
5598 }
5599 
5600 /* Generic getter for "feature-words" and "filtered-features" properties */
5601 static void x86_cpu_get_feature_words(Object *obj, Visitor *v,
5602                                       const char *name, void *opaque,
5603                                       Error **errp)
5604 {
5605     uint64_t *array = (uint64_t *)opaque;
5606     FeatureWord w;
5607     X86CPUFeatureWordInfo word_infos[FEATURE_WORDS] = { };
5608     X86CPUFeatureWordInfoList list_entries[FEATURE_WORDS] = { };
5609     X86CPUFeatureWordInfoList *list = NULL;
5610 
5611     for (w = 0; w < FEATURE_WORDS; w++) {
5612         FeatureWordInfo *wi = &feature_word_info[w];
5613         /*
5614                 * We didn't have MSR features when "feature-words" was
5615                 *  introduced. Therefore skipped other type entries.
5616                 */
5617         if (wi->type != CPUID_FEATURE_WORD) {
5618             continue;
5619         }
5620         X86CPUFeatureWordInfo *qwi = &word_infos[w];
5621         qwi->cpuid_input_eax = wi->cpuid.eax;
5622         qwi->has_cpuid_input_ecx = wi->cpuid.needs_ecx;
5623         qwi->cpuid_input_ecx = wi->cpuid.ecx;
5624         qwi->cpuid_register = x86_reg_info_32[wi->cpuid.reg].qapi_enum;
5625         qwi->features = array[w];
5626 
5627         /* List will be in reverse order, but order shouldn't matter */
5628         list_entries[w].next = list;
5629         list_entries[w].value = &word_infos[w];
5630         list = &list_entries[w];
5631     }
5632 
5633     visit_type_X86CPUFeatureWordInfoList(v, "feature-words", &list, errp);
5634 }
5635 
5636 /* Convert all '_' in a feature string option name to '-', to make feature
5637  * name conform to QOM property naming rule, which uses '-' instead of '_'.
5638  */
5639 static inline void feat2prop(char *s)
5640 {
5641     while ((s = strchr(s, '_'))) {
5642         *s = '-';
5643     }
5644 }
5645 
5646 /* Return the feature property name for a feature flag bit */
5647 static const char *x86_cpu_feature_name(FeatureWord w, int bitnr)
5648 {
5649     const char *name;
5650     /* XSAVE components are automatically enabled by other features,
5651      * so return the original feature name instead
5652      */
5653     if (w == FEAT_XSAVE_XCR0_LO || w == FEAT_XSAVE_XCR0_HI) {
5654         int comp = (w == FEAT_XSAVE_XCR0_HI) ? bitnr + 32 : bitnr;
5655 
5656         if (comp < ARRAY_SIZE(x86_ext_save_areas) &&
5657             x86_ext_save_areas[comp].bits) {
5658             w = x86_ext_save_areas[comp].feature;
5659             bitnr = ctz32(x86_ext_save_areas[comp].bits);
5660         }
5661     }
5662 
5663     assert(bitnr < 64);
5664     assert(w < FEATURE_WORDS);
5665     name = feature_word_info[w].feat_names[bitnr];
5666     assert(bitnr < 32 || !(name && feature_word_info[w].type == CPUID_FEATURE_WORD));
5667     return name;
5668 }
5669 
5670 /* Compatibility hack to maintain legacy +-feat semantic,
5671  * where +-feat overwrites any feature set by
5672  * feat=on|feat even if the later is parsed after +-feat
5673  * (i.e. "-x2apic,x2apic=on" will result in x2apic disabled)
5674  */
5675 static GList *plus_features, *minus_features;
5676 
5677 static gint compare_string(gconstpointer a, gconstpointer b)
5678 {
5679     return g_strcmp0(a, b);
5680 }
5681 
5682 /* Parse "+feature,-feature,feature=foo" CPU feature string
5683  */
5684 static void x86_cpu_parse_featurestr(const char *typename, char *features,
5685                                      Error **errp)
5686 {
5687     char *featurestr; /* Single 'key=value" string being parsed */
5688     static bool cpu_globals_initialized;
5689     bool ambiguous = false;
5690 
5691     if (cpu_globals_initialized) {
5692         return;
5693     }
5694     cpu_globals_initialized = true;
5695 
5696     if (!features) {
5697         return;
5698     }
5699 
5700     for (featurestr = strtok(features, ",");
5701          featurestr;
5702          featurestr = strtok(NULL, ",")) {
5703         const char *name;
5704         const char *val = NULL;
5705         char *eq = NULL;
5706         char num[32];
5707         GlobalProperty *prop;
5708 
5709         /* Compatibility syntax: */
5710         if (featurestr[0] == '+') {
5711             plus_features = g_list_append(plus_features,
5712                                           g_strdup(featurestr + 1));
5713             continue;
5714         } else if (featurestr[0] == '-') {
5715             minus_features = g_list_append(minus_features,
5716                                            g_strdup(featurestr + 1));
5717             continue;
5718         }
5719 
5720         eq = strchr(featurestr, '=');
5721         if (eq) {
5722             *eq++ = 0;
5723             val = eq;
5724         } else {
5725             val = "on";
5726         }
5727 
5728         feat2prop(featurestr);
5729         name = featurestr;
5730 
5731         if (g_list_find_custom(plus_features, name, compare_string)) {
5732             warn_report("Ambiguous CPU model string. "
5733                         "Don't mix both \"+%s\" and \"%s=%s\"",
5734                         name, name, val);
5735             ambiguous = true;
5736         }
5737         if (g_list_find_custom(minus_features, name, compare_string)) {
5738             warn_report("Ambiguous CPU model string. "
5739                         "Don't mix both \"-%s\" and \"%s=%s\"",
5740                         name, name, val);
5741             ambiguous = true;
5742         }
5743 
5744         /* Special case: */
5745         if (!strcmp(name, "tsc-freq")) {
5746             int ret;
5747             uint64_t tsc_freq;
5748 
5749             ret = qemu_strtosz_metric(val, NULL, &tsc_freq);
5750             if (ret < 0 || tsc_freq > INT64_MAX) {
5751                 error_setg(errp, "bad numerical value %s", val);
5752                 return;
5753             }
5754             snprintf(num, sizeof(num), "%" PRId64, tsc_freq);
5755             val = num;
5756             name = "tsc-frequency";
5757         }
5758 
5759         prop = g_new0(typeof(*prop), 1);
5760         prop->driver = typename;
5761         prop->property = g_strdup(name);
5762         prop->value = g_strdup(val);
5763         qdev_prop_register_global(prop);
5764     }
5765 
5766     if (ambiguous) {
5767         warn_report("Compatibility of ambiguous CPU model "
5768                     "strings won't be kept on future QEMU versions");
5769     }
5770 }
5771 
5772 static void x86_cpu_filter_features(X86CPU *cpu, bool verbose);
5773 
5774 /* Build a list with the name of all features on a feature word array */
5775 static void x86_cpu_list_feature_names(FeatureWordArray features,
5776                                        strList **list)
5777 {
5778     strList **tail = list;
5779     FeatureWord w;
5780 
5781     for (w = 0; w < FEATURE_WORDS; w++) {
5782         uint64_t filtered = features[w];
5783         int i;
5784         for (i = 0; i < 64; i++) {
5785             if (filtered & (1ULL << i)) {
5786                 QAPI_LIST_APPEND(tail, g_strdup(x86_cpu_feature_name(w, i)));
5787             }
5788         }
5789     }
5790 }
5791 
5792 static void x86_cpu_get_unavailable_features(Object *obj, Visitor *v,
5793                                              const char *name, void *opaque,
5794                                              Error **errp)
5795 {
5796     X86CPU *xc = X86_CPU(obj);
5797     strList *result = NULL;
5798 
5799     x86_cpu_list_feature_names(xc->filtered_features, &result);
5800     visit_type_strList(v, "unavailable-features", &result, errp);
5801 }
5802 
5803 /* Print all cpuid feature names in featureset
5804  */
5805 static void listflags(GList *features)
5806 {
5807     size_t len = 0;
5808     GList *tmp;
5809 
5810     for (tmp = features; tmp; tmp = tmp->next) {
5811         const char *name = tmp->data;
5812         if ((len + strlen(name) + 1) >= 75) {
5813             qemu_printf("\n");
5814             len = 0;
5815         }
5816         qemu_printf("%s%s", len == 0 ? "  " : " ", name);
5817         len += strlen(name) + 1;
5818     }
5819     qemu_printf("\n");
5820 }
5821 
5822 /* Sort alphabetically by type name, respecting X86CPUClass::ordering. */
5823 static gint x86_cpu_list_compare(gconstpointer a, gconstpointer b)
5824 {
5825     ObjectClass *class_a = (ObjectClass *)a;
5826     ObjectClass *class_b = (ObjectClass *)b;
5827     X86CPUClass *cc_a = X86_CPU_CLASS(class_a);
5828     X86CPUClass *cc_b = X86_CPU_CLASS(class_b);
5829     int ret;
5830 
5831     if (cc_a->ordering != cc_b->ordering) {
5832         ret = cc_a->ordering - cc_b->ordering;
5833     } else {
5834         g_autofree char *name_a = x86_cpu_class_get_model_name(cc_a);
5835         g_autofree char *name_b = x86_cpu_class_get_model_name(cc_b);
5836         ret = strcmp(name_a, name_b);
5837     }
5838     return ret;
5839 }
5840 
5841 static GSList *get_sorted_cpu_model_list(void)
5842 {
5843     GSList *list = object_class_get_list(TYPE_X86_CPU, false);
5844     list = g_slist_sort(list, x86_cpu_list_compare);
5845     return list;
5846 }
5847 
5848 static char *x86_cpu_class_get_model_id(X86CPUClass *xc)
5849 {
5850     Object *obj = object_new_with_class(OBJECT_CLASS(xc));
5851     char *r = object_property_get_str(obj, "model-id", &error_abort);
5852     object_unref(obj);
5853     return r;
5854 }
5855 
5856 static char *x86_cpu_class_get_alias_of(X86CPUClass *cc)
5857 {
5858     X86CPUVersion version;
5859 
5860     if (!cc->model || !cc->model->is_alias) {
5861         return NULL;
5862     }
5863     version = x86_cpu_model_resolve_version(cc->model);
5864     if (version <= 0) {
5865         return NULL;
5866     }
5867     return x86_cpu_versioned_model_name(cc->model->cpudef, version);
5868 }
5869 
5870 static void x86_cpu_list_entry(gpointer data, gpointer user_data)
5871 {
5872     ObjectClass *oc = data;
5873     X86CPUClass *cc = X86_CPU_CLASS(oc);
5874     g_autofree char *name = x86_cpu_class_get_model_name(cc);
5875     g_autofree char *desc = g_strdup(cc->model_description);
5876     g_autofree char *alias_of = x86_cpu_class_get_alias_of(cc);
5877     g_autofree char *model_id = x86_cpu_class_get_model_id(cc);
5878 
5879     if (!desc && alias_of) {
5880         if (cc->model && cc->model->version == CPU_VERSION_AUTO) {
5881             desc = g_strdup("(alias configured by machine type)");
5882         } else {
5883             desc = g_strdup_printf("(alias of %s)", alias_of);
5884         }
5885     }
5886     if (!desc && cc->model && cc->model->note) {
5887         desc = g_strdup_printf("%s [%s]", model_id, cc->model->note);
5888     }
5889     if (!desc) {
5890         desc = g_strdup_printf("%s", model_id);
5891     }
5892 
5893     if (cc->model && cc->model->cpudef->deprecation_note) {
5894         g_autofree char *olddesc = desc;
5895         desc = g_strdup_printf("%s (deprecated)", olddesc);
5896     }
5897 
5898     qemu_printf("  %-20s  %s\n", name, desc);
5899 }
5900 
5901 /* list available CPU models and flags */
5902 void x86_cpu_list(void)
5903 {
5904     int i, j;
5905     GSList *list;
5906     GList *names = NULL;
5907 
5908     qemu_printf("Available CPUs:\n");
5909     list = get_sorted_cpu_model_list();
5910     g_slist_foreach(list, x86_cpu_list_entry, NULL);
5911     g_slist_free(list);
5912 
5913     names = NULL;
5914     for (i = 0; i < ARRAY_SIZE(feature_word_info); i++) {
5915         FeatureWordInfo *fw = &feature_word_info[i];
5916         for (j = 0; j < 64; j++) {
5917             if (fw->feat_names[j]) {
5918                 names = g_list_append(names, (gpointer)fw->feat_names[j]);
5919             }
5920         }
5921     }
5922 
5923     names = g_list_sort(names, (GCompareFunc)strcmp);
5924 
5925     qemu_printf("\nRecognized CPUID flags:\n");
5926     listflags(names);
5927     qemu_printf("\n");
5928     g_list_free(names);
5929 }
5930 
5931 #ifndef CONFIG_USER_ONLY
5932 
5933 /* Check for missing features that may prevent the CPU class from
5934  * running using the current machine and accelerator.
5935  */
5936 static void x86_cpu_class_check_missing_features(X86CPUClass *xcc,
5937                                                  strList **list)
5938 {
5939     strList **tail = list;
5940     X86CPU *xc;
5941     Error *err = NULL;
5942 
5943     if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
5944         QAPI_LIST_APPEND(tail, g_strdup("kvm"));
5945         return;
5946     }
5947 
5948     xc = X86_CPU(object_new_with_class(OBJECT_CLASS(xcc)));
5949 
5950     x86_cpu_expand_features(xc, &err);
5951     if (err) {
5952         /* Errors at x86_cpu_expand_features should never happen,
5953          * but in case it does, just report the model as not
5954          * runnable at all using the "type" property.
5955          */
5956         QAPI_LIST_APPEND(tail, g_strdup("type"));
5957         error_free(err);
5958     }
5959 
5960     x86_cpu_filter_features(xc, false);
5961 
5962     x86_cpu_list_feature_names(xc->filtered_features, tail);
5963 
5964     object_unref(OBJECT(xc));
5965 }
5966 
5967 static void x86_cpu_definition_entry(gpointer data, gpointer user_data)
5968 {
5969     ObjectClass *oc = data;
5970     X86CPUClass *cc = X86_CPU_CLASS(oc);
5971     CpuDefinitionInfoList **cpu_list = user_data;
5972     CpuDefinitionInfo *info;
5973 
5974     info = g_malloc0(sizeof(*info));
5975     info->name = x86_cpu_class_get_model_name(cc);
5976     x86_cpu_class_check_missing_features(cc, &info->unavailable_features);
5977     info->has_unavailable_features = true;
5978     info->q_typename = g_strdup(object_class_get_name(oc));
5979     info->migration_safe = cc->migration_safe;
5980     info->has_migration_safe = true;
5981     info->q_static = cc->static_model;
5982     if (cc->model && cc->model->cpudef->deprecation_note) {
5983         info->deprecated = true;
5984     } else {
5985         info->deprecated = false;
5986     }
5987     /*
5988      * Old machine types won't report aliases, so that alias translation
5989      * doesn't break compatibility with previous QEMU versions.
5990      */
5991     if (default_cpu_version != CPU_VERSION_LEGACY) {
5992         info->alias_of = x86_cpu_class_get_alias_of(cc);
5993     }
5994 
5995     QAPI_LIST_PREPEND(*cpu_list, info);
5996 }
5997 
5998 CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
5999 {
6000     CpuDefinitionInfoList *cpu_list = NULL;
6001     GSList *list = get_sorted_cpu_model_list();
6002     g_slist_foreach(list, x86_cpu_definition_entry, &cpu_list);
6003     g_slist_free(list);
6004     return cpu_list;
6005 }
6006 
6007 #endif /* !CONFIG_USER_ONLY */
6008 
6009 uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
6010                                             bool migratable_only)
6011 {
6012     FeatureWordInfo *wi = &feature_word_info[w];
6013     uint64_t r = 0;
6014 
6015     if (kvm_enabled()) {
6016         switch (wi->type) {
6017         case CPUID_FEATURE_WORD:
6018             r = kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid.eax,
6019                                                         wi->cpuid.ecx,
6020                                                         wi->cpuid.reg);
6021             break;
6022         case MSR_FEATURE_WORD:
6023             r = kvm_arch_get_supported_msr_feature(kvm_state,
6024                         wi->msr.index);
6025             break;
6026         }
6027     } else if (hvf_enabled()) {
6028         if (wi->type != CPUID_FEATURE_WORD) {
6029             return 0;
6030         }
6031         r = hvf_get_supported_cpuid(wi->cpuid.eax,
6032                                     wi->cpuid.ecx,
6033                                     wi->cpuid.reg);
6034     } else if (tcg_enabled()) {
6035         r = wi->tcg_features;
6036     } else {
6037         return ~0;
6038     }
6039 #ifndef TARGET_X86_64
6040     if (w == FEAT_8000_0001_EDX) {
6041         /*
6042          * 32-bit TCG can emulate 64-bit compatibility mode.  If there is no
6043          * way for userspace to get out of its 32-bit jail, we can leave
6044          * the LM bit set.
6045          */
6046         uint32_t unavail = tcg_enabled()
6047             ? CPUID_EXT2_LM & ~CPUID_EXT2_KERNEL_FEATURES
6048             : CPUID_EXT2_LM;
6049         r &= ~unavail;
6050     }
6051 #endif
6052     if (migratable_only) {
6053         r &= x86_cpu_get_migratable_flags(w);
6054     }
6055     return r;
6056 }
6057 
6058 static void x86_cpu_get_supported_cpuid(uint32_t func, uint32_t index,
6059                                         uint32_t *eax, uint32_t *ebx,
6060                                         uint32_t *ecx, uint32_t *edx)
6061 {
6062     if (kvm_enabled()) {
6063         *eax = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EAX);
6064         *ebx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EBX);
6065         *ecx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_ECX);
6066         *edx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EDX);
6067     } else if (hvf_enabled()) {
6068         *eax = hvf_get_supported_cpuid(func, index, R_EAX);
6069         *ebx = hvf_get_supported_cpuid(func, index, R_EBX);
6070         *ecx = hvf_get_supported_cpuid(func, index, R_ECX);
6071         *edx = hvf_get_supported_cpuid(func, index, R_EDX);
6072     } else {
6073         *eax = 0;
6074         *ebx = 0;
6075         *ecx = 0;
6076         *edx = 0;
6077     }
6078 }
6079 
6080 static void x86_cpu_get_cache_cpuid(uint32_t func, uint32_t index,
6081                                     uint32_t *eax, uint32_t *ebx,
6082                                     uint32_t *ecx, uint32_t *edx)
6083 {
6084     uint32_t level, unused;
6085 
6086     /* Only return valid host leaves.  */
6087     switch (func) {
6088     case 2:
6089     case 4:
6090         host_cpuid(0, 0, &level, &unused, &unused, &unused);
6091         break;
6092     case 0x80000005:
6093     case 0x80000006:
6094     case 0x8000001d:
6095         host_cpuid(0x80000000, 0, &level, &unused, &unused, &unused);
6096         break;
6097     default:
6098         return;
6099     }
6100 
6101     if (func > level) {
6102         *eax = 0;
6103         *ebx = 0;
6104         *ecx = 0;
6105         *edx = 0;
6106     } else {
6107         host_cpuid(func, index, eax, ebx, ecx, edx);
6108     }
6109 }
6110 
6111 /*
6112  * Only for builtin_x86_defs models initialized with x86_register_cpudef_types.
6113  */
6114 void x86_cpu_apply_props(X86CPU *cpu, PropValue *props)
6115 {
6116     PropValue *pv;
6117     for (pv = props; pv->prop; pv++) {
6118         if (!pv->value) {
6119             continue;
6120         }
6121         object_property_parse(OBJECT(cpu), pv->prop, pv->value,
6122                               &error_abort);
6123     }
6124 }
6125 
6126 /*
6127  * Apply properties for the CPU model version specified in model.
6128  * Only for builtin_x86_defs models initialized with x86_register_cpudef_types.
6129  */
6130 
6131 static void x86_cpu_apply_version_props(X86CPU *cpu, X86CPUModel *model)
6132 {
6133     const X86CPUVersionDefinition *vdef;
6134     X86CPUVersion version = x86_cpu_model_resolve_version(model);
6135 
6136     if (version == CPU_VERSION_LEGACY) {
6137         return;
6138     }
6139 
6140     for (vdef = x86_cpu_def_get_versions(model->cpudef); vdef->version; vdef++) {
6141         PropValue *p;
6142 
6143         for (p = vdef->props; p && p->prop; p++) {
6144             object_property_parse(OBJECT(cpu), p->prop, p->value,
6145                                   &error_abort);
6146         }
6147 
6148         if (vdef->version == version) {
6149             break;
6150         }
6151     }
6152 
6153     /*
6154      * If we reached the end of the list, version number was invalid
6155      */
6156     assert(vdef->version == version);
6157 }
6158 
6159 static const CPUCaches *x86_cpu_get_versioned_cache_info(X86CPU *cpu,
6160                                                          X86CPUModel *model)
6161 {
6162     const X86CPUVersionDefinition *vdef;
6163     X86CPUVersion version = x86_cpu_model_resolve_version(model);
6164     const CPUCaches *cache_info = model->cpudef->cache_info;
6165 
6166     if (version == CPU_VERSION_LEGACY) {
6167         return cache_info;
6168     }
6169 
6170     for (vdef = x86_cpu_def_get_versions(model->cpudef); vdef->version; vdef++) {
6171         if (vdef->cache_info) {
6172             cache_info = vdef->cache_info;
6173         }
6174 
6175         if (vdef->version == version) {
6176             break;
6177         }
6178     }
6179 
6180     assert(vdef->version == version);
6181     return cache_info;
6182 }
6183 
6184 /*
6185  * Load data from X86CPUDefinition into a X86CPU object.
6186  * Only for builtin_x86_defs models initialized with x86_register_cpudef_types.
6187  */
6188 static void x86_cpu_load_model(X86CPU *cpu, X86CPUModel *model)
6189 {
6190     const X86CPUDefinition *def = model->cpudef;
6191     CPUX86State *env = &cpu->env;
6192     FeatureWord w;
6193 
6194     /*NOTE: any property set by this function should be returned by
6195      * x86_cpu_static_props(), so static expansion of
6196      * query-cpu-model-expansion is always complete.
6197      */
6198 
6199     /* CPU models only set _minimum_ values for level/xlevel: */
6200     object_property_set_uint(OBJECT(cpu), "min-level", def->level,
6201                              &error_abort);
6202     object_property_set_uint(OBJECT(cpu), "min-xlevel", def->xlevel,
6203                              &error_abort);
6204 
6205     object_property_set_int(OBJECT(cpu), "family", def->family, &error_abort);
6206     object_property_set_int(OBJECT(cpu), "model", def->model, &error_abort);
6207     object_property_set_int(OBJECT(cpu), "stepping", def->stepping,
6208                             &error_abort);
6209     object_property_set_str(OBJECT(cpu), "model-id", def->model_id,
6210                             &error_abort);
6211     for (w = 0; w < FEATURE_WORDS; w++) {
6212         env->features[w] = def->features[w];
6213     }
6214 
6215     /* legacy-cache defaults to 'off' if CPU model provides cache info */
6216     cpu->legacy_cache = !x86_cpu_get_versioned_cache_info(cpu, model);
6217 
6218     env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR;
6219 
6220     /* sysenter isn't supported in compatibility mode on AMD,
6221      * syscall isn't supported in compatibility mode on Intel.
6222      * Normally we advertise the actual CPU vendor, but you can
6223      * override this using the 'vendor' property if you want to use
6224      * KVM's sysenter/syscall emulation in compatibility mode and
6225      * when doing cross vendor migration
6226      */
6227 
6228     /*
6229      * vendor property is set here but then overloaded with the
6230      * host cpu vendor for KVM and HVF.
6231      */
6232     object_property_set_str(OBJECT(cpu), "vendor", def->vendor, &error_abort);
6233 
6234     x86_cpu_apply_version_props(cpu, model);
6235 
6236     /*
6237      * Properties in versioned CPU model are not user specified features.
6238      * We can simply clear env->user_features here since it will be filled later
6239      * in x86_cpu_expand_features() based on plus_features and minus_features.
6240      */
6241     memset(&env->user_features, 0, sizeof(env->user_features));
6242 }
6243 
6244 static const gchar *x86_gdb_arch_name(CPUState *cs)
6245 {
6246 #ifdef TARGET_X86_64
6247     return "i386:x86-64";
6248 #else
6249     return "i386";
6250 #endif
6251 }
6252 
6253 static void x86_cpu_cpudef_class_init(ObjectClass *oc, void *data)
6254 {
6255     X86CPUModel *model = data;
6256     X86CPUClass *xcc = X86_CPU_CLASS(oc);
6257     CPUClass *cc = CPU_CLASS(oc);
6258 
6259     xcc->model = model;
6260     xcc->migration_safe = true;
6261     cc->deprecation_note = model->cpudef->deprecation_note;
6262 }
6263 
6264 static void x86_register_cpu_model_type(const char *name, X86CPUModel *model)
6265 {
6266     g_autofree char *typename = x86_cpu_type_name(name);
6267     TypeInfo ti = {
6268         .name = typename,
6269         .parent = TYPE_X86_CPU,
6270         .class_init = x86_cpu_cpudef_class_init,
6271         .class_data = model,
6272     };
6273 
6274     type_register(&ti);
6275 }
6276 
6277 
6278 /*
6279  * register builtin_x86_defs;
6280  * "max", "base" and subclasses ("host") are not registered here.
6281  * See x86_cpu_register_types for all model registrations.
6282  */
6283 static void x86_register_cpudef_types(const X86CPUDefinition *def)
6284 {
6285     X86CPUModel *m;
6286     const X86CPUVersionDefinition *vdef;
6287 
6288     /* AMD aliases are handled at runtime based on CPUID vendor, so
6289      * they shouldn't be set on the CPU model table.
6290      */
6291     assert(!(def->features[FEAT_8000_0001_EDX] & CPUID_EXT2_AMD_ALIASES));
6292     /* catch mistakes instead of silently truncating model_id when too long */
6293     assert(def->model_id && strlen(def->model_id) <= 48);
6294 
6295     /* Unversioned model: */
6296     m = g_new0(X86CPUModel, 1);
6297     m->cpudef = def;
6298     m->version = CPU_VERSION_AUTO;
6299     m->is_alias = true;
6300     x86_register_cpu_model_type(def->name, m);
6301 
6302     /* Versioned models: */
6303 
6304     for (vdef = x86_cpu_def_get_versions(def); vdef->version; vdef++) {
6305         g_autofree char *name =
6306             x86_cpu_versioned_model_name(def, vdef->version);
6307 
6308         m = g_new0(X86CPUModel, 1);
6309         m->cpudef = def;
6310         m->version = vdef->version;
6311         m->note = vdef->note;
6312         x86_register_cpu_model_type(name, m);
6313 
6314         if (vdef->alias) {
6315             X86CPUModel *am = g_new0(X86CPUModel, 1);
6316             am->cpudef = def;
6317             am->version = vdef->version;
6318             am->is_alias = true;
6319             x86_register_cpu_model_type(vdef->alias, am);
6320         }
6321     }
6322 
6323 }
6324 
6325 uint32_t cpu_x86_virtual_addr_width(CPUX86State *env)
6326 {
6327     if  (env->features[FEAT_7_0_ECX] & CPUID_7_0_ECX_LA57) {
6328         return 57; /* 57 bits virtual */
6329     } else {
6330         return 48; /* 48 bits virtual */
6331     }
6332 }
6333 
6334 void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
6335                    uint32_t *eax, uint32_t *ebx,
6336                    uint32_t *ecx, uint32_t *edx)
6337 {
6338     X86CPU *cpu = env_archcpu(env);
6339     CPUState *cs = env_cpu(env);
6340     uint32_t limit;
6341     uint32_t signature[3];
6342     X86CPUTopoInfo topo_info;
6343     uint32_t cores_per_pkg;
6344     uint32_t threads_per_pkg;
6345 
6346     topo_info.dies_per_pkg = env->nr_dies;
6347     topo_info.modules_per_die = env->nr_modules;
6348     topo_info.cores_per_module = cs->nr_cores / env->nr_dies / env->nr_modules;
6349     topo_info.threads_per_core = cs->nr_threads;
6350 
6351     cores_per_pkg = topo_info.cores_per_module * topo_info.modules_per_die *
6352                     topo_info.dies_per_pkg;
6353     threads_per_pkg = cores_per_pkg * topo_info.threads_per_core;
6354 
6355     /* Calculate & apply limits for different index ranges */
6356     if (index >= 0xC0000000) {
6357         limit = env->cpuid_xlevel2;
6358     } else if (index >= 0x80000000) {
6359         limit = env->cpuid_xlevel;
6360     } else if (index >= 0x40000000) {
6361         limit = 0x40000001;
6362     } else {
6363         limit = env->cpuid_level;
6364     }
6365 
6366     if (index > limit) {
6367         /* Intel documentation states that invalid EAX input will
6368          * return the same information as EAX=cpuid_level
6369          * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID)
6370          */
6371         index = env->cpuid_level;
6372     }
6373 
6374     switch(index) {
6375     case 0:
6376         *eax = env->cpuid_level;
6377         *ebx = env->cpuid_vendor1;
6378         *edx = env->cpuid_vendor2;
6379         *ecx = env->cpuid_vendor3;
6380         break;
6381     case 1:
6382         *eax = env->cpuid_version;
6383         *ebx = (cpu->apic_id << 24) |
6384                8 << 8; /* CLFLUSH size in quad words, Linux wants it. */
6385         *ecx = env->features[FEAT_1_ECX];
6386         if ((*ecx & CPUID_EXT_XSAVE) && (env->cr[4] & CR4_OSXSAVE_MASK)) {
6387             *ecx |= CPUID_EXT_OSXSAVE;
6388         }
6389         *edx = env->features[FEAT_1_EDX];
6390         if (threads_per_pkg > 1) {
6391             *ebx |= threads_per_pkg << 16;
6392             *edx |= CPUID_HT;
6393         }
6394         if (!cpu->enable_pmu) {
6395             *ecx &= ~CPUID_EXT_PDCM;
6396         }
6397         break;
6398     case 2:
6399         /* cache info: needed for Pentium Pro compatibility */
6400         if (cpu->cache_info_passthrough) {
6401             x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
6402             break;
6403         } else if (cpu->vendor_cpuid_only && IS_AMD_CPU(env)) {
6404             *eax = *ebx = *ecx = *edx = 0;
6405             break;
6406         }
6407         *eax = 1; /* Number of CPUID[EAX=2] calls required */
6408         *ebx = 0;
6409         if (!cpu->enable_l3_cache) {
6410             *ecx = 0;
6411         } else {
6412             *ecx = cpuid2_cache_descriptor(env->cache_info_cpuid2.l3_cache);
6413         }
6414         *edx = (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1d_cache) << 16) |
6415                (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1i_cache) <<  8) |
6416                (cpuid2_cache_descriptor(env->cache_info_cpuid2.l2_cache));
6417         break;
6418     case 4:
6419         /* cache info: needed for Core compatibility */
6420         if (cpu->cache_info_passthrough) {
6421             x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx);
6422             /*
6423              * QEMU has its own number of cores/logical cpus,
6424              * set 24..14, 31..26 bit to configured values
6425              */
6426             if (*eax & 31) {
6427                 int host_vcpus_per_cache = 1 + ((*eax & 0x3FFC000) >> 14);
6428 
6429                 if (cores_per_pkg > 1) {
6430                     *eax &= ~0xFC000000;
6431                     *eax |= max_core_ids_in_package(&topo_info) << 26;
6432                 }
6433                 if (host_vcpus_per_cache > threads_per_pkg) {
6434                     *eax &= ~0x3FFC000;
6435 
6436                     /* Share the cache at package level. */
6437                     *eax |= max_thread_ids_for_cache(&topo_info,
6438                                 CPU_TOPO_LEVEL_PACKAGE) << 14;
6439                 }
6440             }
6441         } else if (cpu->vendor_cpuid_only && IS_AMD_CPU(env)) {
6442             *eax = *ebx = *ecx = *edx = 0;
6443         } else {
6444             *eax = 0;
6445 
6446             switch (count) {
6447             case 0: /* L1 dcache info */
6448                 encode_cache_cpuid4(env->cache_info_cpuid4.l1d_cache,
6449                                     &topo_info,
6450                                     eax, ebx, ecx, edx);
6451                 if (!cpu->l1_cache_per_core) {
6452                     *eax &= ~MAKE_64BIT_MASK(14, 12);
6453                 }
6454                 break;
6455             case 1: /* L1 icache info */
6456                 encode_cache_cpuid4(env->cache_info_cpuid4.l1i_cache,
6457                                     &topo_info,
6458                                     eax, ebx, ecx, edx);
6459                 if (!cpu->l1_cache_per_core) {
6460                     *eax &= ~MAKE_64BIT_MASK(14, 12);
6461                 }
6462                 break;
6463             case 2: /* L2 cache info */
6464                 encode_cache_cpuid4(env->cache_info_cpuid4.l2_cache,
6465                                     &topo_info,
6466                                     eax, ebx, ecx, edx);
6467                 break;
6468             case 3: /* L3 cache info */
6469                 if (cpu->enable_l3_cache) {
6470                     encode_cache_cpuid4(env->cache_info_cpuid4.l3_cache,
6471                                         &topo_info,
6472                                         eax, ebx, ecx, edx);
6473                     break;
6474                 }
6475                 /* fall through */
6476             default: /* end of info */
6477                 *eax = *ebx = *ecx = *edx = 0;
6478                 break;
6479             }
6480         }
6481         break;
6482     case 5:
6483         /* MONITOR/MWAIT Leaf */
6484         *eax = cpu->mwait.eax; /* Smallest monitor-line size in bytes */
6485         *ebx = cpu->mwait.ebx; /* Largest monitor-line size in bytes */
6486         *ecx = cpu->mwait.ecx; /* flags */
6487         *edx = cpu->mwait.edx; /* mwait substates */
6488         break;
6489     case 6:
6490         /* Thermal and Power Leaf */
6491         *eax = env->features[FEAT_6_EAX];
6492         *ebx = 0;
6493         *ecx = 0;
6494         *edx = 0;
6495         break;
6496     case 7:
6497         /* Structured Extended Feature Flags Enumeration Leaf */
6498         if (count == 0) {
6499             uint32_t eax_0_unused, ebx_0, ecx_0, edx_0_unused;
6500 
6501             /* Maximum ECX value for sub-leaves */
6502             *eax = env->cpuid_level_func7;
6503             *ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */
6504             *ecx = env->features[FEAT_7_0_ECX]; /* Feature flags */
6505             if ((*ecx & CPUID_7_0_ECX_PKU) && env->cr[4] & CR4_PKE_MASK) {
6506                 *ecx |= CPUID_7_0_ECX_OSPKE;
6507             }
6508             *edx = env->features[FEAT_7_0_EDX]; /* Feature flags */
6509 
6510             /*
6511              * SGX cannot be emulated in software.  If hardware does not
6512              * support enabling SGX and/or SGX flexible launch control,
6513              * then we need to update the VM's CPUID values accordingly.
6514              */
6515             x86_cpu_get_supported_cpuid(0x7, 0,
6516                                         &eax_0_unused, &ebx_0,
6517                                         &ecx_0, &edx_0_unused);
6518             if ((*ebx & CPUID_7_0_EBX_SGX) && !(ebx_0 & CPUID_7_0_EBX_SGX)) {
6519                 *ebx &= ~CPUID_7_0_EBX_SGX;
6520             }
6521 
6522             if ((*ecx & CPUID_7_0_ECX_SGX_LC)
6523                     && (!(*ebx & CPUID_7_0_EBX_SGX) || !(ecx_0 & CPUID_7_0_ECX_SGX_LC))) {
6524                 *ecx &= ~CPUID_7_0_ECX_SGX_LC;
6525             }
6526         } else if (count == 1) {
6527             *eax = env->features[FEAT_7_1_EAX];
6528             *edx = env->features[FEAT_7_1_EDX];
6529             *ebx = 0;
6530             *ecx = 0;
6531         } else if (count == 2) {
6532             *edx = env->features[FEAT_7_2_EDX];
6533             *eax = 0;
6534             *ebx = 0;
6535             *ecx = 0;
6536         } else {
6537             *eax = 0;
6538             *ebx = 0;
6539             *ecx = 0;
6540             *edx = 0;
6541         }
6542         break;
6543     case 9:
6544         /* Direct Cache Access Information Leaf */
6545         *eax = 0; /* Bits 0-31 in DCA_CAP MSR */
6546         *ebx = 0;
6547         *ecx = 0;
6548         *edx = 0;
6549         break;
6550     case 0xA:
6551         /* Architectural Performance Monitoring Leaf */
6552         if (cpu->enable_pmu) {
6553             x86_cpu_get_supported_cpuid(0xA, count, eax, ebx, ecx, edx);
6554         } else {
6555             *eax = 0;
6556             *ebx = 0;
6557             *ecx = 0;
6558             *edx = 0;
6559         }
6560         break;
6561     case 0xB:
6562         /* Extended Topology Enumeration Leaf */
6563         if (!cpu->enable_cpuid_0xb) {
6564                 *eax = *ebx = *ecx = *edx = 0;
6565                 break;
6566         }
6567 
6568         *ecx = count & 0xff;
6569         *edx = cpu->apic_id;
6570 
6571         switch (count) {
6572         case 0:
6573             *eax = apicid_core_offset(&topo_info);
6574             *ebx = topo_info.threads_per_core;
6575             *ecx |= CPUID_B_ECX_TOPO_LEVEL_SMT << 8;
6576             break;
6577         case 1:
6578             *eax = apicid_pkg_offset(&topo_info);
6579             *ebx = threads_per_pkg;
6580             *ecx |= CPUID_B_ECX_TOPO_LEVEL_CORE << 8;
6581             break;
6582         default:
6583             *eax = 0;
6584             *ebx = 0;
6585             *ecx |= CPUID_B_ECX_TOPO_LEVEL_INVALID << 8;
6586         }
6587 
6588         assert(!(*eax & ~0x1f));
6589         *ebx &= 0xffff; /* The count doesn't need to be reliable. */
6590         break;
6591     case 0x1C:
6592         if (cpu->enable_pmu && (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR)) {
6593             x86_cpu_get_supported_cpuid(0x1C, 0, eax, ebx, ecx, edx);
6594             *edx = 0;
6595         }
6596         break;
6597     case 0x1F:
6598         /* V2 Extended Topology Enumeration Leaf */
6599         if (!x86_has_extended_topo(env->avail_cpu_topo)) {
6600             *eax = *ebx = *ecx = *edx = 0;
6601             break;
6602         }
6603 
6604         encode_topo_cpuid1f(env, count, &topo_info, eax, ebx, ecx, edx);
6605         break;
6606     case 0xD: {
6607         /* Processor Extended State */
6608         *eax = 0;
6609         *ebx = 0;
6610         *ecx = 0;
6611         *edx = 0;
6612         if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
6613             break;
6614         }
6615 
6616         if (count == 0) {
6617             *ecx = xsave_area_size(x86_cpu_xsave_xcr0_components(cpu), false);
6618             *eax = env->features[FEAT_XSAVE_XCR0_LO];
6619             *edx = env->features[FEAT_XSAVE_XCR0_HI];
6620             /*
6621              * The initial value of xcr0 and ebx == 0, On host without kvm
6622              * commit 412a3c41(e.g., CentOS 6), the ebx's value always == 0
6623              * even through guest update xcr0, this will crash some legacy guest
6624              * (e.g., CentOS 6), So set ebx == ecx to workaround it.
6625              */
6626             *ebx = kvm_enabled() ? *ecx : xsave_area_size(env->xcr0, false);
6627         } else if (count == 1) {
6628             uint64_t xstate = x86_cpu_xsave_xcr0_components(cpu) |
6629                               x86_cpu_xsave_xss_components(cpu);
6630 
6631             *eax = env->features[FEAT_XSAVE];
6632             *ebx = xsave_area_size(xstate, true);
6633             *ecx = env->features[FEAT_XSAVE_XSS_LO];
6634             *edx = env->features[FEAT_XSAVE_XSS_HI];
6635             if (kvm_enabled() && cpu->enable_pmu &&
6636                 (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR) &&
6637                 (*eax & CPUID_XSAVE_XSAVES)) {
6638                 *ecx |= XSTATE_ARCH_LBR_MASK;
6639             } else {
6640                 *ecx &= ~XSTATE_ARCH_LBR_MASK;
6641             }
6642         } else if (count == 0xf && cpu->enable_pmu
6643                    && (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR)) {
6644             x86_cpu_get_supported_cpuid(0xD, count, eax, ebx, ecx, edx);
6645         } else if (count < ARRAY_SIZE(x86_ext_save_areas)) {
6646             const ExtSaveArea *esa = &x86_ext_save_areas[count];
6647 
6648             if (x86_cpu_xsave_xcr0_components(cpu) & (1ULL << count)) {
6649                 *eax = esa->size;
6650                 *ebx = esa->offset;
6651                 *ecx = esa->ecx &
6652                        (ESA_FEATURE_ALIGN64_MASK | ESA_FEATURE_XFD_MASK);
6653             } else if (x86_cpu_xsave_xss_components(cpu) & (1ULL << count)) {
6654                 *eax = esa->size;
6655                 *ebx = 0;
6656                 *ecx = 1;
6657             }
6658         }
6659         break;
6660     }
6661     case 0x12:
6662 #ifndef CONFIG_USER_ONLY
6663         if (!kvm_enabled() ||
6664             !(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_SGX)) {
6665             *eax = *ebx = *ecx = *edx = 0;
6666             break;
6667         }
6668 
6669         /*
6670          * SGX sub-leafs CPUID.0x12.{0x2..N} enumerate EPC sections.  Retrieve
6671          * the EPC properties, e.g. confidentiality and integrity, from the
6672          * host's first EPC section, i.e. assume there is one EPC section or
6673          * that all EPC sections have the same security properties.
6674          */
6675         if (count > 1) {
6676             uint64_t epc_addr, epc_size;
6677 
6678             if (sgx_epc_get_section(count - 2, &epc_addr, &epc_size)) {
6679                 *eax = *ebx = *ecx = *edx = 0;
6680                 break;
6681             }
6682             host_cpuid(index, 2, eax, ebx, ecx, edx);
6683             *eax = (uint32_t)(epc_addr & 0xfffff000) | 0x1;
6684             *ebx = (uint32_t)(epc_addr >> 32);
6685             *ecx = (uint32_t)(epc_size & 0xfffff000) | (*ecx & 0xf);
6686             *edx = (uint32_t)(epc_size >> 32);
6687             break;
6688         }
6689 
6690         /*
6691          * SGX sub-leafs CPUID.0x12.{0x0,0x1} are heavily dependent on hardware
6692          * and KVM, i.e. QEMU cannot emulate features to override what KVM
6693          * supports.  Features can be further restricted by userspace, but not
6694          * made more permissive.
6695          */
6696         x86_cpu_get_supported_cpuid(0x12, count, eax, ebx, ecx, edx);
6697 
6698         if (count == 0) {
6699             *eax &= env->features[FEAT_SGX_12_0_EAX];
6700             *ebx &= env->features[FEAT_SGX_12_0_EBX];
6701         } else {
6702             *eax &= env->features[FEAT_SGX_12_1_EAX];
6703             *ebx &= 0; /* ebx reserve */
6704             *ecx &= env->features[FEAT_XSAVE_XCR0_LO];
6705             *edx &= env->features[FEAT_XSAVE_XCR0_HI];
6706 
6707             /* FP and SSE are always allowed regardless of XSAVE/XCR0. */
6708             *ecx |= XSTATE_FP_MASK | XSTATE_SSE_MASK;
6709 
6710             /* Access to PROVISIONKEY requires additional credentials. */
6711             if ((*eax & (1U << 4)) &&
6712                 !kvm_enable_sgx_provisioning(cs->kvm_state)) {
6713                 *eax &= ~(1U << 4);
6714             }
6715         }
6716 #endif
6717         break;
6718     case 0x14: {
6719         /* Intel Processor Trace Enumeration */
6720         *eax = 0;
6721         *ebx = 0;
6722         *ecx = 0;
6723         *edx = 0;
6724         if (!(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) ||
6725             !kvm_enabled()) {
6726             break;
6727         }
6728 
6729         /*
6730          * If these are changed, they should stay in sync with
6731          * x86_cpu_filter_features().
6732          */
6733         if (count == 0) {
6734             *eax = INTEL_PT_MAX_SUBLEAF;
6735             *ebx = INTEL_PT_MINIMAL_EBX;
6736             *ecx = INTEL_PT_MINIMAL_ECX;
6737             if (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP) {
6738                 *ecx |= CPUID_14_0_ECX_LIP;
6739             }
6740         } else if (count == 1) {
6741             *eax = INTEL_PT_MTC_BITMAP | INTEL_PT_ADDR_RANGES_NUM;
6742             *ebx = INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP;
6743         }
6744         break;
6745     }
6746     case 0x1D: {
6747         /* AMX TILE, for now hardcoded for Sapphire Rapids*/
6748         *eax = 0;
6749         *ebx = 0;
6750         *ecx = 0;
6751         *edx = 0;
6752         if (!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE)) {
6753             break;
6754         }
6755 
6756         if (count == 0) {
6757             /* Highest numbered palette subleaf */
6758             *eax = INTEL_AMX_TILE_MAX_SUBLEAF;
6759         } else if (count == 1) {
6760             *eax = INTEL_AMX_TOTAL_TILE_BYTES |
6761                    (INTEL_AMX_BYTES_PER_TILE << 16);
6762             *ebx = INTEL_AMX_BYTES_PER_ROW | (INTEL_AMX_TILE_MAX_NAMES << 16);
6763             *ecx = INTEL_AMX_TILE_MAX_ROWS;
6764         }
6765         break;
6766     }
6767     case 0x1E: {
6768         /* AMX TMUL, for now hardcoded for Sapphire Rapids */
6769         *eax = 0;
6770         *ebx = 0;
6771         *ecx = 0;
6772         *edx = 0;
6773         if (!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE)) {
6774             break;
6775         }
6776 
6777         if (count == 0) {
6778             /* Highest numbered palette subleaf */
6779             *ebx = INTEL_AMX_TMUL_MAX_K | (INTEL_AMX_TMUL_MAX_N << 8);
6780         }
6781         break;
6782     }
6783     case 0x40000000:
6784         /*
6785          * CPUID code in kvm_arch_init_vcpu() ignores stuff
6786          * set here, but we restrict to TCG none the less.
6787          */
6788         if (tcg_enabled() && cpu->expose_tcg) {
6789             memcpy(signature, "TCGTCGTCGTCG", 12);
6790             *eax = 0x40000001;
6791             *ebx = signature[0];
6792             *ecx = signature[1];
6793             *edx = signature[2];
6794         } else {
6795             *eax = 0;
6796             *ebx = 0;
6797             *ecx = 0;
6798             *edx = 0;
6799         }
6800         break;
6801     case 0x40000001:
6802         *eax = 0;
6803         *ebx = 0;
6804         *ecx = 0;
6805         *edx = 0;
6806         break;
6807     case 0x80000000:
6808         *eax = env->cpuid_xlevel;
6809         *ebx = env->cpuid_vendor1;
6810         *edx = env->cpuid_vendor2;
6811         *ecx = env->cpuid_vendor3;
6812         break;
6813     case 0x80000001:
6814         *eax = env->cpuid_version;
6815         *ebx = 0;
6816         *ecx = env->features[FEAT_8000_0001_ECX];
6817         *edx = env->features[FEAT_8000_0001_EDX];
6818 
6819         /* The Linux kernel checks for the CMPLegacy bit and
6820          * discards multiple thread information if it is set.
6821          * So don't set it here for Intel to make Linux guests happy.
6822          */
6823         if (threads_per_pkg > 1) {
6824             if (env->cpuid_vendor1 != CPUID_VENDOR_INTEL_1 ||
6825                 env->cpuid_vendor2 != CPUID_VENDOR_INTEL_2 ||
6826                 env->cpuid_vendor3 != CPUID_VENDOR_INTEL_3) {
6827                 *ecx |= 1 << 1;    /* CmpLegacy bit */
6828             }
6829         }
6830         if (tcg_enabled() && env->cpuid_vendor1 == CPUID_VENDOR_INTEL_1 &&
6831             !(env->hflags & HF_LMA_MASK)) {
6832             *edx &= ~CPUID_EXT2_SYSCALL;
6833         }
6834         break;
6835     case 0x80000002:
6836     case 0x80000003:
6837     case 0x80000004:
6838         *eax = env->cpuid_model[(index - 0x80000002) * 4 + 0];
6839         *ebx = env->cpuid_model[(index - 0x80000002) * 4 + 1];
6840         *ecx = env->cpuid_model[(index - 0x80000002) * 4 + 2];
6841         *edx = env->cpuid_model[(index - 0x80000002) * 4 + 3];
6842         break;
6843     case 0x80000005:
6844         /* cache info (L1 cache) */
6845         if (cpu->cache_info_passthrough) {
6846             x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
6847             break;
6848         }
6849         *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) |
6850                (L1_ITLB_2M_ASSOC <<  8) | (L1_ITLB_2M_ENTRIES);
6851         *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) |
6852                (L1_ITLB_4K_ASSOC <<  8) | (L1_ITLB_4K_ENTRIES);
6853         *ecx = encode_cache_cpuid80000005(env->cache_info_amd.l1d_cache);
6854         *edx = encode_cache_cpuid80000005(env->cache_info_amd.l1i_cache);
6855         break;
6856     case 0x80000006:
6857         /* cache info (L2 cache) */
6858         if (cpu->cache_info_passthrough) {
6859             x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
6860             break;
6861         }
6862         *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) |
6863                (L2_DTLB_2M_ENTRIES << 16) |
6864                (AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) |
6865                (L2_ITLB_2M_ENTRIES);
6866         *ebx = (AMD_ENC_ASSOC(L2_DTLB_4K_ASSOC) << 28) |
6867                (L2_DTLB_4K_ENTRIES << 16) |
6868                (AMD_ENC_ASSOC(L2_ITLB_4K_ASSOC) << 12) |
6869                (L2_ITLB_4K_ENTRIES);
6870         encode_cache_cpuid80000006(env->cache_info_amd.l2_cache,
6871                                    cpu->enable_l3_cache ?
6872                                    env->cache_info_amd.l3_cache : NULL,
6873                                    ecx, edx);
6874         break;
6875     case 0x80000007:
6876         *eax = 0;
6877         *ebx = 0;
6878         *ecx = 0;
6879         *edx = env->features[FEAT_8000_0007_EDX];
6880         break;
6881     case 0x80000008:
6882         /* virtual & phys address size in low 2 bytes. */
6883         *eax = cpu->phys_bits;
6884         if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
6885             /* 64 bit processor */
6886              *eax |= (cpu_x86_virtual_addr_width(env) << 8);
6887              *eax |= (cpu->guest_phys_bits << 16);
6888         }
6889         *ebx = env->features[FEAT_8000_0008_EBX];
6890         if (threads_per_pkg > 1) {
6891             /*
6892              * Bits 15:12 is "The number of bits in the initial
6893              * Core::X86::Apic::ApicId[ApicId] value that indicate
6894              * thread ID within a package".
6895              * Bits 7:0 is "The number of threads in the package is NC+1"
6896              */
6897             *ecx = (apicid_pkg_offset(&topo_info) << 12) |
6898                    (threads_per_pkg - 1);
6899         } else {
6900             *ecx = 0;
6901         }
6902         *edx = 0;
6903         break;
6904     case 0x8000000A:
6905         if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
6906             *eax = 0x00000001; /* SVM Revision */
6907             *ebx = 0x00000010; /* nr of ASIDs */
6908             *ecx = 0;
6909             *edx = env->features[FEAT_SVM]; /* optional features */
6910         } else {
6911             *eax = 0;
6912             *ebx = 0;
6913             *ecx = 0;
6914             *edx = 0;
6915         }
6916         break;
6917     case 0x8000001D:
6918         *eax = 0;
6919         if (cpu->cache_info_passthrough) {
6920             x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx);
6921             break;
6922         }
6923         switch (count) {
6924         case 0: /* L1 dcache info */
6925             encode_cache_cpuid8000001d(env->cache_info_amd.l1d_cache,
6926                                        &topo_info, eax, ebx, ecx, edx);
6927             break;
6928         case 1: /* L1 icache info */
6929             encode_cache_cpuid8000001d(env->cache_info_amd.l1i_cache,
6930                                        &topo_info, eax, ebx, ecx, edx);
6931             break;
6932         case 2: /* L2 cache info */
6933             encode_cache_cpuid8000001d(env->cache_info_amd.l2_cache,
6934                                        &topo_info, eax, ebx, ecx, edx);
6935             break;
6936         case 3: /* L3 cache info */
6937             encode_cache_cpuid8000001d(env->cache_info_amd.l3_cache,
6938                                        &topo_info, eax, ebx, ecx, edx);
6939             break;
6940         default: /* end of info */
6941             *eax = *ebx = *ecx = *edx = 0;
6942             break;
6943         }
6944         break;
6945     case 0x8000001E:
6946         if (cpu->core_id <= 255) {
6947             encode_topo_cpuid8000001e(cpu, &topo_info, eax, ebx, ecx, edx);
6948         } else {
6949             *eax = 0;
6950             *ebx = 0;
6951             *ecx = 0;
6952             *edx = 0;
6953         }
6954         break;
6955     case 0xC0000000:
6956         *eax = env->cpuid_xlevel2;
6957         *ebx = 0;
6958         *ecx = 0;
6959         *edx = 0;
6960         break;
6961     case 0xC0000001:
6962         /* Support for VIA CPU's CPUID instruction */
6963         *eax = env->cpuid_version;
6964         *ebx = 0;
6965         *ecx = 0;
6966         *edx = env->features[FEAT_C000_0001_EDX];
6967         break;
6968     case 0xC0000002:
6969     case 0xC0000003:
6970     case 0xC0000004:
6971         /* Reserved for the future, and now filled with zero */
6972         *eax = 0;
6973         *ebx = 0;
6974         *ecx = 0;
6975         *edx = 0;
6976         break;
6977     case 0x8000001F:
6978         *eax = *ebx = *ecx = *edx = 0;
6979         if (sev_enabled()) {
6980             *eax = 0x2;
6981             *eax |= sev_es_enabled() ? 0x8 : 0;
6982             *ebx = sev_get_cbit_position() & 0x3f; /* EBX[5:0] */
6983             *ebx |= (sev_get_reduced_phys_bits() & 0x3f) << 6; /* EBX[11:6] */
6984         }
6985         break;
6986     case 0x80000021:
6987         *eax = env->features[FEAT_8000_0021_EAX];
6988         *ebx = *ecx = *edx = 0;
6989         break;
6990     default:
6991         /* reserved values: zero */
6992         *eax = 0;
6993         *ebx = 0;
6994         *ecx = 0;
6995         *edx = 0;
6996         break;
6997     }
6998 }
6999 
7000 static void x86_cpu_set_sgxlepubkeyhash(CPUX86State *env)
7001 {
7002 #ifndef CONFIG_USER_ONLY
7003     /* Those default values are defined in Skylake HW */
7004     env->msr_ia32_sgxlepubkeyhash[0] = 0xa6053e051270b7acULL;
7005     env->msr_ia32_sgxlepubkeyhash[1] = 0x6cfbe8ba8b3b413dULL;
7006     env->msr_ia32_sgxlepubkeyhash[2] = 0xc4916d99f2b3735dULL;
7007     env->msr_ia32_sgxlepubkeyhash[3] = 0xd4f8c05909f9bb3bULL;
7008 #endif
7009 }
7010 
7011 static void x86_cpu_reset_hold(Object *obj, ResetType type)
7012 {
7013     CPUState *cs = CPU(obj);
7014     X86CPU *cpu = X86_CPU(cs);
7015     X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
7016     CPUX86State *env = &cpu->env;
7017     target_ulong cr4;
7018     uint64_t xcr0;
7019     int i;
7020 
7021     if (xcc->parent_phases.hold) {
7022         xcc->parent_phases.hold(obj, type);
7023     }
7024 
7025     memset(env, 0, offsetof(CPUX86State, end_reset_fields));
7026 
7027     env->old_exception = -1;
7028 
7029     /* init to reset state */
7030     env->int_ctl = 0;
7031     env->hflags2 |= HF2_GIF_MASK;
7032     env->hflags2 |= HF2_VGIF_MASK;
7033     env->hflags &= ~HF_GUEST_MASK;
7034 
7035     cpu_x86_update_cr0(env, 0x60000010);
7036     env->a20_mask = ~0x0;
7037     env->smbase = 0x30000;
7038     env->msr_smi_count = 0;
7039 
7040     env->idt.limit = 0xffff;
7041     env->gdt.limit = 0xffff;
7042     env->ldt.limit = 0xffff;
7043     env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT);
7044     env->tr.limit = 0xffff;
7045     env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT);
7046 
7047     cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff,
7048                            DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK |
7049                            DESC_R_MASK | DESC_A_MASK);
7050     cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff,
7051                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
7052                            DESC_A_MASK);
7053     cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff,
7054                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
7055                            DESC_A_MASK);
7056     cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff,
7057                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
7058                            DESC_A_MASK);
7059     cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff,
7060                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
7061                            DESC_A_MASK);
7062     cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff,
7063                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
7064                            DESC_A_MASK);
7065 
7066     env->eip = 0xfff0;
7067     env->regs[R_EDX] = env->cpuid_version;
7068 
7069     env->eflags = 0x2;
7070 
7071     /* FPU init */
7072     for (i = 0; i < 8; i++) {
7073         env->fptags[i] = 1;
7074     }
7075     cpu_set_fpuc(env, 0x37f);
7076 
7077     env->mxcsr = 0x1f80;
7078     /* All units are in INIT state.  */
7079     env->xstate_bv = 0;
7080 
7081     env->pat = 0x0007040600070406ULL;
7082 
7083     if (kvm_enabled()) {
7084         /*
7085          * KVM handles TSC = 0 specially and thinks we are hot-plugging
7086          * a new CPU, use 1 instead to force a reset.
7087          */
7088         if (env->tsc != 0) {
7089             env->tsc = 1;
7090         }
7091     } else {
7092         env->tsc = 0;
7093     }
7094 
7095     env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT;
7096     if (env->features[FEAT_1_ECX] & CPUID_EXT_MONITOR) {
7097         env->msr_ia32_misc_enable |= MSR_IA32_MISC_ENABLE_MWAIT;
7098     }
7099 
7100     memset(env->dr, 0, sizeof(env->dr));
7101     env->dr[6] = DR6_FIXED_1;
7102     env->dr[7] = DR7_FIXED_1;
7103     cpu_breakpoint_remove_all(cs, BP_CPU);
7104     cpu_watchpoint_remove_all(cs, BP_CPU);
7105 
7106     cr4 = 0;
7107     xcr0 = XSTATE_FP_MASK;
7108 
7109 #ifdef CONFIG_USER_ONLY
7110     /* Enable all the features for user-mode.  */
7111     if (env->features[FEAT_1_EDX] & CPUID_SSE) {
7112         xcr0 |= XSTATE_SSE_MASK;
7113     }
7114     for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
7115         const ExtSaveArea *esa = &x86_ext_save_areas[i];
7116         if (!((1 << i) & CPUID_XSTATE_XCR0_MASK)) {
7117             continue;
7118         }
7119         if (env->features[esa->feature] & esa->bits) {
7120             xcr0 |= 1ull << i;
7121         }
7122     }
7123 
7124     if (env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE) {
7125         cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK;
7126     }
7127     if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_FSGSBASE) {
7128         cr4 |= CR4_FSGSBASE_MASK;
7129     }
7130 #endif
7131 
7132     env->xcr0 = xcr0;
7133     cpu_x86_update_cr4(env, cr4);
7134 
7135     /*
7136      * SDM 11.11.5 requires:
7137      *  - IA32_MTRR_DEF_TYPE MSR.E = 0
7138      *  - IA32_MTRR_PHYSMASKn.V = 0
7139      * All other bits are undefined.  For simplification, zero it all.
7140      */
7141     env->mtrr_deftype = 0;
7142     memset(env->mtrr_var, 0, sizeof(env->mtrr_var));
7143     memset(env->mtrr_fixed, 0, sizeof(env->mtrr_fixed));
7144 
7145     env->interrupt_injected = -1;
7146     env->exception_nr = -1;
7147     env->exception_pending = 0;
7148     env->exception_injected = 0;
7149     env->exception_has_payload = false;
7150     env->exception_payload = 0;
7151     env->nmi_injected = false;
7152     env->triple_fault_pending = false;
7153 #if !defined(CONFIG_USER_ONLY)
7154     /* We hard-wire the BSP to the first CPU. */
7155     apic_designate_bsp(cpu->apic_state, cs->cpu_index == 0);
7156 
7157     cs->halted = !cpu_is_bsp(cpu);
7158 
7159     if (kvm_enabled()) {
7160         kvm_arch_reset_vcpu(cpu);
7161     }
7162 
7163     x86_cpu_set_sgxlepubkeyhash(env);
7164 
7165     env->amd_tsc_scale_msr =  MSR_AMD64_TSC_RATIO_DEFAULT;
7166 
7167 #endif
7168 }
7169 
7170 void x86_cpu_after_reset(X86CPU *cpu)
7171 {
7172 #ifndef CONFIG_USER_ONLY
7173     if (kvm_enabled()) {
7174         kvm_arch_after_reset_vcpu(cpu);
7175     }
7176 
7177     if (cpu->apic_state) {
7178         device_cold_reset(cpu->apic_state);
7179     }
7180 #endif
7181 }
7182 
7183 static void mce_init(X86CPU *cpu)
7184 {
7185     CPUX86State *cenv = &cpu->env;
7186     unsigned int bank;
7187 
7188     if (((cenv->cpuid_version >> 8) & 0xf) >= 6
7189         && (cenv->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) ==
7190             (CPUID_MCE | CPUID_MCA)) {
7191         cenv->mcg_cap = MCE_CAP_DEF | MCE_BANKS_DEF |
7192                         (cpu->enable_lmce ? MCG_LMCE_P : 0);
7193         cenv->mcg_ctl = ~(uint64_t)0;
7194         for (bank = 0; bank < MCE_BANKS_DEF; bank++) {
7195             cenv->mce_banks[bank * 4] = ~(uint64_t)0;
7196         }
7197     }
7198 }
7199 
7200 static void x86_cpu_adjust_level(X86CPU *cpu, uint32_t *min, uint32_t value)
7201 {
7202     if (*min < value) {
7203         *min = value;
7204     }
7205 }
7206 
7207 /* Increase cpuid_min_{level,xlevel,xlevel2} automatically, if appropriate */
7208 static void x86_cpu_adjust_feat_level(X86CPU *cpu, FeatureWord w)
7209 {
7210     CPUX86State *env = &cpu->env;
7211     FeatureWordInfo *fi = &feature_word_info[w];
7212     uint32_t eax = fi->cpuid.eax;
7213     uint32_t region = eax & 0xF0000000;
7214 
7215     assert(feature_word_info[w].type == CPUID_FEATURE_WORD);
7216     if (!env->features[w]) {
7217         return;
7218     }
7219 
7220     switch (region) {
7221     case 0x00000000:
7222         x86_cpu_adjust_level(cpu, &env->cpuid_min_level, eax);
7223     break;
7224     case 0x80000000:
7225         x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, eax);
7226     break;
7227     case 0xC0000000:
7228         x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel2, eax);
7229     break;
7230     }
7231 
7232     if (eax == 7) {
7233         x86_cpu_adjust_level(cpu, &env->cpuid_min_level_func7,
7234                              fi->cpuid.ecx);
7235     }
7236 }
7237 
7238 /* Calculate XSAVE components based on the configured CPU feature flags */
7239 static void x86_cpu_enable_xsave_components(X86CPU *cpu)
7240 {
7241     CPUX86State *env = &cpu->env;
7242     int i;
7243     uint64_t mask;
7244     static bool request_perm;
7245 
7246     if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
7247         env->features[FEAT_XSAVE_XCR0_LO] = 0;
7248         env->features[FEAT_XSAVE_XCR0_HI] = 0;
7249         env->features[FEAT_XSAVE_XSS_LO] = 0;
7250         env->features[FEAT_XSAVE_XSS_HI] = 0;
7251         return;
7252     }
7253 
7254     mask = 0;
7255     for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
7256         const ExtSaveArea *esa = &x86_ext_save_areas[i];
7257         if (env->features[esa->feature] & esa->bits) {
7258             mask |= (1ULL << i);
7259         }
7260     }
7261 
7262     /* Only request permission for first vcpu */
7263     if (kvm_enabled() && !request_perm) {
7264         kvm_request_xsave_components(cpu, mask);
7265         request_perm = true;
7266     }
7267 
7268     env->features[FEAT_XSAVE_XCR0_LO] = mask & CPUID_XSTATE_XCR0_MASK;
7269     env->features[FEAT_XSAVE_XCR0_HI] = (mask & CPUID_XSTATE_XCR0_MASK) >> 32;
7270     env->features[FEAT_XSAVE_XSS_LO] = mask & CPUID_XSTATE_XSS_MASK;
7271     env->features[FEAT_XSAVE_XSS_HI] = (mask & CPUID_XSTATE_XSS_MASK) >> 32;
7272 }
7273 
7274 /***** Steps involved on loading and filtering CPUID data
7275  *
7276  * When initializing and realizing a CPU object, the steps
7277  * involved in setting up CPUID data are:
7278  *
7279  * 1) Loading CPU model definition (X86CPUDefinition). This is
7280  *    implemented by x86_cpu_load_model() and should be completely
7281  *    transparent, as it is done automatically by instance_init.
7282  *    No code should need to look at X86CPUDefinition structs
7283  *    outside instance_init.
7284  *
7285  * 2) CPU expansion. This is done by realize before CPUID
7286  *    filtering, and will make sure host/accelerator data is
7287  *    loaded for CPU models that depend on host capabilities
7288  *    (e.g. "host"). Done by x86_cpu_expand_features().
7289  *
7290  * 3) CPUID filtering. This initializes extra data related to
7291  *    CPUID, and checks if the host supports all capabilities
7292  *    required by the CPU. Runnability of a CPU model is
7293  *    determined at this step. Done by x86_cpu_filter_features().
7294  *
7295  * Some operations don't require all steps to be performed.
7296  * More precisely:
7297  *
7298  * - CPU instance creation (instance_init) will run only CPU
7299  *   model loading. CPU expansion can't run at instance_init-time
7300  *   because host/accelerator data may be not available yet.
7301  * - CPU realization will perform both CPU model expansion and CPUID
7302  *   filtering, and return an error in case one of them fails.
7303  * - query-cpu-definitions needs to run all 3 steps. It needs
7304  *   to run CPUID filtering, as the 'unavailable-features'
7305  *   field is set based on the filtering results.
7306  * - The query-cpu-model-expansion QMP command only needs to run
7307  *   CPU model loading and CPU expansion. It should not filter
7308  *   any CPUID data based on host capabilities.
7309  */
7310 
7311 /* Expand CPU configuration data, based on configured features
7312  * and host/accelerator capabilities when appropriate.
7313  */
7314 void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
7315 {
7316     CPUX86State *env = &cpu->env;
7317     FeatureWord w;
7318     int i;
7319     GList *l;
7320 
7321     for (l = plus_features; l; l = l->next) {
7322         const char *prop = l->data;
7323         if (!object_property_set_bool(OBJECT(cpu), prop, true, errp)) {
7324             return;
7325         }
7326     }
7327 
7328     for (l = minus_features; l; l = l->next) {
7329         const char *prop = l->data;
7330         if (!object_property_set_bool(OBJECT(cpu), prop, false, errp)) {
7331             return;
7332         }
7333     }
7334 
7335     /*TODO: Now cpu->max_features doesn't overwrite features
7336      * set using QOM properties, and we can convert
7337      * plus_features & minus_features to global properties
7338      * inside x86_cpu_parse_featurestr() too.
7339      */
7340     if (cpu->max_features) {
7341         for (w = 0; w < FEATURE_WORDS; w++) {
7342             /* Override only features that weren't set explicitly
7343              * by the user.
7344              */
7345             env->features[w] |=
7346                 x86_cpu_get_supported_feature_word(w, cpu->migratable) &
7347                 ~env->user_features[w] &
7348                 ~feature_word_info[w].no_autoenable_flags;
7349         }
7350     }
7351 
7352     for (i = 0; i < ARRAY_SIZE(feature_dependencies); i++) {
7353         FeatureDep *d = &feature_dependencies[i];
7354         if (!(env->features[d->from.index] & d->from.mask)) {
7355             uint64_t unavailable_features = env->features[d->to.index] & d->to.mask;
7356 
7357             /* Not an error unless the dependent feature was added explicitly.  */
7358             mark_unavailable_features(cpu, d->to.index,
7359                                       unavailable_features & env->user_features[d->to.index],
7360                                       "This feature depends on other features that were not requested");
7361 
7362             env->features[d->to.index] &= ~unavailable_features;
7363         }
7364     }
7365 
7366     if (!kvm_enabled() || !cpu->expose_kvm) {
7367         env->features[FEAT_KVM] = 0;
7368     }
7369 
7370     x86_cpu_enable_xsave_components(cpu);
7371 
7372     /* CPUID[EAX=7,ECX=0].EBX always increased level automatically: */
7373     x86_cpu_adjust_feat_level(cpu, FEAT_7_0_EBX);
7374     if (cpu->full_cpuid_auto_level) {
7375         x86_cpu_adjust_feat_level(cpu, FEAT_1_EDX);
7376         x86_cpu_adjust_feat_level(cpu, FEAT_1_ECX);
7377         x86_cpu_adjust_feat_level(cpu, FEAT_6_EAX);
7378         x86_cpu_adjust_feat_level(cpu, FEAT_7_0_ECX);
7379         x86_cpu_adjust_feat_level(cpu, FEAT_7_1_EAX);
7380         x86_cpu_adjust_feat_level(cpu, FEAT_7_1_EDX);
7381         x86_cpu_adjust_feat_level(cpu, FEAT_7_2_EDX);
7382         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_EDX);
7383         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_ECX);
7384         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0007_EDX);
7385         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0008_EBX);
7386         x86_cpu_adjust_feat_level(cpu, FEAT_C000_0001_EDX);
7387         x86_cpu_adjust_feat_level(cpu, FEAT_SVM);
7388         x86_cpu_adjust_feat_level(cpu, FEAT_XSAVE);
7389 
7390         /* Intel Processor Trace requires CPUID[0x14] */
7391         if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT)) {
7392             if (cpu->intel_pt_auto_level) {
7393                 x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14);
7394             } else if (cpu->env.cpuid_min_level < 0x14) {
7395                 mark_unavailable_features(cpu, FEAT_7_0_EBX,
7396                     CPUID_7_0_EBX_INTEL_PT,
7397                     "Intel PT need CPUID leaf 0x14, please set by \"-cpu ...,intel-pt=on,min-level=0x14\"");
7398             }
7399         }
7400 
7401         /*
7402          * Intel CPU topology with multi-dies support requires CPUID[0x1F].
7403          * For AMD Rome/Milan, cpuid level is 0x10, and guest OS should detect
7404          * extended toplogy by leaf 0xB. Only adjust it for Intel CPU, unless
7405          * cpu->vendor_cpuid_only has been unset for compatibility with older
7406          * machine types.
7407          */
7408         if (x86_has_extended_topo(env->avail_cpu_topo) &&
7409             (IS_INTEL_CPU(env) || !cpu->vendor_cpuid_only)) {
7410             x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x1F);
7411         }
7412 
7413         /* SVM requires CPUID[0x8000000A] */
7414         if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
7415             x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000000A);
7416         }
7417 
7418         /* SEV requires CPUID[0x8000001F] */
7419         if (sev_enabled()) {
7420             x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000001F);
7421         }
7422 
7423         if (env->features[FEAT_8000_0021_EAX]) {
7424             x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x80000021);
7425         }
7426 
7427         /* SGX requires CPUID[0x12] for EPC enumeration */
7428         if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_SGX) {
7429             x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x12);
7430         }
7431     }
7432 
7433     /* Set cpuid_*level* based on cpuid_min_*level, if not explicitly set */
7434     if (env->cpuid_level_func7 == UINT32_MAX) {
7435         env->cpuid_level_func7 = env->cpuid_min_level_func7;
7436     }
7437     if (env->cpuid_level == UINT32_MAX) {
7438         env->cpuid_level = env->cpuid_min_level;
7439     }
7440     if (env->cpuid_xlevel == UINT32_MAX) {
7441         env->cpuid_xlevel = env->cpuid_min_xlevel;
7442     }
7443     if (env->cpuid_xlevel2 == UINT32_MAX) {
7444         env->cpuid_xlevel2 = env->cpuid_min_xlevel2;
7445     }
7446 
7447     if (kvm_enabled() && !kvm_hyperv_expand_features(cpu, errp)) {
7448         return;
7449     }
7450 }
7451 
7452 /*
7453  * Finishes initialization of CPUID data, filters CPU feature
7454  * words based on host availability of each feature.
7455  *
7456  * Returns: 0 if all flags are supported by the host, non-zero otherwise.
7457  */
7458 static void x86_cpu_filter_features(X86CPU *cpu, bool verbose)
7459 {
7460     CPUX86State *env = &cpu->env;
7461     FeatureWord w;
7462     const char *prefix = NULL;
7463 
7464     if (verbose) {
7465         prefix = accel_uses_host_cpuid()
7466                  ? "host doesn't support requested feature"
7467                  : "TCG doesn't support requested feature";
7468     }
7469 
7470     for (w = 0; w < FEATURE_WORDS; w++) {
7471         uint64_t host_feat =
7472             x86_cpu_get_supported_feature_word(w, false);
7473         uint64_t requested_features = env->features[w];
7474         uint64_t unavailable_features = requested_features & ~host_feat;
7475         mark_unavailable_features(cpu, w, unavailable_features, prefix);
7476     }
7477 
7478     /*
7479      * Check that KVM actually allows the processor tracing features that
7480      * are advertised by cpu_x86_cpuid().  Keep these two in sync.
7481      */
7482     if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) &&
7483         kvm_enabled()) {
7484         uint32_t eax_0, ebx_0, ecx_0, edx_0_unused;
7485         uint32_t eax_1, ebx_1, ecx_1_unused, edx_1_unused;
7486 
7487         x86_cpu_get_supported_cpuid(0x14, 0,
7488                                     &eax_0, &ebx_0, &ecx_0, &edx_0_unused);
7489         x86_cpu_get_supported_cpuid(0x14, 1,
7490                                     &eax_1, &ebx_1, &ecx_1_unused, &edx_1_unused);
7491 
7492         if (!eax_0 ||
7493            ((ebx_0 & INTEL_PT_MINIMAL_EBX) != INTEL_PT_MINIMAL_EBX) ||
7494            ((ecx_0 & INTEL_PT_MINIMAL_ECX) != INTEL_PT_MINIMAL_ECX) ||
7495            ((eax_1 & INTEL_PT_MTC_BITMAP) != INTEL_PT_MTC_BITMAP) ||
7496            ((eax_1 & INTEL_PT_ADDR_RANGES_NUM_MASK) <
7497                                            INTEL_PT_ADDR_RANGES_NUM) ||
7498            ((ebx_1 & (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) !=
7499                 (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) ||
7500            ((ecx_0 & CPUID_14_0_ECX_LIP) !=
7501                 (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP))) {
7502             /*
7503              * Processor Trace capabilities aren't configurable, so if the
7504              * host can't emulate the capabilities we report on
7505              * cpu_x86_cpuid(), intel-pt can't be enabled on the current host.
7506              */
7507             mark_unavailable_features(cpu, FEAT_7_0_EBX, CPUID_7_0_EBX_INTEL_PT, prefix);
7508         }
7509     }
7510 }
7511 
7512 static void x86_cpu_hyperv_realize(X86CPU *cpu)
7513 {
7514     size_t len;
7515 
7516     /* Hyper-V vendor id */
7517     if (!cpu->hyperv_vendor) {
7518         object_property_set_str(OBJECT(cpu), "hv-vendor-id", "Microsoft Hv",
7519                                 &error_abort);
7520     }
7521     len = strlen(cpu->hyperv_vendor);
7522     if (len > 12) {
7523         warn_report("hv-vendor-id truncated to 12 characters");
7524         len = 12;
7525     }
7526     memset(cpu->hyperv_vendor_id, 0, 12);
7527     memcpy(cpu->hyperv_vendor_id, cpu->hyperv_vendor, len);
7528 
7529     /* 'Hv#1' interface identification*/
7530     cpu->hyperv_interface_id[0] = 0x31237648;
7531     cpu->hyperv_interface_id[1] = 0;
7532     cpu->hyperv_interface_id[2] = 0;
7533     cpu->hyperv_interface_id[3] = 0;
7534 
7535     /* Hypervisor implementation limits */
7536     cpu->hyperv_limits[0] = 64;
7537     cpu->hyperv_limits[1] = 0;
7538     cpu->hyperv_limits[2] = 0;
7539 }
7540 
7541 static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
7542 {
7543     CPUState *cs = CPU(dev);
7544     X86CPU *cpu = X86_CPU(dev);
7545     X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
7546     CPUX86State *env = &cpu->env;
7547     Error *local_err = NULL;
7548     unsigned requested_lbr_fmt;
7549 
7550 #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
7551     /* Use pc-relative instructions in system-mode */
7552     tcg_cflags_set(cs, CF_PCREL);
7553 #endif
7554 
7555     if (cpu->apic_id == UNASSIGNED_APIC_ID) {
7556         error_setg(errp, "apic-id property was not initialized properly");
7557         return;
7558     }
7559 
7560     /*
7561      * Process Hyper-V enlightenments.
7562      * Note: this currently has to happen before the expansion of CPU features.
7563      */
7564     x86_cpu_hyperv_realize(cpu);
7565 
7566     x86_cpu_expand_features(cpu, &local_err);
7567     if (local_err) {
7568         goto out;
7569     }
7570 
7571     /*
7572      * Override env->features[FEAT_PERF_CAPABILITIES].LBR_FMT
7573      * with user-provided setting.
7574      */
7575     if (cpu->lbr_fmt != ~PERF_CAP_LBR_FMT) {
7576         if ((cpu->lbr_fmt & PERF_CAP_LBR_FMT) != cpu->lbr_fmt) {
7577             error_setg(errp, "invalid lbr-fmt");
7578             return;
7579         }
7580         env->features[FEAT_PERF_CAPABILITIES] &= ~PERF_CAP_LBR_FMT;
7581         env->features[FEAT_PERF_CAPABILITIES] |= cpu->lbr_fmt;
7582     }
7583 
7584     /*
7585      * vPMU LBR is supported when 1) KVM is enabled 2) Option pmu=on and
7586      * 3)vPMU LBR format matches that of host setting.
7587      */
7588     requested_lbr_fmt =
7589         env->features[FEAT_PERF_CAPABILITIES] & PERF_CAP_LBR_FMT;
7590     if (requested_lbr_fmt && kvm_enabled()) {
7591         uint64_t host_perf_cap =
7592             x86_cpu_get_supported_feature_word(FEAT_PERF_CAPABILITIES, false);
7593         unsigned host_lbr_fmt = host_perf_cap & PERF_CAP_LBR_FMT;
7594 
7595         if (!cpu->enable_pmu) {
7596             error_setg(errp, "vPMU: LBR is unsupported without pmu=on");
7597             return;
7598         }
7599         if (requested_lbr_fmt != host_lbr_fmt) {
7600             error_setg(errp, "vPMU: the lbr-fmt value (0x%x) does not match "
7601                         "the host value (0x%x).",
7602                         requested_lbr_fmt, host_lbr_fmt);
7603             return;
7604         }
7605     }
7606 
7607     x86_cpu_filter_features(cpu, cpu->check_cpuid || cpu->enforce_cpuid);
7608 
7609     if (cpu->enforce_cpuid && x86_cpu_have_filtered_features(cpu)) {
7610         error_setg(&local_err,
7611                    accel_uses_host_cpuid() ?
7612                        "Host doesn't support requested features" :
7613                        "TCG doesn't support requested features");
7614         goto out;
7615     }
7616 
7617     /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on
7618      * CPUID[1].EDX.
7619      */
7620     if (IS_AMD_CPU(env)) {
7621         env->features[FEAT_8000_0001_EDX] &= ~CPUID_EXT2_AMD_ALIASES;
7622         env->features[FEAT_8000_0001_EDX] |= (env->features[FEAT_1_EDX]
7623            & CPUID_EXT2_AMD_ALIASES);
7624     }
7625 
7626     x86_cpu_set_sgxlepubkeyhash(env);
7627 
7628     /*
7629      * note: the call to the framework needs to happen after feature expansion,
7630      * but before the checks/modifications to ucode_rev, mwait, phys_bits.
7631      * These may be set by the accel-specific code,
7632      * and the results are subsequently checked / assumed in this function.
7633      */
7634     cpu_exec_realizefn(cs, &local_err);
7635     if (local_err != NULL) {
7636         error_propagate(errp, local_err);
7637         return;
7638     }
7639 
7640     if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
7641         g_autofree char *name = x86_cpu_class_get_model_name(xcc);
7642         error_setg(&local_err, "CPU model '%s' requires KVM or HVF", name);
7643         goto out;
7644     }
7645 
7646     if (cpu->guest_phys_bits == -1) {
7647         /*
7648          * If it was not set by the user, or by the accelerator via
7649          * cpu_exec_realizefn, clear.
7650          */
7651         cpu->guest_phys_bits = 0;
7652     }
7653 
7654     if (cpu->ucode_rev == 0) {
7655         /*
7656          * The default is the same as KVM's. Note that this check
7657          * needs to happen after the evenual setting of ucode_rev in
7658          * accel-specific code in cpu_exec_realizefn.
7659          */
7660         if (IS_AMD_CPU(env)) {
7661             cpu->ucode_rev = 0x01000065;
7662         } else {
7663             cpu->ucode_rev = 0x100000000ULL;
7664         }
7665     }
7666 
7667     /*
7668      * mwait extended info: needed for Core compatibility
7669      * We always wake on interrupt even if host does not have the capability.
7670      *
7671      * requires the accel-specific code in cpu_exec_realizefn to
7672      * have already acquired the CPUID data into cpu->mwait.
7673      */
7674     cpu->mwait.ecx |= CPUID_MWAIT_EMX | CPUID_MWAIT_IBE;
7675 
7676     /* For 64bit systems think about the number of physical bits to present.
7677      * ideally this should be the same as the host; anything other than matching
7678      * the host can cause incorrect guest behaviour.
7679      * QEMU used to pick the magic value of 40 bits that corresponds to
7680      * consumer AMD devices but nothing else.
7681      *
7682      * Note that this code assumes features expansion has already been done
7683      * (as it checks for CPUID_EXT2_LM), and also assumes that potential
7684      * phys_bits adjustments to match the host have been already done in
7685      * accel-specific code in cpu_exec_realizefn.
7686      */
7687     if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
7688         if (cpu->phys_bits &&
7689             (cpu->phys_bits > TARGET_PHYS_ADDR_SPACE_BITS ||
7690             cpu->phys_bits < 32)) {
7691             error_setg(errp, "phys-bits should be between 32 and %u "
7692                              " (but is %u)",
7693                              TARGET_PHYS_ADDR_SPACE_BITS, cpu->phys_bits);
7694             return;
7695         }
7696         /*
7697          * 0 means it was not explicitly set by the user (or by machine
7698          * compat_props or by the host code in host-cpu.c).
7699          * In this case, the default is the value used by TCG (40).
7700          */
7701         if (cpu->phys_bits == 0) {
7702             cpu->phys_bits = TCG_PHYS_ADDR_BITS;
7703         }
7704         if (cpu->guest_phys_bits &&
7705             (cpu->guest_phys_bits > cpu->phys_bits ||
7706             cpu->guest_phys_bits < 32)) {
7707             error_setg(errp, "guest-phys-bits should be between 32 and %u "
7708                              " (but is %u)",
7709                              cpu->phys_bits, cpu->guest_phys_bits);
7710             return;
7711         }
7712     } else {
7713         /* For 32 bit systems don't use the user set value, but keep
7714          * phys_bits consistent with what we tell the guest.
7715          */
7716         if (cpu->phys_bits != 0) {
7717             error_setg(errp, "phys-bits is not user-configurable in 32 bit");
7718             return;
7719         }
7720         if (cpu->guest_phys_bits != 0) {
7721             error_setg(errp, "guest-phys-bits is not user-configurable in 32 bit");
7722             return;
7723         }
7724 
7725         if (env->features[FEAT_1_EDX] & (CPUID_PSE36 | CPUID_PAE)) {
7726             cpu->phys_bits = 36;
7727         } else {
7728             cpu->phys_bits = 32;
7729         }
7730     }
7731 
7732     /* Cache information initialization */
7733     if (!cpu->legacy_cache) {
7734         const CPUCaches *cache_info =
7735             x86_cpu_get_versioned_cache_info(cpu, xcc->model);
7736 
7737         if (!xcc->model || !cache_info) {
7738             g_autofree char *name = x86_cpu_class_get_model_name(xcc);
7739             error_setg(errp,
7740                        "CPU model '%s' doesn't support legacy-cache=off", name);
7741             return;
7742         }
7743         env->cache_info_cpuid2 = env->cache_info_cpuid4 = env->cache_info_amd =
7744             *cache_info;
7745     } else {
7746         /* Build legacy cache information */
7747         env->cache_info_cpuid2.l1d_cache = &legacy_l1d_cache;
7748         env->cache_info_cpuid2.l1i_cache = &legacy_l1i_cache;
7749         env->cache_info_cpuid2.l2_cache = &legacy_l2_cache_cpuid2;
7750         env->cache_info_cpuid2.l3_cache = &legacy_l3_cache;
7751 
7752         env->cache_info_cpuid4.l1d_cache = &legacy_l1d_cache;
7753         env->cache_info_cpuid4.l1i_cache = &legacy_l1i_cache;
7754         env->cache_info_cpuid4.l2_cache = &legacy_l2_cache;
7755         env->cache_info_cpuid4.l3_cache = &legacy_l3_cache;
7756 
7757         env->cache_info_amd.l1d_cache = &legacy_l1d_cache_amd;
7758         env->cache_info_amd.l1i_cache = &legacy_l1i_cache_amd;
7759         env->cache_info_amd.l2_cache = &legacy_l2_cache_amd;
7760         env->cache_info_amd.l3_cache = &legacy_l3_cache;
7761     }
7762 
7763 #ifndef CONFIG_USER_ONLY
7764     MachineState *ms = MACHINE(qdev_get_machine());
7765     qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
7766 
7767     if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || ms->smp.cpus > 1) {
7768         x86_cpu_apic_create(cpu, &local_err);
7769         if (local_err != NULL) {
7770             goto out;
7771         }
7772     }
7773 #endif
7774 
7775     mce_init(cpu);
7776 
7777     qemu_init_vcpu(cs);
7778 
7779     /*
7780      * Most Intel and certain AMD CPUs support hyperthreading. Even though QEMU
7781      * fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
7782      * based on inputs (sockets,cores,threads), it is still better to give
7783      * users a warning.
7784      *
7785      * NOTE: the following code has to follow qemu_init_vcpu(). Otherwise
7786      * cs->nr_threads hasn't be populated yet and the checking is incorrect.
7787      */
7788     if (IS_AMD_CPU(env) &&
7789         !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
7790         cs->nr_threads > 1) {
7791             warn_report_once("This family of AMD CPU doesn't support "
7792                              "hyperthreading(%d). Please configure -smp "
7793                              "options properly or try enabling topoext "
7794                              "feature.", cs->nr_threads);
7795     }
7796 
7797 #ifndef CONFIG_USER_ONLY
7798     x86_cpu_apic_realize(cpu, &local_err);
7799     if (local_err != NULL) {
7800         goto out;
7801     }
7802 #endif /* !CONFIG_USER_ONLY */
7803     cpu_reset(cs);
7804 
7805     xcc->parent_realize(dev, &local_err);
7806 
7807 out:
7808     if (local_err != NULL) {
7809         error_propagate(errp, local_err);
7810         return;
7811     }
7812 }
7813 
7814 static void x86_cpu_unrealizefn(DeviceState *dev)
7815 {
7816     X86CPU *cpu = X86_CPU(dev);
7817     X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
7818 
7819 #ifndef CONFIG_USER_ONLY
7820     cpu_remove_sync(CPU(dev));
7821     qemu_unregister_reset(x86_cpu_machine_reset_cb, dev);
7822 #endif
7823 
7824     if (cpu->apic_state) {
7825         object_unparent(OBJECT(cpu->apic_state));
7826         cpu->apic_state = NULL;
7827     }
7828 
7829     xcc->parent_unrealize(dev);
7830 }
7831 
7832 typedef struct BitProperty {
7833     FeatureWord w;
7834     uint64_t mask;
7835 } BitProperty;
7836 
7837 static void x86_cpu_get_bit_prop(Object *obj, Visitor *v, const char *name,
7838                                  void *opaque, Error **errp)
7839 {
7840     X86CPU *cpu = X86_CPU(obj);
7841     BitProperty *fp = opaque;
7842     uint64_t f = cpu->env.features[fp->w];
7843     bool value = (f & fp->mask) == fp->mask;
7844     visit_type_bool(v, name, &value, errp);
7845 }
7846 
7847 static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
7848                                  void *opaque, Error **errp)
7849 {
7850     DeviceState *dev = DEVICE(obj);
7851     X86CPU *cpu = X86_CPU(obj);
7852     BitProperty *fp = opaque;
7853     bool value;
7854 
7855     if (dev->realized) {
7856         qdev_prop_set_after_realize(dev, name, errp);
7857         return;
7858     }
7859 
7860     if (!visit_type_bool(v, name, &value, errp)) {
7861         return;
7862     }
7863 
7864     if (value) {
7865         cpu->env.features[fp->w] |= fp->mask;
7866     } else {
7867         cpu->env.features[fp->w] &= ~fp->mask;
7868     }
7869     cpu->env.user_features[fp->w] |= fp->mask;
7870 }
7871 
7872 /* Register a boolean property to get/set a single bit in a uint32_t field.
7873  *
7874  * The same property name can be registered multiple times to make it affect
7875  * multiple bits in the same FeatureWord. In that case, the getter will return
7876  * true only if all bits are set.
7877  */
7878 static void x86_cpu_register_bit_prop(X86CPUClass *xcc,
7879                                       const char *prop_name,
7880                                       FeatureWord w,
7881                                       int bitnr)
7882 {
7883     ObjectClass *oc = OBJECT_CLASS(xcc);
7884     BitProperty *fp;
7885     ObjectProperty *op;
7886     uint64_t mask = (1ULL << bitnr);
7887 
7888     op = object_class_property_find(oc, prop_name);
7889     if (op) {
7890         fp = op->opaque;
7891         assert(fp->w == w);
7892         fp->mask |= mask;
7893     } else {
7894         fp = g_new0(BitProperty, 1);
7895         fp->w = w;
7896         fp->mask = mask;
7897         object_class_property_add(oc, prop_name, "bool",
7898                                   x86_cpu_get_bit_prop,
7899                                   x86_cpu_set_bit_prop,
7900                                   NULL, fp);
7901     }
7902 }
7903 
7904 static void x86_cpu_register_feature_bit_props(X86CPUClass *xcc,
7905                                                FeatureWord w,
7906                                                int bitnr)
7907 {
7908     FeatureWordInfo *fi = &feature_word_info[w];
7909     const char *name = fi->feat_names[bitnr];
7910 
7911     if (!name) {
7912         return;
7913     }
7914 
7915     /* Property names should use "-" instead of "_".
7916      * Old names containing underscores are registered as aliases
7917      * using object_property_add_alias()
7918      */
7919     assert(!strchr(name, '_'));
7920     /* aliases don't use "|" delimiters anymore, they are registered
7921      * manually using object_property_add_alias() */
7922     assert(!strchr(name, '|'));
7923     x86_cpu_register_bit_prop(xcc, name, w, bitnr);
7924 }
7925 
7926 static void x86_cpu_post_initfn(Object *obj)
7927 {
7928     accel_cpu_instance_init(CPU(obj));
7929 }
7930 
7931 static void x86_cpu_init_default_topo(X86CPU *cpu)
7932 {
7933     CPUX86State *env = &cpu->env;
7934 
7935     env->nr_modules = 1;
7936     env->nr_dies = 1;
7937 
7938     /* SMT, core and package levels are set by default. */
7939     set_bit(CPU_TOPO_LEVEL_SMT, env->avail_cpu_topo);
7940     set_bit(CPU_TOPO_LEVEL_CORE, env->avail_cpu_topo);
7941     set_bit(CPU_TOPO_LEVEL_PACKAGE, env->avail_cpu_topo);
7942 }
7943 
7944 static void x86_cpu_initfn(Object *obj)
7945 {
7946     X86CPU *cpu = X86_CPU(obj);
7947     X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
7948     CPUX86State *env = &cpu->env;
7949 
7950     x86_cpu_init_default_topo(cpu);
7951 
7952     object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo",
7953                         x86_cpu_get_feature_words,
7954                         NULL, NULL, (void *)env->features);
7955     object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo",
7956                         x86_cpu_get_feature_words,
7957                         NULL, NULL, (void *)cpu->filtered_features);
7958 
7959     object_property_add_alias(obj, "sse3", obj, "pni");
7960     object_property_add_alias(obj, "pclmuldq", obj, "pclmulqdq");
7961     object_property_add_alias(obj, "sse4-1", obj, "sse4.1");
7962     object_property_add_alias(obj, "sse4-2", obj, "sse4.2");
7963     object_property_add_alias(obj, "xd", obj, "nx");
7964     object_property_add_alias(obj, "ffxsr", obj, "fxsr-opt");
7965     object_property_add_alias(obj, "i64", obj, "lm");
7966 
7967     object_property_add_alias(obj, "ds_cpl", obj, "ds-cpl");
7968     object_property_add_alias(obj, "tsc_adjust", obj, "tsc-adjust");
7969     object_property_add_alias(obj, "fxsr_opt", obj, "fxsr-opt");
7970     object_property_add_alias(obj, "lahf_lm", obj, "lahf-lm");
7971     object_property_add_alias(obj, "cmp_legacy", obj, "cmp-legacy");
7972     object_property_add_alias(obj, "nodeid_msr", obj, "nodeid-msr");
7973     object_property_add_alias(obj, "perfctr_core", obj, "perfctr-core");
7974     object_property_add_alias(obj, "perfctr_nb", obj, "perfctr-nb");
7975     object_property_add_alias(obj, "kvm_nopiodelay", obj, "kvm-nopiodelay");
7976     object_property_add_alias(obj, "kvm_mmu", obj, "kvm-mmu");
7977     object_property_add_alias(obj, "kvm_asyncpf", obj, "kvm-asyncpf");
7978     object_property_add_alias(obj, "kvm_asyncpf_int", obj, "kvm-asyncpf-int");
7979     object_property_add_alias(obj, "kvm_steal_time", obj, "kvm-steal-time");
7980     object_property_add_alias(obj, "kvm_pv_eoi", obj, "kvm-pv-eoi");
7981     object_property_add_alias(obj, "kvm_pv_unhalt", obj, "kvm-pv-unhalt");
7982     object_property_add_alias(obj, "kvm_poll_control", obj, "kvm-poll-control");
7983     object_property_add_alias(obj, "svm_lock", obj, "svm-lock");
7984     object_property_add_alias(obj, "nrip_save", obj, "nrip-save");
7985     object_property_add_alias(obj, "tsc_scale", obj, "tsc-scale");
7986     object_property_add_alias(obj, "vmcb_clean", obj, "vmcb-clean");
7987     object_property_add_alias(obj, "pause_filter", obj, "pause-filter");
7988     object_property_add_alias(obj, "sse4_1", obj, "sse4.1");
7989     object_property_add_alias(obj, "sse4_2", obj, "sse4.2");
7990 
7991     object_property_add_alias(obj, "hv-apicv", obj, "hv-avic");
7992     cpu->lbr_fmt = ~PERF_CAP_LBR_FMT;
7993     object_property_add_alias(obj, "lbr_fmt", obj, "lbr-fmt");
7994 
7995     if (xcc->model) {
7996         x86_cpu_load_model(cpu, xcc->model);
7997     }
7998 }
7999 
8000 static int64_t x86_cpu_get_arch_id(CPUState *cs)
8001 {
8002     X86CPU *cpu = X86_CPU(cs);
8003 
8004     return cpu->apic_id;
8005 }
8006 
8007 #if !defined(CONFIG_USER_ONLY)
8008 static bool x86_cpu_get_paging_enabled(const CPUState *cs)
8009 {
8010     X86CPU *cpu = X86_CPU(cs);
8011 
8012     return cpu->env.cr[0] & CR0_PG_MASK;
8013 }
8014 #endif /* !CONFIG_USER_ONLY */
8015 
8016 static void x86_cpu_set_pc(CPUState *cs, vaddr value)
8017 {
8018     X86CPU *cpu = X86_CPU(cs);
8019 
8020     cpu->env.eip = value;
8021 }
8022 
8023 static vaddr x86_cpu_get_pc(CPUState *cs)
8024 {
8025     X86CPU *cpu = X86_CPU(cs);
8026 
8027     /* Match cpu_get_tb_cpu_state. */
8028     return cpu->env.eip + cpu->env.segs[R_CS].base;
8029 }
8030 
8031 int x86_cpu_pending_interrupt(CPUState *cs, int interrupt_request)
8032 {
8033     X86CPU *cpu = X86_CPU(cs);
8034     CPUX86State *env = &cpu->env;
8035 
8036 #if !defined(CONFIG_USER_ONLY)
8037     if (interrupt_request & CPU_INTERRUPT_POLL) {
8038         return CPU_INTERRUPT_POLL;
8039     }
8040 #endif
8041     if (interrupt_request & CPU_INTERRUPT_SIPI) {
8042         return CPU_INTERRUPT_SIPI;
8043     }
8044 
8045     if (env->hflags2 & HF2_GIF_MASK) {
8046         if ((interrupt_request & CPU_INTERRUPT_SMI) &&
8047             !(env->hflags & HF_SMM_MASK)) {
8048             return CPU_INTERRUPT_SMI;
8049         } else if ((interrupt_request & CPU_INTERRUPT_NMI) &&
8050                    !(env->hflags2 & HF2_NMI_MASK)) {
8051             return CPU_INTERRUPT_NMI;
8052         } else if (interrupt_request & CPU_INTERRUPT_MCE) {
8053             return CPU_INTERRUPT_MCE;
8054         } else if ((interrupt_request & CPU_INTERRUPT_HARD) &&
8055                    (((env->hflags2 & HF2_VINTR_MASK) &&
8056                      (env->hflags2 & HF2_HIF_MASK)) ||
8057                     (!(env->hflags2 & HF2_VINTR_MASK) &&
8058                      (env->eflags & IF_MASK &&
8059                       !(env->hflags & HF_INHIBIT_IRQ_MASK))))) {
8060             return CPU_INTERRUPT_HARD;
8061 #if !defined(CONFIG_USER_ONLY)
8062         } else if (env->hflags2 & HF2_VGIF_MASK) {
8063             if((interrupt_request & CPU_INTERRUPT_VIRQ) &&
8064                    (env->eflags & IF_MASK) &&
8065                    !(env->hflags & HF_INHIBIT_IRQ_MASK)) {
8066                         return CPU_INTERRUPT_VIRQ;
8067             }
8068 #endif
8069         }
8070     }
8071 
8072     return 0;
8073 }
8074 
8075 static bool x86_cpu_has_work(CPUState *cs)
8076 {
8077     return x86_cpu_pending_interrupt(cs, cs->interrupt_request) != 0;
8078 }
8079 
8080 static int x86_cpu_mmu_index(CPUState *cs, bool ifetch)
8081 {
8082     CPUX86State *env = cpu_env(cs);
8083     int mmu_index_32 = (env->hflags & HF_CS64_MASK) ? 0 : 1;
8084     int mmu_index_base =
8085         (env->hflags & HF_CPL_MASK) == 3 ? MMU_USER64_IDX :
8086         !(env->hflags & HF_SMAP_MASK) ? MMU_KNOSMAP64_IDX :
8087         (env->eflags & AC_MASK) ? MMU_KNOSMAP64_IDX : MMU_KSMAP64_IDX;
8088 
8089     return mmu_index_base + mmu_index_32;
8090 }
8091 
8092 static void x86_disas_set_info(CPUState *cs, disassemble_info *info)
8093 {
8094     X86CPU *cpu = X86_CPU(cs);
8095     CPUX86State *env = &cpu->env;
8096 
8097     info->mach = (env->hflags & HF_CS64_MASK ? bfd_mach_x86_64
8098                   : env->hflags & HF_CS32_MASK ? bfd_mach_i386_i386
8099                   : bfd_mach_i386_i8086);
8100 
8101     info->cap_arch = CS_ARCH_X86;
8102     info->cap_mode = (env->hflags & HF_CS64_MASK ? CS_MODE_64
8103                       : env->hflags & HF_CS32_MASK ? CS_MODE_32
8104                       : CS_MODE_16);
8105     info->cap_insn_unit = 1;
8106     info->cap_insn_split = 8;
8107 }
8108 
8109 void x86_update_hflags(CPUX86State *env)
8110 {
8111    uint32_t hflags;
8112 #define HFLAG_COPY_MASK \
8113     ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
8114        HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
8115        HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
8116        HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK)
8117 
8118     hflags = env->hflags & HFLAG_COPY_MASK;
8119     hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
8120     hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
8121     hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
8122                 (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
8123     hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
8124 
8125     if (env->cr[4] & CR4_OSFXSR_MASK) {
8126         hflags |= HF_OSFXSR_MASK;
8127     }
8128 
8129     if (env->efer & MSR_EFER_LMA) {
8130         hflags |= HF_LMA_MASK;
8131     }
8132 
8133     if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
8134         hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
8135     } else {
8136         hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
8137                     (DESC_B_SHIFT - HF_CS32_SHIFT);
8138         hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
8139                     (DESC_B_SHIFT - HF_SS32_SHIFT);
8140         if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) ||
8141             !(hflags & HF_CS32_MASK)) {
8142             hflags |= HF_ADDSEG_MASK;
8143         } else {
8144             hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base |
8145                         env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
8146         }
8147     }
8148     env->hflags = hflags;
8149 }
8150 
8151 static Property x86_cpu_properties[] = {
8152 #ifdef CONFIG_USER_ONLY
8153     /* apic_id = 0 by default for *-user, see commit 9886e834 */
8154     DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, 0),
8155     DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, 0),
8156     DEFINE_PROP_INT32("core-id", X86CPU, core_id, 0),
8157     DEFINE_PROP_INT32("module-id", X86CPU, module_id, 0),
8158     DEFINE_PROP_INT32("die-id", X86CPU, die_id, 0),
8159     DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, 0),
8160 #else
8161     DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, UNASSIGNED_APIC_ID),
8162     DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, -1),
8163     DEFINE_PROP_INT32("core-id", X86CPU, core_id, -1),
8164     DEFINE_PROP_INT32("module-id", X86CPU, module_id, -1),
8165     DEFINE_PROP_INT32("die-id", X86CPU, die_id, -1),
8166     DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, -1),
8167 #endif
8168     DEFINE_PROP_INT32("node-id", X86CPU, node_id, CPU_UNSET_NUMA_NODE_ID),
8169     DEFINE_PROP_BOOL("pmu", X86CPU, enable_pmu, false),
8170     DEFINE_PROP_UINT64_CHECKMASK("lbr-fmt", X86CPU, lbr_fmt, PERF_CAP_LBR_FMT),
8171 
8172     DEFINE_PROP_UINT32("hv-spinlocks", X86CPU, hyperv_spinlock_attempts,
8173                        HYPERV_SPINLOCK_NEVER_NOTIFY),
8174     DEFINE_PROP_BIT64("hv-relaxed", X86CPU, hyperv_features,
8175                       HYPERV_FEAT_RELAXED, 0),
8176     DEFINE_PROP_BIT64("hv-vapic", X86CPU, hyperv_features,
8177                       HYPERV_FEAT_VAPIC, 0),
8178     DEFINE_PROP_BIT64("hv-time", X86CPU, hyperv_features,
8179                       HYPERV_FEAT_TIME, 0),
8180     DEFINE_PROP_BIT64("hv-crash", X86CPU, hyperv_features,
8181                       HYPERV_FEAT_CRASH, 0),
8182     DEFINE_PROP_BIT64("hv-reset", X86CPU, hyperv_features,
8183                       HYPERV_FEAT_RESET, 0),
8184     DEFINE_PROP_BIT64("hv-vpindex", X86CPU, hyperv_features,
8185                       HYPERV_FEAT_VPINDEX, 0),
8186     DEFINE_PROP_BIT64("hv-runtime", X86CPU, hyperv_features,
8187                       HYPERV_FEAT_RUNTIME, 0),
8188     DEFINE_PROP_BIT64("hv-synic", X86CPU, hyperv_features,
8189                       HYPERV_FEAT_SYNIC, 0),
8190     DEFINE_PROP_BIT64("hv-stimer", X86CPU, hyperv_features,
8191                       HYPERV_FEAT_STIMER, 0),
8192     DEFINE_PROP_BIT64("hv-frequencies", X86CPU, hyperv_features,
8193                       HYPERV_FEAT_FREQUENCIES, 0),
8194     DEFINE_PROP_BIT64("hv-reenlightenment", X86CPU, hyperv_features,
8195                       HYPERV_FEAT_REENLIGHTENMENT, 0),
8196     DEFINE_PROP_BIT64("hv-tlbflush", X86CPU, hyperv_features,
8197                       HYPERV_FEAT_TLBFLUSH, 0),
8198     DEFINE_PROP_BIT64("hv-evmcs", X86CPU, hyperv_features,
8199                       HYPERV_FEAT_EVMCS, 0),
8200     DEFINE_PROP_BIT64("hv-ipi", X86CPU, hyperv_features,
8201                       HYPERV_FEAT_IPI, 0),
8202     DEFINE_PROP_BIT64("hv-stimer-direct", X86CPU, hyperv_features,
8203                       HYPERV_FEAT_STIMER_DIRECT, 0),
8204     DEFINE_PROP_BIT64("hv-avic", X86CPU, hyperv_features,
8205                       HYPERV_FEAT_AVIC, 0),
8206     DEFINE_PROP_BIT64("hv-emsr-bitmap", X86CPU, hyperv_features,
8207                       HYPERV_FEAT_MSR_BITMAP, 0),
8208     DEFINE_PROP_BIT64("hv-xmm-input", X86CPU, hyperv_features,
8209                       HYPERV_FEAT_XMM_INPUT, 0),
8210     DEFINE_PROP_BIT64("hv-tlbflush-ext", X86CPU, hyperv_features,
8211                       HYPERV_FEAT_TLBFLUSH_EXT, 0),
8212     DEFINE_PROP_BIT64("hv-tlbflush-direct", X86CPU, hyperv_features,
8213                       HYPERV_FEAT_TLBFLUSH_DIRECT, 0),
8214     DEFINE_PROP_ON_OFF_AUTO("hv-no-nonarch-coresharing", X86CPU,
8215                             hyperv_no_nonarch_cs, ON_OFF_AUTO_OFF),
8216     DEFINE_PROP_BIT64("hv-syndbg", X86CPU, hyperv_features,
8217                       HYPERV_FEAT_SYNDBG, 0),
8218     DEFINE_PROP_BOOL("hv-passthrough", X86CPU, hyperv_passthrough, false),
8219     DEFINE_PROP_BOOL("hv-enforce-cpuid", X86CPU, hyperv_enforce_cpuid, false),
8220 
8221     /* WS2008R2 identify by default */
8222     DEFINE_PROP_UINT32("hv-version-id-build", X86CPU, hyperv_ver_id_build,
8223                        0x3839),
8224     DEFINE_PROP_UINT16("hv-version-id-major", X86CPU, hyperv_ver_id_major,
8225                        0x000A),
8226     DEFINE_PROP_UINT16("hv-version-id-minor", X86CPU, hyperv_ver_id_minor,
8227                        0x0000),
8228     DEFINE_PROP_UINT32("hv-version-id-spack", X86CPU, hyperv_ver_id_sp, 0),
8229     DEFINE_PROP_UINT8("hv-version-id-sbranch", X86CPU, hyperv_ver_id_sb, 0),
8230     DEFINE_PROP_UINT32("hv-version-id-snumber", X86CPU, hyperv_ver_id_sn, 0),
8231 
8232     DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true),
8233     DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
8234     DEFINE_PROP_BOOL("x-force-features", X86CPU, force_features, false),
8235     DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true),
8236     DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 0),
8237     DEFINE_PROP_UINT32("guest-phys-bits", X86CPU, guest_phys_bits, -1),
8238     DEFINE_PROP_BOOL("host-phys-bits", X86CPU, host_phys_bits, false),
8239     DEFINE_PROP_UINT8("host-phys-bits-limit", X86CPU, host_phys_bits_limit, 0),
8240     DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true),
8241     DEFINE_PROP_UINT32("level-func7", X86CPU, env.cpuid_level_func7,
8242                        UINT32_MAX),
8243     DEFINE_PROP_UINT32("level", X86CPU, env.cpuid_level, UINT32_MAX),
8244     DEFINE_PROP_UINT32("xlevel", X86CPU, env.cpuid_xlevel, UINT32_MAX),
8245     DEFINE_PROP_UINT32("xlevel2", X86CPU, env.cpuid_xlevel2, UINT32_MAX),
8246     DEFINE_PROP_UINT32("min-level", X86CPU, env.cpuid_min_level, 0),
8247     DEFINE_PROP_UINT32("min-xlevel", X86CPU, env.cpuid_min_xlevel, 0),
8248     DEFINE_PROP_UINT32("min-xlevel2", X86CPU, env.cpuid_min_xlevel2, 0),
8249     DEFINE_PROP_UINT64("ucode-rev", X86CPU, ucode_rev, 0),
8250     DEFINE_PROP_BOOL("full-cpuid-auto-level", X86CPU, full_cpuid_auto_level, true),
8251     DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor),
8252     DEFINE_PROP_BOOL("cpuid-0xb", X86CPU, enable_cpuid_0xb, true),
8253     DEFINE_PROP_BOOL("x-vendor-cpuid-only", X86CPU, vendor_cpuid_only, true),
8254     DEFINE_PROP_BOOL("lmce", X86CPU, enable_lmce, false),
8255     DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true),
8256     DEFINE_PROP_BOOL("kvm-no-smi-migration", X86CPU, kvm_no_smi_migration,
8257                      false),
8258     DEFINE_PROP_BOOL("kvm-pv-enforce-cpuid", X86CPU, kvm_pv_enforce_cpuid,
8259                      false),
8260     DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true),
8261     DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true),
8262     DEFINE_PROP_BOOL("x-migrate-smi-count", X86CPU, migrate_smi_count,
8263                      true),
8264     /*
8265      * lecacy_cache defaults to true unless the CPU model provides its
8266      * own cache information (see x86_cpu_load_def()).
8267      */
8268     DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, true),
8269     DEFINE_PROP_BOOL("legacy-multi-node", X86CPU, legacy_multi_node, false),
8270     DEFINE_PROP_BOOL("xen-vapic", X86CPU, xen_vapic, false),
8271 
8272     /*
8273      * From "Requirements for Implementing the Microsoft
8274      * Hypervisor Interface":
8275      * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs
8276      *
8277      * "Starting with Windows Server 2012 and Windows 8, if
8278      * CPUID.40000005.EAX contains a value of -1, Windows assumes that
8279      * the hypervisor imposes no specific limit to the number of VPs.
8280      * In this case, Windows Server 2012 guest VMs may use more than
8281      * 64 VPs, up to the maximum supported number of processors applicable
8282      * to the specific Windows version being used."
8283      */
8284     DEFINE_PROP_INT32("x-hv-max-vps", X86CPU, hv_max_vps, -1),
8285     DEFINE_PROP_BOOL("x-hv-synic-kvm-only", X86CPU, hyperv_synic_kvm_only,
8286                      false),
8287     DEFINE_PROP_BOOL("x-intel-pt-auto-level", X86CPU, intel_pt_auto_level,
8288                      true),
8289     DEFINE_PROP_BOOL("x-l1-cache-per-thread", X86CPU, l1_cache_per_core, true),
8290     DEFINE_PROP_END_OF_LIST()
8291 };
8292 
8293 #ifndef CONFIG_USER_ONLY
8294 #include "hw/core/sysemu-cpu-ops.h"
8295 
8296 static const struct SysemuCPUOps i386_sysemu_ops = {
8297     .get_memory_mapping = x86_cpu_get_memory_mapping,
8298     .get_paging_enabled = x86_cpu_get_paging_enabled,
8299     .get_phys_page_attrs_debug = x86_cpu_get_phys_page_attrs_debug,
8300     .asidx_from_attrs = x86_asidx_from_attrs,
8301     .get_crash_info = x86_cpu_get_crash_info,
8302     .write_elf32_note = x86_cpu_write_elf32_note,
8303     .write_elf64_note = x86_cpu_write_elf64_note,
8304     .write_elf32_qemunote = x86_cpu_write_elf32_qemunote,
8305     .write_elf64_qemunote = x86_cpu_write_elf64_qemunote,
8306     .legacy_vmsd = &vmstate_x86_cpu,
8307 };
8308 #endif
8309 
8310 static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
8311 {
8312     X86CPUClass *xcc = X86_CPU_CLASS(oc);
8313     CPUClass *cc = CPU_CLASS(oc);
8314     DeviceClass *dc = DEVICE_CLASS(oc);
8315     ResettableClass *rc = RESETTABLE_CLASS(oc);
8316     FeatureWord w;
8317 
8318     device_class_set_parent_realize(dc, x86_cpu_realizefn,
8319                                     &xcc->parent_realize);
8320     device_class_set_parent_unrealize(dc, x86_cpu_unrealizefn,
8321                                       &xcc->parent_unrealize);
8322     device_class_set_props(dc, x86_cpu_properties);
8323 
8324     resettable_class_set_parent_phases(rc, NULL, x86_cpu_reset_hold, NULL,
8325                                        &xcc->parent_phases);
8326     cc->reset_dump_flags = CPU_DUMP_FPU | CPU_DUMP_CCOP;
8327 
8328     cc->class_by_name = x86_cpu_class_by_name;
8329     cc->parse_features = x86_cpu_parse_featurestr;
8330     cc->has_work = x86_cpu_has_work;
8331     cc->mmu_index = x86_cpu_mmu_index;
8332     cc->dump_state = x86_cpu_dump_state;
8333     cc->set_pc = x86_cpu_set_pc;
8334     cc->get_pc = x86_cpu_get_pc;
8335     cc->gdb_read_register = x86_cpu_gdb_read_register;
8336     cc->gdb_write_register = x86_cpu_gdb_write_register;
8337     cc->get_arch_id = x86_cpu_get_arch_id;
8338 
8339 #ifndef CONFIG_USER_ONLY
8340     cc->sysemu_ops = &i386_sysemu_ops;
8341 #endif /* !CONFIG_USER_ONLY */
8342 
8343     cc->gdb_arch_name = x86_gdb_arch_name;
8344 #ifdef TARGET_X86_64
8345     cc->gdb_core_xml_file = "i386-64bit.xml";
8346 #else
8347     cc->gdb_core_xml_file = "i386-32bit.xml";
8348 #endif
8349     cc->disas_set_info = x86_disas_set_info;
8350 
8351     dc->user_creatable = true;
8352 
8353     object_class_property_add(oc, "family", "int",
8354                               x86_cpuid_version_get_family,
8355                               x86_cpuid_version_set_family, NULL, NULL);
8356     object_class_property_add(oc, "model", "int",
8357                               x86_cpuid_version_get_model,
8358                               x86_cpuid_version_set_model, NULL, NULL);
8359     object_class_property_add(oc, "stepping", "int",
8360                               x86_cpuid_version_get_stepping,
8361                               x86_cpuid_version_set_stepping, NULL, NULL);
8362     object_class_property_add_str(oc, "vendor",
8363                                   x86_cpuid_get_vendor,
8364                                   x86_cpuid_set_vendor);
8365     object_class_property_add_str(oc, "model-id",
8366                                   x86_cpuid_get_model_id,
8367                                   x86_cpuid_set_model_id);
8368     object_class_property_add(oc, "tsc-frequency", "int",
8369                               x86_cpuid_get_tsc_freq,
8370                               x86_cpuid_set_tsc_freq, NULL, NULL);
8371     /*
8372      * The "unavailable-features" property has the same semantics as
8373      * CpuDefinitionInfo.unavailable-features on the "query-cpu-definitions"
8374      * QMP command: they list the features that would have prevented the
8375      * CPU from running if the "enforce" flag was set.
8376      */
8377     object_class_property_add(oc, "unavailable-features", "strList",
8378                               x86_cpu_get_unavailable_features,
8379                               NULL, NULL, NULL);
8380 
8381 #if !defined(CONFIG_USER_ONLY)
8382     object_class_property_add(oc, "crash-information", "GuestPanicInformation",
8383                               x86_cpu_get_crash_info_qom, NULL, NULL, NULL);
8384 #endif
8385 
8386     for (w = 0; w < FEATURE_WORDS; w++) {
8387         int bitnr;
8388         for (bitnr = 0; bitnr < 64; bitnr++) {
8389             x86_cpu_register_feature_bit_props(xcc, w, bitnr);
8390         }
8391     }
8392 }
8393 
8394 static const TypeInfo x86_cpu_type_info = {
8395     .name = TYPE_X86_CPU,
8396     .parent = TYPE_CPU,
8397     .instance_size = sizeof(X86CPU),
8398     .instance_align = __alignof(X86CPU),
8399     .instance_init = x86_cpu_initfn,
8400     .instance_post_init = x86_cpu_post_initfn,
8401 
8402     .abstract = true,
8403     .class_size = sizeof(X86CPUClass),
8404     .class_init = x86_cpu_common_class_init,
8405 };
8406 
8407 /* "base" CPU model, used by query-cpu-model-expansion */
8408 static void x86_cpu_base_class_init(ObjectClass *oc, void *data)
8409 {
8410     X86CPUClass *xcc = X86_CPU_CLASS(oc);
8411 
8412     xcc->static_model = true;
8413     xcc->migration_safe = true;
8414     xcc->model_description = "base CPU model type with no features enabled";
8415     xcc->ordering = 8;
8416 }
8417 
8418 static const TypeInfo x86_base_cpu_type_info = {
8419         .name = X86_CPU_TYPE_NAME("base"),
8420         .parent = TYPE_X86_CPU,
8421         .class_init = x86_cpu_base_class_init,
8422 };
8423 
8424 static void x86_cpu_register_types(void)
8425 {
8426     int i;
8427 
8428     type_register_static(&x86_cpu_type_info);
8429     for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) {
8430         x86_register_cpudef_types(&builtin_x86_defs[i]);
8431     }
8432     type_register_static(&max_x86_cpu_type_info);
8433     type_register_static(&x86_base_cpu_type_info);
8434 }
8435 
8436 type_init(x86_cpu_register_types)
8437