xref: /qemu/target/i386/cpu.c (revision 02326733)
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", "rfds-no",
1162             "rfds-clear", 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             {
3826                 .version = 7,
3827                 .note = "TSX, taa-no",
3828                 .props = (PropValue[]) {
3829                     /* Restore TSX features removed by -v2 above */
3830                     { "hle", "on" },
3831                     { "rtm", "on" },
3832                     { /* end of list */ }
3833                 },
3834             },
3835             { /* end of list */ }
3836         }
3837     },
3838     {
3839         .name = "SapphireRapids",
3840         .level = 0x20,
3841         .vendor = CPUID_VENDOR_INTEL,
3842         .family = 6,
3843         .model = 143,
3844         .stepping = 4,
3845         /*
3846          * please keep the ascending order so that we can have a clear view of
3847          * bit position of each feature.
3848          */
3849         .features[FEAT_1_EDX] =
3850             CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
3851             CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
3852             CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
3853             CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
3854             CPUID_SSE | CPUID_SSE2,
3855         .features[FEAT_1_ECX] =
3856             CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 |
3857             CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 |
3858             CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
3859             CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES |
3860             CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3861         .features[FEAT_8000_0001_EDX] =
3862             CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
3863             CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
3864         .features[FEAT_8000_0001_ECX] =
3865             CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH,
3866         .features[FEAT_8000_0008_EBX] =
3867             CPUID_8000_0008_EBX_WBNOINVD,
3868         .features[FEAT_7_0_EBX] =
3869             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_HLE |
3870             CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 |
3871             CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_RTM |
3872             CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
3873             CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP |
3874             CPUID_7_0_EBX_AVX512IFMA | CPUID_7_0_EBX_CLFLUSHOPT |
3875             CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_SHA_NI |
3876             CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512VL,
3877         .features[FEAT_7_0_ECX] =
3878             CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
3879             CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
3880             CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
3881             CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
3882             CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57 |
3883             CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT,
3884         .features[FEAT_7_0_EDX] =
3885             CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE |
3886             CPUID_7_0_EDX_TSX_LDTRK | CPUID_7_0_EDX_AMX_BF16 |
3887             CPUID_7_0_EDX_AVX512_FP16 | CPUID_7_0_EDX_AMX_TILE |
3888             CPUID_7_0_EDX_AMX_INT8 | CPUID_7_0_EDX_SPEC_CTRL |
3889             CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
3890         .features[FEAT_ARCH_CAPABILITIES] =
3891             MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
3892             MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
3893             MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO,
3894         .features[FEAT_XSAVE] =
3895             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3896             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES | CPUID_D_1_EAX_XFD,
3897         .features[FEAT_6_EAX] =
3898             CPUID_6_EAX_ARAT,
3899         .features[FEAT_7_1_EAX] =
3900             CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_AVX512_BF16 |
3901             CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_FSRC,
3902         .features[FEAT_VMX_BASIC] =
3903             MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS,
3904         .features[FEAT_VMX_ENTRY_CTLS] =
3905             VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE |
3906             VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL |
3907             VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER,
3908         .features[FEAT_VMX_EPT_VPID_CAPS] =
3909             MSR_VMX_EPT_EXECONLY |
3910             MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_PAGE_WALK_LENGTH_5 |
3911             MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB |
3912             MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS |
3913             MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
3914             MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
3915             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT |
3916             MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
3917             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
3918         .features[FEAT_VMX_EXIT_CTLS] =
3919             VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
3920             VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
3921             VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT |
3922             VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
3923             VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
3924         .features[FEAT_VMX_MISC] =
3925             MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT |
3926             MSR_VMX_MISC_VMWRITE_VMEXIT,
3927         .features[FEAT_VMX_PINBASED_CTLS] =
3928             VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING |
3929             VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER |
3930             VMX_PIN_BASED_POSTED_INTR,
3931         .features[FEAT_VMX_PROCBASED_CTLS] =
3932             VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
3933             VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
3934             VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
3935             VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
3936             VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
3937             VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
3938             VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING |
3939             VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
3940             VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG |
3941             VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
3942             VMX_CPU_BASED_PAUSE_EXITING |
3943             VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
3944         .features[FEAT_VMX_SECONDARY_CTLS] =
3945             VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
3946             VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC |
3947             VMX_SECONDARY_EXEC_RDTSCP |
3948             VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
3949             VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING |
3950             VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
3951             VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
3952             VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
3953             VMX_SECONDARY_EXEC_RDRAND_EXITING |
3954             VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3955             VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3956             VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML |
3957             VMX_SECONDARY_EXEC_XSAVES,
3958         .features[FEAT_VMX_VMFUNC] =
3959             MSR_VMX_VMFUNC_EPT_SWITCHING,
3960         .xlevel = 0x80000008,
3961         .model_id = "Intel Xeon Processor (SapphireRapids)",
3962         .versions = (X86CPUVersionDefinition[]) {
3963             { .version = 1 },
3964             {
3965                 .version = 2,
3966                 .props = (PropValue[]) {
3967                     { "sbdr-ssdp-no", "on" },
3968                     { "fbsdp-no", "on" },
3969                     { "psdp-no", "on" },
3970                     { /* end of list */ }
3971                 }
3972             },
3973             { /* end of list */ }
3974         }
3975     },
3976     {
3977         .name = "GraniteRapids",
3978         .level = 0x20,
3979         .vendor = CPUID_VENDOR_INTEL,
3980         .family = 6,
3981         .model = 173,
3982         .stepping = 0,
3983         /*
3984          * please keep the ascending order so that we can have a clear view of
3985          * bit position of each feature.
3986          */
3987         .features[FEAT_1_EDX] =
3988             CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
3989             CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
3990             CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
3991             CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
3992             CPUID_SSE | CPUID_SSE2,
3993         .features[FEAT_1_ECX] =
3994             CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 |
3995             CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 |
3996             CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
3997             CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES |
3998             CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3999         .features[FEAT_8000_0001_EDX] =
4000             CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
4001             CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
4002         .features[FEAT_8000_0001_ECX] =
4003             CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH,
4004         .features[FEAT_8000_0008_EBX] =
4005             CPUID_8000_0008_EBX_WBNOINVD,
4006         .features[FEAT_7_0_EBX] =
4007             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_HLE |
4008             CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 |
4009             CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_RTM |
4010             CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
4011             CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP |
4012             CPUID_7_0_EBX_AVX512IFMA | CPUID_7_0_EBX_CLFLUSHOPT |
4013             CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_SHA_NI |
4014             CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512VL,
4015         .features[FEAT_7_0_ECX] =
4016             CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
4017             CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
4018             CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
4019             CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
4020             CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57 |
4021             CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT,
4022         .features[FEAT_7_0_EDX] =
4023             CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE |
4024             CPUID_7_0_EDX_TSX_LDTRK | CPUID_7_0_EDX_AMX_BF16 |
4025             CPUID_7_0_EDX_AVX512_FP16 | CPUID_7_0_EDX_AMX_TILE |
4026             CPUID_7_0_EDX_AMX_INT8 | CPUID_7_0_EDX_SPEC_CTRL |
4027             CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
4028         .features[FEAT_ARCH_CAPABILITIES] =
4029             MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
4030             MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
4031             MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO |
4032             MSR_ARCH_CAP_SBDR_SSDP_NO | MSR_ARCH_CAP_FBSDP_NO |
4033             MSR_ARCH_CAP_PSDP_NO | MSR_ARCH_CAP_PBRSB_NO,
4034         .features[FEAT_XSAVE] =
4035             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4036             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES | CPUID_D_1_EAX_XFD,
4037         .features[FEAT_6_EAX] =
4038             CPUID_6_EAX_ARAT,
4039         .features[FEAT_7_1_EAX] =
4040             CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_AVX512_BF16 |
4041             CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_FSRC |
4042             CPUID_7_1_EAX_AMX_FP16,
4043         .features[FEAT_7_1_EDX] =
4044             CPUID_7_1_EDX_PREFETCHITI,
4045         .features[FEAT_7_2_EDX] =
4046             CPUID_7_2_EDX_MCDT_NO,
4047         .features[FEAT_VMX_BASIC] =
4048             MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS,
4049         .features[FEAT_VMX_ENTRY_CTLS] =
4050             VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE |
4051             VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL |
4052             VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER,
4053         .features[FEAT_VMX_EPT_VPID_CAPS] =
4054             MSR_VMX_EPT_EXECONLY |
4055             MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_PAGE_WALK_LENGTH_5 |
4056             MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB |
4057             MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS |
4058             MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
4059             MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
4060             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT |
4061             MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
4062             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
4063         .features[FEAT_VMX_EXIT_CTLS] =
4064             VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
4065             VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
4066             VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT |
4067             VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
4068             VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
4069         .features[FEAT_VMX_MISC] =
4070             MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT |
4071             MSR_VMX_MISC_VMWRITE_VMEXIT,
4072         .features[FEAT_VMX_PINBASED_CTLS] =
4073             VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING |
4074             VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER |
4075             VMX_PIN_BASED_POSTED_INTR,
4076         .features[FEAT_VMX_PROCBASED_CTLS] =
4077             VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
4078             VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
4079             VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
4080             VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
4081             VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
4082             VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
4083             VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING |
4084             VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
4085             VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG |
4086             VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
4087             VMX_CPU_BASED_PAUSE_EXITING |
4088             VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
4089         .features[FEAT_VMX_SECONDARY_CTLS] =
4090             VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
4091             VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC |
4092             VMX_SECONDARY_EXEC_RDTSCP |
4093             VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
4094             VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING |
4095             VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
4096             VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
4097             VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
4098             VMX_SECONDARY_EXEC_RDRAND_EXITING |
4099             VMX_SECONDARY_EXEC_ENABLE_INVPCID |
4100             VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
4101             VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML |
4102             VMX_SECONDARY_EXEC_XSAVES,
4103         .features[FEAT_VMX_VMFUNC] =
4104             MSR_VMX_VMFUNC_EPT_SWITCHING,
4105         .xlevel = 0x80000008,
4106         .model_id = "Intel Xeon Processor (GraniteRapids)",
4107         .versions = (X86CPUVersionDefinition[]) {
4108             { .version = 1 },
4109             { /* end of list */ },
4110         },
4111     },
4112     {
4113         .name = "SierraForest",
4114         .level = 0x23,
4115         .vendor = CPUID_VENDOR_INTEL,
4116         .family = 6,
4117         .model = 175,
4118         .stepping = 0,
4119         /*
4120          * please keep the ascending order so that we can have a clear view of
4121          * bit position of each feature.
4122          */
4123         .features[FEAT_1_EDX] =
4124             CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
4125             CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
4126             CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
4127             CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
4128             CPUID_SSE | CPUID_SSE2,
4129         .features[FEAT_1_ECX] =
4130             CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 |
4131             CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 |
4132             CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
4133             CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES |
4134             CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
4135         .features[FEAT_8000_0001_EDX] =
4136             CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
4137             CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
4138         .features[FEAT_8000_0001_ECX] =
4139             CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH,
4140         .features[FEAT_8000_0008_EBX] =
4141             CPUID_8000_0008_EBX_WBNOINVD,
4142         .features[FEAT_7_0_EBX] =
4143             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4144             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
4145             CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
4146             CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_CLWB |
4147             CPUID_7_0_EBX_SHA_NI,
4148         .features[FEAT_7_0_ECX] =
4149             CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | CPUID_7_0_ECX_GFNI |
4150             CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
4151             CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT,
4152         .features[FEAT_7_0_EDX] =
4153             CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE |
4154             CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_ARCH_CAPABILITIES |
4155             CPUID_7_0_EDX_SPEC_CTRL_SSBD,
4156         .features[FEAT_ARCH_CAPABILITIES] =
4157             MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
4158             MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
4159             MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_SBDR_SSDP_NO |
4160             MSR_ARCH_CAP_FBSDP_NO | MSR_ARCH_CAP_PSDP_NO |
4161             MSR_ARCH_CAP_PBRSB_NO,
4162         .features[FEAT_XSAVE] =
4163             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4164             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
4165         .features[FEAT_6_EAX] =
4166             CPUID_6_EAX_ARAT,
4167         .features[FEAT_7_1_EAX] =
4168             CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_CMPCCXADD |
4169             CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_AVX_IFMA,
4170         .features[FEAT_7_1_EDX] =
4171             CPUID_7_1_EDX_AVX_VNNI_INT8 | CPUID_7_1_EDX_AVX_NE_CONVERT,
4172         .features[FEAT_7_2_EDX] =
4173             CPUID_7_2_EDX_MCDT_NO,
4174         .features[FEAT_VMX_BASIC] =
4175             MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS,
4176         .features[FEAT_VMX_ENTRY_CTLS] =
4177             VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE |
4178             VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL |
4179             VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER,
4180         .features[FEAT_VMX_EPT_VPID_CAPS] =
4181             MSR_VMX_EPT_EXECONLY | MSR_VMX_EPT_PAGE_WALK_LENGTH_4 |
4182             MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB |
4183             MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS |
4184             MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
4185             MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
4186             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT |
4187             MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
4188             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
4189         .features[FEAT_VMX_EXIT_CTLS] =
4190             VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
4191             VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
4192             VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT |
4193             VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
4194             VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
4195         .features[FEAT_VMX_MISC] =
4196             MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT |
4197             MSR_VMX_MISC_VMWRITE_VMEXIT,
4198         .features[FEAT_VMX_PINBASED_CTLS] =
4199             VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING |
4200             VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER |
4201             VMX_PIN_BASED_POSTED_INTR,
4202         .features[FEAT_VMX_PROCBASED_CTLS] =
4203             VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
4204             VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
4205             VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
4206             VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
4207             VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
4208             VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
4209             VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING |
4210             VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
4211             VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG |
4212             VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
4213             VMX_CPU_BASED_PAUSE_EXITING |
4214             VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
4215         .features[FEAT_VMX_SECONDARY_CTLS] =
4216             VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
4217             VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC |
4218             VMX_SECONDARY_EXEC_RDTSCP |
4219             VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
4220             VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING |
4221             VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
4222             VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
4223             VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
4224             VMX_SECONDARY_EXEC_RDRAND_EXITING |
4225             VMX_SECONDARY_EXEC_ENABLE_INVPCID |
4226             VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
4227             VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML |
4228             VMX_SECONDARY_EXEC_XSAVES,
4229         .features[FEAT_VMX_VMFUNC] =
4230             MSR_VMX_VMFUNC_EPT_SWITCHING,
4231         .xlevel = 0x80000008,
4232         .model_id = "Intel Xeon Processor (SierraForest)",
4233         .versions = (X86CPUVersionDefinition[]) {
4234             { .version = 1 },
4235             { /* end of list */ },
4236         },
4237     },
4238     {
4239         .name = "Denverton",
4240         .level = 21,
4241         .vendor = CPUID_VENDOR_INTEL,
4242         .family = 6,
4243         .model = 95,
4244         .stepping = 1,
4245         .features[FEAT_1_EDX] =
4246             CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
4247             CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
4248             CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
4249             CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
4250             CPUID_SSE | CPUID_SSE2,
4251         .features[FEAT_1_ECX] =
4252             CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR |
4253             CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | CPUID_EXT_SSE41 |
4254             CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
4255             CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER |
4256             CPUID_EXT_AES | CPUID_EXT_XSAVE | CPUID_EXT_RDRAND,
4257         .features[FEAT_8000_0001_EDX] =
4258             CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
4259             CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
4260         .features[FEAT_8000_0001_ECX] =
4261             CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
4262         .features[FEAT_7_0_EBX] =
4263             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_ERMS |
4264             CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_SMAP |
4265             CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_SHA_NI,
4266         .features[FEAT_7_0_EDX] =
4267             CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_ARCH_CAPABILITIES |
4268             CPUID_7_0_EDX_SPEC_CTRL_SSBD,
4269         /* XSAVES is added in version 3 */
4270         .features[FEAT_XSAVE] =
4271             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | CPUID_XSAVE_XGETBV1,
4272         .features[FEAT_6_EAX] =
4273             CPUID_6_EAX_ARAT,
4274         .features[FEAT_ARCH_CAPABILITIES] =
4275             MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY,
4276         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
4277              MSR_VMX_BASIC_TRUE_CTLS,
4278         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
4279              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
4280              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
4281         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
4282              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
4283              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
4284              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
4285              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
4286              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
4287              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
4288         .features[FEAT_VMX_EXIT_CTLS] =
4289              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
4290              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
4291              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
4292              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
4293              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
4294         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
4295              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
4296         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
4297              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
4298              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
4299         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
4300              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
4301              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
4302              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
4303              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
4304              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
4305              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
4306              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
4307              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
4308              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
4309              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
4310              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
4311         .features[FEAT_VMX_SECONDARY_CTLS] =
4312              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
4313              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
4314              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
4315              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
4316              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
4317              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
4318              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
4319              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
4320              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
4321              VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
4322         .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
4323         .xlevel = 0x80000008,
4324         .model_id = "Intel Atom Processor (Denverton)",
4325         .versions = (X86CPUVersionDefinition[]) {
4326             { .version = 1 },
4327             {
4328                 .version = 2,
4329                 .note = "no MPX, no MONITOR",
4330                 .props = (PropValue[]) {
4331                     { "monitor", "off" },
4332                     { "mpx", "off" },
4333                     { /* end of list */ },
4334                 },
4335             },
4336             {
4337                 .version = 3,
4338                 .note = "XSAVES, no MPX, no MONITOR",
4339                 .props = (PropValue[]) {
4340                     { "xsaves", "on" },
4341                     { "vmx-xsaves", "on" },
4342                     { /* end of list */ },
4343                 },
4344             },
4345             { /* end of list */ },
4346         },
4347     },
4348     {
4349         .name = "Snowridge",
4350         .level = 27,
4351         .vendor = CPUID_VENDOR_INTEL,
4352         .family = 6,
4353         .model = 134,
4354         .stepping = 1,
4355         .features[FEAT_1_EDX] =
4356             /* missing: CPUID_PN CPUID_IA64 */
4357             /* missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
4358             CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE |
4359             CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE |
4360             CPUID_CX8 | CPUID_APIC | CPUID_SEP |
4361             CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
4362             CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH |
4363             CPUID_MMX |
4364             CPUID_FXSR | CPUID_SSE | CPUID_SSE2,
4365         .features[FEAT_1_ECX] =
4366             CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR |
4367             CPUID_EXT_SSSE3 |
4368             CPUID_EXT_CX16 |
4369             CPUID_EXT_SSE41 |
4370             CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
4371             CPUID_EXT_POPCNT |
4372             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES | CPUID_EXT_XSAVE |
4373             CPUID_EXT_RDRAND,
4374         .features[FEAT_8000_0001_EDX] =
4375             CPUID_EXT2_SYSCALL |
4376             CPUID_EXT2_NX |
4377             CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
4378             CPUID_EXT2_LM,
4379         .features[FEAT_8000_0001_ECX] =
4380             CPUID_EXT3_LAHF_LM |
4381             CPUID_EXT3_3DNOWPREFETCH,
4382         .features[FEAT_7_0_EBX] =
4383             CPUID_7_0_EBX_FSGSBASE |
4384             CPUID_7_0_EBX_SMEP |
4385             CPUID_7_0_EBX_ERMS |
4386             CPUID_7_0_EBX_MPX |  /* missing bits 13, 15 */
4387             CPUID_7_0_EBX_RDSEED |
4388             CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
4389             CPUID_7_0_EBX_CLWB |
4390             CPUID_7_0_EBX_SHA_NI,
4391         .features[FEAT_7_0_ECX] =
4392             CPUID_7_0_ECX_UMIP |
4393             /* missing bit 5 */
4394             CPUID_7_0_ECX_GFNI |
4395             CPUID_7_0_ECX_MOVDIRI | CPUID_7_0_ECX_CLDEMOTE |
4396             CPUID_7_0_ECX_MOVDIR64B,
4397         .features[FEAT_7_0_EDX] =
4398             CPUID_7_0_EDX_SPEC_CTRL |
4399             CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD |
4400             CPUID_7_0_EDX_CORE_CAPABILITY,
4401         .features[FEAT_CORE_CAPABILITY] =
4402             MSR_CORE_CAP_SPLIT_LOCK_DETECT,
4403         /* XSAVES is added in version 3 */
4404         .features[FEAT_XSAVE] =
4405             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4406             CPUID_XSAVE_XGETBV1,
4407         .features[FEAT_6_EAX] =
4408             CPUID_6_EAX_ARAT,
4409         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
4410              MSR_VMX_BASIC_TRUE_CTLS,
4411         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
4412              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
4413              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
4414         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
4415              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
4416              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
4417              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
4418              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
4419              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
4420              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
4421         .features[FEAT_VMX_EXIT_CTLS] =
4422              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
4423              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
4424              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
4425              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
4426              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
4427         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
4428              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
4429         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
4430              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
4431              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
4432         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
4433              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
4434              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
4435              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
4436              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
4437              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
4438              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
4439              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
4440              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
4441              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
4442              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
4443              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
4444         .features[FEAT_VMX_SECONDARY_CTLS] =
4445              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
4446              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
4447              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
4448              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
4449              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
4450              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
4451              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
4452              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
4453              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
4454              VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
4455         .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
4456         .xlevel = 0x80000008,
4457         .model_id = "Intel Atom Processor (SnowRidge)",
4458         .versions = (X86CPUVersionDefinition[]) {
4459             { .version = 1 },
4460             {
4461                 .version = 2,
4462                 .props = (PropValue[]) {
4463                     { "mpx", "off" },
4464                     { "model-id", "Intel Atom Processor (Snowridge, no MPX)" },
4465                     { /* end of list */ },
4466                 },
4467             },
4468             {
4469                 .version = 3,
4470                 .note = "XSAVES, no MPX",
4471                 .props = (PropValue[]) {
4472                     { "xsaves", "on" },
4473                     { "vmx-xsaves", "on" },
4474                     { /* end of list */ },
4475                 },
4476             },
4477             {
4478                 .version = 4,
4479                 .note = "no split lock detect, no core-capability",
4480                 .props = (PropValue[]) {
4481                     { "split-lock-detect", "off" },
4482                     { "core-capability", "off" },
4483                     { /* end of list */ },
4484                 },
4485             },
4486             { /* end of list */ },
4487         },
4488     },
4489     {
4490         .name = "KnightsMill",
4491         .level = 0xd,
4492         .vendor = CPUID_VENDOR_INTEL,
4493         .family = 6,
4494         .model = 133,
4495         .stepping = 0,
4496         .features[FEAT_1_EDX] =
4497             CPUID_VME | CPUID_SS | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR |
4498             CPUID_MMX | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV |
4499             CPUID_MCA | CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC |
4500             CPUID_CX8 | CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC |
4501             CPUID_PSE | CPUID_DE | CPUID_FP87,
4502         .features[FEAT_1_ECX] =
4503             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
4504             CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
4505             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
4506             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
4507             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
4508             CPUID_EXT_F16C | CPUID_EXT_RDRAND,
4509         .features[FEAT_8000_0001_EDX] =
4510             CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
4511             CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
4512         .features[FEAT_8000_0001_ECX] =
4513             CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
4514         .features[FEAT_7_0_EBX] =
4515             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4516             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
4517             CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_AVX512F |
4518             CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_AVX512PF |
4519             CPUID_7_0_EBX_AVX512ER,
4520         .features[FEAT_7_0_ECX] =
4521             CPUID_7_0_ECX_AVX512_VPOPCNTDQ,
4522         .features[FEAT_7_0_EDX] =
4523             CPUID_7_0_EDX_AVX512_4VNNIW | CPUID_7_0_EDX_AVX512_4FMAPS,
4524         .features[FEAT_XSAVE] =
4525             CPUID_XSAVE_XSAVEOPT,
4526         .features[FEAT_6_EAX] =
4527             CPUID_6_EAX_ARAT,
4528         .xlevel = 0x80000008,
4529         .model_id = "Intel Xeon Phi Processor (Knights Mill)",
4530     },
4531     {
4532         .name = "Opteron_G1",
4533         .level = 5,
4534         .vendor = CPUID_VENDOR_AMD,
4535         .family = 15,
4536         .model = 6,
4537         .stepping = 1,
4538         .features[FEAT_1_EDX] =
4539             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4540             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4541             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4542             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4543             CPUID_DE | CPUID_FP87,
4544         .features[FEAT_1_ECX] =
4545             CPUID_EXT_SSE3,
4546         .features[FEAT_8000_0001_EDX] =
4547             CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
4548         .xlevel = 0x80000008,
4549         .model_id = "AMD Opteron 240 (Gen 1 Class Opteron)",
4550     },
4551     {
4552         .name = "Opteron_G2",
4553         .level = 5,
4554         .vendor = CPUID_VENDOR_AMD,
4555         .family = 15,
4556         .model = 6,
4557         .stepping = 1,
4558         .features[FEAT_1_EDX] =
4559             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4560             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4561             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4562             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4563             CPUID_DE | CPUID_FP87,
4564         .features[FEAT_1_ECX] =
4565             CPUID_EXT_CX16 | CPUID_EXT_SSE3,
4566         .features[FEAT_8000_0001_EDX] =
4567             CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
4568         .features[FEAT_8000_0001_ECX] =
4569             CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
4570         .xlevel = 0x80000008,
4571         .model_id = "AMD Opteron 22xx (Gen 2 Class Opteron)",
4572     },
4573     {
4574         .name = "Opteron_G3",
4575         .level = 5,
4576         .vendor = CPUID_VENDOR_AMD,
4577         .family = 16,
4578         .model = 2,
4579         .stepping = 3,
4580         .features[FEAT_1_EDX] =
4581             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4582             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4583             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4584             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4585             CPUID_DE | CPUID_FP87,
4586         .features[FEAT_1_ECX] =
4587             CPUID_EXT_POPCNT | CPUID_EXT_CX16 | CPUID_EXT_MONITOR |
4588             CPUID_EXT_SSE3,
4589         .features[FEAT_8000_0001_EDX] =
4590             CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL |
4591             CPUID_EXT2_RDTSCP,
4592         .features[FEAT_8000_0001_ECX] =
4593             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A |
4594             CPUID_EXT3_ABM | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
4595         .xlevel = 0x80000008,
4596         .model_id = "AMD Opteron 23xx (Gen 3 Class Opteron)",
4597     },
4598     {
4599         .name = "Opteron_G4",
4600         .level = 0xd,
4601         .vendor = CPUID_VENDOR_AMD,
4602         .family = 21,
4603         .model = 1,
4604         .stepping = 2,
4605         .features[FEAT_1_EDX] =
4606             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4607             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4608             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4609             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4610             CPUID_DE | CPUID_FP87,
4611         .features[FEAT_1_ECX] =
4612             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
4613             CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4614             CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
4615             CPUID_EXT_SSE3,
4616         .features[FEAT_8000_0001_EDX] =
4617             CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
4618             CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
4619         .features[FEAT_8000_0001_ECX] =
4620             CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
4621             CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
4622             CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
4623             CPUID_EXT3_LAHF_LM,
4624         .features[FEAT_SVM] =
4625             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4626         /* no xsaveopt! */
4627         .xlevel = 0x8000001A,
4628         .model_id = "AMD Opteron 62xx class CPU",
4629     },
4630     {
4631         .name = "Opteron_G5",
4632         .level = 0xd,
4633         .vendor = CPUID_VENDOR_AMD,
4634         .family = 21,
4635         .model = 2,
4636         .stepping = 0,
4637         .features[FEAT_1_EDX] =
4638             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4639             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4640             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4641             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4642             CPUID_DE | CPUID_FP87,
4643         .features[FEAT_1_ECX] =
4644             CPUID_EXT_F16C | CPUID_EXT_AVX | CPUID_EXT_XSAVE |
4645             CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
4646             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_FMA |
4647             CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
4648         .features[FEAT_8000_0001_EDX] =
4649             CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
4650             CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
4651         .features[FEAT_8000_0001_ECX] =
4652             CPUID_EXT3_TBM | CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
4653             CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
4654             CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
4655             CPUID_EXT3_LAHF_LM,
4656         .features[FEAT_SVM] =
4657             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4658         /* no xsaveopt! */
4659         .xlevel = 0x8000001A,
4660         .model_id = "AMD Opteron 63xx class CPU",
4661     },
4662     {
4663         .name = "EPYC",
4664         .level = 0xd,
4665         .vendor = CPUID_VENDOR_AMD,
4666         .family = 23,
4667         .model = 1,
4668         .stepping = 2,
4669         .features[FEAT_1_EDX] =
4670             CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
4671             CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
4672             CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
4673             CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
4674             CPUID_VME | CPUID_FP87,
4675         .features[FEAT_1_ECX] =
4676             CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
4677             CPUID_EXT_XSAVE | CPUID_EXT_AES |  CPUID_EXT_POPCNT |
4678             CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4679             CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
4680             CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
4681         .features[FEAT_8000_0001_EDX] =
4682             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
4683             CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
4684             CPUID_EXT2_SYSCALL,
4685         .features[FEAT_8000_0001_ECX] =
4686             CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
4687             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
4688             CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
4689             CPUID_EXT3_TOPOEXT,
4690         .features[FEAT_7_0_EBX] =
4691             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4692             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
4693             CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
4694             CPUID_7_0_EBX_SHA_NI,
4695         .features[FEAT_XSAVE] =
4696             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4697             CPUID_XSAVE_XGETBV1,
4698         .features[FEAT_6_EAX] =
4699             CPUID_6_EAX_ARAT,
4700         .features[FEAT_SVM] =
4701             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4702         .xlevel = 0x8000001E,
4703         .model_id = "AMD EPYC Processor",
4704         .cache_info = &epyc_cache_info,
4705         .versions = (X86CPUVersionDefinition[]) {
4706             { .version = 1 },
4707             {
4708                 .version = 2,
4709                 .alias = "EPYC-IBPB",
4710                 .props = (PropValue[]) {
4711                     { "ibpb", "on" },
4712                     { "model-id",
4713                       "AMD EPYC Processor (with IBPB)" },
4714                     { /* end of list */ }
4715                 }
4716             },
4717             {
4718                 .version = 3,
4719                 .props = (PropValue[]) {
4720                     { "ibpb", "on" },
4721                     { "perfctr-core", "on" },
4722                     { "clzero", "on" },
4723                     { "xsaveerptr", "on" },
4724                     { "xsaves", "on" },
4725                     { "model-id",
4726                       "AMD EPYC Processor" },
4727                     { /* end of list */ }
4728                 }
4729             },
4730             {
4731                 .version = 4,
4732                 .props = (PropValue[]) {
4733                     { "model-id",
4734                       "AMD EPYC-v4 Processor" },
4735                     { /* end of list */ }
4736                 },
4737                 .cache_info = &epyc_v4_cache_info
4738             },
4739             { /* end of list */ }
4740         }
4741     },
4742     {
4743         .name = "Dhyana",
4744         .level = 0xd,
4745         .vendor = CPUID_VENDOR_HYGON,
4746         .family = 24,
4747         .model = 0,
4748         .stepping = 1,
4749         .features[FEAT_1_EDX] =
4750             CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
4751             CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
4752             CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
4753             CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
4754             CPUID_VME | CPUID_FP87,
4755         .features[FEAT_1_ECX] =
4756             CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
4757             CPUID_EXT_XSAVE | CPUID_EXT_POPCNT |
4758             CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4759             CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
4760             CPUID_EXT_MONITOR | CPUID_EXT_SSE3,
4761         .features[FEAT_8000_0001_EDX] =
4762             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
4763             CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
4764             CPUID_EXT2_SYSCALL,
4765         .features[FEAT_8000_0001_ECX] =
4766             CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
4767             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
4768             CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
4769             CPUID_EXT3_TOPOEXT,
4770         .features[FEAT_8000_0008_EBX] =
4771             CPUID_8000_0008_EBX_IBPB,
4772         .features[FEAT_7_0_EBX] =
4773             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4774             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
4775             CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT,
4776         /* XSAVES is added in version 2 */
4777         .features[FEAT_XSAVE] =
4778             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4779             CPUID_XSAVE_XGETBV1,
4780         .features[FEAT_6_EAX] =
4781             CPUID_6_EAX_ARAT,
4782         .features[FEAT_SVM] =
4783             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4784         .xlevel = 0x8000001E,
4785         .model_id = "Hygon Dhyana Processor",
4786         .cache_info = &epyc_cache_info,
4787         .versions = (X86CPUVersionDefinition[]) {
4788             { .version = 1 },
4789             { .version = 2,
4790               .note = "XSAVES",
4791               .props = (PropValue[]) {
4792                   { "xsaves", "on" },
4793                   { /* end of list */ }
4794               },
4795             },
4796             { /* end of list */ }
4797         }
4798     },
4799     {
4800         .name = "EPYC-Rome",
4801         .level = 0xd,
4802         .vendor = CPUID_VENDOR_AMD,
4803         .family = 23,
4804         .model = 49,
4805         .stepping = 0,
4806         .features[FEAT_1_EDX] =
4807             CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
4808             CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
4809             CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
4810             CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
4811             CPUID_VME | CPUID_FP87,
4812         .features[FEAT_1_ECX] =
4813             CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
4814             CPUID_EXT_XSAVE | CPUID_EXT_AES |  CPUID_EXT_POPCNT |
4815             CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4816             CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
4817             CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
4818         .features[FEAT_8000_0001_EDX] =
4819             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
4820             CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
4821             CPUID_EXT2_SYSCALL,
4822         .features[FEAT_8000_0001_ECX] =
4823             CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
4824             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
4825             CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
4826             CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
4827         .features[FEAT_8000_0008_EBX] =
4828             CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
4829             CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
4830             CPUID_8000_0008_EBX_STIBP,
4831         .features[FEAT_7_0_EBX] =
4832             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4833             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
4834             CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
4835             CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_CLWB,
4836         .features[FEAT_7_0_ECX] =
4837             CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_RDPID,
4838         .features[FEAT_XSAVE] =
4839             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4840             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
4841         .features[FEAT_6_EAX] =
4842             CPUID_6_EAX_ARAT,
4843         .features[FEAT_SVM] =
4844             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4845         .xlevel = 0x8000001E,
4846         .model_id = "AMD EPYC-Rome Processor",
4847         .cache_info = &epyc_rome_cache_info,
4848         .versions = (X86CPUVersionDefinition[]) {
4849             { .version = 1 },
4850             {
4851                 .version = 2,
4852                 .props = (PropValue[]) {
4853                     { "ibrs", "on" },
4854                     { "amd-ssbd", "on" },
4855                     { /* end of list */ }
4856                 }
4857             },
4858             {
4859                 .version = 3,
4860                 .props = (PropValue[]) {
4861                     { "model-id",
4862                       "AMD EPYC-Rome-v3 Processor" },
4863                     { /* end of list */ }
4864                 },
4865                 .cache_info = &epyc_rome_v3_cache_info
4866             },
4867             {
4868                 .version = 4,
4869                 .props = (PropValue[]) {
4870                     /* Erratum 1386 */
4871                     { "model-id",
4872                       "AMD EPYC-Rome-v4 Processor (no XSAVES)" },
4873                     { "xsaves", "off" },
4874                     { /* end of list */ }
4875                 },
4876             },
4877             { /* end of list */ }
4878         }
4879     },
4880     {
4881         .name = "EPYC-Milan",
4882         .level = 0xd,
4883         .vendor = CPUID_VENDOR_AMD,
4884         .family = 25,
4885         .model = 1,
4886         .stepping = 1,
4887         .features[FEAT_1_EDX] =
4888             CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
4889             CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
4890             CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
4891             CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
4892             CPUID_VME | CPUID_FP87,
4893         .features[FEAT_1_ECX] =
4894             CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
4895             CPUID_EXT_XSAVE | CPUID_EXT_AES |  CPUID_EXT_POPCNT |
4896             CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4897             CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
4898             CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
4899             CPUID_EXT_PCID,
4900         .features[FEAT_8000_0001_EDX] =
4901             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
4902             CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
4903             CPUID_EXT2_SYSCALL,
4904         .features[FEAT_8000_0001_ECX] =
4905             CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
4906             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
4907             CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
4908             CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
4909         .features[FEAT_8000_0008_EBX] =
4910             CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
4911             CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
4912             CPUID_8000_0008_EBX_IBRS | CPUID_8000_0008_EBX_STIBP |
4913             CPUID_8000_0008_EBX_AMD_SSBD,
4914         .features[FEAT_7_0_EBX] =
4915             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4916             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
4917             CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
4918             CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_ERMS |
4919             CPUID_7_0_EBX_INVPCID,
4920         .features[FEAT_7_0_ECX] =
4921             CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_PKU,
4922         .features[FEAT_7_0_EDX] =
4923             CPUID_7_0_EDX_FSRM,
4924         .features[FEAT_XSAVE] =
4925             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
4926             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
4927         .features[FEAT_6_EAX] =
4928             CPUID_6_EAX_ARAT,
4929         .features[FEAT_SVM] =
4930             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE | CPUID_SVM_SVME_ADDR_CHK,
4931         .xlevel = 0x8000001E,
4932         .model_id = "AMD EPYC-Milan Processor",
4933         .cache_info = &epyc_milan_cache_info,
4934         .versions = (X86CPUVersionDefinition[]) {
4935             { .version = 1 },
4936             {
4937                 .version = 2,
4938                 .props = (PropValue[]) {
4939                     { "model-id",
4940                       "AMD EPYC-Milan-v2 Processor" },
4941                     { "vaes", "on" },
4942                     { "vpclmulqdq", "on" },
4943                     { "stibp-always-on", "on" },
4944                     { "amd-psfd", "on" },
4945                     { "no-nested-data-bp", "on" },
4946                     { "lfence-always-serializing", "on" },
4947                     { "null-sel-clr-base", "on" },
4948                     { /* end of list */ }
4949                 },
4950                 .cache_info = &epyc_milan_v2_cache_info
4951             },
4952             { /* end of list */ }
4953         }
4954     },
4955     {
4956         .name = "EPYC-Genoa",
4957         .level = 0xd,
4958         .vendor = CPUID_VENDOR_AMD,
4959         .family = 25,
4960         .model = 17,
4961         .stepping = 0,
4962         .features[FEAT_1_EDX] =
4963             CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
4964             CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
4965             CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
4966             CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
4967             CPUID_VME | CPUID_FP87,
4968         .features[FEAT_1_ECX] =
4969             CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
4970             CPUID_EXT_XSAVE | CPUID_EXT_AES |  CPUID_EXT_POPCNT |
4971             CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4972             CPUID_EXT_PCID | CPUID_EXT_CX16 | CPUID_EXT_FMA |
4973             CPUID_EXT_SSSE3 | CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ |
4974             CPUID_EXT_SSE3,
4975         .features[FEAT_8000_0001_EDX] =
4976             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
4977             CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
4978             CPUID_EXT2_SYSCALL,
4979         .features[FEAT_8000_0001_ECX] =
4980             CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
4981             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
4982             CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
4983             CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
4984         .features[FEAT_8000_0008_EBX] =
4985             CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
4986             CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
4987             CPUID_8000_0008_EBX_IBRS | CPUID_8000_0008_EBX_STIBP |
4988             CPUID_8000_0008_EBX_STIBP_ALWAYS_ON |
4989             CPUID_8000_0008_EBX_AMD_SSBD | CPUID_8000_0008_EBX_AMD_PSFD,
4990         .features[FEAT_8000_0021_EAX] =
4991             CPUID_8000_0021_EAX_No_NESTED_DATA_BP |
4992             CPUID_8000_0021_EAX_LFENCE_ALWAYS_SERIALIZING |
4993             CPUID_8000_0021_EAX_NULL_SEL_CLR_BASE |
4994             CPUID_8000_0021_EAX_AUTO_IBRS,
4995         .features[FEAT_7_0_EBX] =
4996             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4997             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
4998             CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_AVX512F |
4999             CPUID_7_0_EBX_AVX512DQ | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
5000             CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_AVX512IFMA |
5001             CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_CLWB |
5002             CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_SHA_NI |
5003             CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512VL,
5004         .features[FEAT_7_0_ECX] =
5005             CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
5006             CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
5007             CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
5008             CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
5009             CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57 |
5010             CPUID_7_0_ECX_RDPID,
5011         .features[FEAT_7_0_EDX] =
5012             CPUID_7_0_EDX_FSRM,
5013         .features[FEAT_7_1_EAX] =
5014             CPUID_7_1_EAX_AVX512_BF16,
5015         .features[FEAT_XSAVE] =
5016             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
5017             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
5018         .features[FEAT_6_EAX] =
5019             CPUID_6_EAX_ARAT,
5020         .features[FEAT_SVM] =
5021             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE | CPUID_SVM_VNMI |
5022             CPUID_SVM_SVME_ADDR_CHK,
5023         .xlevel = 0x80000022,
5024         .model_id = "AMD EPYC-Genoa Processor",
5025         .cache_info = &epyc_genoa_cache_info,
5026     },
5027 };
5028 
5029 /*
5030  * We resolve CPU model aliases using -v1 when using "-machine
5031  * none", but this is just for compatibility while libvirt isn't
5032  * adapted to resolve CPU model versions before creating VMs.
5033  * See "Runnability guarantee of CPU models" at
5034  * docs/about/deprecated.rst.
5035  */
5036 X86CPUVersion default_cpu_version = 1;
5037 
5038 void x86_cpu_set_default_version(X86CPUVersion version)
5039 {
5040     /* Translating CPU_VERSION_AUTO to CPU_VERSION_AUTO doesn't make sense */
5041     assert(version != CPU_VERSION_AUTO);
5042     default_cpu_version = version;
5043 }
5044 
5045 static X86CPUVersion x86_cpu_model_last_version(const X86CPUModel *model)
5046 {
5047     int v = 0;
5048     const X86CPUVersionDefinition *vdef =
5049         x86_cpu_def_get_versions(model->cpudef);
5050     while (vdef->version) {
5051         v = vdef->version;
5052         vdef++;
5053     }
5054     return v;
5055 }
5056 
5057 /* Return the actual version being used for a specific CPU model */
5058 static X86CPUVersion x86_cpu_model_resolve_version(const X86CPUModel *model)
5059 {
5060     X86CPUVersion v = model->version;
5061     if (v == CPU_VERSION_AUTO) {
5062         v = default_cpu_version;
5063     }
5064     if (v == CPU_VERSION_LATEST) {
5065         return x86_cpu_model_last_version(model);
5066     }
5067     return v;
5068 }
5069 
5070 static Property max_x86_cpu_properties[] = {
5071     DEFINE_PROP_BOOL("migratable", X86CPU, migratable, true),
5072     DEFINE_PROP_BOOL("host-cache-info", X86CPU, cache_info_passthrough, false),
5073     DEFINE_PROP_END_OF_LIST()
5074 };
5075 
5076 static void max_x86_cpu_realize(DeviceState *dev, Error **errp)
5077 {
5078     Object *obj = OBJECT(dev);
5079 
5080     if (!object_property_get_int(obj, "family", &error_abort)) {
5081         if (X86_CPU(obj)->env.features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
5082             object_property_set_int(obj, "family", 15, &error_abort);
5083             object_property_set_int(obj, "model", 107, &error_abort);
5084             object_property_set_int(obj, "stepping", 1, &error_abort);
5085         } else {
5086             object_property_set_int(obj, "family", 6, &error_abort);
5087             object_property_set_int(obj, "model", 6, &error_abort);
5088             object_property_set_int(obj, "stepping", 3, &error_abort);
5089         }
5090     }
5091 
5092     x86_cpu_realizefn(dev, errp);
5093 }
5094 
5095 static void max_x86_cpu_class_init(ObjectClass *oc, void *data)
5096 {
5097     DeviceClass *dc = DEVICE_CLASS(oc);
5098     X86CPUClass *xcc = X86_CPU_CLASS(oc);
5099 
5100     xcc->ordering = 9;
5101 
5102     xcc->model_description =
5103         "Enables all features supported by the accelerator in the current host";
5104 
5105     device_class_set_props(dc, max_x86_cpu_properties);
5106     dc->realize = max_x86_cpu_realize;
5107 }
5108 
5109 static void max_x86_cpu_initfn(Object *obj)
5110 {
5111     X86CPU *cpu = X86_CPU(obj);
5112 
5113     /* We can't fill the features array here because we don't know yet if
5114      * "migratable" is true or false.
5115      */
5116     cpu->max_features = true;
5117     object_property_set_bool(OBJECT(cpu), "pmu", true, &error_abort);
5118 
5119     /*
5120      * these defaults are used for TCG and all other accelerators
5121      * besides KVM and HVF, which overwrite these values
5122      */
5123     object_property_set_str(OBJECT(cpu), "vendor", CPUID_VENDOR_AMD,
5124                             &error_abort);
5125     object_property_set_str(OBJECT(cpu), "model-id",
5126                             "QEMU TCG CPU version " QEMU_HW_VERSION,
5127                             &error_abort);
5128 }
5129 
5130 static const TypeInfo max_x86_cpu_type_info = {
5131     .name = X86_CPU_TYPE_NAME("max"),
5132     .parent = TYPE_X86_CPU,
5133     .instance_init = max_x86_cpu_initfn,
5134     .class_init = max_x86_cpu_class_init,
5135 };
5136 
5137 static char *feature_word_description(FeatureWordInfo *f, uint32_t bit)
5138 {
5139     assert(f->type == CPUID_FEATURE_WORD || f->type == MSR_FEATURE_WORD);
5140 
5141     switch (f->type) {
5142     case CPUID_FEATURE_WORD:
5143         {
5144             const char *reg = get_register_name_32(f->cpuid.reg);
5145             assert(reg);
5146             return g_strdup_printf("CPUID.%02XH:%s",
5147                                    f->cpuid.eax, reg);
5148         }
5149     case MSR_FEATURE_WORD:
5150         return g_strdup_printf("MSR(%02XH)",
5151                                f->msr.index);
5152     }
5153 
5154     return NULL;
5155 }
5156 
5157 static bool x86_cpu_have_filtered_features(X86CPU *cpu)
5158 {
5159     FeatureWord w;
5160 
5161     for (w = 0; w < FEATURE_WORDS; w++) {
5162         if (cpu->filtered_features[w]) {
5163             return true;
5164         }
5165     }
5166 
5167     return false;
5168 }
5169 
5170 static void mark_unavailable_features(X86CPU *cpu, FeatureWord w, uint64_t mask,
5171                                       const char *verbose_prefix)
5172 {
5173     CPUX86State *env = &cpu->env;
5174     FeatureWordInfo *f = &feature_word_info[w];
5175     int i;
5176 
5177     if (!cpu->force_features) {
5178         env->features[w] &= ~mask;
5179     }
5180     cpu->filtered_features[w] |= mask;
5181 
5182     if (!verbose_prefix) {
5183         return;
5184     }
5185 
5186     for (i = 0; i < 64; ++i) {
5187         if ((1ULL << i) & mask) {
5188             g_autofree char *feat_word_str = feature_word_description(f, i);
5189             warn_report("%s: %s%s%s [bit %d]",
5190                         verbose_prefix,
5191                         feat_word_str,
5192                         f->feat_names[i] ? "." : "",
5193                         f->feat_names[i] ? f->feat_names[i] : "", i);
5194         }
5195     }
5196 }
5197 
5198 static void x86_cpuid_version_get_family(Object *obj, Visitor *v,
5199                                          const char *name, void *opaque,
5200                                          Error **errp)
5201 {
5202     X86CPU *cpu = X86_CPU(obj);
5203     CPUX86State *env = &cpu->env;
5204     int64_t value;
5205 
5206     value = (env->cpuid_version >> 8) & 0xf;
5207     if (value == 0xf) {
5208         value += (env->cpuid_version >> 20) & 0xff;
5209     }
5210     visit_type_int(v, name, &value, errp);
5211 }
5212 
5213 static void x86_cpuid_version_set_family(Object *obj, Visitor *v,
5214                                          const char *name, void *opaque,
5215                                          Error **errp)
5216 {
5217     X86CPU *cpu = X86_CPU(obj);
5218     CPUX86State *env = &cpu->env;
5219     const int64_t min = 0;
5220     const int64_t max = 0xff + 0xf;
5221     int64_t value;
5222 
5223     if (!visit_type_int(v, name, &value, errp)) {
5224         return;
5225     }
5226     if (value < min || value > max) {
5227         error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
5228                    name ? name : "null", value, min, max);
5229         return;
5230     }
5231 
5232     env->cpuid_version &= ~0xff00f00;
5233     if (value > 0x0f) {
5234         env->cpuid_version |= 0xf00 | ((value - 0x0f) << 20);
5235     } else {
5236         env->cpuid_version |= value << 8;
5237     }
5238 }
5239 
5240 static void x86_cpuid_version_get_model(Object *obj, Visitor *v,
5241                                         const char *name, void *opaque,
5242                                         Error **errp)
5243 {
5244     X86CPU *cpu = X86_CPU(obj);
5245     CPUX86State *env = &cpu->env;
5246     int64_t value;
5247 
5248     value = (env->cpuid_version >> 4) & 0xf;
5249     value |= ((env->cpuid_version >> 16) & 0xf) << 4;
5250     visit_type_int(v, name, &value, errp);
5251 }
5252 
5253 static void x86_cpuid_version_set_model(Object *obj, Visitor *v,
5254                                         const char *name, void *opaque,
5255                                         Error **errp)
5256 {
5257     X86CPU *cpu = X86_CPU(obj);
5258     CPUX86State *env = &cpu->env;
5259     const int64_t min = 0;
5260     const int64_t max = 0xff;
5261     int64_t value;
5262 
5263     if (!visit_type_int(v, name, &value, errp)) {
5264         return;
5265     }
5266     if (value < min || value > max) {
5267         error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
5268                    name ? name : "null", value, min, max);
5269         return;
5270     }
5271 
5272     env->cpuid_version &= ~0xf00f0;
5273     env->cpuid_version |= ((value & 0xf) << 4) | ((value >> 4) << 16);
5274 }
5275 
5276 static void x86_cpuid_version_get_stepping(Object *obj, Visitor *v,
5277                                            const char *name, void *opaque,
5278                                            Error **errp)
5279 {
5280     X86CPU *cpu = X86_CPU(obj);
5281     CPUX86State *env = &cpu->env;
5282     int64_t value;
5283 
5284     value = env->cpuid_version & 0xf;
5285     visit_type_int(v, name, &value, errp);
5286 }
5287 
5288 static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v,
5289                                            const char *name, void *opaque,
5290                                            Error **errp)
5291 {
5292     X86CPU *cpu = X86_CPU(obj);
5293     CPUX86State *env = &cpu->env;
5294     const int64_t min = 0;
5295     const int64_t max = 0xf;
5296     int64_t value;
5297 
5298     if (!visit_type_int(v, name, &value, errp)) {
5299         return;
5300     }
5301     if (value < min || value > max) {
5302         error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
5303                    name ? name : "null", value, min, max);
5304         return;
5305     }
5306 
5307     env->cpuid_version &= ~0xf;
5308     env->cpuid_version |= value & 0xf;
5309 }
5310 
5311 static char *x86_cpuid_get_vendor(Object *obj, Error **errp)
5312 {
5313     X86CPU *cpu = X86_CPU(obj);
5314     CPUX86State *env = &cpu->env;
5315     char *value;
5316 
5317     value = g_malloc(CPUID_VENDOR_SZ + 1);
5318     x86_cpu_vendor_words2str(value, env->cpuid_vendor1, env->cpuid_vendor2,
5319                              env->cpuid_vendor3);
5320     return value;
5321 }
5322 
5323 static void x86_cpuid_set_vendor(Object *obj, const char *value,
5324                                  Error **errp)
5325 {
5326     X86CPU *cpu = X86_CPU(obj);
5327     CPUX86State *env = &cpu->env;
5328     int i;
5329 
5330     if (strlen(value) != CPUID_VENDOR_SZ) {
5331         error_setg(errp, "value of property 'vendor' must consist of"
5332                    " exactly " stringify(CPUID_VENDOR_SZ) " characters");
5333         return;
5334     }
5335 
5336     env->cpuid_vendor1 = 0;
5337     env->cpuid_vendor2 = 0;
5338     env->cpuid_vendor3 = 0;
5339     for (i = 0; i < 4; i++) {
5340         env->cpuid_vendor1 |= ((uint8_t)value[i    ]) << (8 * i);
5341         env->cpuid_vendor2 |= ((uint8_t)value[i + 4]) << (8 * i);
5342         env->cpuid_vendor3 |= ((uint8_t)value[i + 8]) << (8 * i);
5343     }
5344 }
5345 
5346 static char *x86_cpuid_get_model_id(Object *obj, Error **errp)
5347 {
5348     X86CPU *cpu = X86_CPU(obj);
5349     CPUX86State *env = &cpu->env;
5350     char *value;
5351     int i;
5352 
5353     value = g_malloc(48 + 1);
5354     for (i = 0; i < 48; i++) {
5355         value[i] = env->cpuid_model[i >> 2] >> (8 * (i & 3));
5356     }
5357     value[48] = '\0';
5358     return value;
5359 }
5360 
5361 static void x86_cpuid_set_model_id(Object *obj, const char *model_id,
5362                                    Error **errp)
5363 {
5364     X86CPU *cpu = X86_CPU(obj);
5365     CPUX86State *env = &cpu->env;
5366     int c, len, i;
5367 
5368     if (model_id == NULL) {
5369         model_id = "";
5370     }
5371     len = strlen(model_id);
5372     memset(env->cpuid_model, 0, 48);
5373     for (i = 0; i < 48; i++) {
5374         if (i >= len) {
5375             c = '\0';
5376         } else {
5377             c = (uint8_t)model_id[i];
5378         }
5379         env->cpuid_model[i >> 2] |= c << (8 * (i & 3));
5380     }
5381 }
5382 
5383 static void x86_cpuid_get_tsc_freq(Object *obj, Visitor *v, const char *name,
5384                                    void *opaque, Error **errp)
5385 {
5386     X86CPU *cpu = X86_CPU(obj);
5387     int64_t value;
5388 
5389     value = cpu->env.tsc_khz * 1000;
5390     visit_type_int(v, name, &value, errp);
5391 }
5392 
5393 static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name,
5394                                    void *opaque, Error **errp)
5395 {
5396     X86CPU *cpu = X86_CPU(obj);
5397     const int64_t min = 0;
5398     const int64_t max = INT64_MAX;
5399     int64_t value;
5400 
5401     if (!visit_type_int(v, name, &value, errp)) {
5402         return;
5403     }
5404     if (value < min || value > max) {
5405         error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
5406                    name ? name : "null", value, min, max);
5407         return;
5408     }
5409 
5410     cpu->env.tsc_khz = cpu->env.user_tsc_khz = value / 1000;
5411 }
5412 
5413 /* Generic getter for "feature-words" and "filtered-features" properties */
5414 static void x86_cpu_get_feature_words(Object *obj, Visitor *v,
5415                                       const char *name, void *opaque,
5416                                       Error **errp)
5417 {
5418     uint64_t *array = (uint64_t *)opaque;
5419     FeatureWord w;
5420     X86CPUFeatureWordInfo word_infos[FEATURE_WORDS] = { };
5421     X86CPUFeatureWordInfoList list_entries[FEATURE_WORDS] = { };
5422     X86CPUFeatureWordInfoList *list = NULL;
5423 
5424     for (w = 0; w < FEATURE_WORDS; w++) {
5425         FeatureWordInfo *wi = &feature_word_info[w];
5426         /*
5427                 * We didn't have MSR features when "feature-words" was
5428                 *  introduced. Therefore skipped other type entries.
5429                 */
5430         if (wi->type != CPUID_FEATURE_WORD) {
5431             continue;
5432         }
5433         X86CPUFeatureWordInfo *qwi = &word_infos[w];
5434         qwi->cpuid_input_eax = wi->cpuid.eax;
5435         qwi->has_cpuid_input_ecx = wi->cpuid.needs_ecx;
5436         qwi->cpuid_input_ecx = wi->cpuid.ecx;
5437         qwi->cpuid_register = x86_reg_info_32[wi->cpuid.reg].qapi_enum;
5438         qwi->features = array[w];
5439 
5440         /* List will be in reverse order, but order shouldn't matter */
5441         list_entries[w].next = list;
5442         list_entries[w].value = &word_infos[w];
5443         list = &list_entries[w];
5444     }
5445 
5446     visit_type_X86CPUFeatureWordInfoList(v, "feature-words", &list, errp);
5447 }
5448 
5449 /* Convert all '_' in a feature string option name to '-', to make feature
5450  * name conform to QOM property naming rule, which uses '-' instead of '_'.
5451  */
5452 static inline void feat2prop(char *s)
5453 {
5454     while ((s = strchr(s, '_'))) {
5455         *s = '-';
5456     }
5457 }
5458 
5459 /* Return the feature property name for a feature flag bit */
5460 static const char *x86_cpu_feature_name(FeatureWord w, int bitnr)
5461 {
5462     const char *name;
5463     /* XSAVE components are automatically enabled by other features,
5464      * so return the original feature name instead
5465      */
5466     if (w == FEAT_XSAVE_XCR0_LO || w == FEAT_XSAVE_XCR0_HI) {
5467         int comp = (w == FEAT_XSAVE_XCR0_HI) ? bitnr + 32 : bitnr;
5468 
5469         if (comp < ARRAY_SIZE(x86_ext_save_areas) &&
5470             x86_ext_save_areas[comp].bits) {
5471             w = x86_ext_save_areas[comp].feature;
5472             bitnr = ctz32(x86_ext_save_areas[comp].bits);
5473         }
5474     }
5475 
5476     assert(bitnr < 64);
5477     assert(w < FEATURE_WORDS);
5478     name = feature_word_info[w].feat_names[bitnr];
5479     assert(bitnr < 32 || !(name && feature_word_info[w].type == CPUID_FEATURE_WORD));
5480     return name;
5481 }
5482 
5483 /* Compatibility hack to maintain legacy +-feat semantic,
5484  * where +-feat overwrites any feature set by
5485  * feat=on|feat even if the later is parsed after +-feat
5486  * (i.e. "-x2apic,x2apic=on" will result in x2apic disabled)
5487  */
5488 static GList *plus_features, *minus_features;
5489 
5490 static gint compare_string(gconstpointer a, gconstpointer b)
5491 {
5492     return g_strcmp0(a, b);
5493 }
5494 
5495 /* Parse "+feature,-feature,feature=foo" CPU feature string
5496  */
5497 static void x86_cpu_parse_featurestr(const char *typename, char *features,
5498                                      Error **errp)
5499 {
5500     char *featurestr; /* Single 'key=value" string being parsed */
5501     static bool cpu_globals_initialized;
5502     bool ambiguous = false;
5503 
5504     if (cpu_globals_initialized) {
5505         return;
5506     }
5507     cpu_globals_initialized = true;
5508 
5509     if (!features) {
5510         return;
5511     }
5512 
5513     for (featurestr = strtok(features, ",");
5514          featurestr;
5515          featurestr = strtok(NULL, ",")) {
5516         const char *name;
5517         const char *val = NULL;
5518         char *eq = NULL;
5519         char num[32];
5520         GlobalProperty *prop;
5521 
5522         /* Compatibility syntax: */
5523         if (featurestr[0] == '+') {
5524             plus_features = g_list_append(plus_features,
5525                                           g_strdup(featurestr + 1));
5526             continue;
5527         } else if (featurestr[0] == '-') {
5528             minus_features = g_list_append(minus_features,
5529                                            g_strdup(featurestr + 1));
5530             continue;
5531         }
5532 
5533         eq = strchr(featurestr, '=');
5534         if (eq) {
5535             *eq++ = 0;
5536             val = eq;
5537         } else {
5538             val = "on";
5539         }
5540 
5541         feat2prop(featurestr);
5542         name = featurestr;
5543 
5544         if (g_list_find_custom(plus_features, name, compare_string)) {
5545             warn_report("Ambiguous CPU model string. "
5546                         "Don't mix both \"+%s\" and \"%s=%s\"",
5547                         name, name, val);
5548             ambiguous = true;
5549         }
5550         if (g_list_find_custom(minus_features, name, compare_string)) {
5551             warn_report("Ambiguous CPU model string. "
5552                         "Don't mix both \"-%s\" and \"%s=%s\"",
5553                         name, name, val);
5554             ambiguous = true;
5555         }
5556 
5557         /* Special case: */
5558         if (!strcmp(name, "tsc-freq")) {
5559             int ret;
5560             uint64_t tsc_freq;
5561 
5562             ret = qemu_strtosz_metric(val, NULL, &tsc_freq);
5563             if (ret < 0 || tsc_freq > INT64_MAX) {
5564                 error_setg(errp, "bad numerical value %s", val);
5565                 return;
5566             }
5567             snprintf(num, sizeof(num), "%" PRId64, tsc_freq);
5568             val = num;
5569             name = "tsc-frequency";
5570         }
5571 
5572         prop = g_new0(typeof(*prop), 1);
5573         prop->driver = typename;
5574         prop->property = g_strdup(name);
5575         prop->value = g_strdup(val);
5576         qdev_prop_register_global(prop);
5577     }
5578 
5579     if (ambiguous) {
5580         warn_report("Compatibility of ambiguous CPU model "
5581                     "strings won't be kept on future QEMU versions");
5582     }
5583 }
5584 
5585 static void x86_cpu_filter_features(X86CPU *cpu, bool verbose);
5586 
5587 /* Build a list with the name of all features on a feature word array */
5588 static void x86_cpu_list_feature_names(FeatureWordArray features,
5589                                        strList **list)
5590 {
5591     strList **tail = list;
5592     FeatureWord w;
5593 
5594     for (w = 0; w < FEATURE_WORDS; w++) {
5595         uint64_t filtered = features[w];
5596         int i;
5597         for (i = 0; i < 64; i++) {
5598             if (filtered & (1ULL << i)) {
5599                 QAPI_LIST_APPEND(tail, g_strdup(x86_cpu_feature_name(w, i)));
5600             }
5601         }
5602     }
5603 }
5604 
5605 static void x86_cpu_get_unavailable_features(Object *obj, Visitor *v,
5606                                              const char *name, void *opaque,
5607                                              Error **errp)
5608 {
5609     X86CPU *xc = X86_CPU(obj);
5610     strList *result = NULL;
5611 
5612     x86_cpu_list_feature_names(xc->filtered_features, &result);
5613     visit_type_strList(v, "unavailable-features", &result, errp);
5614 }
5615 
5616 /* Print all cpuid feature names in featureset
5617  */
5618 static void listflags(GList *features)
5619 {
5620     size_t len = 0;
5621     GList *tmp;
5622 
5623     for (tmp = features; tmp; tmp = tmp->next) {
5624         const char *name = tmp->data;
5625         if ((len + strlen(name) + 1) >= 75) {
5626             qemu_printf("\n");
5627             len = 0;
5628         }
5629         qemu_printf("%s%s", len == 0 ? "  " : " ", name);
5630         len += strlen(name) + 1;
5631     }
5632     qemu_printf("\n");
5633 }
5634 
5635 /* Sort alphabetically by type name, respecting X86CPUClass::ordering. */
5636 static gint x86_cpu_list_compare(gconstpointer a, gconstpointer b)
5637 {
5638     ObjectClass *class_a = (ObjectClass *)a;
5639     ObjectClass *class_b = (ObjectClass *)b;
5640     X86CPUClass *cc_a = X86_CPU_CLASS(class_a);
5641     X86CPUClass *cc_b = X86_CPU_CLASS(class_b);
5642     int ret;
5643 
5644     if (cc_a->ordering != cc_b->ordering) {
5645         ret = cc_a->ordering - cc_b->ordering;
5646     } else {
5647         g_autofree char *name_a = x86_cpu_class_get_model_name(cc_a);
5648         g_autofree char *name_b = x86_cpu_class_get_model_name(cc_b);
5649         ret = strcmp(name_a, name_b);
5650     }
5651     return ret;
5652 }
5653 
5654 static GSList *get_sorted_cpu_model_list(void)
5655 {
5656     GSList *list = object_class_get_list(TYPE_X86_CPU, false);
5657     list = g_slist_sort(list, x86_cpu_list_compare);
5658     return list;
5659 }
5660 
5661 static char *x86_cpu_class_get_model_id(X86CPUClass *xc)
5662 {
5663     Object *obj = object_new_with_class(OBJECT_CLASS(xc));
5664     char *r = object_property_get_str(obj, "model-id", &error_abort);
5665     object_unref(obj);
5666     return r;
5667 }
5668 
5669 static char *x86_cpu_class_get_alias_of(X86CPUClass *cc)
5670 {
5671     X86CPUVersion version;
5672 
5673     if (!cc->model || !cc->model->is_alias) {
5674         return NULL;
5675     }
5676     version = x86_cpu_model_resolve_version(cc->model);
5677     if (version <= 0) {
5678         return NULL;
5679     }
5680     return x86_cpu_versioned_model_name(cc->model->cpudef, version);
5681 }
5682 
5683 static void x86_cpu_list_entry(gpointer data, gpointer user_data)
5684 {
5685     ObjectClass *oc = data;
5686     X86CPUClass *cc = X86_CPU_CLASS(oc);
5687     g_autofree char *name = x86_cpu_class_get_model_name(cc);
5688     g_autofree char *desc = g_strdup(cc->model_description);
5689     g_autofree char *alias_of = x86_cpu_class_get_alias_of(cc);
5690     g_autofree char *model_id = x86_cpu_class_get_model_id(cc);
5691 
5692     if (!desc && alias_of) {
5693         if (cc->model && cc->model->version == CPU_VERSION_AUTO) {
5694             desc = g_strdup("(alias configured by machine type)");
5695         } else {
5696             desc = g_strdup_printf("(alias of %s)", alias_of);
5697         }
5698     }
5699     if (!desc && cc->model && cc->model->note) {
5700         desc = g_strdup_printf("%s [%s]", model_id, cc->model->note);
5701     }
5702     if (!desc) {
5703         desc = g_strdup_printf("%s", model_id);
5704     }
5705 
5706     if (cc->model && cc->model->cpudef->deprecation_note) {
5707         g_autofree char *olddesc = desc;
5708         desc = g_strdup_printf("%s (deprecated)", olddesc);
5709     }
5710 
5711     qemu_printf("x86 %-20s  %s\n", name, desc);
5712 }
5713 
5714 /* list available CPU models and flags */
5715 void x86_cpu_list(void)
5716 {
5717     int i, j;
5718     GSList *list;
5719     GList *names = NULL;
5720 
5721     qemu_printf("Available CPUs:\n");
5722     list = get_sorted_cpu_model_list();
5723     g_slist_foreach(list, x86_cpu_list_entry, NULL);
5724     g_slist_free(list);
5725 
5726     names = NULL;
5727     for (i = 0; i < ARRAY_SIZE(feature_word_info); i++) {
5728         FeatureWordInfo *fw = &feature_word_info[i];
5729         for (j = 0; j < 64; j++) {
5730             if (fw->feat_names[j]) {
5731                 names = g_list_append(names, (gpointer)fw->feat_names[j]);
5732             }
5733         }
5734     }
5735 
5736     names = g_list_sort(names, (GCompareFunc)strcmp);
5737 
5738     qemu_printf("\nRecognized CPUID flags:\n");
5739     listflags(names);
5740     qemu_printf("\n");
5741     g_list_free(names);
5742 }
5743 
5744 #ifndef CONFIG_USER_ONLY
5745 
5746 /* Check for missing features that may prevent the CPU class from
5747  * running using the current machine and accelerator.
5748  */
5749 static void x86_cpu_class_check_missing_features(X86CPUClass *xcc,
5750                                                  strList **list)
5751 {
5752     strList **tail = list;
5753     X86CPU *xc;
5754     Error *err = NULL;
5755 
5756     if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
5757         QAPI_LIST_APPEND(tail, g_strdup("kvm"));
5758         return;
5759     }
5760 
5761     xc = X86_CPU(object_new_with_class(OBJECT_CLASS(xcc)));
5762 
5763     x86_cpu_expand_features(xc, &err);
5764     if (err) {
5765         /* Errors at x86_cpu_expand_features should never happen,
5766          * but in case it does, just report the model as not
5767          * runnable at all using the "type" property.
5768          */
5769         QAPI_LIST_APPEND(tail, g_strdup("type"));
5770         error_free(err);
5771     }
5772 
5773     x86_cpu_filter_features(xc, false);
5774 
5775     x86_cpu_list_feature_names(xc->filtered_features, tail);
5776 
5777     object_unref(OBJECT(xc));
5778 }
5779 
5780 static void x86_cpu_definition_entry(gpointer data, gpointer user_data)
5781 {
5782     ObjectClass *oc = data;
5783     X86CPUClass *cc = X86_CPU_CLASS(oc);
5784     CpuDefinitionInfoList **cpu_list = user_data;
5785     CpuDefinitionInfo *info;
5786 
5787     info = g_malloc0(sizeof(*info));
5788     info->name = x86_cpu_class_get_model_name(cc);
5789     x86_cpu_class_check_missing_features(cc, &info->unavailable_features);
5790     info->has_unavailable_features = true;
5791     info->q_typename = g_strdup(object_class_get_name(oc));
5792     info->migration_safe = cc->migration_safe;
5793     info->has_migration_safe = true;
5794     info->q_static = cc->static_model;
5795     if (cc->model && cc->model->cpudef->deprecation_note) {
5796         info->deprecated = true;
5797     } else {
5798         info->deprecated = false;
5799     }
5800     /*
5801      * Old machine types won't report aliases, so that alias translation
5802      * doesn't break compatibility with previous QEMU versions.
5803      */
5804     if (default_cpu_version != CPU_VERSION_LEGACY) {
5805         info->alias_of = x86_cpu_class_get_alias_of(cc);
5806     }
5807 
5808     QAPI_LIST_PREPEND(*cpu_list, info);
5809 }
5810 
5811 CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
5812 {
5813     CpuDefinitionInfoList *cpu_list = NULL;
5814     GSList *list = get_sorted_cpu_model_list();
5815     g_slist_foreach(list, x86_cpu_definition_entry, &cpu_list);
5816     g_slist_free(list);
5817     return cpu_list;
5818 }
5819 
5820 #endif /* !CONFIG_USER_ONLY */
5821 
5822 uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
5823                                             bool migratable_only)
5824 {
5825     FeatureWordInfo *wi = &feature_word_info[w];
5826     uint64_t r = 0;
5827 
5828     if (kvm_enabled()) {
5829         switch (wi->type) {
5830         case CPUID_FEATURE_WORD:
5831             r = kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid.eax,
5832                                                         wi->cpuid.ecx,
5833                                                         wi->cpuid.reg);
5834             break;
5835         case MSR_FEATURE_WORD:
5836             r = kvm_arch_get_supported_msr_feature(kvm_state,
5837                         wi->msr.index);
5838             break;
5839         }
5840     } else if (hvf_enabled()) {
5841         if (wi->type != CPUID_FEATURE_WORD) {
5842             return 0;
5843         }
5844         r = hvf_get_supported_cpuid(wi->cpuid.eax,
5845                                     wi->cpuid.ecx,
5846                                     wi->cpuid.reg);
5847     } else if (tcg_enabled()) {
5848         r = wi->tcg_features;
5849     } else {
5850         return ~0;
5851     }
5852 #ifndef TARGET_X86_64
5853     if (w == FEAT_8000_0001_EDX) {
5854         /*
5855          * 32-bit TCG can emulate 64-bit compatibility mode.  If there is no
5856          * way for userspace to get out of its 32-bit jail, we can leave
5857          * the LM bit set.
5858          */
5859         uint32_t unavail = tcg_enabled()
5860             ? CPUID_EXT2_LM & ~CPUID_EXT2_KERNEL_FEATURES
5861             : CPUID_EXT2_LM;
5862         r &= ~unavail;
5863     }
5864 #endif
5865     if (migratable_only) {
5866         r &= x86_cpu_get_migratable_flags(w);
5867     }
5868     return r;
5869 }
5870 
5871 static void x86_cpu_get_supported_cpuid(uint32_t func, uint32_t index,
5872                                         uint32_t *eax, uint32_t *ebx,
5873                                         uint32_t *ecx, uint32_t *edx)
5874 {
5875     if (kvm_enabled()) {
5876         *eax = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EAX);
5877         *ebx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EBX);
5878         *ecx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_ECX);
5879         *edx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EDX);
5880     } else if (hvf_enabled()) {
5881         *eax = hvf_get_supported_cpuid(func, index, R_EAX);
5882         *ebx = hvf_get_supported_cpuid(func, index, R_EBX);
5883         *ecx = hvf_get_supported_cpuid(func, index, R_ECX);
5884         *edx = hvf_get_supported_cpuid(func, index, R_EDX);
5885     } else {
5886         *eax = 0;
5887         *ebx = 0;
5888         *ecx = 0;
5889         *edx = 0;
5890     }
5891 }
5892 
5893 static void x86_cpu_get_cache_cpuid(uint32_t func, uint32_t index,
5894                                     uint32_t *eax, uint32_t *ebx,
5895                                     uint32_t *ecx, uint32_t *edx)
5896 {
5897     uint32_t level, unused;
5898 
5899     /* Only return valid host leaves.  */
5900     switch (func) {
5901     case 2:
5902     case 4:
5903         host_cpuid(0, 0, &level, &unused, &unused, &unused);
5904         break;
5905     case 0x80000005:
5906     case 0x80000006:
5907     case 0x8000001d:
5908         host_cpuid(0x80000000, 0, &level, &unused, &unused, &unused);
5909         break;
5910     default:
5911         return;
5912     }
5913 
5914     if (func > level) {
5915         *eax = 0;
5916         *ebx = 0;
5917         *ecx = 0;
5918         *edx = 0;
5919     } else {
5920         host_cpuid(func, index, eax, ebx, ecx, edx);
5921     }
5922 }
5923 
5924 /*
5925  * Only for builtin_x86_defs models initialized with x86_register_cpudef_types.
5926  */
5927 void x86_cpu_apply_props(X86CPU *cpu, PropValue *props)
5928 {
5929     PropValue *pv;
5930     for (pv = props; pv->prop; pv++) {
5931         if (!pv->value) {
5932             continue;
5933         }
5934         object_property_parse(OBJECT(cpu), pv->prop, pv->value,
5935                               &error_abort);
5936     }
5937 }
5938 
5939 /*
5940  * Apply properties for the CPU model version specified in model.
5941  * Only for builtin_x86_defs models initialized with x86_register_cpudef_types.
5942  */
5943 
5944 static void x86_cpu_apply_version_props(X86CPU *cpu, X86CPUModel *model)
5945 {
5946     const X86CPUVersionDefinition *vdef;
5947     X86CPUVersion version = x86_cpu_model_resolve_version(model);
5948 
5949     if (version == CPU_VERSION_LEGACY) {
5950         return;
5951     }
5952 
5953     for (vdef = x86_cpu_def_get_versions(model->cpudef); vdef->version; vdef++) {
5954         PropValue *p;
5955 
5956         for (p = vdef->props; p && p->prop; p++) {
5957             object_property_parse(OBJECT(cpu), p->prop, p->value,
5958                                   &error_abort);
5959         }
5960 
5961         if (vdef->version == version) {
5962             break;
5963         }
5964     }
5965 
5966     /*
5967      * If we reached the end of the list, version number was invalid
5968      */
5969     assert(vdef->version == version);
5970 }
5971 
5972 static const CPUCaches *x86_cpu_get_versioned_cache_info(X86CPU *cpu,
5973                                                          X86CPUModel *model)
5974 {
5975     const X86CPUVersionDefinition *vdef;
5976     X86CPUVersion version = x86_cpu_model_resolve_version(model);
5977     const CPUCaches *cache_info = model->cpudef->cache_info;
5978 
5979     if (version == CPU_VERSION_LEGACY) {
5980         return cache_info;
5981     }
5982 
5983     for (vdef = x86_cpu_def_get_versions(model->cpudef); vdef->version; vdef++) {
5984         if (vdef->cache_info) {
5985             cache_info = vdef->cache_info;
5986         }
5987 
5988         if (vdef->version == version) {
5989             break;
5990         }
5991     }
5992 
5993     assert(vdef->version == version);
5994     return cache_info;
5995 }
5996 
5997 /*
5998  * Load data from X86CPUDefinition into a X86CPU object.
5999  * Only for builtin_x86_defs models initialized with x86_register_cpudef_types.
6000  */
6001 static void x86_cpu_load_model(X86CPU *cpu, X86CPUModel *model)
6002 {
6003     const X86CPUDefinition *def = model->cpudef;
6004     CPUX86State *env = &cpu->env;
6005     FeatureWord w;
6006 
6007     /*NOTE: any property set by this function should be returned by
6008      * x86_cpu_static_props(), so static expansion of
6009      * query-cpu-model-expansion is always complete.
6010      */
6011 
6012     /* CPU models only set _minimum_ values for level/xlevel: */
6013     object_property_set_uint(OBJECT(cpu), "min-level", def->level,
6014                              &error_abort);
6015     object_property_set_uint(OBJECT(cpu), "min-xlevel", def->xlevel,
6016                              &error_abort);
6017 
6018     object_property_set_int(OBJECT(cpu), "family", def->family, &error_abort);
6019     object_property_set_int(OBJECT(cpu), "model", def->model, &error_abort);
6020     object_property_set_int(OBJECT(cpu), "stepping", def->stepping,
6021                             &error_abort);
6022     object_property_set_str(OBJECT(cpu), "model-id", def->model_id,
6023                             &error_abort);
6024     for (w = 0; w < FEATURE_WORDS; w++) {
6025         env->features[w] = def->features[w];
6026     }
6027 
6028     /* legacy-cache defaults to 'off' if CPU model provides cache info */
6029     cpu->legacy_cache = !x86_cpu_get_versioned_cache_info(cpu, model);
6030 
6031     env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR;
6032 
6033     /* sysenter isn't supported in compatibility mode on AMD,
6034      * syscall isn't supported in compatibility mode on Intel.
6035      * Normally we advertise the actual CPU vendor, but you can
6036      * override this using the 'vendor' property if you want to use
6037      * KVM's sysenter/syscall emulation in compatibility mode and
6038      * when doing cross vendor migration
6039      */
6040 
6041     /*
6042      * vendor property is set here but then overloaded with the
6043      * host cpu vendor for KVM and HVF.
6044      */
6045     object_property_set_str(OBJECT(cpu), "vendor", def->vendor, &error_abort);
6046 
6047     x86_cpu_apply_version_props(cpu, model);
6048 
6049     /*
6050      * Properties in versioned CPU model are not user specified features.
6051      * We can simply clear env->user_features here since it will be filled later
6052      * in x86_cpu_expand_features() based on plus_features and minus_features.
6053      */
6054     memset(&env->user_features, 0, sizeof(env->user_features));
6055 }
6056 
6057 static const gchar *x86_gdb_arch_name(CPUState *cs)
6058 {
6059 #ifdef TARGET_X86_64
6060     return "i386:x86-64";
6061 #else
6062     return "i386";
6063 #endif
6064 }
6065 
6066 static void x86_cpu_cpudef_class_init(ObjectClass *oc, void *data)
6067 {
6068     X86CPUModel *model = data;
6069     X86CPUClass *xcc = X86_CPU_CLASS(oc);
6070     CPUClass *cc = CPU_CLASS(oc);
6071 
6072     xcc->model = model;
6073     xcc->migration_safe = true;
6074     cc->deprecation_note = model->cpudef->deprecation_note;
6075 }
6076 
6077 static void x86_register_cpu_model_type(const char *name, X86CPUModel *model)
6078 {
6079     g_autofree char *typename = x86_cpu_type_name(name);
6080     TypeInfo ti = {
6081         .name = typename,
6082         .parent = TYPE_X86_CPU,
6083         .class_init = x86_cpu_cpudef_class_init,
6084         .class_data = model,
6085     };
6086 
6087     type_register(&ti);
6088 }
6089 
6090 
6091 /*
6092  * register builtin_x86_defs;
6093  * "max", "base" and subclasses ("host") are not registered here.
6094  * See x86_cpu_register_types for all model registrations.
6095  */
6096 static void x86_register_cpudef_types(const X86CPUDefinition *def)
6097 {
6098     X86CPUModel *m;
6099     const X86CPUVersionDefinition *vdef;
6100 
6101     /* AMD aliases are handled at runtime based on CPUID vendor, so
6102      * they shouldn't be set on the CPU model table.
6103      */
6104     assert(!(def->features[FEAT_8000_0001_EDX] & CPUID_EXT2_AMD_ALIASES));
6105     /* catch mistakes instead of silently truncating model_id when too long */
6106     assert(def->model_id && strlen(def->model_id) <= 48);
6107 
6108     /* Unversioned model: */
6109     m = g_new0(X86CPUModel, 1);
6110     m->cpudef = def;
6111     m->version = CPU_VERSION_AUTO;
6112     m->is_alias = true;
6113     x86_register_cpu_model_type(def->name, m);
6114 
6115     /* Versioned models: */
6116 
6117     for (vdef = x86_cpu_def_get_versions(def); vdef->version; vdef++) {
6118         g_autofree char *name =
6119             x86_cpu_versioned_model_name(def, vdef->version);
6120 
6121         m = g_new0(X86CPUModel, 1);
6122         m->cpudef = def;
6123         m->version = vdef->version;
6124         m->note = vdef->note;
6125         x86_register_cpu_model_type(name, m);
6126 
6127         if (vdef->alias) {
6128             X86CPUModel *am = g_new0(X86CPUModel, 1);
6129             am->cpudef = def;
6130             am->version = vdef->version;
6131             am->is_alias = true;
6132             x86_register_cpu_model_type(vdef->alias, am);
6133         }
6134     }
6135 
6136 }
6137 
6138 uint32_t cpu_x86_virtual_addr_width(CPUX86State *env)
6139 {
6140     if  (env->features[FEAT_7_0_ECX] & CPUID_7_0_ECX_LA57) {
6141         return 57; /* 57 bits virtual */
6142     } else {
6143         return 48; /* 48 bits virtual */
6144     }
6145 }
6146 
6147 void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
6148                    uint32_t *eax, uint32_t *ebx,
6149                    uint32_t *ecx, uint32_t *edx)
6150 {
6151     X86CPU *cpu = env_archcpu(env);
6152     CPUState *cs = env_cpu(env);
6153     uint32_t die_offset;
6154     uint32_t limit;
6155     uint32_t signature[3];
6156     X86CPUTopoInfo topo_info;
6157 
6158     topo_info.dies_per_pkg = env->nr_dies;
6159     topo_info.cores_per_die = cs->nr_cores / env->nr_dies;
6160     topo_info.threads_per_core = cs->nr_threads;
6161 
6162     /* Calculate & apply limits for different index ranges */
6163     if (index >= 0xC0000000) {
6164         limit = env->cpuid_xlevel2;
6165     } else if (index >= 0x80000000) {
6166         limit = env->cpuid_xlevel;
6167     } else if (index >= 0x40000000) {
6168         limit = 0x40000001;
6169     } else {
6170         limit = env->cpuid_level;
6171     }
6172 
6173     if (index > limit) {
6174         /* Intel documentation states that invalid EAX input will
6175          * return the same information as EAX=cpuid_level
6176          * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID)
6177          */
6178         index = env->cpuid_level;
6179     }
6180 
6181     switch(index) {
6182     case 0:
6183         *eax = env->cpuid_level;
6184         *ebx = env->cpuid_vendor1;
6185         *edx = env->cpuid_vendor2;
6186         *ecx = env->cpuid_vendor3;
6187         break;
6188     case 1:
6189         *eax = env->cpuid_version;
6190         *ebx = (cpu->apic_id << 24) |
6191                8 << 8; /* CLFLUSH size in quad words, Linux wants it. */
6192         *ecx = env->features[FEAT_1_ECX];
6193         if ((*ecx & CPUID_EXT_XSAVE) && (env->cr[4] & CR4_OSXSAVE_MASK)) {
6194             *ecx |= CPUID_EXT_OSXSAVE;
6195         }
6196         *edx = env->features[FEAT_1_EDX];
6197         if (cs->nr_cores * cs->nr_threads > 1) {
6198             *ebx |= (cs->nr_cores * cs->nr_threads) << 16;
6199             *edx |= CPUID_HT;
6200         }
6201         if (!cpu->enable_pmu) {
6202             *ecx &= ~CPUID_EXT_PDCM;
6203         }
6204         break;
6205     case 2:
6206         /* cache info: needed for Pentium Pro compatibility */
6207         if (cpu->cache_info_passthrough) {
6208             x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
6209             break;
6210         } else if (cpu->vendor_cpuid_only && IS_AMD_CPU(env)) {
6211             *eax = *ebx = *ecx = *edx = 0;
6212             break;
6213         }
6214         *eax = 1; /* Number of CPUID[EAX=2] calls required */
6215         *ebx = 0;
6216         if (!cpu->enable_l3_cache) {
6217             *ecx = 0;
6218         } else {
6219             *ecx = cpuid2_cache_descriptor(env->cache_info_cpuid2.l3_cache);
6220         }
6221         *edx = (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1d_cache) << 16) |
6222                (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1i_cache) <<  8) |
6223                (cpuid2_cache_descriptor(env->cache_info_cpuid2.l2_cache));
6224         break;
6225     case 4:
6226         /* cache info: needed for Core compatibility */
6227         if (cpu->cache_info_passthrough) {
6228             x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx);
6229             /*
6230              * QEMU has its own number of cores/logical cpus,
6231              * set 24..14, 31..26 bit to configured values
6232              */
6233             if (*eax & 31) {
6234                 int host_vcpus_per_cache = 1 + ((*eax & 0x3FFC000) >> 14);
6235                 int vcpus_per_socket = cs->nr_cores * cs->nr_threads;
6236                 if (cs->nr_cores > 1) {
6237                     *eax &= ~0xFC000000;
6238                     *eax |= (pow2ceil(cs->nr_cores) - 1) << 26;
6239                 }
6240                 if (host_vcpus_per_cache > vcpus_per_socket) {
6241                     *eax &= ~0x3FFC000;
6242                     *eax |= (pow2ceil(vcpus_per_socket) - 1) << 14;
6243                 }
6244             }
6245         } else if (cpu->vendor_cpuid_only && IS_AMD_CPU(env)) {
6246             *eax = *ebx = *ecx = *edx = 0;
6247         } else {
6248             *eax = 0;
6249             switch (count) {
6250             case 0: /* L1 dcache info */
6251                 encode_cache_cpuid4(env->cache_info_cpuid4.l1d_cache,
6252                                     1, cs->nr_cores,
6253                                     eax, ebx, ecx, edx);
6254                 break;
6255             case 1: /* L1 icache info */
6256                 encode_cache_cpuid4(env->cache_info_cpuid4.l1i_cache,
6257                                     1, cs->nr_cores,
6258                                     eax, ebx, ecx, edx);
6259                 break;
6260             case 2: /* L2 cache info */
6261                 encode_cache_cpuid4(env->cache_info_cpuid4.l2_cache,
6262                                     cs->nr_threads, cs->nr_cores,
6263                                     eax, ebx, ecx, edx);
6264                 break;
6265             case 3: /* L3 cache info */
6266                 die_offset = apicid_die_offset(&topo_info);
6267                 if (cpu->enable_l3_cache) {
6268                     encode_cache_cpuid4(env->cache_info_cpuid4.l3_cache,
6269                                         (1 << die_offset), cs->nr_cores,
6270                                         eax, ebx, ecx, edx);
6271                     break;
6272                 }
6273                 /* fall through */
6274             default: /* end of info */
6275                 *eax = *ebx = *ecx = *edx = 0;
6276                 break;
6277             }
6278         }
6279         break;
6280     case 5:
6281         /* MONITOR/MWAIT Leaf */
6282         *eax = cpu->mwait.eax; /* Smallest monitor-line size in bytes */
6283         *ebx = cpu->mwait.ebx; /* Largest monitor-line size in bytes */
6284         *ecx = cpu->mwait.ecx; /* flags */
6285         *edx = cpu->mwait.edx; /* mwait substates */
6286         break;
6287     case 6:
6288         /* Thermal and Power Leaf */
6289         *eax = env->features[FEAT_6_EAX];
6290         *ebx = 0;
6291         *ecx = 0;
6292         *edx = 0;
6293         break;
6294     case 7:
6295         /* Structured Extended Feature Flags Enumeration Leaf */
6296         if (count == 0) {
6297             uint32_t eax_0_unused, ebx_0, ecx_0, edx_0_unused;
6298 
6299             /* Maximum ECX value for sub-leaves */
6300             *eax = env->cpuid_level_func7;
6301             *ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */
6302             *ecx = env->features[FEAT_7_0_ECX]; /* Feature flags */
6303             if ((*ecx & CPUID_7_0_ECX_PKU) && env->cr[4] & CR4_PKE_MASK) {
6304                 *ecx |= CPUID_7_0_ECX_OSPKE;
6305             }
6306             *edx = env->features[FEAT_7_0_EDX]; /* Feature flags */
6307 
6308             /*
6309              * SGX cannot be emulated in software.  If hardware does not
6310              * support enabling SGX and/or SGX flexible launch control,
6311              * then we need to update the VM's CPUID values accordingly.
6312              */
6313             x86_cpu_get_supported_cpuid(0x7, 0,
6314                                         &eax_0_unused, &ebx_0,
6315                                         &ecx_0, &edx_0_unused);
6316             if ((*ebx & CPUID_7_0_EBX_SGX) && !(ebx_0 & CPUID_7_0_EBX_SGX)) {
6317                 *ebx &= ~CPUID_7_0_EBX_SGX;
6318             }
6319 
6320             if ((*ecx & CPUID_7_0_ECX_SGX_LC)
6321                     && (!(*ebx & CPUID_7_0_EBX_SGX) || !(ecx_0 & CPUID_7_0_ECX_SGX_LC))) {
6322                 *ecx &= ~CPUID_7_0_ECX_SGX_LC;
6323             }
6324         } else if (count == 1) {
6325             *eax = env->features[FEAT_7_1_EAX];
6326             *edx = env->features[FEAT_7_1_EDX];
6327             *ebx = 0;
6328             *ecx = 0;
6329         } else if (count == 2) {
6330             *edx = env->features[FEAT_7_2_EDX];
6331             *eax = 0;
6332             *ebx = 0;
6333             *ecx = 0;
6334         } else {
6335             *eax = 0;
6336             *ebx = 0;
6337             *ecx = 0;
6338             *edx = 0;
6339         }
6340         break;
6341     case 9:
6342         /* Direct Cache Access Information Leaf */
6343         *eax = 0; /* Bits 0-31 in DCA_CAP MSR */
6344         *ebx = 0;
6345         *ecx = 0;
6346         *edx = 0;
6347         break;
6348     case 0xA:
6349         /* Architectural Performance Monitoring Leaf */
6350         if (cpu->enable_pmu) {
6351             x86_cpu_get_supported_cpuid(0xA, count, eax, ebx, ecx, edx);
6352         } else {
6353             *eax = 0;
6354             *ebx = 0;
6355             *ecx = 0;
6356             *edx = 0;
6357         }
6358         break;
6359     case 0xB:
6360         /* Extended Topology Enumeration Leaf */
6361         if (!cpu->enable_cpuid_0xb) {
6362                 *eax = *ebx = *ecx = *edx = 0;
6363                 break;
6364         }
6365 
6366         *ecx = count & 0xff;
6367         *edx = cpu->apic_id;
6368 
6369         switch (count) {
6370         case 0:
6371             *eax = apicid_core_offset(&topo_info);
6372             *ebx = cs->nr_threads;
6373             *ecx |= CPUID_TOPOLOGY_LEVEL_SMT;
6374             break;
6375         case 1:
6376             *eax = apicid_pkg_offset(&topo_info);
6377             *ebx = cs->nr_cores * cs->nr_threads;
6378             *ecx |= CPUID_TOPOLOGY_LEVEL_CORE;
6379             break;
6380         default:
6381             *eax = 0;
6382             *ebx = 0;
6383             *ecx |= CPUID_TOPOLOGY_LEVEL_INVALID;
6384         }
6385 
6386         assert(!(*eax & ~0x1f));
6387         *ebx &= 0xffff; /* The count doesn't need to be reliable. */
6388         break;
6389     case 0x1C:
6390         if (cpu->enable_pmu && (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR)) {
6391             x86_cpu_get_supported_cpuid(0x1C, 0, eax, ebx, ecx, edx);
6392             *edx = 0;
6393         }
6394         break;
6395     case 0x1F:
6396         /* V2 Extended Topology Enumeration Leaf */
6397         if (env->nr_dies < 2) {
6398             *eax = *ebx = *ecx = *edx = 0;
6399             break;
6400         }
6401 
6402         *ecx = count & 0xff;
6403         *edx = cpu->apic_id;
6404         switch (count) {
6405         case 0:
6406             *eax = apicid_core_offset(&topo_info);
6407             *ebx = cs->nr_threads;
6408             *ecx |= CPUID_TOPOLOGY_LEVEL_SMT;
6409             break;
6410         case 1:
6411             *eax = apicid_die_offset(&topo_info);
6412             *ebx = topo_info.cores_per_die * topo_info.threads_per_core;
6413             *ecx |= CPUID_TOPOLOGY_LEVEL_CORE;
6414             break;
6415         case 2:
6416             *eax = apicid_pkg_offset(&topo_info);
6417             *ebx = cs->nr_cores * cs->nr_threads;
6418             *ecx |= CPUID_TOPOLOGY_LEVEL_DIE;
6419             break;
6420         default:
6421             *eax = 0;
6422             *ebx = 0;
6423             *ecx |= CPUID_TOPOLOGY_LEVEL_INVALID;
6424         }
6425         assert(!(*eax & ~0x1f));
6426         *ebx &= 0xffff; /* The count doesn't need to be reliable. */
6427         break;
6428     case 0xD: {
6429         /* Processor Extended State */
6430         *eax = 0;
6431         *ebx = 0;
6432         *ecx = 0;
6433         *edx = 0;
6434         if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
6435             break;
6436         }
6437 
6438         if (count == 0) {
6439             *ecx = xsave_area_size(x86_cpu_xsave_xcr0_components(cpu), false);
6440             *eax = env->features[FEAT_XSAVE_XCR0_LO];
6441             *edx = env->features[FEAT_XSAVE_XCR0_HI];
6442             /*
6443              * The initial value of xcr0 and ebx == 0, On host without kvm
6444              * commit 412a3c41(e.g., CentOS 6), the ebx's value always == 0
6445              * even through guest update xcr0, this will crash some legacy guest
6446              * (e.g., CentOS 6), So set ebx == ecx to workaround it.
6447              */
6448             *ebx = kvm_enabled() ? *ecx : xsave_area_size(env->xcr0, false);
6449         } else if (count == 1) {
6450             uint64_t xstate = x86_cpu_xsave_xcr0_components(cpu) |
6451                               x86_cpu_xsave_xss_components(cpu);
6452 
6453             *eax = env->features[FEAT_XSAVE];
6454             *ebx = xsave_area_size(xstate, true);
6455             *ecx = env->features[FEAT_XSAVE_XSS_LO];
6456             *edx = env->features[FEAT_XSAVE_XSS_HI];
6457             if (kvm_enabled() && cpu->enable_pmu &&
6458                 (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR) &&
6459                 (*eax & CPUID_XSAVE_XSAVES)) {
6460                 *ecx |= XSTATE_ARCH_LBR_MASK;
6461             } else {
6462                 *ecx &= ~XSTATE_ARCH_LBR_MASK;
6463             }
6464         } else if (count == 0xf && cpu->enable_pmu
6465                    && (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR)) {
6466             x86_cpu_get_supported_cpuid(0xD, count, eax, ebx, ecx, edx);
6467         } else if (count < ARRAY_SIZE(x86_ext_save_areas)) {
6468             const ExtSaveArea *esa = &x86_ext_save_areas[count];
6469 
6470             if (x86_cpu_xsave_xcr0_components(cpu) & (1ULL << count)) {
6471                 *eax = esa->size;
6472                 *ebx = esa->offset;
6473                 *ecx = esa->ecx &
6474                        (ESA_FEATURE_ALIGN64_MASK | ESA_FEATURE_XFD_MASK);
6475             } else if (x86_cpu_xsave_xss_components(cpu) & (1ULL << count)) {
6476                 *eax = esa->size;
6477                 *ebx = 0;
6478                 *ecx = 1;
6479             }
6480         }
6481         break;
6482     }
6483     case 0x12:
6484 #ifndef CONFIG_USER_ONLY
6485         if (!kvm_enabled() ||
6486             !(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_SGX)) {
6487             *eax = *ebx = *ecx = *edx = 0;
6488             break;
6489         }
6490 
6491         /*
6492          * SGX sub-leafs CPUID.0x12.{0x2..N} enumerate EPC sections.  Retrieve
6493          * the EPC properties, e.g. confidentiality and integrity, from the
6494          * host's first EPC section, i.e. assume there is one EPC section or
6495          * that all EPC sections have the same security properties.
6496          */
6497         if (count > 1) {
6498             uint64_t epc_addr, epc_size;
6499 
6500             if (sgx_epc_get_section(count - 2, &epc_addr, &epc_size)) {
6501                 *eax = *ebx = *ecx = *edx = 0;
6502                 break;
6503             }
6504             host_cpuid(index, 2, eax, ebx, ecx, edx);
6505             *eax = (uint32_t)(epc_addr & 0xfffff000) | 0x1;
6506             *ebx = (uint32_t)(epc_addr >> 32);
6507             *ecx = (uint32_t)(epc_size & 0xfffff000) | (*ecx & 0xf);
6508             *edx = (uint32_t)(epc_size >> 32);
6509             break;
6510         }
6511 
6512         /*
6513          * SGX sub-leafs CPUID.0x12.{0x0,0x1} are heavily dependent on hardware
6514          * and KVM, i.e. QEMU cannot emulate features to override what KVM
6515          * supports.  Features can be further restricted by userspace, but not
6516          * made more permissive.
6517          */
6518         x86_cpu_get_supported_cpuid(0x12, count, eax, ebx, ecx, edx);
6519 
6520         if (count == 0) {
6521             *eax &= env->features[FEAT_SGX_12_0_EAX];
6522             *ebx &= env->features[FEAT_SGX_12_0_EBX];
6523         } else {
6524             *eax &= env->features[FEAT_SGX_12_1_EAX];
6525             *ebx &= 0; /* ebx reserve */
6526             *ecx &= env->features[FEAT_XSAVE_XCR0_LO];
6527             *edx &= env->features[FEAT_XSAVE_XCR0_HI];
6528 
6529             /* FP and SSE are always allowed regardless of XSAVE/XCR0. */
6530             *ecx |= XSTATE_FP_MASK | XSTATE_SSE_MASK;
6531 
6532             /* Access to PROVISIONKEY requires additional credentials. */
6533             if ((*eax & (1U << 4)) &&
6534                 !kvm_enable_sgx_provisioning(cs->kvm_state)) {
6535                 *eax &= ~(1U << 4);
6536             }
6537         }
6538 #endif
6539         break;
6540     case 0x14: {
6541         /* Intel Processor Trace Enumeration */
6542         *eax = 0;
6543         *ebx = 0;
6544         *ecx = 0;
6545         *edx = 0;
6546         if (!(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) ||
6547             !kvm_enabled()) {
6548             break;
6549         }
6550 
6551         /*
6552          * If these are changed, they should stay in sync with
6553          * x86_cpu_filter_features().
6554          */
6555         if (count == 0) {
6556             *eax = INTEL_PT_MAX_SUBLEAF;
6557             *ebx = INTEL_PT_MINIMAL_EBX;
6558             *ecx = INTEL_PT_MINIMAL_ECX;
6559             if (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP) {
6560                 *ecx |= CPUID_14_0_ECX_LIP;
6561             }
6562         } else if (count == 1) {
6563             *eax = INTEL_PT_MTC_BITMAP | INTEL_PT_ADDR_RANGES_NUM;
6564             *ebx = INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP;
6565         }
6566         break;
6567     }
6568     case 0x1D: {
6569         /* AMX TILE, for now hardcoded for Sapphire Rapids*/
6570         *eax = 0;
6571         *ebx = 0;
6572         *ecx = 0;
6573         *edx = 0;
6574         if (!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE)) {
6575             break;
6576         }
6577 
6578         if (count == 0) {
6579             /* Highest numbered palette subleaf */
6580             *eax = INTEL_AMX_TILE_MAX_SUBLEAF;
6581         } else if (count == 1) {
6582             *eax = INTEL_AMX_TOTAL_TILE_BYTES |
6583                    (INTEL_AMX_BYTES_PER_TILE << 16);
6584             *ebx = INTEL_AMX_BYTES_PER_ROW | (INTEL_AMX_TILE_MAX_NAMES << 16);
6585             *ecx = INTEL_AMX_TILE_MAX_ROWS;
6586         }
6587         break;
6588     }
6589     case 0x1E: {
6590         /* AMX TMUL, for now hardcoded for Sapphire Rapids */
6591         *eax = 0;
6592         *ebx = 0;
6593         *ecx = 0;
6594         *edx = 0;
6595         if (!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE)) {
6596             break;
6597         }
6598 
6599         if (count == 0) {
6600             /* Highest numbered palette subleaf */
6601             *ebx = INTEL_AMX_TMUL_MAX_K | (INTEL_AMX_TMUL_MAX_N << 8);
6602         }
6603         break;
6604     }
6605     case 0x40000000:
6606         /*
6607          * CPUID code in kvm_arch_init_vcpu() ignores stuff
6608          * set here, but we restrict to TCG none the less.
6609          */
6610         if (tcg_enabled() && cpu->expose_tcg) {
6611             memcpy(signature, "TCGTCGTCGTCG", 12);
6612             *eax = 0x40000001;
6613             *ebx = signature[0];
6614             *ecx = signature[1];
6615             *edx = signature[2];
6616         } else {
6617             *eax = 0;
6618             *ebx = 0;
6619             *ecx = 0;
6620             *edx = 0;
6621         }
6622         break;
6623     case 0x40000001:
6624         *eax = 0;
6625         *ebx = 0;
6626         *ecx = 0;
6627         *edx = 0;
6628         break;
6629     case 0x80000000:
6630         *eax = env->cpuid_xlevel;
6631         *ebx = env->cpuid_vendor1;
6632         *edx = env->cpuid_vendor2;
6633         *ecx = env->cpuid_vendor3;
6634         break;
6635     case 0x80000001:
6636         *eax = env->cpuid_version;
6637         *ebx = 0;
6638         *ecx = env->features[FEAT_8000_0001_ECX];
6639         *edx = env->features[FEAT_8000_0001_EDX];
6640 
6641         /* The Linux kernel checks for the CMPLegacy bit and
6642          * discards multiple thread information if it is set.
6643          * So don't set it here for Intel to make Linux guests happy.
6644          */
6645         if (cs->nr_cores * cs->nr_threads > 1) {
6646             if (env->cpuid_vendor1 != CPUID_VENDOR_INTEL_1 ||
6647                 env->cpuid_vendor2 != CPUID_VENDOR_INTEL_2 ||
6648                 env->cpuid_vendor3 != CPUID_VENDOR_INTEL_3) {
6649                 *ecx |= 1 << 1;    /* CmpLegacy bit */
6650             }
6651         }
6652         if (tcg_enabled() && env->cpuid_vendor1 == CPUID_VENDOR_INTEL_1 &&
6653             !(env->hflags & HF_LMA_MASK)) {
6654             *edx &= ~CPUID_EXT2_SYSCALL;
6655         }
6656         break;
6657     case 0x80000002:
6658     case 0x80000003:
6659     case 0x80000004:
6660         *eax = env->cpuid_model[(index - 0x80000002) * 4 + 0];
6661         *ebx = env->cpuid_model[(index - 0x80000002) * 4 + 1];
6662         *ecx = env->cpuid_model[(index - 0x80000002) * 4 + 2];
6663         *edx = env->cpuid_model[(index - 0x80000002) * 4 + 3];
6664         break;
6665     case 0x80000005:
6666         /* cache info (L1 cache) */
6667         if (cpu->cache_info_passthrough) {
6668             x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
6669             break;
6670         }
6671         *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) |
6672                (L1_ITLB_2M_ASSOC <<  8) | (L1_ITLB_2M_ENTRIES);
6673         *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) |
6674                (L1_ITLB_4K_ASSOC <<  8) | (L1_ITLB_4K_ENTRIES);
6675         *ecx = encode_cache_cpuid80000005(env->cache_info_amd.l1d_cache);
6676         *edx = encode_cache_cpuid80000005(env->cache_info_amd.l1i_cache);
6677         break;
6678     case 0x80000006:
6679         /* cache info (L2 cache) */
6680         if (cpu->cache_info_passthrough) {
6681             x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
6682             break;
6683         }
6684         *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) |
6685                (L2_DTLB_2M_ENTRIES << 16) |
6686                (AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) |
6687                (L2_ITLB_2M_ENTRIES);
6688         *ebx = (AMD_ENC_ASSOC(L2_DTLB_4K_ASSOC) << 28) |
6689                (L2_DTLB_4K_ENTRIES << 16) |
6690                (AMD_ENC_ASSOC(L2_ITLB_4K_ASSOC) << 12) |
6691                (L2_ITLB_4K_ENTRIES);
6692         encode_cache_cpuid80000006(env->cache_info_amd.l2_cache,
6693                                    cpu->enable_l3_cache ?
6694                                    env->cache_info_amd.l3_cache : NULL,
6695                                    ecx, edx);
6696         break;
6697     case 0x80000007:
6698         *eax = 0;
6699         *ebx = 0;
6700         *ecx = 0;
6701         *edx = env->features[FEAT_8000_0007_EDX];
6702         break;
6703     case 0x80000008:
6704         /* virtual & phys address size in low 2 bytes. */
6705         *eax = cpu->phys_bits;
6706         if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
6707             /* 64 bit processor */
6708              *eax |= (cpu_x86_virtual_addr_width(env) << 8);
6709              *eax |= (cpu->guest_phys_bits << 16);
6710         }
6711         *ebx = env->features[FEAT_8000_0008_EBX];
6712         if (cs->nr_cores * cs->nr_threads > 1) {
6713             /*
6714              * Bits 15:12 is "The number of bits in the initial
6715              * Core::X86::Apic::ApicId[ApicId] value that indicate
6716              * thread ID within a package".
6717              * Bits 7:0 is "The number of threads in the package is NC+1"
6718              */
6719             *ecx = (apicid_pkg_offset(&topo_info) << 12) |
6720                    ((cs->nr_cores * cs->nr_threads) - 1);
6721         } else {
6722             *ecx = 0;
6723         }
6724         *edx = 0;
6725         break;
6726     case 0x8000000A:
6727         if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
6728             *eax = 0x00000001; /* SVM Revision */
6729             *ebx = 0x00000010; /* nr of ASIDs */
6730             *ecx = 0;
6731             *edx = env->features[FEAT_SVM]; /* optional features */
6732         } else {
6733             *eax = 0;
6734             *ebx = 0;
6735             *ecx = 0;
6736             *edx = 0;
6737         }
6738         break;
6739     case 0x8000001D:
6740         *eax = 0;
6741         if (cpu->cache_info_passthrough) {
6742             x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx);
6743             break;
6744         }
6745         switch (count) {
6746         case 0: /* L1 dcache info */
6747             encode_cache_cpuid8000001d(env->cache_info_amd.l1d_cache,
6748                                        &topo_info, eax, ebx, ecx, edx);
6749             break;
6750         case 1: /* L1 icache info */
6751             encode_cache_cpuid8000001d(env->cache_info_amd.l1i_cache,
6752                                        &topo_info, eax, ebx, ecx, edx);
6753             break;
6754         case 2: /* L2 cache info */
6755             encode_cache_cpuid8000001d(env->cache_info_amd.l2_cache,
6756                                        &topo_info, eax, ebx, ecx, edx);
6757             break;
6758         case 3: /* L3 cache info */
6759             encode_cache_cpuid8000001d(env->cache_info_amd.l3_cache,
6760                                        &topo_info, eax, ebx, ecx, edx);
6761             break;
6762         default: /* end of info */
6763             *eax = *ebx = *ecx = *edx = 0;
6764             break;
6765         }
6766         break;
6767     case 0x8000001E:
6768         if (cpu->core_id <= 255) {
6769             encode_topo_cpuid8000001e(cpu, &topo_info, eax, ebx, ecx, edx);
6770         } else {
6771             *eax = 0;
6772             *ebx = 0;
6773             *ecx = 0;
6774             *edx = 0;
6775         }
6776         break;
6777     case 0xC0000000:
6778         *eax = env->cpuid_xlevel2;
6779         *ebx = 0;
6780         *ecx = 0;
6781         *edx = 0;
6782         break;
6783     case 0xC0000001:
6784         /* Support for VIA CPU's CPUID instruction */
6785         *eax = env->cpuid_version;
6786         *ebx = 0;
6787         *ecx = 0;
6788         *edx = env->features[FEAT_C000_0001_EDX];
6789         break;
6790     case 0xC0000002:
6791     case 0xC0000003:
6792     case 0xC0000004:
6793         /* Reserved for the future, and now filled with zero */
6794         *eax = 0;
6795         *ebx = 0;
6796         *ecx = 0;
6797         *edx = 0;
6798         break;
6799     case 0x8000001F:
6800         *eax = *ebx = *ecx = *edx = 0;
6801         if (sev_enabled()) {
6802             *eax = 0x2;
6803             *eax |= sev_es_enabled() ? 0x8 : 0;
6804             *ebx = sev_get_cbit_position() & 0x3f; /* EBX[5:0] */
6805             *ebx |= (sev_get_reduced_phys_bits() & 0x3f) << 6; /* EBX[11:6] */
6806         }
6807         break;
6808     case 0x80000021:
6809         *eax = env->features[FEAT_8000_0021_EAX];
6810         *ebx = *ecx = *edx = 0;
6811         break;
6812     default:
6813         /* reserved values: zero */
6814         *eax = 0;
6815         *ebx = 0;
6816         *ecx = 0;
6817         *edx = 0;
6818         break;
6819     }
6820 }
6821 
6822 static void x86_cpu_set_sgxlepubkeyhash(CPUX86State *env)
6823 {
6824 #ifndef CONFIG_USER_ONLY
6825     /* Those default values are defined in Skylake HW */
6826     env->msr_ia32_sgxlepubkeyhash[0] = 0xa6053e051270b7acULL;
6827     env->msr_ia32_sgxlepubkeyhash[1] = 0x6cfbe8ba8b3b413dULL;
6828     env->msr_ia32_sgxlepubkeyhash[2] = 0xc4916d99f2b3735dULL;
6829     env->msr_ia32_sgxlepubkeyhash[3] = 0xd4f8c05909f9bb3bULL;
6830 #endif
6831 }
6832 
6833 static void x86_cpu_reset_hold(Object *obj)
6834 {
6835     CPUState *cs = CPU(obj);
6836     X86CPU *cpu = X86_CPU(cs);
6837     X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
6838     CPUX86State *env = &cpu->env;
6839     target_ulong cr4;
6840     uint64_t xcr0;
6841     int i;
6842 
6843     if (xcc->parent_phases.hold) {
6844         xcc->parent_phases.hold(obj);
6845     }
6846 
6847     memset(env, 0, offsetof(CPUX86State, end_reset_fields));
6848 
6849     env->old_exception = -1;
6850 
6851     /* init to reset state */
6852     env->int_ctl = 0;
6853     env->hflags2 |= HF2_GIF_MASK;
6854     env->hflags2 |= HF2_VGIF_MASK;
6855     env->hflags &= ~HF_GUEST_MASK;
6856 
6857     cpu_x86_update_cr0(env, 0x60000010);
6858     env->a20_mask = ~0x0;
6859     env->smbase = 0x30000;
6860     env->msr_smi_count = 0;
6861 
6862     env->idt.limit = 0xffff;
6863     env->gdt.limit = 0xffff;
6864     env->ldt.limit = 0xffff;
6865     env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT);
6866     env->tr.limit = 0xffff;
6867     env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT);
6868 
6869     cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff,
6870                            DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK |
6871                            DESC_R_MASK | DESC_A_MASK);
6872     cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff,
6873                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
6874                            DESC_A_MASK);
6875     cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff,
6876                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
6877                            DESC_A_MASK);
6878     cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff,
6879                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
6880                            DESC_A_MASK);
6881     cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff,
6882                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
6883                            DESC_A_MASK);
6884     cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff,
6885                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
6886                            DESC_A_MASK);
6887 
6888     env->eip = 0xfff0;
6889     env->regs[R_EDX] = env->cpuid_version;
6890 
6891     env->eflags = 0x2;
6892 
6893     /* FPU init */
6894     for (i = 0; i < 8; i++) {
6895         env->fptags[i] = 1;
6896     }
6897     cpu_set_fpuc(env, 0x37f);
6898 
6899     env->mxcsr = 0x1f80;
6900     /* All units are in INIT state.  */
6901     env->xstate_bv = 0;
6902 
6903     env->pat = 0x0007040600070406ULL;
6904 
6905     if (kvm_enabled()) {
6906         /*
6907          * KVM handles TSC = 0 specially and thinks we are hot-plugging
6908          * a new CPU, use 1 instead to force a reset.
6909          */
6910         if (env->tsc != 0) {
6911             env->tsc = 1;
6912         }
6913     } else {
6914         env->tsc = 0;
6915     }
6916 
6917     env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT;
6918     if (env->features[FEAT_1_ECX] & CPUID_EXT_MONITOR) {
6919         env->msr_ia32_misc_enable |= MSR_IA32_MISC_ENABLE_MWAIT;
6920     }
6921 
6922     memset(env->dr, 0, sizeof(env->dr));
6923     env->dr[6] = DR6_FIXED_1;
6924     env->dr[7] = DR7_FIXED_1;
6925     cpu_breakpoint_remove_all(cs, BP_CPU);
6926     cpu_watchpoint_remove_all(cs, BP_CPU);
6927 
6928     cr4 = 0;
6929     xcr0 = XSTATE_FP_MASK;
6930 
6931 #ifdef CONFIG_USER_ONLY
6932     /* Enable all the features for user-mode.  */
6933     if (env->features[FEAT_1_EDX] & CPUID_SSE) {
6934         xcr0 |= XSTATE_SSE_MASK;
6935     }
6936     for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
6937         const ExtSaveArea *esa = &x86_ext_save_areas[i];
6938         if (!((1 << i) & CPUID_XSTATE_XCR0_MASK)) {
6939             continue;
6940         }
6941         if (env->features[esa->feature] & esa->bits) {
6942             xcr0 |= 1ull << i;
6943         }
6944     }
6945 
6946     if (env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE) {
6947         cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK;
6948     }
6949     if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_FSGSBASE) {
6950         cr4 |= CR4_FSGSBASE_MASK;
6951     }
6952 #endif
6953 
6954     env->xcr0 = xcr0;
6955     cpu_x86_update_cr4(env, cr4);
6956 
6957     /*
6958      * SDM 11.11.5 requires:
6959      *  - IA32_MTRR_DEF_TYPE MSR.E = 0
6960      *  - IA32_MTRR_PHYSMASKn.V = 0
6961      * All other bits are undefined.  For simplification, zero it all.
6962      */
6963     env->mtrr_deftype = 0;
6964     memset(env->mtrr_var, 0, sizeof(env->mtrr_var));
6965     memset(env->mtrr_fixed, 0, sizeof(env->mtrr_fixed));
6966 
6967     env->interrupt_injected = -1;
6968     env->exception_nr = -1;
6969     env->exception_pending = 0;
6970     env->exception_injected = 0;
6971     env->exception_has_payload = false;
6972     env->exception_payload = 0;
6973     env->nmi_injected = false;
6974     env->triple_fault_pending = false;
6975 #if !defined(CONFIG_USER_ONLY)
6976     /* We hard-wire the BSP to the first CPU. */
6977     apic_designate_bsp(cpu->apic_state, cs->cpu_index == 0);
6978 
6979     cs->halted = !cpu_is_bsp(cpu);
6980 
6981     if (kvm_enabled()) {
6982         kvm_arch_reset_vcpu(cpu);
6983     }
6984 
6985     x86_cpu_set_sgxlepubkeyhash(env);
6986 
6987     env->amd_tsc_scale_msr =  MSR_AMD64_TSC_RATIO_DEFAULT;
6988 
6989 #endif
6990 }
6991 
6992 void x86_cpu_after_reset(X86CPU *cpu)
6993 {
6994 #ifndef CONFIG_USER_ONLY
6995     if (kvm_enabled()) {
6996         kvm_arch_after_reset_vcpu(cpu);
6997     }
6998 
6999     if (cpu->apic_state) {
7000         device_cold_reset(cpu->apic_state);
7001     }
7002 #endif
7003 }
7004 
7005 static void mce_init(X86CPU *cpu)
7006 {
7007     CPUX86State *cenv = &cpu->env;
7008     unsigned int bank;
7009 
7010     if (((cenv->cpuid_version >> 8) & 0xf) >= 6
7011         && (cenv->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) ==
7012             (CPUID_MCE | CPUID_MCA)) {
7013         cenv->mcg_cap = MCE_CAP_DEF | MCE_BANKS_DEF |
7014                         (cpu->enable_lmce ? MCG_LMCE_P : 0);
7015         cenv->mcg_ctl = ~(uint64_t)0;
7016         for (bank = 0; bank < MCE_BANKS_DEF; bank++) {
7017             cenv->mce_banks[bank * 4] = ~(uint64_t)0;
7018         }
7019     }
7020 }
7021 
7022 static void x86_cpu_adjust_level(X86CPU *cpu, uint32_t *min, uint32_t value)
7023 {
7024     if (*min < value) {
7025         *min = value;
7026     }
7027 }
7028 
7029 /* Increase cpuid_min_{level,xlevel,xlevel2} automatically, if appropriate */
7030 static void x86_cpu_adjust_feat_level(X86CPU *cpu, FeatureWord w)
7031 {
7032     CPUX86State *env = &cpu->env;
7033     FeatureWordInfo *fi = &feature_word_info[w];
7034     uint32_t eax = fi->cpuid.eax;
7035     uint32_t region = eax & 0xF0000000;
7036 
7037     assert(feature_word_info[w].type == CPUID_FEATURE_WORD);
7038     if (!env->features[w]) {
7039         return;
7040     }
7041 
7042     switch (region) {
7043     case 0x00000000:
7044         x86_cpu_adjust_level(cpu, &env->cpuid_min_level, eax);
7045     break;
7046     case 0x80000000:
7047         x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, eax);
7048     break;
7049     case 0xC0000000:
7050         x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel2, eax);
7051     break;
7052     }
7053 
7054     if (eax == 7) {
7055         x86_cpu_adjust_level(cpu, &env->cpuid_min_level_func7,
7056                              fi->cpuid.ecx);
7057     }
7058 }
7059 
7060 /* Calculate XSAVE components based on the configured CPU feature flags */
7061 static void x86_cpu_enable_xsave_components(X86CPU *cpu)
7062 {
7063     CPUX86State *env = &cpu->env;
7064     int i;
7065     uint64_t mask;
7066     static bool request_perm;
7067 
7068     if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
7069         env->features[FEAT_XSAVE_XCR0_LO] = 0;
7070         env->features[FEAT_XSAVE_XCR0_HI] = 0;
7071         env->features[FEAT_XSAVE_XSS_LO] = 0;
7072         env->features[FEAT_XSAVE_XSS_HI] = 0;
7073         return;
7074     }
7075 
7076     mask = 0;
7077     for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
7078         const ExtSaveArea *esa = &x86_ext_save_areas[i];
7079         if (env->features[esa->feature] & esa->bits) {
7080             mask |= (1ULL << i);
7081         }
7082     }
7083 
7084     /* Only request permission for first vcpu */
7085     if (kvm_enabled() && !request_perm) {
7086         kvm_request_xsave_components(cpu, mask);
7087         request_perm = true;
7088     }
7089 
7090     env->features[FEAT_XSAVE_XCR0_LO] = mask & CPUID_XSTATE_XCR0_MASK;
7091     env->features[FEAT_XSAVE_XCR0_HI] = (mask & CPUID_XSTATE_XCR0_MASK) >> 32;
7092     env->features[FEAT_XSAVE_XSS_LO] = mask & CPUID_XSTATE_XSS_MASK;
7093     env->features[FEAT_XSAVE_XSS_HI] = (mask & CPUID_XSTATE_XSS_MASK) >> 32;
7094 }
7095 
7096 /***** Steps involved on loading and filtering CPUID data
7097  *
7098  * When initializing and realizing a CPU object, the steps
7099  * involved in setting up CPUID data are:
7100  *
7101  * 1) Loading CPU model definition (X86CPUDefinition). This is
7102  *    implemented by x86_cpu_load_model() and should be completely
7103  *    transparent, as it is done automatically by instance_init.
7104  *    No code should need to look at X86CPUDefinition structs
7105  *    outside instance_init.
7106  *
7107  * 2) CPU expansion. This is done by realize before CPUID
7108  *    filtering, and will make sure host/accelerator data is
7109  *    loaded for CPU models that depend on host capabilities
7110  *    (e.g. "host"). Done by x86_cpu_expand_features().
7111  *
7112  * 3) CPUID filtering. This initializes extra data related to
7113  *    CPUID, and checks if the host supports all capabilities
7114  *    required by the CPU. Runnability of a CPU model is
7115  *    determined at this step. Done by x86_cpu_filter_features().
7116  *
7117  * Some operations don't require all steps to be performed.
7118  * More precisely:
7119  *
7120  * - CPU instance creation (instance_init) will run only CPU
7121  *   model loading. CPU expansion can't run at instance_init-time
7122  *   because host/accelerator data may be not available yet.
7123  * - CPU realization will perform both CPU model expansion and CPUID
7124  *   filtering, and return an error in case one of them fails.
7125  * - query-cpu-definitions needs to run all 3 steps. It needs
7126  *   to run CPUID filtering, as the 'unavailable-features'
7127  *   field is set based on the filtering results.
7128  * - The query-cpu-model-expansion QMP command only needs to run
7129  *   CPU model loading and CPU expansion. It should not filter
7130  *   any CPUID data based on host capabilities.
7131  */
7132 
7133 /* Expand CPU configuration data, based on configured features
7134  * and host/accelerator capabilities when appropriate.
7135  */
7136 void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
7137 {
7138     CPUX86State *env = &cpu->env;
7139     FeatureWord w;
7140     int i;
7141     GList *l;
7142 
7143     for (l = plus_features; l; l = l->next) {
7144         const char *prop = l->data;
7145         if (!object_property_set_bool(OBJECT(cpu), prop, true, errp)) {
7146             return;
7147         }
7148     }
7149 
7150     for (l = minus_features; l; l = l->next) {
7151         const char *prop = l->data;
7152         if (!object_property_set_bool(OBJECT(cpu), prop, false, errp)) {
7153             return;
7154         }
7155     }
7156 
7157     /*TODO: Now cpu->max_features doesn't overwrite features
7158      * set using QOM properties, and we can convert
7159      * plus_features & minus_features to global properties
7160      * inside x86_cpu_parse_featurestr() too.
7161      */
7162     if (cpu->max_features) {
7163         for (w = 0; w < FEATURE_WORDS; w++) {
7164             /* Override only features that weren't set explicitly
7165              * by the user.
7166              */
7167             env->features[w] |=
7168                 x86_cpu_get_supported_feature_word(w, cpu->migratable) &
7169                 ~env->user_features[w] &
7170                 ~feature_word_info[w].no_autoenable_flags;
7171         }
7172     }
7173 
7174     for (i = 0; i < ARRAY_SIZE(feature_dependencies); i++) {
7175         FeatureDep *d = &feature_dependencies[i];
7176         if (!(env->features[d->from.index] & d->from.mask)) {
7177             uint64_t unavailable_features = env->features[d->to.index] & d->to.mask;
7178 
7179             /* Not an error unless the dependent feature was added explicitly.  */
7180             mark_unavailable_features(cpu, d->to.index,
7181                                       unavailable_features & env->user_features[d->to.index],
7182                                       "This feature depends on other features that were not requested");
7183 
7184             env->features[d->to.index] &= ~unavailable_features;
7185         }
7186     }
7187 
7188     if (!kvm_enabled() || !cpu->expose_kvm) {
7189         env->features[FEAT_KVM] = 0;
7190     }
7191 
7192     x86_cpu_enable_xsave_components(cpu);
7193 
7194     /* CPUID[EAX=7,ECX=0].EBX always increased level automatically: */
7195     x86_cpu_adjust_feat_level(cpu, FEAT_7_0_EBX);
7196     if (cpu->full_cpuid_auto_level) {
7197         x86_cpu_adjust_feat_level(cpu, FEAT_1_EDX);
7198         x86_cpu_adjust_feat_level(cpu, FEAT_1_ECX);
7199         x86_cpu_adjust_feat_level(cpu, FEAT_6_EAX);
7200         x86_cpu_adjust_feat_level(cpu, FEAT_7_0_ECX);
7201         x86_cpu_adjust_feat_level(cpu, FEAT_7_1_EAX);
7202         x86_cpu_adjust_feat_level(cpu, FEAT_7_1_EDX);
7203         x86_cpu_adjust_feat_level(cpu, FEAT_7_2_EDX);
7204         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_EDX);
7205         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_ECX);
7206         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0007_EDX);
7207         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0008_EBX);
7208         x86_cpu_adjust_feat_level(cpu, FEAT_C000_0001_EDX);
7209         x86_cpu_adjust_feat_level(cpu, FEAT_SVM);
7210         x86_cpu_adjust_feat_level(cpu, FEAT_XSAVE);
7211 
7212         /* Intel Processor Trace requires CPUID[0x14] */
7213         if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT)) {
7214             if (cpu->intel_pt_auto_level) {
7215                 x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14);
7216             } else if (cpu->env.cpuid_min_level < 0x14) {
7217                 mark_unavailable_features(cpu, FEAT_7_0_EBX,
7218                     CPUID_7_0_EBX_INTEL_PT,
7219                     "Intel PT need CPUID leaf 0x14, please set by \"-cpu ...,intel-pt=on,min-level=0x14\"");
7220             }
7221         }
7222 
7223         /*
7224          * Intel CPU topology with multi-dies support requires CPUID[0x1F].
7225          * For AMD Rome/Milan, cpuid level is 0x10, and guest OS should detect
7226          * extended toplogy by leaf 0xB. Only adjust it for Intel CPU, unless
7227          * cpu->vendor_cpuid_only has been unset for compatibility with older
7228          * machine types.
7229          */
7230         if ((env->nr_dies > 1) &&
7231             (IS_INTEL_CPU(env) || !cpu->vendor_cpuid_only)) {
7232             x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x1F);
7233         }
7234 
7235         /* SVM requires CPUID[0x8000000A] */
7236         if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
7237             x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000000A);
7238         }
7239 
7240         /* SEV requires CPUID[0x8000001F] */
7241         if (sev_enabled()) {
7242             x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000001F);
7243         }
7244 
7245         if (env->features[FEAT_8000_0021_EAX]) {
7246             x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x80000021);
7247         }
7248 
7249         /* SGX requires CPUID[0x12] for EPC enumeration */
7250         if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_SGX) {
7251             x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x12);
7252         }
7253     }
7254 
7255     /* Set cpuid_*level* based on cpuid_min_*level, if not explicitly set */
7256     if (env->cpuid_level_func7 == UINT32_MAX) {
7257         env->cpuid_level_func7 = env->cpuid_min_level_func7;
7258     }
7259     if (env->cpuid_level == UINT32_MAX) {
7260         env->cpuid_level = env->cpuid_min_level;
7261     }
7262     if (env->cpuid_xlevel == UINT32_MAX) {
7263         env->cpuid_xlevel = env->cpuid_min_xlevel;
7264     }
7265     if (env->cpuid_xlevel2 == UINT32_MAX) {
7266         env->cpuid_xlevel2 = env->cpuid_min_xlevel2;
7267     }
7268 
7269     if (kvm_enabled() && !kvm_hyperv_expand_features(cpu, errp)) {
7270         return;
7271     }
7272 }
7273 
7274 /*
7275  * Finishes initialization of CPUID data, filters CPU feature
7276  * words based on host availability of each feature.
7277  *
7278  * Returns: 0 if all flags are supported by the host, non-zero otherwise.
7279  */
7280 static void x86_cpu_filter_features(X86CPU *cpu, bool verbose)
7281 {
7282     CPUX86State *env = &cpu->env;
7283     FeatureWord w;
7284     const char *prefix = NULL;
7285 
7286     if (verbose) {
7287         prefix = accel_uses_host_cpuid()
7288                  ? "host doesn't support requested feature"
7289                  : "TCG doesn't support requested feature";
7290     }
7291 
7292     for (w = 0; w < FEATURE_WORDS; w++) {
7293         uint64_t host_feat =
7294             x86_cpu_get_supported_feature_word(w, false);
7295         uint64_t requested_features = env->features[w];
7296         uint64_t unavailable_features = requested_features & ~host_feat;
7297         mark_unavailable_features(cpu, w, unavailable_features, prefix);
7298     }
7299 
7300     /*
7301      * Check that KVM actually allows the processor tracing features that
7302      * are advertised by cpu_x86_cpuid().  Keep these two in sync.
7303      */
7304     if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) &&
7305         kvm_enabled()) {
7306         uint32_t eax_0, ebx_0, ecx_0, edx_0_unused;
7307         uint32_t eax_1, ebx_1, ecx_1_unused, edx_1_unused;
7308 
7309         x86_cpu_get_supported_cpuid(0x14, 0,
7310                                     &eax_0, &ebx_0, &ecx_0, &edx_0_unused);
7311         x86_cpu_get_supported_cpuid(0x14, 1,
7312                                     &eax_1, &ebx_1, &ecx_1_unused, &edx_1_unused);
7313 
7314         if (!eax_0 ||
7315            ((ebx_0 & INTEL_PT_MINIMAL_EBX) != INTEL_PT_MINIMAL_EBX) ||
7316            ((ecx_0 & INTEL_PT_MINIMAL_ECX) != INTEL_PT_MINIMAL_ECX) ||
7317            ((eax_1 & INTEL_PT_MTC_BITMAP) != INTEL_PT_MTC_BITMAP) ||
7318            ((eax_1 & INTEL_PT_ADDR_RANGES_NUM_MASK) <
7319                                            INTEL_PT_ADDR_RANGES_NUM) ||
7320            ((ebx_1 & (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) !=
7321                 (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) ||
7322            ((ecx_0 & CPUID_14_0_ECX_LIP) !=
7323                 (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP))) {
7324             /*
7325              * Processor Trace capabilities aren't configurable, so if the
7326              * host can't emulate the capabilities we report on
7327              * cpu_x86_cpuid(), intel-pt can't be enabled on the current host.
7328              */
7329             mark_unavailable_features(cpu, FEAT_7_0_EBX, CPUID_7_0_EBX_INTEL_PT, prefix);
7330         }
7331     }
7332 }
7333 
7334 static void x86_cpu_hyperv_realize(X86CPU *cpu)
7335 {
7336     size_t len;
7337 
7338     /* Hyper-V vendor id */
7339     if (!cpu->hyperv_vendor) {
7340         object_property_set_str(OBJECT(cpu), "hv-vendor-id", "Microsoft Hv",
7341                                 &error_abort);
7342     }
7343     len = strlen(cpu->hyperv_vendor);
7344     if (len > 12) {
7345         warn_report("hv-vendor-id truncated to 12 characters");
7346         len = 12;
7347     }
7348     memset(cpu->hyperv_vendor_id, 0, 12);
7349     memcpy(cpu->hyperv_vendor_id, cpu->hyperv_vendor, len);
7350 
7351     /* 'Hv#1' interface identification*/
7352     cpu->hyperv_interface_id[0] = 0x31237648;
7353     cpu->hyperv_interface_id[1] = 0;
7354     cpu->hyperv_interface_id[2] = 0;
7355     cpu->hyperv_interface_id[3] = 0;
7356 
7357     /* Hypervisor implementation limits */
7358     cpu->hyperv_limits[0] = 64;
7359     cpu->hyperv_limits[1] = 0;
7360     cpu->hyperv_limits[2] = 0;
7361 }
7362 
7363 static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
7364 {
7365     CPUState *cs = CPU(dev);
7366     X86CPU *cpu = X86_CPU(dev);
7367     X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
7368     CPUX86State *env = &cpu->env;
7369     Error *local_err = NULL;
7370     static bool ht_warned;
7371     unsigned requested_lbr_fmt;
7372 
7373 #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
7374     /* Use pc-relative instructions in system-mode */
7375     cs->tcg_cflags |= CF_PCREL;
7376 #endif
7377 
7378     if (cpu->apic_id == UNASSIGNED_APIC_ID) {
7379         error_setg(errp, "apic-id property was not initialized properly");
7380         return;
7381     }
7382 
7383     /*
7384      * Process Hyper-V enlightenments.
7385      * Note: this currently has to happen before the expansion of CPU features.
7386      */
7387     x86_cpu_hyperv_realize(cpu);
7388 
7389     x86_cpu_expand_features(cpu, &local_err);
7390     if (local_err) {
7391         goto out;
7392     }
7393 
7394     /*
7395      * Override env->features[FEAT_PERF_CAPABILITIES].LBR_FMT
7396      * with user-provided setting.
7397      */
7398     if (cpu->lbr_fmt != ~PERF_CAP_LBR_FMT) {
7399         if ((cpu->lbr_fmt & PERF_CAP_LBR_FMT) != cpu->lbr_fmt) {
7400             error_setg(errp, "invalid lbr-fmt");
7401             return;
7402         }
7403         env->features[FEAT_PERF_CAPABILITIES] &= ~PERF_CAP_LBR_FMT;
7404         env->features[FEAT_PERF_CAPABILITIES] |= cpu->lbr_fmt;
7405     }
7406 
7407     /*
7408      * vPMU LBR is supported when 1) KVM is enabled 2) Option pmu=on and
7409      * 3)vPMU LBR format matches that of host setting.
7410      */
7411     requested_lbr_fmt =
7412         env->features[FEAT_PERF_CAPABILITIES] & PERF_CAP_LBR_FMT;
7413     if (requested_lbr_fmt && kvm_enabled()) {
7414         uint64_t host_perf_cap =
7415             x86_cpu_get_supported_feature_word(FEAT_PERF_CAPABILITIES, false);
7416         unsigned host_lbr_fmt = host_perf_cap & PERF_CAP_LBR_FMT;
7417 
7418         if (!cpu->enable_pmu) {
7419             error_setg(errp, "vPMU: LBR is unsupported without pmu=on");
7420             return;
7421         }
7422         if (requested_lbr_fmt != host_lbr_fmt) {
7423             error_setg(errp, "vPMU: the lbr-fmt value (0x%x) does not match "
7424                         "the host value (0x%x).",
7425                         requested_lbr_fmt, host_lbr_fmt);
7426             return;
7427         }
7428     }
7429 
7430     x86_cpu_filter_features(cpu, cpu->check_cpuid || cpu->enforce_cpuid);
7431 
7432     if (cpu->enforce_cpuid && x86_cpu_have_filtered_features(cpu)) {
7433         error_setg(&local_err,
7434                    accel_uses_host_cpuid() ?
7435                        "Host doesn't support requested features" :
7436                        "TCG doesn't support requested features");
7437         goto out;
7438     }
7439 
7440     /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on
7441      * CPUID[1].EDX.
7442      */
7443     if (IS_AMD_CPU(env)) {
7444         env->features[FEAT_8000_0001_EDX] &= ~CPUID_EXT2_AMD_ALIASES;
7445         env->features[FEAT_8000_0001_EDX] |= (env->features[FEAT_1_EDX]
7446            & CPUID_EXT2_AMD_ALIASES);
7447     }
7448 
7449     x86_cpu_set_sgxlepubkeyhash(env);
7450 
7451     /*
7452      * note: the call to the framework needs to happen after feature expansion,
7453      * but before the checks/modifications to ucode_rev, mwait, phys_bits.
7454      * These may be set by the accel-specific code,
7455      * and the results are subsequently checked / assumed in this function.
7456      */
7457     cpu_exec_realizefn(cs, &local_err);
7458     if (local_err != NULL) {
7459         error_propagate(errp, local_err);
7460         return;
7461     }
7462 
7463     if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
7464         g_autofree char *name = x86_cpu_class_get_model_name(xcc);
7465         error_setg(&local_err, "CPU model '%s' requires KVM or HVF", name);
7466         goto out;
7467     }
7468 
7469     if (cpu->guest_phys_bits == -1) {
7470         /*
7471          * If it was not set by the user, or by the accelerator via
7472          * cpu_exec_realizefn, clear.
7473          */
7474         cpu->guest_phys_bits = 0;
7475     }
7476 
7477     if (cpu->ucode_rev == 0) {
7478         /*
7479          * The default is the same as KVM's. Note that this check
7480          * needs to happen after the evenual setting of ucode_rev in
7481          * accel-specific code in cpu_exec_realizefn.
7482          */
7483         if (IS_AMD_CPU(env)) {
7484             cpu->ucode_rev = 0x01000065;
7485         } else {
7486             cpu->ucode_rev = 0x100000000ULL;
7487         }
7488     }
7489 
7490     /*
7491      * mwait extended info: needed for Core compatibility
7492      * We always wake on interrupt even if host does not have the capability.
7493      *
7494      * requires the accel-specific code in cpu_exec_realizefn to
7495      * have already acquired the CPUID data into cpu->mwait.
7496      */
7497     cpu->mwait.ecx |= CPUID_MWAIT_EMX | CPUID_MWAIT_IBE;
7498 
7499     /* For 64bit systems think about the number of physical bits to present.
7500      * ideally this should be the same as the host; anything other than matching
7501      * the host can cause incorrect guest behaviour.
7502      * QEMU used to pick the magic value of 40 bits that corresponds to
7503      * consumer AMD devices but nothing else.
7504      *
7505      * Note that this code assumes features expansion has already been done
7506      * (as it checks for CPUID_EXT2_LM), and also assumes that potential
7507      * phys_bits adjustments to match the host have been already done in
7508      * accel-specific code in cpu_exec_realizefn.
7509      */
7510     if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
7511         if (cpu->phys_bits &&
7512             (cpu->phys_bits > TARGET_PHYS_ADDR_SPACE_BITS ||
7513             cpu->phys_bits < 32)) {
7514             error_setg(errp, "phys-bits should be between 32 and %u "
7515                              " (but is %u)",
7516                              TARGET_PHYS_ADDR_SPACE_BITS, cpu->phys_bits);
7517             return;
7518         }
7519         /*
7520          * 0 means it was not explicitly set by the user (or by machine
7521          * compat_props or by the host code in host-cpu.c).
7522          * In this case, the default is the value used by TCG (40).
7523          */
7524         if (cpu->phys_bits == 0) {
7525             cpu->phys_bits = TCG_PHYS_ADDR_BITS;
7526         }
7527         if (cpu->guest_phys_bits &&
7528             (cpu->guest_phys_bits > cpu->phys_bits ||
7529             cpu->guest_phys_bits < 32)) {
7530             error_setg(errp, "guest-phys-bits should be between 32 and %u "
7531                              " (but is %u)",
7532                              cpu->phys_bits, cpu->guest_phys_bits);
7533             return;
7534         }
7535     } else {
7536         /* For 32 bit systems don't use the user set value, but keep
7537          * phys_bits consistent with what we tell the guest.
7538          */
7539         if (cpu->phys_bits != 0) {
7540             error_setg(errp, "phys-bits is not user-configurable in 32 bit");
7541             return;
7542         }
7543         if (cpu->guest_phys_bits != 0) {
7544             error_setg(errp, "guest-phys-bits is not user-configurable in 32 bit");
7545             return;
7546         }
7547 
7548         if (env->features[FEAT_1_EDX] & (CPUID_PSE36 | CPUID_PAE)) {
7549             cpu->phys_bits = 36;
7550         } else {
7551             cpu->phys_bits = 32;
7552         }
7553     }
7554 
7555     /* Cache information initialization */
7556     if (!cpu->legacy_cache) {
7557         const CPUCaches *cache_info =
7558             x86_cpu_get_versioned_cache_info(cpu, xcc->model);
7559 
7560         if (!xcc->model || !cache_info) {
7561             g_autofree char *name = x86_cpu_class_get_model_name(xcc);
7562             error_setg(errp,
7563                        "CPU model '%s' doesn't support legacy-cache=off", name);
7564             return;
7565         }
7566         env->cache_info_cpuid2 = env->cache_info_cpuid4 = env->cache_info_amd =
7567             *cache_info;
7568     } else {
7569         /* Build legacy cache information */
7570         env->cache_info_cpuid2.l1d_cache = &legacy_l1d_cache;
7571         env->cache_info_cpuid2.l1i_cache = &legacy_l1i_cache;
7572         env->cache_info_cpuid2.l2_cache = &legacy_l2_cache_cpuid2;
7573         env->cache_info_cpuid2.l3_cache = &legacy_l3_cache;
7574 
7575         env->cache_info_cpuid4.l1d_cache = &legacy_l1d_cache;
7576         env->cache_info_cpuid4.l1i_cache = &legacy_l1i_cache;
7577         env->cache_info_cpuid4.l2_cache = &legacy_l2_cache;
7578         env->cache_info_cpuid4.l3_cache = &legacy_l3_cache;
7579 
7580         env->cache_info_amd.l1d_cache = &legacy_l1d_cache_amd;
7581         env->cache_info_amd.l1i_cache = &legacy_l1i_cache_amd;
7582         env->cache_info_amd.l2_cache = &legacy_l2_cache_amd;
7583         env->cache_info_amd.l3_cache = &legacy_l3_cache;
7584     }
7585 
7586 #ifndef CONFIG_USER_ONLY
7587     MachineState *ms = MACHINE(qdev_get_machine());
7588     qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
7589 
7590     if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || ms->smp.cpus > 1) {
7591         x86_cpu_apic_create(cpu, &local_err);
7592         if (local_err != NULL) {
7593             goto out;
7594         }
7595     }
7596 #endif
7597 
7598     mce_init(cpu);
7599 
7600     qemu_init_vcpu(cs);
7601 
7602     /*
7603      * Most Intel and certain AMD CPUs support hyperthreading. Even though QEMU
7604      * fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
7605      * based on inputs (sockets,cores,threads), it is still better to give
7606      * users a warning.
7607      *
7608      * NOTE: the following code has to follow qemu_init_vcpu(). Otherwise
7609      * cs->nr_threads hasn't be populated yet and the checking is incorrect.
7610      */
7611     if (IS_AMD_CPU(env) &&
7612         !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
7613         cs->nr_threads > 1 && !ht_warned) {
7614             warn_report("This family of AMD CPU doesn't support "
7615                         "hyperthreading(%d)",
7616                         cs->nr_threads);
7617             error_printf("Please configure -smp options properly"
7618                          " or try enabling topoext feature.\n");
7619             ht_warned = true;
7620     }
7621 
7622 #ifndef CONFIG_USER_ONLY
7623     x86_cpu_apic_realize(cpu, &local_err);
7624     if (local_err != NULL) {
7625         goto out;
7626     }
7627 #endif /* !CONFIG_USER_ONLY */
7628     cpu_reset(cs);
7629 
7630     xcc->parent_realize(dev, &local_err);
7631 
7632 out:
7633     if (local_err != NULL) {
7634         error_propagate(errp, local_err);
7635         return;
7636     }
7637 }
7638 
7639 static void x86_cpu_unrealizefn(DeviceState *dev)
7640 {
7641     X86CPU *cpu = X86_CPU(dev);
7642     X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
7643 
7644 #ifndef CONFIG_USER_ONLY
7645     cpu_remove_sync(CPU(dev));
7646     qemu_unregister_reset(x86_cpu_machine_reset_cb, dev);
7647 #endif
7648 
7649     if (cpu->apic_state) {
7650         object_unparent(OBJECT(cpu->apic_state));
7651         cpu->apic_state = NULL;
7652     }
7653 
7654     xcc->parent_unrealize(dev);
7655 }
7656 
7657 typedef struct BitProperty {
7658     FeatureWord w;
7659     uint64_t mask;
7660 } BitProperty;
7661 
7662 static void x86_cpu_get_bit_prop(Object *obj, Visitor *v, const char *name,
7663                                  void *opaque, Error **errp)
7664 {
7665     X86CPU *cpu = X86_CPU(obj);
7666     BitProperty *fp = opaque;
7667     uint64_t f = cpu->env.features[fp->w];
7668     bool value = (f & fp->mask) == fp->mask;
7669     visit_type_bool(v, name, &value, errp);
7670 }
7671 
7672 static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
7673                                  void *opaque, Error **errp)
7674 {
7675     DeviceState *dev = DEVICE(obj);
7676     X86CPU *cpu = X86_CPU(obj);
7677     BitProperty *fp = opaque;
7678     bool value;
7679 
7680     if (dev->realized) {
7681         qdev_prop_set_after_realize(dev, name, errp);
7682         return;
7683     }
7684 
7685     if (!visit_type_bool(v, name, &value, errp)) {
7686         return;
7687     }
7688 
7689     if (value) {
7690         cpu->env.features[fp->w] |= fp->mask;
7691     } else {
7692         cpu->env.features[fp->w] &= ~fp->mask;
7693     }
7694     cpu->env.user_features[fp->w] |= fp->mask;
7695 }
7696 
7697 /* Register a boolean property to get/set a single bit in a uint32_t field.
7698  *
7699  * The same property name can be registered multiple times to make it affect
7700  * multiple bits in the same FeatureWord. In that case, the getter will return
7701  * true only if all bits are set.
7702  */
7703 static void x86_cpu_register_bit_prop(X86CPUClass *xcc,
7704                                       const char *prop_name,
7705                                       FeatureWord w,
7706                                       int bitnr)
7707 {
7708     ObjectClass *oc = OBJECT_CLASS(xcc);
7709     BitProperty *fp;
7710     ObjectProperty *op;
7711     uint64_t mask = (1ULL << bitnr);
7712 
7713     op = object_class_property_find(oc, prop_name);
7714     if (op) {
7715         fp = op->opaque;
7716         assert(fp->w == w);
7717         fp->mask |= mask;
7718     } else {
7719         fp = g_new0(BitProperty, 1);
7720         fp->w = w;
7721         fp->mask = mask;
7722         object_class_property_add(oc, prop_name, "bool",
7723                                   x86_cpu_get_bit_prop,
7724                                   x86_cpu_set_bit_prop,
7725                                   NULL, fp);
7726     }
7727 }
7728 
7729 static void x86_cpu_register_feature_bit_props(X86CPUClass *xcc,
7730                                                FeatureWord w,
7731                                                int bitnr)
7732 {
7733     FeatureWordInfo *fi = &feature_word_info[w];
7734     const char *name = fi->feat_names[bitnr];
7735 
7736     if (!name) {
7737         return;
7738     }
7739 
7740     /* Property names should use "-" instead of "_".
7741      * Old names containing underscores are registered as aliases
7742      * using object_property_add_alias()
7743      */
7744     assert(!strchr(name, '_'));
7745     /* aliases don't use "|" delimiters anymore, they are registered
7746      * manually using object_property_add_alias() */
7747     assert(!strchr(name, '|'));
7748     x86_cpu_register_bit_prop(xcc, name, w, bitnr);
7749 }
7750 
7751 static void x86_cpu_post_initfn(Object *obj)
7752 {
7753     accel_cpu_instance_init(CPU(obj));
7754 }
7755 
7756 static void x86_cpu_initfn(Object *obj)
7757 {
7758     X86CPU *cpu = X86_CPU(obj);
7759     X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
7760     CPUX86State *env = &cpu->env;
7761 
7762     env->nr_dies = 1;
7763 
7764     object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo",
7765                         x86_cpu_get_feature_words,
7766                         NULL, NULL, (void *)env->features);
7767     object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo",
7768                         x86_cpu_get_feature_words,
7769                         NULL, NULL, (void *)cpu->filtered_features);
7770 
7771     object_property_add_alias(obj, "sse3", obj, "pni");
7772     object_property_add_alias(obj, "pclmuldq", obj, "pclmulqdq");
7773     object_property_add_alias(obj, "sse4-1", obj, "sse4.1");
7774     object_property_add_alias(obj, "sse4-2", obj, "sse4.2");
7775     object_property_add_alias(obj, "xd", obj, "nx");
7776     object_property_add_alias(obj, "ffxsr", obj, "fxsr-opt");
7777     object_property_add_alias(obj, "i64", obj, "lm");
7778 
7779     object_property_add_alias(obj, "ds_cpl", obj, "ds-cpl");
7780     object_property_add_alias(obj, "tsc_adjust", obj, "tsc-adjust");
7781     object_property_add_alias(obj, "fxsr_opt", obj, "fxsr-opt");
7782     object_property_add_alias(obj, "lahf_lm", obj, "lahf-lm");
7783     object_property_add_alias(obj, "cmp_legacy", obj, "cmp-legacy");
7784     object_property_add_alias(obj, "nodeid_msr", obj, "nodeid-msr");
7785     object_property_add_alias(obj, "perfctr_core", obj, "perfctr-core");
7786     object_property_add_alias(obj, "perfctr_nb", obj, "perfctr-nb");
7787     object_property_add_alias(obj, "kvm_nopiodelay", obj, "kvm-nopiodelay");
7788     object_property_add_alias(obj, "kvm_mmu", obj, "kvm-mmu");
7789     object_property_add_alias(obj, "kvm_asyncpf", obj, "kvm-asyncpf");
7790     object_property_add_alias(obj, "kvm_asyncpf_int", obj, "kvm-asyncpf-int");
7791     object_property_add_alias(obj, "kvm_steal_time", obj, "kvm-steal-time");
7792     object_property_add_alias(obj, "kvm_pv_eoi", obj, "kvm-pv-eoi");
7793     object_property_add_alias(obj, "kvm_pv_unhalt", obj, "kvm-pv-unhalt");
7794     object_property_add_alias(obj, "kvm_poll_control", obj, "kvm-poll-control");
7795     object_property_add_alias(obj, "svm_lock", obj, "svm-lock");
7796     object_property_add_alias(obj, "nrip_save", obj, "nrip-save");
7797     object_property_add_alias(obj, "tsc_scale", obj, "tsc-scale");
7798     object_property_add_alias(obj, "vmcb_clean", obj, "vmcb-clean");
7799     object_property_add_alias(obj, "pause_filter", obj, "pause-filter");
7800     object_property_add_alias(obj, "sse4_1", obj, "sse4.1");
7801     object_property_add_alias(obj, "sse4_2", obj, "sse4.2");
7802 
7803     object_property_add_alias(obj, "hv-apicv", obj, "hv-avic");
7804     cpu->lbr_fmt = ~PERF_CAP_LBR_FMT;
7805     object_property_add_alias(obj, "lbr_fmt", obj, "lbr-fmt");
7806 
7807     if (xcc->model) {
7808         x86_cpu_load_model(cpu, xcc->model);
7809     }
7810 }
7811 
7812 static int64_t x86_cpu_get_arch_id(CPUState *cs)
7813 {
7814     X86CPU *cpu = X86_CPU(cs);
7815 
7816     return cpu->apic_id;
7817 }
7818 
7819 #if !defined(CONFIG_USER_ONLY)
7820 static bool x86_cpu_get_paging_enabled(const CPUState *cs)
7821 {
7822     X86CPU *cpu = X86_CPU(cs);
7823 
7824     return cpu->env.cr[0] & CR0_PG_MASK;
7825 }
7826 #endif /* !CONFIG_USER_ONLY */
7827 
7828 static void x86_cpu_set_pc(CPUState *cs, vaddr value)
7829 {
7830     X86CPU *cpu = X86_CPU(cs);
7831 
7832     cpu->env.eip = value;
7833 }
7834 
7835 static vaddr x86_cpu_get_pc(CPUState *cs)
7836 {
7837     X86CPU *cpu = X86_CPU(cs);
7838 
7839     /* Match cpu_get_tb_cpu_state. */
7840     return cpu->env.eip + cpu->env.segs[R_CS].base;
7841 }
7842 
7843 int x86_cpu_pending_interrupt(CPUState *cs, int interrupt_request)
7844 {
7845     X86CPU *cpu = X86_CPU(cs);
7846     CPUX86State *env = &cpu->env;
7847 
7848 #if !defined(CONFIG_USER_ONLY)
7849     if (interrupt_request & CPU_INTERRUPT_POLL) {
7850         return CPU_INTERRUPT_POLL;
7851     }
7852 #endif
7853     if (interrupt_request & CPU_INTERRUPT_SIPI) {
7854         return CPU_INTERRUPT_SIPI;
7855     }
7856 
7857     if (env->hflags2 & HF2_GIF_MASK) {
7858         if ((interrupt_request & CPU_INTERRUPT_SMI) &&
7859             !(env->hflags & HF_SMM_MASK)) {
7860             return CPU_INTERRUPT_SMI;
7861         } else if ((interrupt_request & CPU_INTERRUPT_NMI) &&
7862                    !(env->hflags2 & HF2_NMI_MASK)) {
7863             return CPU_INTERRUPT_NMI;
7864         } else if (interrupt_request & CPU_INTERRUPT_MCE) {
7865             return CPU_INTERRUPT_MCE;
7866         } else if ((interrupt_request & CPU_INTERRUPT_HARD) &&
7867                    (((env->hflags2 & HF2_VINTR_MASK) &&
7868                      (env->hflags2 & HF2_HIF_MASK)) ||
7869                     (!(env->hflags2 & HF2_VINTR_MASK) &&
7870                      (env->eflags & IF_MASK &&
7871                       !(env->hflags & HF_INHIBIT_IRQ_MASK))))) {
7872             return CPU_INTERRUPT_HARD;
7873 #if !defined(CONFIG_USER_ONLY)
7874         } else if (env->hflags2 & HF2_VGIF_MASK) {
7875             if((interrupt_request & CPU_INTERRUPT_VIRQ) &&
7876                    (env->eflags & IF_MASK) &&
7877                    !(env->hflags & HF_INHIBIT_IRQ_MASK)) {
7878                         return CPU_INTERRUPT_VIRQ;
7879             }
7880 #endif
7881         }
7882     }
7883 
7884     return 0;
7885 }
7886 
7887 static bool x86_cpu_has_work(CPUState *cs)
7888 {
7889     return x86_cpu_pending_interrupt(cs, cs->interrupt_request) != 0;
7890 }
7891 
7892 static int x86_cpu_mmu_index(CPUState *cs, bool ifetch)
7893 {
7894     CPUX86State *env = cpu_env(cs);
7895     int mmu_index_32 = (env->hflags & HF_CS64_MASK) ? 0 : 1;
7896     int mmu_index_base =
7897         (env->hflags & HF_CPL_MASK) == 3 ? MMU_USER64_IDX :
7898         !(env->hflags & HF_SMAP_MASK) ? MMU_KNOSMAP64_IDX :
7899         (env->eflags & AC_MASK) ? MMU_KNOSMAP64_IDX : MMU_KSMAP64_IDX;
7900 
7901     return mmu_index_base + mmu_index_32;
7902 }
7903 
7904 static void x86_disas_set_info(CPUState *cs, disassemble_info *info)
7905 {
7906     X86CPU *cpu = X86_CPU(cs);
7907     CPUX86State *env = &cpu->env;
7908 
7909     info->mach = (env->hflags & HF_CS64_MASK ? bfd_mach_x86_64
7910                   : env->hflags & HF_CS32_MASK ? bfd_mach_i386_i386
7911                   : bfd_mach_i386_i8086);
7912 
7913     info->cap_arch = CS_ARCH_X86;
7914     info->cap_mode = (env->hflags & HF_CS64_MASK ? CS_MODE_64
7915                       : env->hflags & HF_CS32_MASK ? CS_MODE_32
7916                       : CS_MODE_16);
7917     info->cap_insn_unit = 1;
7918     info->cap_insn_split = 8;
7919 }
7920 
7921 void x86_update_hflags(CPUX86State *env)
7922 {
7923    uint32_t hflags;
7924 #define HFLAG_COPY_MASK \
7925     ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
7926        HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
7927        HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
7928        HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK)
7929 
7930     hflags = env->hflags & HFLAG_COPY_MASK;
7931     hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
7932     hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
7933     hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
7934                 (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
7935     hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
7936 
7937     if (env->cr[4] & CR4_OSFXSR_MASK) {
7938         hflags |= HF_OSFXSR_MASK;
7939     }
7940 
7941     if (env->efer & MSR_EFER_LMA) {
7942         hflags |= HF_LMA_MASK;
7943     }
7944 
7945     if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
7946         hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
7947     } else {
7948         hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
7949                     (DESC_B_SHIFT - HF_CS32_SHIFT);
7950         hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
7951                     (DESC_B_SHIFT - HF_SS32_SHIFT);
7952         if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) ||
7953             !(hflags & HF_CS32_MASK)) {
7954             hflags |= HF_ADDSEG_MASK;
7955         } else {
7956             hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base |
7957                         env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
7958         }
7959     }
7960     env->hflags = hflags;
7961 }
7962 
7963 static Property x86_cpu_properties[] = {
7964 #ifdef CONFIG_USER_ONLY
7965     /* apic_id = 0 by default for *-user, see commit 9886e834 */
7966     DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, 0),
7967     DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, 0),
7968     DEFINE_PROP_INT32("core-id", X86CPU, core_id, 0),
7969     DEFINE_PROP_INT32("die-id", X86CPU, die_id, 0),
7970     DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, 0),
7971 #else
7972     DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, UNASSIGNED_APIC_ID),
7973     DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, -1),
7974     DEFINE_PROP_INT32("core-id", X86CPU, core_id, -1),
7975     DEFINE_PROP_INT32("die-id", X86CPU, die_id, -1),
7976     DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, -1),
7977 #endif
7978     DEFINE_PROP_INT32("node-id", X86CPU, node_id, CPU_UNSET_NUMA_NODE_ID),
7979     DEFINE_PROP_BOOL("pmu", X86CPU, enable_pmu, false),
7980     DEFINE_PROP_UINT64_CHECKMASK("lbr-fmt", X86CPU, lbr_fmt, PERF_CAP_LBR_FMT),
7981 
7982     DEFINE_PROP_UINT32("hv-spinlocks", X86CPU, hyperv_spinlock_attempts,
7983                        HYPERV_SPINLOCK_NEVER_NOTIFY),
7984     DEFINE_PROP_BIT64("hv-relaxed", X86CPU, hyperv_features,
7985                       HYPERV_FEAT_RELAXED, 0),
7986     DEFINE_PROP_BIT64("hv-vapic", X86CPU, hyperv_features,
7987                       HYPERV_FEAT_VAPIC, 0),
7988     DEFINE_PROP_BIT64("hv-time", X86CPU, hyperv_features,
7989                       HYPERV_FEAT_TIME, 0),
7990     DEFINE_PROP_BIT64("hv-crash", X86CPU, hyperv_features,
7991                       HYPERV_FEAT_CRASH, 0),
7992     DEFINE_PROP_BIT64("hv-reset", X86CPU, hyperv_features,
7993                       HYPERV_FEAT_RESET, 0),
7994     DEFINE_PROP_BIT64("hv-vpindex", X86CPU, hyperv_features,
7995                       HYPERV_FEAT_VPINDEX, 0),
7996     DEFINE_PROP_BIT64("hv-runtime", X86CPU, hyperv_features,
7997                       HYPERV_FEAT_RUNTIME, 0),
7998     DEFINE_PROP_BIT64("hv-synic", X86CPU, hyperv_features,
7999                       HYPERV_FEAT_SYNIC, 0),
8000     DEFINE_PROP_BIT64("hv-stimer", X86CPU, hyperv_features,
8001                       HYPERV_FEAT_STIMER, 0),
8002     DEFINE_PROP_BIT64("hv-frequencies", X86CPU, hyperv_features,
8003                       HYPERV_FEAT_FREQUENCIES, 0),
8004     DEFINE_PROP_BIT64("hv-reenlightenment", X86CPU, hyperv_features,
8005                       HYPERV_FEAT_REENLIGHTENMENT, 0),
8006     DEFINE_PROP_BIT64("hv-tlbflush", X86CPU, hyperv_features,
8007                       HYPERV_FEAT_TLBFLUSH, 0),
8008     DEFINE_PROP_BIT64("hv-evmcs", X86CPU, hyperv_features,
8009                       HYPERV_FEAT_EVMCS, 0),
8010     DEFINE_PROP_BIT64("hv-ipi", X86CPU, hyperv_features,
8011                       HYPERV_FEAT_IPI, 0),
8012     DEFINE_PROP_BIT64("hv-stimer-direct", X86CPU, hyperv_features,
8013                       HYPERV_FEAT_STIMER_DIRECT, 0),
8014     DEFINE_PROP_BIT64("hv-avic", X86CPU, hyperv_features,
8015                       HYPERV_FEAT_AVIC, 0),
8016     DEFINE_PROP_BIT64("hv-emsr-bitmap", X86CPU, hyperv_features,
8017                       HYPERV_FEAT_MSR_BITMAP, 0),
8018     DEFINE_PROP_BIT64("hv-xmm-input", X86CPU, hyperv_features,
8019                       HYPERV_FEAT_XMM_INPUT, 0),
8020     DEFINE_PROP_BIT64("hv-tlbflush-ext", X86CPU, hyperv_features,
8021                       HYPERV_FEAT_TLBFLUSH_EXT, 0),
8022     DEFINE_PROP_BIT64("hv-tlbflush-direct", X86CPU, hyperv_features,
8023                       HYPERV_FEAT_TLBFLUSH_DIRECT, 0),
8024     DEFINE_PROP_ON_OFF_AUTO("hv-no-nonarch-coresharing", X86CPU,
8025                             hyperv_no_nonarch_cs, ON_OFF_AUTO_OFF),
8026     DEFINE_PROP_BIT64("hv-syndbg", X86CPU, hyperv_features,
8027                       HYPERV_FEAT_SYNDBG, 0),
8028     DEFINE_PROP_BOOL("hv-passthrough", X86CPU, hyperv_passthrough, false),
8029     DEFINE_PROP_BOOL("hv-enforce-cpuid", X86CPU, hyperv_enforce_cpuid, false),
8030 
8031     /* WS2008R2 identify by default */
8032     DEFINE_PROP_UINT32("hv-version-id-build", X86CPU, hyperv_ver_id_build,
8033                        0x3839),
8034     DEFINE_PROP_UINT16("hv-version-id-major", X86CPU, hyperv_ver_id_major,
8035                        0x000A),
8036     DEFINE_PROP_UINT16("hv-version-id-minor", X86CPU, hyperv_ver_id_minor,
8037                        0x0000),
8038     DEFINE_PROP_UINT32("hv-version-id-spack", X86CPU, hyperv_ver_id_sp, 0),
8039     DEFINE_PROP_UINT8("hv-version-id-sbranch", X86CPU, hyperv_ver_id_sb, 0),
8040     DEFINE_PROP_UINT32("hv-version-id-snumber", X86CPU, hyperv_ver_id_sn, 0),
8041 
8042     DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true),
8043     DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
8044     DEFINE_PROP_BOOL("x-force-features", X86CPU, force_features, false),
8045     DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true),
8046     DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 0),
8047     DEFINE_PROP_UINT32("guest-phys-bits", X86CPU, guest_phys_bits, -1),
8048     DEFINE_PROP_BOOL("host-phys-bits", X86CPU, host_phys_bits, false),
8049     DEFINE_PROP_UINT8("host-phys-bits-limit", X86CPU, host_phys_bits_limit, 0),
8050     DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true),
8051     DEFINE_PROP_UINT32("level-func7", X86CPU, env.cpuid_level_func7,
8052                        UINT32_MAX),
8053     DEFINE_PROP_UINT32("level", X86CPU, env.cpuid_level, UINT32_MAX),
8054     DEFINE_PROP_UINT32("xlevel", X86CPU, env.cpuid_xlevel, UINT32_MAX),
8055     DEFINE_PROP_UINT32("xlevel2", X86CPU, env.cpuid_xlevel2, UINT32_MAX),
8056     DEFINE_PROP_UINT32("min-level", X86CPU, env.cpuid_min_level, 0),
8057     DEFINE_PROP_UINT32("min-xlevel", X86CPU, env.cpuid_min_xlevel, 0),
8058     DEFINE_PROP_UINT32("min-xlevel2", X86CPU, env.cpuid_min_xlevel2, 0),
8059     DEFINE_PROP_UINT64("ucode-rev", X86CPU, ucode_rev, 0),
8060     DEFINE_PROP_BOOL("full-cpuid-auto-level", X86CPU, full_cpuid_auto_level, true),
8061     DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor),
8062     DEFINE_PROP_BOOL("cpuid-0xb", X86CPU, enable_cpuid_0xb, true),
8063     DEFINE_PROP_BOOL("x-vendor-cpuid-only", X86CPU, vendor_cpuid_only, true),
8064     DEFINE_PROP_BOOL("lmce", X86CPU, enable_lmce, false),
8065     DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true),
8066     DEFINE_PROP_BOOL("kvm-no-smi-migration", X86CPU, kvm_no_smi_migration,
8067                      false),
8068     DEFINE_PROP_BOOL("kvm-pv-enforce-cpuid", X86CPU, kvm_pv_enforce_cpuid,
8069                      false),
8070     DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true),
8071     DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true),
8072     DEFINE_PROP_BOOL("x-migrate-smi-count", X86CPU, migrate_smi_count,
8073                      true),
8074     /*
8075      * lecacy_cache defaults to true unless the CPU model provides its
8076      * own cache information (see x86_cpu_load_def()).
8077      */
8078     DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, true),
8079     DEFINE_PROP_BOOL("xen-vapic", X86CPU, xen_vapic, false),
8080 
8081     /*
8082      * From "Requirements for Implementing the Microsoft
8083      * Hypervisor Interface":
8084      * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs
8085      *
8086      * "Starting with Windows Server 2012 and Windows 8, if
8087      * CPUID.40000005.EAX contains a value of -1, Windows assumes that
8088      * the hypervisor imposes no specific limit to the number of VPs.
8089      * In this case, Windows Server 2012 guest VMs may use more than
8090      * 64 VPs, up to the maximum supported number of processors applicable
8091      * to the specific Windows version being used."
8092      */
8093     DEFINE_PROP_INT32("x-hv-max-vps", X86CPU, hv_max_vps, -1),
8094     DEFINE_PROP_BOOL("x-hv-synic-kvm-only", X86CPU, hyperv_synic_kvm_only,
8095                      false),
8096     DEFINE_PROP_BOOL("x-intel-pt-auto-level", X86CPU, intel_pt_auto_level,
8097                      true),
8098     DEFINE_PROP_END_OF_LIST()
8099 };
8100 
8101 #ifndef CONFIG_USER_ONLY
8102 #include "hw/core/sysemu-cpu-ops.h"
8103 
8104 static const struct SysemuCPUOps i386_sysemu_ops = {
8105     .get_memory_mapping = x86_cpu_get_memory_mapping,
8106     .get_paging_enabled = x86_cpu_get_paging_enabled,
8107     .get_phys_page_attrs_debug = x86_cpu_get_phys_page_attrs_debug,
8108     .asidx_from_attrs = x86_asidx_from_attrs,
8109     .get_crash_info = x86_cpu_get_crash_info,
8110     .write_elf32_note = x86_cpu_write_elf32_note,
8111     .write_elf64_note = x86_cpu_write_elf64_note,
8112     .write_elf32_qemunote = x86_cpu_write_elf32_qemunote,
8113     .write_elf64_qemunote = x86_cpu_write_elf64_qemunote,
8114     .legacy_vmsd = &vmstate_x86_cpu,
8115 };
8116 #endif
8117 
8118 static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
8119 {
8120     X86CPUClass *xcc = X86_CPU_CLASS(oc);
8121     CPUClass *cc = CPU_CLASS(oc);
8122     DeviceClass *dc = DEVICE_CLASS(oc);
8123     ResettableClass *rc = RESETTABLE_CLASS(oc);
8124     FeatureWord w;
8125 
8126     device_class_set_parent_realize(dc, x86_cpu_realizefn,
8127                                     &xcc->parent_realize);
8128     device_class_set_parent_unrealize(dc, x86_cpu_unrealizefn,
8129                                       &xcc->parent_unrealize);
8130     device_class_set_props(dc, x86_cpu_properties);
8131 
8132     resettable_class_set_parent_phases(rc, NULL, x86_cpu_reset_hold, NULL,
8133                                        &xcc->parent_phases);
8134     cc->reset_dump_flags = CPU_DUMP_FPU | CPU_DUMP_CCOP;
8135 
8136     cc->class_by_name = x86_cpu_class_by_name;
8137     cc->parse_features = x86_cpu_parse_featurestr;
8138     cc->has_work = x86_cpu_has_work;
8139     cc->mmu_index = x86_cpu_mmu_index;
8140     cc->dump_state = x86_cpu_dump_state;
8141     cc->set_pc = x86_cpu_set_pc;
8142     cc->get_pc = x86_cpu_get_pc;
8143     cc->gdb_read_register = x86_cpu_gdb_read_register;
8144     cc->gdb_write_register = x86_cpu_gdb_write_register;
8145     cc->get_arch_id = x86_cpu_get_arch_id;
8146 
8147 #ifndef CONFIG_USER_ONLY
8148     cc->sysemu_ops = &i386_sysemu_ops;
8149 #endif /* !CONFIG_USER_ONLY */
8150 
8151     cc->gdb_arch_name = x86_gdb_arch_name;
8152 #ifdef TARGET_X86_64
8153     cc->gdb_core_xml_file = "i386-64bit.xml";
8154 #else
8155     cc->gdb_core_xml_file = "i386-32bit.xml";
8156 #endif
8157     cc->disas_set_info = x86_disas_set_info;
8158 
8159     dc->user_creatable = true;
8160 
8161     object_class_property_add(oc, "family", "int",
8162                               x86_cpuid_version_get_family,
8163                               x86_cpuid_version_set_family, NULL, NULL);
8164     object_class_property_add(oc, "model", "int",
8165                               x86_cpuid_version_get_model,
8166                               x86_cpuid_version_set_model, NULL, NULL);
8167     object_class_property_add(oc, "stepping", "int",
8168                               x86_cpuid_version_get_stepping,
8169                               x86_cpuid_version_set_stepping, NULL, NULL);
8170     object_class_property_add_str(oc, "vendor",
8171                                   x86_cpuid_get_vendor,
8172                                   x86_cpuid_set_vendor);
8173     object_class_property_add_str(oc, "model-id",
8174                                   x86_cpuid_get_model_id,
8175                                   x86_cpuid_set_model_id);
8176     object_class_property_add(oc, "tsc-frequency", "int",
8177                               x86_cpuid_get_tsc_freq,
8178                               x86_cpuid_set_tsc_freq, NULL, NULL);
8179     /*
8180      * The "unavailable-features" property has the same semantics as
8181      * CpuDefinitionInfo.unavailable-features on the "query-cpu-definitions"
8182      * QMP command: they list the features that would have prevented the
8183      * CPU from running if the "enforce" flag was set.
8184      */
8185     object_class_property_add(oc, "unavailable-features", "strList",
8186                               x86_cpu_get_unavailable_features,
8187                               NULL, NULL, NULL);
8188 
8189 #if !defined(CONFIG_USER_ONLY)
8190     object_class_property_add(oc, "crash-information", "GuestPanicInformation",
8191                               x86_cpu_get_crash_info_qom, NULL, NULL, NULL);
8192 #endif
8193 
8194     for (w = 0; w < FEATURE_WORDS; w++) {
8195         int bitnr;
8196         for (bitnr = 0; bitnr < 64; bitnr++) {
8197             x86_cpu_register_feature_bit_props(xcc, w, bitnr);
8198         }
8199     }
8200 }
8201 
8202 static const TypeInfo x86_cpu_type_info = {
8203     .name = TYPE_X86_CPU,
8204     .parent = TYPE_CPU,
8205     .instance_size = sizeof(X86CPU),
8206     .instance_align = __alignof(X86CPU),
8207     .instance_init = x86_cpu_initfn,
8208     .instance_post_init = x86_cpu_post_initfn,
8209 
8210     .abstract = true,
8211     .class_size = sizeof(X86CPUClass),
8212     .class_init = x86_cpu_common_class_init,
8213 };
8214 
8215 /* "base" CPU model, used by query-cpu-model-expansion */
8216 static void x86_cpu_base_class_init(ObjectClass *oc, void *data)
8217 {
8218     X86CPUClass *xcc = X86_CPU_CLASS(oc);
8219 
8220     xcc->static_model = true;
8221     xcc->migration_safe = true;
8222     xcc->model_description = "base CPU model type with no features enabled";
8223     xcc->ordering = 8;
8224 }
8225 
8226 static const TypeInfo x86_base_cpu_type_info = {
8227         .name = X86_CPU_TYPE_NAME("base"),
8228         .parent = TYPE_X86_CPU,
8229         .class_init = x86_cpu_base_class_init,
8230 };
8231 
8232 static void x86_cpu_register_types(void)
8233 {
8234     int i;
8235 
8236     type_register_static(&x86_cpu_type_info);
8237     for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) {
8238         x86_register_cpudef_types(&builtin_x86_defs[i]);
8239     }
8240     type_register_static(&max_x86_cpu_type_info);
8241     type_register_static(&x86_base_cpu_type_info);
8242 }
8243 
8244 type_init(x86_cpu_register_types)
8245