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