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