xref: /openbmc/qemu/target/i386/cpu.c (revision faaaf017d5b9c9f84fb86dcee016944176eee0d9)
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  */
cpuid2_cache_descriptor(CPUCacheInfo * cache,bool * unmacthed)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] */
encode_cache_cpuid2(X86CPU * cpu,const CPUCaches * caches,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)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 
max_thread_ids_for_cache(X86CPUTopoInfo * topo_info,enum CpuTopologyLevel share_level)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 
max_core_ids_in_package(X86CPUTopoInfo * topo_info)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] */
encode_cache_cpuid4(CPUCacheInfo * cache,X86CPUTopoInfo * topo_info,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)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 
num_threads_by_topo_level(X86CPUTopoInfo * topo_info,enum CpuTopologyLevel topo_level)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 
apicid_offset_by_topo_level(X86CPUTopoInfo * topo_info,enum CpuTopologyLevel topo_level)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 
cpuid1f_topo_type(enum CpuTopologyLevel topo_level)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 
encode_topo_cpuid1f(CPUX86State * env,uint32_t count,X86CPUTopoInfo * topo_info,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)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 */
encode_cache_cpuid80000005(CPUCacheInfo * cache)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  */
encode_cache_cpuid80000006(CPUCacheInfo * l2,CPUCacheInfo * l3,uint32_t * ecx,uint32_t * edx)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] */
encode_cache_cpuid8000001d(CPUCacheInfo * cache,X86CPUTopoInfo * topo_info,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)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] */
encode_topo_cpuid8000001e(X86CPU * cpu,X86CPUTopoInfo * topo_info,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)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 
x86_cpu_vendor_words2str(char * dst,uint32_t vendor1,uint32_t vendor2,uint32_t vendor3)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 
is_feature_word_cpuid(uint32_t feature,uint32_t index,int reg)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 
xsave_area_size(uint64_t mask,bool compacted)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 
accel_uses_host_cpuid(void)2067 static inline bool accel_uses_host_cpuid(void)
2068 {
2069     return !tcg_enabled() && !qtest_enabled();
2070 }
2071 
x86_cpu_xsave_xcr0_components(X86CPU * cpu)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 */
get_register_name_32(unsigned int reg)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 
x86_cpu_xsave_xss_components(X86CPU * cpu)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  */
x86_cpu_get_migratable_flags(X86CPU * cpu,FeatureWord w)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 
host_cpuid(uint32_t function,uint32_t count,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)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  */
x86_cpu_type_name(const char * model_name)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 
x86_cpu_class_by_name(const char * cpu_model)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 
x86_cpu_class_get_model_name(X86CPUClass * cc)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 */
x86_cpu_versioned_model_name(const X86CPUDefinition * cpudef,X86CPUVersion 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 *
x86_cpu_def_get_versions(const X86CPUDefinition * def)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 
x86_cpu_set_default_version(X86CPUVersion version)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 
x86_cpu_model_last_version(const X86CPUModel * model)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 */
x86_cpu_model_resolve_version(const X86CPUModel * 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 
max_x86_cpu_realize(DeviceState * dev,Error ** errp)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 
max_x86_cpu_class_init(ObjectClass * oc,const void * data)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 
max_x86_cpu_initfn(Object * obj)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 
feature_word_description(FeatureWordInfo * f)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 
x86_cpu_have_filtered_features(X86CPU * cpu)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 
mark_unavailable_features(X86CPU * cpu,FeatureWord w,uint64_t mask,const char * verbose_prefix)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 
mark_forced_on_features(X86CPU * cpu,FeatureWord w,uint64_t mask,const char * verbose_prefix)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 
x86_cpuid_version_get_family(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)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 
x86_cpuid_version_set_family(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)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 
x86_cpuid_version_get_model(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)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 
x86_cpuid_version_set_model(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)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 
x86_cpuid_version_get_stepping(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)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 
x86_cpuid_version_set_stepping(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)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 
x86_cpuid_get_vendor(Object * obj,Error ** errp)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 
x86_cpuid_set_vendor(Object * obj,const char * value,Error ** errp)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 
x86_cpuid_get_model_id(Object * obj,Error ** errp)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 
x86_cpuid_set_model_id(Object * obj,const char * model_id,Error ** errp)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 
x86_cpuid_get_tsc_freq(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)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 
x86_cpuid_set_tsc_freq(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)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 */
x86_cpu_get_feature_words(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)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  */
feat2prop(char * s)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 */
x86_cpu_feature_name(FeatureWord w,int bitnr)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 
compare_string(gconstpointer a,gconstpointer b)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  */
x86_cpu_parse_featurestr(const char * typename,char * features,Error ** errp)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 */
x86_cpu_list_feature_names(FeatureWordArray features,strList ** list)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 
x86_cpu_get_unavailable_features(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)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  */
listflags(GList * features)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. */
x86_cpu_list_compare(gconstpointer a,gconstpointer b,gpointer d)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 
get_sorted_cpu_model_list(void)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 
x86_cpu_class_get_model_id(X86CPUClass * xc)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 
x86_cpu_class_get_alias_of(X86CPUClass * cc)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 
x86_cpu_list_entry(gpointer data,gpointer user_data)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 
strcmp_wrap(gconstpointer a,gconstpointer b,gpointer d)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 */
x86_cpu_list(void)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  */
x86_cpu_class_check_missing_features(X86CPUClass * xcc,strList ** list)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 
x86_cpu_definition_entry(gpointer data,gpointer user_data)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 
qmp_query_cpu_definitions(Error ** errp)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 
x86_cpu_get_supported_feature_word(X86CPU * cpu,FeatureWord w)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 
x86_cpu_get_supported_cpuid(uint32_t func,uint32_t index,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)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 
x86_cpu_get_cache_cpuid(uint32_t func,uint32_t index,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)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  */
x86_cpu_apply_props(X86CPU * cpu,PropValue * props)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 
x86_cpu_apply_version_props(X86CPU * cpu,const X86CPUModel * model)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 
x86_cpu_get_versioned_cache_info(X86CPU * cpu,const X86CPUModel * model)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  */
x86_cpu_load_model(X86CPU * cpu,const X86CPUModel * model)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 
x86_gdb_arch_name(CPUState * cs)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 
x86_cpu_cpudef_class_init(ObjectClass * oc,const void * data)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 
x86_register_cpu_model_type(const char * name,X86CPUModel * model)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  */
x86_register_cpudef_types(const X86CPUDefinition * def)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 
cpu_x86_virtual_addr_width(CPUX86State * env)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 
cpu_x86_cpuid(CPUX86State * env,uint32_t index,uint32_t count,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)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 ((IS_INTEL_CPU(env) || IS_ZHAOXIN_CPU(env))) {
7889                 num = 1 << apicid_pkg_offset(topo_info);
7890             } else {
7891                 num = threads_per_pkg;
7892             }
7893 
7894             /* Fixup overflow: max value for bits 23-16 is 255. */
7895             *ebx |= MIN(num, 255) << 16;
7896         }
7897         break;
7898     case 2: { /* cache info: needed for Pentium Pro compatibility */
7899         const CPUCaches *caches;
7900 
7901         if (env->enable_legacy_cpuid2_cache) {
7902             caches = &legacy_intel_cpuid2_cache_info;
7903         } else if (env->enable_legacy_vendor_cache) {
7904             caches = &legacy_intel_cache_info;
7905         } else {
7906             caches = &env->cache_info;
7907         }
7908 
7909         if (cpu->cache_info_passthrough) {
7910             x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
7911             break;
7912         } else if (cpu->vendor_cpuid_only && IS_AMD_CPU(env)) {
7913             *eax = *ebx = *ecx = *edx = 0;
7914             break;
7915         }
7916         encode_cache_cpuid2(cpu, caches, eax, ebx, ecx, edx);
7917         break;
7918     }
7919     case 4: {
7920         const CPUCaches *caches;
7921 
7922         if (env->enable_legacy_vendor_cache) {
7923             caches = &legacy_intel_cache_info;
7924         } else {
7925             caches = &env->cache_info;
7926         }
7927 
7928         /* cache info: needed for Core compatibility */
7929         if (cpu->cache_info_passthrough) {
7930             x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx);
7931             /*
7932              * QEMU has its own number of cores/logical cpus,
7933              * set 24..14, 31..26 bit to configured values
7934              */
7935             if (*eax & 31) {
7936                 int host_vcpus_per_cache = 1 + ((*eax & 0x3FFC000) >> 14);
7937 
7938                 *eax &= ~0xFC000000;
7939                 *eax |= MIN(max_core_ids_in_package(topo_info), 63) << 26;
7940                 if (host_vcpus_per_cache > threads_per_pkg) {
7941                     *eax &= ~0x3FFC000;
7942 
7943                     /* Share the cache at package level. */
7944                     *eax |= MIN(max_thread_ids_for_cache(topo_info,
7945                                 CPU_TOPOLOGY_LEVEL_SOCKET), 4095) << 14;
7946                 }
7947             }
7948         } else if (cpu->vendor_cpuid_only && IS_AMD_CPU(env)) {
7949             *eax = *ebx = *ecx = *edx = 0;
7950         } else {
7951             *eax = 0;
7952 
7953             switch (count) {
7954             case 0: /* L1 dcache info */
7955                 encode_cache_cpuid4(caches->l1d_cache, topo_info,
7956                                     eax, ebx, ecx, edx);
7957                 if (!cpu->l1_cache_per_core) {
7958                     *eax &= ~MAKE_64BIT_MASK(14, 12);
7959                 }
7960                 break;
7961             case 1: /* L1 icache info */
7962                 encode_cache_cpuid4(caches->l1i_cache, topo_info,
7963                                     eax, ebx, ecx, edx);
7964                 if (!cpu->l1_cache_per_core) {
7965                     *eax &= ~MAKE_64BIT_MASK(14, 12);
7966                 }
7967                 break;
7968             case 2: /* L2 cache info */
7969                 encode_cache_cpuid4(caches->l2_cache, topo_info,
7970                                     eax, ebx, ecx, edx);
7971                 break;
7972             case 3: /* L3 cache info */
7973                 if (cpu->enable_l3_cache) {
7974                     encode_cache_cpuid4(caches->l3_cache, topo_info,
7975                                         eax, ebx, ecx, edx);
7976                     break;
7977                 }
7978                 /* fall through */
7979             default: /* end of info */
7980                 *eax = *ebx = *ecx = *edx = 0;
7981                 break;
7982             }
7983         }
7984         break;
7985     }
7986     case 5:
7987         /* MONITOR/MWAIT Leaf */
7988         *eax = cpu->mwait.eax; /* Smallest monitor-line size in bytes */
7989         *ebx = cpu->mwait.ebx; /* Largest monitor-line size in bytes */
7990         *ecx = cpu->mwait.ecx; /* flags */
7991         *edx = cpu->mwait.edx; /* mwait substates */
7992         break;
7993     case 6:
7994         /* Thermal and Power Leaf */
7995         *eax = env->features[FEAT_6_EAX];
7996         *ebx = 0;
7997         *ecx = 0;
7998         *edx = 0;
7999         break;
8000     case 7:
8001         /* Structured Extended Feature Flags Enumeration Leaf */
8002         if (count == 0) {
8003             /* Maximum ECX value for sub-leaves */
8004             *eax = env->cpuid_level_func7;
8005             *ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */
8006             *ecx = env->features[FEAT_7_0_ECX]; /* Feature flags */
8007             if ((*ecx & CPUID_7_0_ECX_PKU) && env->cr[4] & CR4_PKE_MASK) {
8008                 *ecx |= CPUID_7_0_ECX_OSPKE;
8009             }
8010             *edx = env->features[FEAT_7_0_EDX]; /* Feature flags */
8011         } else if (count == 1) {
8012             *eax = env->features[FEAT_7_1_EAX];
8013             *ecx = env->features[FEAT_7_1_ECX];
8014             *edx = env->features[FEAT_7_1_EDX];
8015             *ebx = 0;
8016         } else if (count == 2) {
8017             *edx = env->features[FEAT_7_2_EDX];
8018             *eax = 0;
8019             *ebx = 0;
8020             *ecx = 0;
8021         } else {
8022             *eax = 0;
8023             *ebx = 0;
8024             *ecx = 0;
8025             *edx = 0;
8026         }
8027         break;
8028     case 9:
8029         /* Direct Cache Access Information Leaf */
8030         *eax = 0; /* Bits 0-31 in DCA_CAP MSR */
8031         *ebx = 0;
8032         *ecx = 0;
8033         *edx = 0;
8034         break;
8035     case 0xA:
8036         /* Architectural Performance Monitoring Leaf */
8037         if (cpu->enable_pmu) {
8038             x86_cpu_get_supported_cpuid(0xA, count, eax, ebx, ecx, edx);
8039         } else {
8040             *eax = 0;
8041             *ebx = 0;
8042             *ecx = 0;
8043             *edx = 0;
8044         }
8045         break;
8046     case 0xB:
8047         /* Extended Topology Enumeration Leaf */
8048         if (!cpu->enable_cpuid_0xb) {
8049                 *eax = *ebx = *ecx = *edx = 0;
8050                 break;
8051         }
8052 
8053         *ecx = count & 0xff;
8054         *edx = cpu->apic_id;
8055 
8056         switch (count) {
8057         case 0:
8058             *eax = apicid_core_offset(topo_info);
8059             *ebx = topo_info->threads_per_core;
8060             *ecx |= CPUID_B_ECX_TOPO_LEVEL_SMT << 8;
8061             break;
8062         case 1:
8063             *eax = apicid_pkg_offset(topo_info);
8064             *ebx = threads_per_pkg;
8065             *ecx |= CPUID_B_ECX_TOPO_LEVEL_CORE << 8;
8066             break;
8067         default:
8068             *eax = 0;
8069             *ebx = 0;
8070             *ecx |= CPUID_B_ECX_TOPO_LEVEL_INVALID << 8;
8071         }
8072 
8073         assert(!(*eax & ~0x1f));
8074         *ebx &= 0xffff; /* The count doesn't need to be reliable. */
8075         break;
8076     case 0xD: {
8077         /* Processor Extended State */
8078         *eax = 0;
8079         *ebx = 0;
8080         *ecx = 0;
8081         *edx = 0;
8082         if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
8083             break;
8084         }
8085 
8086         if (count == 0) {
8087             *ecx = xsave_area_size(x86_cpu_xsave_xcr0_components(cpu), false);
8088             *eax = env->features[FEAT_XSAVE_XCR0_LO];
8089             *edx = env->features[FEAT_XSAVE_XCR0_HI];
8090             /*
8091              * The initial value of xcr0 and ebx == 0, On host without kvm
8092              * commit 412a3c41(e.g., CentOS 6), the ebx's value always == 0
8093              * even through guest update xcr0, this will crash some legacy guest
8094              * (e.g., CentOS 6), So set ebx == ecx to workaround it.
8095              */
8096             *ebx = kvm_enabled() ? *ecx : xsave_area_size(env->xcr0, false);
8097         } else if (count == 1) {
8098             uint64_t xstate = x86_cpu_xsave_xcr0_components(cpu) |
8099                               x86_cpu_xsave_xss_components(cpu);
8100 
8101             *eax = env->features[FEAT_XSAVE];
8102             *ebx = xsave_area_size(xstate, true);
8103             *ecx = env->features[FEAT_XSAVE_XSS_LO];
8104             *edx = env->features[FEAT_XSAVE_XSS_HI];
8105             if (kvm_enabled() && cpu->enable_pmu &&
8106                 (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR) &&
8107                 (*eax & CPUID_XSAVE_XSAVES)) {
8108                 *ecx |= XSTATE_ARCH_LBR_MASK;
8109             } else {
8110                 *ecx &= ~XSTATE_ARCH_LBR_MASK;
8111             }
8112         } else if (count == 0xf && cpu->enable_pmu
8113                    && (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR)) {
8114             x86_cpu_get_supported_cpuid(0xD, count, eax, ebx, ecx, edx);
8115         } else if (count < ARRAY_SIZE(x86_ext_save_areas)) {
8116             const ExtSaveArea *esa = &x86_ext_save_areas[count];
8117 
8118             if (x86_cpu_xsave_xcr0_components(cpu) & (1ULL << count)) {
8119                 *eax = esa->size;
8120                 *ebx = esa->offset;
8121                 *ecx = esa->ecx &
8122                        (ESA_FEATURE_ALIGN64_MASK | ESA_FEATURE_XFD_MASK);
8123             } else if (x86_cpu_xsave_xss_components(cpu) & (1ULL << count)) {
8124                 *eax = esa->size;
8125                 *ebx = 0;
8126                 *ecx = 1;
8127             }
8128         }
8129         break;
8130     }
8131     case 0x12:
8132 #ifndef CONFIG_USER_ONLY
8133         if (!kvm_enabled() ||
8134             !(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_SGX)) {
8135             *eax = *ebx = *ecx = *edx = 0;
8136             break;
8137         }
8138 
8139         /*
8140          * SGX sub-leafs CPUID.0x12.{0x2..N} enumerate EPC sections.  Retrieve
8141          * the EPC properties, e.g. confidentiality and integrity, from the
8142          * host's first EPC section, i.e. assume there is one EPC section or
8143          * that all EPC sections have the same security properties.
8144          */
8145         if (count > 1) {
8146             uint64_t epc_addr, epc_size;
8147 
8148             if (sgx_epc_get_section(count - 2, &epc_addr, &epc_size)) {
8149                 *eax = *ebx = *ecx = *edx = 0;
8150                 break;
8151             }
8152             host_cpuid(index, 2, eax, ebx, ecx, edx);
8153             *eax = (uint32_t)(epc_addr & 0xfffff000) | 0x1;
8154             *ebx = (uint32_t)(epc_addr >> 32);
8155             *ecx = (uint32_t)(epc_size & 0xfffff000) | (*ecx & 0xf);
8156             *edx = (uint32_t)(epc_size >> 32);
8157             break;
8158         }
8159 
8160         /*
8161          * SGX sub-leafs CPUID.0x12.{0x0,0x1} are heavily dependent on hardware
8162          * and KVM, i.e. QEMU cannot emulate features to override what KVM
8163          * supports.  Features can be further restricted by userspace, but not
8164          * made more permissive.
8165          */
8166         x86_cpu_get_supported_cpuid(0x12, count, eax, ebx, ecx, edx);
8167 
8168         if (count == 0) {
8169             *eax &= env->features[FEAT_SGX_12_0_EAX];
8170             *ebx &= env->features[FEAT_SGX_12_0_EBX];
8171         } else {
8172             *eax &= env->features[FEAT_SGX_12_1_EAX];
8173             *ebx &= 0; /* ebx reserve */
8174             *ecx &= env->features[FEAT_XSAVE_XCR0_LO];
8175             *edx &= env->features[FEAT_XSAVE_XCR0_HI];
8176 
8177             /* FP and SSE are always allowed regardless of XSAVE/XCR0. */
8178             *ecx |= XSTATE_FP_MASK | XSTATE_SSE_MASK;
8179 
8180             /* Access to PROVISIONKEY requires additional credentials. */
8181             if ((*eax & (1U << 4)) &&
8182                 !kvm_enable_sgx_provisioning(cs->kvm_state)) {
8183                 *eax &= ~(1U << 4);
8184             }
8185         }
8186 #endif
8187         break;
8188     case 0x14: {
8189         /* Intel Processor Trace Enumeration */
8190         *eax = 0;
8191         *ebx = 0;
8192         *ecx = 0;
8193         *edx = 0;
8194         if (!(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) ||
8195             !kvm_enabled()) {
8196             break;
8197         }
8198 
8199         /*
8200          * If these are changed, they should stay in sync with
8201          * x86_cpu_filter_features().
8202          */
8203         if (count == 0) {
8204             *eax = INTEL_PT_MAX_SUBLEAF;
8205             *ebx = INTEL_PT_MINIMAL_EBX;
8206             *ecx = INTEL_PT_MINIMAL_ECX;
8207             if (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP) {
8208                 *ecx |= CPUID_14_0_ECX_LIP;
8209             }
8210         } else if (count == 1) {
8211             *eax = INTEL_PT_MTC_BITMAP | INTEL_PT_ADDR_RANGES_NUM;
8212             *ebx = INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP;
8213         }
8214         break;
8215     }
8216     case 0x1C:
8217         if (cpu->enable_pmu && (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR)) {
8218             x86_cpu_get_supported_cpuid(0x1C, 0, eax, ebx, ecx, edx);
8219             *edx = 0;
8220         }
8221         break;
8222     case 0x1D: {
8223         /* AMX TILE, for now hardcoded for Sapphire Rapids*/
8224         *eax = 0;
8225         *ebx = 0;
8226         *ecx = 0;
8227         *edx = 0;
8228         if (!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE)) {
8229             break;
8230         }
8231 
8232         if (count == 0) {
8233             /* Highest numbered palette subleaf */
8234             *eax = INTEL_AMX_TILE_MAX_SUBLEAF;
8235         } else if (count == 1) {
8236             *eax = INTEL_AMX_TOTAL_TILE_BYTES |
8237                    (INTEL_AMX_BYTES_PER_TILE << 16);
8238             *ebx = INTEL_AMX_BYTES_PER_ROW | (INTEL_AMX_TILE_MAX_NAMES << 16);
8239             *ecx = INTEL_AMX_TILE_MAX_ROWS;
8240         }
8241         break;
8242     }
8243     case 0x1E: {
8244         /* AMX TMUL, for now hardcoded for Sapphire Rapids */
8245         *eax = 0;
8246         *ebx = 0;
8247         *ecx = 0;
8248         *edx = 0;
8249         if (!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE)) {
8250             break;
8251         }
8252 
8253         if (count == 0) {
8254             /* Highest numbered palette subleaf */
8255             *ebx = INTEL_AMX_TMUL_MAX_K | (INTEL_AMX_TMUL_MAX_N << 8);
8256         }
8257         break;
8258     }
8259     case 0x1F:
8260         /* V2 Extended Topology Enumeration Leaf */
8261         if (!x86_has_cpuid_0x1f(cpu)) {
8262             *eax = *ebx = *ecx = *edx = 0;
8263             break;
8264         }
8265 
8266         encode_topo_cpuid1f(env, count, topo_info, eax, ebx, ecx, edx);
8267         break;
8268     case 0x24: {
8269         *eax = 0;
8270         *ebx = 0;
8271         *ecx = 0;
8272         *edx = 0;
8273         if ((env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10) && count == 0) {
8274             *ebx = env->features[FEAT_24_0_EBX] | env->avx10_version;
8275         }
8276         break;
8277     }
8278     case 0x40000000:
8279         /*
8280          * CPUID code in kvm_arch_init_vcpu() ignores stuff
8281          * set here, but we restrict to TCG none the less.
8282          */
8283         if (tcg_enabled() && cpu->expose_tcg) {
8284             memcpy(signature, "TCGTCGTCGTCG", 12);
8285             *eax = 0x40000001;
8286             *ebx = signature[0];
8287             *ecx = signature[1];
8288             *edx = signature[2];
8289         } else {
8290             *eax = 0;
8291             *ebx = 0;
8292             *ecx = 0;
8293             *edx = 0;
8294         }
8295         break;
8296     case 0x40000001:
8297         *eax = 0;
8298         *ebx = 0;
8299         *ecx = 0;
8300         *edx = 0;
8301         break;
8302     case 0x80000000:
8303         *eax = env->cpuid_xlevel;
8304 
8305         if (cpu->vendor_cpuid_only_v2 &&
8306             (IS_INTEL_CPU(env) || IS_ZHAOXIN_CPU(env))) {
8307             *ebx = *ecx = *edx = 0;
8308         } else {
8309             *ebx = env->cpuid_vendor1;
8310             *edx = env->cpuid_vendor2;
8311             *ecx = env->cpuid_vendor3;
8312         }
8313         break;
8314     case 0x80000001:
8315         *eax = env->cpuid_version;
8316         *ebx = 0;
8317         *ecx = env->features[FEAT_8000_0001_ECX];
8318         *edx = env->features[FEAT_8000_0001_EDX];
8319 
8320         if (tcg_enabled() && IS_INTEL_CPU(env) &&
8321             !(env->hflags & HF_LMA_MASK)) {
8322             *edx &= ~CPUID_EXT2_SYSCALL;
8323         }
8324         break;
8325     case 0x80000002:
8326     case 0x80000003:
8327     case 0x80000004:
8328         *eax = env->cpuid_model[(index - 0x80000002) * 4 + 0];
8329         *ebx = env->cpuid_model[(index - 0x80000002) * 4 + 1];
8330         *ecx = env->cpuid_model[(index - 0x80000002) * 4 + 2];
8331         *edx = env->cpuid_model[(index - 0x80000002) * 4 + 3];
8332         break;
8333     case 0x80000005: {
8334         /* cache info (L1 cache/TLB Associativity Field) */
8335         const CPUCaches *caches;
8336 
8337         if (env->enable_legacy_vendor_cache) {
8338             caches = &legacy_amd_cache_info;
8339         } else {
8340             caches = &env->cache_info;
8341         }
8342 
8343         if (cpu->cache_info_passthrough) {
8344             x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
8345             break;
8346         }
8347 
8348         if (cpu->vendor_cpuid_only_v2 && IS_INTEL_CPU(env)) {
8349             *eax = *ebx = *ecx = *edx = 0;
8350             break;
8351         }
8352 
8353         *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) |
8354                (L1_ITLB_2M_ASSOC <<  8) | (L1_ITLB_2M_ENTRIES);
8355         *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) |
8356                (L1_ITLB_4K_ASSOC <<  8) | (L1_ITLB_4K_ENTRIES);
8357         *ecx = encode_cache_cpuid80000005(caches->l1d_cache);
8358         *edx = encode_cache_cpuid80000005(caches->l1i_cache);
8359         break;
8360     }
8361     case 0x80000006: { /* cache info (L2 cache/TLB/L3 cache) */
8362         const CPUCaches *caches;
8363 
8364         if (env->enable_legacy_vendor_cache) {
8365             caches = &legacy_amd_cache_info;
8366         } else {
8367             caches = &env->cache_info;
8368         }
8369 
8370         if (cpu->cache_info_passthrough) {
8371             x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
8372             break;
8373         }
8374 
8375         if (cpu->vendor_cpuid_only_v2 &&
8376             (IS_INTEL_CPU(env) || IS_ZHAOXIN_CPU(env))) {
8377             *eax = *ebx = 0;
8378             encode_cache_cpuid80000006(caches->l2_cache,
8379                                        NULL, ecx, edx);
8380             break;
8381         }
8382 
8383         *eax = (X86_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) |
8384                (L2_DTLB_2M_ENTRIES << 16) |
8385                (X86_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) |
8386                (L2_ITLB_2M_ENTRIES);
8387         *ebx = (X86_ENC_ASSOC(L2_DTLB_4K_ASSOC) << 28) |
8388                (L2_DTLB_4K_ENTRIES << 16) |
8389                (X86_ENC_ASSOC(L2_ITLB_4K_ASSOC) << 12) |
8390                (L2_ITLB_4K_ENTRIES);
8391 
8392         encode_cache_cpuid80000006(caches->l2_cache,
8393                                    cpu->enable_l3_cache ?
8394                                    caches->l3_cache : NULL,
8395                                    ecx, edx);
8396         break;
8397     }
8398     case 0x80000007:
8399         *eax = 0;
8400         if (cpu->vendor_cpuid_only_v2 && IS_INTEL_CPU(env)) {
8401             *ebx = 0;
8402         } else {
8403             *ebx = env->features[FEAT_8000_0007_EBX];
8404         }
8405         *ecx = 0;
8406         *edx = env->features[FEAT_8000_0007_EDX];
8407         break;
8408     case 0x80000008:
8409         /* virtual & phys address size in low 2 bytes. */
8410         *eax = cpu->phys_bits;
8411         if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
8412             /* 64 bit processor */
8413              *eax |= (cpu_x86_virtual_addr_width(env) << 8);
8414              *eax |= (cpu->guest_phys_bits << 16);
8415         }
8416         *ebx = env->features[FEAT_8000_0008_EBX];
8417 
8418         /*
8419          * Don't emulate Bits [7:0] & Bits [15:12] for Intel/Zhaoxin, since
8420          * they're using 0x1f leaf.
8421          */
8422         if (cpu->vendor_cpuid_only_v2 &&
8423             (IS_INTEL_CPU(env) || IS_ZHAOXIN_CPU(env))) {
8424             *ecx = *edx = 0;
8425             break;
8426         }
8427 
8428         if (threads_per_pkg > 1) {
8429             /*
8430              * Bits 15:12 is "The number of bits in the initial
8431              * Core::X86::Apic::ApicId[ApicId] value that indicate
8432              * thread ID within a package".
8433              * Bits 7:0 is "The number of threads in the package is NC+1"
8434              */
8435             *ecx = (apicid_pkg_offset(topo_info) << 12) |
8436                    (threads_per_pkg - 1);
8437         } else {
8438             *ecx = 0;
8439         }
8440         *edx = 0;
8441         break;
8442     case 0x8000000A:
8443         if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
8444             *eax = 0x00000001; /* SVM Revision */
8445             *ebx = 0x00000010; /* nr of ASIDs */
8446             *ecx = 0;
8447             *edx = env->features[FEAT_SVM]; /* optional features */
8448         } else {
8449             *eax = 0;
8450             *ebx = 0;
8451             *ecx = 0;
8452             *edx = 0;
8453         }
8454         break;
8455     case 0x8000001D:
8456         *eax = 0;
8457         if (cpu->cache_info_passthrough) {
8458             x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx);
8459             break;
8460         }
8461         switch (count) {
8462         case 0: /* L1 dcache info */
8463             encode_cache_cpuid8000001d(env->cache_info.l1d_cache,
8464                                        topo_info, eax, ebx, ecx, edx);
8465             break;
8466         case 1: /* L1 icache info */
8467             encode_cache_cpuid8000001d(env->cache_info.l1i_cache,
8468                                        topo_info, eax, ebx, ecx, edx);
8469             break;
8470         case 2: /* L2 cache info */
8471             encode_cache_cpuid8000001d(env->cache_info.l2_cache,
8472                                        topo_info, eax, ebx, ecx, edx);
8473             break;
8474         case 3: /* L3 cache info */
8475             encode_cache_cpuid8000001d(env->cache_info.l3_cache,
8476                                        topo_info, eax, ebx, ecx, edx);
8477             break;
8478         default: /* end of info */
8479             *eax = *ebx = *ecx = *edx = 0;
8480             break;
8481         }
8482         if (cpu->amd_topoext_features_only) {
8483             *edx &= CACHE_NO_INVD_SHARING | CACHE_INCLUSIVE;
8484         }
8485         break;
8486     case 0x8000001E:
8487         if (cpu->core_id <= 255) {
8488             encode_topo_cpuid8000001e(cpu, topo_info, eax, ebx, ecx, edx);
8489         } else {
8490             *eax = 0;
8491             *ebx = 0;
8492             *ecx = 0;
8493             *edx = 0;
8494         }
8495         break;
8496     case 0x8000001F:
8497         *eax = *ebx = *ecx = *edx = 0;
8498         if (sev_enabled()) {
8499             *eax = 0x2;
8500             *eax |= sev_es_enabled() ? 0x8 : 0;
8501             *eax |= sev_snp_enabled() ? 0x10 : 0;
8502             *ebx = sev_get_cbit_position() & 0x3f; /* EBX[5:0] */
8503             *ebx |= (sev_get_reduced_phys_bits() & 0x3f) << 6; /* EBX[11:6] */
8504         }
8505         break;
8506     case 0x80000021:
8507         *eax = *ebx = *ecx = *edx = 0;
8508         *eax = env->features[FEAT_8000_0021_EAX];
8509         *ebx = env->features[FEAT_8000_0021_EBX];
8510         break;
8511     case 0x80000022:
8512         *eax = *ebx = *ecx = *edx = 0;
8513         /* AMD Extended Performance Monitoring and Debug */
8514         if (kvm_enabled() && cpu->enable_pmu &&
8515             (env->features[FEAT_8000_0022_EAX] & CPUID_8000_0022_EAX_PERFMON_V2)) {
8516             *eax |= CPUID_8000_0022_EAX_PERFMON_V2;
8517             *ebx |= kvm_arch_get_supported_cpuid(cs->kvm_state, index, count,
8518                                                  R_EBX) & 0xf;
8519         }
8520         break;
8521     case 0xC0000000:
8522         *eax = env->cpuid_xlevel2;
8523         *ebx = 0;
8524         *ecx = 0;
8525         *edx = 0;
8526         break;
8527     case 0xC0000001:
8528         /* Support for VIA CPU's CPUID instruction */
8529         *eax = env->cpuid_version;
8530         *ebx = 0;
8531         *ecx = 0;
8532         *edx = env->features[FEAT_C000_0001_EDX];
8533         break;
8534     case 0xC0000002:
8535     case 0xC0000003:
8536     case 0xC0000004:
8537         /* Reserved for the future, and now filled with zero */
8538         *eax = 0;
8539         *ebx = 0;
8540         *ecx = 0;
8541         *edx = 0;
8542         break;
8543     default:
8544         /* reserved values: zero */
8545         *eax = 0;
8546         *ebx = 0;
8547         *ecx = 0;
8548         *edx = 0;
8549         break;
8550     }
8551 }
8552 
x86_cpu_set_sgxlepubkeyhash(CPUX86State * env)8553 static void x86_cpu_set_sgxlepubkeyhash(CPUX86State *env)
8554 {
8555 #ifndef CONFIG_USER_ONLY
8556     /* Those default values are defined in Skylake HW */
8557     env->msr_ia32_sgxlepubkeyhash[0] = 0xa6053e051270b7acULL;
8558     env->msr_ia32_sgxlepubkeyhash[1] = 0x6cfbe8ba8b3b413dULL;
8559     env->msr_ia32_sgxlepubkeyhash[2] = 0xc4916d99f2b3735dULL;
8560     env->msr_ia32_sgxlepubkeyhash[3] = 0xd4f8c05909f9bb3bULL;
8561 #endif
8562 }
8563 
cpuid_has_xsave_feature(CPUX86State * env,const ExtSaveArea * esa)8564 static bool cpuid_has_xsave_feature(CPUX86State *env, const ExtSaveArea *esa)
8565 {
8566     if (!esa->size) {
8567         return false;
8568     }
8569 
8570     if (env->features[esa->feature] & esa->bits) {
8571         return true;
8572     }
8573     if (esa->feature == FEAT_7_0_EBX && esa->bits == CPUID_7_0_EBX_AVX512F
8574         && (env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10)) {
8575         return true;
8576     }
8577 
8578     return false;
8579 }
8580 
x86_cpu_reset_hold(Object * obj,ResetType type)8581 static void x86_cpu_reset_hold(Object *obj, ResetType type)
8582 {
8583     CPUState *cs = CPU(obj);
8584     X86CPU *cpu = X86_CPU(cs);
8585     X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
8586     CPUX86State *env = &cpu->env;
8587     target_ulong cr4;
8588     uint64_t xcr0;
8589     int i;
8590 
8591     if (xcc->parent_phases.hold) {
8592         xcc->parent_phases.hold(obj, type);
8593     }
8594 
8595     memset(env, 0, offsetof(CPUX86State, end_reset_fields));
8596 
8597     if (tcg_enabled()) {
8598         cpu_init_fp_statuses(env);
8599     }
8600 
8601     env->old_exception = -1;
8602 
8603     /* init to reset state */
8604     env->int_ctl = 0;
8605     env->hflags2 |= HF2_GIF_MASK;
8606     env->hflags2 |= HF2_VGIF_MASK;
8607     env->hflags &= ~HF_GUEST_MASK;
8608 
8609     cpu_x86_update_cr0(env, 0x60000010);
8610     env->a20_mask = ~0x0;
8611     env->smbase = 0x30000;
8612     env->msr_smi_count = 0;
8613 
8614     env->idt.limit = 0xffff;
8615     env->gdt.limit = 0xffff;
8616     env->ldt.limit = 0xffff;
8617     env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT);
8618     env->tr.limit = 0xffff;
8619     env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT);
8620 
8621     cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff,
8622                            DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK |
8623                            DESC_R_MASK | DESC_A_MASK);
8624     cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff,
8625                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
8626                            DESC_A_MASK);
8627     cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff,
8628                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
8629                            DESC_A_MASK);
8630     cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff,
8631                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
8632                            DESC_A_MASK);
8633     cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff,
8634                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
8635                            DESC_A_MASK);
8636     cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff,
8637                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
8638                            DESC_A_MASK);
8639 
8640     env->eip = 0xfff0;
8641     env->regs[R_EDX] = env->cpuid_version;
8642 
8643     env->eflags = 0x2;
8644 
8645     /* FPU init */
8646     for (i = 0; i < 8; i++) {
8647         env->fptags[i] = 1;
8648     }
8649     cpu_set_fpuc(env, 0x37f);
8650 
8651     env->mxcsr = 0x1f80;
8652     /* All units are in INIT state.  */
8653     env->xstate_bv = 0;
8654 
8655     env->pat = 0x0007040600070406ULL;
8656 
8657     if (kvm_enabled()) {
8658         /*
8659          * KVM handles TSC = 0 specially and thinks we are hot-plugging
8660          * a new CPU, use 1 instead to force a reset.
8661          */
8662         if (env->tsc != 0) {
8663             env->tsc = 1;
8664         }
8665     } else {
8666         env->tsc = 0;
8667     }
8668 
8669     env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT;
8670     if (env->features[FEAT_1_ECX] & CPUID_EXT_MONITOR) {
8671         env->msr_ia32_misc_enable |= MSR_IA32_MISC_ENABLE_MWAIT;
8672     }
8673 
8674     memset(env->dr, 0, sizeof(env->dr));
8675     env->dr[6] = DR6_FIXED_1;
8676     env->dr[7] = DR7_FIXED_1;
8677     cpu_breakpoint_remove_all(cs, BP_CPU);
8678     cpu_watchpoint_remove_all(cs, BP_CPU);
8679 
8680     cr4 = 0;
8681     xcr0 = XSTATE_FP_MASK;
8682 
8683 #ifdef CONFIG_USER_ONLY
8684     /* Enable all the features for user-mode.  */
8685     if (env->features[FEAT_1_EDX] & CPUID_SSE) {
8686         xcr0 |= XSTATE_SSE_MASK;
8687     }
8688     for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
8689         const ExtSaveArea *esa = &x86_ext_save_areas[i];
8690         if (!((1 << i) & CPUID_XSTATE_XCR0_MASK)) {
8691             continue;
8692         }
8693         if (cpuid_has_xsave_feature(env, esa)) {
8694             xcr0 |= 1ull << i;
8695         }
8696     }
8697 
8698     if (env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE) {
8699         cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK;
8700     }
8701     if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_FSGSBASE) {
8702         cr4 |= CR4_FSGSBASE_MASK;
8703     }
8704 #endif
8705 
8706     env->xcr0 = xcr0;
8707     cpu_x86_update_cr4(env, cr4);
8708 
8709     /*
8710      * SDM 11.11.5 requires:
8711      *  - IA32_MTRR_DEF_TYPE MSR.E = 0
8712      *  - IA32_MTRR_PHYSMASKn.V = 0
8713      * All other bits are undefined.  For simplification, zero it all.
8714      */
8715     env->mtrr_deftype = 0;
8716     memset(env->mtrr_var, 0, sizeof(env->mtrr_var));
8717     memset(env->mtrr_fixed, 0, sizeof(env->mtrr_fixed));
8718 
8719     env->interrupt_injected = -1;
8720     env->exception_nr = -1;
8721     env->exception_pending = 0;
8722     env->exception_injected = 0;
8723     env->exception_has_payload = false;
8724     env->exception_payload = 0;
8725     env->nmi_injected = false;
8726     env->triple_fault_pending = false;
8727 #if !defined(CONFIG_USER_ONLY)
8728     /* We hard-wire the BSP to the first CPU. */
8729     apic_designate_bsp(cpu->apic_state, cs->cpu_index == 0);
8730 
8731     cs->halted = !cpu_is_bsp(cpu);
8732 
8733     if (kvm_enabled()) {
8734         kvm_arch_reset_vcpu(cpu);
8735     }
8736 
8737     x86_cpu_set_sgxlepubkeyhash(env);
8738 
8739     env->amd_tsc_scale_msr =  MSR_AMD64_TSC_RATIO_DEFAULT;
8740 
8741 #endif
8742 }
8743 
x86_cpu_after_reset(X86CPU * cpu)8744 void x86_cpu_after_reset(X86CPU *cpu)
8745 {
8746 #ifndef CONFIG_USER_ONLY
8747     if (kvm_enabled()) {
8748         kvm_arch_after_reset_vcpu(cpu);
8749     }
8750 
8751     if (cpu->apic_state) {
8752         device_cold_reset(cpu->apic_state);
8753     }
8754 #endif
8755 }
8756 
mce_init(X86CPU * cpu)8757 static void mce_init(X86CPU *cpu)
8758 {
8759     CPUX86State *cenv = &cpu->env;
8760     unsigned int bank;
8761 
8762     if (x86_cpu_family(cenv->cpuid_version) >= 6
8763         && (cenv->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) ==
8764             (CPUID_MCE | CPUID_MCA)) {
8765         cenv->mcg_cap = MCE_CAP_DEF | MCE_BANKS_DEF |
8766                         (cpu->enable_lmce ? MCG_LMCE_P : 0);
8767         cenv->mcg_ctl = ~(uint64_t)0;
8768         for (bank = 0; bank < MCE_BANKS_DEF; bank++) {
8769             cenv->mce_banks[bank * 4] = ~(uint64_t)0;
8770         }
8771     }
8772 }
8773 
x86_cpu_adjust_level(X86CPU * cpu,uint32_t * min,uint32_t value)8774 static void x86_cpu_adjust_level(X86CPU *cpu, uint32_t *min, uint32_t value)
8775 {
8776     if (*min < value) {
8777         *min = value;
8778     }
8779 }
8780 
8781 /* Increase cpuid_min_{level,xlevel,xlevel2} automatically, if appropriate */
x86_cpu_adjust_feat_level(X86CPU * cpu,FeatureWord w)8782 static void x86_cpu_adjust_feat_level(X86CPU *cpu, FeatureWord w)
8783 {
8784     CPUX86State *env = &cpu->env;
8785     FeatureWordInfo *fi = &feature_word_info[w];
8786     uint32_t eax = fi->cpuid.eax;
8787     uint32_t region = eax & 0xF0000000;
8788 
8789     assert(feature_word_info[w].type == CPUID_FEATURE_WORD);
8790     if (!env->features[w]) {
8791         return;
8792     }
8793 
8794     switch (region) {
8795     case 0x00000000:
8796         x86_cpu_adjust_level(cpu, &env->cpuid_min_level, eax);
8797     break;
8798     case 0x80000000:
8799         x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, eax);
8800     break;
8801     case 0xC0000000:
8802         x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel2, eax);
8803     break;
8804     }
8805 
8806     if (eax == 7) {
8807         x86_cpu_adjust_level(cpu, &env->cpuid_min_level_func7,
8808                              fi->cpuid.ecx);
8809     }
8810 }
8811 
8812 /* Calculate XSAVE components based on the configured CPU feature flags */
x86_cpu_enable_xsave_components(X86CPU * cpu)8813 static void x86_cpu_enable_xsave_components(X86CPU *cpu)
8814 {
8815     CPUX86State *env = &cpu->env;
8816     int i;
8817     uint64_t mask;
8818     static bool request_perm;
8819 
8820     if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
8821         env->features[FEAT_XSAVE_XCR0_LO] = 0;
8822         env->features[FEAT_XSAVE_XCR0_HI] = 0;
8823         env->features[FEAT_XSAVE_XSS_LO] = 0;
8824         env->features[FEAT_XSAVE_XSS_HI] = 0;
8825         return;
8826     }
8827 
8828     mask = 0;
8829     for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
8830         const ExtSaveArea *esa = &x86_ext_save_areas[i];
8831         if (cpuid_has_xsave_feature(env, esa)) {
8832             mask |= (1ULL << i);
8833         }
8834     }
8835 
8836     /* Only request permission for first vcpu */
8837     if (kvm_enabled() && !request_perm) {
8838         kvm_request_xsave_components(cpu, mask);
8839         request_perm = true;
8840     }
8841 
8842     env->features[FEAT_XSAVE_XCR0_LO] = mask & CPUID_XSTATE_XCR0_MASK;
8843     env->features[FEAT_XSAVE_XCR0_HI] = (mask & CPUID_XSTATE_XCR0_MASK) >> 32;
8844     env->features[FEAT_XSAVE_XSS_LO] = mask & CPUID_XSTATE_XSS_MASK;
8845     env->features[FEAT_XSAVE_XSS_HI] = (mask & CPUID_XSTATE_XSS_MASK) >> 32;
8846 }
8847 
8848 /***** Steps involved on loading and filtering CPUID data
8849  *
8850  * When initializing and realizing a CPU object, the steps
8851  * involved in setting up CPUID data are:
8852  *
8853  * 1) Loading CPU model definition (X86CPUDefinition). This is
8854  *    implemented by x86_cpu_load_model() and should be completely
8855  *    transparent, as it is done automatically by instance_init.
8856  *    No code should need to look at X86CPUDefinition structs
8857  *    outside instance_init.
8858  *
8859  * 2) CPU expansion. This is done by realize before CPUID
8860  *    filtering, and will make sure host/accelerator data is
8861  *    loaded for CPU models that depend on host capabilities
8862  *    (e.g. "host"). Done by x86_cpu_expand_features().
8863  *
8864  * 3) CPUID filtering. This initializes extra data related to
8865  *    CPUID, and checks if the host supports all capabilities
8866  *    required by the CPU. Runnability of a CPU model is
8867  *    determined at this step. Done by x86_cpu_filter_features().
8868  *
8869  * Some operations don't require all steps to be performed.
8870  * More precisely:
8871  *
8872  * - CPU instance creation (instance_init) will run only CPU
8873  *   model loading. CPU expansion can't run at instance_init-time
8874  *   because host/accelerator data may be not available yet.
8875  * - CPU realization will perform both CPU model expansion and CPUID
8876  *   filtering, and return an error in case one of them fails.
8877  * - query-cpu-definitions needs to run all 3 steps. It needs
8878  *   to run CPUID filtering, as the 'unavailable-features'
8879  *   field is set based on the filtering results.
8880  * - The query-cpu-model-expansion QMP command only needs to run
8881  *   CPU model loading and CPU expansion. It should not filter
8882  *   any CPUID data based on host capabilities.
8883  */
8884 
8885 /* Expand CPU configuration data, based on configured features
8886  * and host/accelerator capabilities when appropriate.
8887  */
x86_cpu_expand_features(X86CPU * cpu,Error ** errp)8888 void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
8889 {
8890     X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu);
8891     CPUX86State *env = &cpu->env;
8892     FeatureWord w;
8893     int i;
8894     GList *l;
8895 
8896     for (l = plus_features; l; l = l->next) {
8897         const char *prop = l->data;
8898         if (!object_property_set_bool(OBJECT(cpu), prop, true, errp)) {
8899             return;
8900         }
8901     }
8902 
8903     for (l = minus_features; l; l = l->next) {
8904         const char *prop = l->data;
8905         if (!object_property_set_bool(OBJECT(cpu), prop, false, errp)) {
8906             return;
8907         }
8908     }
8909 
8910     /* TODO: Now xcc->max_features doesn't overwrite features
8911      * set using QOM properties, and we can convert
8912      * plus_features & minus_features to global properties
8913      * inside x86_cpu_parse_featurestr() too.
8914      */
8915     if (xcc->max_features) {
8916         for (w = 0; w < FEATURE_WORDS; w++) {
8917             /* Override only features that weren't set explicitly
8918              * by the user.
8919              */
8920             env->features[w] |=
8921                 x86_cpu_get_supported_feature_word(cpu, w) &
8922                 ~env->user_features[w] &
8923                 ~feature_word_info[w].no_autoenable_flags;
8924         }
8925 
8926         if ((env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10) && !env->avx10_version) {
8927             uint32_t eax, ebx, ecx, edx;
8928             x86_cpu_get_supported_cpuid(0x24, 0, &eax, &ebx, &ecx, &edx);
8929             env->avx10_version = ebx & 0xff;
8930         }
8931     }
8932 
8933     if (x86_threads_per_pkg(&env->topo_info) > 1) {
8934         env->features[FEAT_1_EDX] |= CPUID_HT;
8935 
8936         /*
8937          * The Linux kernel checks for the CMPLegacy bit and
8938          * discards multiple thread information if it is set.
8939          * So don't set it here for Intel (and other processors
8940          * following Intel's behavior) to make Linux guests happy.
8941          */
8942         if (!IS_INTEL_CPU(env) && !IS_ZHAOXIN_CPU(env)) {
8943             env->features[FEAT_8000_0001_ECX] |= CPUID_EXT3_CMP_LEG;
8944         }
8945     }
8946 
8947     /* PDCM is fixed1 bit for TDX */
8948     if (!cpu->enable_pmu && !is_tdx_vm()) {
8949         env->features[FEAT_1_ECX] &= ~CPUID_EXT_PDCM;
8950     }
8951 
8952     for (i = 0; i < ARRAY_SIZE(feature_dependencies); i++) {
8953         FeatureDep *d = &feature_dependencies[i];
8954         if (!(env->features[d->from.index] & d->from.mask)) {
8955             uint64_t unavailable_features = env->features[d->to.index] & d->to.mask;
8956 
8957             /* Not an error unless the dependent feature was added explicitly.  */
8958             mark_unavailable_features(cpu, d->to.index,
8959                                       unavailable_features & env->user_features[d->to.index],
8960                                       "This feature depends on other features that were not requested");
8961 
8962             env->features[d->to.index] &= ~unavailable_features;
8963         }
8964     }
8965 
8966     if (!kvm_enabled() || !cpu->expose_kvm) {
8967         env->features[FEAT_KVM] = 0;
8968     }
8969 
8970     x86_cpu_enable_xsave_components(cpu);
8971 
8972     /* CPUID[EAX=7,ECX=0].EBX always increased level automatically: */
8973     x86_cpu_adjust_feat_level(cpu, FEAT_7_0_EBX);
8974     if (cpu->full_cpuid_auto_level) {
8975         x86_cpu_adjust_feat_level(cpu, FEAT_1_EDX);
8976         x86_cpu_adjust_feat_level(cpu, FEAT_1_ECX);
8977         x86_cpu_adjust_feat_level(cpu, FEAT_6_EAX);
8978         x86_cpu_adjust_feat_level(cpu, FEAT_7_0_ECX);
8979         x86_cpu_adjust_feat_level(cpu, FEAT_7_1_EAX);
8980         x86_cpu_adjust_feat_level(cpu, FEAT_7_1_ECX);
8981         x86_cpu_adjust_feat_level(cpu, FEAT_7_1_EDX);
8982         x86_cpu_adjust_feat_level(cpu, FEAT_7_2_EDX);
8983         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_EDX);
8984         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_ECX);
8985         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0007_EDX);
8986         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0008_EBX);
8987         x86_cpu_adjust_feat_level(cpu, FEAT_C000_0001_EDX);
8988         x86_cpu_adjust_feat_level(cpu, FEAT_SVM);
8989         x86_cpu_adjust_feat_level(cpu, FEAT_XSAVE);
8990 
8991         /* Intel Processor Trace requires CPUID[0x14] */
8992         if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT)) {
8993             if (cpu->intel_pt_auto_level) {
8994                 x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14);
8995             } else if (cpu->env.cpuid_min_level < 0x14) {
8996                 mark_unavailable_features(cpu, FEAT_7_0_EBX,
8997                     CPUID_7_0_EBX_INTEL_PT,
8998                     "Intel PT need CPUID leaf 0x14, please set by \"-cpu ...,intel-pt=on,min-level=0x14\"");
8999             }
9000         }
9001 
9002         /*
9003          * Intel CPU topology with multi-dies support requires CPUID[0x1F].
9004          * For AMD Rome/Milan, cpuid level is 0x10, and guest OS should detect
9005          * extended toplogy by leaf 0xB. Only adjust it for Intel CPU, unless
9006          * cpu->vendor_cpuid_only has been unset for compatibility with older
9007          * machine types.
9008          */
9009         if (x86_has_cpuid_0x1f(cpu) &&
9010             (IS_INTEL_CPU(env) || !cpu->vendor_cpuid_only)) {
9011             x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x1F);
9012         }
9013 
9014         /* Advanced Vector Extensions 10 (AVX10) requires CPUID[0x24] */
9015         if (env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10) {
9016             x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x24);
9017         }
9018 
9019         /* SVM requires CPUID[0x8000000A] */
9020         if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
9021             x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000000A);
9022         }
9023 
9024         /* SEV requires CPUID[0x8000001F] */
9025         if (sev_enabled()) {
9026             x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000001F);
9027         }
9028 
9029         if (env->features[FEAT_8000_0021_EAX]) {
9030             x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x80000021);
9031         }
9032 
9033         /* SGX requires CPUID[0x12] for EPC enumeration */
9034         if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_SGX) {
9035             x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x12);
9036         }
9037     }
9038 
9039     /* Set cpuid_*level* based on cpuid_min_*level, if not explicitly set */
9040     if (env->cpuid_level_func7 == UINT32_MAX) {
9041         env->cpuid_level_func7 = env->cpuid_min_level_func7;
9042     }
9043     if (env->cpuid_level == UINT32_MAX) {
9044         env->cpuid_level = env->cpuid_min_level;
9045     }
9046     if (env->cpuid_xlevel == UINT32_MAX) {
9047         env->cpuid_xlevel = env->cpuid_min_xlevel;
9048     }
9049     if (env->cpuid_xlevel2 == UINT32_MAX) {
9050         env->cpuid_xlevel2 = env->cpuid_min_xlevel2;
9051     }
9052 
9053     if (kvm_enabled() && !kvm_hyperv_expand_features(cpu, errp)) {
9054         return;
9055     }
9056 }
9057 
9058 /*
9059  * Finishes initialization of CPUID data, filters CPU feature
9060  * words based on host availability of each feature.
9061  *
9062  * Returns: true if any flag is not supported by the host, false otherwise.
9063  */
x86_cpu_filter_features(X86CPU * cpu,bool verbose)9064 static bool x86_cpu_filter_features(X86CPU *cpu, bool verbose)
9065 {
9066     CPUX86State *env = &cpu->env;
9067     FeatureWord w;
9068     const char *prefix = NULL;
9069     bool have_filtered_features;
9070 
9071     uint32_t eax_0, ebx_0, ecx_0, edx_0;
9072     uint32_t eax_1, ebx_1, ecx_1, edx_1;
9073 
9074     if (verbose) {
9075         prefix = accel_uses_host_cpuid()
9076                  ? "host doesn't support requested feature"
9077                  : "TCG doesn't support requested feature";
9078     }
9079 
9080     for (w = 0; w < FEATURE_WORDS; w++) {
9081         uint64_t host_feat =
9082             x86_cpu_get_supported_feature_word(NULL, w);
9083         uint64_t requested_features = env->features[w];
9084         uint64_t unavailable_features = requested_features & ~host_feat;
9085         mark_unavailable_features(cpu, w, unavailable_features, prefix);
9086     }
9087 
9088     /*
9089      * Check that KVM actually allows the processor tracing features that
9090      * are advertised by cpu_x86_cpuid().  Keep these two in sync.
9091      */
9092     if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) &&
9093         kvm_enabled()) {
9094         x86_cpu_get_supported_cpuid(0x14, 0,
9095                                     &eax_0, &ebx_0, &ecx_0, &edx_0);
9096         x86_cpu_get_supported_cpuid(0x14, 1,
9097                                     &eax_1, &ebx_1, &ecx_1, &edx_1);
9098 
9099         if (!eax_0 ||
9100            ((ebx_0 & INTEL_PT_MINIMAL_EBX) != INTEL_PT_MINIMAL_EBX) ||
9101            ((ecx_0 & INTEL_PT_MINIMAL_ECX) != INTEL_PT_MINIMAL_ECX) ||
9102            ((eax_1 & INTEL_PT_MTC_BITMAP) != INTEL_PT_MTC_BITMAP) ||
9103            ((eax_1 & INTEL_PT_ADDR_RANGES_NUM_MASK) <
9104                                            INTEL_PT_ADDR_RANGES_NUM) ||
9105            ((ebx_1 & (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) !=
9106                 (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) ||
9107            ((ecx_0 & CPUID_14_0_ECX_LIP) !=
9108                 (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP))) {
9109             /*
9110              * Processor Trace capabilities aren't configurable, so if the
9111              * host can't emulate the capabilities we report on
9112              * cpu_x86_cpuid(), intel-pt can't be enabled on the current host.
9113              */
9114             mark_unavailable_features(cpu, FEAT_7_0_EBX, CPUID_7_0_EBX_INTEL_PT, prefix);
9115         }
9116     }
9117 
9118     have_filtered_features = x86_cpu_have_filtered_features(cpu);
9119 
9120     if (env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10) {
9121         x86_cpu_get_supported_cpuid(0x24, 0,
9122                                     &eax_0, &ebx_0, &ecx_0, &edx_0);
9123         uint8_t version = ebx_0 & 0xff;
9124 
9125         if (version < env->avx10_version) {
9126             if (prefix) {
9127                 warn_report("%s: avx10.%d. Adjust to avx10.%d",
9128                             prefix, env->avx10_version, version);
9129             }
9130             env->avx10_version = version;
9131             have_filtered_features = true;
9132         }
9133     } else if (env->avx10_version) {
9134         if (prefix) {
9135             warn_report("%s: avx10.%d.", prefix, env->avx10_version);
9136         }
9137         have_filtered_features = true;
9138     }
9139 
9140     return have_filtered_features;
9141 }
9142 
x86_cpu_hyperv_realize(X86CPU * cpu)9143 static void x86_cpu_hyperv_realize(X86CPU *cpu)
9144 {
9145     size_t len;
9146 
9147     /* Hyper-V vendor id */
9148     if (!cpu->hyperv_vendor) {
9149         object_property_set_str(OBJECT(cpu), "hv-vendor-id", "Microsoft Hv",
9150                                 &error_abort);
9151     }
9152     len = strlen(cpu->hyperv_vendor);
9153     if (len > 12) {
9154         warn_report("hv-vendor-id truncated to 12 characters");
9155         len = 12;
9156     }
9157     memset(cpu->hyperv_vendor_id, 0, 12);
9158     memcpy(cpu->hyperv_vendor_id, cpu->hyperv_vendor, len);
9159 
9160     /* 'Hv#1' interface identification*/
9161     cpu->hyperv_interface_id[0] = 0x31237648;
9162     cpu->hyperv_interface_id[1] = 0;
9163     cpu->hyperv_interface_id[2] = 0;
9164     cpu->hyperv_interface_id[3] = 0;
9165 
9166     /* Hypervisor implementation limits */
9167     cpu->hyperv_limits[0] = 64;
9168     cpu->hyperv_limits[1] = 0;
9169     cpu->hyperv_limits[2] = 0;
9170 }
9171 
9172 #ifndef CONFIG_USER_ONLY
x86_cpu_update_smp_cache_topo(MachineState * ms,X86CPU * cpu,Error ** errp)9173 static bool x86_cpu_update_smp_cache_topo(MachineState *ms, X86CPU *cpu,
9174                                           Error **errp)
9175 {
9176     CPUX86State *env = &cpu->env;
9177     CpuTopologyLevel level;
9178 
9179     level = machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1D);
9180     if (level != CPU_TOPOLOGY_LEVEL_DEFAULT) {
9181         env->cache_info.l1d_cache->share_level = level;
9182     } else {
9183         machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1D,
9184             env->cache_info.l1d_cache->share_level);
9185     }
9186 
9187     level = machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1I);
9188     if (level != CPU_TOPOLOGY_LEVEL_DEFAULT) {
9189         env->cache_info.l1i_cache->share_level = level;
9190     } else {
9191         machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1I,
9192             env->cache_info.l1i_cache->share_level);
9193     }
9194 
9195     level = machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L2);
9196     if (level != CPU_TOPOLOGY_LEVEL_DEFAULT) {
9197         env->cache_info.l2_cache->share_level = level;
9198     } else {
9199         machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L2,
9200             env->cache_info.l2_cache->share_level);
9201     }
9202 
9203     level = machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L3);
9204     if (level != CPU_TOPOLOGY_LEVEL_DEFAULT) {
9205         env->cache_info.l3_cache->share_level = level;
9206     } else {
9207         machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L3,
9208             env->cache_info.l3_cache->share_level);
9209     }
9210 
9211     if (!machine_check_smp_cache(ms, errp)) {
9212         return false;
9213     }
9214     return true;
9215 }
9216 #endif
9217 
x86_cpu_realizefn(DeviceState * dev,Error ** errp)9218 static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
9219 {
9220     CPUState *cs = CPU(dev);
9221     X86CPU *cpu = X86_CPU(dev);
9222     X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
9223     CPUX86State *env = &cpu->env;
9224     Error *local_err = NULL;
9225     unsigned requested_lbr_fmt;
9226 
9227 #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
9228     /* Use pc-relative instructions in system-mode */
9229     tcg_cflags_set(cs, CF_PCREL);
9230 #endif
9231 
9232     /*
9233      * x-vendor-cpuid-only and v2 should be initernal only. But
9234      * QEMU doesn't support "internal" property.
9235      */
9236     if (!cpu->vendor_cpuid_only && cpu->vendor_cpuid_only_v2) {
9237         error_setg(errp, "x-vendor-cpuid-only-v2 property "
9238                    "depends on x-vendor-cpuid-only");
9239         return;
9240     }
9241 
9242     if (cpu->apic_id == UNASSIGNED_APIC_ID) {
9243         error_setg(errp, "apic-id property was not initialized properly");
9244         return;
9245     }
9246 
9247     /*
9248      * Process Hyper-V enlightenments.
9249      * Note: this currently has to happen before the expansion of CPU features.
9250      */
9251     x86_cpu_hyperv_realize(cpu);
9252 
9253     x86_cpu_expand_features(cpu, &local_err);
9254     if (local_err) {
9255         goto out;
9256     }
9257 
9258     /*
9259      * Override env->features[FEAT_PERF_CAPABILITIES].LBR_FMT
9260      * with user-provided setting.
9261      */
9262     if (cpu->lbr_fmt != ~PERF_CAP_LBR_FMT) {
9263         if ((cpu->lbr_fmt & PERF_CAP_LBR_FMT) != cpu->lbr_fmt) {
9264             error_setg(errp, "invalid lbr-fmt");
9265             return;
9266         }
9267         env->features[FEAT_PERF_CAPABILITIES] &= ~PERF_CAP_LBR_FMT;
9268         env->features[FEAT_PERF_CAPABILITIES] |= cpu->lbr_fmt;
9269     }
9270 
9271     /*
9272      * vPMU LBR is supported when 1) KVM is enabled 2) Option pmu=on and
9273      * 3)vPMU LBR format matches that of host setting.
9274      */
9275     requested_lbr_fmt =
9276         env->features[FEAT_PERF_CAPABILITIES] & PERF_CAP_LBR_FMT;
9277     if (requested_lbr_fmt && kvm_enabled()) {
9278         uint64_t host_perf_cap =
9279             x86_cpu_get_supported_feature_word(NULL, FEAT_PERF_CAPABILITIES);
9280         unsigned host_lbr_fmt = host_perf_cap & PERF_CAP_LBR_FMT;
9281 
9282         if (!cpu->enable_pmu) {
9283             error_setg(errp, "vPMU: LBR is unsupported without pmu=on");
9284             return;
9285         }
9286         if (requested_lbr_fmt != host_lbr_fmt) {
9287             error_setg(errp, "vPMU: the lbr-fmt value (0x%x) does not match "
9288                         "the host value (0x%x).",
9289                         requested_lbr_fmt, host_lbr_fmt);
9290             return;
9291         }
9292     }
9293 
9294     if (x86_cpu_filter_features(cpu, cpu->check_cpuid || cpu->enforce_cpuid)) {
9295         if (cpu->enforce_cpuid) {
9296             error_setg(&local_err,
9297                        accel_uses_host_cpuid() ?
9298                        "Host doesn't support requested features" :
9299                        "TCG doesn't support requested features");
9300             goto out;
9301         }
9302     }
9303 
9304     /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on
9305      * CPUID[1].EDX.
9306      */
9307     if (IS_AMD_CPU(env)) {
9308         env->features[FEAT_8000_0001_EDX] &= ~CPUID_EXT2_AMD_ALIASES;
9309         env->features[FEAT_8000_0001_EDX] |= (env->features[FEAT_1_EDX]
9310            & CPUID_EXT2_AMD_ALIASES);
9311     }
9312 
9313     x86_cpu_set_sgxlepubkeyhash(env);
9314 
9315     /*
9316      * note: the call to the framework needs to happen after feature expansion,
9317      * but before the checks/modifications to ucode_rev, mwait, phys_bits.
9318      * These may be set by the accel-specific code,
9319      * and the results are subsequently checked / assumed in this function.
9320      */
9321     cpu_exec_realizefn(cs, &local_err);
9322     if (local_err != NULL) {
9323         error_propagate(errp, local_err);
9324         return;
9325     }
9326 
9327     if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
9328         g_autofree char *name = x86_cpu_class_get_model_name(xcc);
9329         error_setg(&local_err, "CPU model '%s' requires KVM or HVF", name);
9330         goto out;
9331     }
9332 
9333     if (cpu->guest_phys_bits == -1) {
9334         /*
9335          * If it was not set by the user, or by the accelerator via
9336          * cpu_exec_realizefn, clear.
9337          */
9338         cpu->guest_phys_bits = 0;
9339     }
9340 
9341     if (cpu->ucode_rev == 0) {
9342         /*
9343          * The default is the same as KVM's. Note that this check
9344          * needs to happen after the evenual setting of ucode_rev in
9345          * accel-specific code in cpu_exec_realizefn.
9346          */
9347         if (IS_AMD_CPU(env)) {
9348             cpu->ucode_rev = 0x01000065;
9349         } else {
9350             cpu->ucode_rev = 0x100000000ULL;
9351         }
9352     }
9353 
9354     /*
9355      * mwait extended info: needed for Core compatibility
9356      * We always wake on interrupt even if host does not have the capability.
9357      *
9358      * requires the accel-specific code in cpu_exec_realizefn to
9359      * have already acquired the CPUID data into cpu->mwait.
9360      */
9361     cpu->mwait.ecx |= CPUID_MWAIT_EMX | CPUID_MWAIT_IBE;
9362 
9363     /*
9364      * Most Intel and certain AMD CPUs support hyperthreading. Even though QEMU
9365      * fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
9366      * based on inputs (sockets,cores,threads), it is still better to give
9367      * users a warning.
9368      */
9369     if (IS_AMD_CPU(env) &&
9370         !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
9371         env->topo_info.threads_per_core > 1) {
9372             warn_report_once("This family of AMD CPU doesn't support "
9373                              "hyperthreading(%d). Please configure -smp "
9374                              "options properly or try enabling topoext "
9375                              "feature.", env->topo_info.threads_per_core);
9376     }
9377 
9378     /* For 64bit systems think about the number of physical bits to present.
9379      * ideally this should be the same as the host; anything other than matching
9380      * the host can cause incorrect guest behaviour.
9381      * QEMU used to pick the magic value of 40 bits that corresponds to
9382      * consumer AMD devices but nothing else.
9383      *
9384      * Note that this code assumes features expansion has already been done
9385      * (as it checks for CPUID_EXT2_LM), and also assumes that potential
9386      * phys_bits adjustments to match the host have been already done in
9387      * accel-specific code in cpu_exec_realizefn.
9388      */
9389     if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
9390         if (cpu->phys_bits &&
9391             (cpu->phys_bits > TARGET_PHYS_ADDR_SPACE_BITS ||
9392             cpu->phys_bits < 32)) {
9393             error_setg(errp, "phys-bits should be between 32 and %u "
9394                              " (but is %u)",
9395                              TARGET_PHYS_ADDR_SPACE_BITS, cpu->phys_bits);
9396             return;
9397         }
9398         /*
9399          * 0 means it was not explicitly set by the user (or by machine
9400          * compat_props or by the host code in host-cpu.c).
9401          * In this case, the default is the value used by TCG (40).
9402          */
9403         if (cpu->phys_bits == 0) {
9404             cpu->phys_bits = TCG_PHYS_ADDR_BITS;
9405         }
9406         if (cpu->guest_phys_bits &&
9407             (cpu->guest_phys_bits > cpu->phys_bits ||
9408             cpu->guest_phys_bits < 32)) {
9409             error_setg(errp, "guest-phys-bits should be between 32 and %u "
9410                              " (but is %u)",
9411                              cpu->phys_bits, cpu->guest_phys_bits);
9412             return;
9413         }
9414     } else {
9415         /* For 32 bit systems don't use the user set value, but keep
9416          * phys_bits consistent with what we tell the guest.
9417          */
9418         if (cpu->phys_bits != 0) {
9419             error_setg(errp, "phys-bits is not user-configurable in 32 bit");
9420             return;
9421         }
9422         if (cpu->guest_phys_bits != 0) {
9423             error_setg(errp, "guest-phys-bits is not user-configurable in 32 bit");
9424             return;
9425         }
9426 
9427         if (env->features[FEAT_1_EDX] & (CPUID_PSE36 | CPUID_PAE)) {
9428             cpu->phys_bits = 36;
9429         } else {
9430             cpu->phys_bits = 32;
9431         }
9432     }
9433 
9434     /* Cache information initialization */
9435     if (!cpu->legacy_cache) {
9436         const CPUCaches *cache_info =
9437             x86_cpu_get_versioned_cache_info(cpu, xcc->model);
9438 
9439         if (!xcc->model || !cache_info) {
9440             g_autofree char *name = x86_cpu_class_get_model_name(xcc);
9441             error_setg(errp,
9442                        "CPU model '%s' doesn't support legacy-cache=off", name);
9443             return;
9444         }
9445         env->cache_info = *cache_info;
9446     } else {
9447         /* Build legacy cache information */
9448         if (!cpu->consistent_cache) {
9449             env->enable_legacy_cpuid2_cache = true;
9450         }
9451 
9452         if (!cpu->vendor_cpuid_only_v2) {
9453             env->enable_legacy_vendor_cache = true;
9454         }
9455 
9456         if (IS_AMD_CPU(env)) {
9457             env->cache_info = legacy_amd_cache_info;
9458         } else {
9459             env->cache_info = legacy_intel_cache_info;
9460         }
9461     }
9462 
9463 #ifndef CONFIG_USER_ONLY
9464     MachineState *ms = MACHINE(qdev_get_machine());
9465     MachineClass *mc = MACHINE_GET_CLASS(ms);
9466 
9467     if (mc->smp_props.has_caches) {
9468         if (!x86_cpu_update_smp_cache_topo(ms, cpu, errp)) {
9469             return;
9470         }
9471     }
9472 
9473     qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
9474 
9475     if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || ms->smp.cpus > 1) {
9476         x86_cpu_apic_create(cpu, &local_err);
9477         if (local_err != NULL) {
9478             goto out;
9479         }
9480     }
9481 #endif
9482 
9483     mce_init(cpu);
9484 
9485     x86_cpu_gdb_init(cs);
9486     qemu_init_vcpu(cs);
9487 
9488 #ifndef CONFIG_USER_ONLY
9489     x86_cpu_apic_realize(cpu, &local_err);
9490     if (local_err != NULL) {
9491         goto out;
9492     }
9493 #endif /* !CONFIG_USER_ONLY */
9494     cpu_reset(cs);
9495 
9496     xcc->parent_realize(dev, &local_err);
9497 
9498 out:
9499     if (local_err != NULL) {
9500         error_propagate(errp, local_err);
9501         return;
9502     }
9503 }
9504 
x86_cpu_unrealizefn(DeviceState * dev)9505 static void x86_cpu_unrealizefn(DeviceState *dev)
9506 {
9507     X86CPU *cpu = X86_CPU(dev);
9508     X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
9509 
9510 #ifndef CONFIG_USER_ONLY
9511     cpu_remove_sync(CPU(dev));
9512     qemu_unregister_reset(x86_cpu_machine_reset_cb, dev);
9513 #endif
9514 
9515     if (cpu->apic_state) {
9516         object_unparent(OBJECT(cpu->apic_state));
9517         cpu->apic_state = NULL;
9518     }
9519 
9520     xcc->parent_unrealize(dev);
9521 }
9522 
9523 typedef struct BitProperty {
9524     FeatureWord w;
9525     uint64_t mask;
9526 } BitProperty;
9527 
x86_cpu_get_bit_prop(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)9528 static void x86_cpu_get_bit_prop(Object *obj, Visitor *v, const char *name,
9529                                  void *opaque, Error **errp)
9530 {
9531     X86CPU *cpu = X86_CPU(obj);
9532     BitProperty *fp = opaque;
9533     uint64_t f = cpu->env.features[fp->w];
9534     bool value = (f & fp->mask) == fp->mask;
9535     visit_type_bool(v, name, &value, errp);
9536 }
9537 
x86_cpu_set_bit_prop(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)9538 static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
9539                                  void *opaque, Error **errp)
9540 {
9541     DeviceState *dev = DEVICE(obj);
9542     X86CPU *cpu = X86_CPU(obj);
9543     BitProperty *fp = opaque;
9544     bool value;
9545 
9546     if (dev->realized) {
9547         qdev_prop_set_after_realize(dev, name, errp);
9548         return;
9549     }
9550 
9551     if (!visit_type_bool(v, name, &value, errp)) {
9552         return;
9553     }
9554 
9555     if (value) {
9556         cpu->env.features[fp->w] |= fp->mask;
9557     } else {
9558         cpu->env.features[fp->w] &= ~fp->mask;
9559     }
9560     cpu->env.user_features[fp->w] |= fp->mask;
9561 }
9562 
9563 /* Register a boolean property to get/set a single bit in a uint32_t field.
9564  *
9565  * The same property name can be registered multiple times to make it affect
9566  * multiple bits in the same FeatureWord. In that case, the getter will return
9567  * true only if all bits are set.
9568  */
x86_cpu_register_bit_prop(X86CPUClass * xcc,const char * prop_name,FeatureWord w,int bitnr)9569 static void x86_cpu_register_bit_prop(X86CPUClass *xcc,
9570                                       const char *prop_name,
9571                                       FeatureWord w,
9572                                       int bitnr)
9573 {
9574     ObjectClass *oc = OBJECT_CLASS(xcc);
9575     BitProperty *fp;
9576     ObjectProperty *op;
9577     uint64_t mask = (1ULL << bitnr);
9578 
9579     op = object_class_property_find(oc, prop_name);
9580     if (op) {
9581         fp = op->opaque;
9582         assert(fp->w == w);
9583         fp->mask |= mask;
9584     } else {
9585         fp = g_new0(BitProperty, 1);
9586         fp->w = w;
9587         fp->mask = mask;
9588         object_class_property_add(oc, prop_name, "bool",
9589                                   x86_cpu_get_bit_prop,
9590                                   x86_cpu_set_bit_prop,
9591                                   NULL, fp);
9592     }
9593 }
9594 
x86_cpu_register_feature_bit_props(X86CPUClass * xcc,FeatureWord w,int bitnr)9595 static void x86_cpu_register_feature_bit_props(X86CPUClass *xcc,
9596                                                FeatureWord w,
9597                                                int bitnr)
9598 {
9599     FeatureWordInfo *fi = &feature_word_info[w];
9600     const char *name = fi->feat_names[bitnr];
9601 
9602     if (!name) {
9603         return;
9604     }
9605 
9606     /* Property names should use "-" instead of "_".
9607      * Old names containing underscores are registered as aliases
9608      * using object_property_add_alias()
9609      */
9610     assert(!strchr(name, '_'));
9611     /* aliases don't use "|" delimiters anymore, they are registered
9612      * manually using object_property_add_alias() */
9613     assert(!strchr(name, '|'));
9614     x86_cpu_register_bit_prop(xcc, name, w, bitnr);
9615 }
9616 
x86_cpu_post_initfn(Object * obj)9617 static void x86_cpu_post_initfn(Object *obj)
9618 {
9619 #ifndef CONFIG_USER_ONLY
9620     if (current_machine && current_machine->cgs) {
9621         x86_confidential_guest_cpu_instance_init(
9622             X86_CONFIDENTIAL_GUEST(current_machine->cgs), (CPU(obj)));
9623     }
9624 #endif
9625 }
9626 
x86_cpu_init_xsave(void)9627 static void x86_cpu_init_xsave(void)
9628 {
9629     static bool first = true;
9630     uint64_t supported_xcr0;
9631     int i;
9632 
9633     if (first) {
9634         first = false;
9635 
9636         supported_xcr0 =
9637             ((uint64_t) x86_cpu_get_supported_feature_word(NULL, FEAT_XSAVE_XCR0_HI) << 32) |
9638             x86_cpu_get_supported_feature_word(NULL, FEAT_XSAVE_XCR0_LO);
9639 
9640         for (i = XSTATE_SSE_BIT + 1; i < XSAVE_STATE_AREA_COUNT; i++) {
9641             ExtSaveArea *esa = &x86_ext_save_areas[i];
9642 
9643             if (!(supported_xcr0 & (1 << i))) {
9644                 esa->size = 0;
9645             }
9646         }
9647     }
9648 }
9649 
x86_cpu_init_default_topo(X86CPU * cpu)9650 static void x86_cpu_init_default_topo(X86CPU *cpu)
9651 {
9652     CPUX86State *env = &cpu->env;
9653 
9654     env->topo_info = (X86CPUTopoInfo) {1, 1, 1, 1};
9655 
9656     /* thread, core and socket levels are set by default. */
9657     set_bit(CPU_TOPOLOGY_LEVEL_THREAD, env->avail_cpu_topo);
9658     set_bit(CPU_TOPOLOGY_LEVEL_CORE, env->avail_cpu_topo);
9659     set_bit(CPU_TOPOLOGY_LEVEL_SOCKET, env->avail_cpu_topo);
9660 }
9661 
x86_cpu_initfn(Object * obj)9662 static void x86_cpu_initfn(Object *obj)
9663 {
9664     X86CPU *cpu = X86_CPU(obj);
9665     X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
9666     CPUX86State *env = &cpu->env;
9667 
9668     x86_cpu_init_default_topo(cpu);
9669 
9670     object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo",
9671                         x86_cpu_get_feature_words,
9672                         NULL, NULL, (void *)env->features);
9673     object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo",
9674                         x86_cpu_get_feature_words,
9675                         NULL, NULL, (void *)cpu->filtered_features);
9676 
9677     object_property_add_alias(obj, "sse3", obj, "pni");
9678     object_property_add_alias(obj, "pclmuldq", obj, "pclmulqdq");
9679     object_property_add_alias(obj, "sse4-1", obj, "sse4.1");
9680     object_property_add_alias(obj, "sse4-2", obj, "sse4.2");
9681     object_property_add_alias(obj, "xd", obj, "nx");
9682     object_property_add_alias(obj, "ffxsr", obj, "fxsr-opt");
9683     object_property_add_alias(obj, "i64", obj, "lm");
9684 
9685     object_property_add_alias(obj, "ds_cpl", obj, "ds-cpl");
9686     object_property_add_alias(obj, "tsc_adjust", obj, "tsc-adjust");
9687     object_property_add_alias(obj, "fxsr_opt", obj, "fxsr-opt");
9688     object_property_add_alias(obj, "lahf_lm", obj, "lahf-lm");
9689     object_property_add_alias(obj, "cmp_legacy", obj, "cmp-legacy");
9690     object_property_add_alias(obj, "nodeid_msr", obj, "nodeid-msr");
9691     object_property_add_alias(obj, "perfctr_core", obj, "perfctr-core");
9692     object_property_add_alias(obj, "perfctr_nb", obj, "perfctr-nb");
9693     object_property_add_alias(obj, "kvm_nopiodelay", obj, "kvm-nopiodelay");
9694     object_property_add_alias(obj, "kvm_mmu", obj, "kvm-mmu");
9695     object_property_add_alias(obj, "kvm_asyncpf", obj, "kvm-asyncpf");
9696     object_property_add_alias(obj, "kvm_asyncpf_int", obj, "kvm-asyncpf-int");
9697     object_property_add_alias(obj, "kvm_steal_time", obj, "kvm-steal-time");
9698     object_property_add_alias(obj, "kvm_pv_eoi", obj, "kvm-pv-eoi");
9699     object_property_add_alias(obj, "kvm_pv_unhalt", obj, "kvm-pv-unhalt");
9700     object_property_add_alias(obj, "kvm_poll_control", obj, "kvm-poll-control");
9701     object_property_add_alias(obj, "svm_lock", obj, "svm-lock");
9702     object_property_add_alias(obj, "nrip_save", obj, "nrip-save");
9703     object_property_add_alias(obj, "tsc_scale", obj, "tsc-scale");
9704     object_property_add_alias(obj, "vmcb_clean", obj, "vmcb-clean");
9705     object_property_add_alias(obj, "pause_filter", obj, "pause-filter");
9706     object_property_add_alias(obj, "sse4_1", obj, "sse4.1");
9707     object_property_add_alias(obj, "sse4_2", obj, "sse4.2");
9708 
9709     object_property_add_alias(obj, "hv-apicv", obj, "hv-avic");
9710     cpu->lbr_fmt = ~PERF_CAP_LBR_FMT;
9711     object_property_add_alias(obj, "lbr_fmt", obj, "lbr-fmt");
9712 
9713     if (xcc->model) {
9714         x86_cpu_load_model(cpu, xcc->model);
9715     }
9716 
9717     /*
9718      * accel's cpu_instance_init may have the xsave check,
9719      * so x86_ext_save_areas[] must be initialized before this.
9720      */
9721     x86_cpu_init_xsave();
9722     accel_cpu_instance_init(CPU(obj));
9723 }
9724 
x86_cpu_get_arch_id(CPUState * cs)9725 static int64_t x86_cpu_get_arch_id(CPUState *cs)
9726 {
9727     X86CPU *cpu = X86_CPU(cs);
9728 
9729     return cpu->apic_id;
9730 }
9731 
9732 #if !defined(CONFIG_USER_ONLY)
x86_cpu_get_paging_enabled(const CPUState * cs)9733 static bool x86_cpu_get_paging_enabled(const CPUState *cs)
9734 {
9735     X86CPU *cpu = X86_CPU(cs);
9736 
9737     return cpu->env.cr[0] & CR0_PG_MASK;
9738 }
9739 #endif /* !CONFIG_USER_ONLY */
9740 
x86_cpu_set_pc(CPUState * cs,vaddr value)9741 static void x86_cpu_set_pc(CPUState *cs, vaddr value)
9742 {
9743     X86CPU *cpu = X86_CPU(cs);
9744 
9745     cpu->env.eip = value;
9746 }
9747 
x86_cpu_get_pc(CPUState * cs)9748 static vaddr x86_cpu_get_pc(CPUState *cs)
9749 {
9750     X86CPU *cpu = X86_CPU(cs);
9751 
9752     /* Match cpu_get_tb_cpu_state. */
9753     return cpu->env.eip + cpu->env.segs[R_CS].base;
9754 }
9755 
9756 #if !defined(CONFIG_USER_ONLY)
x86_cpu_pending_interrupt(CPUState * cs,int interrupt_request)9757 int x86_cpu_pending_interrupt(CPUState *cs, int interrupt_request)
9758 {
9759     X86CPU *cpu = X86_CPU(cs);
9760     CPUX86State *env = &cpu->env;
9761 
9762     if (interrupt_request & CPU_INTERRUPT_POLL) {
9763         return CPU_INTERRUPT_POLL;
9764     }
9765     if (interrupt_request & CPU_INTERRUPT_SIPI) {
9766         return CPU_INTERRUPT_SIPI;
9767     }
9768 
9769     if (env->hflags2 & HF2_GIF_MASK) {
9770         if ((interrupt_request & CPU_INTERRUPT_SMI) &&
9771             !(env->hflags & HF_SMM_MASK)) {
9772             return CPU_INTERRUPT_SMI;
9773         } else if ((interrupt_request & CPU_INTERRUPT_NMI) &&
9774                    !(env->hflags2 & HF2_NMI_MASK)) {
9775             return CPU_INTERRUPT_NMI;
9776         } else if (interrupt_request & CPU_INTERRUPT_MCE) {
9777             return CPU_INTERRUPT_MCE;
9778         } else if ((interrupt_request & CPU_INTERRUPT_HARD) &&
9779                    (((env->hflags2 & HF2_VINTR_MASK) &&
9780                      (env->hflags2 & HF2_HIF_MASK)) ||
9781                     (!(env->hflags2 & HF2_VINTR_MASK) &&
9782                      (env->eflags & IF_MASK &&
9783                       !(env->hflags & HF_INHIBIT_IRQ_MASK))))) {
9784             return CPU_INTERRUPT_HARD;
9785         } else if (env->hflags2 & HF2_VGIF_MASK) {
9786             if((interrupt_request & CPU_INTERRUPT_VIRQ) &&
9787                    (env->eflags & IF_MASK) &&
9788                    !(env->hflags & HF_INHIBIT_IRQ_MASK)) {
9789                         return CPU_INTERRUPT_VIRQ;
9790             }
9791         }
9792     }
9793 
9794     return 0;
9795 }
9796 
x86_cpu_has_work(CPUState * cs)9797 static bool x86_cpu_has_work(CPUState *cs)
9798 {
9799     return x86_cpu_pending_interrupt(cs, cs->interrupt_request) != 0;
9800 }
9801 #endif /* !CONFIG_USER_ONLY */
9802 
x86_disas_set_info(CPUState * cs,disassemble_info * info)9803 static void x86_disas_set_info(CPUState *cs, disassemble_info *info)
9804 {
9805     X86CPU *cpu = X86_CPU(cs);
9806     CPUX86State *env = &cpu->env;
9807 
9808     info->endian = BFD_ENDIAN_LITTLE;
9809     info->mach = (env->hflags & HF_CS64_MASK ? bfd_mach_x86_64
9810                   : env->hflags & HF_CS32_MASK ? bfd_mach_i386_i386
9811                   : bfd_mach_i386_i8086);
9812 
9813     info->cap_arch = CS_ARCH_X86;
9814     info->cap_mode = (env->hflags & HF_CS64_MASK ? CS_MODE_64
9815                       : env->hflags & HF_CS32_MASK ? CS_MODE_32
9816                       : CS_MODE_16);
9817     info->cap_insn_unit = 1;
9818     info->cap_insn_split = 8;
9819 }
9820 
x86_update_hflags(CPUX86State * env)9821 void x86_update_hflags(CPUX86State *env)
9822 {
9823    uint32_t hflags;
9824 #define HFLAG_COPY_MASK \
9825     ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
9826        HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
9827        HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
9828        HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK)
9829 
9830     hflags = env->hflags & HFLAG_COPY_MASK;
9831     hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
9832     hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
9833     hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
9834                 (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
9835     hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
9836 
9837     if (env->cr[4] & CR4_OSFXSR_MASK) {
9838         hflags |= HF_OSFXSR_MASK;
9839     }
9840 
9841     if (env->efer & MSR_EFER_LMA) {
9842         hflags |= HF_LMA_MASK;
9843     }
9844 
9845     if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
9846         hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
9847     } else {
9848         hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
9849                     (DESC_B_SHIFT - HF_CS32_SHIFT);
9850         hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
9851                     (DESC_B_SHIFT - HF_SS32_SHIFT);
9852         if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) ||
9853             !(hflags & HF_CS32_MASK)) {
9854             hflags |= HF_ADDSEG_MASK;
9855         } else {
9856             hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base |
9857                         env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
9858         }
9859     }
9860     env->hflags = hflags;
9861 }
9862 
9863 static const Property x86_cpu_properties[] = {
9864 #ifdef CONFIG_USER_ONLY
9865     /* apic_id = 0 by default for *-user, see commit 9886e834 */
9866     DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, 0),
9867     DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, 0),
9868     DEFINE_PROP_INT32("core-id", X86CPU, core_id, 0),
9869     DEFINE_PROP_INT32("module-id", X86CPU, module_id, 0),
9870     DEFINE_PROP_INT32("die-id", X86CPU, die_id, 0),
9871     DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, 0),
9872 #else
9873     DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, UNASSIGNED_APIC_ID),
9874     DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, -1),
9875     DEFINE_PROP_INT32("core-id", X86CPU, core_id, -1),
9876     DEFINE_PROP_INT32("module-id", X86CPU, module_id, -1),
9877     DEFINE_PROP_INT32("die-id", X86CPU, die_id, -1),
9878     DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, -1),
9879 #endif
9880     DEFINE_PROP_INT32("node-id", X86CPU, node_id, CPU_UNSET_NUMA_NODE_ID),
9881     DEFINE_PROP_BOOL("pmu", X86CPU, enable_pmu, false),
9882     DEFINE_PROP_UINT64_CHECKMASK("lbr-fmt", X86CPU, lbr_fmt, PERF_CAP_LBR_FMT),
9883 
9884     DEFINE_PROP_UINT32("hv-spinlocks", X86CPU, hyperv_spinlock_attempts,
9885                        HYPERV_SPINLOCK_NEVER_NOTIFY),
9886     DEFINE_PROP_BIT64("hv-relaxed", X86CPU, hyperv_features,
9887                       HYPERV_FEAT_RELAXED, 0),
9888     DEFINE_PROP_BIT64("hv-vapic", X86CPU, hyperv_features,
9889                       HYPERV_FEAT_VAPIC, 0),
9890     DEFINE_PROP_BIT64("hv-time", X86CPU, hyperv_features,
9891                       HYPERV_FEAT_TIME, 0),
9892     DEFINE_PROP_BIT64("hv-crash", X86CPU, hyperv_features,
9893                       HYPERV_FEAT_CRASH, 0),
9894     DEFINE_PROP_BIT64("hv-reset", X86CPU, hyperv_features,
9895                       HYPERV_FEAT_RESET, 0),
9896     DEFINE_PROP_BIT64("hv-vpindex", X86CPU, hyperv_features,
9897                       HYPERV_FEAT_VPINDEX, 0),
9898     DEFINE_PROP_BIT64("hv-runtime", X86CPU, hyperv_features,
9899                       HYPERV_FEAT_RUNTIME, 0),
9900     DEFINE_PROP_BIT64("hv-synic", X86CPU, hyperv_features,
9901                       HYPERV_FEAT_SYNIC, 0),
9902     DEFINE_PROP_BIT64("hv-stimer", X86CPU, hyperv_features,
9903                       HYPERV_FEAT_STIMER, 0),
9904     DEFINE_PROP_BIT64("hv-frequencies", X86CPU, hyperv_features,
9905                       HYPERV_FEAT_FREQUENCIES, 0),
9906     DEFINE_PROP_BIT64("hv-reenlightenment", X86CPU, hyperv_features,
9907                       HYPERV_FEAT_REENLIGHTENMENT, 0),
9908     DEFINE_PROP_BIT64("hv-tlbflush", X86CPU, hyperv_features,
9909                       HYPERV_FEAT_TLBFLUSH, 0),
9910     DEFINE_PROP_BIT64("hv-evmcs", X86CPU, hyperv_features,
9911                       HYPERV_FEAT_EVMCS, 0),
9912     DEFINE_PROP_BIT64("hv-ipi", X86CPU, hyperv_features,
9913                       HYPERV_FEAT_IPI, 0),
9914     DEFINE_PROP_BIT64("hv-stimer-direct", X86CPU, hyperv_features,
9915                       HYPERV_FEAT_STIMER_DIRECT, 0),
9916     DEFINE_PROP_BIT64("hv-avic", X86CPU, hyperv_features,
9917                       HYPERV_FEAT_AVIC, 0),
9918     DEFINE_PROP_BIT64("hv-emsr-bitmap", X86CPU, hyperv_features,
9919                       HYPERV_FEAT_MSR_BITMAP, 0),
9920     DEFINE_PROP_BIT64("hv-xmm-input", X86CPU, hyperv_features,
9921                       HYPERV_FEAT_XMM_INPUT, 0),
9922     DEFINE_PROP_BIT64("hv-tlbflush-ext", X86CPU, hyperv_features,
9923                       HYPERV_FEAT_TLBFLUSH_EXT, 0),
9924     DEFINE_PROP_BIT64("hv-tlbflush-direct", X86CPU, hyperv_features,
9925                       HYPERV_FEAT_TLBFLUSH_DIRECT, 0),
9926     DEFINE_PROP_ON_OFF_AUTO("hv-no-nonarch-coresharing", X86CPU,
9927                             hyperv_no_nonarch_cs, ON_OFF_AUTO_OFF),
9928 #ifdef CONFIG_SYNDBG
9929     DEFINE_PROP_BIT64("hv-syndbg", X86CPU, hyperv_features,
9930                       HYPERV_FEAT_SYNDBG, 0),
9931 #endif
9932     DEFINE_PROP_BOOL("hv-passthrough", X86CPU, hyperv_passthrough, false),
9933     DEFINE_PROP_BOOL("hv-enforce-cpuid", X86CPU, hyperv_enforce_cpuid, false),
9934 
9935     /* WS2008R2 identify by default */
9936     DEFINE_PROP_UINT32("hv-version-id-build", X86CPU, hyperv_ver_id_build,
9937                        0x3839),
9938     DEFINE_PROP_UINT16("hv-version-id-major", X86CPU, hyperv_ver_id_major,
9939                        0x000A),
9940     DEFINE_PROP_UINT16("hv-version-id-minor", X86CPU, hyperv_ver_id_minor,
9941                        0x0000),
9942     DEFINE_PROP_UINT32("hv-version-id-spack", X86CPU, hyperv_ver_id_sp, 0),
9943     DEFINE_PROP_UINT8("hv-version-id-sbranch", X86CPU, hyperv_ver_id_sb, 0),
9944     DEFINE_PROP_UINT32("hv-version-id-snumber", X86CPU, hyperv_ver_id_sn, 0),
9945 
9946     DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true),
9947     DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
9948     DEFINE_PROP_BOOL("x-force-features", X86CPU, force_features, false),
9949     DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true),
9950     DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 0),
9951     DEFINE_PROP_UINT32("guest-phys-bits", X86CPU, guest_phys_bits, -1),
9952     DEFINE_PROP_BOOL("host-phys-bits", X86CPU, host_phys_bits, false),
9953     DEFINE_PROP_UINT8("host-phys-bits-limit", X86CPU, host_phys_bits_limit, 0),
9954     DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true),
9955     DEFINE_PROP_UINT32("level-func7", X86CPU, env.cpuid_level_func7,
9956                        UINT32_MAX),
9957     DEFINE_PROP_UINT32("level", X86CPU, env.cpuid_level, UINT32_MAX),
9958     DEFINE_PROP_UINT32("xlevel", X86CPU, env.cpuid_xlevel, UINT32_MAX),
9959     DEFINE_PROP_UINT32("xlevel2", X86CPU, env.cpuid_xlevel2, UINT32_MAX),
9960     DEFINE_PROP_UINT32("min-level", X86CPU, env.cpuid_min_level, 0),
9961     DEFINE_PROP_UINT32("min-xlevel", X86CPU, env.cpuid_min_xlevel, 0),
9962     DEFINE_PROP_UINT32("min-xlevel2", X86CPU, env.cpuid_min_xlevel2, 0),
9963     DEFINE_PROP_UINT8("avx10-version", X86CPU, env.avx10_version, 0),
9964     DEFINE_PROP_UINT64("ucode-rev", X86CPU, ucode_rev, 0),
9965     DEFINE_PROP_BOOL("full-cpuid-auto-level", X86CPU, full_cpuid_auto_level, true),
9966     DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor),
9967     DEFINE_PROP_BOOL("cpuid-0xb", X86CPU, enable_cpuid_0xb, true),
9968     DEFINE_PROP_BOOL("x-vendor-cpuid-only", X86CPU, vendor_cpuid_only, true),
9969     DEFINE_PROP_BOOL("x-vendor-cpuid-only-v2", X86CPU, vendor_cpuid_only_v2, true),
9970     DEFINE_PROP_BOOL("x-amd-topoext-features-only", X86CPU, amd_topoext_features_only, true),
9971     DEFINE_PROP_BOOL("lmce", X86CPU, enable_lmce, false),
9972     DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true),
9973     DEFINE_PROP_BOOL("kvm-pv-enforce-cpuid", X86CPU, kvm_pv_enforce_cpuid,
9974                      false),
9975     DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true),
9976     DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true),
9977     DEFINE_PROP_BOOL("x-migrate-smi-count", X86CPU, migrate_smi_count,
9978                      true),
9979     /*
9980      * lecacy_cache defaults to true unless the CPU model provides its
9981      * own cache information (see x86_cpu_load_def()).
9982      */
9983     DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, true),
9984     DEFINE_PROP_BOOL("x-consistent-cache", X86CPU, consistent_cache, true),
9985     DEFINE_PROP_BOOL("legacy-multi-node", X86CPU, legacy_multi_node, false),
9986     DEFINE_PROP_BOOL("xen-vapic", X86CPU, xen_vapic, false),
9987 
9988     /*
9989      * From "Requirements for Implementing the Microsoft
9990      * Hypervisor Interface":
9991      * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs
9992      *
9993      * "Starting with Windows Server 2012 and Windows 8, if
9994      * CPUID.40000005.EAX contains a value of -1, Windows assumes that
9995      * the hypervisor imposes no specific limit to the number of VPs.
9996      * In this case, Windows Server 2012 guest VMs may use more than
9997      * 64 VPs, up to the maximum supported number of processors applicable
9998      * to the specific Windows version being used."
9999      */
10000     DEFINE_PROP_INT32("x-hv-max-vps", X86CPU, hv_max_vps, -1),
10001     DEFINE_PROP_BOOL("x-hv-synic-kvm-only", X86CPU, hyperv_synic_kvm_only,
10002                      false),
10003     DEFINE_PROP_BOOL("x-intel-pt-auto-level", X86CPU, intel_pt_auto_level,
10004                      true),
10005     DEFINE_PROP_BOOL("x-l1-cache-per-thread", X86CPU, l1_cache_per_core, true),
10006     DEFINE_PROP_BOOL("x-force-cpuid-0x1f", X86CPU, force_cpuid_0x1f, false),
10007 };
10008 
10009 #ifndef CONFIG_USER_ONLY
10010 #include "hw/core/sysemu-cpu-ops.h"
10011 
10012 static const struct SysemuCPUOps i386_sysemu_ops = {
10013     .has_work = x86_cpu_has_work,
10014     .get_memory_mapping = x86_cpu_get_memory_mapping,
10015     .get_paging_enabled = x86_cpu_get_paging_enabled,
10016     .get_phys_page_attrs_debug = x86_cpu_get_phys_page_attrs_debug,
10017     .asidx_from_attrs = x86_asidx_from_attrs,
10018     .get_crash_info = x86_cpu_get_crash_info,
10019     .write_elf32_note = x86_cpu_write_elf32_note,
10020     .write_elf64_note = x86_cpu_write_elf64_note,
10021     .write_elf32_qemunote = x86_cpu_write_elf32_qemunote,
10022     .write_elf64_qemunote = x86_cpu_write_elf64_qemunote,
10023     .legacy_vmsd = &vmstate_x86_cpu,
10024 };
10025 #endif
10026 
x86_cpu_common_class_init(ObjectClass * oc,const void * data)10027 static void x86_cpu_common_class_init(ObjectClass *oc, const void *data)
10028 {
10029     X86CPUClass *xcc = X86_CPU_CLASS(oc);
10030     CPUClass *cc = CPU_CLASS(oc);
10031     DeviceClass *dc = DEVICE_CLASS(oc);
10032     ResettableClass *rc = RESETTABLE_CLASS(oc);
10033     FeatureWord w;
10034 
10035     device_class_set_parent_realize(dc, x86_cpu_realizefn,
10036                                     &xcc->parent_realize);
10037     device_class_set_parent_unrealize(dc, x86_cpu_unrealizefn,
10038                                       &xcc->parent_unrealize);
10039     device_class_set_props(dc, x86_cpu_properties);
10040 
10041     resettable_class_set_parent_phases(rc, NULL, x86_cpu_reset_hold, NULL,
10042                                        &xcc->parent_phases);
10043     cc->reset_dump_flags = CPU_DUMP_FPU | CPU_DUMP_CCOP;
10044 
10045     cc->class_by_name = x86_cpu_class_by_name;
10046     cc->list_cpus = x86_cpu_list;
10047     cc->parse_features = x86_cpu_parse_featurestr;
10048     cc->dump_state = x86_cpu_dump_state;
10049     cc->set_pc = x86_cpu_set_pc;
10050     cc->get_pc = x86_cpu_get_pc;
10051     cc->gdb_read_register = x86_cpu_gdb_read_register;
10052     cc->gdb_write_register = x86_cpu_gdb_write_register;
10053     cc->get_arch_id = x86_cpu_get_arch_id;
10054 
10055 #ifndef CONFIG_USER_ONLY
10056     cc->sysemu_ops = &i386_sysemu_ops;
10057 #endif /* !CONFIG_USER_ONLY */
10058 #ifdef CONFIG_TCG
10059     cc->tcg_ops = &x86_tcg_ops;
10060 #endif /* CONFIG_TCG */
10061 
10062     cc->gdb_arch_name = x86_gdb_arch_name;
10063 #ifdef TARGET_X86_64
10064     cc->gdb_core_xml_file = "i386-64bit.xml";
10065 #else
10066     cc->gdb_core_xml_file = "i386-32bit.xml";
10067 #endif
10068     cc->disas_set_info = x86_disas_set_info;
10069 
10070     dc->user_creatable = true;
10071 
10072     object_class_property_add(oc, "family", "int",
10073                               x86_cpuid_version_get_family,
10074                               x86_cpuid_version_set_family, NULL, NULL);
10075     object_class_property_add(oc, "model", "int",
10076                               x86_cpuid_version_get_model,
10077                               x86_cpuid_version_set_model, NULL, NULL);
10078     object_class_property_add(oc, "stepping", "int",
10079                               x86_cpuid_version_get_stepping,
10080                               x86_cpuid_version_set_stepping, NULL, NULL);
10081     object_class_property_add_str(oc, "vendor",
10082                                   x86_cpuid_get_vendor,
10083                                   x86_cpuid_set_vendor);
10084     object_class_property_add_str(oc, "model-id",
10085                                   x86_cpuid_get_model_id,
10086                                   x86_cpuid_set_model_id);
10087     object_class_property_add(oc, "tsc-frequency", "int",
10088                               x86_cpuid_get_tsc_freq,
10089                               x86_cpuid_set_tsc_freq, NULL, NULL);
10090     /*
10091      * The "unavailable-features" property has the same semantics as
10092      * CpuDefinitionInfo.unavailable-features on the "query-cpu-definitions"
10093      * QMP command: they list the features that would have prevented the
10094      * CPU from running if the "enforce" flag was set.
10095      */
10096     object_class_property_add(oc, "unavailable-features", "strList",
10097                               x86_cpu_get_unavailable_features,
10098                               NULL, NULL, NULL);
10099 
10100 #if !defined(CONFIG_USER_ONLY)
10101     object_class_property_add(oc, "crash-information", "GuestPanicInformation",
10102                               x86_cpu_get_crash_info_qom, NULL, NULL, NULL);
10103 #endif
10104 
10105     for (w = 0; w < FEATURE_WORDS; w++) {
10106         int bitnr;
10107         for (bitnr = 0; bitnr < 64; bitnr++) {
10108             x86_cpu_register_feature_bit_props(xcc, w, bitnr);
10109         }
10110     }
10111 }
10112 
10113 static const TypeInfo x86_cpu_type_info = {
10114     .name = TYPE_X86_CPU,
10115     .parent = TYPE_CPU,
10116     .instance_size = sizeof(X86CPU),
10117     .instance_align = __alignof(X86CPU),
10118     .instance_init = x86_cpu_initfn,
10119     .instance_post_init = x86_cpu_post_initfn,
10120 
10121     .abstract = true,
10122     .class_size = sizeof(X86CPUClass),
10123     .class_init = x86_cpu_common_class_init,
10124 };
10125 
10126 /* "base" CPU model, used by query-cpu-model-expansion */
x86_cpu_base_class_init(ObjectClass * oc,const void * data)10127 static void x86_cpu_base_class_init(ObjectClass *oc, const void *data)
10128 {
10129     X86CPUClass *xcc = X86_CPU_CLASS(oc);
10130 
10131     xcc->static_model = true;
10132     xcc->migration_safe = true;
10133     xcc->model_description = "base CPU model type with no features enabled";
10134     xcc->ordering = 8;
10135 }
10136 
10137 static const TypeInfo x86_base_cpu_type_info = {
10138         .name = X86_CPU_TYPE_NAME("base"),
10139         .parent = TYPE_X86_CPU,
10140         .class_init = x86_cpu_base_class_init,
10141 };
10142 
x86_cpu_register_types(void)10143 static void x86_cpu_register_types(void)
10144 {
10145     int i;
10146 
10147     type_register_static(&x86_cpu_type_info);
10148     for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) {
10149         x86_register_cpudef_types(&builtin_x86_defs[i]);
10150     }
10151     type_register_static(&max_x86_cpu_type_info);
10152     type_register_static(&x86_base_cpu_type_info);
10153 }
10154 
10155 type_init(x86_cpu_register_types)
10156