xref: /openbmc/qemu/target/i386/cpu.c (revision 2f5f6cb90ab3b854044db773e418ef9867d9c9ff)
1fcf5ef2aSThomas Huth /*
279f1a68aSClaudio Fontana  *  i386 CPUID, CPU class, definitions, models
3fcf5ef2aSThomas Huth  *
4fcf5ef2aSThomas Huth  *  Copyright (c) 2003 Fabrice Bellard
5fcf5ef2aSThomas Huth  *
6fcf5ef2aSThomas Huth  * This library is free software; you can redistribute it and/or
7fcf5ef2aSThomas Huth  * modify it under the terms of the GNU Lesser General Public
8fcf5ef2aSThomas Huth  * License as published by the Free Software Foundation; either
9d9ff33adSChetan Pant  * version 2.1 of the License, or (at your option) any later version.
10fcf5ef2aSThomas Huth  *
11fcf5ef2aSThomas Huth  * This library is distributed in the hope that it will be useful,
12fcf5ef2aSThomas Huth  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13fcf5ef2aSThomas Huth  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14fcf5ef2aSThomas Huth  * Lesser General Public License for more details.
15fcf5ef2aSThomas Huth  *
16fcf5ef2aSThomas Huth  * You should have received a copy of the GNU Lesser General Public
17fcf5ef2aSThomas Huth  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18fcf5ef2aSThomas Huth  */
19e688df6bSMarkus Armbruster 
20fcf5ef2aSThomas Huth #include "qemu/osdep.h"
216a4e0614SPhilippe Mathieu-Daudé #include "qemu/units.h"
22fcf5ef2aSThomas Huth #include "qemu/cutils.h"
230442428aSMarkus Armbruster #include "qemu/qemu-print.h"
2415e09912SPeter Maydell #include "qemu/hw-version.h"
25fcf5ef2aSThomas Huth #include "cpu.h"
26ed69e831SClaudio Fontana #include "tcg/helper-tcg.h"
27d6dcc558SSergio Andres Gomez Del Real #include "sysemu/hvf.h"
28044431cfSPhilippe Mathieu-Daudé #include "hvf/hvf-i386.h"
29a9dc68d9SClaudio Fontana #include "kvm/kvm_i386.h"
3093777de3SPhilippe Mathieu-Daudé #include "sev.h"
31f83aeeaeSPhilippe Mathieu-Daudé #include "qapi/error.h"
32cc37d98bSRichard Henderson #include "qemu/error-report.h"
338ac25c84SMarkus Armbruster #include "qapi/qapi-visit-machine.h"
341814eab6SMichael S. Tsirkin #include "standard-headers/asm-x86/kvm_para.h"
35fcf5ef2aSThomas Huth #include "hw/qdev-properties.h"
36fcf5ef2aSThomas Huth #include "hw/i386/topology.h"
37fcf5ef2aSThomas Huth #ifndef CONFIG_USER_ONLY
38c0f6cd9fSPhilippe Mathieu-Daudé #include "sysemu/reset.h"
39390dbc6eSPhilippe Mathieu-Daudé #include "qapi/qapi-commands-machine-target.h"
40fcf5ef2aSThomas Huth #include "exec/address-spaces.h"
410e11fc69SLike Xu #include "hw/boards.h"
421dec2e1fSSean Christopherson #include "hw/i386/sgx-epc.h"
43fcf5ef2aSThomas Huth #endif
44fcf5ef2aSThomas Huth 
45b666d2a4SRichard Henderson #include "disas/capstone.h"
4679f1a68aSClaudio Fontana #include "cpu-internal.h"
47b666d2a4SRichard Henderson 
48123fa102SThomas Huth static void x86_cpu_realizefn(DeviceState *dev, Error **errp);
49bccfb846STao Su static void x86_cpu_get_supported_cpuid(uint32_t func, uint32_t index,
50bccfb846STao Su                                         uint32_t *eax, uint32_t *ebx,
51bccfb846STao Su                                         uint32_t *ecx, uint32_t *edx);
52123fa102SThomas Huth 
537e3482f8SEduardo Habkost /* Helpers for building CPUID[2] descriptors: */
54fcf5ef2aSThomas Huth 
557e3482f8SEduardo Habkost struct CPUID2CacheDescriptorInfo {
567e3482f8SEduardo Habkost     enum CacheType type;
577e3482f8SEduardo Habkost     int level;
587e3482f8SEduardo Habkost     int size;
597e3482f8SEduardo Habkost     int line_size;
607e3482f8SEduardo Habkost     int associativity;
617e3482f8SEduardo Habkost };
62fcf5ef2aSThomas Huth 
637e3482f8SEduardo Habkost /*
647e3482f8SEduardo Habkost  * Known CPUID 2 cache descriptors.
657e3482f8SEduardo Habkost  * From Intel SDM Volume 2A, CPUID instruction
667e3482f8SEduardo Habkost  */
677e3482f8SEduardo Habkost struct CPUID2CacheDescriptorInfo cpuid2_cache_descriptors[] = {
685f00335aSEduardo Habkost     [0x06] = { .level = 1, .type = INSTRUCTION_CACHE, .size =   8 * KiB,
697e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 32, },
705f00335aSEduardo Habkost     [0x08] = { .level = 1, .type = INSTRUCTION_CACHE, .size =  16 * KiB,
717e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 32, },
725f00335aSEduardo Habkost     [0x09] = { .level = 1, .type = INSTRUCTION_CACHE, .size =  32 * KiB,
737e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 64, },
745f00335aSEduardo Habkost     [0x0A] = { .level = 1, .type = DATA_CACHE,        .size =   8 * KiB,
757e3482f8SEduardo Habkost                .associativity = 2,  .line_size = 32, },
765f00335aSEduardo Habkost     [0x0C] = { .level = 1, .type = DATA_CACHE,        .size =  16 * KiB,
777e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 32, },
785f00335aSEduardo Habkost     [0x0D] = { .level = 1, .type = DATA_CACHE,        .size =  16 * KiB,
797e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 64, },
805f00335aSEduardo Habkost     [0x0E] = { .level = 1, .type = DATA_CACHE,        .size =  24 * KiB,
817e3482f8SEduardo Habkost                .associativity = 6,  .line_size = 64, },
827e3482f8SEduardo Habkost     [0x1D] = { .level = 2, .type = UNIFIED_CACHE,     .size = 128 * KiB,
837e3482f8SEduardo Habkost                .associativity = 2,  .line_size = 64, },
847e3482f8SEduardo Habkost     [0x21] = { .level = 2, .type = UNIFIED_CACHE,     .size = 256 * KiB,
857e3482f8SEduardo Habkost                .associativity = 8,  .line_size = 64, },
867e3482f8SEduardo Habkost     /* lines per sector is not supported cpuid2_cache_descriptor(),
877e3482f8SEduardo Habkost     * so descriptors 0x22, 0x23 are not included
887e3482f8SEduardo Habkost     */
897e3482f8SEduardo Habkost     [0x24] = { .level = 2, .type = UNIFIED_CACHE,     .size =   1 * MiB,
907e3482f8SEduardo Habkost                .associativity = 16, .line_size = 64, },
917e3482f8SEduardo Habkost     /* lines per sector is not supported cpuid2_cache_descriptor(),
927e3482f8SEduardo Habkost     * so descriptors 0x25, 0x20 are not included
937e3482f8SEduardo Habkost     */
945f00335aSEduardo Habkost     [0x2C] = { .level = 1, .type = DATA_CACHE,        .size =  32 * KiB,
957e3482f8SEduardo Habkost                .associativity = 8,  .line_size = 64, },
965f00335aSEduardo Habkost     [0x30] = { .level = 1, .type = INSTRUCTION_CACHE, .size =  32 * KiB,
977e3482f8SEduardo Habkost                .associativity = 8,  .line_size = 64, },
987e3482f8SEduardo Habkost     [0x41] = { .level = 2, .type = UNIFIED_CACHE,     .size = 128 * KiB,
997e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 32, },
1007e3482f8SEduardo Habkost     [0x42] = { .level = 2, .type = UNIFIED_CACHE,     .size = 256 * KiB,
1017e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 32, },
1027e3482f8SEduardo Habkost     [0x43] = { .level = 2, .type = UNIFIED_CACHE,     .size = 512 * KiB,
1037e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 32, },
1047e3482f8SEduardo Habkost     [0x44] = { .level = 2, .type = UNIFIED_CACHE,     .size =   1 * MiB,
1057e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 32, },
1067e3482f8SEduardo Habkost     [0x45] = { .level = 2, .type = UNIFIED_CACHE,     .size =   2 * MiB,
1077e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 32, },
1087e3482f8SEduardo Habkost     [0x46] = { .level = 3, .type = UNIFIED_CACHE,     .size =   4 * MiB,
1097e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 64, },
1107e3482f8SEduardo Habkost     [0x47] = { .level = 3, .type = UNIFIED_CACHE,     .size =   8 * MiB,
1117e3482f8SEduardo Habkost                .associativity = 8,  .line_size = 64, },
1127e3482f8SEduardo Habkost     [0x48] = { .level = 2, .type = UNIFIED_CACHE,     .size =   3 * MiB,
1137e3482f8SEduardo Habkost                .associativity = 12, .line_size = 64, },
1147e3482f8SEduardo Habkost     /* Descriptor 0x49 depends on CPU family/model, so it is not included */
1157e3482f8SEduardo Habkost     [0x4A] = { .level = 3, .type = UNIFIED_CACHE,     .size =   6 * MiB,
1167e3482f8SEduardo Habkost                .associativity = 12, .line_size = 64, },
1177e3482f8SEduardo Habkost     [0x4B] = { .level = 3, .type = UNIFIED_CACHE,     .size =   8 * MiB,
1187e3482f8SEduardo Habkost                .associativity = 16, .line_size = 64, },
1197e3482f8SEduardo Habkost     [0x4C] = { .level = 3, .type = UNIFIED_CACHE,     .size =  12 * MiB,
1207e3482f8SEduardo Habkost                .associativity = 12, .line_size = 64, },
1217e3482f8SEduardo Habkost     [0x4D] = { .level = 3, .type = UNIFIED_CACHE,     .size =  16 * MiB,
1227e3482f8SEduardo Habkost                .associativity = 16, .line_size = 64, },
1237e3482f8SEduardo Habkost     [0x4E] = { .level = 2, .type = UNIFIED_CACHE,     .size =   6 * MiB,
1247e3482f8SEduardo Habkost                .associativity = 24, .line_size = 64, },
1255f00335aSEduardo Habkost     [0x60] = { .level = 1, .type = DATA_CACHE,        .size =  16 * KiB,
1267e3482f8SEduardo Habkost                .associativity = 8,  .line_size = 64, },
1275f00335aSEduardo Habkost     [0x66] = { .level = 1, .type = DATA_CACHE,        .size =   8 * KiB,
1287e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 64, },
1295f00335aSEduardo Habkost     [0x67] = { .level = 1, .type = DATA_CACHE,        .size =  16 * KiB,
1307e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 64, },
1315f00335aSEduardo Habkost     [0x68] = { .level = 1, .type = DATA_CACHE,        .size =  32 * KiB,
1327e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 64, },
1337e3482f8SEduardo Habkost     [0x78] = { .level = 2, .type = UNIFIED_CACHE,     .size =   1 * MiB,
1347e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 64, },
1357e3482f8SEduardo Habkost     /* lines per sector is not supported cpuid2_cache_descriptor(),
1367e3482f8SEduardo Habkost     * so descriptors 0x79, 0x7A, 0x7B, 0x7C are not included.
1377e3482f8SEduardo Habkost     */
1387e3482f8SEduardo Habkost     [0x7D] = { .level = 2, .type = UNIFIED_CACHE,     .size =   2 * MiB,
1397e3482f8SEduardo Habkost                .associativity = 8,  .line_size = 64, },
1407e3482f8SEduardo Habkost     [0x7F] = { .level = 2, .type = UNIFIED_CACHE,     .size = 512 * KiB,
1417e3482f8SEduardo Habkost                .associativity = 2,  .line_size = 64, },
1427e3482f8SEduardo Habkost     [0x80] = { .level = 2, .type = UNIFIED_CACHE,     .size = 512 * KiB,
1437e3482f8SEduardo Habkost                .associativity = 8,  .line_size = 64, },
1447e3482f8SEduardo Habkost     [0x82] = { .level = 2, .type = UNIFIED_CACHE,     .size = 256 * KiB,
1457e3482f8SEduardo Habkost                .associativity = 8,  .line_size = 32, },
1467e3482f8SEduardo Habkost     [0x83] = { .level = 2, .type = UNIFIED_CACHE,     .size = 512 * KiB,
1477e3482f8SEduardo Habkost                .associativity = 8,  .line_size = 32, },
1487e3482f8SEduardo Habkost     [0x84] = { .level = 2, .type = UNIFIED_CACHE,     .size =   1 * MiB,
1497e3482f8SEduardo Habkost                .associativity = 8,  .line_size = 32, },
1507e3482f8SEduardo Habkost     [0x85] = { .level = 2, .type = UNIFIED_CACHE,     .size =   2 * MiB,
1517e3482f8SEduardo Habkost                .associativity = 8,  .line_size = 32, },
1527e3482f8SEduardo Habkost     [0x86] = { .level = 2, .type = UNIFIED_CACHE,     .size = 512 * KiB,
1537e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 64, },
1547e3482f8SEduardo Habkost     [0x87] = { .level = 2, .type = UNIFIED_CACHE,     .size =   1 * MiB,
1557e3482f8SEduardo Habkost                .associativity = 8,  .line_size = 64, },
1567e3482f8SEduardo Habkost     [0xD0] = { .level = 3, .type = UNIFIED_CACHE,     .size = 512 * KiB,
1577e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 64, },
1587e3482f8SEduardo Habkost     [0xD1] = { .level = 3, .type = UNIFIED_CACHE,     .size =   1 * MiB,
1597e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 64, },
1607e3482f8SEduardo Habkost     [0xD2] = { .level = 3, .type = UNIFIED_CACHE,     .size =   2 * MiB,
1617e3482f8SEduardo Habkost                .associativity = 4,  .line_size = 64, },
1627e3482f8SEduardo Habkost     [0xD6] = { .level = 3, .type = UNIFIED_CACHE,     .size =   1 * MiB,
1637e3482f8SEduardo Habkost                .associativity = 8,  .line_size = 64, },
1647e3482f8SEduardo Habkost     [0xD7] = { .level = 3, .type = UNIFIED_CACHE,     .size =   2 * MiB,
1657e3482f8SEduardo Habkost                .associativity = 8,  .line_size = 64, },
1667e3482f8SEduardo Habkost     [0xD8] = { .level = 3, .type = UNIFIED_CACHE,     .size =   4 * MiB,
1677e3482f8SEduardo Habkost                .associativity = 8,  .line_size = 64, },
1687e3482f8SEduardo Habkost     [0xDC] = { .level = 3, .type = UNIFIED_CACHE,     .size = 1.5 * MiB,
1697e3482f8SEduardo Habkost                .associativity = 12, .line_size = 64, },
1707e3482f8SEduardo Habkost     [0xDD] = { .level = 3, .type = UNIFIED_CACHE,     .size =   3 * MiB,
1717e3482f8SEduardo Habkost                .associativity = 12, .line_size = 64, },
1727e3482f8SEduardo Habkost     [0xDE] = { .level = 3, .type = UNIFIED_CACHE,     .size =   6 * MiB,
1737e3482f8SEduardo Habkost                .associativity = 12, .line_size = 64, },
1747e3482f8SEduardo Habkost     [0xE2] = { .level = 3, .type = UNIFIED_CACHE,     .size =   2 * MiB,
1757e3482f8SEduardo Habkost                .associativity = 16, .line_size = 64, },
1767e3482f8SEduardo Habkost     [0xE3] = { .level = 3, .type = UNIFIED_CACHE,     .size =   4 * MiB,
1777e3482f8SEduardo Habkost                .associativity = 16, .line_size = 64, },
1787e3482f8SEduardo Habkost     [0xE4] = { .level = 3, .type = UNIFIED_CACHE,     .size =   8 * MiB,
1797e3482f8SEduardo Habkost                .associativity = 16, .line_size = 64, },
1807e3482f8SEduardo Habkost     [0xEA] = { .level = 3, .type = UNIFIED_CACHE,     .size =  12 * MiB,
1817e3482f8SEduardo Habkost                .associativity = 24, .line_size = 64, },
1827e3482f8SEduardo Habkost     [0xEB] = { .level = 3, .type = UNIFIED_CACHE,     .size =  18 * MiB,
1837e3482f8SEduardo Habkost                .associativity = 24, .line_size = 64, },
1847e3482f8SEduardo Habkost     [0xEC] = { .level = 3, .type = UNIFIED_CACHE,     .size =  24 * MiB,
1857e3482f8SEduardo Habkost                .associativity = 24, .line_size = 64, },
1867e3482f8SEduardo Habkost };
187fcf5ef2aSThomas Huth 
1887e3482f8SEduardo Habkost /*
1897e3482f8SEduardo Habkost  * "CPUID leaf 2 does not report cache descriptor information,
1907e3482f8SEduardo Habkost  * use CPUID leaf 4 to query cache parameters"
1917e3482f8SEduardo Habkost  */
1927e3482f8SEduardo Habkost #define CACHE_DESCRIPTOR_UNAVAILABLE 0xFF
1937e3482f8SEduardo Habkost 
1947e3482f8SEduardo Habkost /*
1957e3482f8SEduardo Habkost  * Return a CPUID 2 cache descriptor for a given cache.
1967e3482f8SEduardo Habkost  * If no known descriptor is found, return CACHE_DESCRIPTOR_UNAVAILABLE
1977e3482f8SEduardo Habkost  */
cpuid2_cache_descriptor(CPUCacheInfo * cache)1987e3482f8SEduardo Habkost static uint8_t cpuid2_cache_descriptor(CPUCacheInfo *cache)
1997e3482f8SEduardo Habkost {
2007e3482f8SEduardo Habkost     int i;
2017e3482f8SEduardo Habkost 
2027e3482f8SEduardo Habkost     assert(cache->size > 0);
2037e3482f8SEduardo Habkost     assert(cache->level > 0);
2047e3482f8SEduardo Habkost     assert(cache->line_size > 0);
2057e3482f8SEduardo Habkost     assert(cache->associativity > 0);
2067e3482f8SEduardo Habkost     for (i = 0; i < ARRAY_SIZE(cpuid2_cache_descriptors); i++) {
2077e3482f8SEduardo Habkost         struct CPUID2CacheDescriptorInfo *d = &cpuid2_cache_descriptors[i];
2087e3482f8SEduardo Habkost         if (d->level == cache->level && d->type == cache->type &&
2097e3482f8SEduardo Habkost             d->size == cache->size && d->line_size == cache->line_size &&
2107e3482f8SEduardo Habkost             d->associativity == cache->associativity) {
2117e3482f8SEduardo Habkost                 return i;
2127e3482f8SEduardo Habkost             }
2137e3482f8SEduardo Habkost     }
2147e3482f8SEduardo Habkost 
2157e3482f8SEduardo Habkost     return CACHE_DESCRIPTOR_UNAVAILABLE;
2167e3482f8SEduardo Habkost }
217fcf5ef2aSThomas Huth 
218fcf5ef2aSThomas Huth /* CPUID Leaf 4 constants: */
219fcf5ef2aSThomas Huth 
220fcf5ef2aSThomas Huth /* EAX: */
2217e3482f8SEduardo Habkost #define CACHE_TYPE_D    1
2227e3482f8SEduardo Habkost #define CACHE_TYPE_I    2
2237e3482f8SEduardo Habkost #define CACHE_TYPE_UNIFIED   3
224fcf5ef2aSThomas Huth 
2257e3482f8SEduardo Habkost #define CACHE_LEVEL(l)        (l << 5)
226fcf5ef2aSThomas Huth 
2277e3482f8SEduardo Habkost #define CACHE_SELF_INIT_LEVEL (1 << 8)
228fcf5ef2aSThomas Huth 
229fcf5ef2aSThomas Huth /* EDX: */
2307e3482f8SEduardo Habkost #define CACHE_NO_INVD_SHARING   (1 << 0)
2317e3482f8SEduardo Habkost #define CACHE_INCLUSIVE       (1 << 1)
2327e3482f8SEduardo Habkost #define CACHE_COMPLEX_IDX     (1 << 2)
2337e3482f8SEduardo Habkost 
2347e3482f8SEduardo Habkost /* Encode CacheType for CPUID[4].EAX */
2355f00335aSEduardo Habkost #define CACHE_TYPE(t) (((t) == DATA_CACHE) ? CACHE_TYPE_D : \
2365f00335aSEduardo Habkost                        ((t) == INSTRUCTION_CACHE) ? CACHE_TYPE_I : \
2377e3482f8SEduardo Habkost                        ((t) == UNIFIED_CACHE) ? CACHE_TYPE_UNIFIED : \
2387e3482f8SEduardo Habkost                        0 /* Invalid value */)
2397e3482f8SEduardo Habkost 
max_thread_ids_for_cache(X86CPUTopoInfo * topo_info,enum CpuTopologyLevel share_level)240f602eb92SZhao Liu static uint32_t max_thread_ids_for_cache(X86CPUTopoInfo *topo_info,
241e823ebe7SZhao Liu                                          enum CpuTopologyLevel share_level)
242f602eb92SZhao Liu {
243f602eb92SZhao Liu     uint32_t num_ids = 0;
244f602eb92SZhao Liu 
245f602eb92SZhao Liu     switch (share_level) {
246e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_CORE:
247f602eb92SZhao Liu         num_ids = 1 << apicid_core_offset(topo_info);
248f602eb92SZhao Liu         break;
249e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_DIE:
250f602eb92SZhao Liu         num_ids = 1 << apicid_die_offset(topo_info);
251f602eb92SZhao Liu         break;
252e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_SOCKET:
253f602eb92SZhao Liu         num_ids = 1 << apicid_pkg_offset(topo_info);
254f602eb92SZhao Liu         break;
255f602eb92SZhao Liu     default:
256f602eb92SZhao Liu         /*
257e823ebe7SZhao Liu          * Currently there is no use case for THREAD and MODULE, so use
258f602eb92SZhao Liu          * assert directly to facilitate debugging.
259f602eb92SZhao Liu          */
260f602eb92SZhao Liu         g_assert_not_reached();
261f602eb92SZhao Liu     }
262f602eb92SZhao Liu 
263f602eb92SZhao Liu     return num_ids - 1;
264f602eb92SZhao Liu }
265f602eb92SZhao Liu 
max_core_ids_in_package(X86CPUTopoInfo * topo_info)266f602eb92SZhao Liu static uint32_t max_core_ids_in_package(X86CPUTopoInfo *topo_info)
267f602eb92SZhao Liu {
268f602eb92SZhao Liu     uint32_t num_cores = 1 << (apicid_pkg_offset(topo_info) -
269f602eb92SZhao Liu                                apicid_core_offset(topo_info));
270f602eb92SZhao Liu     return num_cores - 1;
271f602eb92SZhao Liu }
2727e3482f8SEduardo Habkost 
2737e3482f8SEduardo Habkost /* 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)2747e3482f8SEduardo Habkost static void encode_cache_cpuid4(CPUCacheInfo *cache,
275f602eb92SZhao Liu                                 X86CPUTopoInfo *topo_info,
2767e3482f8SEduardo Habkost                                 uint32_t *eax, uint32_t *ebx,
2777e3482f8SEduardo Habkost                                 uint32_t *ecx, uint32_t *edx)
2787e3482f8SEduardo Habkost {
2797e3482f8SEduardo Habkost     assert(cache->size == cache->line_size * cache->associativity *
2807e3482f8SEduardo Habkost                           cache->partitions * cache->sets);
2817e3482f8SEduardo Habkost 
2827e3482f8SEduardo Habkost     *eax = CACHE_TYPE(cache->type) |
2837e3482f8SEduardo Habkost            CACHE_LEVEL(cache->level) |
2847e3482f8SEduardo Habkost            (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0) |
285f602eb92SZhao Liu            (max_core_ids_in_package(topo_info) << 26) |
286f602eb92SZhao Liu            (max_thread_ids_for_cache(topo_info, cache->share_level) << 14);
2877e3482f8SEduardo Habkost 
2887e3482f8SEduardo Habkost     assert(cache->line_size > 0);
2897e3482f8SEduardo Habkost     assert(cache->partitions > 0);
2907e3482f8SEduardo Habkost     assert(cache->associativity > 0);
2917e3482f8SEduardo Habkost     /* We don't implement fully-associative caches */
2927e3482f8SEduardo Habkost     assert(cache->associativity < cache->sets);
2937e3482f8SEduardo Habkost     *ebx = (cache->line_size - 1) |
2947e3482f8SEduardo Habkost            ((cache->partitions - 1) << 12) |
2957e3482f8SEduardo Habkost            ((cache->associativity - 1) << 22);
2967e3482f8SEduardo Habkost 
2977e3482f8SEduardo Habkost     assert(cache->sets > 0);
2987e3482f8SEduardo Habkost     *ecx = cache->sets - 1;
2997e3482f8SEduardo Habkost 
3007e3482f8SEduardo Habkost     *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
3017e3482f8SEduardo Habkost            (cache->inclusive ? CACHE_INCLUSIVE : 0) |
3027e3482f8SEduardo Habkost            (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
3037e3482f8SEduardo Habkost }
3047e3482f8SEduardo Habkost 
num_threads_by_topo_level(X86CPUTopoInfo * topo_info,enum CpuTopologyLevel topo_level)305822bce9fSZhao Liu static uint32_t num_threads_by_topo_level(X86CPUTopoInfo *topo_info,
306e823ebe7SZhao Liu                                           enum CpuTopologyLevel topo_level)
307822bce9fSZhao Liu {
308822bce9fSZhao Liu     switch (topo_level) {
309e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_THREAD:
310822bce9fSZhao Liu         return 1;
311e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_CORE:
312822bce9fSZhao Liu         return topo_info->threads_per_core;
313e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_MODULE:
3145304873aSZhao Liu         return topo_info->threads_per_core * topo_info->cores_per_module;
315e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_DIE:
3163568adc9SZhao Liu         return topo_info->threads_per_core * topo_info->cores_per_module *
3173568adc9SZhao Liu                topo_info->modules_per_die;
318e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_SOCKET:
3193568adc9SZhao Liu         return topo_info->threads_per_core * topo_info->cores_per_module *
3203568adc9SZhao Liu                topo_info->modules_per_die * topo_info->dies_per_pkg;
321822bce9fSZhao Liu     default:
322822bce9fSZhao Liu         g_assert_not_reached();
323822bce9fSZhao Liu     }
324822bce9fSZhao Liu     return 0;
325822bce9fSZhao Liu }
326822bce9fSZhao Liu 
apicid_offset_by_topo_level(X86CPUTopoInfo * topo_info,enum CpuTopologyLevel topo_level)327822bce9fSZhao Liu static uint32_t apicid_offset_by_topo_level(X86CPUTopoInfo *topo_info,
328e823ebe7SZhao Liu                                             enum CpuTopologyLevel topo_level)
329822bce9fSZhao Liu {
330822bce9fSZhao Liu     switch (topo_level) {
331e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_THREAD:
332822bce9fSZhao Liu         return 0;
333e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_CORE:
334822bce9fSZhao Liu         return apicid_core_offset(topo_info);
335e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_MODULE:
3365304873aSZhao Liu         return apicid_module_offset(topo_info);
337e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_DIE:
338822bce9fSZhao Liu         return apicid_die_offset(topo_info);
339e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_SOCKET:
340822bce9fSZhao Liu         return apicid_pkg_offset(topo_info);
341822bce9fSZhao Liu     default:
342822bce9fSZhao Liu         g_assert_not_reached();
343822bce9fSZhao Liu     }
344822bce9fSZhao Liu     return 0;
345822bce9fSZhao Liu }
346822bce9fSZhao Liu 
cpuid1f_topo_type(enum CpuTopologyLevel topo_level)347e823ebe7SZhao Liu static uint32_t cpuid1f_topo_type(enum CpuTopologyLevel topo_level)
348822bce9fSZhao Liu {
349822bce9fSZhao Liu     switch (topo_level) {
350e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_INVALID:
351822bce9fSZhao Liu         return CPUID_1F_ECX_TOPO_LEVEL_INVALID;
352e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_THREAD:
353822bce9fSZhao Liu         return CPUID_1F_ECX_TOPO_LEVEL_SMT;
354e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_CORE:
355822bce9fSZhao Liu         return CPUID_1F_ECX_TOPO_LEVEL_CORE;
356e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_MODULE:
3575304873aSZhao Liu         return CPUID_1F_ECX_TOPO_LEVEL_MODULE;
358e823ebe7SZhao Liu     case CPU_TOPOLOGY_LEVEL_DIE:
359822bce9fSZhao Liu         return CPUID_1F_ECX_TOPO_LEVEL_DIE;
360822bce9fSZhao Liu     default:
361822bce9fSZhao Liu         /* Other types are not supported in QEMU. */
362822bce9fSZhao Liu         g_assert_not_reached();
363822bce9fSZhao Liu     }
364822bce9fSZhao Liu     return 0;
365822bce9fSZhao Liu }
366822bce9fSZhao Liu 
encode_topo_cpuid1f(CPUX86State * env,uint32_t count,X86CPUTopoInfo * topo_info,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)367822bce9fSZhao Liu static void encode_topo_cpuid1f(CPUX86State *env, uint32_t count,
368822bce9fSZhao Liu                                 X86CPUTopoInfo *topo_info,
369822bce9fSZhao Liu                                 uint32_t *eax, uint32_t *ebx,
370822bce9fSZhao Liu                                 uint32_t *ecx, uint32_t *edx)
371822bce9fSZhao Liu {
372822bce9fSZhao Liu     X86CPU *cpu = env_archcpu(env);
37334230ce5SZhao Liu     unsigned long level, base_level, next_level;
374822bce9fSZhao Liu     uint32_t num_threads_next_level, offset_next_level;
375822bce9fSZhao Liu 
376e823ebe7SZhao Liu     assert(count <= CPU_TOPOLOGY_LEVEL_SOCKET);
377822bce9fSZhao Liu 
378822bce9fSZhao Liu     /*
379822bce9fSZhao Liu      * Find the No.(count + 1) topology level in avail_cpu_topo bitmap.
380e823ebe7SZhao Liu      * The search starts from bit 0 (CPU_TOPOLOGY_LEVEL_THREAD).
381822bce9fSZhao Liu      */
382e823ebe7SZhao Liu     level = CPU_TOPOLOGY_LEVEL_THREAD;
38334230ce5SZhao Liu     base_level = level;
384822bce9fSZhao Liu     for (int i = 0; i <= count; i++) {
385822bce9fSZhao Liu         level = find_next_bit(env->avail_cpu_topo,
386e823ebe7SZhao Liu                               CPU_TOPOLOGY_LEVEL_SOCKET,
38734230ce5SZhao Liu                               base_level);
388822bce9fSZhao Liu 
389822bce9fSZhao Liu         /*
390822bce9fSZhao Liu          * CPUID[0x1f] doesn't explicitly encode the package level,
391822bce9fSZhao Liu          * and it just encodes the invalid level (all fields are 0)
392822bce9fSZhao Liu          * into the last subleaf of 0x1f.
393822bce9fSZhao Liu          */
394e823ebe7SZhao Liu         if (level == CPU_TOPOLOGY_LEVEL_SOCKET) {
395e823ebe7SZhao Liu             level = CPU_TOPOLOGY_LEVEL_INVALID;
396822bce9fSZhao Liu             break;
397822bce9fSZhao Liu         }
39834230ce5SZhao Liu         /* Search the next level. */
39934230ce5SZhao Liu         base_level = level + 1;
400822bce9fSZhao Liu     }
401822bce9fSZhao Liu 
402e823ebe7SZhao Liu     if (level == CPU_TOPOLOGY_LEVEL_INVALID) {
403822bce9fSZhao Liu         num_threads_next_level = 0;
404822bce9fSZhao Liu         offset_next_level = 0;
405822bce9fSZhao Liu     } else {
406822bce9fSZhao Liu         next_level = find_next_bit(env->avail_cpu_topo,
407e823ebe7SZhao Liu                                    CPU_TOPOLOGY_LEVEL_SOCKET,
408822bce9fSZhao Liu                                    level + 1);
409822bce9fSZhao Liu         num_threads_next_level = num_threads_by_topo_level(topo_info,
410822bce9fSZhao Liu                                                            next_level);
411822bce9fSZhao Liu         offset_next_level = apicid_offset_by_topo_level(topo_info,
412822bce9fSZhao Liu                                                         next_level);
413822bce9fSZhao Liu     }
414822bce9fSZhao Liu 
415822bce9fSZhao Liu     *eax = offset_next_level;
416822bce9fSZhao Liu     /* The count (bits 15-00) doesn't need to be reliable. */
417822bce9fSZhao Liu     *ebx = num_threads_next_level & 0xffff;
418822bce9fSZhao Liu     *ecx = (count & 0xff) | (cpuid1f_topo_type(level) << 8);
419822bce9fSZhao Liu     *edx = cpu->apic_id;
420822bce9fSZhao Liu 
421822bce9fSZhao Liu     assert(!(*eax & ~0x1f));
422822bce9fSZhao Liu }
423822bce9fSZhao Liu 
4247e3482f8SEduardo Habkost /* Encode cache info for CPUID[0x80000005].ECX or CPUID[0x80000005].EDX */
encode_cache_cpuid80000005(CPUCacheInfo * cache)4257e3482f8SEduardo Habkost static uint32_t encode_cache_cpuid80000005(CPUCacheInfo *cache)
4267e3482f8SEduardo Habkost {
4277e3482f8SEduardo Habkost     assert(cache->size % 1024 == 0);
4287e3482f8SEduardo Habkost     assert(cache->lines_per_tag > 0);
4297e3482f8SEduardo Habkost     assert(cache->associativity > 0);
4307e3482f8SEduardo Habkost     assert(cache->line_size > 0);
4317e3482f8SEduardo Habkost     return ((cache->size / 1024) << 24) | (cache->associativity << 16) |
4327e3482f8SEduardo Habkost            (cache->lines_per_tag << 8) | (cache->line_size);
4337e3482f8SEduardo Habkost }
434fcf5ef2aSThomas Huth 
435fcf5ef2aSThomas Huth #define ASSOC_FULL 0xFF
436fcf5ef2aSThomas Huth 
437fcf5ef2aSThomas Huth /* AMD associativity encoding used on CPUID Leaf 0x80000006: */
438fcf5ef2aSThomas Huth #define AMD_ENC_ASSOC(a) (a <=   1 ? a   : \
439fcf5ef2aSThomas Huth                           a ==   2 ? 0x2 : \
440fcf5ef2aSThomas Huth                           a ==   4 ? 0x4 : \
441fcf5ef2aSThomas Huth                           a ==   8 ? 0x6 : \
442fcf5ef2aSThomas Huth                           a ==  16 ? 0x8 : \
443fcf5ef2aSThomas Huth                           a ==  32 ? 0xA : \
444fcf5ef2aSThomas Huth                           a ==  48 ? 0xB : \
445fcf5ef2aSThomas Huth                           a ==  64 ? 0xC : \
446fcf5ef2aSThomas Huth                           a ==  96 ? 0xD : \
447fcf5ef2aSThomas Huth                           a == 128 ? 0xE : \
448fcf5ef2aSThomas Huth                           a == ASSOC_FULL ? 0xF : \
449fcf5ef2aSThomas Huth                           0 /* invalid value */)
450fcf5ef2aSThomas Huth 
4517e3482f8SEduardo Habkost /*
4527e3482f8SEduardo Habkost  * Encode cache info for CPUID[0x80000006].ECX and CPUID[0x80000006].EDX
4537e3482f8SEduardo Habkost  * @l3 can be NULL.
4547e3482f8SEduardo Habkost  */
encode_cache_cpuid80000006(CPUCacheInfo * l2,CPUCacheInfo * l3,uint32_t * ecx,uint32_t * edx)4557e3482f8SEduardo Habkost static void encode_cache_cpuid80000006(CPUCacheInfo *l2,
4567e3482f8SEduardo Habkost                                        CPUCacheInfo *l3,
4577e3482f8SEduardo Habkost                                        uint32_t *ecx, uint32_t *edx)
4587e3482f8SEduardo Habkost {
4597e3482f8SEduardo Habkost     assert(l2->size % 1024 == 0);
4607e3482f8SEduardo Habkost     assert(l2->associativity > 0);
4617e3482f8SEduardo Habkost     assert(l2->lines_per_tag > 0);
4627e3482f8SEduardo Habkost     assert(l2->line_size > 0);
4637e3482f8SEduardo Habkost     *ecx = ((l2->size / 1024) << 16) |
4647e3482f8SEduardo Habkost            (AMD_ENC_ASSOC(l2->associativity) << 12) |
4657e3482f8SEduardo Habkost            (l2->lines_per_tag << 8) | (l2->line_size);
4667e3482f8SEduardo Habkost 
4677e3482f8SEduardo Habkost     if (l3) {
4687e3482f8SEduardo Habkost         assert(l3->size % (512 * 1024) == 0);
4697e3482f8SEduardo Habkost         assert(l3->associativity > 0);
4707e3482f8SEduardo Habkost         assert(l3->lines_per_tag > 0);
4717e3482f8SEduardo Habkost         assert(l3->line_size > 0);
4727e3482f8SEduardo Habkost         *edx = ((l3->size / (512 * 1024)) << 18) |
4737e3482f8SEduardo Habkost                (AMD_ENC_ASSOC(l3->associativity) << 12) |
4747e3482f8SEduardo Habkost                (l3->lines_per_tag << 8) | (l3->line_size);
4757e3482f8SEduardo Habkost     } else {
4767e3482f8SEduardo Habkost         *edx = 0;
4777e3482f8SEduardo Habkost     }
4787e3482f8SEduardo Habkost }
479fcf5ef2aSThomas Huth 
4808f4202fbSBabu Moger /* 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)4812f084d1eSBabu Moger static void encode_cache_cpuid8000001d(CPUCacheInfo *cache,
4822f084d1eSBabu Moger                                        X86CPUTopoInfo *topo_info,
4838f4202fbSBabu Moger                                        uint32_t *eax, uint32_t *ebx,
4848f4202fbSBabu Moger                                        uint32_t *ecx, uint32_t *edx)
4858f4202fbSBabu Moger {
4868f4202fbSBabu Moger     assert(cache->size == cache->line_size * cache->associativity *
4878f4202fbSBabu Moger                           cache->partitions * cache->sets);
4888f4202fbSBabu Moger 
4898f4202fbSBabu Moger     *eax = CACHE_TYPE(cache->type) | CACHE_LEVEL(cache->level) |
4908f4202fbSBabu Moger                (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0);
4915eb608a1SZhao Liu     *eax |= max_thread_ids_for_cache(topo_info, cache->share_level) << 14;
4928f4202fbSBabu Moger 
4938f4202fbSBabu Moger     assert(cache->line_size > 0);
4948f4202fbSBabu Moger     assert(cache->partitions > 0);
4958f4202fbSBabu Moger     assert(cache->associativity > 0);
4968f4202fbSBabu Moger     /* We don't implement fully-associative caches */
4978f4202fbSBabu Moger     assert(cache->associativity < cache->sets);
4988f4202fbSBabu Moger     *ebx = (cache->line_size - 1) |
4998f4202fbSBabu Moger            ((cache->partitions - 1) << 12) |
5008f4202fbSBabu Moger            ((cache->associativity - 1) << 22);
5018f4202fbSBabu Moger 
5028f4202fbSBabu Moger     assert(cache->sets > 0);
5038f4202fbSBabu Moger     *ecx = cache->sets - 1;
5048f4202fbSBabu Moger 
5058f4202fbSBabu Moger     *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
5068f4202fbSBabu Moger            (cache->inclusive ? CACHE_INCLUSIVE : 0) |
5078f4202fbSBabu Moger            (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
5088f4202fbSBabu Moger }
5098f4202fbSBabu Moger 
510ed78467aSBabu Moger /* 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)51131ada106SBabu Moger static void encode_topo_cpuid8000001e(X86CPU *cpu, X86CPUTopoInfo *topo_info,
512ed78467aSBabu Moger                                       uint32_t *eax, uint32_t *ebx,
513ed78467aSBabu Moger                                       uint32_t *ecx, uint32_t *edx)
514ed78467aSBabu Moger {
51531ada106SBabu Moger     X86CPUTopoIDs topo_ids;
516ed78467aSBabu Moger 
51731ada106SBabu Moger     x86_topo_ids_from_apicid(cpu->apic_id, topo_info, &topo_ids);
51831ada106SBabu Moger 
519ed78467aSBabu Moger     *eax = cpu->apic_id;
52031ada106SBabu Moger 
521ed78467aSBabu Moger     /*
52231ada106SBabu Moger      * CPUID_Fn8000001E_EBX [Core Identifiers] (CoreId)
52331ada106SBabu Moger      * Read-only. Reset: 0000_XXXXh.
52431ada106SBabu Moger      * See Core::X86::Cpuid::ExtApicId.
52531ada106SBabu Moger      * Core::X86::Cpuid::CoreId_lthree[1:0]_core[3:0]_thread[1:0];
52631ada106SBabu Moger      * Bits Description
52731ada106SBabu Moger      * 31:16 Reserved.
52831ada106SBabu Moger      * 15:8 ThreadsPerCore: threads per core. Read-only. Reset: XXh.
52931ada106SBabu Moger      *      The number of threads per core is ThreadsPerCore+1.
53031ada106SBabu Moger      *  7:0 CoreId: core ID. Read-only. Reset: XXh.
53131ada106SBabu Moger      *
53231ada106SBabu Moger      *  NOTE: CoreId is already part of apic_id. Just use it. We can
53331ada106SBabu Moger      *  use all the 8 bits to represent the core_id here.
534ed78467aSBabu Moger      */
53531ada106SBabu Moger     *ebx = ((topo_info->threads_per_core - 1) << 8) | (topo_ids.core_id & 0xFF);
53631ada106SBabu Moger 
537ed78467aSBabu Moger     /*
53831ada106SBabu Moger      * CPUID_Fn8000001E_ECX [Node Identifiers] (NodeId)
53931ada106SBabu Moger      * Read-only. Reset: 0000_0XXXh.
54031ada106SBabu Moger      * Core::X86::Cpuid::NodeId_lthree[1:0]_core[3:0]_thread[1:0];
54131ada106SBabu Moger      * Bits Description
54231ada106SBabu Moger      * 31:11 Reserved.
54331ada106SBabu Moger      * 10:8 NodesPerProcessor: Node per processor. Read-only. Reset: XXXb.
54431ada106SBabu Moger      *      ValidValues:
54531ada106SBabu Moger      *      Value   Description
546b776569aSBabu Moger      *      0h      1 node per processor.
547b776569aSBabu Moger      *      7h-1h   Reserved.
54831ada106SBabu Moger      *  7:0 NodeId: Node ID. Read-only. Reset: XXh.
54931ada106SBabu Moger      *
55031ada106SBabu Moger      * NOTE: Hardware reserves 3 bits for number of nodes per processor.
55131ada106SBabu Moger      * But users can create more nodes than the actual hardware can
55231ada106SBabu Moger      * support. To genaralize we can use all the upper 8 bits for nodes.
55331ada106SBabu Moger      * NodeId is combination of node and socket_id which is already decoded
55431ada106SBabu Moger      * in apic_id. Just use it by shifting.
555ed78467aSBabu Moger      */
556b776569aSBabu Moger     if (cpu->legacy_multi_node) {
55731ada106SBabu Moger         *ecx = ((topo_info->dies_per_pkg - 1) << 8) |
55831ada106SBabu Moger                ((cpu->apic_id >> apicid_die_offset(topo_info)) & 0xFF);
559b776569aSBabu Moger     } else {
560b776569aSBabu Moger         *ecx = (cpu->apic_id >> apicid_pkg_offset(topo_info)) & 0xFF;
561b776569aSBabu Moger     }
56231ada106SBabu Moger 
563ed78467aSBabu Moger     *edx = 0;
564ed78467aSBabu Moger }
565ed78467aSBabu Moger 
5668f4202fbSBabu Moger /*
567ab8f992eSBabu Moger  * Definitions of the hardcoded cache entries we expose:
568ab8f992eSBabu Moger  * These are legacy cache values. If there is a need to change any
569ab8f992eSBabu Moger  * of these values please use builtin_x86_defs
570ab8f992eSBabu Moger  */
571fcf5ef2aSThomas Huth 
572fcf5ef2aSThomas Huth /* L1 data cache: */
573ab8f992eSBabu Moger static CPUCacheInfo legacy_l1d_cache = {
5745f00335aSEduardo Habkost     .type = DATA_CACHE,
5757e3482f8SEduardo Habkost     .level = 1,
5767e3482f8SEduardo Habkost     .size = 32 * KiB,
5777e3482f8SEduardo Habkost     .self_init = 1,
5787e3482f8SEduardo Habkost     .line_size = 64,
5797e3482f8SEduardo Habkost     .associativity = 8,
5807e3482f8SEduardo Habkost     .sets = 64,
5817e3482f8SEduardo Habkost     .partitions = 1,
5827e3482f8SEduardo Habkost     .no_invd_sharing = true,
583e823ebe7SZhao Liu     .share_level = CPU_TOPOLOGY_LEVEL_CORE,
5847e3482f8SEduardo Habkost };
5857e3482f8SEduardo Habkost 
586fcf5ef2aSThomas Huth /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
587ab8f992eSBabu Moger static CPUCacheInfo legacy_l1d_cache_amd = {
5885f00335aSEduardo Habkost     .type = DATA_CACHE,
5897e3482f8SEduardo Habkost     .level = 1,
5907e3482f8SEduardo Habkost     .size = 64 * KiB,
5917e3482f8SEduardo Habkost     .self_init = 1,
5927e3482f8SEduardo Habkost     .line_size = 64,
5937e3482f8SEduardo Habkost     .associativity = 2,
5947e3482f8SEduardo Habkost     .sets = 512,
5957e3482f8SEduardo Habkost     .partitions = 1,
5967e3482f8SEduardo Habkost     .lines_per_tag = 1,
5977e3482f8SEduardo Habkost     .no_invd_sharing = true,
598e823ebe7SZhao Liu     .share_level = CPU_TOPOLOGY_LEVEL_CORE,
5997e3482f8SEduardo Habkost };
600fcf5ef2aSThomas Huth 
601fcf5ef2aSThomas Huth /* L1 instruction cache: */
602ab8f992eSBabu Moger static CPUCacheInfo legacy_l1i_cache = {
6035f00335aSEduardo Habkost     .type = INSTRUCTION_CACHE,
6047e3482f8SEduardo Habkost     .level = 1,
6057e3482f8SEduardo Habkost     .size = 32 * KiB,
6067e3482f8SEduardo Habkost     .self_init = 1,
6077e3482f8SEduardo Habkost     .line_size = 64,
6087e3482f8SEduardo Habkost     .associativity = 8,
6097e3482f8SEduardo Habkost     .sets = 64,
6107e3482f8SEduardo Habkost     .partitions = 1,
6117e3482f8SEduardo Habkost     .no_invd_sharing = true,
612e823ebe7SZhao Liu     .share_level = CPU_TOPOLOGY_LEVEL_CORE,
6137e3482f8SEduardo Habkost };
6147e3482f8SEduardo Habkost 
615fcf5ef2aSThomas Huth /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
616ab8f992eSBabu Moger static CPUCacheInfo legacy_l1i_cache_amd = {
6175f00335aSEduardo Habkost     .type = INSTRUCTION_CACHE,
6187e3482f8SEduardo Habkost     .level = 1,
6197e3482f8SEduardo Habkost     .size = 64 * KiB,
6207e3482f8SEduardo Habkost     .self_init = 1,
6217e3482f8SEduardo Habkost     .line_size = 64,
6227e3482f8SEduardo Habkost     .associativity = 2,
6237e3482f8SEduardo Habkost     .sets = 512,
6247e3482f8SEduardo Habkost     .partitions = 1,
6257e3482f8SEduardo Habkost     .lines_per_tag = 1,
6267e3482f8SEduardo Habkost     .no_invd_sharing = true,
627e823ebe7SZhao Liu     .share_level = CPU_TOPOLOGY_LEVEL_CORE,
6287e3482f8SEduardo Habkost };
629fcf5ef2aSThomas Huth 
630fcf5ef2aSThomas Huth /* Level 2 unified cache: */
631ab8f992eSBabu Moger static CPUCacheInfo legacy_l2_cache = {
6327e3482f8SEduardo Habkost     .type = UNIFIED_CACHE,
6337e3482f8SEduardo Habkost     .level = 2,
6347e3482f8SEduardo Habkost     .size = 4 * MiB,
6357e3482f8SEduardo Habkost     .self_init = 1,
6367e3482f8SEduardo Habkost     .line_size = 64,
6377e3482f8SEduardo Habkost     .associativity = 16,
6387e3482f8SEduardo Habkost     .sets = 4096,
6397e3482f8SEduardo Habkost     .partitions = 1,
6407e3482f8SEduardo Habkost     .no_invd_sharing = true,
641e823ebe7SZhao Liu     .share_level = CPU_TOPOLOGY_LEVEL_CORE,
6427e3482f8SEduardo Habkost };
6437e3482f8SEduardo Habkost 
644fcf5ef2aSThomas Huth /*FIXME: CPUID leaf 2 descriptor is inconsistent with CPUID leaf 4 */
645ab8f992eSBabu Moger static CPUCacheInfo legacy_l2_cache_cpuid2 = {
6467e3482f8SEduardo Habkost     .type = UNIFIED_CACHE,
6477e3482f8SEduardo Habkost     .level = 2,
6487e3482f8SEduardo Habkost     .size = 2 * MiB,
6497e3482f8SEduardo Habkost     .line_size = 64,
6507e3482f8SEduardo Habkost     .associativity = 8,
651e823ebe7SZhao Liu     .share_level = CPU_TOPOLOGY_LEVEL_INVALID,
6527e3482f8SEduardo Habkost };
6537e3482f8SEduardo Habkost 
6547e3482f8SEduardo Habkost 
655fcf5ef2aSThomas Huth /*FIXME: CPUID leaf 0x80000006 is inconsistent with leaves 2 & 4 */
656ab8f992eSBabu Moger static CPUCacheInfo legacy_l2_cache_amd = {
6577e3482f8SEduardo Habkost     .type = UNIFIED_CACHE,
6587e3482f8SEduardo Habkost     .level = 2,
6597e3482f8SEduardo Habkost     .size = 512 * KiB,
6607e3482f8SEduardo Habkost     .line_size = 64,
6617e3482f8SEduardo Habkost     .lines_per_tag = 1,
6627e3482f8SEduardo Habkost     .associativity = 16,
6637e3482f8SEduardo Habkost     .sets = 512,
6647e3482f8SEduardo Habkost     .partitions = 1,
665e823ebe7SZhao Liu     .share_level = CPU_TOPOLOGY_LEVEL_CORE,
6667e3482f8SEduardo Habkost };
667fcf5ef2aSThomas Huth 
668fcf5ef2aSThomas Huth /* Level 3 unified cache: */
669ab8f992eSBabu Moger static CPUCacheInfo legacy_l3_cache = {
6707e3482f8SEduardo Habkost     .type = UNIFIED_CACHE,
6717e3482f8SEduardo Habkost     .level = 3,
6727e3482f8SEduardo Habkost     .size = 16 * MiB,
6737e3482f8SEduardo Habkost     .line_size = 64,
6747e3482f8SEduardo Habkost     .associativity = 16,
6757e3482f8SEduardo Habkost     .sets = 16384,
6767e3482f8SEduardo Habkost     .partitions = 1,
6777e3482f8SEduardo Habkost     .lines_per_tag = 1,
6787e3482f8SEduardo Habkost     .self_init = true,
6797e3482f8SEduardo Habkost     .inclusive = true,
6807e3482f8SEduardo Habkost     .complex_indexing = true,
681e823ebe7SZhao Liu     .share_level = CPU_TOPOLOGY_LEVEL_DIE,
6827e3482f8SEduardo Habkost };
683fcf5ef2aSThomas Huth 
684fcf5ef2aSThomas Huth /* TLB definitions: */
685fcf5ef2aSThomas Huth 
686fcf5ef2aSThomas Huth #define L1_DTLB_2M_ASSOC       1
687fcf5ef2aSThomas Huth #define L1_DTLB_2M_ENTRIES   255
688fcf5ef2aSThomas Huth #define L1_DTLB_4K_ASSOC       1
689fcf5ef2aSThomas Huth #define L1_DTLB_4K_ENTRIES   255
690fcf5ef2aSThomas Huth 
691fcf5ef2aSThomas Huth #define L1_ITLB_2M_ASSOC       1
692fcf5ef2aSThomas Huth #define L1_ITLB_2M_ENTRIES   255
693fcf5ef2aSThomas Huth #define L1_ITLB_4K_ASSOC       1
694fcf5ef2aSThomas Huth #define L1_ITLB_4K_ENTRIES   255
695fcf5ef2aSThomas Huth 
696fcf5ef2aSThomas Huth #define L2_DTLB_2M_ASSOC       0 /* disabled */
697fcf5ef2aSThomas Huth #define L2_DTLB_2M_ENTRIES     0 /* disabled */
698fcf5ef2aSThomas Huth #define L2_DTLB_4K_ASSOC       4
699fcf5ef2aSThomas Huth #define L2_DTLB_4K_ENTRIES   512
700fcf5ef2aSThomas Huth 
701fcf5ef2aSThomas Huth #define L2_ITLB_2M_ASSOC       0 /* disabled */
702fcf5ef2aSThomas Huth #define L2_ITLB_2M_ENTRIES     0 /* disabled */
703fcf5ef2aSThomas Huth #define L2_ITLB_4K_ASSOC       4
704fcf5ef2aSThomas Huth #define L2_ITLB_4K_ENTRIES   512
705fcf5ef2aSThomas Huth 
706e37a5c7fSChao Peng /* CPUID Leaf 0x14 constants: */
707e37a5c7fSChao Peng #define INTEL_PT_MAX_SUBLEAF     0x1
708e37a5c7fSChao Peng /*
709e37a5c7fSChao Peng  * bit[00]: IA32_RTIT_CTL.CR3 filter can be set to 1 and IA32_RTIT_CR3_MATCH
710e37a5c7fSChao Peng  *          MSR can be accessed;
711e37a5c7fSChao Peng  * bit[01]: Support Configurable PSB and Cycle-Accurate Mode;
712e37a5c7fSChao Peng  * bit[02]: Support IP Filtering, TraceStop filtering, and preservation
713e37a5c7fSChao Peng  *          of Intel PT MSRs across warm reset;
714e37a5c7fSChao Peng  * bit[03]: Support MTC timing packet and suppression of COFI-based packets;
715e37a5c7fSChao Peng  */
716e37a5c7fSChao Peng #define INTEL_PT_MINIMAL_EBX     0xf
717e37a5c7fSChao Peng /*
718e37a5c7fSChao Peng  * bit[00]: Tracing can be enabled with IA32_RTIT_CTL.ToPA = 1 and
719e37a5c7fSChao Peng  *          IA32_RTIT_OUTPUT_BASE and IA32_RTIT_OUTPUT_MASK_PTRS MSRs can be
720e37a5c7fSChao Peng  *          accessed;
721e37a5c7fSChao Peng  * bit[01]: ToPA tables can hold any number of output entries, up to the
722e37a5c7fSChao Peng  *          maximum allowed by the MaskOrTableOffset field of
723e37a5c7fSChao Peng  *          IA32_RTIT_OUTPUT_MASK_PTRS;
724e37a5c7fSChao Peng  * bit[02]: Support Single-Range Output scheme;
725e37a5c7fSChao Peng  */
726e37a5c7fSChao Peng #define INTEL_PT_MINIMAL_ECX     0x7
727c078ca96SLuwei Kang /* generated packets which contain IP payloads have LIP values */
728c078ca96SLuwei Kang #define INTEL_PT_IP_LIP          (1 << 31)
729e37a5c7fSChao Peng #define INTEL_PT_ADDR_RANGES_NUM 0x2 /* Number of configurable address ranges */
730e37a5c7fSChao Peng #define INTEL_PT_ADDR_RANGES_NUM_MASK 0x3
731e37a5c7fSChao Peng #define INTEL_PT_MTC_BITMAP      (0x0249 << 16) /* Support ART(0,3,6,9) */
732e37a5c7fSChao Peng #define INTEL_PT_CYCLE_BITMAP    0x1fff         /* Support 0,2^(0~11) */
733e37a5c7fSChao Peng #define INTEL_PT_PSB_BITMAP      (0x003f << 16) /* Support 2K,4K,8K,16K,32K,64K */
734fcf5ef2aSThomas Huth 
735f21a4817SJing Liu /* CPUID Leaf 0x1D constants: */
736f21a4817SJing Liu #define INTEL_AMX_TILE_MAX_SUBLEAF     0x1
737f21a4817SJing Liu #define INTEL_AMX_TOTAL_TILE_BYTES     0x2000
738f21a4817SJing Liu #define INTEL_AMX_BYTES_PER_TILE       0x400
739f21a4817SJing Liu #define INTEL_AMX_BYTES_PER_ROW        0x40
740f21a4817SJing Liu #define INTEL_AMX_TILE_MAX_NAMES       0x8
741f21a4817SJing Liu #define INTEL_AMX_TILE_MAX_ROWS        0x10
742f21a4817SJing Liu 
743f21a4817SJing Liu /* CPUID Leaf 0x1E constants: */
744f21a4817SJing Liu #define INTEL_AMX_TMUL_MAX_K           0x10
745f21a4817SJing Liu #define INTEL_AMX_TMUL_MAX_N           0x40
746f21a4817SJing Liu 
x86_cpu_vendor_words2str(char * dst,uint32_t vendor1,uint32_t vendor2,uint32_t vendor3)747f5cc5a5cSClaudio Fontana void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1,
748fcf5ef2aSThomas Huth                               uint32_t vendor2, uint32_t vendor3)
749fcf5ef2aSThomas Huth {
750fcf5ef2aSThomas Huth     int i;
751fcf5ef2aSThomas Huth     for (i = 0; i < 4; i++) {
752fcf5ef2aSThomas Huth         dst[i] = vendor1 >> (8 * i);
753fcf5ef2aSThomas Huth         dst[i + 4] = vendor2 >> (8 * i);
754fcf5ef2aSThomas Huth         dst[i + 8] = vendor3 >> (8 * i);
755fcf5ef2aSThomas Huth     }
756fcf5ef2aSThomas Huth     dst[CPUID_VENDOR_SZ] = '\0';
757fcf5ef2aSThomas Huth }
758fcf5ef2aSThomas Huth 
759fcf5ef2aSThomas Huth #define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
760fcf5ef2aSThomas Huth #define PENTIUM_FEATURES (I486_FEATURES | CPUID_DE | CPUID_TSC | \
761fcf5ef2aSThomas Huth           CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_MMX | CPUID_APIC)
762fcf5ef2aSThomas Huth #define PENTIUM2_FEATURES (PENTIUM_FEATURES | CPUID_PAE | CPUID_SEP | \
763fcf5ef2aSThomas Huth           CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
764fcf5ef2aSThomas Huth           CPUID_PSE36 | CPUID_FXSR)
765fcf5ef2aSThomas Huth #define PENTIUM3_FEATURES (PENTIUM2_FEATURES | CPUID_SSE)
766fcf5ef2aSThomas Huth #define PPRO_FEATURES (CPUID_FP87 | CPUID_DE | CPUID_PSE | CPUID_TSC | \
767fcf5ef2aSThomas Huth           CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_PGE | CPUID_CMOV | \
768fcf5ef2aSThomas Huth           CPUID_PAT | CPUID_FXSR | CPUID_MMX | CPUID_SSE | CPUID_SSE2 | \
769fcf5ef2aSThomas Huth           CPUID_PAE | CPUID_SEP | CPUID_APIC)
770fcf5ef2aSThomas Huth 
771fcf5ef2aSThomas Huth #define TCG_FEATURES (CPUID_FP87 | CPUID_PSE | CPUID_TSC | CPUID_MSR | \
772fcf5ef2aSThomas Huth           CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | CPUID_SEP | \
773fcf5ef2aSThomas Huth           CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
774fcf5ef2aSThomas Huth           CPUID_PSE36 | CPUID_CLFLUSH | CPUID_ACPI | CPUID_MMX | \
775fcf5ef2aSThomas Huth           CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS | CPUID_DE)
776fcf5ef2aSThomas Huth           /* partly implemented:
777fcf5ef2aSThomas Huth           CPUID_MTRR, CPUID_MCA, CPUID_CLFLUSH (needed for Win64) */
778fcf5ef2aSThomas Huth           /* missing:
779fcf5ef2aSThomas Huth           CPUID_VME, CPUID_DTS, CPUID_SS, CPUID_HT, CPUID_TM, CPUID_PBE */
780d903259dSPaolo Bonzini 
781d903259dSPaolo Bonzini /*
782d903259dSPaolo Bonzini  * Kernel-only features that can be shown to usermode programs even if
783d903259dSPaolo Bonzini  * they aren't actually supported by TCG, because qemu-user only runs
784d903259dSPaolo Bonzini  * in CPL=3; remove them if they are ever implemented for system emulation.
785d903259dSPaolo Bonzini  */
786d903259dSPaolo Bonzini #if defined CONFIG_USER_ONLY
787774204cfSBui Quang Minh #define CPUID_EXT_KERNEL_FEATURES \
788774204cfSBui Quang Minh           (CPUID_EXT_PCID | CPUID_EXT_TSC_DEADLINE_TIMER)
789d903259dSPaolo Bonzini #else
790d903259dSPaolo Bonzini #define CPUID_EXT_KERNEL_FEATURES 0
791d903259dSPaolo Bonzini #endif
792fcf5ef2aSThomas Huth #define TCG_EXT_FEATURES (CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | \
793fcf5ef2aSThomas Huth           CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | \
794fcf5ef2aSThomas Huth           CPUID_EXT_SSE41 | CPUID_EXT_SSE42 | CPUID_EXT_POPCNT | \
795fcf5ef2aSThomas Huth           CPUID_EXT_XSAVE | /* CPUID_EXT_OSXSAVE is dynamic */   \
796369fd5caSRichard Henderson           CPUID_EXT_MOVBE | CPUID_EXT_AES | CPUID_EXT_HYPERVISOR | \
7972872b0f3SPaolo Bonzini           CPUID_EXT_RDRAND | CPUID_EXT_AVX | CPUID_EXT_F16C | \
798774204cfSBui Quang Minh           CPUID_EXT_FMA | CPUID_EXT_X2APIC | CPUID_EXT_KERNEL_FEATURES)
799fcf5ef2aSThomas Huth           /* missing:
800fcf5ef2aSThomas Huth           CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_SMX,
8012872b0f3SPaolo Bonzini           CPUID_EXT_EST, CPUID_EXT_TM2, CPUID_EXT_CID,
802fcf5ef2aSThomas Huth           CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_PCID, CPUID_EXT_DCA,
803774204cfSBui Quang Minh           CPUID_EXT_TSC_DEADLINE_TIMER
804774204cfSBui Quang Minh           */
805fcf5ef2aSThomas Huth 
806fcf5ef2aSThomas Huth #ifdef TARGET_X86_64
80763fd8ef0SPaolo Bonzini #define TCG_EXT2_X86_64_FEATURES CPUID_EXT2_LM
808fcf5ef2aSThomas Huth #else
809fcf5ef2aSThomas Huth #define TCG_EXT2_X86_64_FEATURES 0
810fcf5ef2aSThomas Huth #endif
811fcf5ef2aSThomas Huth 
812d903259dSPaolo Bonzini /*
813d903259dSPaolo Bonzini  * CPUID_*_KERNEL_FEATURES denotes bits and features that are not usable
814d903259dSPaolo Bonzini  * in usermode or by 32-bit programs.  Those are added to supported
815d903259dSPaolo Bonzini  * TCG features unconditionally in user-mode emulation mode.  This may
816d903259dSPaolo Bonzini  * indeed seem strange or incorrect, but it works because code running
817d903259dSPaolo Bonzini  * under usermode emulation cannot access them.
818d903259dSPaolo Bonzini  *
819d903259dSPaolo Bonzini  * Even for long mode, qemu-i386 is not running "a userspace program on a
820d903259dSPaolo Bonzini  * 32-bit CPU"; it's running "a userspace program with a 32-bit code segment"
821d903259dSPaolo Bonzini  * and therefore using the 32-bit ABI; the CPU itself might be 64-bit
822d903259dSPaolo Bonzini  * but again the difference is only visible in kernel mode.
823d903259dSPaolo Bonzini  */
82440a205daSPaolo Bonzini #if defined CONFIG_LINUX_USER
82540a205daSPaolo Bonzini #define CPUID_EXT2_KERNEL_FEATURES (CPUID_EXT2_LM | CPUID_EXT2_FFXSR)
82640a205daSPaolo Bonzini #elif defined CONFIG_USER_ONLY
82740a205daSPaolo Bonzini /* FIXME: Long mode not yet supported for i386 bsd-user */
828d903259dSPaolo Bonzini #define CPUID_EXT2_KERNEL_FEATURES CPUID_EXT2_FFXSR
829d903259dSPaolo Bonzini #else
830d903259dSPaolo Bonzini #define CPUID_EXT2_KERNEL_FEATURES 0
831d903259dSPaolo Bonzini #endif
832d903259dSPaolo Bonzini 
833fcf5ef2aSThomas Huth #define TCG_EXT2_FEATURES ((TCG_FEATURES & CPUID_EXT2_AMD_ALIASES) | \
834fcf5ef2aSThomas Huth           CPUID_EXT2_NX | CPUID_EXT2_MMXEXT | CPUID_EXT2_RDTSCP | \
835fcf5ef2aSThomas Huth           CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_PDPE1GB | \
836d903259dSPaolo Bonzini           CPUID_EXT2_SYSCALL | TCG_EXT2_X86_64_FEATURES | \
837d903259dSPaolo Bonzini           CPUID_EXT2_KERNEL_FEATURES)
838d903259dSPaolo Bonzini 
839d903259dSPaolo Bonzini #if defined CONFIG_USER_ONLY
840d903259dSPaolo Bonzini #define CPUID_EXT3_KERNEL_FEATURES CPUID_EXT3_OSVW
841d903259dSPaolo Bonzini #else
842d903259dSPaolo Bonzini #define CPUID_EXT3_KERNEL_FEATURES 0
843d903259dSPaolo Bonzini #endif
844d903259dSPaolo Bonzini 
845fcf5ef2aSThomas Huth #define TCG_EXT3_FEATURES (CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | \
8468afce497SPaolo Bonzini           CPUID_EXT3_CR8LEG | CPUID_EXT3_ABM | CPUID_EXT3_SSE4A | \
847d903259dSPaolo Bonzini           CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_KERNEL_FEATURES)
848d903259dSPaolo Bonzini 
849fcf5ef2aSThomas Huth #define TCG_EXT4_FEATURES 0
850d903259dSPaolo Bonzini 
851d903259dSPaolo Bonzini #if defined CONFIG_USER_ONLY
852d903259dSPaolo Bonzini #define CPUID_SVM_KERNEL_FEATURES (CPUID_SVM_NRIPSAVE | CPUID_SVM_VNMI)
853d903259dSPaolo Bonzini #else
854d903259dSPaolo Bonzini #define CPUID_SVM_KERNEL_FEATURES 0
855d903259dSPaolo Bonzini #endif
856900eeca5SLara Lazier #define TCG_SVM_FEATURES (CPUID_SVM_NPT | CPUID_SVM_VGIF | \
857d903259dSPaolo Bonzini           CPUID_SVM_SVME_ADDR_CHK | CPUID_SVM_KERNEL_FEATURES)
858d903259dSPaolo Bonzini 
859fcf5ef2aSThomas Huth #define TCG_KVM_FEATURES 0
860d903259dSPaolo Bonzini 
861d903259dSPaolo Bonzini #if defined CONFIG_USER_ONLY
862d903259dSPaolo Bonzini #define CPUID_7_0_EBX_KERNEL_FEATURES CPUID_7_0_EBX_INVPCID
863d903259dSPaolo Bonzini #else
864d903259dSPaolo Bonzini #define CPUID_7_0_EBX_KERNEL_FEATURES 0
865d903259dSPaolo Bonzini #endif
866fcf5ef2aSThomas Huth #define TCG_7_0_EBX_FEATURES (CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_SMAP | \
867fcf5ef2aSThomas Huth           CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX | \
8689f07e47aSPaolo Bonzini           CPUID_7_0_EBX_CLFLUSHOPT |            \
869fcf5ef2aSThomas Huth           CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_FSGSBASE | \
870d903259dSPaolo Bonzini           CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_RDSEED | \
871e582b629SPaolo Bonzini           CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_KERNEL_FEATURES)
872fcf5ef2aSThomas Huth           /* missing:
8732f8a21d8SPaul Brook           CPUID_7_0_EBX_HLE
874691925e5SPaolo Bonzini           CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM */
8756750485bSPaolo Bonzini 
8761da389c5SPhilippe Mathieu-Daudé #if !defined CONFIG_USER_ONLY || defined CONFIG_LINUX
8776750485bSPaolo Bonzini #define TCG_7_0_ECX_RDPID CPUID_7_0_ECX_RDPID
8786750485bSPaolo Bonzini #else
8796750485bSPaolo Bonzini #define TCG_7_0_ECX_RDPID 0
8806750485bSPaolo Bonzini #endif
881637f1ee3SGareth Webb #define TCG_7_0_ECX_FEATURES (CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | \
8829ccb9784SEduardo Habkost           /* CPUID_7_0_ECX_OSPKE is dynamic */ \
8836750485bSPaolo Bonzini           CPUID_7_0_ECX_LA57 | CPUID_7_0_ECX_PKS | CPUID_7_0_ECX_VAES | \
8846750485bSPaolo Bonzini           TCG_7_0_ECX_RDPID)
8856750485bSPaolo Bonzini 
886d903259dSPaolo Bonzini #if defined CONFIG_USER_ONLY
887d903259dSPaolo Bonzini #define CPUID_7_0_EDX_KERNEL_FEATURES (CPUID_7_0_EDX_SPEC_CTRL | \
888d903259dSPaolo Bonzini           CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD)
889d903259dSPaolo Bonzini #else
890d903259dSPaolo Bonzini #define CPUID_7_0_EDX_KERNEL_FEATURES 0
891d903259dSPaolo Bonzini #endif
892d903259dSPaolo Bonzini #define TCG_7_0_EDX_FEATURES (CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_KERNEL_FEATURES)
893d903259dSPaolo Bonzini 
89458794f64SPaolo Bonzini #define TCG_7_1_EAX_FEATURES (CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | \
895405c7c07SPaolo Bonzini           CPUID_7_1_EAX_FSRC | CPUID_7_1_EAX_CMPCCXADD)
896eaaa197dSJiaxi Chen #define TCG_7_1_EDX_FEATURES 0
8979dd8b710STao Su #define TCG_7_2_EDX_FEATURES 0
898fcf5ef2aSThomas Huth #define TCG_APM_FEATURES 0
899fcf5ef2aSThomas Huth #define TCG_6_EAX_FEATURES CPUID_6_EAX_ARAT
900fcf5ef2aSThomas Huth #define TCG_XSAVE_FEATURES (CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XGETBV1)
901fcf5ef2aSThomas Huth           /* missing:
902fcf5ef2aSThomas Huth           CPUID_XSAVE_XSAVEC, CPUID_XSAVE_XSAVES */
903d1615ea5SLuwei Kang #define TCG_14_0_ECX_FEATURES 0
9044b841a79SSean Christopherson #define TCG_SGX_12_0_EAX_FEATURES 0
905120ca112SSean Christopherson #define TCG_SGX_12_0_EBX_FEATURES 0
906165981a5SSean Christopherson #define TCG_SGX_12_1_EAX_FEATURES 0
9072d055b8fSTao Su #define TCG_24_0_EBX_FEATURES 0
908fcf5ef2aSThomas Huth 
909d903259dSPaolo Bonzini #if defined CONFIG_USER_ONLY
910d903259dSPaolo Bonzini #define CPUID_8000_0008_EBX_KERNEL_FEATURES (CPUID_8000_0008_EBX_IBPB | \
911d903259dSPaolo Bonzini           CPUID_8000_0008_EBX_IBRS | CPUID_8000_0008_EBX_STIBP | \
912d903259dSPaolo Bonzini           CPUID_8000_0008_EBX_STIBP_ALWAYS_ON | CPUID_8000_0008_EBX_AMD_SSBD | \
913d903259dSPaolo Bonzini           CPUID_8000_0008_EBX_AMD_PSFD)
914d903259dSPaolo Bonzini #else
915d903259dSPaolo Bonzini #define CPUID_8000_0008_EBX_KERNEL_FEATURES 0
916d903259dSPaolo Bonzini #endif
917d903259dSPaolo Bonzini 
918431c51e9SPaolo Bonzini #define TCG_8000_0008_EBX  (CPUID_8000_0008_EBX_XSAVEERPTR | \
919d903259dSPaolo Bonzini           CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_KERNEL_FEATURES)
9201420dd6aSPaolo Bonzini 
92179f1a68aSClaudio Fontana FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
922fcf5ef2aSThomas Huth     [FEAT_1_EDX] = {
92307585923SRobert Hoo         .type = CPUID_FEATURE_WORD,
924fcf5ef2aSThomas Huth         .feat_names = {
925fcf5ef2aSThomas Huth             "fpu", "vme", "de", "pse",
926fcf5ef2aSThomas Huth             "tsc", "msr", "pae", "mce",
927fcf5ef2aSThomas Huth             "cx8", "apic", NULL, "sep",
928fcf5ef2aSThomas Huth             "mtrr", "pge", "mca", "cmov",
929fcf5ef2aSThomas Huth             "pat", "pse36", "pn" /* Intel psn */, "clflush" /* Intel clfsh */,
930fcf5ef2aSThomas Huth             NULL, "ds" /* Intel dts */, "acpi", "mmx",
931fcf5ef2aSThomas Huth             "fxsr", "sse", "sse2", "ss",
932fcf5ef2aSThomas Huth             "ht" /* Intel htt */, "tm", "ia64", "pbe",
933fcf5ef2aSThomas Huth         },
93407585923SRobert Hoo         .cpuid = {.eax = 1, .reg = R_EDX, },
935fcf5ef2aSThomas Huth         .tcg_features = TCG_FEATURES,
93683629b14SXiaoyao Li         .no_autoenable_flags = CPUID_HT,
937fcf5ef2aSThomas Huth     },
938fcf5ef2aSThomas Huth     [FEAT_1_ECX] = {
93907585923SRobert Hoo         .type = CPUID_FEATURE_WORD,
940fcf5ef2aSThomas Huth         .feat_names = {
941fcf5ef2aSThomas Huth             "pni" /* Intel,AMD sse3 */, "pclmulqdq", "dtes64", "monitor",
942fcf5ef2aSThomas Huth             "ds-cpl", "vmx", "smx", "est",
943fcf5ef2aSThomas Huth             "tm2", "ssse3", "cid", NULL,
944fcf5ef2aSThomas Huth             "fma", "cx16", "xtpr", "pdcm",
945fcf5ef2aSThomas Huth             NULL, "pcid", "dca", "sse4.1",
946fcf5ef2aSThomas Huth             "sse4.2", "x2apic", "movbe", "popcnt",
947f1a23522SEduardo Habkost             "tsc-deadline", "aes", "xsave", NULL /* osxsave */,
948fcf5ef2aSThomas Huth             "avx", "f16c", "rdrand", "hypervisor",
949fcf5ef2aSThomas Huth         },
95007585923SRobert Hoo         .cpuid = { .eax = 1, .reg = R_ECX, },
951fcf5ef2aSThomas Huth         .tcg_features = TCG_EXT_FEATURES,
952fcf5ef2aSThomas Huth     },
953fcf5ef2aSThomas Huth     /* Feature names that are already defined on feature_name[] but
954fcf5ef2aSThomas Huth      * are set on CPUID[8000_0001].EDX on AMD CPUs don't have their
955fcf5ef2aSThomas Huth      * names on feat_names below. They are copied automatically
956fcf5ef2aSThomas Huth      * to features[FEAT_8000_0001_EDX] if and only if CPU vendor is AMD.
957fcf5ef2aSThomas Huth      */
958fcf5ef2aSThomas Huth     [FEAT_8000_0001_EDX] = {
95907585923SRobert Hoo         .type = CPUID_FEATURE_WORD,
960fcf5ef2aSThomas Huth         .feat_names = {
961fcf5ef2aSThomas Huth             NULL /* fpu */, NULL /* vme */, NULL /* de */, NULL /* pse */,
962fcf5ef2aSThomas Huth             NULL /* tsc */, NULL /* msr */, NULL /* pae */, NULL /* mce */,
963fcf5ef2aSThomas Huth             NULL /* cx8 */, NULL /* apic */, NULL, "syscall",
964fcf5ef2aSThomas Huth             NULL /* mtrr */, NULL /* pge */, NULL /* mca */, NULL /* cmov */,
965fcf5ef2aSThomas Huth             NULL /* pat */, NULL /* pse36 */, NULL, NULL /* Linux mp */,
966fcf5ef2aSThomas Huth             "nx", NULL, "mmxext", NULL /* mmx */,
967fcf5ef2aSThomas Huth             NULL /* fxsr */, "fxsr-opt", "pdpe1gb", "rdtscp",
968fcf5ef2aSThomas Huth             NULL, "lm", "3dnowext", "3dnow",
969fcf5ef2aSThomas Huth         },
97007585923SRobert Hoo         .cpuid = { .eax = 0x80000001, .reg = R_EDX, },
971fcf5ef2aSThomas Huth         .tcg_features = TCG_EXT2_FEATURES,
972fcf5ef2aSThomas Huth     },
973fcf5ef2aSThomas Huth     [FEAT_8000_0001_ECX] = {
97407585923SRobert Hoo         .type = CPUID_FEATURE_WORD,
975fcf5ef2aSThomas Huth         .feat_names = {
976fcf5ef2aSThomas Huth             "lahf-lm", "cmp-legacy", "svm", "extapic",
977fcf5ef2aSThomas Huth             "cr8legacy", "abm", "sse4a", "misalignsse",
978fcf5ef2aSThomas Huth             "3dnowprefetch", "osvw", "ibs", "xop",
979fcf5ef2aSThomas Huth             "skinit", "wdt", NULL, "lwp",
980fcf5ef2aSThomas Huth             "fma4", "tce", NULL, "nodeid-msr",
981fcf5ef2aSThomas Huth             NULL, "tbm", "topoext", "perfctr-core",
982fcf5ef2aSThomas Huth             "perfctr-nb", NULL, NULL, NULL,
983fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
984fcf5ef2aSThomas Huth         },
98507585923SRobert Hoo         .cpuid = { .eax = 0x80000001, .reg = R_ECX, },
986fcf5ef2aSThomas Huth         .tcg_features = TCG_EXT3_FEATURES,
9877210a02cSEduardo Habkost         /*
9887210a02cSEduardo Habkost          * TOPOEXT is always allowed but can't be enabled blindly by
9897210a02cSEduardo Habkost          * "-cpu host", as it requires consistent cache topology info
9907210a02cSEduardo Habkost          * to be provided so it doesn't confuse guests.
9917210a02cSEduardo Habkost          */
9927210a02cSEduardo Habkost         .no_autoenable_flags = CPUID_EXT3_TOPOEXT,
993fcf5ef2aSThomas Huth     },
994fcf5ef2aSThomas Huth     [FEAT_C000_0001_EDX] = {
99507585923SRobert Hoo         .type = CPUID_FEATURE_WORD,
996fcf5ef2aSThomas Huth         .feat_names = {
997fcf5ef2aSThomas Huth             NULL, NULL, "xstore", "xstore-en",
998fcf5ef2aSThomas Huth             NULL, NULL, "xcrypt", "xcrypt-en",
999fcf5ef2aSThomas Huth             "ace2", "ace2-en", "phe", "phe-en",
1000fcf5ef2aSThomas Huth             "pmm", "pmm-en", NULL, NULL,
1001fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1002fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1003fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1004fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1005fcf5ef2aSThomas Huth         },
100607585923SRobert Hoo         .cpuid = { .eax = 0xC0000001, .reg = R_EDX, },
1007fcf5ef2aSThomas Huth         .tcg_features = TCG_EXT4_FEATURES,
1008fcf5ef2aSThomas Huth     },
1009fcf5ef2aSThomas Huth     [FEAT_KVM] = {
101007585923SRobert Hoo         .type = CPUID_FEATURE_WORD,
1011fcf5ef2aSThomas Huth         .feat_names = {
1012fcf5ef2aSThomas Huth             "kvmclock", "kvm-nopiodelay", "kvm-mmu", "kvmclock",
1013fcf5ef2aSThomas Huth             "kvm-asyncpf", "kvm-steal-time", "kvm-pv-eoi", "kvm-pv-unhalt",
1014eba97806SXiaoyao Li             NULL, "kvm-pv-tlb-flush", "kvm-asyncpf-vmexit", "kvm-pv-ipi",
1015c1bb5418SDavid Woodhouse             "kvm-poll-control", "kvm-pv-sched-yield", "kvm-asyncpf-int", "kvm-msi-ext-dest-id",
1016fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1017fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1018fcf5ef2aSThomas Huth             "kvmclock-stable-bit", NULL, NULL, NULL,
1019fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1020fcf5ef2aSThomas Huth         },
102107585923SRobert Hoo         .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EAX, },
1022fcf5ef2aSThomas Huth         .tcg_features = TCG_KVM_FEATURES,
1023fcf5ef2aSThomas Huth     },
1024be777326SWanpeng Li     [FEAT_KVM_HINTS] = {
102507585923SRobert Hoo         .type = CPUID_FEATURE_WORD,
1026be777326SWanpeng Li         .feat_names = {
1027be777326SWanpeng Li             "kvm-hint-dedicated", NULL, NULL, NULL,
1028be777326SWanpeng Li             NULL, NULL, NULL, NULL,
1029be777326SWanpeng Li             NULL, NULL, NULL, NULL,
1030be777326SWanpeng Li             NULL, NULL, NULL, NULL,
1031be777326SWanpeng Li             NULL, NULL, NULL, NULL,
1032be777326SWanpeng Li             NULL, NULL, NULL, NULL,
1033be777326SWanpeng Li             NULL, NULL, NULL, NULL,
1034be777326SWanpeng Li             NULL, NULL, NULL, NULL,
1035be777326SWanpeng Li         },
103607585923SRobert Hoo         .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EDX, },
1037be777326SWanpeng Li         .tcg_features = TCG_KVM_FEATURES,
10380d914f39SEduardo Habkost         /*
10390d914f39SEduardo Habkost          * KVM hints aren't auto-enabled by -cpu host, they need to be
10400d914f39SEduardo Habkost          * explicitly enabled in the command-line.
10410d914f39SEduardo Habkost          */
10420d914f39SEduardo Habkost         .no_autoenable_flags = ~0U,
1043be777326SWanpeng Li     },
1044fcf5ef2aSThomas Huth     [FEAT_SVM] = {
104507585923SRobert Hoo         .type = CPUID_FEATURE_WORD,
1046fcf5ef2aSThomas Huth         .feat_names = {
1047fcf5ef2aSThomas Huth             "npt", "lbrv", "svm-lock", "nrip-save",
1048fcf5ef2aSThomas Huth             "tsc-scale", "vmcb-clean",  "flushbyasid", "decodeassists",
1049fcf5ef2aSThomas Huth             NULL, NULL, "pause-filter", NULL,
10505447089cSWei Huang             "pfthreshold", "avic", NULL, "v-vmsave-vmload",
10515447089cSWei Huang             "vgif", NULL, NULL, NULL,
1052fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
105362a798d4SBabu Moger             NULL, "vnmi", NULL, NULL,
10545447089cSWei Huang             "svme-addr-chk", NULL, NULL, NULL,
1055fcf5ef2aSThomas Huth         },
105607585923SRobert Hoo         .cpuid = { .eax = 0x8000000A, .reg = R_EDX, },
1057fcf5ef2aSThomas Huth         .tcg_features = TCG_SVM_FEATURES,
1058fcf5ef2aSThomas Huth     },
1059fcf5ef2aSThomas Huth     [FEAT_7_0_EBX] = {
106007585923SRobert Hoo         .type = CPUID_FEATURE_WORD,
1061fcf5ef2aSThomas Huth         .feat_names = {
10625c76b651SSean Christopherson             "fsgsbase", "tsc-adjust", "sgx", "bmi1",
10637dddc3bbSXiaoyao Li             "hle", "avx2", "fdp-excptn-only", "smep",
1064fcf5ef2aSThomas Huth             "bmi2", "erms", "invpcid", "rtm",
10657dddc3bbSXiaoyao Li             NULL, "zero-fcs-fds", "mpx", NULL,
1066fcf5ef2aSThomas Huth             "avx512f", "avx512dq", "rdseed", "adx",
1067fcf5ef2aSThomas Huth             "smap", "avx512ifma", "pcommit", "clflushopt",
1068e37a5c7fSChao Peng             "clwb", "intel-pt", "avx512pf", "avx512er",
1069638cbd45SYi Sun             "avx512cd", "sha-ni", "avx512bw", "avx512vl",
1070fcf5ef2aSThomas Huth         },
107107585923SRobert Hoo         .cpuid = {
107207585923SRobert Hoo             .eax = 7,
107307585923SRobert Hoo             .needs_ecx = true, .ecx = 0,
107407585923SRobert Hoo             .reg = R_EBX,
107507585923SRobert Hoo         },
1076fcf5ef2aSThomas Huth         .tcg_features = TCG_7_0_EBX_FEATURES,
1077fcf5ef2aSThomas Huth     },
1078fcf5ef2aSThomas Huth     [FEAT_7_0_ECX] = {
107907585923SRobert Hoo         .type = CPUID_FEATURE_WORD,
1080fcf5ef2aSThomas Huth         .feat_names = {
1081fcf5ef2aSThomas Huth             NULL, "avx512vbmi", "umip", "pku",
108267192a29STao Xu             NULL /* ospke */, "waitpkg", "avx512vbmi2", NULL,
1083aff9e6e4SYang Zhong             "gfni", "vaes", "vpclmulqdq", "avx512vnni",
1084aff9e6e4SYang Zhong             "avx512bitalg", NULL, "avx512-vpopcntdq", NULL,
10856c7c3c21SKirill A. Shutemov             "la57", NULL, NULL, NULL,
1086fcf5ef2aSThomas Huth             NULL, NULL, "rdpid", NULL,
108706e878b4SChenyi Qiang             "bus-lock-detect", "cldemote", NULL, "movdiri",
10885c76b651SSean Christopherson             "movdir64b", NULL, "sgxlc", "pks",
1089fcf5ef2aSThomas Huth         },
109007585923SRobert Hoo         .cpuid = {
109107585923SRobert Hoo             .eax = 7,
109207585923SRobert Hoo             .needs_ecx = true, .ecx = 0,
109307585923SRobert Hoo             .reg = R_ECX,
109407585923SRobert Hoo         },
1095fcf5ef2aSThomas Huth         .tcg_features = TCG_7_0_ECX_FEATURES,
1096fcf5ef2aSThomas Huth     },
1097fcf5ef2aSThomas Huth     [FEAT_7_0_EDX] = {
109807585923SRobert Hoo         .type = CPUID_FEATURE_WORD,
1099fcf5ef2aSThomas Huth         .feat_names = {
1100fcf5ef2aSThomas Huth             NULL, NULL, "avx512-4vnniw", "avx512-4fmaps",
11015cb287d2SChenyi Qiang             "fsrm", NULL, NULL, NULL,
1102353f98c9SCathy Zhang             "avx512-vp2intersect", NULL, "md-clear", NULL,
11035dd13f2aSCathy Zhang             NULL, NULL, "serialize", NULL,
1104c3c67679SYang Weijiang             "tsx-ldtrk", NULL, NULL /* pconfig */, "arch-lbr",
1105f21a4817SJing Liu             NULL, NULL, "amx-bf16", "avx512-fp16",
1106f21a4817SJing Liu             "amx-tile", "amx-int8", "spec-ctrl", "stibp",
11070e7e3bf1SEmanuele Giuseppe Esposito             "flush-l1d", "arch-capabilities", "core-capability", "ssbd",
1108fcf5ef2aSThomas Huth         },
110907585923SRobert Hoo         .cpuid = {
111007585923SRobert Hoo             .eax = 7,
111107585923SRobert Hoo             .needs_ecx = true, .ecx = 0,
111207585923SRobert Hoo             .reg = R_EDX,
111307585923SRobert Hoo         },
1114fcf5ef2aSThomas Huth         .tcg_features = TCG_7_0_EDX_FEATURES,
1115fcf5ef2aSThomas Huth     },
111680db491dSJing Liu     [FEAT_7_1_EAX] = {
111780db491dSJing Liu         .type = CPUID_FEATURE_WORD,
111880db491dSJing Liu         .feat_names = {
111978be258cSPaolo Bonzini             "sha512", "sm3", "sm4", NULL,
1120a9ce107fSJiaxi Chen             "avx-vnni", "avx512-bf16", NULL, "cmpccxadd",
112158794f64SPaolo Bonzini             NULL, NULL, "fzrm", "fsrs",
112258794f64SPaolo Bonzini             "fsrc", NULL, NULL, NULL,
1123c1acad9fSXin Li             NULL, "fred", "lkgs", "wrmsrns",
1124a957a884SJiaxi Chen             NULL, "amx-fp16", NULL, "avx-ifma",
1125ba678090SRobert Hoo             NULL, NULL, "lam", NULL,
112680db491dSJing Liu             NULL, NULL, NULL, NULL,
112780db491dSJing Liu         },
112880db491dSJing Liu         .cpuid = {
112980db491dSJing Liu             .eax = 7,
113080db491dSJing Liu             .needs_ecx = true, .ecx = 1,
113180db491dSJing Liu             .reg = R_EAX,
113280db491dSJing Liu         },
113380db491dSJing Liu         .tcg_features = TCG_7_1_EAX_FEATURES,
113480db491dSJing Liu     },
1135eaaa197dSJiaxi Chen     [FEAT_7_1_EDX] = {
1136eaaa197dSJiaxi Chen         .type = CPUID_FEATURE_WORD,
1137eaaa197dSJiaxi Chen         .feat_names = {
1138eaaa197dSJiaxi Chen             NULL, NULL, NULL, NULL,
1139ecd2e6caSJiaxi Chen             "avx-vnni-int8", "avx-ne-convert", NULL, NULL,
1140138c3377SPaolo Bonzini             "amx-complex", NULL, "avx-vnni-int16", NULL,
1141d1a11115SJiaxi Chen             NULL, NULL, "prefetchiti", NULL,
1142bccfb846STao Su             NULL, NULL, NULL, "avx10",
1143eaaa197dSJiaxi Chen             NULL, NULL, NULL, NULL,
1144eaaa197dSJiaxi Chen             NULL, NULL, NULL, NULL,
1145eaaa197dSJiaxi Chen             NULL, NULL, NULL, NULL,
1146eaaa197dSJiaxi Chen         },
1147eaaa197dSJiaxi Chen         .cpuid = {
1148eaaa197dSJiaxi Chen             .eax = 7,
1149eaaa197dSJiaxi Chen             .needs_ecx = true, .ecx = 1,
1150eaaa197dSJiaxi Chen             .reg = R_EDX,
1151eaaa197dSJiaxi Chen         },
1152eaaa197dSJiaxi Chen         .tcg_features = TCG_7_1_EDX_FEATURES,
1153eaaa197dSJiaxi Chen     },
11549dd8b710STao Su     [FEAT_7_2_EDX] = {
11559dd8b710STao Su         .type = CPUID_FEATURE_WORD,
11569dd8b710STao Su         .feat_names = {
115710eaf9c0SChao Gao             "intel-psfd", "ipred-ctrl", "rrsba-ctrl", "ddpd-u",
115810eaf9c0SChao Gao             "bhi-ctrl", "mcdt-no", NULL, NULL,
11599dd8b710STao Su             NULL, NULL, NULL, NULL,
11609dd8b710STao Su             NULL, NULL, NULL, NULL,
11619dd8b710STao Su             NULL, NULL, NULL, NULL,
11629dd8b710STao Su             NULL, NULL, NULL, NULL,
11639dd8b710STao Su             NULL, NULL, NULL, NULL,
11649dd8b710STao Su             NULL, NULL, NULL, NULL,
11659dd8b710STao Su         },
11669dd8b710STao Su         .cpuid = {
11679dd8b710STao Su             .eax = 7,
11689dd8b710STao Su             .needs_ecx = true, .ecx = 2,
11699dd8b710STao Su             .reg = R_EDX,
11709dd8b710STao Su         },
11719dd8b710STao Su         .tcg_features = TCG_7_2_EDX_FEATURES,
11729dd8b710STao Su     },
11732d055b8fSTao Su     [FEAT_24_0_EBX] = {
11742d055b8fSTao Su         .type = CPUID_FEATURE_WORD,
11752d055b8fSTao Su         .feat_names = {
11762d055b8fSTao Su             [16] = "avx10-128",
11772d055b8fSTao Su             [17] = "avx10-256",
11782d055b8fSTao Su             [18] = "avx10-512",
11792d055b8fSTao Su         },
11802d055b8fSTao Su         .cpuid = {
11812d055b8fSTao Su             .eax = 0x24,
11822d055b8fSTao Su             .needs_ecx = true, .ecx = 0,
11832d055b8fSTao Su             .reg = R_EBX,
11842d055b8fSTao Su         },
11852d055b8fSTao Su         .tcg_features = TCG_24_0_EBX_FEATURES,
11862d055b8fSTao Su     },
1187fcf5ef2aSThomas Huth     [FEAT_8000_0007_EDX] = {
118807585923SRobert Hoo         .type = CPUID_FEATURE_WORD,
1189fcf5ef2aSThomas Huth         .feat_names = {
1190fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1191fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1192fcf5ef2aSThomas Huth             "invtsc", NULL, NULL, NULL,
1193fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1194fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1195fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1196fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1197fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1198fcf5ef2aSThomas Huth         },
119907585923SRobert Hoo         .cpuid = { .eax = 0x80000007, .reg = R_EDX, },
1200fcf5ef2aSThomas Huth         .tcg_features = TCG_APM_FEATURES,
1201fcf5ef2aSThomas Huth         .unmigratable_flags = CPUID_APM_INVTSC,
1202fcf5ef2aSThomas Huth     },
12032ba8b7eeSJohn Allen     [FEAT_8000_0007_EBX] = {
12042ba8b7eeSJohn Allen         .type = CPUID_FEATURE_WORD,
12052ba8b7eeSJohn Allen         .feat_names = {
12061ea14321SJohn Allen             "overflow-recov", "succor", NULL, NULL,
12072ba8b7eeSJohn Allen             NULL, NULL, NULL, NULL,
12082ba8b7eeSJohn Allen             NULL, NULL, NULL, NULL,
12092ba8b7eeSJohn Allen             NULL, NULL, NULL, NULL,
12102ba8b7eeSJohn Allen             NULL, NULL, NULL, NULL,
12112ba8b7eeSJohn Allen             NULL, NULL, NULL, NULL,
12122ba8b7eeSJohn Allen             NULL, NULL, NULL, NULL,
12132ba8b7eeSJohn Allen             NULL, NULL, NULL, NULL,
12142ba8b7eeSJohn Allen         },
12152ba8b7eeSJohn Allen         .cpuid = { .eax = 0x80000007, .reg = R_EBX, },
12162ba8b7eeSJohn Allen         .tcg_features = 0,
12172ba8b7eeSJohn Allen         .unmigratable_flags = 0,
12182ba8b7eeSJohn Allen     },
12191b3420e1SEduardo Habkost     [FEAT_8000_0008_EBX] = {
122007585923SRobert Hoo         .type = CPUID_FEATURE_WORD,
12211b3420e1SEduardo Habkost         .feat_names = {
1222e900135dSSebastian Andrzej Siewior             "clzero", NULL, "xsaveerptr", NULL,
12231b3420e1SEduardo Habkost             NULL, NULL, NULL, NULL,
122459a80a19SRobert Hoo             NULL, "wbnoinvd", NULL, NULL,
1225623972ceSBabu Moger             "ibpb", NULL, "ibrs", "amd-stibp",
1226bb039a23SBabu Moger             NULL, "stibp-always-on", NULL, NULL,
12271b3420e1SEduardo Habkost             NULL, NULL, NULL, NULL,
1228254790a9SKonrad Rzeszutek Wilk             "amd-ssbd", "virt-ssbd", "amd-no-ssb", NULL,
1229bb039a23SBabu Moger             "amd-psfd", NULL, NULL, NULL,
12301b3420e1SEduardo Habkost         },
123107585923SRobert Hoo         .cpuid = { .eax = 0x80000008, .reg = R_EBX, },
12321420dd6aSPaolo Bonzini         .tcg_features = TCG_8000_0008_EBX,
12331b3420e1SEduardo Habkost         .unmigratable_flags = 0,
12341b3420e1SEduardo Habkost     },
1235b70eec31SBabu Moger     [FEAT_8000_0021_EAX] = {
1236b70eec31SBabu Moger         .type = CPUID_FEATURE_WORD,
1237b70eec31SBabu Moger         .feat_names = {
1238b70eec31SBabu Moger             "no-nested-data-bp", NULL, "lfence-always-serializing", NULL,
1239b70eec31SBabu Moger             NULL, NULL, "null-sel-clr-base", NULL,
124062a798d4SBabu Moger             "auto-ibrs", NULL, NULL, NULL,
1241b70eec31SBabu Moger             NULL, NULL, NULL, NULL,
1242b70eec31SBabu Moger             NULL, NULL, NULL, NULL,
1243b70eec31SBabu Moger             NULL, NULL, NULL, NULL,
12449c07a7afSBabu Moger             "eraps", NULL, NULL, "sbpb",
12452ec282b8SBabu Moger             "ibpb-brtype", "srso-no", "srso-user-kernel-no", NULL,
1246b70eec31SBabu Moger         },
1247b70eec31SBabu Moger         .cpuid = { .eax = 0x80000021, .reg = R_EAX, },
1248b70eec31SBabu Moger         .tcg_features = 0,
1249b70eec31SBabu Moger         .unmigratable_flags = 0,
1250b70eec31SBabu Moger     },
12519c07a7afSBabu Moger     [FEAT_8000_0021_EBX] = {
12529c07a7afSBabu Moger         .type = CPUID_FEATURE_WORD,
12539c07a7afSBabu Moger         .cpuid = { .eax = 0x80000021, .reg = R_EBX, },
12549c07a7afSBabu Moger         .tcg_features = 0,
12559c07a7afSBabu Moger         .unmigratable_flags = 0,
12569c07a7afSBabu Moger     },
1257209b0ac1SSandipan Das     [FEAT_8000_0022_EAX] = {
1258209b0ac1SSandipan Das         .type = CPUID_FEATURE_WORD,
1259209b0ac1SSandipan Das         .feat_names = {
1260209b0ac1SSandipan Das             "perfmon-v2", NULL, NULL, NULL,
1261209b0ac1SSandipan Das             NULL, NULL, NULL, NULL,
1262209b0ac1SSandipan Das             NULL, NULL, NULL, NULL,
1263209b0ac1SSandipan Das             NULL, NULL, NULL, NULL,
1264209b0ac1SSandipan Das             NULL, NULL, NULL, NULL,
1265209b0ac1SSandipan Das             NULL, NULL, NULL, NULL,
1266209b0ac1SSandipan Das             NULL, NULL, NULL, NULL,
1267209b0ac1SSandipan Das             NULL, NULL, NULL, NULL,
1268209b0ac1SSandipan Das         },
1269209b0ac1SSandipan Das         .cpuid = { .eax = 0x80000022, .reg = R_EAX, },
1270209b0ac1SSandipan Das         .tcg_features = 0,
1271209b0ac1SSandipan Das         .unmigratable_flags = 0,
1272209b0ac1SSandipan Das     },
1273fcf5ef2aSThomas Huth     [FEAT_XSAVE] = {
127407585923SRobert Hoo         .type = CPUID_FEATURE_WORD,
1275fcf5ef2aSThomas Huth         .feat_names = {
1276fcf5ef2aSThomas Huth             "xsaveopt", "xsavec", "xgetbv1", "xsaves",
1277f21a4817SJing Liu             "xfd", NULL, NULL, NULL,
1278fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1279fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1280fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1281fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1282fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1283fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1284fcf5ef2aSThomas Huth         },
128507585923SRobert Hoo         .cpuid = {
128607585923SRobert Hoo             .eax = 0xd,
128707585923SRobert Hoo             .needs_ecx = true, .ecx = 1,
128807585923SRobert Hoo             .reg = R_EAX,
128907585923SRobert Hoo         },
1290fcf5ef2aSThomas Huth         .tcg_features = TCG_XSAVE_FEATURES,
1291fcf5ef2aSThomas Huth     },
1292301e9067SYang Weijiang     [FEAT_XSAVE_XSS_LO] = {
1293301e9067SYang Weijiang         .type = CPUID_FEATURE_WORD,
1294301e9067SYang Weijiang         .feat_names = {
1295301e9067SYang Weijiang             NULL, NULL, NULL, NULL,
1296301e9067SYang Weijiang             NULL, NULL, NULL, NULL,
1297301e9067SYang Weijiang             NULL, NULL, NULL, NULL,
1298301e9067SYang Weijiang             NULL, NULL, NULL, NULL,
1299301e9067SYang Weijiang             NULL, NULL, NULL, NULL,
1300301e9067SYang Weijiang             NULL, NULL, NULL, NULL,
1301301e9067SYang Weijiang             NULL, NULL, NULL, NULL,
1302301e9067SYang Weijiang             NULL, NULL, NULL, NULL,
1303301e9067SYang Weijiang         },
1304301e9067SYang Weijiang         .cpuid = {
1305301e9067SYang Weijiang             .eax = 0xD,
1306301e9067SYang Weijiang             .needs_ecx = true,
1307301e9067SYang Weijiang             .ecx = 1,
1308301e9067SYang Weijiang             .reg = R_ECX,
1309301e9067SYang Weijiang         },
1310301e9067SYang Weijiang     },
1311301e9067SYang Weijiang     [FEAT_XSAVE_XSS_HI] = {
1312301e9067SYang Weijiang         .type = CPUID_FEATURE_WORD,
1313301e9067SYang Weijiang         .cpuid = {
1314301e9067SYang Weijiang             .eax = 0xD,
1315301e9067SYang Weijiang             .needs_ecx = true,
1316301e9067SYang Weijiang             .ecx = 1,
1317301e9067SYang Weijiang             .reg = R_EDX
1318301e9067SYang Weijiang         },
1319301e9067SYang Weijiang     },
1320fcf5ef2aSThomas Huth     [FEAT_6_EAX] = {
132107585923SRobert Hoo         .type = CPUID_FEATURE_WORD,
1322fcf5ef2aSThomas Huth         .feat_names = {
1323fcf5ef2aSThomas Huth             NULL, NULL, "arat", NULL,
1324fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1325fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1326fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1327fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1328fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1329fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1330fcf5ef2aSThomas Huth             NULL, NULL, NULL, NULL,
1331fcf5ef2aSThomas Huth         },
133207585923SRobert Hoo         .cpuid = { .eax = 6, .reg = R_EAX, },
1333fcf5ef2aSThomas Huth         .tcg_features = TCG_6_EAX_FEATURES,
1334fcf5ef2aSThomas Huth     },
1335301e9067SYang Weijiang     [FEAT_XSAVE_XCR0_LO] = {
133607585923SRobert Hoo         .type = CPUID_FEATURE_WORD,
133707585923SRobert Hoo         .cpuid = {
133807585923SRobert Hoo             .eax = 0xD,
133907585923SRobert Hoo             .needs_ecx = true, .ecx = 0,
134007585923SRobert Hoo             .reg = R_EAX,
134107585923SRobert Hoo         },
134233098002SPaolo Bonzini         .tcg_features = XSTATE_FP_MASK | XSTATE_SSE_MASK |
134333098002SPaolo Bonzini             XSTATE_YMM_MASK | XSTATE_BNDREGS_MASK | XSTATE_BNDCSR_MASK |
134433098002SPaolo Bonzini             XSTATE_PKRU_MASK,
1345fcf5ef2aSThomas Huth         .migratable_flags = XSTATE_FP_MASK | XSTATE_SSE_MASK |
1346fcf5ef2aSThomas Huth             XSTATE_YMM_MASK | XSTATE_BNDREGS_MASK | XSTATE_BNDCSR_MASK |
1347fcf5ef2aSThomas Huth             XSTATE_OPMASK_MASK | XSTATE_ZMM_Hi256_MASK | XSTATE_Hi16_ZMM_MASK |
1348fcf5ef2aSThomas Huth             XSTATE_PKRU_MASK,
1349fcf5ef2aSThomas Huth     },
1350301e9067SYang Weijiang     [FEAT_XSAVE_XCR0_HI] = {
135107585923SRobert Hoo         .type = CPUID_FEATURE_WORD,
135207585923SRobert Hoo         .cpuid = {
135307585923SRobert Hoo             .eax = 0xD,
135407585923SRobert Hoo             .needs_ecx = true, .ecx = 0,
135507585923SRobert Hoo             .reg = R_EDX,
135607585923SRobert Hoo         },
135733098002SPaolo Bonzini         .tcg_features = 0U,
1358fcf5ef2aSThomas Huth     },
1359d86f9636SRobert Hoo     /*Below are MSR exposed features*/
1360d86f9636SRobert Hoo     [FEAT_ARCH_CAPABILITIES] = {
1361d86f9636SRobert Hoo         .type = MSR_FEATURE_WORD,
1362d86f9636SRobert Hoo         .feat_names = {
1363d86f9636SRobert Hoo             "rdctl-no", "ibrs-all", "rsba", "skip-l1dfl-vmentry",
13642a9758c5SPaolo Bonzini             "ssb-no", "mds-no", "pschange-mc-no", "tsx-ctrl",
13657fac3863SPawan Gupta             "taa-no", NULL, NULL, NULL,
13665bef742cSPawan Gupta             NULL, "sbdr-ssdp-no", "fbsdp-no", "psdp-no",
136722e1094cSEmanuele Giuseppe Esposito             NULL, "fb-clear", NULL, NULL,
1368d86f9636SRobert Hoo             NULL, NULL, NULL, NULL,
136941bdd981SPawan Gupta             "pbrsb-no", NULL, "gds-no", "rfds-no",
137041bdd981SPawan Gupta             "rfds-clear", NULL, NULL, NULL,
1371d86f9636SRobert Hoo         },
1372d86f9636SRobert Hoo         .msr = {
1373d86f9636SRobert Hoo             .index = MSR_IA32_ARCH_CAPABILITIES,
1374d86f9636SRobert Hoo         },
13759fb4f5f5SPaolo Bonzini         /*
13769fb4f5f5SPaolo Bonzini          * FEAT_ARCH_CAPABILITIES only affects a read-only MSR, which
13779fb4f5f5SPaolo Bonzini          * cannot be read from user mode.  Therefore, it has no impact
13789fb4f5f5SPaolo Bonzini          > on any user-mode operation, and warnings about unsupported
13799fb4f5f5SPaolo Bonzini          * features do not matter.
13809fb4f5f5SPaolo Bonzini          */
13819fb4f5f5SPaolo Bonzini         .tcg_features = ~0U,
1382d86f9636SRobert Hoo     },
1383597360c0SXiaoyao Li     [FEAT_CORE_CAPABILITY] = {
1384597360c0SXiaoyao Li         .type = MSR_FEATURE_WORD,
1385597360c0SXiaoyao Li         .feat_names = {
1386597360c0SXiaoyao Li             NULL, NULL, NULL, NULL,
1387597360c0SXiaoyao Li             NULL, "split-lock-detect", NULL, NULL,
1388597360c0SXiaoyao Li             NULL, NULL, NULL, NULL,
1389597360c0SXiaoyao Li             NULL, NULL, NULL, NULL,
1390597360c0SXiaoyao Li             NULL, NULL, NULL, NULL,
1391597360c0SXiaoyao Li             NULL, NULL, NULL, NULL,
1392597360c0SXiaoyao Li             NULL, NULL, NULL, NULL,
1393597360c0SXiaoyao Li             NULL, NULL, NULL, NULL,
1394597360c0SXiaoyao Li         },
1395597360c0SXiaoyao Li         .msr = {
1396597360c0SXiaoyao Li             .index = MSR_IA32_CORE_CAPABILITY,
1397597360c0SXiaoyao Li         },
1398597360c0SXiaoyao Li     },
1399ea39f9b6SLike Xu     [FEAT_PERF_CAPABILITIES] = {
1400ea39f9b6SLike Xu         .type = MSR_FEATURE_WORD,
1401ea39f9b6SLike Xu         .feat_names = {
1402ea39f9b6SLike Xu             NULL, NULL, NULL, NULL,
1403ea39f9b6SLike Xu             NULL, NULL, NULL, NULL,
1404ea39f9b6SLike Xu             NULL, NULL, NULL, NULL,
1405ea39f9b6SLike Xu             NULL, "full-width-write", NULL, NULL,
1406ea39f9b6SLike Xu             NULL, NULL, NULL, NULL,
1407ea39f9b6SLike Xu             NULL, NULL, NULL, NULL,
1408ea39f9b6SLike Xu             NULL, NULL, NULL, NULL,
1409ea39f9b6SLike Xu             NULL, NULL, NULL, NULL,
1410ea39f9b6SLike Xu         },
1411ea39f9b6SLike Xu         .msr = {
1412ea39f9b6SLike Xu             .index = MSR_IA32_PERF_CAPABILITIES,
1413ea39f9b6SLike Xu         },
1414ea39f9b6SLike Xu     },
141520a78b02SPaolo Bonzini 
141620a78b02SPaolo Bonzini     [FEAT_VMX_PROCBASED_CTLS] = {
141720a78b02SPaolo Bonzini         .type = MSR_FEATURE_WORD,
141820a78b02SPaolo Bonzini         .feat_names = {
141920a78b02SPaolo Bonzini             NULL, NULL, "vmx-vintr-pending", "vmx-tsc-offset",
142020a78b02SPaolo Bonzini             NULL, NULL, NULL, "vmx-hlt-exit",
142120a78b02SPaolo Bonzini             NULL, "vmx-invlpg-exit", "vmx-mwait-exit", "vmx-rdpmc-exit",
142220a78b02SPaolo Bonzini             "vmx-rdtsc-exit", NULL, NULL, "vmx-cr3-load-noexit",
142320a78b02SPaolo Bonzini             "vmx-cr3-store-noexit", NULL, NULL, "vmx-cr8-load-exit",
142420a78b02SPaolo Bonzini             "vmx-cr8-store-exit", "vmx-flexpriority", "vmx-vnmi-pending", "vmx-movdr-exit",
142520a78b02SPaolo Bonzini             "vmx-io-exit", "vmx-io-bitmap", NULL, "vmx-mtf",
142620a78b02SPaolo Bonzini             "vmx-msr-bitmap", "vmx-monitor-exit", "vmx-pause-exit", "vmx-secondary-ctls",
142720a78b02SPaolo Bonzini         },
142820a78b02SPaolo Bonzini         .msr = {
142920a78b02SPaolo Bonzini             .index = MSR_IA32_VMX_TRUE_PROCBASED_CTLS,
143020a78b02SPaolo Bonzini         }
143120a78b02SPaolo Bonzini     },
143220a78b02SPaolo Bonzini 
143320a78b02SPaolo Bonzini     [FEAT_VMX_SECONDARY_CTLS] = {
143420a78b02SPaolo Bonzini         .type = MSR_FEATURE_WORD,
143520a78b02SPaolo Bonzini         .feat_names = {
143620a78b02SPaolo Bonzini             "vmx-apicv-xapic", "vmx-ept", "vmx-desc-exit", "vmx-rdtscp-exit",
143720a78b02SPaolo Bonzini             "vmx-apicv-x2apic", "vmx-vpid", "vmx-wbinvd-exit", "vmx-unrestricted-guest",
143820a78b02SPaolo Bonzini             "vmx-apicv-register", "vmx-apicv-vid", "vmx-ple", "vmx-rdrand-exit",
143920a78b02SPaolo Bonzini             "vmx-invpcid-exit", "vmx-vmfunc", "vmx-shadow-vmcs", "vmx-encls-exit",
144020a78b02SPaolo Bonzini             "vmx-rdseed-exit", "vmx-pml", NULL, NULL,
144120a78b02SPaolo Bonzini             "vmx-xsaves", NULL, NULL, NULL,
144233cc8826SAke Koomsin             NULL, "vmx-tsc-scaling", "vmx-enable-user-wait-pause", NULL,
144320a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
144420a78b02SPaolo Bonzini         },
144520a78b02SPaolo Bonzini         .msr = {
144620a78b02SPaolo Bonzini             .index = MSR_IA32_VMX_PROCBASED_CTLS2,
144720a78b02SPaolo Bonzini         }
144820a78b02SPaolo Bonzini     },
144920a78b02SPaolo Bonzini 
145020a78b02SPaolo Bonzini     [FEAT_VMX_PINBASED_CTLS] = {
145120a78b02SPaolo Bonzini         .type = MSR_FEATURE_WORD,
145220a78b02SPaolo Bonzini         .feat_names = {
145320a78b02SPaolo Bonzini             "vmx-intr-exit", NULL, NULL, "vmx-nmi-exit",
145420a78b02SPaolo Bonzini             NULL, "vmx-vnmi", "vmx-preemption-timer", "vmx-posted-intr",
145520a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
145620a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
145720a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
145820a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
145920a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
146020a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
146120a78b02SPaolo Bonzini         },
146220a78b02SPaolo Bonzini         .msr = {
146320a78b02SPaolo Bonzini             .index = MSR_IA32_VMX_TRUE_PINBASED_CTLS,
146420a78b02SPaolo Bonzini         }
146520a78b02SPaolo Bonzini     },
146620a78b02SPaolo Bonzini 
146720a78b02SPaolo Bonzini     [FEAT_VMX_EXIT_CTLS] = {
146820a78b02SPaolo Bonzini         .type = MSR_FEATURE_WORD,
146920a78b02SPaolo Bonzini         /*
147020a78b02SPaolo Bonzini          * VMX_VM_EXIT_HOST_ADDR_SPACE_SIZE is copied from
147120a78b02SPaolo Bonzini          * the LM CPUID bit.
147220a78b02SPaolo Bonzini          */
147320a78b02SPaolo Bonzini         .feat_names = {
147420a78b02SPaolo Bonzini             NULL, NULL, "vmx-exit-nosave-debugctl", NULL,
147520a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
147620a78b02SPaolo Bonzini             NULL, NULL /* vmx-exit-host-addr-space-size */, NULL, NULL,
147720a78b02SPaolo Bonzini             "vmx-exit-load-perf-global-ctrl", NULL, NULL, "vmx-exit-ack-intr",
147820a78b02SPaolo Bonzini             NULL, NULL, "vmx-exit-save-pat", "vmx-exit-load-pat",
147920a78b02SPaolo Bonzini             "vmx-exit-save-efer", "vmx-exit-load-efer",
148020a78b02SPaolo Bonzini                 "vmx-exit-save-preemption-timer", "vmx-exit-clear-bndcfgs",
148120a78b02SPaolo Bonzini             NULL, "vmx-exit-clear-rtit-ctl", NULL, NULL,
14827c6ec5bcSXin Li (Intel)             NULL, "vmx-exit-load-pkrs", NULL, "vmx-exit-secondary-ctls",
148320a78b02SPaolo Bonzini         },
148420a78b02SPaolo Bonzini         .msr = {
148520a78b02SPaolo Bonzini             .index = MSR_IA32_VMX_TRUE_EXIT_CTLS,
148620a78b02SPaolo Bonzini         }
148720a78b02SPaolo Bonzini     },
148820a78b02SPaolo Bonzini 
148920a78b02SPaolo Bonzini     [FEAT_VMX_ENTRY_CTLS] = {
149020a78b02SPaolo Bonzini         .type = MSR_FEATURE_WORD,
149120a78b02SPaolo Bonzini         .feat_names = {
149220a78b02SPaolo Bonzini             NULL, NULL, "vmx-entry-noload-debugctl", NULL,
149320a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
149420a78b02SPaolo Bonzini             NULL, "vmx-entry-ia32e-mode", NULL, NULL,
149520a78b02SPaolo Bonzini             NULL, "vmx-entry-load-perf-global-ctrl", "vmx-entry-load-pat", "vmx-entry-load-efer",
149620a78b02SPaolo Bonzini             "vmx-entry-load-bndcfgs", NULL, "vmx-entry-load-rtit-ctl", NULL,
14977c6ec5bcSXin Li (Intel)             NULL, NULL, "vmx-entry-load-pkrs", "vmx-entry-load-fred",
149820a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
149920a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
150020a78b02SPaolo Bonzini         },
150120a78b02SPaolo Bonzini         .msr = {
150220a78b02SPaolo Bonzini             .index = MSR_IA32_VMX_TRUE_ENTRY_CTLS,
150320a78b02SPaolo Bonzini         }
150420a78b02SPaolo Bonzini     },
150520a78b02SPaolo Bonzini 
150620a78b02SPaolo Bonzini     [FEAT_VMX_MISC] = {
150720a78b02SPaolo Bonzini         .type = MSR_FEATURE_WORD,
150820a78b02SPaolo Bonzini         .feat_names = {
150920a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
151020a78b02SPaolo Bonzini             NULL, "vmx-store-lma", "vmx-activity-hlt", "vmx-activity-shutdown",
151120a78b02SPaolo Bonzini             "vmx-activity-wait-sipi", NULL, NULL, NULL,
151220a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
151320a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
151420a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
151520a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
151620a78b02SPaolo Bonzini             NULL, "vmx-vmwrite-vmexit-fields", "vmx-zero-len-inject", NULL,
151720a78b02SPaolo Bonzini         },
151820a78b02SPaolo Bonzini         .msr = {
151920a78b02SPaolo Bonzini             .index = MSR_IA32_VMX_MISC,
152020a78b02SPaolo Bonzini         }
152120a78b02SPaolo Bonzini     },
152220a78b02SPaolo Bonzini 
152320a78b02SPaolo Bonzini     [FEAT_VMX_EPT_VPID_CAPS] = {
152420a78b02SPaolo Bonzini         .type = MSR_FEATURE_WORD,
152520a78b02SPaolo Bonzini         .feat_names = {
152620a78b02SPaolo Bonzini             "vmx-ept-execonly", NULL, NULL, NULL,
152720a78b02SPaolo Bonzini             NULL, NULL, "vmx-page-walk-4", "vmx-page-walk-5",
152820a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
152920a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
153020a78b02SPaolo Bonzini             "vmx-ept-2mb", "vmx-ept-1gb", NULL, NULL,
153120a78b02SPaolo Bonzini             "vmx-invept", "vmx-eptad", "vmx-ept-advanced-exitinfo", NULL,
153220a78b02SPaolo Bonzini             NULL, "vmx-invept-single-context", "vmx-invept-all-context", NULL,
153320a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
153420a78b02SPaolo Bonzini             "vmx-invvpid", NULL, NULL, NULL,
153520a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
153620a78b02SPaolo Bonzini             "vmx-invvpid-single-addr", "vmx-invept-single-context",
153720a78b02SPaolo Bonzini                 "vmx-invvpid-all-context", "vmx-invept-single-context-noglobals",
153820a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
153920a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
154020a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
154120a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
154220a78b02SPaolo Bonzini             NULL, NULL, NULL, NULL,
154320a78b02SPaolo Bonzini         },
154420a78b02SPaolo Bonzini         .msr = {
154520a78b02SPaolo Bonzini             .index = MSR_IA32_VMX_EPT_VPID_CAP,
154620a78b02SPaolo Bonzini         }
154720a78b02SPaolo Bonzini     },
154820a78b02SPaolo Bonzini 
154920a78b02SPaolo Bonzini     [FEAT_VMX_BASIC] = {
155020a78b02SPaolo Bonzini         .type = MSR_FEATURE_WORD,
155120a78b02SPaolo Bonzini         .feat_names = {
155220a78b02SPaolo Bonzini             [54] = "vmx-ins-outs",
155320a78b02SPaolo Bonzini             [55] = "vmx-true-ctls",
15540c49c918SPaolo Bonzini             [56] = "vmx-any-errcode",
1555ef202d64SXin Li             [58] = "vmx-nested-exception",
155620a78b02SPaolo Bonzini         },
155720a78b02SPaolo Bonzini         .msr = {
155820a78b02SPaolo Bonzini             .index = MSR_IA32_VMX_BASIC,
155920a78b02SPaolo Bonzini         },
156020a78b02SPaolo Bonzini         /* Just to be safe - we don't support setting the MSEG version field.  */
156120a78b02SPaolo Bonzini         .no_autoenable_flags = MSR_VMX_BASIC_DUAL_MONITOR,
156220a78b02SPaolo Bonzini     },
156320a78b02SPaolo Bonzini 
156420a78b02SPaolo Bonzini     [FEAT_VMX_VMFUNC] = {
156520a78b02SPaolo Bonzini         .type = MSR_FEATURE_WORD,
156620a78b02SPaolo Bonzini         .feat_names = {
156720a78b02SPaolo Bonzini             [0] = "vmx-eptp-switching",
156820a78b02SPaolo Bonzini         },
156920a78b02SPaolo Bonzini         .msr = {
157020a78b02SPaolo Bonzini             .index = MSR_IA32_VMX_VMFUNC,
157120a78b02SPaolo Bonzini         }
157220a78b02SPaolo Bonzini     },
157320a78b02SPaolo Bonzini 
1574d1615ea5SLuwei Kang     [FEAT_14_0_ECX] = {
1575d1615ea5SLuwei Kang         .type = CPUID_FEATURE_WORD,
1576d1615ea5SLuwei Kang         .feat_names = {
1577d1615ea5SLuwei Kang             NULL, NULL, NULL, NULL,
1578d1615ea5SLuwei Kang             NULL, NULL, NULL, NULL,
1579d1615ea5SLuwei Kang             NULL, NULL, NULL, NULL,
1580d1615ea5SLuwei Kang             NULL, NULL, NULL, NULL,
1581d1615ea5SLuwei Kang             NULL, NULL, NULL, NULL,
1582d1615ea5SLuwei Kang             NULL, NULL, NULL, NULL,
1583d1615ea5SLuwei Kang             NULL, NULL, NULL, NULL,
1584d1615ea5SLuwei Kang             NULL, NULL, NULL, "intel-pt-lip",
1585d1615ea5SLuwei Kang         },
1586d1615ea5SLuwei Kang         .cpuid = {
1587d1615ea5SLuwei Kang             .eax = 0x14,
1588d1615ea5SLuwei Kang             .needs_ecx = true, .ecx = 0,
1589d1615ea5SLuwei Kang             .reg = R_ECX,
1590d1615ea5SLuwei Kang         },
1591d1615ea5SLuwei Kang         .tcg_features = TCG_14_0_ECX_FEATURES,
1592d1615ea5SLuwei Kang      },
1593d1615ea5SLuwei Kang 
15944b841a79SSean Christopherson     [FEAT_SGX_12_0_EAX] = {
15954b841a79SSean Christopherson         .type = CPUID_FEATURE_WORD,
15964b841a79SSean Christopherson         .feat_names = {
15974b841a79SSean Christopherson             "sgx1", "sgx2", NULL, NULL,
15984b841a79SSean Christopherson             NULL, NULL, NULL, NULL,
1599d45f24feSKai Huang             NULL, NULL, NULL, "sgx-edeccssa",
16004b841a79SSean Christopherson             NULL, NULL, NULL, NULL,
16014b841a79SSean Christopherson             NULL, NULL, NULL, NULL,
16024b841a79SSean Christopherson             NULL, NULL, NULL, NULL,
16034b841a79SSean Christopherson             NULL, NULL, NULL, NULL,
16044b841a79SSean Christopherson             NULL, NULL, NULL, NULL,
16054b841a79SSean Christopherson         },
16064b841a79SSean Christopherson         .cpuid = {
16074b841a79SSean Christopherson             .eax = 0x12,
16084b841a79SSean Christopherson             .needs_ecx = true, .ecx = 0,
16094b841a79SSean Christopherson             .reg = R_EAX,
16104b841a79SSean Christopherson         },
16114b841a79SSean Christopherson         .tcg_features = TCG_SGX_12_0_EAX_FEATURES,
16124b841a79SSean Christopherson     },
1613120ca112SSean Christopherson 
1614120ca112SSean Christopherson     [FEAT_SGX_12_0_EBX] = {
1615120ca112SSean Christopherson         .type = CPUID_FEATURE_WORD,
1616120ca112SSean Christopherson         .feat_names = {
1617120ca112SSean Christopherson             "sgx-exinfo" , NULL, NULL, NULL,
1618120ca112SSean Christopherson             NULL, NULL, NULL, NULL,
1619120ca112SSean Christopherson             NULL, NULL, NULL, NULL,
1620120ca112SSean Christopherson             NULL, NULL, NULL, NULL,
1621120ca112SSean Christopherson             NULL, NULL, NULL, NULL,
1622120ca112SSean Christopherson             NULL, NULL, NULL, NULL,
1623120ca112SSean Christopherson             NULL, NULL, NULL, NULL,
1624120ca112SSean Christopherson             NULL, NULL, NULL, NULL,
1625120ca112SSean Christopherson         },
1626120ca112SSean Christopherson         .cpuid = {
1627120ca112SSean Christopherson             .eax = 0x12,
1628120ca112SSean Christopherson             .needs_ecx = true, .ecx = 0,
1629120ca112SSean Christopherson             .reg = R_EBX,
1630120ca112SSean Christopherson         },
1631120ca112SSean Christopherson         .tcg_features = TCG_SGX_12_0_EBX_FEATURES,
1632120ca112SSean Christopherson     },
1633165981a5SSean Christopherson 
1634165981a5SSean Christopherson     [FEAT_SGX_12_1_EAX] = {
1635165981a5SSean Christopherson         .type = CPUID_FEATURE_WORD,
1636165981a5SSean Christopherson         .feat_names = {
1637165981a5SSean Christopherson             NULL, "sgx-debug", "sgx-mode64", NULL,
1638165981a5SSean Christopherson             "sgx-provisionkey", "sgx-tokenkey", NULL, "sgx-kss",
1639d45f24feSKai Huang             NULL, NULL, "sgx-aex-notify", NULL,
1640165981a5SSean Christopherson             NULL, NULL, NULL, NULL,
1641165981a5SSean Christopherson             NULL, NULL, NULL, NULL,
1642165981a5SSean Christopherson             NULL, NULL, NULL, NULL,
1643165981a5SSean Christopherson             NULL, NULL, NULL, NULL,
1644165981a5SSean Christopherson             NULL, NULL, NULL, NULL,
1645165981a5SSean Christopherson         },
1646165981a5SSean Christopherson         .cpuid = {
1647165981a5SSean Christopherson             .eax = 0x12,
1648165981a5SSean Christopherson             .needs_ecx = true, .ecx = 1,
1649165981a5SSean Christopherson             .reg = R_EAX,
1650165981a5SSean Christopherson         },
1651165981a5SSean Christopherson         .tcg_features = TCG_SGX_12_1_EAX_FEATURES,
1652165981a5SSean Christopherson     },
165399e24dbdSPaolo Bonzini };
165499e24dbdSPaolo Bonzini 
165599e24dbdSPaolo Bonzini typedef struct FeatureMask {
165699e24dbdSPaolo Bonzini     FeatureWord index;
1657ede146c2SPaolo Bonzini     uint64_t mask;
165899e24dbdSPaolo Bonzini } FeatureMask;
165999e24dbdSPaolo Bonzini 
166099e24dbdSPaolo Bonzini typedef struct FeatureDep {
166199e24dbdSPaolo Bonzini     FeatureMask from, to;
166299e24dbdSPaolo Bonzini } FeatureDep;
166399e24dbdSPaolo Bonzini 
166499e24dbdSPaolo Bonzini static FeatureDep feature_dependencies[] = {
166599e24dbdSPaolo Bonzini     {
166699e24dbdSPaolo Bonzini         .from = { FEAT_7_0_EDX,             CPUID_7_0_EDX_ARCH_CAPABILITIES },
1667ede146c2SPaolo Bonzini         .to = { FEAT_ARCH_CAPABILITIES,     ~0ull },
166899e24dbdSPaolo Bonzini     },
166999e24dbdSPaolo Bonzini     {
167099e24dbdSPaolo Bonzini         .from = { FEAT_7_0_EDX,             CPUID_7_0_EDX_CORE_CAPABILITY },
1671ede146c2SPaolo Bonzini         .to = { FEAT_CORE_CAPABILITY,       ~0ull },
1672597360c0SXiaoyao Li     },
167320a78b02SPaolo Bonzini     {
1674ea39f9b6SLike Xu         .from = { FEAT_1_ECX,             CPUID_EXT_PDCM },
1675ea39f9b6SLike Xu         .to = { FEAT_PERF_CAPABILITIES,       ~0ull },
1676ea39f9b6SLike Xu     },
1677ea39f9b6SLike Xu     {
167820a78b02SPaolo Bonzini         .from = { FEAT_1_ECX,               CPUID_EXT_VMX },
167920a78b02SPaolo Bonzini         .to = { FEAT_VMX_PROCBASED_CTLS,    ~0ull },
168020a78b02SPaolo Bonzini     },
168120a78b02SPaolo Bonzini     {
168220a78b02SPaolo Bonzini         .from = { FEAT_1_ECX,               CPUID_EXT_VMX },
168320a78b02SPaolo Bonzini         .to = { FEAT_VMX_PINBASED_CTLS,     ~0ull },
168420a78b02SPaolo Bonzini     },
168520a78b02SPaolo Bonzini     {
168620a78b02SPaolo Bonzini         .from = { FEAT_1_ECX,               CPUID_EXT_VMX },
168720a78b02SPaolo Bonzini         .to = { FEAT_VMX_EXIT_CTLS,         ~0ull },
168820a78b02SPaolo Bonzini     },
168920a78b02SPaolo Bonzini     {
169020a78b02SPaolo Bonzini         .from = { FEAT_1_ECX,               CPUID_EXT_VMX },
169120a78b02SPaolo Bonzini         .to = { FEAT_VMX_ENTRY_CTLS,        ~0ull },
169220a78b02SPaolo Bonzini     },
169320a78b02SPaolo Bonzini     {
169420a78b02SPaolo Bonzini         .from = { FEAT_1_ECX,               CPUID_EXT_VMX },
169520a78b02SPaolo Bonzini         .to = { FEAT_VMX_MISC,              ~0ull },
169620a78b02SPaolo Bonzini     },
169720a78b02SPaolo Bonzini     {
169820a78b02SPaolo Bonzini         .from = { FEAT_1_ECX,               CPUID_EXT_VMX },
169920a78b02SPaolo Bonzini         .to = { FEAT_VMX_BASIC,             ~0ull },
170020a78b02SPaolo Bonzini     },
170120a78b02SPaolo Bonzini     {
170220a78b02SPaolo Bonzini         .from = { FEAT_8000_0001_EDX,       CPUID_EXT2_LM },
170320a78b02SPaolo Bonzini         .to = { FEAT_VMX_ENTRY_CTLS,        VMX_VM_ENTRY_IA32E_MODE },
170420a78b02SPaolo Bonzini     },
170520a78b02SPaolo Bonzini     {
170620a78b02SPaolo Bonzini         .from = { FEAT_VMX_PROCBASED_CTLS,  VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS },
170720a78b02SPaolo Bonzini         .to = { FEAT_VMX_SECONDARY_CTLS,    ~0ull },
170820a78b02SPaolo Bonzini     },
170920a78b02SPaolo Bonzini     {
171020a78b02SPaolo Bonzini         .from = { FEAT_XSAVE,               CPUID_XSAVE_XSAVES },
171120a78b02SPaolo Bonzini         .to = { FEAT_VMX_SECONDARY_CTLS,    VMX_SECONDARY_EXEC_XSAVES },
171220a78b02SPaolo Bonzini     },
171320a78b02SPaolo Bonzini     {
171420a78b02SPaolo Bonzini         .from = { FEAT_1_ECX,               CPUID_EXT_RDRAND },
171520a78b02SPaolo Bonzini         .to = { FEAT_VMX_SECONDARY_CTLS,    VMX_SECONDARY_EXEC_RDRAND_EXITING },
171620a78b02SPaolo Bonzini     },
171720a78b02SPaolo Bonzini     {
171820a78b02SPaolo Bonzini         .from = { FEAT_7_0_EBX,             CPUID_7_0_EBX_INVPCID },
171920a78b02SPaolo Bonzini         .to = { FEAT_VMX_SECONDARY_CTLS,    VMX_SECONDARY_EXEC_ENABLE_INVPCID },
172020a78b02SPaolo Bonzini     },
172120a78b02SPaolo Bonzini     {
1722267b5e7eSMaciej S. Szmigiero         .from = { FEAT_7_0_EBX,             CPUID_7_0_EBX_MPX },
1723267b5e7eSMaciej S. Szmigiero         .to = { FEAT_VMX_EXIT_CTLS,         VMX_VM_EXIT_CLEAR_BNDCFGS },
1724267b5e7eSMaciej S. Szmigiero     },
1725267b5e7eSMaciej S. Szmigiero     {
1726267b5e7eSMaciej S. Szmigiero         .from = { FEAT_7_0_EBX,             CPUID_7_0_EBX_MPX },
1727267b5e7eSMaciej S. Szmigiero         .to = { FEAT_VMX_ENTRY_CTLS,        VMX_VM_ENTRY_LOAD_BNDCFGS },
1728267b5e7eSMaciej S. Szmigiero     },
1729267b5e7eSMaciej S. Szmigiero     {
173020a78b02SPaolo Bonzini         .from = { FEAT_7_0_EBX,             CPUID_7_0_EBX_RDSEED },
173120a78b02SPaolo Bonzini         .to = { FEAT_VMX_SECONDARY_CTLS,    VMX_SECONDARY_EXEC_RDSEED_EXITING },
173220a78b02SPaolo Bonzini     },
173320a78b02SPaolo Bonzini     {
1734d1615ea5SLuwei Kang         .from = { FEAT_7_0_EBX,             CPUID_7_0_EBX_INTEL_PT },
1735d1615ea5SLuwei Kang         .to = { FEAT_14_0_ECX,              ~0ull },
1736d1615ea5SLuwei Kang     },
1737d1615ea5SLuwei Kang     {
173820a78b02SPaolo Bonzini         .from = { FEAT_8000_0001_EDX,       CPUID_EXT2_RDTSCP },
173920a78b02SPaolo Bonzini         .to = { FEAT_VMX_SECONDARY_CTLS,    VMX_SECONDARY_EXEC_RDTSCP },
174020a78b02SPaolo Bonzini     },
174120a78b02SPaolo Bonzini     {
174220a78b02SPaolo Bonzini         .from = { FEAT_VMX_SECONDARY_CTLS,  VMX_SECONDARY_EXEC_ENABLE_EPT },
174320a78b02SPaolo Bonzini         .to = { FEAT_VMX_EPT_VPID_CAPS,     0xffffffffull },
174420a78b02SPaolo Bonzini     },
174520a78b02SPaolo Bonzini     {
174620a78b02SPaolo Bonzini         .from = { FEAT_VMX_SECONDARY_CTLS,  VMX_SECONDARY_EXEC_ENABLE_EPT },
174720a78b02SPaolo Bonzini         .to = { FEAT_VMX_SECONDARY_CTLS,    VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST },
174820a78b02SPaolo Bonzini     },
174920a78b02SPaolo Bonzini     {
175020a78b02SPaolo Bonzini         .from = { FEAT_VMX_SECONDARY_CTLS,  VMX_SECONDARY_EXEC_ENABLE_VPID },
175120a78b02SPaolo Bonzini         .to = { FEAT_VMX_EPT_VPID_CAPS,     0xffffffffull << 32 },
175220a78b02SPaolo Bonzini     },
175320a78b02SPaolo Bonzini     {
175420a78b02SPaolo Bonzini         .from = { FEAT_VMX_SECONDARY_CTLS,  VMX_SECONDARY_EXEC_ENABLE_VMFUNC },
175520a78b02SPaolo Bonzini         .to = { FEAT_VMX_VMFUNC,            ~0ull },
175620a78b02SPaolo Bonzini     },
1757730319aeSEduardo Habkost     {
1758730319aeSEduardo Habkost         .from = { FEAT_8000_0001_ECX,       CPUID_EXT3_SVM },
1759730319aeSEduardo Habkost         .to = { FEAT_SVM,                   ~0ull },
1760730319aeSEduardo Habkost     },
176133cc8826SAke Koomsin     {
1762fe01af5dSPaolo Bonzini         .from = { FEAT_7_0_ECX,             CPUID_7_0_ECX_WAITPKG },
1763fe01af5dSPaolo Bonzini         .to = { FEAT_VMX_SECONDARY_CTLS,    VMX_SECONDARY_EXEC_ENABLE_USER_WAIT_PAUSE },
176433cc8826SAke Koomsin     },
1765c1acad9fSXin Li     {
1766c1acad9fSXin Li         .from = { FEAT_8000_0001_EDX,       CPUID_EXT2_LM },
1767c1acad9fSXin Li         .to = { FEAT_7_1_EAX,               CPUID_7_1_EAX_FRED },
1768c1acad9fSXin Li     },
1769c1acad9fSXin Li     {
1770c1acad9fSXin Li         .from = { FEAT_7_1_EAX,             CPUID_7_1_EAX_LKGS },
1771c1acad9fSXin Li         .to = { FEAT_7_1_EAX,               CPUID_7_1_EAX_FRED },
1772c1acad9fSXin Li     },
1773c1acad9fSXin Li     {
1774c1acad9fSXin Li         .from = { FEAT_7_1_EAX,             CPUID_7_1_EAX_WRMSRNS },
1775c1acad9fSXin Li         .to = { FEAT_7_1_EAX,               CPUID_7_1_EAX_FRED },
1776c1acad9fSXin Li     },
17774912d699SZhao Liu     {
17784912d699SZhao Liu         .from = { FEAT_7_0_EBX,             CPUID_7_0_EBX_SGX },
17794912d699SZhao Liu         .to = { FEAT_7_0_ECX,               CPUID_7_0_ECX_SGX_LC },
17804912d699SZhao Liu     },
17813722a989SZhao Liu     {
17823722a989SZhao Liu         .from = { FEAT_7_0_EBX,             CPUID_7_0_EBX_SGX },
17833722a989SZhao Liu         .to = { FEAT_SGX_12_0_EAX,          ~0ull },
17843722a989SZhao Liu     },
17853722a989SZhao Liu     {
17863722a989SZhao Liu         .from = { FEAT_7_0_EBX,             CPUID_7_0_EBX_SGX },
17873722a989SZhao Liu         .to = { FEAT_SGX_12_0_EBX,          ~0ull },
17883722a989SZhao Liu     },
17893722a989SZhao Liu     {
17903722a989SZhao Liu         .from = { FEAT_7_0_EBX,             CPUID_7_0_EBX_SGX },
17913722a989SZhao Liu         .to = { FEAT_SGX_12_1_EAX,          ~0ull },
17923722a989SZhao Liu     },
1793150ab84bSTao Su     {
1794150ab84bSTao Su         .from = { FEAT_24_0_EBX,            CPUID_24_0_EBX_AVX10_128 },
1795150ab84bSTao Su         .to = { FEAT_24_0_EBX,              CPUID_24_0_EBX_AVX10_256 },
1796150ab84bSTao Su     },
1797150ab84bSTao Su     {
1798150ab84bSTao Su         .from = { FEAT_24_0_EBX,            CPUID_24_0_EBX_AVX10_256 },
1799150ab84bSTao Su         .to = { FEAT_24_0_EBX,              CPUID_24_0_EBX_AVX10_512 },
1800150ab84bSTao Su     },
1801150ab84bSTao Su     {
1802150ab84bSTao Su         .from = { FEAT_24_0_EBX,            CPUID_24_0_EBX_AVX10_VL_MASK },
1803150ab84bSTao Su         .to = { FEAT_7_1_EDX,               CPUID_7_1_EDX_AVX10 },
1804150ab84bSTao Su     },
1805150ab84bSTao Su     {
1806150ab84bSTao Su         .from = { FEAT_7_1_EDX,             CPUID_7_1_EDX_AVX10 },
1807150ab84bSTao Su         .to = { FEAT_24_0_EBX,              ~0ull },
1808150ab84bSTao Su     },
1809fcf5ef2aSThomas Huth };
1810fcf5ef2aSThomas Huth 
1811fcf5ef2aSThomas Huth typedef struct X86RegisterInfo32 {
1812fcf5ef2aSThomas Huth     /* Name of register */
1813fcf5ef2aSThomas Huth     const char *name;
1814fcf5ef2aSThomas Huth     /* QAPI enum value register */
1815fcf5ef2aSThomas Huth     X86CPURegister32 qapi_enum;
1816fcf5ef2aSThomas Huth } X86RegisterInfo32;
1817fcf5ef2aSThomas Huth 
1818fcf5ef2aSThomas Huth #define REGISTER(reg) \
1819fcf5ef2aSThomas Huth     [R_##reg] = { .name = #reg, .qapi_enum = X86_CPU_REGISTER32_##reg }
1820fcf5ef2aSThomas Huth static const X86RegisterInfo32 x86_reg_info_32[CPU_NB_REGS32] = {
1821fcf5ef2aSThomas Huth     REGISTER(EAX),
1822fcf5ef2aSThomas Huth     REGISTER(ECX),
1823fcf5ef2aSThomas Huth     REGISTER(EDX),
1824fcf5ef2aSThomas Huth     REGISTER(EBX),
1825fcf5ef2aSThomas Huth     REGISTER(ESP),
1826fcf5ef2aSThomas Huth     REGISTER(EBP),
1827fcf5ef2aSThomas Huth     REGISTER(ESI),
1828fcf5ef2aSThomas Huth     REGISTER(EDI),
1829fcf5ef2aSThomas Huth };
1830fcf5ef2aSThomas Huth #undef REGISTER
1831fcf5ef2aSThomas Huth 
1832301e9067SYang Weijiang /* CPUID feature bits available in XSS */
183310f0abcbSYang Weijiang #define CPUID_XSTATE_XSS_MASK    (XSTATE_ARCH_LBR_MASK)
1834301e9067SYang Weijiang 
1835fea45008SDavid Edmondson ExtSaveArea x86_ext_save_areas[XSAVE_STATE_AREA_COUNT] = {
1836fcf5ef2aSThomas Huth     [XSTATE_FP_BIT] = {
1837fcf5ef2aSThomas Huth         /* x87 FP state component is always enabled if XSAVE is supported */
1838fcf5ef2aSThomas Huth         .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
1839fcf5ef2aSThomas Huth         .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1840fcf5ef2aSThomas Huth     },
1841fcf5ef2aSThomas Huth     [XSTATE_SSE_BIT] = {
1842fcf5ef2aSThomas Huth         /* SSE state component is always enabled if XSAVE is supported */
1843fcf5ef2aSThomas Huth         .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
1844fcf5ef2aSThomas Huth         .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1845fcf5ef2aSThomas Huth     },
1846fcf5ef2aSThomas Huth     [XSTATE_YMM_BIT] =
1847fcf5ef2aSThomas Huth           { .feature = FEAT_1_ECX, .bits = CPUID_EXT_AVX,
1848fcf5ef2aSThomas Huth             .size = sizeof(XSaveAVX) },
1849fcf5ef2aSThomas Huth     [XSTATE_BNDREGS_BIT] =
1850fcf5ef2aSThomas Huth           { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
1851fcf5ef2aSThomas Huth             .size = sizeof(XSaveBNDREG)  },
1852fcf5ef2aSThomas Huth     [XSTATE_BNDCSR_BIT] =
1853fcf5ef2aSThomas Huth           { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
1854fcf5ef2aSThomas Huth             .size = sizeof(XSaveBNDCSR)  },
1855fcf5ef2aSThomas Huth     [XSTATE_OPMASK_BIT] =
1856fcf5ef2aSThomas Huth           { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1857fcf5ef2aSThomas Huth             .size = sizeof(XSaveOpmask) },
1858fcf5ef2aSThomas Huth     [XSTATE_ZMM_Hi256_BIT] =
1859fcf5ef2aSThomas Huth           { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1860fcf5ef2aSThomas Huth             .size = sizeof(XSaveZMM_Hi256) },
1861fcf5ef2aSThomas Huth     [XSTATE_Hi16_ZMM_BIT] =
1862fcf5ef2aSThomas Huth           { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
1863fcf5ef2aSThomas Huth             .size = sizeof(XSaveHi16_ZMM) },
1864fcf5ef2aSThomas Huth     [XSTATE_PKRU_BIT] =
1865fcf5ef2aSThomas Huth           { .feature = FEAT_7_0_ECX, .bits = CPUID_7_0_ECX_PKU,
1866fcf5ef2aSThomas Huth             .size = sizeof(XSavePKRU) },
186710f0abcbSYang Weijiang     [XSTATE_ARCH_LBR_BIT] = {
186810f0abcbSYang Weijiang             .feature = FEAT_7_0_EDX, .bits = CPUID_7_0_EDX_ARCH_LBR,
186910f0abcbSYang Weijiang             .offset = 0 /*supervisor mode component, offset = 0 */,
187010f0abcbSYang Weijiang             .size = sizeof(XSavesArchLBR) },
18711f16764fSJing Liu     [XSTATE_XTILE_CFG_BIT] = {
18721f16764fSJing Liu         .feature = FEAT_7_0_EDX, .bits = CPUID_7_0_EDX_AMX_TILE,
18731f16764fSJing Liu         .size = sizeof(XSaveXTILECFG),
18741f16764fSJing Liu     },
18751f16764fSJing Liu     [XSTATE_XTILE_DATA_BIT] = {
18761f16764fSJing Liu         .feature = FEAT_7_0_EDX, .bits = CPUID_7_0_EDX_AMX_TILE,
18771f16764fSJing Liu         .size = sizeof(XSaveXTILEDATA)
18781f16764fSJing Liu     },
1879fcf5ef2aSThomas Huth };
1880fcf5ef2aSThomas Huth 
xsave_area_size(uint64_t mask,bool compacted)18815d245678SPaolo Bonzini uint32_t xsave_area_size(uint64_t mask, bool compacted)
1882fcf5ef2aSThomas Huth {
1883301e9067SYang Weijiang     uint64_t ret = x86_ext_save_areas[0].size;
1884301e9067SYang Weijiang     const ExtSaveArea *esa;
1885301e9067SYang Weijiang     uint32_t offset = 0;
1886fcf5ef2aSThomas Huth     int i;
1887fcf5ef2aSThomas Huth 
1888301e9067SYang Weijiang     for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
1889301e9067SYang Weijiang         esa = &x86_ext_save_areas[i];
1890fcf5ef2aSThomas Huth         if ((mask >> i) & 1) {
1891301e9067SYang Weijiang             offset = compacted ? ret : esa->offset;
1892301e9067SYang Weijiang             ret = MAX(ret, offset + esa->size);
1893fcf5ef2aSThomas Huth         }
1894fcf5ef2aSThomas Huth     }
1895fcf5ef2aSThomas Huth     return ret;
1896fcf5ef2aSThomas Huth }
1897fcf5ef2aSThomas Huth 
accel_uses_host_cpuid(void)1898d6dcc558SSergio Andres Gomez Del Real static inline bool accel_uses_host_cpuid(void)
1899d6dcc558SSergio Andres Gomez Del Real {
1900d6dcc558SSergio Andres Gomez Del Real     return kvm_enabled() || hvf_enabled();
1901d6dcc558SSergio Andres Gomez Del Real }
1902d6dcc558SSergio Andres Gomez Del Real 
x86_cpu_xsave_xcr0_components(X86CPU * cpu)1903301e9067SYang Weijiang static inline uint64_t x86_cpu_xsave_xcr0_components(X86CPU *cpu)
1904fcf5ef2aSThomas Huth {
1905301e9067SYang Weijiang     return ((uint64_t)cpu->env.features[FEAT_XSAVE_XCR0_HI]) << 32 |
1906301e9067SYang Weijiang            cpu->env.features[FEAT_XSAVE_XCR0_LO];
1907fcf5ef2aSThomas Huth }
1908fcf5ef2aSThomas Huth 
1909ed69e831SClaudio Fontana /* Return name of 32-bit register, from a R_* constant */
get_register_name_32(unsigned int reg)1910ed69e831SClaudio Fontana static const char *get_register_name_32(unsigned int reg)
1911fcf5ef2aSThomas Huth {
1912fcf5ef2aSThomas Huth     if (reg >= CPU_NB_REGS32) {
1913fcf5ef2aSThomas Huth         return NULL;
1914fcf5ef2aSThomas Huth     }
1915fcf5ef2aSThomas Huth     return x86_reg_info_32[reg].name;
1916fcf5ef2aSThomas Huth }
1917fcf5ef2aSThomas Huth 
x86_cpu_xsave_xss_components(X86CPU * cpu)1918301e9067SYang Weijiang static inline uint64_t x86_cpu_xsave_xss_components(X86CPU *cpu)
1919301e9067SYang Weijiang {
1920301e9067SYang Weijiang     return ((uint64_t)cpu->env.features[FEAT_XSAVE_XSS_HI]) << 32 |
1921301e9067SYang Weijiang            cpu->env.features[FEAT_XSAVE_XSS_LO];
1922301e9067SYang Weijiang }
1923301e9067SYang Weijiang 
1924fcf5ef2aSThomas Huth /*
1925fcf5ef2aSThomas Huth  * Returns the set of feature flags that are supported and migratable by
1926fcf5ef2aSThomas Huth  * QEMU, for a given FeatureWord.
1927fcf5ef2aSThomas Huth  */
x86_cpu_get_migratable_flags(X86CPU * cpu,FeatureWord w)192887c88db3SXiaoyao Li static uint64_t x86_cpu_get_migratable_flags(X86CPU *cpu, FeatureWord w)
1929fcf5ef2aSThomas Huth {
1930fcf5ef2aSThomas Huth     FeatureWordInfo *wi = &feature_word_info[w];
193187c88db3SXiaoyao Li     CPUX86State *env = &cpu->env;
1932ede146c2SPaolo Bonzini     uint64_t r = 0;
1933fcf5ef2aSThomas Huth     int i;
1934fcf5ef2aSThomas Huth 
1935ede146c2SPaolo Bonzini     for (i = 0; i < 64; i++) {
1936ede146c2SPaolo Bonzini         uint64_t f = 1ULL << i;
1937fcf5ef2aSThomas Huth 
1938fcf5ef2aSThomas Huth         /* If the feature name is known, it is implicitly considered migratable,
1939fcf5ef2aSThomas Huth          * unless it is explicitly set in unmigratable_flags */
1940fcf5ef2aSThomas Huth         if ((wi->migratable_flags & f) ||
1941fcf5ef2aSThomas Huth             (wi->feat_names[i] && !(wi->unmigratable_flags & f))) {
1942fcf5ef2aSThomas Huth             r |= f;
1943fcf5ef2aSThomas Huth         }
1944fcf5ef2aSThomas Huth     }
194587c88db3SXiaoyao Li 
194687c88db3SXiaoyao Li     /* when tsc-khz is set explicitly, invtsc is migratable */
194787c88db3SXiaoyao Li     if ((w == FEAT_8000_0007_EDX) && env->user_tsc_khz) {
194887c88db3SXiaoyao Li         r |= CPUID_APM_INVTSC;
194987c88db3SXiaoyao Li     }
195087c88db3SXiaoyao Li 
1951fcf5ef2aSThomas Huth     return r;
1952fcf5ef2aSThomas Huth }
1953fcf5ef2aSThomas Huth 
host_cpuid(uint32_t function,uint32_t count,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)1954fcf5ef2aSThomas Huth void host_cpuid(uint32_t function, uint32_t count,
1955fcf5ef2aSThomas Huth                 uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
1956fcf5ef2aSThomas Huth {
1957fcf5ef2aSThomas Huth     uint32_t vec[4];
1958fcf5ef2aSThomas Huth 
1959fcf5ef2aSThomas Huth #ifdef __x86_64__
1960fcf5ef2aSThomas Huth     asm volatile("cpuid"
1961fcf5ef2aSThomas Huth                  : "=a"(vec[0]), "=b"(vec[1]),
1962fcf5ef2aSThomas Huth                    "=c"(vec[2]), "=d"(vec[3])
1963fcf5ef2aSThomas Huth                  : "0"(function), "c"(count) : "cc");
1964fcf5ef2aSThomas Huth #elif defined(__i386__)
1965fcf5ef2aSThomas Huth     asm volatile("pusha \n\t"
1966fcf5ef2aSThomas Huth                  "cpuid \n\t"
1967fcf5ef2aSThomas Huth                  "mov %%eax, 0(%2) \n\t"
1968fcf5ef2aSThomas Huth                  "mov %%ebx, 4(%2) \n\t"
1969fcf5ef2aSThomas Huth                  "mov %%ecx, 8(%2) \n\t"
1970fcf5ef2aSThomas Huth                  "mov %%edx, 12(%2) \n\t"
1971fcf5ef2aSThomas Huth                  "popa"
1972fcf5ef2aSThomas Huth                  : : "a"(function), "c"(count), "S"(vec)
1973fcf5ef2aSThomas Huth                  : "memory", "cc");
1974fcf5ef2aSThomas Huth #else
1975fcf5ef2aSThomas Huth     abort();
1976fcf5ef2aSThomas Huth #endif
1977fcf5ef2aSThomas Huth 
1978fcf5ef2aSThomas Huth     if (eax)
1979fcf5ef2aSThomas Huth         *eax = vec[0];
1980fcf5ef2aSThomas Huth     if (ebx)
1981fcf5ef2aSThomas Huth         *ebx = vec[1];
1982fcf5ef2aSThomas Huth     if (ecx)
1983fcf5ef2aSThomas Huth         *ecx = vec[2];
1984fcf5ef2aSThomas Huth     if (edx)
1985fcf5ef2aSThomas Huth         *edx = vec[3];
1986fcf5ef2aSThomas Huth }
1987fcf5ef2aSThomas Huth 
1988fcf5ef2aSThomas Huth /* CPU class name definitions: */
1989fcf5ef2aSThomas Huth 
1990fcf5ef2aSThomas Huth /* Return type name for a given CPU model name
1991fcf5ef2aSThomas Huth  * Caller is responsible for freeing the returned string.
1992fcf5ef2aSThomas Huth  */
x86_cpu_type_name(const char * model_name)1993fcf5ef2aSThomas Huth static char *x86_cpu_type_name(const char *model_name)
1994fcf5ef2aSThomas Huth {
1995fcf5ef2aSThomas Huth     return g_strdup_printf(X86_CPU_TYPE_NAME("%s"), model_name);
1996fcf5ef2aSThomas Huth }
1997fcf5ef2aSThomas Huth 
x86_cpu_class_by_name(const char * cpu_model)1998fcf5ef2aSThomas Huth static ObjectClass *x86_cpu_class_by_name(const char *cpu_model)
1999fcf5ef2aSThomas Huth {
200088703ce2SEduardo Habkost     g_autofree char *typename = x86_cpu_type_name(cpu_model);
200188703ce2SEduardo Habkost     return object_class_by_name(typename);
2002fcf5ef2aSThomas Huth }
2003fcf5ef2aSThomas Huth 
x86_cpu_class_get_model_name(X86CPUClass * cc)2004fcf5ef2aSThomas Huth static char *x86_cpu_class_get_model_name(X86CPUClass *cc)
2005fcf5ef2aSThomas Huth {
2006fcf5ef2aSThomas Huth     const char *class_name = object_class_get_name(OBJECT_CLASS(cc));
2007fcf5ef2aSThomas Huth     assert(g_str_has_suffix(class_name, X86_CPU_TYPE_SUFFIX));
20084b26aa9fSGavin Shan     return cpu_model_from_type(class_name);
2009fcf5ef2aSThomas Huth }
2010fcf5ef2aSThomas Huth 
2011dcafd1efSEduardo Habkost typedef struct X86CPUVersionDefinition {
2012dcafd1efSEduardo Habkost     X86CPUVersion version;
201353db89d9SEduardo Habkost     const char *alias;
2014c63938dfSTao Xu     const char *note;
2015dcafd1efSEduardo Habkost     PropValue *props;
2016cca0a000SMichael Roth     const CPUCaches *const cache_info;
2017dcafd1efSEduardo Habkost } X86CPUVersionDefinition;
2018dcafd1efSEduardo Habkost 
2019dcafd1efSEduardo Habkost /* Base definition for a CPU model */
2020dcafd1efSEduardo Habkost typedef struct X86CPUDefinition {
2021fcf5ef2aSThomas Huth     const char *name;
2022fcf5ef2aSThomas Huth     uint32_t level;
2023fcf5ef2aSThomas Huth     uint32_t xlevel;
2024fcf5ef2aSThomas Huth     /* vendor is zero-terminated, 12 character ASCII string */
2025fcf5ef2aSThomas Huth     char vendor[CPUID_VENDOR_SZ + 1];
2026fcf5ef2aSThomas Huth     int family;
2027fcf5ef2aSThomas Huth     int model;
2028fcf5ef2aSThomas Huth     int stepping;
2029bccfb846STao Su     uint8_t avx10_version;
2030fcf5ef2aSThomas Huth     FeatureWordArray features;
2031807e9869SEduardo Habkost     const char *model_id;
2032e845de38SPhilippe Mathieu-Daudé     const CPUCaches *const cache_info;
2033dcafd1efSEduardo Habkost     /*
2034dcafd1efSEduardo Habkost      * Definitions for alternative versions of CPU model.
2035dcafd1efSEduardo Habkost      * List is terminated by item with version == 0.
2036dcafd1efSEduardo Habkost      * If NULL, version 1 will be registered automatically.
2037dcafd1efSEduardo Habkost      */
2038dcafd1efSEduardo Habkost     const X86CPUVersionDefinition *versions;
203961ad65d0SRobert Hoo     const char *deprecation_note;
2040dcafd1efSEduardo Habkost } X86CPUDefinition;
2041dcafd1efSEduardo Habkost 
2042dcafd1efSEduardo Habkost /* Reference to a specific CPU model version */
2043dcafd1efSEduardo Habkost struct X86CPUModel {
2044dcafd1efSEduardo Habkost     /* Base CPU definition */
2045e11fd689SPhilippe Mathieu-Daudé     const X86CPUDefinition *cpudef;
2046dcafd1efSEduardo Habkost     /* CPU model version */
2047dcafd1efSEduardo Habkost     X86CPUVersion version;
2048c63938dfSTao Xu     const char *note;
20490788a56bSEduardo Habkost     /*
20500788a56bSEduardo Habkost      * If true, this is an alias CPU model.
20510788a56bSEduardo Habkost      * This matters only for "-cpu help" and query-cpu-definitions
20520788a56bSEduardo Habkost      */
20530788a56bSEduardo Habkost     bool is_alias;
2054fcf5ef2aSThomas Huth };
2055fcf5ef2aSThomas Huth 
2056dcafd1efSEduardo Habkost /* Get full model name for CPU version */
x86_cpu_versioned_model_name(const X86CPUDefinition * cpudef,X86CPUVersion version)2057e11fd689SPhilippe Mathieu-Daudé static char *x86_cpu_versioned_model_name(const X86CPUDefinition *cpudef,
2058dcafd1efSEduardo Habkost                                           X86CPUVersion version)
2059dcafd1efSEduardo Habkost {
2060dcafd1efSEduardo Habkost     assert(version > 0);
2061dcafd1efSEduardo Habkost     return g_strdup_printf("%s-v%d", cpudef->name, (int)version);
2062dcafd1efSEduardo Habkost }
2063dcafd1efSEduardo Habkost 
2064e11fd689SPhilippe Mathieu-Daudé static const X86CPUVersionDefinition *
x86_cpu_def_get_versions(const X86CPUDefinition * def)2065e11fd689SPhilippe Mathieu-Daudé x86_cpu_def_get_versions(const X86CPUDefinition *def)
2066dcafd1efSEduardo Habkost {
2067dcafd1efSEduardo Habkost     /* When X86CPUDefinition::versions is NULL, we register only v1 */
2068dcafd1efSEduardo Habkost     static const X86CPUVersionDefinition default_version_list[] = {
2069dcafd1efSEduardo Habkost         { 1 },
2070dcafd1efSEduardo Habkost         { /* end of list */ }
2071dcafd1efSEduardo Habkost     };
2072dcafd1efSEduardo Habkost 
2073dcafd1efSEduardo Habkost     return def->versions ?: default_version_list;
2074dcafd1efSEduardo Habkost }
2075dcafd1efSEduardo Habkost 
2076e845de38SPhilippe Mathieu-Daudé static const CPUCaches epyc_cache_info = {
2077a9f27ea9SEduardo Habkost     .l1d_cache = &(CPUCacheInfo) {
20785f00335aSEduardo Habkost         .type = DATA_CACHE,
2079fe52acd2SBabu Moger         .level = 1,
2080fe52acd2SBabu Moger         .size = 32 * KiB,
2081fe52acd2SBabu Moger         .line_size = 64,
2082fe52acd2SBabu Moger         .associativity = 8,
2083fe52acd2SBabu Moger         .partitions = 1,
2084fe52acd2SBabu Moger         .sets = 64,
2085fe52acd2SBabu Moger         .lines_per_tag = 1,
2086fe52acd2SBabu Moger         .self_init = 1,
2087fe52acd2SBabu Moger         .no_invd_sharing = true,
2088e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2089fe52acd2SBabu Moger     },
2090a9f27ea9SEduardo Habkost     .l1i_cache = &(CPUCacheInfo) {
20915f00335aSEduardo Habkost         .type = INSTRUCTION_CACHE,
2092fe52acd2SBabu Moger         .level = 1,
2093fe52acd2SBabu Moger         .size = 64 * KiB,
2094fe52acd2SBabu Moger         .line_size = 64,
2095fe52acd2SBabu Moger         .associativity = 4,
2096fe52acd2SBabu Moger         .partitions = 1,
2097fe52acd2SBabu Moger         .sets = 256,
2098fe52acd2SBabu Moger         .lines_per_tag = 1,
2099fe52acd2SBabu Moger         .self_init = 1,
2100fe52acd2SBabu Moger         .no_invd_sharing = true,
2101e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2102fe52acd2SBabu Moger     },
2103a9f27ea9SEduardo Habkost     .l2_cache = &(CPUCacheInfo) {
2104fe52acd2SBabu Moger         .type = UNIFIED_CACHE,
2105fe52acd2SBabu Moger         .level = 2,
2106fe52acd2SBabu Moger         .size = 512 * KiB,
2107fe52acd2SBabu Moger         .line_size = 64,
2108fe52acd2SBabu Moger         .associativity = 8,
2109fe52acd2SBabu Moger         .partitions = 1,
2110fe52acd2SBabu Moger         .sets = 1024,
2111fe52acd2SBabu Moger         .lines_per_tag = 1,
2112e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2113fe52acd2SBabu Moger     },
2114a9f27ea9SEduardo Habkost     .l3_cache = &(CPUCacheInfo) {
2115fe52acd2SBabu Moger         .type = UNIFIED_CACHE,
2116fe52acd2SBabu Moger         .level = 3,
2117fe52acd2SBabu Moger         .size = 8 * MiB,
2118fe52acd2SBabu Moger         .line_size = 64,
2119fe52acd2SBabu Moger         .associativity = 16,
2120fe52acd2SBabu Moger         .partitions = 1,
2121fe52acd2SBabu Moger         .sets = 8192,
2122fe52acd2SBabu Moger         .lines_per_tag = 1,
2123fe52acd2SBabu Moger         .self_init = true,
2124fe52acd2SBabu Moger         .inclusive = true,
2125fe52acd2SBabu Moger         .complex_indexing = true,
2126e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2127fe52acd2SBabu Moger     },
2128fe52acd2SBabu Moger };
2129fe52acd2SBabu Moger 
2130d7c72735SMichael Roth static CPUCaches epyc_v4_cache_info = {
2131d7c72735SMichael Roth     .l1d_cache = &(CPUCacheInfo) {
2132d7c72735SMichael Roth         .type = DATA_CACHE,
2133d7c72735SMichael Roth         .level = 1,
2134d7c72735SMichael Roth         .size = 32 * KiB,
2135d7c72735SMichael Roth         .line_size = 64,
2136d7c72735SMichael Roth         .associativity = 8,
2137d7c72735SMichael Roth         .partitions = 1,
2138d7c72735SMichael Roth         .sets = 64,
2139d7c72735SMichael Roth         .lines_per_tag = 1,
2140d7c72735SMichael Roth         .self_init = 1,
2141d7c72735SMichael Roth         .no_invd_sharing = true,
2142e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2143d7c72735SMichael Roth     },
2144d7c72735SMichael Roth     .l1i_cache = &(CPUCacheInfo) {
2145d7c72735SMichael Roth         .type = INSTRUCTION_CACHE,
2146d7c72735SMichael Roth         .level = 1,
2147d7c72735SMichael Roth         .size = 64 * KiB,
2148d7c72735SMichael Roth         .line_size = 64,
2149d7c72735SMichael Roth         .associativity = 4,
2150d7c72735SMichael Roth         .partitions = 1,
2151d7c72735SMichael Roth         .sets = 256,
2152d7c72735SMichael Roth         .lines_per_tag = 1,
2153d7c72735SMichael Roth         .self_init = 1,
2154d7c72735SMichael Roth         .no_invd_sharing = true,
2155e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2156d7c72735SMichael Roth     },
2157d7c72735SMichael Roth     .l2_cache = &(CPUCacheInfo) {
2158d7c72735SMichael Roth         .type = UNIFIED_CACHE,
2159d7c72735SMichael Roth         .level = 2,
2160d7c72735SMichael Roth         .size = 512 * KiB,
2161d7c72735SMichael Roth         .line_size = 64,
2162d7c72735SMichael Roth         .associativity = 8,
2163d7c72735SMichael Roth         .partitions = 1,
2164d7c72735SMichael Roth         .sets = 1024,
2165d7c72735SMichael Roth         .lines_per_tag = 1,
2166e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2167d7c72735SMichael Roth     },
2168d7c72735SMichael Roth     .l3_cache = &(CPUCacheInfo) {
2169d7c72735SMichael Roth         .type = UNIFIED_CACHE,
2170d7c72735SMichael Roth         .level = 3,
2171d7c72735SMichael Roth         .size = 8 * MiB,
2172d7c72735SMichael Roth         .line_size = 64,
2173d7c72735SMichael Roth         .associativity = 16,
2174d7c72735SMichael Roth         .partitions = 1,
2175d7c72735SMichael Roth         .sets = 8192,
2176d7c72735SMichael Roth         .lines_per_tag = 1,
2177d7c72735SMichael Roth         .self_init = true,
2178d7c72735SMichael Roth         .inclusive = true,
2179d7c72735SMichael Roth         .complex_indexing = false,
2180e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2181d7c72735SMichael Roth     },
2182d7c72735SMichael Roth };
2183d7c72735SMichael Roth 
2184e845de38SPhilippe Mathieu-Daudé static const CPUCaches epyc_rome_cache_info = {
2185143c30d4SMoger, Babu     .l1d_cache = &(CPUCacheInfo) {
2186143c30d4SMoger, Babu         .type = DATA_CACHE,
2187143c30d4SMoger, Babu         .level = 1,
2188143c30d4SMoger, Babu         .size = 32 * KiB,
2189143c30d4SMoger, Babu         .line_size = 64,
2190143c30d4SMoger, Babu         .associativity = 8,
2191143c30d4SMoger, Babu         .partitions = 1,
2192143c30d4SMoger, Babu         .sets = 64,
2193143c30d4SMoger, Babu         .lines_per_tag = 1,
2194143c30d4SMoger, Babu         .self_init = 1,
2195143c30d4SMoger, Babu         .no_invd_sharing = true,
2196e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2197143c30d4SMoger, Babu     },
2198143c30d4SMoger, Babu     .l1i_cache = &(CPUCacheInfo) {
2199143c30d4SMoger, Babu         .type = INSTRUCTION_CACHE,
2200143c30d4SMoger, Babu         .level = 1,
2201143c30d4SMoger, Babu         .size = 32 * KiB,
2202143c30d4SMoger, Babu         .line_size = 64,
2203143c30d4SMoger, Babu         .associativity = 8,
2204143c30d4SMoger, Babu         .partitions = 1,
2205143c30d4SMoger, Babu         .sets = 64,
2206143c30d4SMoger, Babu         .lines_per_tag = 1,
2207143c30d4SMoger, Babu         .self_init = 1,
2208143c30d4SMoger, Babu         .no_invd_sharing = true,
2209e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2210143c30d4SMoger, Babu     },
2211143c30d4SMoger, Babu     .l2_cache = &(CPUCacheInfo) {
2212143c30d4SMoger, Babu         .type = UNIFIED_CACHE,
2213143c30d4SMoger, Babu         .level = 2,
2214143c30d4SMoger, Babu         .size = 512 * KiB,
2215143c30d4SMoger, Babu         .line_size = 64,
2216143c30d4SMoger, Babu         .associativity = 8,
2217143c30d4SMoger, Babu         .partitions = 1,
2218143c30d4SMoger, Babu         .sets = 1024,
2219143c30d4SMoger, Babu         .lines_per_tag = 1,
2220e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2221143c30d4SMoger, Babu     },
2222143c30d4SMoger, Babu     .l3_cache = &(CPUCacheInfo) {
2223143c30d4SMoger, Babu         .type = UNIFIED_CACHE,
2224143c30d4SMoger, Babu         .level = 3,
2225143c30d4SMoger, Babu         .size = 16 * MiB,
2226143c30d4SMoger, Babu         .line_size = 64,
2227143c30d4SMoger, Babu         .associativity = 16,
2228143c30d4SMoger, Babu         .partitions = 1,
2229143c30d4SMoger, Babu         .sets = 16384,
2230143c30d4SMoger, Babu         .lines_per_tag = 1,
2231143c30d4SMoger, Babu         .self_init = true,
2232143c30d4SMoger, Babu         .inclusive = true,
2233143c30d4SMoger, Babu         .complex_indexing = true,
2234e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2235143c30d4SMoger, Babu     },
2236143c30d4SMoger, Babu };
2237143c30d4SMoger, Babu 
2238d7c72735SMichael Roth static const CPUCaches epyc_rome_v3_cache_info = {
2239d7c72735SMichael Roth     .l1d_cache = &(CPUCacheInfo) {
2240d7c72735SMichael Roth         .type = DATA_CACHE,
2241d7c72735SMichael Roth         .level = 1,
2242d7c72735SMichael Roth         .size = 32 * KiB,
2243d7c72735SMichael Roth         .line_size = 64,
2244d7c72735SMichael Roth         .associativity = 8,
2245d7c72735SMichael Roth         .partitions = 1,
2246d7c72735SMichael Roth         .sets = 64,
2247d7c72735SMichael Roth         .lines_per_tag = 1,
2248d7c72735SMichael Roth         .self_init = 1,
2249d7c72735SMichael Roth         .no_invd_sharing = true,
2250e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2251d7c72735SMichael Roth     },
2252d7c72735SMichael Roth     .l1i_cache = &(CPUCacheInfo) {
2253d7c72735SMichael Roth         .type = INSTRUCTION_CACHE,
2254d7c72735SMichael Roth         .level = 1,
2255d7c72735SMichael Roth         .size = 32 * KiB,
2256d7c72735SMichael Roth         .line_size = 64,
2257d7c72735SMichael Roth         .associativity = 8,
2258d7c72735SMichael Roth         .partitions = 1,
2259d7c72735SMichael Roth         .sets = 64,
2260d7c72735SMichael Roth         .lines_per_tag = 1,
2261d7c72735SMichael Roth         .self_init = 1,
2262d7c72735SMichael Roth         .no_invd_sharing = true,
2263e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2264d7c72735SMichael Roth     },
2265d7c72735SMichael Roth     .l2_cache = &(CPUCacheInfo) {
2266d7c72735SMichael Roth         .type = UNIFIED_CACHE,
2267d7c72735SMichael Roth         .level = 2,
2268d7c72735SMichael Roth         .size = 512 * KiB,
2269d7c72735SMichael Roth         .line_size = 64,
2270d7c72735SMichael Roth         .associativity = 8,
2271d7c72735SMichael Roth         .partitions = 1,
2272d7c72735SMichael Roth         .sets = 1024,
2273d7c72735SMichael Roth         .lines_per_tag = 1,
2274e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2275d7c72735SMichael Roth     },
2276d7c72735SMichael Roth     .l3_cache = &(CPUCacheInfo) {
2277d7c72735SMichael Roth         .type = UNIFIED_CACHE,
2278d7c72735SMichael Roth         .level = 3,
2279d7c72735SMichael Roth         .size = 16 * MiB,
2280d7c72735SMichael Roth         .line_size = 64,
2281d7c72735SMichael Roth         .associativity = 16,
2282d7c72735SMichael Roth         .partitions = 1,
2283d7c72735SMichael Roth         .sets = 16384,
2284d7c72735SMichael Roth         .lines_per_tag = 1,
2285d7c72735SMichael Roth         .self_init = true,
2286d7c72735SMichael Roth         .inclusive = true,
2287d7c72735SMichael Roth         .complex_indexing = false,
2288e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2289d7c72735SMichael Roth     },
2290d7c72735SMichael Roth };
2291d7c72735SMichael Roth 
2292e845de38SPhilippe Mathieu-Daudé static const CPUCaches epyc_milan_cache_info = {
2293623972ceSBabu Moger     .l1d_cache = &(CPUCacheInfo) {
2294623972ceSBabu Moger         .type = DATA_CACHE,
2295623972ceSBabu Moger         .level = 1,
2296623972ceSBabu Moger         .size = 32 * KiB,
2297623972ceSBabu Moger         .line_size = 64,
2298623972ceSBabu Moger         .associativity = 8,
2299623972ceSBabu Moger         .partitions = 1,
2300623972ceSBabu Moger         .sets = 64,
2301623972ceSBabu Moger         .lines_per_tag = 1,
2302623972ceSBabu Moger         .self_init = 1,
2303623972ceSBabu Moger         .no_invd_sharing = true,
2304e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2305623972ceSBabu Moger     },
2306623972ceSBabu Moger     .l1i_cache = &(CPUCacheInfo) {
2307623972ceSBabu Moger         .type = INSTRUCTION_CACHE,
2308623972ceSBabu Moger         .level = 1,
2309623972ceSBabu Moger         .size = 32 * KiB,
2310623972ceSBabu Moger         .line_size = 64,
2311623972ceSBabu Moger         .associativity = 8,
2312623972ceSBabu Moger         .partitions = 1,
2313623972ceSBabu Moger         .sets = 64,
2314623972ceSBabu Moger         .lines_per_tag = 1,
2315623972ceSBabu Moger         .self_init = 1,
2316623972ceSBabu Moger         .no_invd_sharing = true,
2317e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2318623972ceSBabu Moger     },
2319623972ceSBabu Moger     .l2_cache = &(CPUCacheInfo) {
2320623972ceSBabu Moger         .type = UNIFIED_CACHE,
2321623972ceSBabu Moger         .level = 2,
2322623972ceSBabu Moger         .size = 512 * KiB,
2323623972ceSBabu Moger         .line_size = 64,
2324623972ceSBabu Moger         .associativity = 8,
2325623972ceSBabu Moger         .partitions = 1,
2326623972ceSBabu Moger         .sets = 1024,
2327623972ceSBabu Moger         .lines_per_tag = 1,
2328e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2329623972ceSBabu Moger     },
2330623972ceSBabu Moger     .l3_cache = &(CPUCacheInfo) {
2331623972ceSBabu Moger         .type = UNIFIED_CACHE,
2332623972ceSBabu Moger         .level = 3,
2333623972ceSBabu Moger         .size = 32 * MiB,
2334623972ceSBabu Moger         .line_size = 64,
2335623972ceSBabu Moger         .associativity = 16,
2336623972ceSBabu Moger         .partitions = 1,
2337623972ceSBabu Moger         .sets = 32768,
2338623972ceSBabu Moger         .lines_per_tag = 1,
2339623972ceSBabu Moger         .self_init = true,
2340623972ceSBabu Moger         .inclusive = true,
2341623972ceSBabu Moger         .complex_indexing = true,
2342e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2343623972ceSBabu Moger     },
2344623972ceSBabu Moger };
2345623972ceSBabu Moger 
234627f03be6SBabu Moger static const CPUCaches epyc_milan_v2_cache_info = {
234727f03be6SBabu Moger     .l1d_cache = &(CPUCacheInfo) {
234827f03be6SBabu Moger         .type = DATA_CACHE,
234927f03be6SBabu Moger         .level = 1,
235027f03be6SBabu Moger         .size = 32 * KiB,
235127f03be6SBabu Moger         .line_size = 64,
235227f03be6SBabu Moger         .associativity = 8,
235327f03be6SBabu Moger         .partitions = 1,
235427f03be6SBabu Moger         .sets = 64,
235527f03be6SBabu Moger         .lines_per_tag = 1,
235627f03be6SBabu Moger         .self_init = 1,
235727f03be6SBabu Moger         .no_invd_sharing = true,
2358e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
235927f03be6SBabu Moger     },
236027f03be6SBabu Moger     .l1i_cache = &(CPUCacheInfo) {
236127f03be6SBabu Moger         .type = INSTRUCTION_CACHE,
236227f03be6SBabu Moger         .level = 1,
236327f03be6SBabu Moger         .size = 32 * KiB,
236427f03be6SBabu Moger         .line_size = 64,
236527f03be6SBabu Moger         .associativity = 8,
236627f03be6SBabu Moger         .partitions = 1,
236727f03be6SBabu Moger         .sets = 64,
236827f03be6SBabu Moger         .lines_per_tag = 1,
236927f03be6SBabu Moger         .self_init = 1,
237027f03be6SBabu Moger         .no_invd_sharing = true,
2371e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
237227f03be6SBabu Moger     },
237327f03be6SBabu Moger     .l2_cache = &(CPUCacheInfo) {
237427f03be6SBabu Moger         .type = UNIFIED_CACHE,
237527f03be6SBabu Moger         .level = 2,
237627f03be6SBabu Moger         .size = 512 * KiB,
237727f03be6SBabu Moger         .line_size = 64,
237827f03be6SBabu Moger         .associativity = 8,
237927f03be6SBabu Moger         .partitions = 1,
238027f03be6SBabu Moger         .sets = 1024,
238127f03be6SBabu Moger         .lines_per_tag = 1,
2382e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
238327f03be6SBabu Moger     },
238427f03be6SBabu Moger     .l3_cache = &(CPUCacheInfo) {
238527f03be6SBabu Moger         .type = UNIFIED_CACHE,
238627f03be6SBabu Moger         .level = 3,
238727f03be6SBabu Moger         .size = 32 * MiB,
238827f03be6SBabu Moger         .line_size = 64,
238927f03be6SBabu Moger         .associativity = 16,
239027f03be6SBabu Moger         .partitions = 1,
239127f03be6SBabu Moger         .sets = 32768,
239227f03be6SBabu Moger         .lines_per_tag = 1,
239327f03be6SBabu Moger         .self_init = true,
239427f03be6SBabu Moger         .inclusive = true,
239527f03be6SBabu Moger         .complex_indexing = false,
2396e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_DIE,
239727f03be6SBabu Moger     },
239827f03be6SBabu Moger };
239927f03be6SBabu Moger 
2400166b1741SBabu Moger static const CPUCaches epyc_genoa_cache_info = {
2401166b1741SBabu Moger     .l1d_cache = &(CPUCacheInfo) {
2402166b1741SBabu Moger         .type = DATA_CACHE,
2403166b1741SBabu Moger         .level = 1,
2404166b1741SBabu Moger         .size = 32 * KiB,
2405166b1741SBabu Moger         .line_size = 64,
2406166b1741SBabu Moger         .associativity = 8,
2407166b1741SBabu Moger         .partitions = 1,
2408166b1741SBabu Moger         .sets = 64,
2409166b1741SBabu Moger         .lines_per_tag = 1,
2410166b1741SBabu Moger         .self_init = 1,
2411166b1741SBabu Moger         .no_invd_sharing = true,
2412e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2413166b1741SBabu Moger     },
2414166b1741SBabu Moger     .l1i_cache = &(CPUCacheInfo) {
2415166b1741SBabu Moger         .type = INSTRUCTION_CACHE,
2416166b1741SBabu Moger         .level = 1,
2417166b1741SBabu Moger         .size = 32 * KiB,
2418166b1741SBabu Moger         .line_size = 64,
2419166b1741SBabu Moger         .associativity = 8,
2420166b1741SBabu Moger         .partitions = 1,
2421166b1741SBabu Moger         .sets = 64,
2422166b1741SBabu Moger         .lines_per_tag = 1,
2423166b1741SBabu Moger         .self_init = 1,
2424166b1741SBabu Moger         .no_invd_sharing = true,
2425e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2426166b1741SBabu Moger     },
2427166b1741SBabu Moger     .l2_cache = &(CPUCacheInfo) {
2428166b1741SBabu Moger         .type = UNIFIED_CACHE,
2429166b1741SBabu Moger         .level = 2,
2430166b1741SBabu Moger         .size = 1 * MiB,
2431166b1741SBabu Moger         .line_size = 64,
2432166b1741SBabu Moger         .associativity = 8,
2433166b1741SBabu Moger         .partitions = 1,
2434166b1741SBabu Moger         .sets = 2048,
2435166b1741SBabu Moger         .lines_per_tag = 1,
2436e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_CORE,
2437166b1741SBabu Moger     },
2438166b1741SBabu Moger     .l3_cache = &(CPUCacheInfo) {
2439166b1741SBabu Moger         .type = UNIFIED_CACHE,
2440166b1741SBabu Moger         .level = 3,
2441166b1741SBabu Moger         .size = 32 * MiB,
2442166b1741SBabu Moger         .line_size = 64,
2443166b1741SBabu Moger         .associativity = 16,
2444166b1741SBabu Moger         .partitions = 1,
2445166b1741SBabu Moger         .sets = 32768,
2446166b1741SBabu Moger         .lines_per_tag = 1,
2447166b1741SBabu Moger         .self_init = true,
2448166b1741SBabu Moger         .inclusive = true,
2449166b1741SBabu Moger         .complex_indexing = false,
2450e823ebe7SZhao Liu         .share_level = CPU_TOPOLOGY_LEVEL_DIE,
2451166b1741SBabu Moger     },
2452166b1741SBabu Moger };
2453166b1741SBabu Moger 
24540723cc8aSPaolo Bonzini /* The following VMX features are not supported by KVM and are left out in the
24550723cc8aSPaolo Bonzini  * CPU definitions:
24560723cc8aSPaolo Bonzini  *
24570723cc8aSPaolo Bonzini  *  Dual-monitor support (all processors)
24580723cc8aSPaolo Bonzini  *  Entry to SMM
24590723cc8aSPaolo Bonzini  *  Deactivate dual-monitor treatment
24600723cc8aSPaolo Bonzini  *  Number of CR3-target values
24610723cc8aSPaolo Bonzini  *  Shutdown activity state
24620723cc8aSPaolo Bonzini  *  Wait-for-SIPI activity state
24630723cc8aSPaolo Bonzini  *  PAUSE-loop exiting (Westmere and newer)
24640723cc8aSPaolo Bonzini  *  EPT-violation #VE (Broadwell and newer)
24650723cc8aSPaolo Bonzini  *  Inject event with insn length=0 (Skylake and newer)
24660723cc8aSPaolo Bonzini  *  Conceal non-root operation from PT
24670723cc8aSPaolo Bonzini  *  Conceal VM exits from PT
24680723cc8aSPaolo Bonzini  *  Conceal VM entries from PT
24690723cc8aSPaolo Bonzini  *  Enable ENCLS exiting
24700723cc8aSPaolo Bonzini  *  Mode-based execute control (XS/XU)
2471f70c1c06SBernhard Beschow  *  TSC scaling (Skylake Server and newer)
24720723cc8aSPaolo Bonzini  *  GPA translation for PT (IceLake and newer)
24730723cc8aSPaolo Bonzini  *  User wait and pause
24740723cc8aSPaolo Bonzini  *  ENCLV exiting
24750723cc8aSPaolo Bonzini  *  Load IA32_RTIT_CTL
24760723cc8aSPaolo Bonzini  *  Clear IA32_RTIT_CTL
24770723cc8aSPaolo Bonzini  *  Advanced VM-exit information for EPT violations
24780723cc8aSPaolo Bonzini  *  Sub-page write permissions
24790723cc8aSPaolo Bonzini  *  PT in VMX operation
24800723cc8aSPaolo Bonzini  */
24810723cc8aSPaolo Bonzini 
2482e11fd689SPhilippe Mathieu-Daudé static const X86CPUDefinition builtin_x86_defs[] = {
2483fcf5ef2aSThomas Huth     {
2484fcf5ef2aSThomas Huth         .name = "qemu64",
2485fcf5ef2aSThomas Huth         .level = 0xd,
2486fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_AMD,
2487b7c29017SDaniel P. Berrangé         .family = 15,
2488b7c29017SDaniel P. Berrangé         .model = 107,
2489b7c29017SDaniel P. Berrangé         .stepping = 1,
2490fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
2491fcf5ef2aSThomas Huth             PPRO_FEATURES |
2492fcf5ef2aSThomas Huth             CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
2493fcf5ef2aSThomas Huth             CPUID_PSE36,
2494fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
2495fcf5ef2aSThomas Huth             CPUID_EXT_SSE3 | CPUID_EXT_CX16,
2496fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
2497fcf5ef2aSThomas Huth             CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2498fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
2499fcf5ef2aSThomas Huth             CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM,
2500fcf5ef2aSThomas Huth         .xlevel = 0x8000000A,
2501fcf5ef2aSThomas Huth         .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
2502fcf5ef2aSThomas Huth     },
2503fcf5ef2aSThomas Huth     {
2504fcf5ef2aSThomas Huth         .name = "phenom",
2505fcf5ef2aSThomas Huth         .level = 5,
2506fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_AMD,
2507fcf5ef2aSThomas Huth         .family = 16,
2508fcf5ef2aSThomas Huth         .model = 2,
2509fcf5ef2aSThomas Huth         .stepping = 3,
2510fcf5ef2aSThomas Huth         /* Missing: CPUID_HT */
2511fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
2512fcf5ef2aSThomas Huth             PPRO_FEATURES |
2513fcf5ef2aSThomas Huth             CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
2514fcf5ef2aSThomas Huth             CPUID_PSE36 | CPUID_VME,
2515fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
2516fcf5ef2aSThomas Huth             CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_CX16 |
2517fcf5ef2aSThomas Huth             CPUID_EXT_POPCNT,
2518fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
2519fcf5ef2aSThomas Huth             CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX |
2520fcf5ef2aSThomas Huth             CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_MMXEXT |
2521fcf5ef2aSThomas Huth             CPUID_EXT2_FFXSR | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP,
2522fcf5ef2aSThomas Huth         /* Missing: CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
2523fcf5ef2aSThomas Huth                     CPUID_EXT3_CR8LEG,
2524fcf5ef2aSThomas Huth                     CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
2525fcf5ef2aSThomas Huth                     CPUID_EXT3_OSVW, CPUID_EXT3_IBS */
2526fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
2527fcf5ef2aSThomas Huth             CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM |
2528fcf5ef2aSThomas Huth             CPUID_EXT3_ABM | CPUID_EXT3_SSE4A,
2529fcf5ef2aSThomas Huth         /* Missing: CPUID_SVM_LBRV */
2530fcf5ef2aSThomas Huth         .features[FEAT_SVM] =
2531fcf5ef2aSThomas Huth             CPUID_SVM_NPT,
2532fcf5ef2aSThomas Huth         .xlevel = 0x8000001A,
2533fcf5ef2aSThomas Huth         .model_id = "AMD Phenom(tm) 9550 Quad-Core Processor"
2534fcf5ef2aSThomas Huth     },
2535fcf5ef2aSThomas Huth     {
2536fcf5ef2aSThomas Huth         .name = "core2duo",
2537fcf5ef2aSThomas Huth         .level = 10,
2538fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
2539fcf5ef2aSThomas Huth         .family = 6,
2540fcf5ef2aSThomas Huth         .model = 15,
2541fcf5ef2aSThomas Huth         .stepping = 11,
2542fcf5ef2aSThomas Huth         /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
2543fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
2544fcf5ef2aSThomas Huth             PPRO_FEATURES |
2545fcf5ef2aSThomas Huth             CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
2546fcf5ef2aSThomas Huth             CPUID_PSE36 | CPUID_VME | CPUID_ACPI | CPUID_SS,
2547fcf5ef2aSThomas Huth         /* Missing: CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_EST,
2548fcf5ef2aSThomas Huth          * CPUID_EXT_TM2, CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_VMX */
2549fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
2550fcf5ef2aSThomas Huth             CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
2551fcf5ef2aSThomas Huth             CPUID_EXT_CX16,
2552fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
2553fcf5ef2aSThomas Huth             CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2554fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
2555fcf5ef2aSThomas Huth             CPUID_EXT3_LAHF_LM,
25560723cc8aSPaolo Bonzini         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
25570723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
25580723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
25590723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
25600723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
25610723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
25620723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
25630723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
25640723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
25650723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
25660723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
25670723cc8aSPaolo Bonzini              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
25680723cc8aSPaolo Bonzini              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
25690723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
25700723cc8aSPaolo Bonzini              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
25710723cc8aSPaolo Bonzini              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
25720723cc8aSPaolo Bonzini         .features[FEAT_VMX_SECONDARY_CTLS] =
25730723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES,
2574fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
2575fcf5ef2aSThomas Huth         .model_id = "Intel(R) Core(TM)2 Duo CPU     T7700  @ 2.40GHz",
2576fcf5ef2aSThomas Huth     },
2577fcf5ef2aSThomas Huth     {
2578fcf5ef2aSThomas Huth         .name = "kvm64",
2579fcf5ef2aSThomas Huth         .level = 0xd,
2580fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
2581fcf5ef2aSThomas Huth         .family = 15,
2582fcf5ef2aSThomas Huth         .model = 6,
2583fcf5ef2aSThomas Huth         .stepping = 1,
2584fcf5ef2aSThomas Huth         /* Missing: CPUID_HT */
2585fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
2586fcf5ef2aSThomas Huth             PPRO_FEATURES | CPUID_VME |
2587fcf5ef2aSThomas Huth             CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
2588fcf5ef2aSThomas Huth             CPUID_PSE36,
2589fcf5ef2aSThomas Huth         /* Missing: CPUID_EXT_POPCNT, CPUID_EXT_MONITOR */
2590fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
2591fcf5ef2aSThomas Huth             CPUID_EXT_SSE3 | CPUID_EXT_CX16,
2592fcf5ef2aSThomas Huth         /* Missing: CPUID_EXT2_PDPE1GB, CPUID_EXT2_RDTSCP */
2593fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
2594fcf5ef2aSThomas Huth             CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2595fcf5ef2aSThomas Huth         /* Missing: CPUID_EXT3_LAHF_LM, CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
2596fcf5ef2aSThomas Huth                     CPUID_EXT3_CR8LEG, CPUID_EXT3_ABM, CPUID_EXT3_SSE4A,
2597fcf5ef2aSThomas Huth                     CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
2598fcf5ef2aSThomas Huth                     CPUID_EXT3_OSVW, CPUID_EXT3_IBS, CPUID_EXT3_SVM */
2599fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
2600fcf5ef2aSThomas Huth             0,
26010723cc8aSPaolo Bonzini         /* VMX features from Cedar Mill/Prescott */
26020723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
26030723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
26040723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
26050723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
26060723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING,
26070723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
26080723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
26090723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
26100723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
26110723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
26120723cc8aSPaolo Bonzini              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
26130723cc8aSPaolo Bonzini              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
26140723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING,
2615fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
2616fcf5ef2aSThomas Huth         .model_id = "Common KVM processor"
2617fcf5ef2aSThomas Huth     },
2618fcf5ef2aSThomas Huth     {
2619fcf5ef2aSThomas Huth         .name = "qemu32",
2620fcf5ef2aSThomas Huth         .level = 4,
2621fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
2622fcf5ef2aSThomas Huth         .family = 6,
2623fcf5ef2aSThomas Huth         .model = 6,
2624fcf5ef2aSThomas Huth         .stepping = 3,
2625fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
2626fcf5ef2aSThomas Huth             PPRO_FEATURES,
2627fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
2628fcf5ef2aSThomas Huth             CPUID_EXT_SSE3,
2629fcf5ef2aSThomas Huth         .xlevel = 0x80000004,
2630fcf5ef2aSThomas Huth         .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
2631fcf5ef2aSThomas Huth     },
2632fcf5ef2aSThomas Huth     {
2633fcf5ef2aSThomas Huth         .name = "kvm32",
2634fcf5ef2aSThomas Huth         .level = 5,
2635fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
2636fcf5ef2aSThomas Huth         .family = 15,
2637fcf5ef2aSThomas Huth         .model = 6,
2638fcf5ef2aSThomas Huth         .stepping = 1,
2639fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
2640fcf5ef2aSThomas Huth             PPRO_FEATURES | CPUID_VME |
2641fcf5ef2aSThomas Huth             CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_PSE36,
2642fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
2643fcf5ef2aSThomas Huth             CPUID_EXT_SSE3,
2644fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
2645fcf5ef2aSThomas Huth             0,
26460723cc8aSPaolo Bonzini         /* VMX features from Yonah */
26470723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
26480723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
26490723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
26500723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
26510723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING,
26520723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
26530723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
26540723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
26550723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
26560723cc8aSPaolo Bonzini              VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
26570723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
26580723cc8aSPaolo Bonzini              VMX_CPU_BASED_PAUSE_EXITING | VMX_CPU_BASED_USE_MSR_BITMAPS,
2659fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
2660fcf5ef2aSThomas Huth         .model_id = "Common 32-bit KVM processor"
2661fcf5ef2aSThomas Huth     },
2662fcf5ef2aSThomas Huth     {
2663fcf5ef2aSThomas Huth         .name = "coreduo",
2664fcf5ef2aSThomas Huth         .level = 10,
2665fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
2666fcf5ef2aSThomas Huth         .family = 6,
2667fcf5ef2aSThomas Huth         .model = 14,
2668fcf5ef2aSThomas Huth         .stepping = 8,
2669fcf5ef2aSThomas Huth         /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
2670fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
2671fcf5ef2aSThomas Huth             PPRO_FEATURES | CPUID_VME |
2672fcf5ef2aSThomas Huth             CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_ACPI |
2673fcf5ef2aSThomas Huth             CPUID_SS,
2674fcf5ef2aSThomas Huth         /* Missing: CPUID_EXT_EST, CPUID_EXT_TM2 , CPUID_EXT_XTPR,
2675fcf5ef2aSThomas Huth          * CPUID_EXT_PDCM, CPUID_EXT_VMX */
2676fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
2677fcf5ef2aSThomas Huth             CPUID_EXT_SSE3 | CPUID_EXT_MONITOR,
2678fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
2679fcf5ef2aSThomas Huth             CPUID_EXT2_NX,
26800723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
26810723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
26820723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
26830723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
26840723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING,
26850723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
26860723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
26870723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
26880723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
26890723cc8aSPaolo Bonzini              VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
26900723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
26910723cc8aSPaolo Bonzini              VMX_CPU_BASED_PAUSE_EXITING | VMX_CPU_BASED_USE_MSR_BITMAPS,
2692fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
2693fcf5ef2aSThomas Huth         .model_id = "Genuine Intel(R) CPU           T2600  @ 2.16GHz",
2694fcf5ef2aSThomas Huth     },
2695fcf5ef2aSThomas Huth     {
2696fcf5ef2aSThomas Huth         .name = "486",
2697fcf5ef2aSThomas Huth         .level = 1,
2698fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
2699fcf5ef2aSThomas Huth         .family = 4,
2700fcf5ef2aSThomas Huth         .model = 8,
2701fcf5ef2aSThomas Huth         .stepping = 0,
2702fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
2703fcf5ef2aSThomas Huth             I486_FEATURES,
2704fcf5ef2aSThomas Huth         .xlevel = 0,
2705807e9869SEduardo Habkost         .model_id = "",
2706fcf5ef2aSThomas Huth     },
2707fcf5ef2aSThomas Huth     {
2708fcf5ef2aSThomas Huth         .name = "pentium",
2709fcf5ef2aSThomas Huth         .level = 1,
2710fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
2711fcf5ef2aSThomas Huth         .family = 5,
2712fcf5ef2aSThomas Huth         .model = 4,
2713fcf5ef2aSThomas Huth         .stepping = 3,
2714fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
2715fcf5ef2aSThomas Huth             PENTIUM_FEATURES,
2716fcf5ef2aSThomas Huth         .xlevel = 0,
2717807e9869SEduardo Habkost         .model_id = "",
2718fcf5ef2aSThomas Huth     },
2719fcf5ef2aSThomas Huth     {
2720fcf5ef2aSThomas Huth         .name = "pentium2",
2721fcf5ef2aSThomas Huth         .level = 2,
2722fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
2723fcf5ef2aSThomas Huth         .family = 6,
2724fcf5ef2aSThomas Huth         .model = 5,
2725fcf5ef2aSThomas Huth         .stepping = 2,
2726fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
2727fcf5ef2aSThomas Huth             PENTIUM2_FEATURES,
2728fcf5ef2aSThomas Huth         .xlevel = 0,
2729807e9869SEduardo Habkost         .model_id = "",
2730fcf5ef2aSThomas Huth     },
2731fcf5ef2aSThomas Huth     {
2732fcf5ef2aSThomas Huth         .name = "pentium3",
2733fcf5ef2aSThomas Huth         .level = 3,
2734fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
2735fcf5ef2aSThomas Huth         .family = 6,
2736fcf5ef2aSThomas Huth         .model = 7,
2737fcf5ef2aSThomas Huth         .stepping = 3,
2738fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
2739fcf5ef2aSThomas Huth             PENTIUM3_FEATURES,
2740fcf5ef2aSThomas Huth         .xlevel = 0,
2741807e9869SEduardo Habkost         .model_id = "",
2742fcf5ef2aSThomas Huth     },
2743fcf5ef2aSThomas Huth     {
2744fcf5ef2aSThomas Huth         .name = "athlon",
2745fcf5ef2aSThomas Huth         .level = 2,
2746fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_AMD,
2747fcf5ef2aSThomas Huth         .family = 6,
2748fcf5ef2aSThomas Huth         .model = 2,
2749fcf5ef2aSThomas Huth         .stepping = 3,
2750fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
2751fcf5ef2aSThomas Huth             PPRO_FEATURES | CPUID_PSE36 | CPUID_VME | CPUID_MTRR |
2752fcf5ef2aSThomas Huth             CPUID_MCA,
2753fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
2754fcf5ef2aSThomas Huth             CPUID_EXT2_MMXEXT | CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT,
2755fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
2756fcf5ef2aSThomas Huth         .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
2757fcf5ef2aSThomas Huth     },
2758fcf5ef2aSThomas Huth     {
2759fcf5ef2aSThomas Huth         .name = "n270",
2760fcf5ef2aSThomas Huth         .level = 10,
2761fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
2762fcf5ef2aSThomas Huth         .family = 6,
2763fcf5ef2aSThomas Huth         .model = 28,
2764fcf5ef2aSThomas Huth         .stepping = 2,
2765fcf5ef2aSThomas Huth         /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
2766fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
2767fcf5ef2aSThomas Huth             PPRO_FEATURES |
2768fcf5ef2aSThomas Huth             CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_VME |
2769fcf5ef2aSThomas Huth             CPUID_ACPI | CPUID_SS,
2770fcf5ef2aSThomas Huth             /* Some CPUs got no CPUID_SEP */
2771fcf5ef2aSThomas Huth         /* Missing: CPUID_EXT_DSCPL, CPUID_EXT_EST, CPUID_EXT_TM2,
2772fcf5ef2aSThomas Huth          * CPUID_EXT_XTPR */
2773fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
2774fcf5ef2aSThomas Huth             CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
2775fcf5ef2aSThomas Huth             CPUID_EXT_MOVBE,
2776fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
2777fcf5ef2aSThomas Huth             CPUID_EXT2_NX,
2778fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
2779fcf5ef2aSThomas Huth             CPUID_EXT3_LAHF_LM,
2780fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
2781fcf5ef2aSThomas Huth         .model_id = "Intel(R) Atom(TM) CPU N270   @ 1.60GHz",
2782fcf5ef2aSThomas Huth     },
2783fcf5ef2aSThomas Huth     {
2784fcf5ef2aSThomas Huth         .name = "Conroe",
2785fcf5ef2aSThomas Huth         .level = 10,
2786fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
2787fcf5ef2aSThomas Huth         .family = 6,
2788fcf5ef2aSThomas Huth         .model = 15,
2789fcf5ef2aSThomas Huth         .stepping = 3,
2790fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
2791fcf5ef2aSThomas Huth             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2792fcf5ef2aSThomas Huth             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2793fcf5ef2aSThomas Huth             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2794fcf5ef2aSThomas Huth             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2795fcf5ef2aSThomas Huth             CPUID_DE | CPUID_FP87,
2796fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
2797fcf5ef2aSThomas Huth             CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
2798fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
2799fcf5ef2aSThomas Huth             CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2800fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
2801fcf5ef2aSThomas Huth             CPUID_EXT3_LAHF_LM,
28020723cc8aSPaolo Bonzini         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
28030723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE,
28040723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT,
28050723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
28060723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
28070723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
28080723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
28090723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
28100723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
28110723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
28120723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
28130723cc8aSPaolo Bonzini              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
28140723cc8aSPaolo Bonzini              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
28150723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
28160723cc8aSPaolo Bonzini              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
28170723cc8aSPaolo Bonzini              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
28180723cc8aSPaolo Bonzini         .features[FEAT_VMX_SECONDARY_CTLS] =
28190723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES,
2820fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
2821fcf5ef2aSThomas Huth         .model_id = "Intel Celeron_4x0 (Conroe/Merom Class Core 2)",
2822fcf5ef2aSThomas Huth     },
2823fcf5ef2aSThomas Huth     {
2824fcf5ef2aSThomas Huth         .name = "Penryn",
2825fcf5ef2aSThomas Huth         .level = 10,
2826fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
2827fcf5ef2aSThomas Huth         .family = 6,
2828fcf5ef2aSThomas Huth         .model = 23,
2829fcf5ef2aSThomas Huth         .stepping = 3,
2830fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
2831fcf5ef2aSThomas Huth             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2832fcf5ef2aSThomas Huth             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2833fcf5ef2aSThomas Huth             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2834fcf5ef2aSThomas Huth             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2835fcf5ef2aSThomas Huth             CPUID_DE | CPUID_FP87,
2836fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
2837fcf5ef2aSThomas Huth             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2838fcf5ef2aSThomas Huth             CPUID_EXT_SSE3,
2839fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
2840fcf5ef2aSThomas Huth             CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2841fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
2842fcf5ef2aSThomas Huth             CPUID_EXT3_LAHF_LM,
28430723cc8aSPaolo Bonzini         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS,
28440723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
28450723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL,
28460723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT |
28470723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL,
28480723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
28490723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
28500723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS,
28510723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
28520723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
28530723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
28540723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
28550723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
28560723cc8aSPaolo Bonzini              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
28570723cc8aSPaolo Bonzini              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
28580723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
28590723cc8aSPaolo Bonzini              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
28600723cc8aSPaolo Bonzini              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
28610723cc8aSPaolo Bonzini         .features[FEAT_VMX_SECONDARY_CTLS] =
28620723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
28630723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_WBINVD_EXITING,
2864fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
2865fcf5ef2aSThomas Huth         .model_id = "Intel Core 2 Duo P9xxx (Penryn Class Core 2)",
2866fcf5ef2aSThomas Huth     },
2867fcf5ef2aSThomas Huth     {
2868fcf5ef2aSThomas Huth         .name = "Nehalem",
2869fcf5ef2aSThomas Huth         .level = 11,
2870fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
2871fcf5ef2aSThomas Huth         .family = 6,
2872fcf5ef2aSThomas Huth         .model = 26,
2873fcf5ef2aSThomas Huth         .stepping = 3,
2874fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
2875fcf5ef2aSThomas Huth             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2876fcf5ef2aSThomas Huth             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2877fcf5ef2aSThomas Huth             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2878fcf5ef2aSThomas Huth             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2879fcf5ef2aSThomas Huth             CPUID_DE | CPUID_FP87,
2880fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
2881fcf5ef2aSThomas Huth             CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2882fcf5ef2aSThomas Huth             CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
2883fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
2884fcf5ef2aSThomas Huth             CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2885fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
2886fcf5ef2aSThomas Huth             CPUID_EXT3_LAHF_LM,
28870723cc8aSPaolo Bonzini         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
28880723cc8aSPaolo Bonzini              MSR_VMX_BASIC_TRUE_CTLS,
28890723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
28900723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
28910723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
28920723cc8aSPaolo Bonzini         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
28930723cc8aSPaolo Bonzini              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
28940723cc8aSPaolo Bonzini              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
28950723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
28960723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
28970723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
28980723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
28990723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] =
29000723cc8aSPaolo Bonzini              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
29010723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
29020723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
29030723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
29040723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
29050723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT,
29060723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
29070723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
29080723cc8aSPaolo Bonzini              VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
29090723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
29100723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
29110723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
29120723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
29130723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
29140723cc8aSPaolo Bonzini              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
29150723cc8aSPaolo Bonzini              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
29160723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
29170723cc8aSPaolo Bonzini              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
29180723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
29190723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
29200723cc8aSPaolo Bonzini              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
29210723cc8aSPaolo Bonzini         .features[FEAT_VMX_SECONDARY_CTLS] =
29220723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
29230723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
29240723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
29250723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
29260723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VPID,
2927fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
2928fcf5ef2aSThomas Huth         .model_id = "Intel Core i7 9xx (Nehalem Class Core i7)",
2929d86a7088SEduardo Habkost         .versions = (X86CPUVersionDefinition[]) {
2930d86a7088SEduardo Habkost             { .version = 1 },
2931d86a7088SEduardo Habkost             {
2932d86a7088SEduardo Habkost                 .version = 2,
293353db89d9SEduardo Habkost                 .alias = "Nehalem-IBRS",
2934d86a7088SEduardo Habkost                 .props = (PropValue[]) {
2935d86a7088SEduardo Habkost                     { "spec-ctrl", "on" },
2936d86a7088SEduardo Habkost                     { "model-id",
2937d86a7088SEduardo Habkost                       "Intel Core i7 9xx (Nehalem Core i7, IBRS update)" },
2938d86a7088SEduardo Habkost                     { /* end of list */ }
2939d86a7088SEduardo Habkost                 }
2940d86a7088SEduardo Habkost             },
2941d86a7088SEduardo Habkost             { /* end of list */ }
2942d86a7088SEduardo Habkost         }
2943fcf5ef2aSThomas Huth     },
2944fcf5ef2aSThomas Huth     {
2945fcf5ef2aSThomas Huth         .name = "Westmere",
2946fcf5ef2aSThomas Huth         .level = 11,
2947fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
2948fcf5ef2aSThomas Huth         .family = 6,
2949fcf5ef2aSThomas Huth         .model = 44,
2950fcf5ef2aSThomas Huth         .stepping = 1,
2951fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
2952fcf5ef2aSThomas Huth             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2953fcf5ef2aSThomas Huth             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2954fcf5ef2aSThomas Huth             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2955fcf5ef2aSThomas Huth             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2956fcf5ef2aSThomas Huth             CPUID_DE | CPUID_FP87,
2957fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
2958fcf5ef2aSThomas Huth             CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
2959fcf5ef2aSThomas Huth             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2960fcf5ef2aSThomas Huth             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
2961fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
2962fcf5ef2aSThomas Huth             CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
2963fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
2964fcf5ef2aSThomas Huth             CPUID_EXT3_LAHF_LM,
2965fcf5ef2aSThomas Huth         .features[FEAT_6_EAX] =
2966fcf5ef2aSThomas Huth             CPUID_6_EAX_ARAT,
29670723cc8aSPaolo Bonzini         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
29680723cc8aSPaolo Bonzini              MSR_VMX_BASIC_TRUE_CTLS,
29690723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
29700723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
29710723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
29720723cc8aSPaolo Bonzini         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
29730723cc8aSPaolo Bonzini              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
29740723cc8aSPaolo Bonzini              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
29750723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
29760723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
29770723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
29780723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
29790723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] =
29800723cc8aSPaolo Bonzini              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
29810723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
29820723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
29830723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
29840723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
29850723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
29860723cc8aSPaolo Bonzini              MSR_VMX_MISC_STORE_LMA,
29870723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
29880723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
29890723cc8aSPaolo Bonzini              VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
29900723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
29910723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
29920723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
29930723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
29940723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
29950723cc8aSPaolo Bonzini              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
29960723cc8aSPaolo Bonzini              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
29970723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
29980723cc8aSPaolo Bonzini              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
29990723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
30000723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
30010723cc8aSPaolo Bonzini              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
30020723cc8aSPaolo Bonzini         .features[FEAT_VMX_SECONDARY_CTLS] =
30030723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
30040723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
30050723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
30060723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
30070723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST,
3008fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
3009fcf5ef2aSThomas Huth         .model_id = "Westmere E56xx/L56xx/X56xx (Nehalem-C)",
3010d86a7088SEduardo Habkost         .versions = (X86CPUVersionDefinition[]) {
3011d86a7088SEduardo Habkost             { .version = 1 },
3012d86a7088SEduardo Habkost             {
3013d86a7088SEduardo Habkost                 .version = 2,
301453db89d9SEduardo Habkost                 .alias = "Westmere-IBRS",
3015d86a7088SEduardo Habkost                 .props = (PropValue[]) {
3016d86a7088SEduardo Habkost                     { "spec-ctrl", "on" },
3017d86a7088SEduardo Habkost                     { "model-id",
3018d86a7088SEduardo Habkost                       "Westmere E56xx/L56xx/X56xx (IBRS update)" },
3019d86a7088SEduardo Habkost                     { /* end of list */ }
3020d86a7088SEduardo Habkost                 }
3021d86a7088SEduardo Habkost             },
3022d86a7088SEduardo Habkost             { /* end of list */ }
3023d86a7088SEduardo Habkost         }
3024fcf5ef2aSThomas Huth     },
3025fcf5ef2aSThomas Huth     {
3026fcf5ef2aSThomas Huth         .name = "SandyBridge",
3027fcf5ef2aSThomas Huth         .level = 0xd,
3028fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
3029fcf5ef2aSThomas Huth         .family = 6,
3030fcf5ef2aSThomas Huth         .model = 42,
3031fcf5ef2aSThomas Huth         .stepping = 1,
3032fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
3033fcf5ef2aSThomas Huth             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3034fcf5ef2aSThomas Huth             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3035fcf5ef2aSThomas Huth             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3036fcf5ef2aSThomas Huth             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3037fcf5ef2aSThomas Huth             CPUID_DE | CPUID_FP87,
3038fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
3039fcf5ef2aSThomas Huth             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3040fcf5ef2aSThomas Huth             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
3041fcf5ef2aSThomas Huth             CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
3042fcf5ef2aSThomas Huth             CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
3043fcf5ef2aSThomas Huth             CPUID_EXT_SSE3,
3044fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
3045fcf5ef2aSThomas Huth             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
3046fcf5ef2aSThomas Huth             CPUID_EXT2_SYSCALL,
3047fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
3048fcf5ef2aSThomas Huth             CPUID_EXT3_LAHF_LM,
3049fcf5ef2aSThomas Huth         .features[FEAT_XSAVE] =
3050fcf5ef2aSThomas Huth             CPUID_XSAVE_XSAVEOPT,
3051fcf5ef2aSThomas Huth         .features[FEAT_6_EAX] =
3052fcf5ef2aSThomas Huth             CPUID_6_EAX_ARAT,
30530723cc8aSPaolo Bonzini         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
30540723cc8aSPaolo Bonzini              MSR_VMX_BASIC_TRUE_CTLS,
30550723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
30560723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
30570723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
30580723cc8aSPaolo Bonzini         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
30590723cc8aSPaolo Bonzini              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
30600723cc8aSPaolo Bonzini              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
30610723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
30620723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
30630723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
30640723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
30650723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] =
30660723cc8aSPaolo Bonzini              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
30670723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
30680723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
30690723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
30700723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
30710723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
30720723cc8aSPaolo Bonzini              MSR_VMX_MISC_STORE_LMA,
30730723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
30740723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
30750723cc8aSPaolo Bonzini              VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
30760723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
30770723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
30780723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
30790723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
30800723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
30810723cc8aSPaolo Bonzini              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
30820723cc8aSPaolo Bonzini              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
30830723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
30840723cc8aSPaolo Bonzini              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
30850723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
30860723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
30870723cc8aSPaolo Bonzini              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
30880723cc8aSPaolo Bonzini         .features[FEAT_VMX_SECONDARY_CTLS] =
30890723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
30900723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
30910723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
30920723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
30930723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST,
3094fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
3095fcf5ef2aSThomas Huth         .model_id = "Intel Xeon E312xx (Sandy Bridge)",
3096d86a7088SEduardo Habkost         .versions = (X86CPUVersionDefinition[]) {
3097d86a7088SEduardo Habkost             { .version = 1 },
3098d86a7088SEduardo Habkost             {
3099d86a7088SEduardo Habkost                 .version = 2,
310053db89d9SEduardo Habkost                 .alias = "SandyBridge-IBRS",
3101d86a7088SEduardo Habkost                 .props = (PropValue[]) {
3102d86a7088SEduardo Habkost                     { "spec-ctrl", "on" },
3103d86a7088SEduardo Habkost                     { "model-id",
3104d86a7088SEduardo Habkost                       "Intel Xeon E312xx (Sandy Bridge, IBRS update)" },
3105d86a7088SEduardo Habkost                     { /* end of list */ }
3106d86a7088SEduardo Habkost                 }
3107d86a7088SEduardo Habkost             },
3108d86a7088SEduardo Habkost             { /* end of list */ }
3109d86a7088SEduardo Habkost         }
3110fcf5ef2aSThomas Huth     },
3111fcf5ef2aSThomas Huth     {
3112fcf5ef2aSThomas Huth         .name = "IvyBridge",
3113fcf5ef2aSThomas Huth         .level = 0xd,
3114fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
3115fcf5ef2aSThomas Huth         .family = 6,
3116fcf5ef2aSThomas Huth         .model = 58,
3117fcf5ef2aSThomas Huth         .stepping = 9,
3118fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
3119fcf5ef2aSThomas Huth             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3120fcf5ef2aSThomas Huth             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3121fcf5ef2aSThomas Huth             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3122fcf5ef2aSThomas Huth             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3123fcf5ef2aSThomas Huth             CPUID_DE | CPUID_FP87,
3124fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
3125fcf5ef2aSThomas Huth             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3126fcf5ef2aSThomas Huth             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
3127fcf5ef2aSThomas Huth             CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
3128fcf5ef2aSThomas Huth             CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
3129fcf5ef2aSThomas Huth             CPUID_EXT_SSE3 | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3130fcf5ef2aSThomas Huth         .features[FEAT_7_0_EBX] =
3131fcf5ef2aSThomas Huth             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP |
3132fcf5ef2aSThomas Huth             CPUID_7_0_EBX_ERMS,
3133fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
3134fcf5ef2aSThomas Huth             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
3135fcf5ef2aSThomas Huth             CPUID_EXT2_SYSCALL,
3136fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
3137fcf5ef2aSThomas Huth             CPUID_EXT3_LAHF_LM,
3138fcf5ef2aSThomas Huth         .features[FEAT_XSAVE] =
3139fcf5ef2aSThomas Huth             CPUID_XSAVE_XSAVEOPT,
3140fcf5ef2aSThomas Huth         .features[FEAT_6_EAX] =
3141fcf5ef2aSThomas Huth             CPUID_6_EAX_ARAT,
31420723cc8aSPaolo Bonzini         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
31430723cc8aSPaolo Bonzini              MSR_VMX_BASIC_TRUE_CTLS,
31440723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
31450723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
31460723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
31470723cc8aSPaolo Bonzini         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
31480723cc8aSPaolo Bonzini              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
31490723cc8aSPaolo Bonzini              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
31500723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
31510723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
31520723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
31530723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
31540723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] =
31550723cc8aSPaolo Bonzini              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
31560723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
31570723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
31580723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
31590723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
31600723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
31610723cc8aSPaolo Bonzini              MSR_VMX_MISC_STORE_LMA,
31620723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
31630723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
31640723cc8aSPaolo Bonzini              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
31650723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
31660723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
31670723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
31680723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
31690723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
31700723cc8aSPaolo Bonzini              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
31710723cc8aSPaolo Bonzini              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
31720723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
31730723cc8aSPaolo Bonzini              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
31740723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
31750723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
31760723cc8aSPaolo Bonzini              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
31770723cc8aSPaolo Bonzini         .features[FEAT_VMX_SECONDARY_CTLS] =
31780723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
31790723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
31800723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
31810723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
31820723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
31830723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
31840723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
31850723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_RDRAND_EXITING,
3186fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
3187fcf5ef2aSThomas Huth         .model_id = "Intel Xeon E3-12xx v2 (Ivy Bridge)",
3188d86a7088SEduardo Habkost         .versions = (X86CPUVersionDefinition[]) {
3189d86a7088SEduardo Habkost             { .version = 1 },
3190d86a7088SEduardo Habkost             {
3191d86a7088SEduardo Habkost                 .version = 2,
319253db89d9SEduardo Habkost                 .alias = "IvyBridge-IBRS",
3193d86a7088SEduardo Habkost                 .props = (PropValue[]) {
3194d86a7088SEduardo Habkost                     { "spec-ctrl", "on" },
3195d86a7088SEduardo Habkost                     { "model-id",
3196d86a7088SEduardo Habkost                       "Intel Xeon E3-12xx v2 (Ivy Bridge, IBRS)" },
3197d86a7088SEduardo Habkost                     { /* end of list */ }
3198d86a7088SEduardo Habkost                 }
3199d86a7088SEduardo Habkost             },
3200d86a7088SEduardo Habkost             { /* end of list */ }
3201d86a7088SEduardo Habkost         }
3202fcf5ef2aSThomas Huth     },
3203fcf5ef2aSThomas Huth     {
3204fcf5ef2aSThomas Huth         .name = "Haswell",
3205fcf5ef2aSThomas Huth         .level = 0xd,
3206fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
3207fcf5ef2aSThomas Huth         .family = 6,
3208fcf5ef2aSThomas Huth         .model = 60,
3209ec56a4a7SEduardo Habkost         .stepping = 4,
3210fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
3211fcf5ef2aSThomas Huth             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3212fcf5ef2aSThomas Huth             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3213fcf5ef2aSThomas Huth             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3214fcf5ef2aSThomas Huth             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3215fcf5ef2aSThomas Huth             CPUID_DE | CPUID_FP87,
3216fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
3217fcf5ef2aSThomas Huth             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3218fcf5ef2aSThomas Huth             CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3219fcf5ef2aSThomas Huth             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3220fcf5ef2aSThomas Huth             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3221fcf5ef2aSThomas Huth             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3222fcf5ef2aSThomas Huth             CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3223fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
3224fcf5ef2aSThomas Huth             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
3225fcf5ef2aSThomas Huth             CPUID_EXT2_SYSCALL,
3226fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
3227fcf5ef2aSThomas Huth             CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
3228fcf5ef2aSThomas Huth         .features[FEAT_7_0_EBX] =
3229fcf5ef2aSThomas Huth             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3230fcf5ef2aSThomas Huth             CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3231fcf5ef2aSThomas Huth             CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3232fcf5ef2aSThomas Huth             CPUID_7_0_EBX_RTM,
3233fcf5ef2aSThomas Huth         .features[FEAT_XSAVE] =
3234fcf5ef2aSThomas Huth             CPUID_XSAVE_XSAVEOPT,
3235fcf5ef2aSThomas Huth         .features[FEAT_6_EAX] =
3236fcf5ef2aSThomas Huth             CPUID_6_EAX_ARAT,
32370723cc8aSPaolo Bonzini         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
32380723cc8aSPaolo Bonzini              MSR_VMX_BASIC_TRUE_CTLS,
32390723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
32400723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
32410723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
32420723cc8aSPaolo Bonzini         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
32430723cc8aSPaolo Bonzini              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
32440723cc8aSPaolo Bonzini              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
32450723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
32460723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
32470723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
32480723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
32490723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] =
32500723cc8aSPaolo Bonzini              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
32510723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
32520723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
32530723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
32540723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
32550723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
32560723cc8aSPaolo Bonzini              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
32570723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
32580723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
32590723cc8aSPaolo Bonzini              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
32600723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
32610723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
32620723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
32630723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
32640723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
32650723cc8aSPaolo Bonzini              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
32660723cc8aSPaolo Bonzini              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
32670723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
32680723cc8aSPaolo Bonzini              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
32690723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
32700723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
32710723cc8aSPaolo Bonzini              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
32720723cc8aSPaolo Bonzini         .features[FEAT_VMX_SECONDARY_CTLS] =
32730723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
32740723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
32750723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
32760723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
32770723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
32780723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
32790723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
32800723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
32810723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS,
32820723cc8aSPaolo Bonzini         .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3283fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
3284fcf5ef2aSThomas Huth         .model_id = "Intel Core Processor (Haswell)",
3285d86a7088SEduardo Habkost         .versions = (X86CPUVersionDefinition[]) {
3286d86a7088SEduardo Habkost             { .version = 1 },
3287d86a7088SEduardo Habkost             {
3288d86a7088SEduardo Habkost                 .version = 2,
328953db89d9SEduardo Habkost                 .alias = "Haswell-noTSX",
3290d86a7088SEduardo Habkost                 .props = (PropValue[]) {
3291d86a7088SEduardo Habkost                     { "hle", "off" },
3292d86a7088SEduardo Habkost                     { "rtm", "off" },
3293d86a7088SEduardo Habkost                     { "stepping", "1" },
3294d86a7088SEduardo Habkost                     { "model-id", "Intel Core Processor (Haswell, no TSX)", },
3295d86a7088SEduardo Habkost                     { /* end of list */ }
3296d86a7088SEduardo Habkost                 },
3297d86a7088SEduardo Habkost             },
3298d86a7088SEduardo Habkost             {
3299d86a7088SEduardo Habkost                 .version = 3,
330053db89d9SEduardo Habkost                 .alias = "Haswell-IBRS",
3301d86a7088SEduardo Habkost                 .props = (PropValue[]) {
3302d86a7088SEduardo Habkost                     /* Restore TSX features removed by -v2 above */
3303d86a7088SEduardo Habkost                     { "hle", "on" },
3304d86a7088SEduardo Habkost                     { "rtm", "on" },
3305d86a7088SEduardo Habkost                     /*
3306d86a7088SEduardo Habkost                      * Haswell and Haswell-IBRS had stepping=4 in
3307d86a7088SEduardo Habkost                      * QEMU 4.0 and older
3308d86a7088SEduardo Habkost                      */
3309d86a7088SEduardo Habkost                     { "stepping", "4" },
3310d86a7088SEduardo Habkost                     { "spec-ctrl", "on" },
3311d86a7088SEduardo Habkost                     { "model-id",
3312d86a7088SEduardo Habkost                       "Intel Core Processor (Haswell, IBRS)" },
3313d86a7088SEduardo Habkost                     { /* end of list */ }
3314d86a7088SEduardo Habkost                 }
3315d86a7088SEduardo Habkost             },
3316d86a7088SEduardo Habkost             {
3317d86a7088SEduardo Habkost                 .version = 4,
331853db89d9SEduardo Habkost                 .alias = "Haswell-noTSX-IBRS",
3319d86a7088SEduardo Habkost                 .props = (PropValue[]) {
3320d86a7088SEduardo Habkost                     { "hle", "off" },
3321d86a7088SEduardo Habkost                     { "rtm", "off" },
3322d86a7088SEduardo Habkost                     /* spec-ctrl was already enabled by -v3 above */
3323d86a7088SEduardo Habkost                     { "stepping", "1" },
3324d86a7088SEduardo Habkost                     { "model-id",
3325d86a7088SEduardo Habkost                       "Intel Core Processor (Haswell, no TSX, IBRS)" },
3326d86a7088SEduardo Habkost                     { /* end of list */ }
3327d86a7088SEduardo Habkost                 }
3328d86a7088SEduardo Habkost             },
3329d86a7088SEduardo Habkost             { /* end of list */ }
3330d86a7088SEduardo Habkost         }
3331fcf5ef2aSThomas Huth     },
3332fcf5ef2aSThomas Huth     {
3333fcf5ef2aSThomas Huth         .name = "Broadwell",
3334fcf5ef2aSThomas Huth         .level = 0xd,
3335fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
3336fcf5ef2aSThomas Huth         .family = 6,
3337fcf5ef2aSThomas Huth         .model = 61,
3338fcf5ef2aSThomas Huth         .stepping = 2,
3339fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
3340fcf5ef2aSThomas Huth             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3341fcf5ef2aSThomas Huth             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3342fcf5ef2aSThomas Huth             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3343fcf5ef2aSThomas Huth             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3344fcf5ef2aSThomas Huth             CPUID_DE | CPUID_FP87,
3345fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
3346fcf5ef2aSThomas Huth             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3347fcf5ef2aSThomas Huth             CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3348fcf5ef2aSThomas Huth             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3349fcf5ef2aSThomas Huth             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3350fcf5ef2aSThomas Huth             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3351fcf5ef2aSThomas Huth             CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3352fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
3353fcf5ef2aSThomas Huth             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
3354fcf5ef2aSThomas Huth             CPUID_EXT2_SYSCALL,
3355fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
3356fcf5ef2aSThomas Huth             CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3357fcf5ef2aSThomas Huth         .features[FEAT_7_0_EBX] =
3358fcf5ef2aSThomas Huth             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3359fcf5ef2aSThomas Huth             CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3360fcf5ef2aSThomas Huth             CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3361fcf5ef2aSThomas Huth             CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3362fcf5ef2aSThomas Huth             CPUID_7_0_EBX_SMAP,
3363fcf5ef2aSThomas Huth         .features[FEAT_XSAVE] =
3364fcf5ef2aSThomas Huth             CPUID_XSAVE_XSAVEOPT,
3365fcf5ef2aSThomas Huth         .features[FEAT_6_EAX] =
3366fcf5ef2aSThomas Huth             CPUID_6_EAX_ARAT,
33670723cc8aSPaolo Bonzini         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
33680723cc8aSPaolo Bonzini              MSR_VMX_BASIC_TRUE_CTLS,
33690723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
33700723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
33710723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
33720723cc8aSPaolo Bonzini         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
33730723cc8aSPaolo Bonzini              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
33740723cc8aSPaolo Bonzini              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
33750723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
33760723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
33770723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
33780723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
33790723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] =
33800723cc8aSPaolo Bonzini              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
33810723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
33820723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
33830723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
33840723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
33850723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
33860723cc8aSPaolo Bonzini              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
33870723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
33880723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
33890723cc8aSPaolo Bonzini              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
33900723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
33910723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
33920723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
33930723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
33940723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
33950723cc8aSPaolo Bonzini              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
33960723cc8aSPaolo Bonzini              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
33970723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
33980723cc8aSPaolo Bonzini              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
33990723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
34000723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
34010723cc8aSPaolo Bonzini              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
34020723cc8aSPaolo Bonzini         .features[FEAT_VMX_SECONDARY_CTLS] =
34030723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
34040723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
34050723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
34060723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
34070723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
34080723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
34090723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
34100723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
34110723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
34120723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
34130723cc8aSPaolo Bonzini         .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3414fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
3415fcf5ef2aSThomas Huth         .model_id = "Intel Core Processor (Broadwell)",
3416d86a7088SEduardo Habkost         .versions = (X86CPUVersionDefinition[]) {
3417d86a7088SEduardo Habkost             { .version = 1 },
3418d86a7088SEduardo Habkost             {
3419d86a7088SEduardo Habkost                 .version = 2,
342053db89d9SEduardo Habkost                 .alias = "Broadwell-noTSX",
3421d86a7088SEduardo Habkost                 .props = (PropValue[]) {
3422d86a7088SEduardo Habkost                     { "hle", "off" },
3423d86a7088SEduardo Habkost                     { "rtm", "off" },
3424d86a7088SEduardo Habkost                     { "model-id", "Intel Core Processor (Broadwell, no TSX)", },
3425d86a7088SEduardo Habkost                     { /* end of list */ }
3426d86a7088SEduardo Habkost                 },
3427d86a7088SEduardo Habkost             },
3428d86a7088SEduardo Habkost             {
3429d86a7088SEduardo Habkost                 .version = 3,
343053db89d9SEduardo Habkost                 .alias = "Broadwell-IBRS",
3431d86a7088SEduardo Habkost                 .props = (PropValue[]) {
3432d86a7088SEduardo Habkost                     /* Restore TSX features removed by -v2 above */
3433d86a7088SEduardo Habkost                     { "hle", "on" },
3434d86a7088SEduardo Habkost                     { "rtm", "on" },
3435d86a7088SEduardo Habkost                     { "spec-ctrl", "on" },
3436d86a7088SEduardo Habkost                     { "model-id",
3437d86a7088SEduardo Habkost                       "Intel Core Processor (Broadwell, IBRS)" },
3438d86a7088SEduardo Habkost                     { /* end of list */ }
3439d86a7088SEduardo Habkost                 }
3440d86a7088SEduardo Habkost             },
3441d86a7088SEduardo Habkost             {
3442d86a7088SEduardo Habkost                 .version = 4,
344353db89d9SEduardo Habkost                 .alias = "Broadwell-noTSX-IBRS",
3444d86a7088SEduardo Habkost                 .props = (PropValue[]) {
3445d86a7088SEduardo Habkost                     { "hle", "off" },
3446d86a7088SEduardo Habkost                     { "rtm", "off" },
3447d86a7088SEduardo Habkost                     /* spec-ctrl was already enabled by -v3 above */
3448d86a7088SEduardo Habkost                     { "model-id",
3449d86a7088SEduardo Habkost                       "Intel Core Processor (Broadwell, no TSX, IBRS)" },
3450d86a7088SEduardo Habkost                     { /* end of list */ }
3451d86a7088SEduardo Habkost                 }
3452d86a7088SEduardo Habkost             },
3453d86a7088SEduardo Habkost             { /* end of list */ }
3454d86a7088SEduardo Habkost         }
3455fcf5ef2aSThomas Huth     },
3456fcf5ef2aSThomas Huth     {
3457fcf5ef2aSThomas Huth         .name = "Skylake-Client",
3458fcf5ef2aSThomas Huth         .level = 0xd,
3459fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_INTEL,
3460fcf5ef2aSThomas Huth         .family = 6,
3461fcf5ef2aSThomas Huth         .model = 94,
3462fcf5ef2aSThomas Huth         .stepping = 3,
3463fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
3464fcf5ef2aSThomas Huth             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3465fcf5ef2aSThomas Huth             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3466fcf5ef2aSThomas Huth             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3467fcf5ef2aSThomas Huth             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3468fcf5ef2aSThomas Huth             CPUID_DE | CPUID_FP87,
3469fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
3470fcf5ef2aSThomas Huth             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3471fcf5ef2aSThomas Huth             CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3472fcf5ef2aSThomas Huth             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3473fcf5ef2aSThomas Huth             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3474fcf5ef2aSThomas Huth             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3475fcf5ef2aSThomas Huth             CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3476fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
3477fcf5ef2aSThomas Huth             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
3478fcf5ef2aSThomas Huth             CPUID_EXT2_SYSCALL,
3479fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
3480fcf5ef2aSThomas Huth             CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3481fcf5ef2aSThomas Huth         .features[FEAT_7_0_EBX] =
3482fcf5ef2aSThomas Huth             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3483fcf5ef2aSThomas Huth             CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3484fcf5ef2aSThomas Huth             CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3485fcf5ef2aSThomas Huth             CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3486ecb85fe4SPaolo Bonzini             CPUID_7_0_EBX_SMAP,
34877bde6b18SVitaly Kuznetsov         /* XSAVES is added in version 4 */
3488fcf5ef2aSThomas Huth         .features[FEAT_XSAVE] =
3489fcf5ef2aSThomas Huth             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3490fcf5ef2aSThomas Huth             CPUID_XSAVE_XGETBV1,
3491fcf5ef2aSThomas Huth         .features[FEAT_6_EAX] =
3492fcf5ef2aSThomas Huth             CPUID_6_EAX_ARAT,
34930723cc8aSPaolo Bonzini         /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
34940723cc8aSPaolo Bonzini         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
34950723cc8aSPaolo Bonzini              MSR_VMX_BASIC_TRUE_CTLS,
34960723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
34970723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
34980723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
34990723cc8aSPaolo Bonzini         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
35000723cc8aSPaolo Bonzini              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
35010723cc8aSPaolo Bonzini              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
35020723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
35030723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
35040723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
35050723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
35060723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] =
35070723cc8aSPaolo Bonzini              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
35080723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
35090723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
35100723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
35110723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
35120723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
35130723cc8aSPaolo Bonzini              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
35140723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
35150723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
35160723cc8aSPaolo Bonzini              VMX_PIN_BASED_VMX_PREEMPTION_TIMER,
35170723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
35180723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
35190723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
35200723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
35210723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
35220723cc8aSPaolo Bonzini              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
35230723cc8aSPaolo Bonzini              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
35240723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
35250723cc8aSPaolo Bonzini              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
35260723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
35270723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
35280723cc8aSPaolo Bonzini              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
35290723cc8aSPaolo Bonzini         .features[FEAT_VMX_SECONDARY_CTLS] =
35300723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
35310723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
35320723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
35330723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
35340723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
35350723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
35360723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
35370723cc8aSPaolo Bonzini         .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
3538fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
3539fcf5ef2aSThomas Huth         .model_id = "Intel Core Processor (Skylake)",
3540d86a7088SEduardo Habkost         .versions = (X86CPUVersionDefinition[]) {
3541d86a7088SEduardo Habkost             { .version = 1 },
3542d86a7088SEduardo Habkost             {
3543d86a7088SEduardo Habkost                 .version = 2,
354453db89d9SEduardo Habkost                 .alias = "Skylake-Client-IBRS",
3545d86a7088SEduardo Habkost                 .props = (PropValue[]) {
3546d86a7088SEduardo Habkost                     { "spec-ctrl", "on" },
3547d86a7088SEduardo Habkost                     { "model-id",
3548d86a7088SEduardo Habkost                       "Intel Core Processor (Skylake, IBRS)" },
3549d86a7088SEduardo Habkost                     { /* end of list */ }
3550d86a7088SEduardo Habkost                 }
3551d86a7088SEduardo Habkost             },
35529ab2237fSEduardo Habkost             {
35539ab2237fSEduardo Habkost                 .version = 3,
355402fa60d1SEduardo Habkost                 .alias = "Skylake-Client-noTSX-IBRS",
35559ab2237fSEduardo Habkost                 .props = (PropValue[]) {
35569ab2237fSEduardo Habkost                     { "hle", "off" },
35579ab2237fSEduardo Habkost                     { "rtm", "off" },
3558673b0addSKashyap Chamarthy                     { "model-id",
3559673b0addSKashyap Chamarthy                       "Intel Core Processor (Skylake, IBRS, no TSX)" },
35609ab2237fSEduardo Habkost                     { /* end of list */ }
35619ab2237fSEduardo Habkost                 }
35629ab2237fSEduardo Habkost             },
35637bde6b18SVitaly Kuznetsov             {
35647bde6b18SVitaly Kuznetsov                 .version = 4,
35657bde6b18SVitaly Kuznetsov                 .note = "IBRS, XSAVES, no TSX",
35667bde6b18SVitaly Kuznetsov                 .props = (PropValue[]) {
35677bde6b18SVitaly Kuznetsov                     { "xsaves", "on" },
35687bde6b18SVitaly Kuznetsov                     { "vmx-xsaves", "on" },
35697bde6b18SVitaly Kuznetsov                     { /* end of list */ }
35707bde6b18SVitaly Kuznetsov                 }
35717bde6b18SVitaly Kuznetsov             },
3572d86a7088SEduardo Habkost             { /* end of list */ }
3573d86a7088SEduardo Habkost         }
3574fcf5ef2aSThomas Huth     },
3575fcf5ef2aSThomas Huth     {
357653f9a6f4SBoqun Feng (Intel)         .name = "Skylake-Server",
357753f9a6f4SBoqun Feng (Intel)         .level = 0xd,
357853f9a6f4SBoqun Feng (Intel)         .vendor = CPUID_VENDOR_INTEL,
357953f9a6f4SBoqun Feng (Intel)         .family = 6,
358053f9a6f4SBoqun Feng (Intel)         .model = 85,
358153f9a6f4SBoqun Feng (Intel)         .stepping = 4,
358253f9a6f4SBoqun Feng (Intel)         .features[FEAT_1_EDX] =
358353f9a6f4SBoqun Feng (Intel)             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
358453f9a6f4SBoqun Feng (Intel)             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
358553f9a6f4SBoqun Feng (Intel)             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
358653f9a6f4SBoqun Feng (Intel)             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
358753f9a6f4SBoqun Feng (Intel)             CPUID_DE | CPUID_FP87,
358853f9a6f4SBoqun Feng (Intel)         .features[FEAT_1_ECX] =
358953f9a6f4SBoqun Feng (Intel)             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
359053f9a6f4SBoqun Feng (Intel)             CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
359153f9a6f4SBoqun Feng (Intel)             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
359253f9a6f4SBoqun Feng (Intel)             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
359353f9a6f4SBoqun Feng (Intel)             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
359453f9a6f4SBoqun Feng (Intel)             CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
359553f9a6f4SBoqun Feng (Intel)         .features[FEAT_8000_0001_EDX] =
359653f9a6f4SBoqun Feng (Intel)             CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
359753f9a6f4SBoqun Feng (Intel)             CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
359853f9a6f4SBoqun Feng (Intel)         .features[FEAT_8000_0001_ECX] =
359953f9a6f4SBoqun Feng (Intel)             CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
360053f9a6f4SBoqun Feng (Intel)         .features[FEAT_7_0_EBX] =
360153f9a6f4SBoqun Feng (Intel)             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
360253f9a6f4SBoqun Feng (Intel)             CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
360353f9a6f4SBoqun Feng (Intel)             CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
360453f9a6f4SBoqun Feng (Intel)             CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3605ecb85fe4SPaolo Bonzini             CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
360653f9a6f4SBoqun Feng (Intel)             CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
360753f9a6f4SBoqun Feng (Intel)             CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
3608c68bcb3aSHaozhong Zhang             CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
360909b9ee64STao Xu         .features[FEAT_7_0_ECX] =
361009b9ee64STao Xu             CPUID_7_0_ECX_PKU,
36117bde6b18SVitaly Kuznetsov         /* XSAVES is added in version 5 */
361253f9a6f4SBoqun Feng (Intel)         .features[FEAT_XSAVE] =
361353f9a6f4SBoqun Feng (Intel)             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
361453f9a6f4SBoqun Feng (Intel)             CPUID_XSAVE_XGETBV1,
361553f9a6f4SBoqun Feng (Intel)         .features[FEAT_6_EAX] =
361653f9a6f4SBoqun Feng (Intel)             CPUID_6_EAX_ARAT,
36170723cc8aSPaolo Bonzini         /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
36180723cc8aSPaolo Bonzini         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
36190723cc8aSPaolo Bonzini              MSR_VMX_BASIC_TRUE_CTLS,
36200723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
36210723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
36220723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
36230723cc8aSPaolo Bonzini         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
36240723cc8aSPaolo Bonzini              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
36250723cc8aSPaolo Bonzini              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
36260723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
36270723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
36280723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
36290723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
36300723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] =
36310723cc8aSPaolo Bonzini              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
36320723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
36330723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
36340723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
36350723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
36360723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
36370723cc8aSPaolo Bonzini              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
36380723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
36390723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
36400723cc8aSPaolo Bonzini              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
36410723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
36420723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
36430723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
36440723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
36450723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
36460723cc8aSPaolo Bonzini              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
36470723cc8aSPaolo Bonzini              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
36480723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
36490723cc8aSPaolo Bonzini              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
36500723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
36510723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
36520723cc8aSPaolo Bonzini              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
36530723cc8aSPaolo Bonzini         .features[FEAT_VMX_SECONDARY_CTLS] =
36540723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
36550723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
36560723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
36570723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
36580723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
36590723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
36600723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
36610723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3662c6f3215fSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3663c6f3215fSPaolo Bonzini              VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
366453f9a6f4SBoqun Feng (Intel)         .xlevel = 0x80000008,
366553f9a6f4SBoqun Feng (Intel)         .model_id = "Intel Xeon Processor (Skylake)",
3666d86a7088SEduardo Habkost         .versions = (X86CPUVersionDefinition[]) {
3667d86a7088SEduardo Habkost             { .version = 1 },
3668d86a7088SEduardo Habkost             {
3669d86a7088SEduardo Habkost                 .version = 2,
367053db89d9SEduardo Habkost                 .alias = "Skylake-Server-IBRS",
3671d86a7088SEduardo Habkost                 .props = (PropValue[]) {
3672d86a7088SEduardo Habkost                     /* clflushopt was not added to Skylake-Server-IBRS */
3673d86a7088SEduardo Habkost                     /* TODO: add -v3 including clflushopt */
3674d86a7088SEduardo Habkost                     { "clflushopt", "off" },
3675d86a7088SEduardo Habkost                     { "spec-ctrl", "on" },
3676d86a7088SEduardo Habkost                     { "model-id",
3677d86a7088SEduardo Habkost                       "Intel Xeon Processor (Skylake, IBRS)" },
3678d86a7088SEduardo Habkost                     { /* end of list */ }
3679d86a7088SEduardo Habkost                 }
3680d86a7088SEduardo Habkost             },
36819ab2237fSEduardo Habkost             {
36829ab2237fSEduardo Habkost                 .version = 3,
368302fa60d1SEduardo Habkost                 .alias = "Skylake-Server-noTSX-IBRS",
36849ab2237fSEduardo Habkost                 .props = (PropValue[]) {
36859ab2237fSEduardo Habkost                     { "hle", "off" },
36869ab2237fSEduardo Habkost                     { "rtm", "off" },
3687673b0addSKashyap Chamarthy                     { "model-id",
3688673b0addSKashyap Chamarthy                       "Intel Xeon Processor (Skylake, IBRS, no TSX)" },
36899ab2237fSEduardo Habkost                     { /* end of list */ }
36909ab2237fSEduardo Habkost                 }
36919ab2237fSEduardo Habkost             },
3692644e3c5dSChenyi Qiang             {
3693644e3c5dSChenyi Qiang                 .version = 4,
36949bbaadbfSHan Han                 .note = "IBRS, EPT switching, no TSX",
3695644e3c5dSChenyi Qiang                 .props = (PropValue[]) {
3696644e3c5dSChenyi Qiang                     { "vmx-eptp-switching", "on" },
3697644e3c5dSChenyi Qiang                     { /* end of list */ }
3698644e3c5dSChenyi Qiang                 }
3699644e3c5dSChenyi Qiang             },
37007bde6b18SVitaly Kuznetsov             {
37017bde6b18SVitaly Kuznetsov                 .version = 5,
37027bde6b18SVitaly Kuznetsov                 .note = "IBRS, XSAVES, EPT switching, no TSX",
37037bde6b18SVitaly Kuznetsov                 .props = (PropValue[]) {
37047bde6b18SVitaly Kuznetsov                     { "xsaves", "on" },
37057bde6b18SVitaly Kuznetsov                     { "vmx-xsaves", "on" },
37067bde6b18SVitaly Kuznetsov                     { /* end of list */ }
37077bde6b18SVitaly Kuznetsov                 }
37087bde6b18SVitaly Kuznetsov             },
3709d86a7088SEduardo Habkost             { /* end of list */ }
3710d86a7088SEduardo Habkost         }
371153f9a6f4SBoqun Feng (Intel)     },
371253f9a6f4SBoqun Feng (Intel)     {
3713c7a88b52STao Xu         .name = "Cascadelake-Server",
3714c7a88b52STao Xu         .level = 0xd,
3715c7a88b52STao Xu         .vendor = CPUID_VENDOR_INTEL,
3716c7a88b52STao Xu         .family = 6,
3717c7a88b52STao Xu         .model = 85,
3718b0a19803STao Xu         .stepping = 6,
3719c7a88b52STao Xu         .features[FEAT_1_EDX] =
3720c7a88b52STao Xu             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
3721c7a88b52STao Xu             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
3722c7a88b52STao Xu             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
3723c7a88b52STao Xu             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
3724c7a88b52STao Xu             CPUID_DE | CPUID_FP87,
3725c7a88b52STao Xu         .features[FEAT_1_ECX] =
3726c7a88b52STao Xu             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
3727c7a88b52STao Xu             CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
3728c7a88b52STao Xu             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
3729c7a88b52STao Xu             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
3730c7a88b52STao Xu             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
3731c7a88b52STao Xu             CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
3732c7a88b52STao Xu         .features[FEAT_8000_0001_EDX] =
3733c7a88b52STao Xu             CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
3734c7a88b52STao Xu             CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3735c7a88b52STao Xu         .features[FEAT_8000_0001_ECX] =
3736c7a88b52STao Xu             CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
3737c7a88b52STao Xu         .features[FEAT_7_0_EBX] =
3738c7a88b52STao Xu             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
3739c7a88b52STao Xu             CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
3740c7a88b52STao Xu             CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
3741c7a88b52STao Xu             CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3742ecb85fe4SPaolo Bonzini             CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
3743c7a88b52STao Xu             CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
3744c7a88b52STao Xu             CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
37454c257911SPaolo Bonzini             CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
3746c7a88b52STao Xu         .features[FEAT_7_0_ECX] =
3747bb4928c7SEduardo Habkost             CPUID_7_0_ECX_PKU |
3748c7a88b52STao Xu             CPUID_7_0_ECX_AVX512VNNI,
3749c7a88b52STao Xu         .features[FEAT_7_0_EDX] =
3750c7a88b52STao Xu             CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
37517bde6b18SVitaly Kuznetsov         /* XSAVES is added in version 5 */
3752c7a88b52STao Xu         .features[FEAT_XSAVE] =
3753c7a88b52STao Xu             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
3754c7a88b52STao Xu             CPUID_XSAVE_XGETBV1,
3755c7a88b52STao Xu         .features[FEAT_6_EAX] =
3756c7a88b52STao Xu             CPUID_6_EAX_ARAT,
37570723cc8aSPaolo Bonzini         /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
37580723cc8aSPaolo Bonzini         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
37590723cc8aSPaolo Bonzini              MSR_VMX_BASIC_TRUE_CTLS,
37600723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
37610723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
37620723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
37630723cc8aSPaolo Bonzini         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
37640723cc8aSPaolo Bonzini              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
37650723cc8aSPaolo Bonzini              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
37660723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
37670723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
37680723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
37690723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
37700723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] =
37710723cc8aSPaolo Bonzini              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
37720723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
37730723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
37740723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
37750723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
37760723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
37770723cc8aSPaolo Bonzini              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
37780723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
37790723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
37800723cc8aSPaolo Bonzini              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
37810723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
37820723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
37830723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
37840723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
37850723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
37860723cc8aSPaolo Bonzini              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
37870723cc8aSPaolo Bonzini              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
37880723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
37890723cc8aSPaolo Bonzini              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
37900723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
37910723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
37920723cc8aSPaolo Bonzini              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
37930723cc8aSPaolo Bonzini         .features[FEAT_VMX_SECONDARY_CTLS] =
37940723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
37950723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
37960723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
37970723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
37980723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
37990723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
38000723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
38010723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
3802c6f3215fSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
3803c6f3215fSPaolo Bonzini              VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
3804c7a88b52STao Xu         .xlevel = 0x80000008,
3805c7a88b52STao Xu         .model_id = "Intel Xeon Processor (Cascadelake)",
3806fd63c6d1SEduardo Habkost         .versions = (X86CPUVersionDefinition[]) {
3807fd63c6d1SEduardo Habkost             { .version = 1 },
3808fd63c6d1SEduardo Habkost             { .version = 2,
380947f0d11dSTao Xu               .note = "ARCH_CAPABILITIES",
3810fd63c6d1SEduardo Habkost               .props = (PropValue[]) {
3811fd63c6d1SEduardo Habkost                   { "arch-capabilities", "on" },
3812fd63c6d1SEduardo Habkost                   { "rdctl-no", "on" },
3813fd63c6d1SEduardo Habkost                   { "ibrs-all", "on" },
3814fd63c6d1SEduardo Habkost                   { "skip-l1dfl-vmentry", "on" },
3815fd63c6d1SEduardo Habkost                   { "mds-no", "on" },
3816fd63c6d1SEduardo Habkost                   { /* end of list */ }
3817fd63c6d1SEduardo Habkost               },
3818fd63c6d1SEduardo Habkost             },
38199ab2237fSEduardo Habkost             { .version = 3,
382002fa60d1SEduardo Habkost               .alias = "Cascadelake-Server-noTSX",
382147f0d11dSTao Xu               .note = "ARCH_CAPABILITIES, no TSX",
38229ab2237fSEduardo Habkost               .props = (PropValue[]) {
38239ab2237fSEduardo Habkost                   { "hle", "off" },
38249ab2237fSEduardo Habkost                   { "rtm", "off" },
38259ab2237fSEduardo Habkost                   { /* end of list */ }
38269ab2237fSEduardo Habkost               },
38279ab2237fSEduardo Habkost             },
3828644e3c5dSChenyi Qiang             { .version = 4,
38299bbaadbfSHan Han               .note = "ARCH_CAPABILITIES, EPT switching, no TSX",
3830644e3c5dSChenyi Qiang               .props = (PropValue[]) {
3831644e3c5dSChenyi Qiang                   { "vmx-eptp-switching", "on" },
3832644e3c5dSChenyi Qiang                   { /* end of list */ }
3833644e3c5dSChenyi Qiang               },
3834644e3c5dSChenyi Qiang             },
38357bde6b18SVitaly Kuznetsov             { .version = 5,
38367bde6b18SVitaly Kuznetsov               .note = "ARCH_CAPABILITIES, EPT switching, XSAVES, no TSX",
38377bde6b18SVitaly Kuznetsov               .props = (PropValue[]) {
38387bde6b18SVitaly Kuznetsov                   { "xsaves", "on" },
38397bde6b18SVitaly Kuznetsov                   { "vmx-xsaves", "on" },
38407bde6b18SVitaly Kuznetsov                   { /* end of list */ }
38417bde6b18SVitaly Kuznetsov               },
38427bde6b18SVitaly Kuznetsov             },
3843fd63c6d1SEduardo Habkost             { /* end of list */ }
3844fd63c6d1SEduardo Habkost         }
3845c7a88b52STao Xu     },
3846c7a88b52STao Xu     {
384722a866b6SCathy Zhang         .name = "Cooperlake",
384822a866b6SCathy Zhang         .level = 0xd,
384922a866b6SCathy Zhang         .vendor = CPUID_VENDOR_INTEL,
385022a866b6SCathy Zhang         .family = 6,
385122a866b6SCathy Zhang         .model = 85,
385222a866b6SCathy Zhang         .stepping = 10,
385322a866b6SCathy Zhang         .features[FEAT_1_EDX] =
385422a866b6SCathy Zhang             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
385522a866b6SCathy Zhang             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
385622a866b6SCathy Zhang             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
385722a866b6SCathy Zhang             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
385822a866b6SCathy Zhang             CPUID_DE | CPUID_FP87,
385922a866b6SCathy Zhang         .features[FEAT_1_ECX] =
386022a866b6SCathy Zhang             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
386122a866b6SCathy Zhang             CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
386222a866b6SCathy Zhang             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
386322a866b6SCathy Zhang             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
386422a866b6SCathy Zhang             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
386522a866b6SCathy Zhang             CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
386622a866b6SCathy Zhang         .features[FEAT_8000_0001_EDX] =
386722a866b6SCathy Zhang             CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
386822a866b6SCathy Zhang             CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
386922a866b6SCathy Zhang         .features[FEAT_8000_0001_ECX] =
387022a866b6SCathy Zhang             CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
387122a866b6SCathy Zhang         .features[FEAT_7_0_EBX] =
387222a866b6SCathy Zhang             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
387322a866b6SCathy Zhang             CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
387422a866b6SCathy Zhang             CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
387522a866b6SCathy Zhang             CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
387622a866b6SCathy Zhang             CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
387722a866b6SCathy Zhang             CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
387822a866b6SCathy Zhang             CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
387922a866b6SCathy Zhang             CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
388022a866b6SCathy Zhang         .features[FEAT_7_0_ECX] =
388122a866b6SCathy Zhang             CPUID_7_0_ECX_PKU |
388222a866b6SCathy Zhang             CPUID_7_0_ECX_AVX512VNNI,
388322a866b6SCathy Zhang         .features[FEAT_7_0_EDX] =
388422a866b6SCathy Zhang             CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_STIBP |
388522a866b6SCathy Zhang             CPUID_7_0_EDX_SPEC_CTRL_SSBD | CPUID_7_0_EDX_ARCH_CAPABILITIES,
388622a866b6SCathy Zhang         .features[FEAT_ARCH_CAPABILITIES] =
388722a866b6SCathy Zhang             MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
38882dea9d9cSXiaoyao Li             MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
38892dea9d9cSXiaoyao Li             MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO,
389022a866b6SCathy Zhang         .features[FEAT_7_1_EAX] =
3891f429dbf8SYang Zhong             CPUID_7_1_EAX_AVX512_BF16,
38927bde6b18SVitaly Kuznetsov         /* XSAVES is added in version 2 */
389322a866b6SCathy Zhang         .features[FEAT_XSAVE] =
389422a866b6SCathy Zhang             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
389522a866b6SCathy Zhang             CPUID_XSAVE_XGETBV1,
389622a866b6SCathy Zhang         .features[FEAT_6_EAX] =
389722a866b6SCathy Zhang             CPUID_6_EAX_ARAT,
38982dea9d9cSXiaoyao Li         /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
38992dea9d9cSXiaoyao Li         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
39002dea9d9cSXiaoyao Li              MSR_VMX_BASIC_TRUE_CTLS,
39012dea9d9cSXiaoyao Li         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
39022dea9d9cSXiaoyao Li              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
39032dea9d9cSXiaoyao Li              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
39042dea9d9cSXiaoyao Li         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
39052dea9d9cSXiaoyao Li              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
39062dea9d9cSXiaoyao Li              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
39072dea9d9cSXiaoyao Li              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
39082dea9d9cSXiaoyao Li              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
39092dea9d9cSXiaoyao Li              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
39102dea9d9cSXiaoyao Li              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
39112dea9d9cSXiaoyao Li         .features[FEAT_VMX_EXIT_CTLS] =
39122dea9d9cSXiaoyao Li              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
39132dea9d9cSXiaoyao Li              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
39142dea9d9cSXiaoyao Li              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
39152dea9d9cSXiaoyao Li              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
39162dea9d9cSXiaoyao Li              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
39172dea9d9cSXiaoyao Li         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
39182dea9d9cSXiaoyao Li              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
39192dea9d9cSXiaoyao Li         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
39202dea9d9cSXiaoyao Li              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
39212dea9d9cSXiaoyao Li              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
39222dea9d9cSXiaoyao Li         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
39232dea9d9cSXiaoyao Li              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
39242dea9d9cSXiaoyao Li              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
39252dea9d9cSXiaoyao Li              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
39262dea9d9cSXiaoyao Li              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
39272dea9d9cSXiaoyao Li              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
39282dea9d9cSXiaoyao Li              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
39292dea9d9cSXiaoyao Li              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
39302dea9d9cSXiaoyao Li              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
39312dea9d9cSXiaoyao Li              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
39322dea9d9cSXiaoyao Li              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
39332dea9d9cSXiaoyao Li              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
39342dea9d9cSXiaoyao Li         .features[FEAT_VMX_SECONDARY_CTLS] =
39352dea9d9cSXiaoyao Li              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
39362dea9d9cSXiaoyao Li              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
39372dea9d9cSXiaoyao Li              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
39382dea9d9cSXiaoyao Li              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
39392dea9d9cSXiaoyao Li              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
39402dea9d9cSXiaoyao Li              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
39412dea9d9cSXiaoyao Li              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
39422dea9d9cSXiaoyao Li              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
39432dea9d9cSXiaoyao Li              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
39442dea9d9cSXiaoyao Li              VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
39452dea9d9cSXiaoyao Li         .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
394622a866b6SCathy Zhang         .xlevel = 0x80000008,
394722a866b6SCathy Zhang         .model_id = "Intel Xeon Processor (Cooperlake)",
39487bde6b18SVitaly Kuznetsov         .versions = (X86CPUVersionDefinition[]) {
39497bde6b18SVitaly Kuznetsov             { .version = 1 },
39507bde6b18SVitaly Kuznetsov             { .version = 2,
39517bde6b18SVitaly Kuznetsov               .note = "XSAVES",
39527bde6b18SVitaly Kuznetsov               .props = (PropValue[]) {
39537bde6b18SVitaly Kuznetsov                   { "xsaves", "on" },
39547bde6b18SVitaly Kuznetsov                   { "vmx-xsaves", "on" },
39557bde6b18SVitaly Kuznetsov                   { /* end of list */ }
39567bde6b18SVitaly Kuznetsov               },
39577bde6b18SVitaly Kuznetsov             },
39587bde6b18SVitaly Kuznetsov             { /* end of list */ }
39597bde6b18SVitaly Kuznetsov         }
396022a866b6SCathy Zhang     },
396122a866b6SCathy Zhang     {
39628a11c62dSRobert Hoo         .name = "Icelake-Server",
39638a11c62dSRobert Hoo         .level = 0xd,
39648a11c62dSRobert Hoo         .vendor = CPUID_VENDOR_INTEL,
39658a11c62dSRobert Hoo         .family = 6,
39668a11c62dSRobert Hoo         .model = 134,
39678a11c62dSRobert Hoo         .stepping = 0,
39688a11c62dSRobert Hoo         .features[FEAT_1_EDX] =
39698a11c62dSRobert Hoo             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
39708a11c62dSRobert Hoo             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
39718a11c62dSRobert Hoo             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
39728a11c62dSRobert Hoo             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
39738a11c62dSRobert Hoo             CPUID_DE | CPUID_FP87,
39748a11c62dSRobert Hoo         .features[FEAT_1_ECX] =
39758a11c62dSRobert Hoo             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
39768a11c62dSRobert Hoo             CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
39778a11c62dSRobert Hoo             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
39788a11c62dSRobert Hoo             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
39798a11c62dSRobert Hoo             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
39808a11c62dSRobert Hoo             CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
39818a11c62dSRobert Hoo         .features[FEAT_8000_0001_EDX] =
39828a11c62dSRobert Hoo             CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
39838a11c62dSRobert Hoo             CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
39848a11c62dSRobert Hoo         .features[FEAT_8000_0001_ECX] =
39858a11c62dSRobert Hoo             CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
39868a11c62dSRobert Hoo         .features[FEAT_8000_0008_EBX] =
39878a11c62dSRobert Hoo             CPUID_8000_0008_EBX_WBNOINVD,
39888a11c62dSRobert Hoo         .features[FEAT_7_0_EBX] =
39898a11c62dSRobert Hoo             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
39908a11c62dSRobert Hoo             CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
39918a11c62dSRobert Hoo             CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
39928a11c62dSRobert Hoo             CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
3993ecb85fe4SPaolo Bonzini             CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB |
39948a11c62dSRobert Hoo             CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
39958a11c62dSRobert Hoo             CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
39964c257911SPaolo Bonzini             CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
39978a11c62dSRobert Hoo         .features[FEAT_7_0_ECX] =
3998e7694a5eSTao Xu             CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
3999e7694a5eSTao Xu             CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
40008a11c62dSRobert Hoo             CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
40018a11c62dSRobert Hoo             CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
40028a11c62dSRobert Hoo             CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57,
40038a11c62dSRobert Hoo         .features[FEAT_7_0_EDX] =
400476e5a4d5SRobert Hoo             CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
40057bde6b18SVitaly Kuznetsov         /* XSAVES is added in version 5 */
40068a11c62dSRobert Hoo         .features[FEAT_XSAVE] =
40078a11c62dSRobert Hoo             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
40088a11c62dSRobert Hoo             CPUID_XSAVE_XGETBV1,
40098a11c62dSRobert Hoo         .features[FEAT_6_EAX] =
40108a11c62dSRobert Hoo             CPUID_6_EAX_ARAT,
40110723cc8aSPaolo Bonzini         /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */
40120723cc8aSPaolo Bonzini         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
40130723cc8aSPaolo Bonzini              MSR_VMX_BASIC_TRUE_CTLS,
40140723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
40150723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
40160723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
40170723cc8aSPaolo Bonzini         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
40180723cc8aSPaolo Bonzini              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
40190723cc8aSPaolo Bonzini              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
40200723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
40210723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
40220723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
40230723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
40240723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] =
40250723cc8aSPaolo Bonzini              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
40260723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
40270723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
40280723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
40290723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
40300723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
40310723cc8aSPaolo Bonzini              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
40320723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
40330723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
40340723cc8aSPaolo Bonzini              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
40350723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
40360723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
40370723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
40380723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
40390723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
40400723cc8aSPaolo Bonzini              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
40410723cc8aSPaolo Bonzini              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
40420723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
40430723cc8aSPaolo Bonzini              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
40440723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
40450723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
40460723cc8aSPaolo Bonzini              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
40470723cc8aSPaolo Bonzini         .features[FEAT_VMX_SECONDARY_CTLS] =
40480723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
40490723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
40500723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
40510723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
40520723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
40530723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
40540723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
40550723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
40560723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS,
40578a11c62dSRobert Hoo         .xlevel = 0x80000008,
40588a11c62dSRobert Hoo         .model_id = "Intel Xeon Processor (Icelake)",
40599ab2237fSEduardo Habkost         .versions = (X86CPUVersionDefinition[]) {
40609ab2237fSEduardo Habkost             { .version = 1 },
40619ab2237fSEduardo Habkost             {
40629ab2237fSEduardo Habkost                 .version = 2,
406347f0d11dSTao Xu                 .note = "no TSX",
406402fa60d1SEduardo Habkost                 .alias = "Icelake-Server-noTSX",
40659ab2237fSEduardo Habkost                 .props = (PropValue[]) {
40669ab2237fSEduardo Habkost                     { "hle", "off" },
40679ab2237fSEduardo Habkost                     { "rtm", "off" },
40689ab2237fSEduardo Habkost                     { /* end of list */ }
40699ab2237fSEduardo Habkost                 },
40709ab2237fSEduardo Habkost             },
4071d965dc35SXiaoyao Li             {
4072d965dc35SXiaoyao Li                 .version = 3,
4073d965dc35SXiaoyao Li                 .props = (PropValue[]) {
4074d965dc35SXiaoyao Li                     { "arch-capabilities", "on" },
4075d965dc35SXiaoyao Li                     { "rdctl-no", "on" },
4076d965dc35SXiaoyao Li                     { "ibrs-all", "on" },
4077d965dc35SXiaoyao Li                     { "skip-l1dfl-vmentry", "on" },
4078d965dc35SXiaoyao Li                     { "mds-no", "on" },
4079d965dc35SXiaoyao Li                     { "pschange-mc-no", "on" },
4080d965dc35SXiaoyao Li                     { "taa-no", "on" },
4081d965dc35SXiaoyao Li                     { /* end of list */ }
4082d965dc35SXiaoyao Li                 },
4083d965dc35SXiaoyao Li             },
4084e0013791SChenyi Qiang             {
4085e0013791SChenyi Qiang                 .version = 4,
4086e0013791SChenyi Qiang                 .props = (PropValue[]) {
4087e0013791SChenyi Qiang                     { "sha-ni", "on" },
4088e0013791SChenyi Qiang                     { "avx512ifma", "on" },
4089e0013791SChenyi Qiang                     { "rdpid", "on" },
4090e0013791SChenyi Qiang                     { "fsrm", "on" },
4091e0013791SChenyi Qiang                     { "vmx-rdseed-exit", "on" },
4092e0013791SChenyi Qiang                     { "vmx-pml", "on" },
4093e0013791SChenyi Qiang                     { "vmx-eptp-switching", "on" },
4094e0013791SChenyi Qiang                     { "model", "106" },
4095e0013791SChenyi Qiang                     { /* end of list */ }
4096e0013791SChenyi Qiang                 },
4097e0013791SChenyi Qiang             },
40987bde6b18SVitaly Kuznetsov             {
40997bde6b18SVitaly Kuznetsov                 .version = 5,
41007bde6b18SVitaly Kuznetsov                 .note = "XSAVES",
41017bde6b18SVitaly Kuznetsov                 .props = (PropValue[]) {
41027bde6b18SVitaly Kuznetsov                     { "xsaves", "on" },
41037bde6b18SVitaly Kuznetsov                     { "vmx-xsaves", "on" },
41047bde6b18SVitaly Kuznetsov                     { /* end of list */ }
41057bde6b18SVitaly Kuznetsov                 },
41067bde6b18SVitaly Kuznetsov             },
410712cab535SVitaly Kuznetsov             {
410812cab535SVitaly Kuznetsov                 .version = 6,
410912cab535SVitaly Kuznetsov                 .note = "5-level EPT",
411012cab535SVitaly Kuznetsov                 .props = (PropValue[]) {
411112cab535SVitaly Kuznetsov                     { "vmx-page-walk-5", "on" },
411212cab535SVitaly Kuznetsov                     { /* end of list */ }
411312cab535SVitaly Kuznetsov                 },
411412cab535SVitaly Kuznetsov             },
4115c895fa54SZhenzhong Duan             {
4116c895fa54SZhenzhong Duan                 .version = 7,
4117c895fa54SZhenzhong Duan                 .note = "TSX, taa-no",
4118c895fa54SZhenzhong Duan                 .props = (PropValue[]) {
4119c895fa54SZhenzhong Duan                     /* Restore TSX features removed by -v2 above */
4120c895fa54SZhenzhong Duan                     { "hle", "on" },
4121c895fa54SZhenzhong Duan                     { "rtm", "on" },
4122c895fa54SZhenzhong Duan                     { /* end of list */ }
4123c895fa54SZhenzhong Duan                 },
4124c895fa54SZhenzhong Duan             },
41259ab2237fSEduardo Habkost             { /* end of list */ }
41269ab2237fSEduardo Habkost         }
41278a11c62dSRobert Hoo     },
41288a11c62dSRobert Hoo     {
41297eb061b0SWang, Lei         .name = "SapphireRapids",
41307eb061b0SWang, Lei         .level = 0x20,
41317eb061b0SWang, Lei         .vendor = CPUID_VENDOR_INTEL,
41327eb061b0SWang, Lei         .family = 6,
41337eb061b0SWang, Lei         .model = 143,
41347eb061b0SWang, Lei         .stepping = 4,
41357eb061b0SWang, Lei         /*
41367eb061b0SWang, Lei          * please keep the ascending order so that we can have a clear view of
41377eb061b0SWang, Lei          * bit position of each feature.
41387eb061b0SWang, Lei          */
41397eb061b0SWang, Lei         .features[FEAT_1_EDX] =
41407eb061b0SWang, Lei             CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
41417eb061b0SWang, Lei             CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
41427eb061b0SWang, Lei             CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
41437eb061b0SWang, Lei             CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
41447eb061b0SWang, Lei             CPUID_SSE | CPUID_SSE2,
41457eb061b0SWang, Lei         .features[FEAT_1_ECX] =
41467eb061b0SWang, Lei             CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 |
41477eb061b0SWang, Lei             CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 |
41487eb061b0SWang, Lei             CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
41497eb061b0SWang, Lei             CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES |
41507eb061b0SWang, Lei             CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
41517eb061b0SWang, Lei         .features[FEAT_8000_0001_EDX] =
41527eb061b0SWang, Lei             CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
41537eb061b0SWang, Lei             CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
41547eb061b0SWang, Lei         .features[FEAT_8000_0001_ECX] =
41557eb061b0SWang, Lei             CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH,
41567eb061b0SWang, Lei         .features[FEAT_8000_0008_EBX] =
41577eb061b0SWang, Lei             CPUID_8000_0008_EBX_WBNOINVD,
41587eb061b0SWang, Lei         .features[FEAT_7_0_EBX] =
41597eb061b0SWang, Lei             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_HLE |
41607eb061b0SWang, Lei             CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 |
41617eb061b0SWang, Lei             CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_RTM |
41627eb061b0SWang, Lei             CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
41637eb061b0SWang, Lei             CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP |
41647eb061b0SWang, Lei             CPUID_7_0_EBX_AVX512IFMA | CPUID_7_0_EBX_CLFLUSHOPT |
41657eb061b0SWang, Lei             CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_SHA_NI |
41667eb061b0SWang, Lei             CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512VL,
41677eb061b0SWang, Lei         .features[FEAT_7_0_ECX] =
41687eb061b0SWang, Lei             CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
41697eb061b0SWang, Lei             CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
41707eb061b0SWang, Lei             CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
41717eb061b0SWang, Lei             CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
41727eb061b0SWang, Lei             CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57 |
41737eb061b0SWang, Lei             CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT,
41747eb061b0SWang, Lei         .features[FEAT_7_0_EDX] =
41757eb061b0SWang, Lei             CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE |
41767eb061b0SWang, Lei             CPUID_7_0_EDX_TSX_LDTRK | CPUID_7_0_EDX_AMX_BF16 |
41777eb061b0SWang, Lei             CPUID_7_0_EDX_AVX512_FP16 | CPUID_7_0_EDX_AMX_TILE |
41787eb061b0SWang, Lei             CPUID_7_0_EDX_AMX_INT8 | CPUID_7_0_EDX_SPEC_CTRL |
41797eb061b0SWang, Lei             CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
41807eb061b0SWang, Lei         .features[FEAT_ARCH_CAPABILITIES] =
41817eb061b0SWang, Lei             MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
41827eb061b0SWang, Lei             MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
41837eb061b0SWang, Lei             MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO,
41847eb061b0SWang, Lei         .features[FEAT_XSAVE] =
41857eb061b0SWang, Lei             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
41867eb061b0SWang, Lei             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES | CPUID_D_1_EAX_XFD,
41877eb061b0SWang, Lei         .features[FEAT_6_EAX] =
41887eb061b0SWang, Lei             CPUID_6_EAX_ARAT,
41897eb061b0SWang, Lei         .features[FEAT_7_1_EAX] =
41907eb061b0SWang, Lei             CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_AVX512_BF16 |
41917eb061b0SWang, Lei             CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_FSRC,
41927eb061b0SWang, Lei         .features[FEAT_VMX_BASIC] =
41937eb061b0SWang, Lei             MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS,
41947eb061b0SWang, Lei         .features[FEAT_VMX_ENTRY_CTLS] =
41957eb061b0SWang, Lei             VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE |
41967eb061b0SWang, Lei             VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL |
41977eb061b0SWang, Lei             VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER,
41987eb061b0SWang, Lei         .features[FEAT_VMX_EPT_VPID_CAPS] =
41997eb061b0SWang, Lei             MSR_VMX_EPT_EXECONLY |
42007eb061b0SWang, Lei             MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_PAGE_WALK_LENGTH_5 |
42017eb061b0SWang, Lei             MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB |
42027eb061b0SWang, Lei             MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS |
42037eb061b0SWang, Lei             MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
42047eb061b0SWang, Lei             MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
42057eb061b0SWang, Lei             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT |
42067eb061b0SWang, Lei             MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
42077eb061b0SWang, Lei             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
42087eb061b0SWang, Lei         .features[FEAT_VMX_EXIT_CTLS] =
42097eb061b0SWang, Lei             VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
42107eb061b0SWang, Lei             VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
42117eb061b0SWang, Lei             VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT |
42127eb061b0SWang, Lei             VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
42137eb061b0SWang, Lei             VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
42147eb061b0SWang, Lei         .features[FEAT_VMX_MISC] =
42157eb061b0SWang, Lei             MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT |
42167eb061b0SWang, Lei             MSR_VMX_MISC_VMWRITE_VMEXIT,
42177eb061b0SWang, Lei         .features[FEAT_VMX_PINBASED_CTLS] =
42187eb061b0SWang, Lei             VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING |
42197eb061b0SWang, Lei             VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER |
42207eb061b0SWang, Lei             VMX_PIN_BASED_POSTED_INTR,
42217eb061b0SWang, Lei         .features[FEAT_VMX_PROCBASED_CTLS] =
42227eb061b0SWang, Lei             VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
42237eb061b0SWang, Lei             VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
42247eb061b0SWang, Lei             VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
42257eb061b0SWang, Lei             VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
42267eb061b0SWang, Lei             VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
42277eb061b0SWang, Lei             VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
42287eb061b0SWang, Lei             VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING |
42297eb061b0SWang, Lei             VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
42307eb061b0SWang, Lei             VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG |
42317eb061b0SWang, Lei             VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
42327eb061b0SWang, Lei             VMX_CPU_BASED_PAUSE_EXITING |
42337eb061b0SWang, Lei             VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
42347eb061b0SWang, Lei         .features[FEAT_VMX_SECONDARY_CTLS] =
42357eb061b0SWang, Lei             VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
42367eb061b0SWang, Lei             VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC |
42377eb061b0SWang, Lei             VMX_SECONDARY_EXEC_RDTSCP |
42387eb061b0SWang, Lei             VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
42397eb061b0SWang, Lei             VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING |
42407eb061b0SWang, Lei             VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
42417eb061b0SWang, Lei             VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
42427eb061b0SWang, Lei             VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
42437eb061b0SWang, Lei             VMX_SECONDARY_EXEC_RDRAND_EXITING |
42447eb061b0SWang, Lei             VMX_SECONDARY_EXEC_ENABLE_INVPCID |
42457eb061b0SWang, Lei             VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
42467eb061b0SWang, Lei             VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML |
42477eb061b0SWang, Lei             VMX_SECONDARY_EXEC_XSAVES,
42487eb061b0SWang, Lei         .features[FEAT_VMX_VMFUNC] =
42497eb061b0SWang, Lei             MSR_VMX_VMFUNC_EPT_SWITCHING,
42507eb061b0SWang, Lei         .xlevel = 0x80000008,
42517eb061b0SWang, Lei         .model_id = "Intel Xeon Processor (SapphireRapids)",
42527eb061b0SWang, Lei         .versions = (X86CPUVersionDefinition[]) {
42537eb061b0SWang, Lei             { .version = 1 },
42543baf7ae6SLei Wang             {
42553baf7ae6SLei Wang                 .version = 2,
42563baf7ae6SLei Wang                 .props = (PropValue[]) {
42573baf7ae6SLei Wang                     { "sbdr-ssdp-no", "on" },
42583baf7ae6SLei Wang                     { "fbsdp-no", "on" },
42593baf7ae6SLei Wang                     { "psdp-no", "on" },
42603baf7ae6SLei Wang                     { /* end of list */ }
42613baf7ae6SLei Wang                 }
42627eb061b0SWang, Lei             },
4263b10b2481SLei Wang             {
4264b10b2481SLei Wang                 .version = 3,
4265b10b2481SLei Wang                 .props = (PropValue[]) {
4266b10b2481SLei Wang                     { "ss", "on" },
4267b10b2481SLei Wang                     { "tsc-adjust", "on" },
4268b10b2481SLei Wang                     { "cldemote", "on" },
4269b10b2481SLei Wang                     { "movdiri", "on" },
4270b10b2481SLei Wang                     { "movdir64b", "on" },
4271b10b2481SLei Wang                     { /* end of list */ }
4272b10b2481SLei Wang                 }
4273b10b2481SLei Wang             },
42743baf7ae6SLei Wang             { /* end of list */ }
42753baf7ae6SLei Wang         }
42767eb061b0SWang, Lei     },
42777eb061b0SWang, Lei     {
42786d5e9694STao Su         .name = "GraniteRapids",
42796d5e9694STao Su         .level = 0x20,
42806d5e9694STao Su         .vendor = CPUID_VENDOR_INTEL,
42816d5e9694STao Su         .family = 6,
42826d5e9694STao Su         .model = 173,
42836d5e9694STao Su         .stepping = 0,
42846d5e9694STao Su         /*
42856d5e9694STao Su          * please keep the ascending order so that we can have a clear view of
42866d5e9694STao Su          * bit position of each feature.
42876d5e9694STao Su          */
42886d5e9694STao Su         .features[FEAT_1_EDX] =
42896d5e9694STao Su             CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
42906d5e9694STao Su             CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
42916d5e9694STao Su             CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
42926d5e9694STao Su             CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
42936d5e9694STao Su             CPUID_SSE | CPUID_SSE2,
42946d5e9694STao Su         .features[FEAT_1_ECX] =
42956d5e9694STao Su             CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 |
42966d5e9694STao Su             CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 |
42976d5e9694STao Su             CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
42986d5e9694STao Su             CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES |
42996d5e9694STao Su             CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
43006d5e9694STao Su         .features[FEAT_8000_0001_EDX] =
43016d5e9694STao Su             CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
43026d5e9694STao Su             CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
43036d5e9694STao Su         .features[FEAT_8000_0001_ECX] =
43046d5e9694STao Su             CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH,
43056d5e9694STao Su         .features[FEAT_8000_0008_EBX] =
43066d5e9694STao Su             CPUID_8000_0008_EBX_WBNOINVD,
43076d5e9694STao Su         .features[FEAT_7_0_EBX] =
43086d5e9694STao Su             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_HLE |
43096d5e9694STao Su             CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 |
43106d5e9694STao Su             CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_RTM |
43116d5e9694STao Su             CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
43126d5e9694STao Su             CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP |
43136d5e9694STao Su             CPUID_7_0_EBX_AVX512IFMA | CPUID_7_0_EBX_CLFLUSHOPT |
43146d5e9694STao Su             CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_SHA_NI |
43156d5e9694STao Su             CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512VL,
43166d5e9694STao Su         .features[FEAT_7_0_ECX] =
43176d5e9694STao Su             CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
43186d5e9694STao Su             CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
43196d5e9694STao Su             CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
43206d5e9694STao Su             CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
43216d5e9694STao Su             CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57 |
43226d5e9694STao Su             CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT,
43236d5e9694STao Su         .features[FEAT_7_0_EDX] =
43246d5e9694STao Su             CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE |
43256d5e9694STao Su             CPUID_7_0_EDX_TSX_LDTRK | CPUID_7_0_EDX_AMX_BF16 |
43266d5e9694STao Su             CPUID_7_0_EDX_AVX512_FP16 | CPUID_7_0_EDX_AMX_TILE |
43276d5e9694STao Su             CPUID_7_0_EDX_AMX_INT8 | CPUID_7_0_EDX_SPEC_CTRL |
43286d5e9694STao Su             CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD,
43296d5e9694STao Su         .features[FEAT_ARCH_CAPABILITIES] =
43306d5e9694STao Su             MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
43316d5e9694STao Su             MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
43326d5e9694STao Su             MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO |
43336d5e9694STao Su             MSR_ARCH_CAP_SBDR_SSDP_NO | MSR_ARCH_CAP_FBSDP_NO |
43346d5e9694STao Su             MSR_ARCH_CAP_PSDP_NO | MSR_ARCH_CAP_PBRSB_NO,
43356d5e9694STao Su         .features[FEAT_XSAVE] =
43366d5e9694STao Su             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
43376d5e9694STao Su             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES | CPUID_D_1_EAX_XFD,
43386d5e9694STao Su         .features[FEAT_6_EAX] =
43396d5e9694STao Su             CPUID_6_EAX_ARAT,
43406d5e9694STao Su         .features[FEAT_7_1_EAX] =
43416d5e9694STao Su             CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_AVX512_BF16 |
43426d5e9694STao Su             CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_FSRC |
43436d5e9694STao Su             CPUID_7_1_EAX_AMX_FP16,
43446d5e9694STao Su         .features[FEAT_7_1_EDX] =
43456d5e9694STao Su             CPUID_7_1_EDX_PREFETCHITI,
43466d5e9694STao Su         .features[FEAT_7_2_EDX] =
43476d5e9694STao Su             CPUID_7_2_EDX_MCDT_NO,
43486d5e9694STao Su         .features[FEAT_VMX_BASIC] =
43496d5e9694STao Su             MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS,
43506d5e9694STao Su         .features[FEAT_VMX_ENTRY_CTLS] =
43516d5e9694STao Su             VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE |
43526d5e9694STao Su             VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL |
43536d5e9694STao Su             VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER,
43546d5e9694STao Su         .features[FEAT_VMX_EPT_VPID_CAPS] =
43556d5e9694STao Su             MSR_VMX_EPT_EXECONLY |
43566d5e9694STao Su             MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_PAGE_WALK_LENGTH_5 |
43576d5e9694STao Su             MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB |
43586d5e9694STao Su             MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS |
43596d5e9694STao Su             MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
43606d5e9694STao Su             MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
43616d5e9694STao Su             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT |
43626d5e9694STao Su             MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
43636d5e9694STao Su             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
43646d5e9694STao Su         .features[FEAT_VMX_EXIT_CTLS] =
43656d5e9694STao Su             VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
43666d5e9694STao Su             VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
43676d5e9694STao Su             VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT |
43686d5e9694STao Su             VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
43696d5e9694STao Su             VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
43706d5e9694STao Su         .features[FEAT_VMX_MISC] =
43716d5e9694STao Su             MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT |
43726d5e9694STao Su             MSR_VMX_MISC_VMWRITE_VMEXIT,
43736d5e9694STao Su         .features[FEAT_VMX_PINBASED_CTLS] =
43746d5e9694STao Su             VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING |
43756d5e9694STao Su             VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER |
43766d5e9694STao Su             VMX_PIN_BASED_POSTED_INTR,
43776d5e9694STao Su         .features[FEAT_VMX_PROCBASED_CTLS] =
43786d5e9694STao Su             VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
43796d5e9694STao Su             VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
43806d5e9694STao Su             VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
43816d5e9694STao Su             VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
43826d5e9694STao Su             VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
43836d5e9694STao Su             VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
43846d5e9694STao Su             VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING |
43856d5e9694STao Su             VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
43866d5e9694STao Su             VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG |
43876d5e9694STao Su             VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
43886d5e9694STao Su             VMX_CPU_BASED_PAUSE_EXITING |
43896d5e9694STao Su             VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
43906d5e9694STao Su         .features[FEAT_VMX_SECONDARY_CTLS] =
43916d5e9694STao Su             VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
43926d5e9694STao Su             VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC |
43936d5e9694STao Su             VMX_SECONDARY_EXEC_RDTSCP |
43946d5e9694STao Su             VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
43956d5e9694STao Su             VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING |
43966d5e9694STao Su             VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
43976d5e9694STao Su             VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
43986d5e9694STao Su             VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
43996d5e9694STao Su             VMX_SECONDARY_EXEC_RDRAND_EXITING |
44006d5e9694STao Su             VMX_SECONDARY_EXEC_ENABLE_INVPCID |
44016d5e9694STao Su             VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
44026d5e9694STao Su             VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML |
44036d5e9694STao Su             VMX_SECONDARY_EXEC_XSAVES,
44046d5e9694STao Su         .features[FEAT_VMX_VMFUNC] =
44056d5e9694STao Su             MSR_VMX_VMFUNC_EPT_SWITCHING,
44066d5e9694STao Su         .xlevel = 0x80000008,
44076d5e9694STao Su         .model_id = "Intel Xeon Processor (GraniteRapids)",
44086d5e9694STao Su         .versions = (X86CPUVersionDefinition[]) {
44096d5e9694STao Su             { .version = 1 },
44101a519388STao Su             {
44111a519388STao Su                 .version = 2,
44121a519388STao Su                 .props = (PropValue[]) {
44131a519388STao Su                     { "ss", "on" },
44141a519388STao Su                     { "tsc-adjust", "on" },
44151a519388STao Su                     { "cldemote", "on" },
44161a519388STao Su                     { "movdiri", "on" },
44171a519388STao Su                     { "movdir64b", "on" },
44181a519388STao Su                     { "avx10", "on" },
44191a519388STao Su                     { "avx10-128", "on" },
44201a519388STao Su                     { "avx10-256", "on" },
44211a519388STao Su                     { "avx10-512", "on" },
44221a519388STao Su                     { "avx10-version", "1" },
44231a519388STao Su                     { "stepping", "1" },
44241a519388STao Su                     { /* end of list */ }
44251a519388STao Su                 }
44261a519388STao Su             },
44276d5e9694STao Su             { /* end of list */ },
44286d5e9694STao Su         },
44296d5e9694STao Su     },
44306d5e9694STao Su     {
44316e82d3b6STao Su         .name = "SierraForest",
44326e82d3b6STao Su         .level = 0x23,
44336e82d3b6STao Su         .vendor = CPUID_VENDOR_INTEL,
44346e82d3b6STao Su         .family = 6,
44356e82d3b6STao Su         .model = 175,
44366e82d3b6STao Su         .stepping = 0,
44376e82d3b6STao Su         /*
44386e82d3b6STao Su          * please keep the ascending order so that we can have a clear view of
44396e82d3b6STao Su          * bit position of each feature.
44406e82d3b6STao Su          */
44416e82d3b6STao Su         .features[FEAT_1_EDX] =
44426e82d3b6STao Su             CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
44436e82d3b6STao Su             CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
44446e82d3b6STao Su             CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
44456e82d3b6STao Su             CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
44466e82d3b6STao Su             CPUID_SSE | CPUID_SSE2,
44476e82d3b6STao Su         .features[FEAT_1_ECX] =
44486e82d3b6STao Su             CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 |
44496e82d3b6STao Su             CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 |
44506e82d3b6STao Su             CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
44516e82d3b6STao Su             CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES |
44526e82d3b6STao Su             CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
44536e82d3b6STao Su         .features[FEAT_8000_0001_EDX] =
44546e82d3b6STao Su             CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
44556e82d3b6STao Su             CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
44566e82d3b6STao Su         .features[FEAT_8000_0001_ECX] =
44576e82d3b6STao Su             CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH,
44586e82d3b6STao Su         .features[FEAT_8000_0008_EBX] =
44596e82d3b6STao Su             CPUID_8000_0008_EBX_WBNOINVD,
44606e82d3b6STao Su         .features[FEAT_7_0_EBX] =
44616e82d3b6STao Su             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
44626e82d3b6STao Su             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
44636e82d3b6STao Su             CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
44646e82d3b6STao Su             CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_CLWB |
44656e82d3b6STao Su             CPUID_7_0_EBX_SHA_NI,
44666e82d3b6STao Su         .features[FEAT_7_0_ECX] =
44676e82d3b6STao Su             CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | CPUID_7_0_ECX_GFNI |
44686e82d3b6STao Su             CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
44696e82d3b6STao Su             CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT,
44706e82d3b6STao Su         .features[FEAT_7_0_EDX] =
44716e82d3b6STao Su             CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE |
44726e82d3b6STao Su             CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_ARCH_CAPABILITIES |
44736e82d3b6STao Su             CPUID_7_0_EDX_SPEC_CTRL_SSBD,
44746e82d3b6STao Su         .features[FEAT_ARCH_CAPABILITIES] =
44756e82d3b6STao Su             MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL |
44766e82d3b6STao Su             MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO |
44776e82d3b6STao Su             MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_SBDR_SSDP_NO |
44786e82d3b6STao Su             MSR_ARCH_CAP_FBSDP_NO | MSR_ARCH_CAP_PSDP_NO |
44796e82d3b6STao Su             MSR_ARCH_CAP_PBRSB_NO,
44806e82d3b6STao Su         .features[FEAT_XSAVE] =
44816e82d3b6STao Su             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
44826e82d3b6STao Su             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
44836e82d3b6STao Su         .features[FEAT_6_EAX] =
44846e82d3b6STao Su             CPUID_6_EAX_ARAT,
44856e82d3b6STao Su         .features[FEAT_7_1_EAX] =
44866e82d3b6STao Su             CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_CMPCCXADD |
44876e82d3b6STao Su             CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_AVX_IFMA,
44886e82d3b6STao Su         .features[FEAT_7_1_EDX] =
44896e82d3b6STao Su             CPUID_7_1_EDX_AVX_VNNI_INT8 | CPUID_7_1_EDX_AVX_NE_CONVERT,
44906e82d3b6STao Su         .features[FEAT_7_2_EDX] =
44916e82d3b6STao Su             CPUID_7_2_EDX_MCDT_NO,
44926e82d3b6STao Su         .features[FEAT_VMX_BASIC] =
44936e82d3b6STao Su             MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS,
44946e82d3b6STao Su         .features[FEAT_VMX_ENTRY_CTLS] =
44956e82d3b6STao Su             VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE |
44966e82d3b6STao Su             VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL |
44976e82d3b6STao Su             VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER,
44986e82d3b6STao Su         .features[FEAT_VMX_EPT_VPID_CAPS] =
44996e82d3b6STao Su             MSR_VMX_EPT_EXECONLY | MSR_VMX_EPT_PAGE_WALK_LENGTH_4 |
45006e82d3b6STao Su             MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB |
45016e82d3b6STao Su             MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS |
45026e82d3b6STao Su             MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
45036e82d3b6STao Su             MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
45046e82d3b6STao Su             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT |
45056e82d3b6STao Su             MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
45066e82d3b6STao Su             MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS,
45076e82d3b6STao Su         .features[FEAT_VMX_EXIT_CTLS] =
45086e82d3b6STao Su             VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
45096e82d3b6STao Su             VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
45106e82d3b6STao Su             VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT |
45116e82d3b6STao Su             VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
45126e82d3b6STao Su             VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
45136e82d3b6STao Su         .features[FEAT_VMX_MISC] =
45146e82d3b6STao Su             MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT |
45156e82d3b6STao Su             MSR_VMX_MISC_VMWRITE_VMEXIT,
45166e82d3b6STao Su         .features[FEAT_VMX_PINBASED_CTLS] =
45176e82d3b6STao Su             VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING |
45186e82d3b6STao Su             VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER |
45196e82d3b6STao Su             VMX_PIN_BASED_POSTED_INTR,
45206e82d3b6STao Su         .features[FEAT_VMX_PROCBASED_CTLS] =
45216e82d3b6STao Su             VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
45226e82d3b6STao Su             VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
45236e82d3b6STao Su             VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
45246e82d3b6STao Su             VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
45256e82d3b6STao Su             VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
45266e82d3b6STao Su             VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
45276e82d3b6STao Su             VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING |
45286e82d3b6STao Su             VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING |
45296e82d3b6STao Su             VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG |
45306e82d3b6STao Su             VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING |
45316e82d3b6STao Su             VMX_CPU_BASED_PAUSE_EXITING |
45326e82d3b6STao Su             VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
45336e82d3b6STao Su         .features[FEAT_VMX_SECONDARY_CTLS] =
45346e82d3b6STao Su             VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
45356e82d3b6STao Su             VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC |
45366e82d3b6STao Su             VMX_SECONDARY_EXEC_RDTSCP |
45376e82d3b6STao Su             VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
45386e82d3b6STao Su             VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING |
45396e82d3b6STao Su             VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
45406e82d3b6STao Su             VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
45416e82d3b6STao Su             VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
45426e82d3b6STao Su             VMX_SECONDARY_EXEC_RDRAND_EXITING |
45436e82d3b6STao Su             VMX_SECONDARY_EXEC_ENABLE_INVPCID |
45446e82d3b6STao Su             VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
45456e82d3b6STao Su             VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML |
45466e82d3b6STao Su             VMX_SECONDARY_EXEC_XSAVES,
45476e82d3b6STao Su         .features[FEAT_VMX_VMFUNC] =
45486e82d3b6STao Su             MSR_VMX_VMFUNC_EPT_SWITCHING,
45496e82d3b6STao Su         .xlevel = 0x80000008,
45506e82d3b6STao Su         .model_id = "Intel Xeon Processor (SierraForest)",
45516e82d3b6STao Su         .versions = (X86CPUVersionDefinition[]) {
45526e82d3b6STao Su             { .version = 1 },
45536e82d3b6STao Su             { /* end of list */ },
45546e82d3b6STao Su         },
45556e82d3b6STao Su     },
45566e82d3b6STao Su     {
45578b44d860STao Xu         .name = "Denverton",
45588b44d860STao Xu         .level = 21,
45598b44d860STao Xu         .vendor = CPUID_VENDOR_INTEL,
45608b44d860STao Xu         .family = 6,
45618b44d860STao Xu         .model = 95,
45628b44d860STao Xu         .stepping = 1,
45638b44d860STao Xu         .features[FEAT_1_EDX] =
45648b44d860STao Xu             CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC |
45658b44d860STao Xu             CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC |
45668b44d860STao Xu             CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
45678b44d860STao Xu             CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR |
45688b44d860STao Xu             CPUID_SSE | CPUID_SSE2,
45698b44d860STao Xu         .features[FEAT_1_ECX] =
45708b44d860STao Xu             CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR |
45718b44d860STao Xu             CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | CPUID_EXT_SSE41 |
45728b44d860STao Xu             CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
45738b44d860STao Xu             CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER |
45748b44d860STao Xu             CPUID_EXT_AES | CPUID_EXT_XSAVE | CPUID_EXT_RDRAND,
45758b44d860STao Xu         .features[FEAT_8000_0001_EDX] =
45768b44d860STao Xu             CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB |
45778b44d860STao Xu             CPUID_EXT2_RDTSCP | CPUID_EXT2_LM,
45788b44d860STao Xu         .features[FEAT_8000_0001_ECX] =
45798b44d860STao Xu             CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
45808b44d860STao Xu         .features[FEAT_7_0_EBX] =
45818b44d860STao Xu             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_ERMS |
45828b44d860STao Xu             CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_SMAP |
45838b44d860STao Xu             CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_SHA_NI,
45848b44d860STao Xu         .features[FEAT_7_0_EDX] =
45858b44d860STao Xu             CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_ARCH_CAPABILITIES |
45868b44d860STao Xu             CPUID_7_0_EDX_SPEC_CTRL_SSBD,
45877bde6b18SVitaly Kuznetsov         /* XSAVES is added in version 3 */
45888b44d860STao Xu         .features[FEAT_XSAVE] =
45898b44d860STao Xu             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | CPUID_XSAVE_XGETBV1,
45908b44d860STao Xu         .features[FEAT_6_EAX] =
45918b44d860STao Xu             CPUID_6_EAX_ARAT,
45928b44d860STao Xu         .features[FEAT_ARCH_CAPABILITIES] =
45938b44d860STao Xu             MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY,
45940723cc8aSPaolo Bonzini         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
45950723cc8aSPaolo Bonzini              MSR_VMX_BASIC_TRUE_CTLS,
45960723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
45970723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
45980723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
45990723cc8aSPaolo Bonzini         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
46000723cc8aSPaolo Bonzini              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
46010723cc8aSPaolo Bonzini              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
46020723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
46030723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
46040723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
46050723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
46060723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] =
46070723cc8aSPaolo Bonzini              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
46080723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
46090723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
46100723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
46110723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
46120723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
46130723cc8aSPaolo Bonzini              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
46140723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
46150723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
46160723cc8aSPaolo Bonzini              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
46170723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
46180723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
46190723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
46200723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
46210723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
46220723cc8aSPaolo Bonzini              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
46230723cc8aSPaolo Bonzini              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
46240723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
46250723cc8aSPaolo Bonzini              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
46260723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
46270723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
46280723cc8aSPaolo Bonzini              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
46290723cc8aSPaolo Bonzini         .features[FEAT_VMX_SECONDARY_CTLS] =
46300723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
46310723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
46320723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
46330723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
46340723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
46350723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
46360723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
46370723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
46380723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
46390723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
46400723cc8aSPaolo Bonzini         .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
46418b44d860STao Xu         .xlevel = 0x80000008,
46428b44d860STao Xu         .model_id = "Intel Atom Processor (Denverton)",
4643ab0c942cSTao Xu         .versions = (X86CPUVersionDefinition[]) {
4644ab0c942cSTao Xu             { .version = 1 },
4645ab0c942cSTao Xu             {
4646ab0c942cSTao Xu                 .version = 2,
464747f0d11dSTao Xu                 .note = "no MPX, no MONITOR",
4648ab0c942cSTao Xu                 .props = (PropValue[]) {
4649ab0c942cSTao Xu                     { "monitor", "off" },
4650ab0c942cSTao Xu                     { "mpx", "off" },
4651ab0c942cSTao Xu                     { /* end of list */ },
4652ab0c942cSTao Xu                 },
4653ab0c942cSTao Xu             },
46547bde6b18SVitaly Kuznetsov             {
46557bde6b18SVitaly Kuznetsov                 .version = 3,
46567bde6b18SVitaly Kuznetsov                 .note = "XSAVES, no MPX, no MONITOR",
46577bde6b18SVitaly Kuznetsov                 .props = (PropValue[]) {
46587bde6b18SVitaly Kuznetsov                     { "xsaves", "on" },
46597bde6b18SVitaly Kuznetsov                     { "vmx-xsaves", "on" },
46607bde6b18SVitaly Kuznetsov                     { /* end of list */ },
46617bde6b18SVitaly Kuznetsov                 },
46627bde6b18SVitaly Kuznetsov             },
4663ab0c942cSTao Xu             { /* end of list */ },
4664ab0c942cSTao Xu         },
46658b44d860STao Xu     },
46668b44d860STao Xu     {
4667ff656fcdSPaul Lai         .name = "Snowridge",
46680b18874bSPaul Lai         .level = 27,
46690b18874bSPaul Lai         .vendor = CPUID_VENDOR_INTEL,
46700b18874bSPaul Lai         .family = 6,
46710b18874bSPaul Lai         .model = 134,
46720b18874bSPaul Lai         .stepping = 1,
46730b18874bSPaul Lai         .features[FEAT_1_EDX] =
46740b18874bSPaul Lai             /* missing: CPUID_PN CPUID_IA64 */
46750b18874bSPaul Lai             /* missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
46760b18874bSPaul Lai             CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE |
46770b18874bSPaul Lai             CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE |
46780b18874bSPaul Lai             CPUID_CX8 | CPUID_APIC | CPUID_SEP |
46790b18874bSPaul Lai             CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV |
46800b18874bSPaul Lai             CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH |
46810b18874bSPaul Lai             CPUID_MMX |
46820b18874bSPaul Lai             CPUID_FXSR | CPUID_SSE | CPUID_SSE2,
46830b18874bSPaul Lai         .features[FEAT_1_ECX] =
46840b18874bSPaul Lai             CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR |
46850b18874bSPaul Lai             CPUID_EXT_SSSE3 |
46860b18874bSPaul Lai             CPUID_EXT_CX16 |
46870b18874bSPaul Lai             CPUID_EXT_SSE41 |
46880b18874bSPaul Lai             CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE |
46890b18874bSPaul Lai             CPUID_EXT_POPCNT |
46900b18874bSPaul Lai             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES | CPUID_EXT_XSAVE |
46910b18874bSPaul Lai             CPUID_EXT_RDRAND,
46920b18874bSPaul Lai         .features[FEAT_8000_0001_EDX] =
46930b18874bSPaul Lai             CPUID_EXT2_SYSCALL |
46940b18874bSPaul Lai             CPUID_EXT2_NX |
46950b18874bSPaul Lai             CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
46960b18874bSPaul Lai             CPUID_EXT2_LM,
46970b18874bSPaul Lai         .features[FEAT_8000_0001_ECX] =
46980b18874bSPaul Lai             CPUID_EXT3_LAHF_LM |
46990b18874bSPaul Lai             CPUID_EXT3_3DNOWPREFETCH,
47000b18874bSPaul Lai         .features[FEAT_7_0_EBX] =
47010b18874bSPaul Lai             CPUID_7_0_EBX_FSGSBASE |
47020b18874bSPaul Lai             CPUID_7_0_EBX_SMEP |
47030b18874bSPaul Lai             CPUID_7_0_EBX_ERMS |
47040b18874bSPaul Lai             CPUID_7_0_EBX_MPX |  /* missing bits 13, 15 */
47050b18874bSPaul Lai             CPUID_7_0_EBX_RDSEED |
47060b18874bSPaul Lai             CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
47070b18874bSPaul Lai             CPUID_7_0_EBX_CLWB |
47080b18874bSPaul Lai             CPUID_7_0_EBX_SHA_NI,
47090b18874bSPaul Lai         .features[FEAT_7_0_ECX] =
47100b18874bSPaul Lai             CPUID_7_0_ECX_UMIP |
47110b18874bSPaul Lai             /* missing bit 5 */
47120b18874bSPaul Lai             CPUID_7_0_ECX_GFNI |
47130b18874bSPaul Lai             CPUID_7_0_ECX_MOVDIRI | CPUID_7_0_ECX_CLDEMOTE |
47140b18874bSPaul Lai             CPUID_7_0_ECX_MOVDIR64B,
47150b18874bSPaul Lai         .features[FEAT_7_0_EDX] =
47160b18874bSPaul Lai             CPUID_7_0_EDX_SPEC_CTRL |
47170b18874bSPaul Lai             CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD |
47180b18874bSPaul Lai             CPUID_7_0_EDX_CORE_CAPABILITY,
47190b18874bSPaul Lai         .features[FEAT_CORE_CAPABILITY] =
47200b18874bSPaul Lai             MSR_CORE_CAP_SPLIT_LOCK_DETECT,
47217a21bee2SDaniel P. Berrangé         /* XSAVES is added in version 3 */
47220b18874bSPaul Lai         .features[FEAT_XSAVE] =
47230b18874bSPaul Lai             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
47240b18874bSPaul Lai             CPUID_XSAVE_XGETBV1,
47250b18874bSPaul Lai         .features[FEAT_6_EAX] =
47260b18874bSPaul Lai             CPUID_6_EAX_ARAT,
47270723cc8aSPaolo Bonzini         .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS |
47280723cc8aSPaolo Bonzini              MSR_VMX_BASIC_TRUE_CTLS,
47290723cc8aSPaolo Bonzini         .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE |
47300723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT |
47310723cc8aSPaolo Bonzini              VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER,
47320723cc8aSPaolo Bonzini         .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY |
47330723cc8aSPaolo Bonzini              MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB |
47340723cc8aSPaolo Bonzini              MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT |
47350723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT |
47360723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR |
47370723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT |
47380723cc8aSPaolo Bonzini              MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS,
47390723cc8aSPaolo Bonzini         .features[FEAT_VMX_EXIT_CTLS] =
47400723cc8aSPaolo Bonzini              VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS |
47410723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL |
47420723cc8aSPaolo Bonzini              VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER |
47430723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER |
47440723cc8aSPaolo Bonzini              VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER,
47450723cc8aSPaolo Bonzini         .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT |
47460723cc8aSPaolo Bonzini              MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT,
47470723cc8aSPaolo Bonzini         .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK |
47480723cc8aSPaolo Bonzini              VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS |
47490723cc8aSPaolo Bonzini              VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR,
47500723cc8aSPaolo Bonzini         .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING |
47510723cc8aSPaolo Bonzini              VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING |
47520723cc8aSPaolo Bonzini              VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING |
47530723cc8aSPaolo Bonzini              VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING |
47540723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING |
47550723cc8aSPaolo Bonzini              VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING |
47560723cc8aSPaolo Bonzini              VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS |
47570723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING |
47580723cc8aSPaolo Bonzini              VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS |
47590723cc8aSPaolo Bonzini              VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING |
47600723cc8aSPaolo Bonzini              VMX_CPU_BASED_MONITOR_TRAP_FLAG |
47610723cc8aSPaolo Bonzini              VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS,
47620723cc8aSPaolo Bonzini         .features[FEAT_VMX_SECONDARY_CTLS] =
47630723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
47640723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT |
47650723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP |
47660723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
47670723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST |
47680723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT |
47690723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
47700723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID |
47710723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS |
47720723cc8aSPaolo Bonzini              VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML,
47730723cc8aSPaolo Bonzini         .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING,
47740b18874bSPaul Lai         .xlevel = 0x80000008,
47750b18874bSPaul Lai         .model_id = "Intel Atom Processor (SnowRidge)",
477669edb0f3SXiaoyao Li         .versions = (X86CPUVersionDefinition[]) {
477769edb0f3SXiaoyao Li             { .version = 1 },
477869edb0f3SXiaoyao Li             {
477969edb0f3SXiaoyao Li                 .version = 2,
478069edb0f3SXiaoyao Li                 .props = (PropValue[]) {
478169edb0f3SXiaoyao Li                     { "mpx", "off" },
478269edb0f3SXiaoyao Li                     { "model-id", "Intel Atom Processor (Snowridge, no MPX)" },
478369edb0f3SXiaoyao Li                     { /* end of list */ },
478469edb0f3SXiaoyao Li                 },
478569edb0f3SXiaoyao Li             },
47867bde6b18SVitaly Kuznetsov             {
47877bde6b18SVitaly Kuznetsov                 .version = 3,
47887bde6b18SVitaly Kuznetsov                 .note = "XSAVES, no MPX",
47897bde6b18SVitaly Kuznetsov                 .props = (PropValue[]) {
47907bde6b18SVitaly Kuznetsov                     { "xsaves", "on" },
47917bde6b18SVitaly Kuznetsov                     { "vmx-xsaves", "on" },
47927bde6b18SVitaly Kuznetsov                     { /* end of list */ },
47937bde6b18SVitaly Kuznetsov                 },
47947bde6b18SVitaly Kuznetsov             },
479556bb24e5SChenyi Qiang             {
479656bb24e5SChenyi Qiang                 .version = 4,
479707db29f2SChenyi Qiang                 .note = "no split lock detect, no core-capability",
479856bb24e5SChenyi Qiang                 .props = (PropValue[]) {
479956bb24e5SChenyi Qiang                     { "split-lock-detect", "off" },
480007db29f2SChenyi Qiang                     { "core-capability", "off" },
480156bb24e5SChenyi Qiang                     { /* end of list */ },
480256bb24e5SChenyi Qiang                 },
480356bb24e5SChenyi Qiang             },
480469edb0f3SXiaoyao Li             { /* end of list */ },
480569edb0f3SXiaoyao Li         },
48060b18874bSPaul Lai     },
48070b18874bSPaul Lai     {
4808a1849515SBoqun Feng         .name = "KnightsMill",
4809a1849515SBoqun Feng         .level = 0xd,
4810a1849515SBoqun Feng         .vendor = CPUID_VENDOR_INTEL,
4811a1849515SBoqun Feng         .family = 6,
4812a1849515SBoqun Feng         .model = 133,
4813a1849515SBoqun Feng         .stepping = 0,
4814a1849515SBoqun Feng         .features[FEAT_1_EDX] =
4815a1849515SBoqun Feng             CPUID_VME | CPUID_SS | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR |
4816a1849515SBoqun Feng             CPUID_MMX | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV |
4817a1849515SBoqun Feng             CPUID_MCA | CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC |
4818a1849515SBoqun Feng             CPUID_CX8 | CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC |
4819a1849515SBoqun Feng             CPUID_PSE | CPUID_DE | CPUID_FP87,
4820a1849515SBoqun Feng         .features[FEAT_1_ECX] =
4821a1849515SBoqun Feng             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
4822a1849515SBoqun Feng             CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
4823a1849515SBoqun Feng             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
4824a1849515SBoqun Feng             CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
4825a1849515SBoqun Feng             CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
4826a1849515SBoqun Feng             CPUID_EXT_F16C | CPUID_EXT_RDRAND,
4827a1849515SBoqun Feng         .features[FEAT_8000_0001_EDX] =
4828a1849515SBoqun Feng             CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
4829a1849515SBoqun Feng             CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
4830a1849515SBoqun Feng         .features[FEAT_8000_0001_ECX] =
4831a1849515SBoqun Feng             CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
4832a1849515SBoqun Feng         .features[FEAT_7_0_EBX] =
4833a1849515SBoqun Feng             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
4834a1849515SBoqun Feng             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
4835a1849515SBoqun Feng             CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_AVX512F |
4836a1849515SBoqun Feng             CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_AVX512PF |
4837a1849515SBoqun Feng             CPUID_7_0_EBX_AVX512ER,
4838a1849515SBoqun Feng         .features[FEAT_7_0_ECX] =
4839a1849515SBoqun Feng             CPUID_7_0_ECX_AVX512_VPOPCNTDQ,
4840a1849515SBoqun Feng         .features[FEAT_7_0_EDX] =
4841a1849515SBoqun Feng             CPUID_7_0_EDX_AVX512_4VNNIW | CPUID_7_0_EDX_AVX512_4FMAPS,
4842a1849515SBoqun Feng         .features[FEAT_XSAVE] =
4843a1849515SBoqun Feng             CPUID_XSAVE_XSAVEOPT,
4844a1849515SBoqun Feng         .features[FEAT_6_EAX] =
4845a1849515SBoqun Feng             CPUID_6_EAX_ARAT,
4846a1849515SBoqun Feng         .xlevel = 0x80000008,
4847a1849515SBoqun Feng         .model_id = "Intel Xeon Phi Processor (Knights Mill)",
4848a1849515SBoqun Feng     },
4849a1849515SBoqun Feng     {
4850fcf5ef2aSThomas Huth         .name = "Opteron_G1",
4851fcf5ef2aSThomas Huth         .level = 5,
4852fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_AMD,
4853fcf5ef2aSThomas Huth         .family = 15,
4854fcf5ef2aSThomas Huth         .model = 6,
4855fcf5ef2aSThomas Huth         .stepping = 1,
4856fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
4857fcf5ef2aSThomas Huth             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4858fcf5ef2aSThomas Huth             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4859fcf5ef2aSThomas Huth             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4860fcf5ef2aSThomas Huth             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4861fcf5ef2aSThomas Huth             CPUID_DE | CPUID_FP87,
4862fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
4863fcf5ef2aSThomas Huth             CPUID_EXT_SSE3,
4864fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
48652a923a29SEduardo Habkost             CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
4866fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
4867fcf5ef2aSThomas Huth         .model_id = "AMD Opteron 240 (Gen 1 Class Opteron)",
4868fcf5ef2aSThomas Huth     },
4869fcf5ef2aSThomas Huth     {
4870fcf5ef2aSThomas Huth         .name = "Opteron_G2",
4871fcf5ef2aSThomas Huth         .level = 5,
4872fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_AMD,
4873fcf5ef2aSThomas Huth         .family = 15,
4874fcf5ef2aSThomas Huth         .model = 6,
4875fcf5ef2aSThomas Huth         .stepping = 1,
4876fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
4877fcf5ef2aSThomas Huth             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4878fcf5ef2aSThomas Huth             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4879fcf5ef2aSThomas Huth             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4880fcf5ef2aSThomas Huth             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4881fcf5ef2aSThomas Huth             CPUID_DE | CPUID_FP87,
4882fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
4883fcf5ef2aSThomas Huth             CPUID_EXT_CX16 | CPUID_EXT_SSE3,
4884fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
48852a923a29SEduardo Habkost             CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
4886fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
4887fcf5ef2aSThomas Huth             CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
4888fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
4889fcf5ef2aSThomas Huth         .model_id = "AMD Opteron 22xx (Gen 2 Class Opteron)",
4890fcf5ef2aSThomas Huth     },
4891fcf5ef2aSThomas Huth     {
4892fcf5ef2aSThomas Huth         .name = "Opteron_G3",
4893fcf5ef2aSThomas Huth         .level = 5,
4894fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_AMD,
4895fcf5ef2aSThomas Huth         .family = 16,
4896fcf5ef2aSThomas Huth         .model = 2,
4897fcf5ef2aSThomas Huth         .stepping = 3,
4898fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
4899fcf5ef2aSThomas Huth             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4900fcf5ef2aSThomas Huth             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4901fcf5ef2aSThomas Huth             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4902fcf5ef2aSThomas Huth             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4903fcf5ef2aSThomas Huth             CPUID_DE | CPUID_FP87,
4904fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
4905fcf5ef2aSThomas Huth             CPUID_EXT_POPCNT | CPUID_EXT_CX16 | CPUID_EXT_MONITOR |
4906fcf5ef2aSThomas Huth             CPUID_EXT_SSE3,
4907fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
4908483c6ad4SBorislav Petkov             CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL |
4909483c6ad4SBorislav Petkov             CPUID_EXT2_RDTSCP,
4910fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
4911fcf5ef2aSThomas Huth             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A |
4912fcf5ef2aSThomas Huth             CPUID_EXT3_ABM | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
4913fcf5ef2aSThomas Huth         .xlevel = 0x80000008,
4914fcf5ef2aSThomas Huth         .model_id = "AMD Opteron 23xx (Gen 3 Class Opteron)",
4915fcf5ef2aSThomas Huth     },
4916fcf5ef2aSThomas Huth     {
4917fcf5ef2aSThomas Huth         .name = "Opteron_G4",
4918fcf5ef2aSThomas Huth         .level = 0xd,
4919fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_AMD,
4920fcf5ef2aSThomas Huth         .family = 21,
4921fcf5ef2aSThomas Huth         .model = 1,
4922fcf5ef2aSThomas Huth         .stepping = 2,
4923fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
4924fcf5ef2aSThomas Huth             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4925fcf5ef2aSThomas Huth             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4926fcf5ef2aSThomas Huth             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4927fcf5ef2aSThomas Huth             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4928fcf5ef2aSThomas Huth             CPUID_DE | CPUID_FP87,
4929fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
4930fcf5ef2aSThomas Huth             CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
4931fcf5ef2aSThomas Huth             CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
4932fcf5ef2aSThomas Huth             CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
4933fcf5ef2aSThomas Huth             CPUID_EXT_SSE3,
4934fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
49352a923a29SEduardo Habkost             CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
4936483c6ad4SBorislav Petkov             CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
4937fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
4938fcf5ef2aSThomas Huth             CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
4939fcf5ef2aSThomas Huth             CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
4940fcf5ef2aSThomas Huth             CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
4941fcf5ef2aSThomas Huth             CPUID_EXT3_LAHF_LM,
49429fe8b7beSVitaly Kuznetsov         .features[FEAT_SVM] =
49439fe8b7beSVitaly Kuznetsov             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4944fcf5ef2aSThomas Huth         /* no xsaveopt! */
4945fcf5ef2aSThomas Huth         .xlevel = 0x8000001A,
4946fcf5ef2aSThomas Huth         .model_id = "AMD Opteron 62xx class CPU",
4947fcf5ef2aSThomas Huth     },
4948fcf5ef2aSThomas Huth     {
4949fcf5ef2aSThomas Huth         .name = "Opteron_G5",
4950fcf5ef2aSThomas Huth         .level = 0xd,
4951fcf5ef2aSThomas Huth         .vendor = CPUID_VENDOR_AMD,
4952fcf5ef2aSThomas Huth         .family = 21,
4953fcf5ef2aSThomas Huth         .model = 2,
4954fcf5ef2aSThomas Huth         .stepping = 0,
4955fcf5ef2aSThomas Huth         .features[FEAT_1_EDX] =
4956fcf5ef2aSThomas Huth             CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
4957fcf5ef2aSThomas Huth             CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
4958fcf5ef2aSThomas Huth             CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
4959fcf5ef2aSThomas Huth             CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
4960fcf5ef2aSThomas Huth             CPUID_DE | CPUID_FP87,
4961fcf5ef2aSThomas Huth         .features[FEAT_1_ECX] =
4962fcf5ef2aSThomas Huth             CPUID_EXT_F16C | CPUID_EXT_AVX | CPUID_EXT_XSAVE |
4963fcf5ef2aSThomas Huth             CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
4964fcf5ef2aSThomas Huth             CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_FMA |
4965fcf5ef2aSThomas Huth             CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
4966fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_EDX] =
49672a923a29SEduardo Habkost             CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
4968483c6ad4SBorislav Petkov             CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP,
4969fcf5ef2aSThomas Huth         .features[FEAT_8000_0001_ECX] =
4970fcf5ef2aSThomas Huth             CPUID_EXT3_TBM | CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
4971fcf5ef2aSThomas Huth             CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
4972fcf5ef2aSThomas Huth             CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
4973fcf5ef2aSThomas Huth             CPUID_EXT3_LAHF_LM,
49749fe8b7beSVitaly Kuznetsov         .features[FEAT_SVM] =
49759fe8b7beSVitaly Kuznetsov             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
4976fcf5ef2aSThomas Huth         /* no xsaveopt! */
4977fcf5ef2aSThomas Huth         .xlevel = 0x8000001A,
4978fcf5ef2aSThomas Huth         .model_id = "AMD Opteron 63xx class CPU",
4979fcf5ef2aSThomas Huth     },
49802e2efc7dSBrijesh Singh     {
49812e2efc7dSBrijesh Singh         .name = "EPYC",
49822e2efc7dSBrijesh Singh         .level = 0xd,
49832e2efc7dSBrijesh Singh         .vendor = CPUID_VENDOR_AMD,
49842e2efc7dSBrijesh Singh         .family = 23,
49852e2efc7dSBrijesh Singh         .model = 1,
49862e2efc7dSBrijesh Singh         .stepping = 2,
49872e2efc7dSBrijesh Singh         .features[FEAT_1_EDX] =
49882e2efc7dSBrijesh Singh             CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
49892e2efc7dSBrijesh Singh             CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
49902e2efc7dSBrijesh Singh             CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
49912e2efc7dSBrijesh Singh             CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
49922e2efc7dSBrijesh Singh             CPUID_VME | CPUID_FP87,
49932e2efc7dSBrijesh Singh         .features[FEAT_1_ECX] =
49942e2efc7dSBrijesh Singh             CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
49952e2efc7dSBrijesh Singh             CPUID_EXT_XSAVE | CPUID_EXT_AES |  CPUID_EXT_POPCNT |
49962e2efc7dSBrijesh Singh             CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
49972e2efc7dSBrijesh Singh             CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
49982e2efc7dSBrijesh Singh             CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
49992e2efc7dSBrijesh Singh         .features[FEAT_8000_0001_EDX] =
50002e2efc7dSBrijesh Singh             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
50012e2efc7dSBrijesh Singh             CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
50022e2efc7dSBrijesh Singh             CPUID_EXT2_SYSCALL,
50032e2efc7dSBrijesh Singh         .features[FEAT_8000_0001_ECX] =
50042e2efc7dSBrijesh Singh             CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
50052e2efc7dSBrijesh Singh             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
5006e0051647SBabu Moger             CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
5007e0051647SBabu Moger             CPUID_EXT3_TOPOEXT,
50082e2efc7dSBrijesh Singh         .features[FEAT_7_0_EBX] =
50092e2efc7dSBrijesh Singh             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
50102e2efc7dSBrijesh Singh             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
50112e2efc7dSBrijesh Singh             CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
50122e2efc7dSBrijesh Singh             CPUID_7_0_EBX_SHA_NI,
50132e2efc7dSBrijesh Singh         .features[FEAT_XSAVE] =
50142e2efc7dSBrijesh Singh             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
50152e2efc7dSBrijesh Singh             CPUID_XSAVE_XGETBV1,
50162e2efc7dSBrijesh Singh         .features[FEAT_6_EAX] =
50172e2efc7dSBrijesh Singh             CPUID_6_EAX_ARAT,
50189fe8b7beSVitaly Kuznetsov         .features[FEAT_SVM] =
50199fe8b7beSVitaly Kuznetsov             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
5020e0051647SBabu Moger         .xlevel = 0x8000001E,
50212e2efc7dSBrijesh Singh         .model_id = "AMD EPYC Processor",
5022fe52acd2SBabu Moger         .cache_info = &epyc_cache_info,
5023d86a7088SEduardo Habkost         .versions = (X86CPUVersionDefinition[]) {
5024d86a7088SEduardo Habkost             { .version = 1 },
5025d86a7088SEduardo Habkost             {
5026d86a7088SEduardo Habkost                 .version = 2,
502753db89d9SEduardo Habkost                 .alias = "EPYC-IBPB",
5028d86a7088SEduardo Habkost                 .props = (PropValue[]) {
5029d86a7088SEduardo Habkost                     { "ibpb", "on" },
5030d86a7088SEduardo Habkost                     { "model-id",
5031d86a7088SEduardo Habkost                       "AMD EPYC Processor (with IBPB)" },
5032d86a7088SEduardo Habkost                     { /* end of list */ }
5033d86a7088SEduardo Habkost                 }
5034d86a7088SEduardo Habkost             },
5035a16e8dbcSMoger, Babu             {
5036a16e8dbcSMoger, Babu                 .version = 3,
5037a16e8dbcSMoger, Babu                 .props = (PropValue[]) {
5038a16e8dbcSMoger, Babu                     { "ibpb", "on" },
5039a16e8dbcSMoger, Babu                     { "perfctr-core", "on" },
5040a16e8dbcSMoger, Babu                     { "clzero", "on" },
5041a16e8dbcSMoger, Babu                     { "xsaveerptr", "on" },
5042a16e8dbcSMoger, Babu                     { "xsaves", "on" },
5043a16e8dbcSMoger, Babu                     { "model-id",
5044a16e8dbcSMoger, Babu                       "AMD EPYC Processor" },
5045a16e8dbcSMoger, Babu                     { /* end of list */ }
5046a16e8dbcSMoger, Babu                 }
5047a16e8dbcSMoger, Babu             },
5048d7c72735SMichael Roth             {
5049d7c72735SMichael Roth                 .version = 4,
5050d7c72735SMichael Roth                 .props = (PropValue[]) {
5051d7c72735SMichael Roth                     { "model-id",
5052d7c72735SMichael Roth                       "AMD EPYC-v4 Processor" },
5053d7c72735SMichael Roth                     { /* end of list */ }
5054d7c72735SMichael Roth                 },
5055d7c72735SMichael Roth                 .cache_info = &epyc_v4_cache_info
5056d7c72735SMichael Roth             },
5057d86a7088SEduardo Habkost             { /* end of list */ }
5058d86a7088SEduardo Habkost         }
50592e2efc7dSBrijesh Singh     },
50606cfbc54eSEduardo Habkost     {
50618d031cecSPu Wen         .name = "Dhyana",
50628d031cecSPu Wen         .level = 0xd,
50638d031cecSPu Wen         .vendor = CPUID_VENDOR_HYGON,
50648d031cecSPu Wen         .family = 24,
50658d031cecSPu Wen         .model = 0,
50668d031cecSPu Wen         .stepping = 1,
50678d031cecSPu Wen         .features[FEAT_1_EDX] =
50688d031cecSPu Wen             CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
50698d031cecSPu Wen             CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
50708d031cecSPu Wen             CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
50718d031cecSPu Wen             CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
50728d031cecSPu Wen             CPUID_VME | CPUID_FP87,
50738d031cecSPu Wen         .features[FEAT_1_ECX] =
50748d031cecSPu Wen             CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
50758d031cecSPu Wen             CPUID_EXT_XSAVE | CPUID_EXT_POPCNT |
50768d031cecSPu Wen             CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
50778d031cecSPu Wen             CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
50788d031cecSPu Wen             CPUID_EXT_MONITOR | CPUID_EXT_SSE3,
50798d031cecSPu Wen         .features[FEAT_8000_0001_EDX] =
50808d031cecSPu Wen             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
50818d031cecSPu Wen             CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
50828d031cecSPu Wen             CPUID_EXT2_SYSCALL,
50838d031cecSPu Wen         .features[FEAT_8000_0001_ECX] =
50848d031cecSPu Wen             CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
50858d031cecSPu Wen             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
50868d031cecSPu Wen             CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
50878d031cecSPu Wen             CPUID_EXT3_TOPOEXT,
50888d031cecSPu Wen         .features[FEAT_8000_0008_EBX] =
50898d031cecSPu Wen             CPUID_8000_0008_EBX_IBPB,
50908d031cecSPu Wen         .features[FEAT_7_0_EBX] =
50918d031cecSPu Wen             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
50928d031cecSPu Wen             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
50938d031cecSPu Wen             CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT,
50947bde6b18SVitaly Kuznetsov         /* XSAVES is added in version 2 */
50958d031cecSPu Wen         .features[FEAT_XSAVE] =
50968d031cecSPu Wen             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
50978d031cecSPu Wen             CPUID_XSAVE_XGETBV1,
50988d031cecSPu Wen         .features[FEAT_6_EAX] =
50998d031cecSPu Wen             CPUID_6_EAX_ARAT,
51008d031cecSPu Wen         .features[FEAT_SVM] =
51018d031cecSPu Wen             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
51028d031cecSPu Wen         .xlevel = 0x8000001E,
51038d031cecSPu Wen         .model_id = "Hygon Dhyana Processor",
51048d031cecSPu Wen         .cache_info = &epyc_cache_info,
51057bde6b18SVitaly Kuznetsov         .versions = (X86CPUVersionDefinition[]) {
51067bde6b18SVitaly Kuznetsov             { .version = 1 },
51077bde6b18SVitaly Kuznetsov             { .version = 2,
51087bde6b18SVitaly Kuznetsov               .note = "XSAVES",
51097bde6b18SVitaly Kuznetsov               .props = (PropValue[]) {
51107bde6b18SVitaly Kuznetsov                   { "xsaves", "on" },
51117bde6b18SVitaly Kuznetsov                   { /* end of list */ }
51127bde6b18SVitaly Kuznetsov               },
51137bde6b18SVitaly Kuznetsov             },
51147bde6b18SVitaly Kuznetsov             { /* end of list */ }
51157bde6b18SVitaly Kuznetsov         }
51168d031cecSPu Wen     },
5117143c30d4SMoger, Babu     {
5118143c30d4SMoger, Babu         .name = "EPYC-Rome",
5119143c30d4SMoger, Babu         .level = 0xd,
5120143c30d4SMoger, Babu         .vendor = CPUID_VENDOR_AMD,
5121143c30d4SMoger, Babu         .family = 23,
5122143c30d4SMoger, Babu         .model = 49,
5123143c30d4SMoger, Babu         .stepping = 0,
5124143c30d4SMoger, Babu         .features[FEAT_1_EDX] =
5125143c30d4SMoger, Babu             CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
5126143c30d4SMoger, Babu             CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
5127143c30d4SMoger, Babu             CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
5128143c30d4SMoger, Babu             CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
5129143c30d4SMoger, Babu             CPUID_VME | CPUID_FP87,
5130143c30d4SMoger, Babu         .features[FEAT_1_ECX] =
5131143c30d4SMoger, Babu             CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
5132143c30d4SMoger, Babu             CPUID_EXT_XSAVE | CPUID_EXT_AES |  CPUID_EXT_POPCNT |
5133143c30d4SMoger, Babu             CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
5134143c30d4SMoger, Babu             CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
5135143c30d4SMoger, Babu             CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
5136143c30d4SMoger, Babu         .features[FEAT_8000_0001_EDX] =
5137143c30d4SMoger, Babu             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
5138143c30d4SMoger, Babu             CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
5139143c30d4SMoger, Babu             CPUID_EXT2_SYSCALL,
5140143c30d4SMoger, Babu         .features[FEAT_8000_0001_ECX] =
5141143c30d4SMoger, Babu             CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
5142143c30d4SMoger, Babu             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
5143143c30d4SMoger, Babu             CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
5144143c30d4SMoger, Babu             CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
5145143c30d4SMoger, Babu         .features[FEAT_8000_0008_EBX] =
5146143c30d4SMoger, Babu             CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
5147143c30d4SMoger, Babu             CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
5148143c30d4SMoger, Babu             CPUID_8000_0008_EBX_STIBP,
5149143c30d4SMoger, Babu         .features[FEAT_7_0_EBX] =
5150143c30d4SMoger, Babu             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
5151143c30d4SMoger, Babu             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
5152143c30d4SMoger, Babu             CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
5153143c30d4SMoger, Babu             CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_CLWB,
5154143c30d4SMoger, Babu         .features[FEAT_7_0_ECX] =
5155143c30d4SMoger, Babu             CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_RDPID,
5156143c30d4SMoger, Babu         .features[FEAT_XSAVE] =
5157143c30d4SMoger, Babu             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
5158143c30d4SMoger, Babu             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
5159143c30d4SMoger, Babu         .features[FEAT_6_EAX] =
5160143c30d4SMoger, Babu             CPUID_6_EAX_ARAT,
5161143c30d4SMoger, Babu         .features[FEAT_SVM] =
5162143c30d4SMoger, Babu             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE,
5163143c30d4SMoger, Babu         .xlevel = 0x8000001E,
5164143c30d4SMoger, Babu         .model_id = "AMD EPYC-Rome Processor",
5165143c30d4SMoger, Babu         .cache_info = &epyc_rome_cache_info,
5166cdeaed27SBabu Moger         .versions = (X86CPUVersionDefinition[]) {
5167cdeaed27SBabu Moger             { .version = 1 },
5168cdeaed27SBabu Moger             {
5169cdeaed27SBabu Moger                 .version = 2,
5170cdeaed27SBabu Moger                 .props = (PropValue[]) {
5171cdeaed27SBabu Moger                     { "ibrs", "on" },
5172cdeaed27SBabu Moger                     { "amd-ssbd", "on" },
5173cdeaed27SBabu Moger                     { /* end of list */ }
5174cdeaed27SBabu Moger                 }
5175cdeaed27SBabu Moger             },
5176d7c72735SMichael Roth             {
5177d7c72735SMichael Roth                 .version = 3,
5178d7c72735SMichael Roth                 .props = (PropValue[]) {
5179d7c72735SMichael Roth                     { "model-id",
5180d7c72735SMichael Roth                       "AMD EPYC-Rome-v3 Processor" },
5181d7c72735SMichael Roth                     { /* end of list */ }
5182d7c72735SMichael Roth                 },
5183d7c72735SMichael Roth                 .cache_info = &epyc_rome_v3_cache_info
5184d7c72735SMichael Roth             },
5185fb00aa61SMaksim Davydov             {
5186fb00aa61SMaksim Davydov                 .version = 4,
5187fb00aa61SMaksim Davydov                 .props = (PropValue[]) {
5188fb00aa61SMaksim Davydov                     /* Erratum 1386 */
5189fb00aa61SMaksim Davydov                     { "model-id",
5190fb00aa61SMaksim Davydov                       "AMD EPYC-Rome-v4 Processor (no XSAVES)" },
5191fb00aa61SMaksim Davydov                     { "xsaves", "off" },
5192fb00aa61SMaksim Davydov                     { /* end of list */ }
5193fb00aa61SMaksim Davydov                 },
5194fb00aa61SMaksim Davydov             },
5195cdeaed27SBabu Moger             { /* end of list */ }
5196cdeaed27SBabu Moger         }
5197143c30d4SMoger, Babu     },
5198623972ceSBabu Moger     {
5199623972ceSBabu Moger         .name = "EPYC-Milan",
5200623972ceSBabu Moger         .level = 0xd,
5201623972ceSBabu Moger         .vendor = CPUID_VENDOR_AMD,
5202623972ceSBabu Moger         .family = 25,
5203623972ceSBabu Moger         .model = 1,
5204623972ceSBabu Moger         .stepping = 1,
5205623972ceSBabu Moger         .features[FEAT_1_EDX] =
5206623972ceSBabu Moger             CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
5207623972ceSBabu Moger             CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
5208623972ceSBabu Moger             CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
5209623972ceSBabu Moger             CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
5210623972ceSBabu Moger             CPUID_VME | CPUID_FP87,
5211623972ceSBabu Moger         .features[FEAT_1_ECX] =
5212623972ceSBabu Moger             CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
5213623972ceSBabu Moger             CPUID_EXT_XSAVE | CPUID_EXT_AES |  CPUID_EXT_POPCNT |
5214623972ceSBabu Moger             CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
5215623972ceSBabu Moger             CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
5216623972ceSBabu Moger             CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
5217623972ceSBabu Moger             CPUID_EXT_PCID,
5218623972ceSBabu Moger         .features[FEAT_8000_0001_EDX] =
5219623972ceSBabu Moger             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
5220623972ceSBabu Moger             CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
5221623972ceSBabu Moger             CPUID_EXT2_SYSCALL,
5222623972ceSBabu Moger         .features[FEAT_8000_0001_ECX] =
5223623972ceSBabu Moger             CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
5224623972ceSBabu Moger             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
5225623972ceSBabu Moger             CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
5226623972ceSBabu Moger             CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
5227623972ceSBabu Moger         .features[FEAT_8000_0008_EBX] =
5228623972ceSBabu Moger             CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
5229623972ceSBabu Moger             CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
5230623972ceSBabu Moger             CPUID_8000_0008_EBX_IBRS | CPUID_8000_0008_EBX_STIBP |
5231623972ceSBabu Moger             CPUID_8000_0008_EBX_AMD_SSBD,
5232623972ceSBabu Moger         .features[FEAT_7_0_EBX] =
5233623972ceSBabu Moger             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
5234623972ceSBabu Moger             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
5235623972ceSBabu Moger             CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
5236623972ceSBabu Moger             CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_ERMS |
5237623972ceSBabu Moger             CPUID_7_0_EBX_INVPCID,
5238623972ceSBabu Moger         .features[FEAT_7_0_ECX] =
5239623972ceSBabu Moger             CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_PKU,
5240623972ceSBabu Moger         .features[FEAT_7_0_EDX] =
5241623972ceSBabu Moger             CPUID_7_0_EDX_FSRM,
5242623972ceSBabu Moger         .features[FEAT_XSAVE] =
5243623972ceSBabu Moger             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
5244623972ceSBabu Moger             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
5245623972ceSBabu Moger         .features[FEAT_6_EAX] =
5246623972ceSBabu Moger             CPUID_6_EAX_ARAT,
5247623972ceSBabu Moger         .features[FEAT_SVM] =
5248623972ceSBabu Moger             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE | CPUID_SVM_SVME_ADDR_CHK,
5249623972ceSBabu Moger         .xlevel = 0x8000001E,
5250623972ceSBabu Moger         .model_id = "AMD EPYC-Milan Processor",
5251623972ceSBabu Moger         .cache_info = &epyc_milan_cache_info,
525227f03be6SBabu Moger         .versions = (X86CPUVersionDefinition[]) {
525327f03be6SBabu Moger             { .version = 1 },
525427f03be6SBabu Moger             {
525527f03be6SBabu Moger                 .version = 2,
525627f03be6SBabu Moger                 .props = (PropValue[]) {
525727f03be6SBabu Moger                     { "model-id",
525827f03be6SBabu Moger                       "AMD EPYC-Milan-v2 Processor" },
525927f03be6SBabu Moger                     { "vaes", "on" },
526027f03be6SBabu Moger                     { "vpclmulqdq", "on" },
526127f03be6SBabu Moger                     { "stibp-always-on", "on" },
526227f03be6SBabu Moger                     { "amd-psfd", "on" },
526327f03be6SBabu Moger                     { "no-nested-data-bp", "on" },
526427f03be6SBabu Moger                     { "lfence-always-serializing", "on" },
526527f03be6SBabu Moger                     { "null-sel-clr-base", "on" },
526627f03be6SBabu Moger                     { /* end of list */ }
526727f03be6SBabu Moger                 },
526827f03be6SBabu Moger                 .cache_info = &epyc_milan_v2_cache_info
526927f03be6SBabu Moger             },
527027f03be6SBabu Moger             { /* end of list */ }
527127f03be6SBabu Moger         }
5272623972ceSBabu Moger     },
5273166b1741SBabu Moger     {
5274166b1741SBabu Moger         .name = "EPYC-Genoa",
5275166b1741SBabu Moger         .level = 0xd,
5276166b1741SBabu Moger         .vendor = CPUID_VENDOR_AMD,
5277166b1741SBabu Moger         .family = 25,
5278166b1741SBabu Moger         .model = 17,
5279166b1741SBabu Moger         .stepping = 0,
5280166b1741SBabu Moger         .features[FEAT_1_EDX] =
5281166b1741SBabu Moger             CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
5282166b1741SBabu Moger             CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
5283166b1741SBabu Moger             CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
5284166b1741SBabu Moger             CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
5285166b1741SBabu Moger             CPUID_VME | CPUID_FP87,
5286166b1741SBabu Moger         .features[FEAT_1_ECX] =
5287166b1741SBabu Moger             CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
5288166b1741SBabu Moger             CPUID_EXT_XSAVE | CPUID_EXT_AES |  CPUID_EXT_POPCNT |
5289166b1741SBabu Moger             CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
5290166b1741SBabu Moger             CPUID_EXT_PCID | CPUID_EXT_CX16 | CPUID_EXT_FMA |
5291166b1741SBabu Moger             CPUID_EXT_SSSE3 | CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ |
5292166b1741SBabu Moger             CPUID_EXT_SSE3,
5293166b1741SBabu Moger         .features[FEAT_8000_0001_EDX] =
5294166b1741SBabu Moger             CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
5295166b1741SBabu Moger             CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
5296166b1741SBabu Moger             CPUID_EXT2_SYSCALL,
5297166b1741SBabu Moger         .features[FEAT_8000_0001_ECX] =
5298166b1741SBabu Moger             CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
5299166b1741SBabu Moger             CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
5300166b1741SBabu Moger             CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM |
5301166b1741SBabu Moger             CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE,
5302166b1741SBabu Moger         .features[FEAT_8000_0008_EBX] =
5303166b1741SBabu Moger             CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR |
5304166b1741SBabu Moger             CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB |
5305166b1741SBabu Moger             CPUID_8000_0008_EBX_IBRS | CPUID_8000_0008_EBX_STIBP |
5306166b1741SBabu Moger             CPUID_8000_0008_EBX_STIBP_ALWAYS_ON |
5307166b1741SBabu Moger             CPUID_8000_0008_EBX_AMD_SSBD | CPUID_8000_0008_EBX_AMD_PSFD,
5308166b1741SBabu Moger         .features[FEAT_8000_0021_EAX] =
53099c882ad4SBabu Moger             CPUID_8000_0021_EAX_NO_NESTED_DATA_BP |
5310166b1741SBabu Moger             CPUID_8000_0021_EAX_LFENCE_ALWAYS_SERIALIZING |
5311166b1741SBabu Moger             CPUID_8000_0021_EAX_NULL_SEL_CLR_BASE |
5312166b1741SBabu Moger             CPUID_8000_0021_EAX_AUTO_IBRS,
5313166b1741SBabu Moger         .features[FEAT_7_0_EBX] =
5314166b1741SBabu Moger             CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
5315166b1741SBabu Moger             CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
5316166b1741SBabu Moger             CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_AVX512F |
5317166b1741SBabu Moger             CPUID_7_0_EBX_AVX512DQ | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
5318166b1741SBabu Moger             CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_AVX512IFMA |
5319166b1741SBabu Moger             CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_CLWB |
5320166b1741SBabu Moger             CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_SHA_NI |
5321166b1741SBabu Moger             CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512VL,
5322166b1741SBabu Moger         .features[FEAT_7_0_ECX] =
5323166b1741SBabu Moger             CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU |
5324166b1741SBabu Moger             CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI |
5325166b1741SBabu Moger             CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ |
5326166b1741SBabu Moger             CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG |
5327166b1741SBabu Moger             CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57 |
5328166b1741SBabu Moger             CPUID_7_0_ECX_RDPID,
5329166b1741SBabu Moger         .features[FEAT_7_0_EDX] =
5330166b1741SBabu Moger             CPUID_7_0_EDX_FSRM,
5331166b1741SBabu Moger         .features[FEAT_7_1_EAX] =
5332166b1741SBabu Moger             CPUID_7_1_EAX_AVX512_BF16,
5333166b1741SBabu Moger         .features[FEAT_XSAVE] =
5334166b1741SBabu Moger             CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
5335166b1741SBabu Moger             CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES,
5336166b1741SBabu Moger         .features[FEAT_6_EAX] =
5337166b1741SBabu Moger             CPUID_6_EAX_ARAT,
5338166b1741SBabu Moger         .features[FEAT_SVM] =
5339166b1741SBabu Moger             CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE | CPUID_SVM_VNMI |
5340166b1741SBabu Moger             CPUID_SVM_SVME_ADDR_CHK,
5341166b1741SBabu Moger         .xlevel = 0x80000022,
5342166b1741SBabu Moger         .model_id = "AMD EPYC-Genoa Processor",
5343166b1741SBabu Moger         .cache_info = &epyc_genoa_cache_info,
5344166b1741SBabu Moger     },
5345fcf5ef2aSThomas Huth };
5346fcf5ef2aSThomas Huth 
5347ad183928SEduardo Habkost /*
5348ad183928SEduardo Habkost  * We resolve CPU model aliases using -v1 when using "-machine
5349ad183928SEduardo Habkost  * none", but this is just for compatibility while libvirt isn't
5350ad183928SEduardo Habkost  * adapted to resolve CPU model versions before creating VMs.
535132048d72SMarkus Armbruster  * See "Runnability guarantee of CPU models" at
5352a476b216SMao Zhongyi  * docs/about/deprecated.rst.
5353ad183928SEduardo Habkost  */
5354ad183928SEduardo Habkost X86CPUVersion default_cpu_version = 1;
53550788a56bSEduardo Habkost 
x86_cpu_set_default_version(X86CPUVersion version)53560788a56bSEduardo Habkost void x86_cpu_set_default_version(X86CPUVersion version)
53570788a56bSEduardo Habkost {
53580788a56bSEduardo Habkost     /* Translating CPU_VERSION_AUTO to CPU_VERSION_AUTO doesn't make sense */
53590788a56bSEduardo Habkost     assert(version != CPU_VERSION_AUTO);
53600788a56bSEduardo Habkost     default_cpu_version = version;
53610788a56bSEduardo Habkost }
53620788a56bSEduardo Habkost 
x86_cpu_model_last_version(const X86CPUModel * model)5363dcafd1efSEduardo Habkost static X86CPUVersion x86_cpu_model_last_version(const X86CPUModel *model)
5364dcafd1efSEduardo Habkost {
5365dcafd1efSEduardo Habkost     int v = 0;
5366dcafd1efSEduardo Habkost     const X86CPUVersionDefinition *vdef =
5367dcafd1efSEduardo Habkost         x86_cpu_def_get_versions(model->cpudef);
5368dcafd1efSEduardo Habkost     while (vdef->version) {
5369dcafd1efSEduardo Habkost         v = vdef->version;
5370dcafd1efSEduardo Habkost         vdef++;
5371dcafd1efSEduardo Habkost     }
5372dcafd1efSEduardo Habkost     return v;
5373dcafd1efSEduardo Habkost }
5374dcafd1efSEduardo Habkost 
5375dcafd1efSEduardo Habkost /* Return the actual version being used for a specific CPU model */
x86_cpu_model_resolve_version(const X86CPUModel * model)5376dcafd1efSEduardo Habkost static X86CPUVersion x86_cpu_model_resolve_version(const X86CPUModel *model)
5377dcafd1efSEduardo Habkost {
5378dcafd1efSEduardo Habkost     X86CPUVersion v = model->version;
53790788a56bSEduardo Habkost     if (v == CPU_VERSION_AUTO) {
53800788a56bSEduardo Habkost         v = default_cpu_version;
53810788a56bSEduardo Habkost     }
5382dcafd1efSEduardo Habkost     if (v == CPU_VERSION_LATEST) {
5383dcafd1efSEduardo Habkost         return x86_cpu_model_last_version(model);
5384dcafd1efSEduardo Habkost     }
5385dcafd1efSEduardo Habkost     return v;
5386dcafd1efSEduardo Habkost }
5387dcafd1efSEduardo Habkost 
5388c62f2630SEduardo Habkost static Property max_x86_cpu_properties[] = {
5389fcf5ef2aSThomas Huth     DEFINE_PROP_BOOL("migratable", X86CPU, migratable, true),
5390fcf5ef2aSThomas Huth     DEFINE_PROP_BOOL("host-cache-info", X86CPU, cache_info_passthrough, false),
5391fcf5ef2aSThomas Huth     DEFINE_PROP_END_OF_LIST()
5392fcf5ef2aSThomas Huth };
5393fcf5ef2aSThomas Huth 
max_x86_cpu_realize(DeviceState * dev,Error ** errp)5394123fa102SThomas Huth static void max_x86_cpu_realize(DeviceState *dev, Error **errp)
5395123fa102SThomas Huth {
5396123fa102SThomas Huth     Object *obj = OBJECT(dev);
5397123fa102SThomas Huth 
5398123fa102SThomas Huth     if (!object_property_get_int(obj, "family", &error_abort)) {
5399123fa102SThomas Huth         if (X86_CPU(obj)->env.features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
5400123fa102SThomas Huth             object_property_set_int(obj, "family", 15, &error_abort);
5401123fa102SThomas Huth             object_property_set_int(obj, "model", 107, &error_abort);
5402123fa102SThomas Huth             object_property_set_int(obj, "stepping", 1, &error_abort);
5403123fa102SThomas Huth         } else {
5404123fa102SThomas Huth             object_property_set_int(obj, "family", 6, &error_abort);
5405123fa102SThomas Huth             object_property_set_int(obj, "model", 6, &error_abort);
5406123fa102SThomas Huth             object_property_set_int(obj, "stepping", 3, &error_abort);
5407123fa102SThomas Huth         }
5408123fa102SThomas Huth     }
5409123fa102SThomas Huth 
5410123fa102SThomas Huth     x86_cpu_realizefn(dev, errp);
5411123fa102SThomas Huth }
5412123fa102SThomas Huth 
max_x86_cpu_class_init(ObjectClass * oc,void * data)5413c62f2630SEduardo Habkost static void max_x86_cpu_class_init(ObjectClass *oc, void *data)
5414fcf5ef2aSThomas Huth {
5415fcf5ef2aSThomas Huth     DeviceClass *dc = DEVICE_CLASS(oc);
5416fcf5ef2aSThomas Huth     X86CPUClass *xcc = X86_CPU_CLASS(oc);
5417fcf5ef2aSThomas Huth 
5418f48c8837SEduardo Habkost     xcc->ordering = 9;
5419fcf5ef2aSThomas Huth 
5420fcf5ef2aSThomas Huth     xcc->model_description =
5421c62f2630SEduardo Habkost         "Enables all features supported by the accelerator in the current host";
5422fcf5ef2aSThomas Huth 
54234f67d30bSMarc-André Lureau     device_class_set_props(dc, max_x86_cpu_properties);
5424123fa102SThomas Huth     dc->realize = max_x86_cpu_realize;
5425fcf5ef2aSThomas Huth }
5426fcf5ef2aSThomas Huth 
max_x86_cpu_initfn(Object * obj)5427c62f2630SEduardo Habkost static void max_x86_cpu_initfn(Object *obj)
5428fcf5ef2aSThomas Huth {
5429fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(obj);
5430fcf5ef2aSThomas Huth 
5431fcf5ef2aSThomas Huth     /* We can't fill the features array here because we don't know yet if
5432fcf5ef2aSThomas Huth      * "migratable" is true or false.
5433fcf5ef2aSThomas Huth      */
543444bd8e53SEduardo Habkost     cpu->max_features = true;
5435f5cc5a5cSClaudio Fontana     object_property_set_bool(OBJECT(cpu), "pmu", true, &error_abort);
5436fcf5ef2aSThomas Huth 
5437f5cc5a5cSClaudio Fontana     /*
5438f5cc5a5cSClaudio Fontana      * these defaults are used for TCG and all other accelerators
5439f5cc5a5cSClaudio Fontana      * besides KVM and HVF, which overwrite these values
5440f5cc5a5cSClaudio Fontana      */
54415325cc34SMarkus Armbruster     object_property_set_str(OBJECT(cpu), "vendor", CPUID_VENDOR_AMD,
54425325cc34SMarkus Armbruster                             &error_abort);
54435325cc34SMarkus Armbruster     object_property_set_str(OBJECT(cpu), "model-id",
54446900d1ccSEduardo Habkost                             "QEMU TCG CPU version " QEMU_HW_VERSION,
54455325cc34SMarkus Armbruster                             &error_abort);
5446fcf5ef2aSThomas Huth }
5447fcf5ef2aSThomas Huth 
5448c62f2630SEduardo Habkost static const TypeInfo max_x86_cpu_type_info = {
5449c62f2630SEduardo Habkost     .name = X86_CPU_TYPE_NAME("max"),
5450c62f2630SEduardo Habkost     .parent = TYPE_X86_CPU,
5451c62f2630SEduardo Habkost     .instance_init = max_x86_cpu_initfn,
5452c62f2630SEduardo Habkost     .class_init = max_x86_cpu_class_init,
5453c62f2630SEduardo Habkost };
5454c62f2630SEduardo Habkost 
feature_word_description(FeatureWordInfo * f,uint32_t bit)545507585923SRobert Hoo static char *feature_word_description(FeatureWordInfo *f, uint32_t bit)
545607585923SRobert Hoo {
545707585923SRobert Hoo     assert(f->type == CPUID_FEATURE_WORD || f->type == MSR_FEATURE_WORD);
545807585923SRobert Hoo 
545907585923SRobert Hoo     switch (f->type) {
546007585923SRobert Hoo     case CPUID_FEATURE_WORD:
546107585923SRobert Hoo         {
546207585923SRobert Hoo             const char *reg = get_register_name_32(f->cpuid.reg);
546307585923SRobert Hoo             assert(reg);
546407585923SRobert Hoo             return g_strdup_printf("CPUID.%02XH:%s",
546507585923SRobert Hoo                                    f->cpuid.eax, reg);
546607585923SRobert Hoo         }
546707585923SRobert Hoo     case MSR_FEATURE_WORD:
546807585923SRobert Hoo         return g_strdup_printf("MSR(%02XH)",
546907585923SRobert Hoo                                f->msr.index);
547007585923SRobert Hoo     }
547107585923SRobert Hoo 
547207585923SRobert Hoo     return NULL;
547307585923SRobert Hoo }
547407585923SRobert Hoo 
x86_cpu_have_filtered_features(X86CPU * cpu)5475245edd0cSPaolo Bonzini static bool x86_cpu_have_filtered_features(X86CPU *cpu)
5476fcf5ef2aSThomas Huth {
5477245edd0cSPaolo Bonzini     FeatureWord w;
5478245edd0cSPaolo Bonzini 
5479245edd0cSPaolo Bonzini     for (w = 0; w < FEATURE_WORDS; w++) {
5480245edd0cSPaolo Bonzini         if (cpu->filtered_features[w]) {
5481245edd0cSPaolo Bonzini             return true;
5482245edd0cSPaolo Bonzini         }
5483245edd0cSPaolo Bonzini     }
5484245edd0cSPaolo Bonzini 
5485245edd0cSPaolo Bonzini     return false;
5486245edd0cSPaolo Bonzini }
5487245edd0cSPaolo Bonzini 
mark_unavailable_features(X86CPU * cpu,FeatureWord w,uint64_t mask,const char * verbose_prefix)5488ede146c2SPaolo Bonzini static void mark_unavailable_features(X86CPU *cpu, FeatureWord w, uint64_t mask,
5489245edd0cSPaolo Bonzini                                       const char *verbose_prefix)
5490245edd0cSPaolo Bonzini {
5491245edd0cSPaolo Bonzini     CPUX86State *env = &cpu->env;
5492fcf5ef2aSThomas Huth     FeatureWordInfo *f = &feature_word_info[w];
5493fcf5ef2aSThomas Huth     int i;
5494fcf5ef2aSThomas Huth 
5495245edd0cSPaolo Bonzini     if (!cpu->force_features) {
5496245edd0cSPaolo Bonzini         env->features[w] &= ~mask;
5497245edd0cSPaolo Bonzini     }
5498245edd0cSPaolo Bonzini     cpu->filtered_features[w] |= mask;
5499245edd0cSPaolo Bonzini 
5500245edd0cSPaolo Bonzini     if (!verbose_prefix) {
5501245edd0cSPaolo Bonzini         return;
5502245edd0cSPaolo Bonzini     }
5503245edd0cSPaolo Bonzini 
5504ede146c2SPaolo Bonzini     for (i = 0; i < 64; ++i) {
5505ede146c2SPaolo Bonzini         if ((1ULL << i) & mask) {
550688703ce2SEduardo Habkost             g_autofree char *feat_word_str = feature_word_description(f, i);
5507245edd0cSPaolo Bonzini             warn_report("%s: %s%s%s [bit %d]",
5508245edd0cSPaolo Bonzini                         verbose_prefix,
550907585923SRobert Hoo                         feat_word_str,
5510fcf5ef2aSThomas Huth                         f->feat_names[i] ? "." : "",
5511fcf5ef2aSThomas Huth                         f->feat_names[i] ? f->feat_names[i] : "", i);
5512fcf5ef2aSThomas Huth         }
5513fcf5ef2aSThomas Huth     }
5514fcf5ef2aSThomas Huth }
5515fcf5ef2aSThomas Huth 
x86_cpuid_version_get_family(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)5516fcf5ef2aSThomas Huth static void x86_cpuid_version_get_family(Object *obj, Visitor *v,
5517fcf5ef2aSThomas Huth                                          const char *name, void *opaque,
5518fcf5ef2aSThomas Huth                                          Error **errp)
5519fcf5ef2aSThomas Huth {
5520fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(obj);
5521fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
5522f91cf817SMarkus Armbruster     uint64_t value;
5523fcf5ef2aSThomas Huth 
5524fcf5ef2aSThomas Huth     value = (env->cpuid_version >> 8) & 0xf;
5525fcf5ef2aSThomas Huth     if (value == 0xf) {
5526fcf5ef2aSThomas Huth         value += (env->cpuid_version >> 20) & 0xff;
5527fcf5ef2aSThomas Huth     }
5528f91cf817SMarkus Armbruster     visit_type_uint64(v, name, &value, errp);
5529fcf5ef2aSThomas Huth }
5530fcf5ef2aSThomas Huth 
x86_cpuid_version_set_family(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)5531fcf5ef2aSThomas Huth static void x86_cpuid_version_set_family(Object *obj, Visitor *v,
5532fcf5ef2aSThomas Huth                                          const char *name, void *opaque,
5533fcf5ef2aSThomas Huth                                          Error **errp)
5534fcf5ef2aSThomas Huth {
5535fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(obj);
5536fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
5537f91cf817SMarkus Armbruster     const uint64_t max = 0xff + 0xf;
5538f91cf817SMarkus Armbruster     uint64_t value;
5539fcf5ef2aSThomas Huth 
5540f91cf817SMarkus Armbruster     if (!visit_type_uint64(v, name, &value, errp)) {
5541fcf5ef2aSThomas Huth         return;
5542fcf5ef2aSThomas Huth     }
5543f91cf817SMarkus Armbruster     if (value > max) {
5544dac7f90cSMarkus Armbruster         error_setg(errp, "parameter '%s' can be at most %" PRIu64,
5545dac7f90cSMarkus Armbruster                    name ? name : "null", max);
5546fcf5ef2aSThomas Huth         return;
5547fcf5ef2aSThomas Huth     }
5548fcf5ef2aSThomas Huth 
5549fcf5ef2aSThomas Huth     env->cpuid_version &= ~0xff00f00;
5550fcf5ef2aSThomas Huth     if (value > 0x0f) {
5551fcf5ef2aSThomas Huth         env->cpuid_version |= 0xf00 | ((value - 0x0f) << 20);
5552fcf5ef2aSThomas Huth     } else {
5553fcf5ef2aSThomas Huth         env->cpuid_version |= value << 8;
5554fcf5ef2aSThomas Huth     }
5555fcf5ef2aSThomas Huth }
5556fcf5ef2aSThomas Huth 
x86_cpuid_version_get_model(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)5557fcf5ef2aSThomas Huth static void x86_cpuid_version_get_model(Object *obj, Visitor *v,
5558fcf5ef2aSThomas Huth                                         const char *name, void *opaque,
5559fcf5ef2aSThomas Huth                                         Error **errp)
5560fcf5ef2aSThomas Huth {
5561fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(obj);
5562fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
5563f91cf817SMarkus Armbruster     uint64_t value;
5564fcf5ef2aSThomas Huth 
5565fcf5ef2aSThomas Huth     value = (env->cpuid_version >> 4) & 0xf;
5566fcf5ef2aSThomas Huth     value |= ((env->cpuid_version >> 16) & 0xf) << 4;
5567f91cf817SMarkus Armbruster     visit_type_uint64(v, name, &value, errp);
5568fcf5ef2aSThomas Huth }
5569fcf5ef2aSThomas Huth 
x86_cpuid_version_set_model(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)5570fcf5ef2aSThomas Huth static void x86_cpuid_version_set_model(Object *obj, Visitor *v,
5571fcf5ef2aSThomas Huth                                         const char *name, void *opaque,
5572fcf5ef2aSThomas Huth                                         Error **errp)
5573fcf5ef2aSThomas Huth {
5574fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(obj);
5575fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
5576f91cf817SMarkus Armbruster     const uint64_t max = 0xff;
5577f91cf817SMarkus Armbruster     uint64_t value;
5578fcf5ef2aSThomas Huth 
5579f91cf817SMarkus Armbruster     if (!visit_type_uint64(v, name, &value, errp)) {
5580fcf5ef2aSThomas Huth         return;
5581fcf5ef2aSThomas Huth     }
5582f91cf817SMarkus Armbruster     if (value > max) {
5583dac7f90cSMarkus Armbruster         error_setg(errp, "parameter '%s' can be at most %" PRIu64,
5584dac7f90cSMarkus Armbruster                    name ? name : "null", max);
5585fcf5ef2aSThomas Huth         return;
5586fcf5ef2aSThomas Huth     }
5587fcf5ef2aSThomas Huth 
5588fcf5ef2aSThomas Huth     env->cpuid_version &= ~0xf00f0;
5589fcf5ef2aSThomas Huth     env->cpuid_version |= ((value & 0xf) << 4) | ((value >> 4) << 16);
5590fcf5ef2aSThomas Huth }
5591fcf5ef2aSThomas Huth 
x86_cpuid_version_get_stepping(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)5592fcf5ef2aSThomas Huth static void x86_cpuid_version_get_stepping(Object *obj, Visitor *v,
5593fcf5ef2aSThomas Huth                                            const char *name, void *opaque,
5594fcf5ef2aSThomas Huth                                            Error **errp)
5595fcf5ef2aSThomas Huth {
5596fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(obj);
5597fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
5598f91cf817SMarkus Armbruster     uint64_t value;
5599fcf5ef2aSThomas Huth 
5600fcf5ef2aSThomas Huth     value = env->cpuid_version & 0xf;
5601f91cf817SMarkus Armbruster     visit_type_uint64(v, name, &value, errp);
5602fcf5ef2aSThomas Huth }
5603fcf5ef2aSThomas Huth 
x86_cpuid_version_set_stepping(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)5604fcf5ef2aSThomas Huth static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v,
5605fcf5ef2aSThomas Huth                                            const char *name, void *opaque,
5606fcf5ef2aSThomas Huth                                            Error **errp)
5607fcf5ef2aSThomas Huth {
5608fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(obj);
5609fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
5610f91cf817SMarkus Armbruster     const uint64_t max = 0xf;
5611f91cf817SMarkus Armbruster     uint64_t value;
5612fcf5ef2aSThomas Huth 
5613f91cf817SMarkus Armbruster     if (!visit_type_uint64(v, name, &value, errp)) {
5614fcf5ef2aSThomas Huth         return;
5615fcf5ef2aSThomas Huth     }
5616f91cf817SMarkus Armbruster     if (value > max) {
5617dac7f90cSMarkus Armbruster         error_setg(errp, "parameter '%s' can be at most %" PRIu64,
5618dac7f90cSMarkus Armbruster                    name ? name : "null", max);
5619fcf5ef2aSThomas Huth         return;
5620fcf5ef2aSThomas Huth     }
5621fcf5ef2aSThomas Huth 
5622fcf5ef2aSThomas Huth     env->cpuid_version &= ~0xf;
5623fcf5ef2aSThomas Huth     env->cpuid_version |= value & 0xf;
5624fcf5ef2aSThomas Huth }
5625fcf5ef2aSThomas Huth 
x86_cpuid_get_vendor(Object * obj,Error ** errp)5626fcf5ef2aSThomas Huth static char *x86_cpuid_get_vendor(Object *obj, Error **errp)
5627fcf5ef2aSThomas Huth {
5628fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(obj);
5629fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
5630fcf5ef2aSThomas Huth     char *value;
5631fcf5ef2aSThomas Huth 
5632fcf5ef2aSThomas Huth     value = g_malloc(CPUID_VENDOR_SZ + 1);
5633fcf5ef2aSThomas Huth     x86_cpu_vendor_words2str(value, env->cpuid_vendor1, env->cpuid_vendor2,
5634fcf5ef2aSThomas Huth                              env->cpuid_vendor3);
5635fcf5ef2aSThomas Huth     return value;
5636fcf5ef2aSThomas Huth }
5637fcf5ef2aSThomas Huth 
x86_cpuid_set_vendor(Object * obj,const char * value,Error ** errp)5638fcf5ef2aSThomas Huth static void x86_cpuid_set_vendor(Object *obj, const char *value,
5639fcf5ef2aSThomas Huth                                  Error **errp)
5640fcf5ef2aSThomas Huth {
5641fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(obj);
5642fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
5643fcf5ef2aSThomas Huth     int i;
5644fcf5ef2aSThomas Huth 
5645fcf5ef2aSThomas Huth     if (strlen(value) != CPUID_VENDOR_SZ) {
5646298d8b12SMarkus Armbruster         error_setg(errp, "value of property 'vendor' must consist of"
5647298d8b12SMarkus Armbruster                    " exactly " stringify(CPUID_VENDOR_SZ) " characters");
5648fcf5ef2aSThomas Huth         return;
5649fcf5ef2aSThomas Huth     }
5650fcf5ef2aSThomas Huth 
5651fcf5ef2aSThomas Huth     env->cpuid_vendor1 = 0;
5652fcf5ef2aSThomas Huth     env->cpuid_vendor2 = 0;
5653fcf5ef2aSThomas Huth     env->cpuid_vendor3 = 0;
5654fcf5ef2aSThomas Huth     for (i = 0; i < 4; i++) {
5655fcf5ef2aSThomas Huth         env->cpuid_vendor1 |= ((uint8_t)value[i    ]) << (8 * i);
5656fcf5ef2aSThomas Huth         env->cpuid_vendor2 |= ((uint8_t)value[i + 4]) << (8 * i);
5657fcf5ef2aSThomas Huth         env->cpuid_vendor3 |= ((uint8_t)value[i + 8]) << (8 * i);
5658fcf5ef2aSThomas Huth     }
5659fcf5ef2aSThomas Huth }
5660fcf5ef2aSThomas Huth 
x86_cpuid_get_model_id(Object * obj,Error ** errp)5661fcf5ef2aSThomas Huth static char *x86_cpuid_get_model_id(Object *obj, Error **errp)
5662fcf5ef2aSThomas Huth {
5663fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(obj);
5664fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
5665fcf5ef2aSThomas Huth     char *value;
5666fcf5ef2aSThomas Huth     int i;
5667fcf5ef2aSThomas Huth 
5668fcf5ef2aSThomas Huth     value = g_malloc(48 + 1);
5669fcf5ef2aSThomas Huth     for (i = 0; i < 48; i++) {
5670fcf5ef2aSThomas Huth         value[i] = env->cpuid_model[i >> 2] >> (8 * (i & 3));
5671fcf5ef2aSThomas Huth     }
5672fcf5ef2aSThomas Huth     value[48] = '\0';
5673fcf5ef2aSThomas Huth     return value;
5674fcf5ef2aSThomas Huth }
5675fcf5ef2aSThomas Huth 
x86_cpuid_set_model_id(Object * obj,const char * model_id,Error ** errp)5676fcf5ef2aSThomas Huth static void x86_cpuid_set_model_id(Object *obj, const char *model_id,
5677fcf5ef2aSThomas Huth                                    Error **errp)
5678fcf5ef2aSThomas Huth {
5679fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(obj);
5680fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
5681fcf5ef2aSThomas Huth     int c, len, i;
5682fcf5ef2aSThomas Huth 
5683fcf5ef2aSThomas Huth     if (model_id == NULL) {
5684fcf5ef2aSThomas Huth         model_id = "";
5685fcf5ef2aSThomas Huth     }
5686fcf5ef2aSThomas Huth     len = strlen(model_id);
5687fcf5ef2aSThomas Huth     memset(env->cpuid_model, 0, 48);
5688fcf5ef2aSThomas Huth     for (i = 0; i < 48; i++) {
5689fcf5ef2aSThomas Huth         if (i >= len) {
5690fcf5ef2aSThomas Huth             c = '\0';
5691fcf5ef2aSThomas Huth         } else {
5692fcf5ef2aSThomas Huth             c = (uint8_t)model_id[i];
5693fcf5ef2aSThomas Huth         }
5694fcf5ef2aSThomas Huth         env->cpuid_model[i >> 2] |= c << (8 * (i & 3));
5695fcf5ef2aSThomas Huth     }
5696fcf5ef2aSThomas Huth }
5697fcf5ef2aSThomas Huth 
x86_cpuid_get_tsc_freq(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)5698fcf5ef2aSThomas Huth static void x86_cpuid_get_tsc_freq(Object *obj, Visitor *v, const char *name,
5699fcf5ef2aSThomas Huth                                    void *opaque, Error **errp)
5700fcf5ef2aSThomas Huth {
5701fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(obj);
5702fcf5ef2aSThomas Huth     int64_t value;
5703fcf5ef2aSThomas Huth 
5704fcf5ef2aSThomas Huth     value = cpu->env.tsc_khz * 1000;
5705fcf5ef2aSThomas Huth     visit_type_int(v, name, &value, errp);
5706fcf5ef2aSThomas Huth }
5707fcf5ef2aSThomas Huth 
x86_cpuid_set_tsc_freq(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)5708fcf5ef2aSThomas Huth static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name,
5709fcf5ef2aSThomas Huth                                    void *opaque, Error **errp)
5710fcf5ef2aSThomas Huth {
5711fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(obj);
5712fcf5ef2aSThomas Huth     const int64_t max = INT64_MAX;
5713fcf5ef2aSThomas Huth     int64_t value;
5714fcf5ef2aSThomas Huth 
5715668f62ecSMarkus Armbruster     if (!visit_type_int(v, name, &value, errp)) {
5716fcf5ef2aSThomas Huth         return;
5717fcf5ef2aSThomas Huth     }
5718dac7f90cSMarkus Armbruster     if (value < 0 || value > max) {
5719dac7f90cSMarkus Armbruster         error_setg(errp, "parameter '%s' can be at most %" PRId64,
5720dac7f90cSMarkus Armbruster                    name ? name : "null", max);
5721fcf5ef2aSThomas Huth         return;
5722fcf5ef2aSThomas Huth     }
5723fcf5ef2aSThomas Huth 
5724fcf5ef2aSThomas Huth     cpu->env.tsc_khz = cpu->env.user_tsc_khz = value / 1000;
5725fcf5ef2aSThomas Huth }
5726fcf5ef2aSThomas Huth 
5727fcf5ef2aSThomas Huth /* 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)5728fcf5ef2aSThomas Huth static void x86_cpu_get_feature_words(Object *obj, Visitor *v,
5729fcf5ef2aSThomas Huth                                       const char *name, void *opaque,
5730fcf5ef2aSThomas Huth                                       Error **errp)
5731fcf5ef2aSThomas Huth {
5732ede146c2SPaolo Bonzini     uint64_t *array = (uint64_t *)opaque;
5733fcf5ef2aSThomas Huth     FeatureWord w;
5734fcf5ef2aSThomas Huth     X86CPUFeatureWordInfo word_infos[FEATURE_WORDS] = { };
5735fcf5ef2aSThomas Huth     X86CPUFeatureWordInfoList list_entries[FEATURE_WORDS] = { };
5736fcf5ef2aSThomas Huth     X86CPUFeatureWordInfoList *list = NULL;
5737fcf5ef2aSThomas Huth 
5738fcf5ef2aSThomas Huth     for (w = 0; w < FEATURE_WORDS; w++) {
5739fcf5ef2aSThomas Huth         FeatureWordInfo *wi = &feature_word_info[w];
574007585923SRobert Hoo         /*
574107585923SRobert Hoo                 * We didn't have MSR features when "feature-words" was
574207585923SRobert Hoo                 *  introduced. Therefore skipped other type entries.
574307585923SRobert Hoo                 */
574407585923SRobert Hoo         if (wi->type != CPUID_FEATURE_WORD) {
574507585923SRobert Hoo             continue;
574607585923SRobert Hoo         }
5747fcf5ef2aSThomas Huth         X86CPUFeatureWordInfo *qwi = &word_infos[w];
574807585923SRobert Hoo         qwi->cpuid_input_eax = wi->cpuid.eax;
574907585923SRobert Hoo         qwi->has_cpuid_input_ecx = wi->cpuid.needs_ecx;
575007585923SRobert Hoo         qwi->cpuid_input_ecx = wi->cpuid.ecx;
575107585923SRobert Hoo         qwi->cpuid_register = x86_reg_info_32[wi->cpuid.reg].qapi_enum;
5752fcf5ef2aSThomas Huth         qwi->features = array[w];
5753fcf5ef2aSThomas Huth 
5754fcf5ef2aSThomas Huth         /* List will be in reverse order, but order shouldn't matter */
5755fcf5ef2aSThomas Huth         list_entries[w].next = list;
5756fcf5ef2aSThomas Huth         list_entries[w].value = &word_infos[w];
5757fcf5ef2aSThomas Huth         list = &list_entries[w];
5758fcf5ef2aSThomas Huth     }
5759fcf5ef2aSThomas Huth 
5760fcf5ef2aSThomas Huth     visit_type_X86CPUFeatureWordInfoList(v, "feature-words", &list, errp);
5761fcf5ef2aSThomas Huth }
5762fcf5ef2aSThomas Huth 
5763fcf5ef2aSThomas Huth /* Convert all '_' in a feature string option name to '-', to make feature
5764fcf5ef2aSThomas Huth  * name conform to QOM property naming rule, which uses '-' instead of '_'.
5765fcf5ef2aSThomas Huth  */
feat2prop(char * s)5766fcf5ef2aSThomas Huth static inline void feat2prop(char *s)
5767fcf5ef2aSThomas Huth {
5768fcf5ef2aSThomas Huth     while ((s = strchr(s, '_'))) {
5769fcf5ef2aSThomas Huth         *s = '-';
5770fcf5ef2aSThomas Huth     }
5771fcf5ef2aSThomas Huth }
5772fcf5ef2aSThomas Huth 
5773fcf5ef2aSThomas Huth /* Return the feature property name for a feature flag bit */
x86_cpu_feature_name(FeatureWord w,int bitnr)5774fcf5ef2aSThomas Huth static const char *x86_cpu_feature_name(FeatureWord w, int bitnr)
5775fcf5ef2aSThomas Huth {
5776ede146c2SPaolo Bonzini     const char *name;
5777fcf5ef2aSThomas Huth     /* XSAVE components are automatically enabled by other features,
5778fcf5ef2aSThomas Huth      * so return the original feature name instead
5779fcf5ef2aSThomas Huth      */
5780301e9067SYang Weijiang     if (w == FEAT_XSAVE_XCR0_LO || w == FEAT_XSAVE_XCR0_HI) {
5781301e9067SYang Weijiang         int comp = (w == FEAT_XSAVE_XCR0_HI) ? bitnr + 32 : bitnr;
5782fcf5ef2aSThomas Huth 
5783fcf5ef2aSThomas Huth         if (comp < ARRAY_SIZE(x86_ext_save_areas) &&
5784fcf5ef2aSThomas Huth             x86_ext_save_areas[comp].bits) {
5785fcf5ef2aSThomas Huth             w = x86_ext_save_areas[comp].feature;
5786fcf5ef2aSThomas Huth             bitnr = ctz32(x86_ext_save_areas[comp].bits);
5787fcf5ef2aSThomas Huth         }
5788fcf5ef2aSThomas Huth     }
5789fcf5ef2aSThomas Huth 
5790ede146c2SPaolo Bonzini     assert(bitnr < 64);
5791fcf5ef2aSThomas Huth     assert(w < FEATURE_WORDS);
5792ede146c2SPaolo Bonzini     name = feature_word_info[w].feat_names[bitnr];
5793ede146c2SPaolo Bonzini     assert(bitnr < 32 || !(name && feature_word_info[w].type == CPUID_FEATURE_WORD));
5794ede146c2SPaolo Bonzini     return name;
5795fcf5ef2aSThomas Huth }
5796fcf5ef2aSThomas Huth 
5797bad5cfcdSMichael Tokarev /* Compatibility hack to maintain legacy +-feat semantic,
5798fcf5ef2aSThomas Huth  * where +-feat overwrites any feature set by
5799fcf5ef2aSThomas Huth  * feat=on|feat even if the later is parsed after +-feat
5800fcf5ef2aSThomas Huth  * (i.e. "-x2apic,x2apic=on" will result in x2apic disabled)
5801fcf5ef2aSThomas Huth  */
5802fcf5ef2aSThomas Huth static GList *plus_features, *minus_features;
5803fcf5ef2aSThomas Huth 
compare_string(gconstpointer a,gconstpointer b)5804fcf5ef2aSThomas Huth static gint compare_string(gconstpointer a, gconstpointer b)
5805fcf5ef2aSThomas Huth {
5806fcf5ef2aSThomas Huth     return g_strcmp0(a, b);
5807fcf5ef2aSThomas Huth }
5808fcf5ef2aSThomas Huth 
5809fcf5ef2aSThomas Huth /* Parse "+feature,-feature,feature=foo" CPU feature string
5810fcf5ef2aSThomas Huth  */
x86_cpu_parse_featurestr(const char * typename,char * features,Error ** errp)5811fcf5ef2aSThomas Huth static void x86_cpu_parse_featurestr(const char *typename, char *features,
5812fcf5ef2aSThomas Huth                                      Error **errp)
5813fcf5ef2aSThomas Huth {
5814fcf5ef2aSThomas Huth     char *featurestr; /* Single 'key=value" string being parsed */
5815fcf5ef2aSThomas Huth     static bool cpu_globals_initialized;
5816fcf5ef2aSThomas Huth     bool ambiguous = false;
5817fcf5ef2aSThomas Huth 
5818fcf5ef2aSThomas Huth     if (cpu_globals_initialized) {
5819fcf5ef2aSThomas Huth         return;
5820fcf5ef2aSThomas Huth     }
5821fcf5ef2aSThomas Huth     cpu_globals_initialized = true;
5822fcf5ef2aSThomas Huth 
5823fcf5ef2aSThomas Huth     if (!features) {
5824fcf5ef2aSThomas Huth         return;
5825fcf5ef2aSThomas Huth     }
5826fcf5ef2aSThomas Huth 
5827fcf5ef2aSThomas Huth     for (featurestr = strtok(features, ",");
5828fcf5ef2aSThomas Huth          featurestr;
5829fcf5ef2aSThomas Huth          featurestr = strtok(NULL, ",")) {
5830fcf5ef2aSThomas Huth         const char *name;
5831fcf5ef2aSThomas Huth         const char *val = NULL;
5832fcf5ef2aSThomas Huth         char *eq = NULL;
5833fcf5ef2aSThomas Huth         char num[32];
5834fcf5ef2aSThomas Huth         GlobalProperty *prop;
5835fcf5ef2aSThomas Huth 
5836fcf5ef2aSThomas Huth         /* Compatibility syntax: */
5837fcf5ef2aSThomas Huth         if (featurestr[0] == '+') {
5838fcf5ef2aSThomas Huth             plus_features = g_list_append(plus_features,
5839fcf5ef2aSThomas Huth                                           g_strdup(featurestr + 1));
5840fcf5ef2aSThomas Huth             continue;
5841fcf5ef2aSThomas Huth         } else if (featurestr[0] == '-') {
5842fcf5ef2aSThomas Huth             minus_features = g_list_append(minus_features,
5843fcf5ef2aSThomas Huth                                            g_strdup(featurestr + 1));
5844fcf5ef2aSThomas Huth             continue;
5845fcf5ef2aSThomas Huth         }
5846fcf5ef2aSThomas Huth 
5847fcf5ef2aSThomas Huth         eq = strchr(featurestr, '=');
5848fcf5ef2aSThomas Huth         if (eq) {
5849fcf5ef2aSThomas Huth             *eq++ = 0;
5850fcf5ef2aSThomas Huth             val = eq;
5851fcf5ef2aSThomas Huth         } else {
5852fcf5ef2aSThomas Huth             val = "on";
5853fcf5ef2aSThomas Huth         }
5854fcf5ef2aSThomas Huth 
5855fcf5ef2aSThomas Huth         feat2prop(featurestr);
5856fcf5ef2aSThomas Huth         name = featurestr;
5857fcf5ef2aSThomas Huth 
5858fcf5ef2aSThomas Huth         if (g_list_find_custom(plus_features, name, compare_string)) {
58593dc6f869SAlistair Francis             warn_report("Ambiguous CPU model string. "
5860fcf5ef2aSThomas Huth                         "Don't mix both \"+%s\" and \"%s=%s\"",
5861fcf5ef2aSThomas Huth                         name, name, val);
5862fcf5ef2aSThomas Huth             ambiguous = true;
5863fcf5ef2aSThomas Huth         }
5864fcf5ef2aSThomas Huth         if (g_list_find_custom(minus_features, name, compare_string)) {
58653dc6f869SAlistair Francis             warn_report("Ambiguous CPU model string. "
5866fcf5ef2aSThomas Huth                         "Don't mix both \"-%s\" and \"%s=%s\"",
5867fcf5ef2aSThomas Huth                         name, name, val);
5868fcf5ef2aSThomas Huth             ambiguous = true;
5869fcf5ef2aSThomas Huth         }
5870fcf5ef2aSThomas Huth 
5871fcf5ef2aSThomas Huth         /* Special case: */
5872fcf5ef2aSThomas Huth         if (!strcmp(name, "tsc-freq")) {
5873f17fd4fdSMarkus Armbruster             int ret;
5874f46bfdbfSMarkus Armbruster             uint64_t tsc_freq;
5875fcf5ef2aSThomas Huth 
5876f17fd4fdSMarkus Armbruster             ret = qemu_strtosz_metric(val, NULL, &tsc_freq);
5877f46bfdbfSMarkus Armbruster             if (ret < 0 || tsc_freq > INT64_MAX) {
5878fcf5ef2aSThomas Huth                 error_setg(errp, "bad numerical value %s", val);
5879fcf5ef2aSThomas Huth                 return;
5880fcf5ef2aSThomas Huth             }
5881fcf5ef2aSThomas Huth             snprintf(num, sizeof(num), "%" PRId64, tsc_freq);
5882fcf5ef2aSThomas Huth             val = num;
5883fcf5ef2aSThomas Huth             name = "tsc-frequency";
5884fcf5ef2aSThomas Huth         }
5885fcf5ef2aSThomas Huth 
5886fcf5ef2aSThomas Huth         prop = g_new0(typeof(*prop), 1);
5887fcf5ef2aSThomas Huth         prop->driver = typename;
5888fcf5ef2aSThomas Huth         prop->property = g_strdup(name);
5889fcf5ef2aSThomas Huth         prop->value = g_strdup(val);
5890fcf5ef2aSThomas Huth         qdev_prop_register_global(prop);
5891fcf5ef2aSThomas Huth     }
5892fcf5ef2aSThomas Huth 
5893fcf5ef2aSThomas Huth     if (ambiguous) {
58943dc6f869SAlistair Francis         warn_report("Compatibility of ambiguous CPU model "
5895fcf5ef2aSThomas Huth                     "strings won't be kept on future QEMU versions");
5896fcf5ef2aSThomas Huth     }
5897fcf5ef2aSThomas Huth }
5898fcf5ef2aSThomas Huth 
58993507c6f0SPaolo Bonzini static bool x86_cpu_filter_features(X86CPU *cpu, bool verbose);
5900fcf5ef2aSThomas Huth 
59015a853fc5SEduardo Habkost /* Build a list with the name of all features on a feature word array */
x86_cpu_list_feature_names(FeatureWordArray features,strList ** list)59025a853fc5SEduardo Habkost static void x86_cpu_list_feature_names(FeatureWordArray features,
5903c3033fd3SEric Blake                                        strList **list)
59045a853fc5SEduardo Habkost {
5905c3033fd3SEric Blake     strList **tail = list;
59065a853fc5SEduardo Habkost     FeatureWord w;
59075a853fc5SEduardo Habkost 
59085a853fc5SEduardo Habkost     for (w = 0; w < FEATURE_WORDS; w++) {
5909ede146c2SPaolo Bonzini         uint64_t filtered = features[w];
59105a853fc5SEduardo Habkost         int i;
5911ede146c2SPaolo Bonzini         for (i = 0; i < 64; i++) {
5912ede146c2SPaolo Bonzini             if (filtered & (1ULL << i)) {
5913c3033fd3SEric Blake                 QAPI_LIST_APPEND(tail, g_strdup(x86_cpu_feature_name(w, i)));
59145a853fc5SEduardo Habkost             }
59155a853fc5SEduardo Habkost         }
59165a853fc5SEduardo Habkost     }
59175a853fc5SEduardo Habkost }
59185a853fc5SEduardo Habkost 
x86_cpu_get_unavailable_features(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)5919506174bfSEduardo Habkost static void x86_cpu_get_unavailable_features(Object *obj, Visitor *v,
5920506174bfSEduardo Habkost                                              const char *name, void *opaque,
5921506174bfSEduardo Habkost                                              Error **errp)
5922506174bfSEduardo Habkost {
5923506174bfSEduardo Habkost     X86CPU *xc = X86_CPU(obj);
5924506174bfSEduardo Habkost     strList *result = NULL;
5925506174bfSEduardo Habkost 
5926506174bfSEduardo Habkost     x86_cpu_list_feature_names(xc->filtered_features, &result);
5927506174bfSEduardo Habkost     visit_type_strList(v, "unavailable-features", &result, errp);
5928506174bfSEduardo Habkost }
5929506174bfSEduardo Habkost 
5930fcf5ef2aSThomas Huth /* Print all cpuid feature names in featureset
5931fcf5ef2aSThomas Huth  */
listflags(GList * features)59320442428aSMarkus Armbruster static void listflags(GList *features)
5933fcf5ef2aSThomas Huth {
5934cc643b1eSDaniel P. Berrangé     size_t len = 0;
5935cc643b1eSDaniel P. Berrangé     GList *tmp;
5936fcf5ef2aSThomas Huth 
5937cc643b1eSDaniel P. Berrangé     for (tmp = features; tmp; tmp = tmp->next) {
5938cc643b1eSDaniel P. Berrangé         const char *name = tmp->data;
5939cc643b1eSDaniel P. Berrangé         if ((len + strlen(name) + 1) >= 75) {
59400442428aSMarkus Armbruster             qemu_printf("\n");
5941cc643b1eSDaniel P. Berrangé             len = 0;
5942fcf5ef2aSThomas Huth         }
59430442428aSMarkus Armbruster         qemu_printf("%s%s", len == 0 ? "  " : " ", name);
5944cc643b1eSDaniel P. Berrangé         len += strlen(name) + 1;
5945fcf5ef2aSThomas Huth     }
59460442428aSMarkus Armbruster     qemu_printf("\n");
5947fcf5ef2aSThomas Huth }
5948fcf5ef2aSThomas Huth 
5949f48c8837SEduardo Habkost /* Sort alphabetically by type name, respecting X86CPUClass::ordering. */
x86_cpu_list_compare(gconstpointer a,gconstpointer b)5950fcf5ef2aSThomas Huth static gint x86_cpu_list_compare(gconstpointer a, gconstpointer b)
5951fcf5ef2aSThomas Huth {
5952fcf5ef2aSThomas Huth     ObjectClass *class_a = (ObjectClass *)a;
5953fcf5ef2aSThomas Huth     ObjectClass *class_b = (ObjectClass *)b;
5954fcf5ef2aSThomas Huth     X86CPUClass *cc_a = X86_CPU_CLASS(class_a);
5955fcf5ef2aSThomas Huth     X86CPUClass *cc_b = X86_CPU_CLASS(class_b);
5956c7dbff4bSDaniel P. Berrangé     int ret;
5957fcf5ef2aSThomas Huth 
5958f48c8837SEduardo Habkost     if (cc_a->ordering != cc_b->ordering) {
5959c7dbff4bSDaniel P. Berrangé         ret = cc_a->ordering - cc_b->ordering;
5960fcf5ef2aSThomas Huth     } else {
596188703ce2SEduardo Habkost         g_autofree char *name_a = x86_cpu_class_get_model_name(cc_a);
596288703ce2SEduardo Habkost         g_autofree char *name_b = x86_cpu_class_get_model_name(cc_b);
5963c7dbff4bSDaniel P. Berrangé         ret = strcmp(name_a, name_b);
5964fcf5ef2aSThomas Huth     }
5965c7dbff4bSDaniel P. Berrangé     return ret;
5966fcf5ef2aSThomas Huth }
5967fcf5ef2aSThomas Huth 
get_sorted_cpu_model_list(void)5968fcf5ef2aSThomas Huth static GSList *get_sorted_cpu_model_list(void)
5969fcf5ef2aSThomas Huth {
5970fcf5ef2aSThomas Huth     GSList *list = object_class_get_list(TYPE_X86_CPU, false);
5971fcf5ef2aSThomas Huth     list = g_slist_sort(list, x86_cpu_list_compare);
5972fcf5ef2aSThomas Huth     return list;
5973fcf5ef2aSThomas Huth }
5974fcf5ef2aSThomas Huth 
x86_cpu_class_get_model_id(X86CPUClass * xc)5975164e779cSEduardo Habkost static char *x86_cpu_class_get_model_id(X86CPUClass *xc)
5976164e779cSEduardo Habkost {
59773c75e12eSPaolo Bonzini     Object *obj = object_new_with_class(OBJECT_CLASS(xc));
5978164e779cSEduardo Habkost     char *r = object_property_get_str(obj, "model-id", &error_abort);
5979164e779cSEduardo Habkost     object_unref(obj);
5980164e779cSEduardo Habkost     return r;
5981164e779cSEduardo Habkost }
5982164e779cSEduardo Habkost 
x86_cpu_class_get_alias_of(X86CPUClass * cc)59830788a56bSEduardo Habkost static char *x86_cpu_class_get_alias_of(X86CPUClass *cc)
59840788a56bSEduardo Habkost {
59850788a56bSEduardo Habkost     X86CPUVersion version;
59860788a56bSEduardo Habkost 
59870788a56bSEduardo Habkost     if (!cc->model || !cc->model->is_alias) {
59880788a56bSEduardo Habkost         return NULL;
59890788a56bSEduardo Habkost     }
59900788a56bSEduardo Habkost     version = x86_cpu_model_resolve_version(cc->model);
59910788a56bSEduardo Habkost     if (version <= 0) {
59920788a56bSEduardo Habkost         return NULL;
59930788a56bSEduardo Habkost     }
59940788a56bSEduardo Habkost     return x86_cpu_versioned_model_name(cc->model->cpudef, version);
59950788a56bSEduardo Habkost }
59960788a56bSEduardo Habkost 
x86_cpu_list_entry(gpointer data,gpointer user_data)5997fcf5ef2aSThomas Huth static void x86_cpu_list_entry(gpointer data, gpointer user_data)
5998fcf5ef2aSThomas Huth {
5999fcf5ef2aSThomas Huth     ObjectClass *oc = data;
6000fcf5ef2aSThomas Huth     X86CPUClass *cc = X86_CPU_CLASS(oc);
600188703ce2SEduardo Habkost     g_autofree char *name = x86_cpu_class_get_model_name(cc);
600288703ce2SEduardo Habkost     g_autofree char *desc = g_strdup(cc->model_description);
600388703ce2SEduardo Habkost     g_autofree char *alias_of = x86_cpu_class_get_alias_of(cc);
6004c63938dfSTao Xu     g_autofree char *model_id = x86_cpu_class_get_model_id(cc);
6005164e779cSEduardo Habkost 
60060788a56bSEduardo Habkost     if (!desc && alias_of) {
60070788a56bSEduardo Habkost         if (cc->model && cc->model->version == CPU_VERSION_AUTO) {
60080788a56bSEduardo Habkost             desc = g_strdup("(alias configured by machine type)");
60090788a56bSEduardo Habkost         } else {
60100788a56bSEduardo Habkost             desc = g_strdup_printf("(alias of %s)", alias_of);
60110788a56bSEduardo Habkost         }
60120788a56bSEduardo Habkost     }
6013c63938dfSTao Xu     if (!desc && cc->model && cc->model->note) {
6014c63938dfSTao Xu         desc = g_strdup_printf("%s [%s]", model_id, cc->model->note);
6015c63938dfSTao Xu     }
6016164e779cSEduardo Habkost     if (!desc) {
6017c63938dfSTao Xu         desc = g_strdup_printf("%s", model_id);
6018fcf5ef2aSThomas Huth     }
6019fcf5ef2aSThomas Huth 
60205dfa9e86SDaniel P. Berrangé     if (cc->model && cc->model->cpudef->deprecation_note) {
60215dfa9e86SDaniel P. Berrangé         g_autofree char *olddesc = desc;
60225dfa9e86SDaniel P. Berrangé         desc = g_strdup_printf("%s (deprecated)", olddesc);
60235dfa9e86SDaniel P. Berrangé     }
60245dfa9e86SDaniel P. Berrangé 
602549843214SThomas Huth     qemu_printf("  %-20s  %s\n", name, desc);
6026fcf5ef2aSThomas Huth }
6027fcf5ef2aSThomas Huth 
6028fcf5ef2aSThomas Huth /* list available CPU models and flags */
x86_cpu_list(void)60290442428aSMarkus Armbruster void x86_cpu_list(void)
6030fcf5ef2aSThomas Huth {
6031cc643b1eSDaniel P. Berrangé     int i, j;
6032fcf5ef2aSThomas Huth     GSList *list;
6033cc643b1eSDaniel P. Berrangé     GList *names = NULL;
6034fcf5ef2aSThomas Huth 
60350442428aSMarkus Armbruster     qemu_printf("Available CPUs:\n");
6036fcf5ef2aSThomas Huth     list = get_sorted_cpu_model_list();
60370442428aSMarkus Armbruster     g_slist_foreach(list, x86_cpu_list_entry, NULL);
6038fcf5ef2aSThomas Huth     g_slist_free(list);
6039fcf5ef2aSThomas Huth 
6040cc643b1eSDaniel P. Berrangé     names = NULL;
6041fcf5ef2aSThomas Huth     for (i = 0; i < ARRAY_SIZE(feature_word_info); i++) {
6042fcf5ef2aSThomas Huth         FeatureWordInfo *fw = &feature_word_info[i];
6043ede146c2SPaolo Bonzini         for (j = 0; j < 64; j++) {
6044cc643b1eSDaniel P. Berrangé             if (fw->feat_names[j]) {
6045cc643b1eSDaniel P. Berrangé                 names = g_list_append(names, (gpointer)fw->feat_names[j]);
6046fcf5ef2aSThomas Huth             }
6047fcf5ef2aSThomas Huth         }
6048cc643b1eSDaniel P. Berrangé     }
6049cc643b1eSDaniel P. Berrangé 
6050cc643b1eSDaniel P. Berrangé     names = g_list_sort(names, (GCompareFunc)strcmp);
6051cc643b1eSDaniel P. Berrangé 
60520442428aSMarkus Armbruster     qemu_printf("\nRecognized CPUID flags:\n");
60530442428aSMarkus Armbruster     listflags(names);
60540442428aSMarkus Armbruster     qemu_printf("\n");
6055cc643b1eSDaniel P. Berrangé     g_list_free(names);
6056cc643b1eSDaniel P. Berrangé }
6057fcf5ef2aSThomas Huth 
6058390dbc6eSPhilippe Mathieu-Daudé #ifndef CONFIG_USER_ONLY
6059390dbc6eSPhilippe Mathieu-Daudé 
6060390dbc6eSPhilippe Mathieu-Daudé /* Check for missing features that may prevent the CPU class from
6061390dbc6eSPhilippe Mathieu-Daudé  * running using the current machine and accelerator.
6062390dbc6eSPhilippe Mathieu-Daudé  */
x86_cpu_class_check_missing_features(X86CPUClass * xcc,strList ** list)6063390dbc6eSPhilippe Mathieu-Daudé static void x86_cpu_class_check_missing_features(X86CPUClass *xcc,
6064390dbc6eSPhilippe Mathieu-Daudé                                                  strList **list)
6065390dbc6eSPhilippe Mathieu-Daudé {
6066390dbc6eSPhilippe Mathieu-Daudé     strList **tail = list;
6067390dbc6eSPhilippe Mathieu-Daudé     X86CPU *xc;
6068390dbc6eSPhilippe Mathieu-Daudé     Error *err = NULL;
6069390dbc6eSPhilippe Mathieu-Daudé 
6070390dbc6eSPhilippe Mathieu-Daudé     if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
6071390dbc6eSPhilippe Mathieu-Daudé         QAPI_LIST_APPEND(tail, g_strdup("kvm"));
6072390dbc6eSPhilippe Mathieu-Daudé         return;
6073390dbc6eSPhilippe Mathieu-Daudé     }
6074390dbc6eSPhilippe Mathieu-Daudé 
6075390dbc6eSPhilippe Mathieu-Daudé     xc = X86_CPU(object_new_with_class(OBJECT_CLASS(xcc)));
6076390dbc6eSPhilippe Mathieu-Daudé 
6077390dbc6eSPhilippe Mathieu-Daudé     x86_cpu_expand_features(xc, &err);
6078390dbc6eSPhilippe Mathieu-Daudé     if (err) {
6079390dbc6eSPhilippe Mathieu-Daudé         /* Errors at x86_cpu_expand_features should never happen,
6080390dbc6eSPhilippe Mathieu-Daudé          * but in case it does, just report the model as not
6081390dbc6eSPhilippe Mathieu-Daudé          * runnable at all using the "type" property.
6082390dbc6eSPhilippe Mathieu-Daudé          */
6083390dbc6eSPhilippe Mathieu-Daudé         QAPI_LIST_APPEND(tail, g_strdup("type"));
6084390dbc6eSPhilippe Mathieu-Daudé         error_free(err);
6085390dbc6eSPhilippe Mathieu-Daudé     }
6086390dbc6eSPhilippe Mathieu-Daudé 
6087390dbc6eSPhilippe Mathieu-Daudé     x86_cpu_filter_features(xc, false);
6088390dbc6eSPhilippe Mathieu-Daudé 
6089390dbc6eSPhilippe Mathieu-Daudé     x86_cpu_list_feature_names(xc->filtered_features, tail);
6090390dbc6eSPhilippe Mathieu-Daudé 
6091390dbc6eSPhilippe Mathieu-Daudé     object_unref(OBJECT(xc));
6092390dbc6eSPhilippe Mathieu-Daudé }
6093390dbc6eSPhilippe Mathieu-Daudé 
x86_cpu_definition_entry(gpointer data,gpointer user_data)6094fcf5ef2aSThomas Huth static void x86_cpu_definition_entry(gpointer data, gpointer user_data)
6095fcf5ef2aSThomas Huth {
6096fcf5ef2aSThomas Huth     ObjectClass *oc = data;
6097fcf5ef2aSThomas Huth     X86CPUClass *cc = X86_CPU_CLASS(oc);
6098fcf5ef2aSThomas Huth     CpuDefinitionInfoList **cpu_list = user_data;
6099fcf5ef2aSThomas Huth     CpuDefinitionInfo *info;
6100fcf5ef2aSThomas Huth 
6101fcf5ef2aSThomas Huth     info = g_malloc0(sizeof(*info));
6102fcf5ef2aSThomas Huth     info->name = x86_cpu_class_get_model_name(cc);
6103fcf5ef2aSThomas Huth     x86_cpu_class_check_missing_features(cc, &info->unavailable_features);
6104fcf5ef2aSThomas Huth     info->has_unavailable_features = true;
61058ed877b7SEduardo Habkost     info->q_typename = g_strdup(object_class_get_name(oc));
6106bd72159dSEduardo Habkost     info->migration_safe = cc->migration_safe;
6107bd72159dSEduardo Habkost     info->has_migration_safe = true;
61085adbed30SEduardo Habkost     info->q_static = cc->static_model;
610961ad65d0SRobert Hoo     if (cc->model && cc->model->cpudef->deprecation_note) {
611061ad65d0SRobert Hoo         info->deprecated = true;
611161ad65d0SRobert Hoo     } else {
611261ad65d0SRobert Hoo         info->deprecated = false;
611361ad65d0SRobert Hoo     }
61140788a56bSEduardo Habkost     /*
61150788a56bSEduardo Habkost      * Old machine types won't report aliases, so that alias translation
61160788a56bSEduardo Habkost      * doesn't break compatibility with previous QEMU versions.
61170788a56bSEduardo Habkost      */
61180788a56bSEduardo Habkost     if (default_cpu_version != CPU_VERSION_LEGACY) {
61190788a56bSEduardo Habkost         info->alias_of = x86_cpu_class_get_alias_of(cc);
61200788a56bSEduardo Habkost     }
6121fcf5ef2aSThomas Huth 
612254aa3de7SEric Blake     QAPI_LIST_PREPEND(*cpu_list, info);
6123fcf5ef2aSThomas Huth }
6124fcf5ef2aSThomas Huth 
qmp_query_cpu_definitions(Error ** errp)612525a9d6caSMarc-André Lureau CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
6126fcf5ef2aSThomas Huth {
6127fcf5ef2aSThomas Huth     CpuDefinitionInfoList *cpu_list = NULL;
6128fcf5ef2aSThomas Huth     GSList *list = get_sorted_cpu_model_list();
6129fcf5ef2aSThomas Huth     g_slist_foreach(list, x86_cpu_definition_entry, &cpu_list);
6130fcf5ef2aSThomas Huth     g_slist_free(list);
6131fcf5ef2aSThomas Huth     return cpu_list;
6132fcf5ef2aSThomas Huth }
6133fcf5ef2aSThomas Huth 
6134390dbc6eSPhilippe Mathieu-Daudé #endif /* !CONFIG_USER_ONLY */
6135390dbc6eSPhilippe Mathieu-Daudé 
x86_cpu_get_supported_feature_word(X86CPU * cpu,FeatureWord w)61368dee3848SPaolo Bonzini uint64_t x86_cpu_get_supported_feature_word(X86CPU *cpu, FeatureWord w)
6137fcf5ef2aSThomas Huth {
6138fcf5ef2aSThomas Huth     FeatureWordInfo *wi = &feature_word_info[w];
6139ede146c2SPaolo Bonzini     uint64_t r = 0;
614039635ccdSXiong Zhang     uint64_t unavail = 0;
6141fcf5ef2aSThomas Huth 
6142fcf5ef2aSThomas Huth     if (kvm_enabled()) {
614307585923SRobert Hoo         switch (wi->type) {
614407585923SRobert Hoo         case CPUID_FEATURE_WORD:
614507585923SRobert Hoo             r = kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid.eax,
614607585923SRobert Hoo                                                         wi->cpuid.ecx,
614707585923SRobert Hoo                                                         wi->cpuid.reg);
614807585923SRobert Hoo             break;
614907585923SRobert Hoo         case MSR_FEATURE_WORD:
6150d86f9636SRobert Hoo             r = kvm_arch_get_supported_msr_feature(kvm_state,
6151d86f9636SRobert Hoo                         wi->msr.index);
615207585923SRobert Hoo             break;
615307585923SRobert Hoo         }
6154d6dcc558SSergio Andres Gomez Del Real     } else if (hvf_enabled()) {
615507585923SRobert Hoo         if (wi->type != CPUID_FEATURE_WORD) {
615607585923SRobert Hoo             return 0;
615707585923SRobert Hoo         }
615807585923SRobert Hoo         r = hvf_get_supported_cpuid(wi->cpuid.eax,
615907585923SRobert Hoo                                     wi->cpuid.ecx,
616007585923SRobert Hoo                                     wi->cpuid.reg);
6161fcf5ef2aSThomas Huth     } else if (tcg_enabled()) {
6162fcf5ef2aSThomas Huth         r = wi->tcg_features;
6163fcf5ef2aSThomas Huth     } else {
6164fcf5ef2aSThomas Huth         return ~0;
6165fcf5ef2aSThomas Huth     }
61660b275741SPaolo Bonzini 
61670b275741SPaolo Bonzini     switch (w) {
61685ea9e9e2SPaolo Bonzini #ifndef TARGET_X86_64
61690b275741SPaolo Bonzini     case FEAT_8000_0001_EDX:
617040a205daSPaolo Bonzini         /*
617140a205daSPaolo Bonzini          * 32-bit TCG can emulate 64-bit compatibility mode.  If there is no
617240a205daSPaolo Bonzini          * way for userspace to get out of its 32-bit jail, we can leave
617340a205daSPaolo Bonzini          * the LM bit set.
617440a205daSPaolo Bonzini          */
61750b275741SPaolo Bonzini         unavail = tcg_enabled()
617640a205daSPaolo Bonzini             ? CPUID_EXT2_LM & ~CPUID_EXT2_KERNEL_FEATURES
617740a205daSPaolo Bonzini             : CPUID_EXT2_LM;
61780b275741SPaolo Bonzini         break;
61795ea9e9e2SPaolo Bonzini #endif
61800b275741SPaolo Bonzini 
61810b275741SPaolo Bonzini     case FEAT_8000_0007_EBX:
61820b275741SPaolo Bonzini         if (cpu && !IS_AMD_CPU(&cpu->env)) {
61830b275741SPaolo Bonzini             /* Disable AMD machine check architecture for Intel CPU.  */
61840b275741SPaolo Bonzini             unavail = ~0;
61850b275741SPaolo Bonzini         }
61860b275741SPaolo Bonzini         break;
61870b275741SPaolo Bonzini 
6188ada1f3caSZhao Liu     case FEAT_7_0_EBX:
6189ada1f3caSZhao Liu #ifndef CONFIG_USER_ONLY
6190ada1f3caSZhao Liu         if (!check_sgx_support()) {
6191ada1f3caSZhao Liu             unavail = CPUID_7_0_EBX_SGX;
6192ada1f3caSZhao Liu         }
6193ada1f3caSZhao Liu #endif
6194ada1f3caSZhao Liu         break;
6195ada1f3caSZhao Liu     case FEAT_7_0_ECX:
6196ada1f3caSZhao Liu #ifndef CONFIG_USER_ONLY
6197ada1f3caSZhao Liu         if (!check_sgx_support()) {
6198ada1f3caSZhao Liu             unavail = CPUID_7_0_ECX_SGX_LC;
6199ada1f3caSZhao Liu         }
6200ada1f3caSZhao Liu #endif
6201ada1f3caSZhao Liu         break;
6202ada1f3caSZhao Liu 
62030b275741SPaolo Bonzini     default:
62040b275741SPaolo Bonzini         break;
62050b275741SPaolo Bonzini     }
62060b275741SPaolo Bonzini 
62070b275741SPaolo Bonzini     r &= ~unavail;
62088dee3848SPaolo Bonzini     if (cpu && cpu->migratable) {
620987c88db3SXiaoyao Li         r &= x86_cpu_get_migratable_flags(cpu, w);
6210fcf5ef2aSThomas Huth     }
6211fcf5ef2aSThomas Huth     return r;
6212fcf5ef2aSThomas Huth }
6213fcf5ef2aSThomas Huth 
x86_cpu_get_supported_cpuid(uint32_t func,uint32_t index,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)6214d19d6ffaSPaolo Bonzini static void x86_cpu_get_supported_cpuid(uint32_t func, uint32_t index,
6215d19d6ffaSPaolo Bonzini                                         uint32_t *eax, uint32_t *ebx,
6216d19d6ffaSPaolo Bonzini                                         uint32_t *ecx, uint32_t *edx)
6217d19d6ffaSPaolo Bonzini {
6218d19d6ffaSPaolo Bonzini     if (kvm_enabled()) {
6219d19d6ffaSPaolo Bonzini         *eax = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EAX);
6220d19d6ffaSPaolo Bonzini         *ebx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EBX);
6221d19d6ffaSPaolo Bonzini         *ecx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_ECX);
6222d19d6ffaSPaolo Bonzini         *edx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EDX);
6223d19d6ffaSPaolo Bonzini     } else if (hvf_enabled()) {
6224d19d6ffaSPaolo Bonzini         *eax = hvf_get_supported_cpuid(func, index, R_EAX);
6225d19d6ffaSPaolo Bonzini         *ebx = hvf_get_supported_cpuid(func, index, R_EBX);
6226d19d6ffaSPaolo Bonzini         *ecx = hvf_get_supported_cpuid(func, index, R_ECX);
6227d19d6ffaSPaolo Bonzini         *edx = hvf_get_supported_cpuid(func, index, R_EDX);
6228d19d6ffaSPaolo Bonzini     } else {
6229d19d6ffaSPaolo Bonzini         *eax = 0;
6230d19d6ffaSPaolo Bonzini         *ebx = 0;
6231d19d6ffaSPaolo Bonzini         *ecx = 0;
6232d19d6ffaSPaolo Bonzini         *edx = 0;
6233d19d6ffaSPaolo Bonzini     }
6234d19d6ffaSPaolo Bonzini }
6235d19d6ffaSPaolo Bonzini 
x86_cpu_get_cache_cpuid(uint32_t func,uint32_t index,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)6236798d8ec0SPaolo Bonzini static void x86_cpu_get_cache_cpuid(uint32_t func, uint32_t index,
6237798d8ec0SPaolo Bonzini                                     uint32_t *eax, uint32_t *ebx,
6238798d8ec0SPaolo Bonzini                                     uint32_t *ecx, uint32_t *edx)
6239798d8ec0SPaolo Bonzini {
6240798d8ec0SPaolo Bonzini     uint32_t level, unused;
6241798d8ec0SPaolo Bonzini 
6242798d8ec0SPaolo Bonzini     /* Only return valid host leaves.  */
6243798d8ec0SPaolo Bonzini     switch (func) {
6244798d8ec0SPaolo Bonzini     case 2:
6245798d8ec0SPaolo Bonzini     case 4:
6246798d8ec0SPaolo Bonzini         host_cpuid(0, 0, &level, &unused, &unused, &unused);
6247798d8ec0SPaolo Bonzini         break;
6248798d8ec0SPaolo Bonzini     case 0x80000005:
6249798d8ec0SPaolo Bonzini     case 0x80000006:
6250798d8ec0SPaolo Bonzini     case 0x8000001d:
6251798d8ec0SPaolo Bonzini         host_cpuid(0x80000000, 0, &level, &unused, &unused, &unused);
6252798d8ec0SPaolo Bonzini         break;
6253798d8ec0SPaolo Bonzini     default:
6254798d8ec0SPaolo Bonzini         return;
6255798d8ec0SPaolo Bonzini     }
6256798d8ec0SPaolo Bonzini 
6257798d8ec0SPaolo Bonzini     if (func > level) {
6258798d8ec0SPaolo Bonzini         *eax = 0;
6259798d8ec0SPaolo Bonzini         *ebx = 0;
6260798d8ec0SPaolo Bonzini         *ecx = 0;
6261798d8ec0SPaolo Bonzini         *edx = 0;
6262798d8ec0SPaolo Bonzini     } else {
6263798d8ec0SPaolo Bonzini         host_cpuid(func, index, eax, ebx, ecx, edx);
6264798d8ec0SPaolo Bonzini     }
6265798d8ec0SPaolo Bonzini }
6266798d8ec0SPaolo Bonzini 
62675b8978d8SClaudio Fontana /*
62685b8978d8SClaudio Fontana  * Only for builtin_x86_defs models initialized with x86_register_cpudef_types.
62695b8978d8SClaudio Fontana  */
x86_cpu_apply_props(X86CPU * cpu,PropValue * props)6270f5cc5a5cSClaudio Fontana void x86_cpu_apply_props(X86CPU *cpu, PropValue *props)
6271fcf5ef2aSThomas Huth {
6272fcf5ef2aSThomas Huth     PropValue *pv;
6273fcf5ef2aSThomas Huth     for (pv = props; pv->prop; pv++) {
6274fcf5ef2aSThomas Huth         if (!pv->value) {
6275fcf5ef2aSThomas Huth             continue;
6276fcf5ef2aSThomas Huth         }
62775325cc34SMarkus Armbruster         object_property_parse(OBJECT(cpu), pv->prop, pv->value,
6278fcf5ef2aSThomas Huth                               &error_abort);
6279fcf5ef2aSThomas Huth     }
6280fcf5ef2aSThomas Huth }
6281fcf5ef2aSThomas Huth 
62825b8978d8SClaudio Fontana /*
62835b8978d8SClaudio Fontana  * Apply properties for the CPU model version specified in model.
62845b8978d8SClaudio Fontana  * Only for builtin_x86_defs models initialized with x86_register_cpudef_types.
62855b8978d8SClaudio Fontana  */
62865b8978d8SClaudio Fontana 
x86_cpu_apply_version_props(X86CPU * cpu,X86CPUModel * model)6287dcafd1efSEduardo Habkost static void x86_cpu_apply_version_props(X86CPU *cpu, X86CPUModel *model)
6288dcafd1efSEduardo Habkost {
6289dcafd1efSEduardo Habkost     const X86CPUVersionDefinition *vdef;
6290dcafd1efSEduardo Habkost     X86CPUVersion version = x86_cpu_model_resolve_version(model);
6291dcafd1efSEduardo Habkost 
6292dcafd1efSEduardo Habkost     if (version == CPU_VERSION_LEGACY) {
6293dcafd1efSEduardo Habkost         return;
6294dcafd1efSEduardo Habkost     }
6295dcafd1efSEduardo Habkost 
6296dcafd1efSEduardo Habkost     for (vdef = x86_cpu_def_get_versions(model->cpudef); vdef->version; vdef++) {
6297dcafd1efSEduardo Habkost         PropValue *p;
6298dcafd1efSEduardo Habkost 
6299dcafd1efSEduardo Habkost         for (p = vdef->props; p && p->prop; p++) {
63005325cc34SMarkus Armbruster             object_property_parse(OBJECT(cpu), p->prop, p->value,
6301dcafd1efSEduardo Habkost                                   &error_abort);
6302dcafd1efSEduardo Habkost         }
6303dcafd1efSEduardo Habkost 
6304dcafd1efSEduardo Habkost         if (vdef->version == version) {
6305dcafd1efSEduardo Habkost             break;
6306dcafd1efSEduardo Habkost         }
6307dcafd1efSEduardo Habkost     }
6308dcafd1efSEduardo Habkost 
6309dcafd1efSEduardo Habkost     /*
6310dcafd1efSEduardo Habkost      * If we reached the end of the list, version number was invalid
6311dcafd1efSEduardo Habkost      */
6312dcafd1efSEduardo Habkost     assert(vdef->version == version);
6313dcafd1efSEduardo Habkost }
6314dcafd1efSEduardo Habkost 
x86_cpu_get_versioned_cache_info(X86CPU * cpu,X86CPUModel * model)6315cca0a000SMichael Roth static const CPUCaches *x86_cpu_get_versioned_cache_info(X86CPU *cpu,
6316cca0a000SMichael Roth                                                          X86CPUModel *model)
6317cca0a000SMichael Roth {
6318cca0a000SMichael Roth     const X86CPUVersionDefinition *vdef;
6319cca0a000SMichael Roth     X86CPUVersion version = x86_cpu_model_resolve_version(model);
6320cca0a000SMichael Roth     const CPUCaches *cache_info = model->cpudef->cache_info;
6321cca0a000SMichael Roth 
6322cca0a000SMichael Roth     if (version == CPU_VERSION_LEGACY) {
6323cca0a000SMichael Roth         return cache_info;
6324cca0a000SMichael Roth     }
6325cca0a000SMichael Roth 
6326cca0a000SMichael Roth     for (vdef = x86_cpu_def_get_versions(model->cpudef); vdef->version; vdef++) {
6327cca0a000SMichael Roth         if (vdef->cache_info) {
6328cca0a000SMichael Roth             cache_info = vdef->cache_info;
6329cca0a000SMichael Roth         }
6330cca0a000SMichael Roth 
6331cca0a000SMichael Roth         if (vdef->version == version) {
6332cca0a000SMichael Roth             break;
6333cca0a000SMichael Roth         }
6334cca0a000SMichael Roth     }
6335cca0a000SMichael Roth 
6336cca0a000SMichael Roth     assert(vdef->version == version);
6337cca0a000SMichael Roth     return cache_info;
6338cca0a000SMichael Roth }
6339cca0a000SMichael Roth 
63405b8978d8SClaudio Fontana /*
63415b8978d8SClaudio Fontana  * Load data from X86CPUDefinition into a X86CPU object.
63425b8978d8SClaudio Fontana  * Only for builtin_x86_defs models initialized with x86_register_cpudef_types.
6343fcf5ef2aSThomas Huth  */
x86_cpu_load_model(X86CPU * cpu,X86CPUModel * model)634449e2fa85SMarkus Armbruster static void x86_cpu_load_model(X86CPU *cpu, X86CPUModel *model)
6345fcf5ef2aSThomas Huth {
6346e11fd689SPhilippe Mathieu-Daudé     const X86CPUDefinition *def = model->cpudef;
6347fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
6348fcf5ef2aSThomas Huth     FeatureWord w;
6349fcf5ef2aSThomas Huth 
6350f99fd7caSEduardo Habkost     /*NOTE: any property set by this function should be returned by
6351f99fd7caSEduardo Habkost      * x86_cpu_static_props(), so static expansion of
6352f99fd7caSEduardo Habkost      * query-cpu-model-expansion is always complete.
6353f99fd7caSEduardo Habkost      */
6354f99fd7caSEduardo Habkost 
6355fcf5ef2aSThomas Huth     /* CPU models only set _minimum_ values for level/xlevel: */
63565325cc34SMarkus Armbruster     object_property_set_uint(OBJECT(cpu), "min-level", def->level,
635749e2fa85SMarkus Armbruster                              &error_abort);
63585325cc34SMarkus Armbruster     object_property_set_uint(OBJECT(cpu), "min-xlevel", def->xlevel,
635949e2fa85SMarkus Armbruster                              &error_abort);
6360fcf5ef2aSThomas Huth 
63615325cc34SMarkus Armbruster     object_property_set_int(OBJECT(cpu), "family", def->family, &error_abort);
63625325cc34SMarkus Armbruster     object_property_set_int(OBJECT(cpu), "model", def->model, &error_abort);
63635325cc34SMarkus Armbruster     object_property_set_int(OBJECT(cpu), "stepping", def->stepping,
636449e2fa85SMarkus Armbruster                             &error_abort);
63655325cc34SMarkus Armbruster     object_property_set_str(OBJECT(cpu), "model-id", def->model_id,
636649e2fa85SMarkus Armbruster                             &error_abort);
6367fcf5ef2aSThomas Huth     for (w = 0; w < FEATURE_WORDS; w++) {
6368fcf5ef2aSThomas Huth         env->features[w] = def->features[w];
6369fcf5ef2aSThomas Huth     }
6370fcf5ef2aSThomas Huth 
6371a9f27ea9SEduardo Habkost     /* legacy-cache defaults to 'off' if CPU model provides cache info */
6372cca0a000SMichael Roth     cpu->legacy_cache = !x86_cpu_get_versioned_cache_info(cpu, model);
6373ab8f992eSBabu Moger 
6374fcf5ef2aSThomas Huth     env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR;
6375fcf5ef2aSThomas Huth 
6376fcf5ef2aSThomas Huth     /* sysenter isn't supported in compatibility mode on AMD,
6377fcf5ef2aSThomas Huth      * syscall isn't supported in compatibility mode on Intel.
6378fcf5ef2aSThomas Huth      * Normally we advertise the actual CPU vendor, but you can
6379fcf5ef2aSThomas Huth      * override this using the 'vendor' property if you want to use
6380fcf5ef2aSThomas Huth      * KVM's sysenter/syscall emulation in compatibility mode and
6381fcf5ef2aSThomas Huth      * when doing cross vendor migration
6382fcf5ef2aSThomas Huth      */
6383fcf5ef2aSThomas Huth 
6384f5cc5a5cSClaudio Fontana     /*
6385f5cc5a5cSClaudio Fontana      * vendor property is set here but then overloaded with the
6386f5cc5a5cSClaudio Fontana      * host cpu vendor for KVM and HVF.
6387f5cc5a5cSClaudio Fontana      */
6388f5cc5a5cSClaudio Fontana     object_property_set_str(OBJECT(cpu), "vendor", def->vendor, &error_abort);
6389fcf5ef2aSThomas Huth 
6390bccfb846STao Su     object_property_set_uint(OBJECT(cpu), "avx10-version", def->avx10_version,
6391bccfb846STao Su                              &error_abort);
6392bccfb846STao Su 
6393dcafd1efSEduardo Habkost     x86_cpu_apply_version_props(cpu, model);
63941f43671aSXiaoyao Li 
63951f43671aSXiaoyao Li     /*
63961f43671aSXiaoyao Li      * Properties in versioned CPU model are not user specified features.
63971f43671aSXiaoyao Li      * We can simply clear env->user_features here since it will be filled later
63981f43671aSXiaoyao Li      * in x86_cpu_expand_features() based on plus_features and minus_features.
63991f43671aSXiaoyao Li      */
64001f43671aSXiaoyao Li     memset(&env->user_features, 0, sizeof(env->user_features));
6401fcf5ef2aSThomas Huth }
6402fcf5ef2aSThomas Huth 
x86_gdb_arch_name(CPUState * cs)6403a6506838SAkihiko Odaki static const gchar *x86_gdb_arch_name(CPUState *cs)
640400fcd100SAbdallah Bouassida {
640500fcd100SAbdallah Bouassida #ifdef TARGET_X86_64
6406a6506838SAkihiko Odaki     return "i386:x86-64";
640700fcd100SAbdallah Bouassida #else
6408a6506838SAkihiko Odaki     return "i386";
640900fcd100SAbdallah Bouassida #endif
641000fcd100SAbdallah Bouassida }
641100fcd100SAbdallah Bouassida 
x86_cpu_cpudef_class_init(ObjectClass * oc,void * data)6412fcf5ef2aSThomas Huth static void x86_cpu_cpudef_class_init(ObjectClass *oc, void *data)
6413fcf5ef2aSThomas Huth {
6414dcafd1efSEduardo Habkost     X86CPUModel *model = data;
6415fcf5ef2aSThomas Huth     X86CPUClass *xcc = X86_CPU_CLASS(oc);
641661ad65d0SRobert Hoo     CPUClass *cc = CPU_CLASS(oc);
6417fcf5ef2aSThomas Huth 
6418dcafd1efSEduardo Habkost     xcc->model = model;
6419bd72159dSEduardo Habkost     xcc->migration_safe = true;
642061ad65d0SRobert Hoo     cc->deprecation_note = model->cpudef->deprecation_note;
6421fcf5ef2aSThomas Huth }
6422fcf5ef2aSThomas Huth 
x86_register_cpu_model_type(const char * name,X86CPUModel * model)6423dcafd1efSEduardo Habkost static void x86_register_cpu_model_type(const char *name, X86CPUModel *model)
6424fcf5ef2aSThomas Huth {
642588703ce2SEduardo Habkost     g_autofree char *typename = x86_cpu_type_name(name);
6426fcf5ef2aSThomas Huth     TypeInfo ti = {
6427fcf5ef2aSThomas Huth         .name = typename,
6428fcf5ef2aSThomas Huth         .parent = TYPE_X86_CPU,
6429fcf5ef2aSThomas Huth         .class_init = x86_cpu_cpudef_class_init,
6430dcafd1efSEduardo Habkost         .class_data = model,
6431fcf5ef2aSThomas Huth     };
6432fcf5ef2aSThomas Huth 
6433dcafd1efSEduardo Habkost     type_register(&ti);
6434dcafd1efSEduardo Habkost }
6435dcafd1efSEduardo Habkost 
64365b8978d8SClaudio Fontana 
64375b8978d8SClaudio Fontana /*
64385b8978d8SClaudio Fontana  * register builtin_x86_defs;
64395b8978d8SClaudio Fontana  * "max", "base" and subclasses ("host") are not registered here.
64405b8978d8SClaudio Fontana  * See x86_cpu_register_types for all model registrations.
64415b8978d8SClaudio Fontana  */
x86_register_cpudef_types(const X86CPUDefinition * def)6442e11fd689SPhilippe Mathieu-Daudé static void x86_register_cpudef_types(const X86CPUDefinition *def)
6443dcafd1efSEduardo Habkost {
6444dcafd1efSEduardo Habkost     X86CPUModel *m;
6445dcafd1efSEduardo Habkost     const X86CPUVersionDefinition *vdef;
6446dcafd1efSEduardo Habkost 
64472a923a29SEduardo Habkost     /* AMD aliases are handled at runtime based on CPUID vendor, so
64482a923a29SEduardo Habkost      * they shouldn't be set on the CPU model table.
64492a923a29SEduardo Habkost      */
64502a923a29SEduardo Habkost     assert(!(def->features[FEAT_8000_0001_EDX] & CPUID_EXT2_AMD_ALIASES));
6451807e9869SEduardo Habkost     /* catch mistakes instead of silently truncating model_id when too long */
6452807e9869SEduardo Habkost     assert(def->model_id && strlen(def->model_id) <= 48);
6453807e9869SEduardo Habkost 
6454dcafd1efSEduardo Habkost     /* Unversioned model: */
6455dcafd1efSEduardo Habkost     m = g_new0(X86CPUModel, 1);
6456dcafd1efSEduardo Habkost     m->cpudef = def;
64570788a56bSEduardo Habkost     m->version = CPU_VERSION_AUTO;
64580788a56bSEduardo Habkost     m->is_alias = true;
6459dcafd1efSEduardo Habkost     x86_register_cpu_model_type(def->name, m);
64602a923a29SEduardo Habkost 
6461dcafd1efSEduardo Habkost     /* Versioned models: */
6462dcafd1efSEduardo Habkost 
6463dcafd1efSEduardo Habkost     for (vdef = x86_cpu_def_get_versions(def); vdef->version; vdef++) {
646488703ce2SEduardo Habkost         g_autofree char *name =
646588703ce2SEduardo Habkost             x86_cpu_versioned_model_name(def, vdef->version);
6466637123a2SPaolo Bonzini 
6467637123a2SPaolo Bonzini         m = g_new0(X86CPUModel, 1);
6468dcafd1efSEduardo Habkost         m->cpudef = def;
6469dcafd1efSEduardo Habkost         m->version = vdef->version;
6470c63938dfSTao Xu         m->note = vdef->note;
6471dcafd1efSEduardo Habkost         x86_register_cpu_model_type(name, m);
647253db89d9SEduardo Habkost 
647353db89d9SEduardo Habkost         if (vdef->alias) {
647453db89d9SEduardo Habkost             X86CPUModel *am = g_new0(X86CPUModel, 1);
647553db89d9SEduardo Habkost             am->cpudef = def;
647653db89d9SEduardo Habkost             am->version = vdef->version;
64770788a56bSEduardo Habkost             am->is_alias = true;
647853db89d9SEduardo Habkost             x86_register_cpu_model_type(vdef->alias, am);
647953db89d9SEduardo Habkost         }
6480dcafd1efSEduardo Habkost     }
6481dcafd1efSEduardo Habkost 
6482fcf5ef2aSThomas Huth }
6483fcf5ef2aSThomas Huth 
cpu_x86_virtual_addr_width(CPUX86State * env)648497afb47eSLara Lazier uint32_t cpu_x86_virtual_addr_width(CPUX86State *env)
648597afb47eSLara Lazier {
648697afb47eSLara Lazier     if  (env->features[FEAT_7_0_ECX] & CPUID_7_0_ECX_LA57) {
648797afb47eSLara Lazier         return 57; /* 57 bits virtual */
648897afb47eSLara Lazier     } else {
648997afb47eSLara Lazier         return 48; /* 48 bits virtual */
649097afb47eSLara Lazier     }
649197afb47eSLara Lazier }
649297afb47eSLara Lazier 
cpu_x86_cpuid(CPUX86State * env,uint32_t index,uint32_t count,uint32_t * eax,uint32_t * ebx,uint32_t * ecx,uint32_t * edx)6493fcf5ef2aSThomas Huth void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
6494fcf5ef2aSThomas Huth                    uint32_t *eax, uint32_t *ebx,
6495fcf5ef2aSThomas Huth                    uint32_t *ecx, uint32_t *edx)
6496fcf5ef2aSThomas Huth {
64976aa9e42fSRichard Henderson     X86CPU *cpu = env_archcpu(env);
64986aa9e42fSRichard Henderson     CPUState *cs = env_cpu(env);
64994ed3d478SDaniel P. Berrange     uint32_t limit;
65001ce36bfeSDaniel P. Berrange     uint32_t signature[3];
6501f20dec0bSBabu Moger     X86CPUTopoInfo topo_info;
65022613747aSZhao Liu     uint32_t cores_per_pkg;
65032613747aSZhao Liu     uint32_t threads_per_pkg;
6504f20dec0bSBabu Moger 
6505f20dec0bSBabu Moger     topo_info.dies_per_pkg = env->nr_dies;
65063568adc9SZhao Liu     topo_info.modules_per_die = env->nr_modules;
65073568adc9SZhao Liu     topo_info.cores_per_module = cs->nr_cores / env->nr_dies / env->nr_modules;
6508f20dec0bSBabu Moger     topo_info.threads_per_core = cs->nr_threads;
6509fcf5ef2aSThomas Huth 
65103568adc9SZhao Liu     cores_per_pkg = topo_info.cores_per_module * topo_info.modules_per_die *
65113568adc9SZhao Liu                     topo_info.dies_per_pkg;
65122613747aSZhao Liu     threads_per_pkg = cores_per_pkg * topo_info.threads_per_core;
65132613747aSZhao Liu 
65144ed3d478SDaniel P. Berrange     /* Calculate & apply limits for different index ranges */
65154ed3d478SDaniel P. Berrange     if (index >= 0xC0000000) {
65164ed3d478SDaniel P. Berrange         limit = env->cpuid_xlevel2;
65174ed3d478SDaniel P. Berrange     } else if (index >= 0x80000000) {
65184ed3d478SDaniel P. Berrange         limit = env->cpuid_xlevel;
65191ce36bfeSDaniel P. Berrange     } else if (index >= 0x40000000) {
65201ce36bfeSDaniel P. Berrange         limit = 0x40000001;
6521fcf5ef2aSThomas Huth     } else {
65224ed3d478SDaniel P. Berrange         limit = env->cpuid_level;
65234ed3d478SDaniel P. Berrange     }
65244ed3d478SDaniel P. Berrange 
65254ed3d478SDaniel P. Berrange     if (index > limit) {
6526fcf5ef2aSThomas Huth         /* Intel documentation states that invalid EAX input will
6527fcf5ef2aSThomas Huth          * return the same information as EAX=cpuid_level
6528fcf5ef2aSThomas Huth          * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID)
6529fcf5ef2aSThomas Huth          */
6530fcf5ef2aSThomas Huth         index = env->cpuid_level;
6531fcf5ef2aSThomas Huth     }
6532fcf5ef2aSThomas Huth 
6533fcf5ef2aSThomas Huth     switch(index) {
6534fcf5ef2aSThomas Huth     case 0:
6535fcf5ef2aSThomas Huth         *eax = env->cpuid_level;
6536fcf5ef2aSThomas Huth         *ebx = env->cpuid_vendor1;
6537fcf5ef2aSThomas Huth         *edx = env->cpuid_vendor2;
6538fcf5ef2aSThomas Huth         *ecx = env->cpuid_vendor3;
6539fcf5ef2aSThomas Huth         break;
6540fcf5ef2aSThomas Huth     case 1:
6541fcf5ef2aSThomas Huth         *eax = env->cpuid_version;
6542fcf5ef2aSThomas Huth         *ebx = (cpu->apic_id << 24) |
6543fcf5ef2aSThomas Huth                8 << 8; /* CLFLUSH size in quad words, Linux wants it. */
6544fcf5ef2aSThomas Huth         *ecx = env->features[FEAT_1_ECX];
6545fcf5ef2aSThomas Huth         if ((*ecx & CPUID_EXT_XSAVE) && (env->cr[4] & CR4_OSXSAVE_MASK)) {
6546fcf5ef2aSThomas Huth             *ecx |= CPUID_EXT_OSXSAVE;
6547fcf5ef2aSThomas Huth         }
6548fcf5ef2aSThomas Huth         *edx = env->features[FEAT_1_EDX];
65492613747aSZhao Liu         if (threads_per_pkg > 1) {
65502613747aSZhao Liu             *ebx |= threads_per_pkg << 16;
6551fcf5ef2aSThomas Huth             *edx |= CPUID_HT;
6552fcf5ef2aSThomas Huth         }
6553ea39f9b6SLike Xu         if (!cpu->enable_pmu) {
6554ea39f9b6SLike Xu             *ecx &= ~CPUID_EXT_PDCM;
6555ea39f9b6SLike Xu         }
6556fcf5ef2aSThomas Huth         break;
6557fcf5ef2aSThomas Huth     case 2:
6558fcf5ef2aSThomas Huth         /* cache info: needed for Pentium Pro compatibility */
6559fcf5ef2aSThomas Huth         if (cpu->cache_info_passthrough) {
6560798d8ec0SPaolo Bonzini             x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
6561fcf5ef2aSThomas Huth             break;
6562a7a0da84SMichael Roth         } else if (cpu->vendor_cpuid_only && IS_AMD_CPU(env)) {
6563a7a0da84SMichael Roth             *eax = *ebx = *ecx = *edx = 0;
6564a7a0da84SMichael Roth             break;
6565fcf5ef2aSThomas Huth         }
6566fcf5ef2aSThomas Huth         *eax = 1; /* Number of CPUID[EAX=2] calls required */
6567fcf5ef2aSThomas Huth         *ebx = 0;
6568fcf5ef2aSThomas Huth         if (!cpu->enable_l3_cache) {
6569fcf5ef2aSThomas Huth             *ecx = 0;
6570fcf5ef2aSThomas Huth         } else {
6571a9f27ea9SEduardo Habkost             *ecx = cpuid2_cache_descriptor(env->cache_info_cpuid2.l3_cache);
6572fcf5ef2aSThomas Huth         }
6573a9f27ea9SEduardo Habkost         *edx = (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1d_cache) << 16) |
6574a9f27ea9SEduardo Habkost                (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1i_cache) <<  8) |
6575a9f27ea9SEduardo Habkost                (cpuid2_cache_descriptor(env->cache_info_cpuid2.l2_cache));
6576fcf5ef2aSThomas Huth         break;
6577f602eb92SZhao Liu     case 4:
6578fcf5ef2aSThomas Huth         /* cache info: needed for Core compatibility */
6579fcf5ef2aSThomas Huth         if (cpu->cache_info_passthrough) {
6580798d8ec0SPaolo Bonzini             x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx);
6581d7caf13bSIgor Mammedov             /*
6582d7caf13bSIgor Mammedov              * QEMU has its own number of cores/logical cpus,
6583d7caf13bSIgor Mammedov              * set 24..14, 31..26 bit to configured values
6584d7caf13bSIgor Mammedov              */
6585d7caf13bSIgor Mammedov             if (*eax & 31) {
6586d7caf13bSIgor Mammedov                 int host_vcpus_per_cache = 1 + ((*eax & 0x3FFC000) >> 14);
65872613747aSZhao Liu 
6588fcf5ef2aSThomas Huth                 *eax &= ~0xFC000000;
6589f602eb92SZhao Liu                 *eax |= max_core_ids_in_package(&topo_info) << 26;
65902613747aSZhao Liu                 if (host_vcpus_per_cache > threads_per_pkg) {
6591d7caf13bSIgor Mammedov                     *eax &= ~0x3FFC000;
6592f602eb92SZhao Liu 
6593f602eb92SZhao Liu                     /* Share the cache at package level. */
6594f602eb92SZhao Liu                     *eax |= max_thread_ids_for_cache(&topo_info,
6595e823ebe7SZhao Liu                                 CPU_TOPOLOGY_LEVEL_SOCKET) << 14;
6596d7caf13bSIgor Mammedov                 }
6597d7caf13bSIgor Mammedov             }
6598a7a0da84SMichael Roth         } else if (cpu->vendor_cpuid_only && IS_AMD_CPU(env)) {
6599a7a0da84SMichael Roth             *eax = *ebx = *ecx = *edx = 0;
6600fcf5ef2aSThomas Huth         } else {
6601fcf5ef2aSThomas Huth             *eax = 0;
660288dd4ca0SZhao Liu 
6603fcf5ef2aSThomas Huth             switch (count) {
6604fcf5ef2aSThomas Huth             case 0: /* L1 dcache info */
6605a9f27ea9SEduardo Habkost                 encode_cache_cpuid4(env->cache_info_cpuid4.l1d_cache,
6606f602eb92SZhao Liu                                     &topo_info,
66077e3482f8SEduardo Habkost                                     eax, ebx, ecx, edx);
6608f602eb92SZhao Liu                 if (!cpu->l1_cache_per_core) {
6609f602eb92SZhao Liu                     *eax &= ~MAKE_64BIT_MASK(14, 12);
6610f602eb92SZhao Liu                 }
6611fcf5ef2aSThomas Huth                 break;
6612fcf5ef2aSThomas Huth             case 1: /* L1 icache info */
6613a9f27ea9SEduardo Habkost                 encode_cache_cpuid4(env->cache_info_cpuid4.l1i_cache,
6614f602eb92SZhao Liu                                     &topo_info,
66157e3482f8SEduardo Habkost                                     eax, ebx, ecx, edx);
6616f602eb92SZhao Liu                 if (!cpu->l1_cache_per_core) {
6617f602eb92SZhao Liu                     *eax &= ~MAKE_64BIT_MASK(14, 12);
6618f602eb92SZhao Liu                 }
6619fcf5ef2aSThomas Huth                 break;
6620fcf5ef2aSThomas Huth             case 2: /* L2 cache info */
6621a9f27ea9SEduardo Habkost                 encode_cache_cpuid4(env->cache_info_cpuid4.l2_cache,
6622f602eb92SZhao Liu                                     &topo_info,
66237e3482f8SEduardo Habkost                                     eax, ebx, ecx, edx);
6624fcf5ef2aSThomas Huth                 break;
6625fcf5ef2aSThomas Huth             case 3: /* L3 cache info */
66267e3482f8SEduardo Habkost                 if (cpu->enable_l3_cache) {
6627a9f27ea9SEduardo Habkost                     encode_cache_cpuid4(env->cache_info_cpuid4.l3_cache,
6628f602eb92SZhao Liu                                         &topo_info,
66297e3482f8SEduardo Habkost                                         eax, ebx, ecx, edx);
6630fcf5ef2aSThomas Huth                     break;
66317e3482f8SEduardo Habkost                 }
66327e3482f8SEduardo Habkost                 /* fall through */
6633fcf5ef2aSThomas Huth             default: /* end of info */
66347e3482f8SEduardo Habkost                 *eax = *ebx = *ecx = *edx = 0;
6635fcf5ef2aSThomas Huth                 break;
6636fcf5ef2aSThomas Huth             }
6637fcf5ef2aSThomas Huth         }
6638fcf5ef2aSThomas Huth         break;
6639fcf5ef2aSThomas Huth     case 5:
66402266d443SMichael S. Tsirkin         /* MONITOR/MWAIT Leaf */
66412266d443SMichael S. Tsirkin         *eax = cpu->mwait.eax; /* Smallest monitor-line size in bytes */
66422266d443SMichael S. Tsirkin         *ebx = cpu->mwait.ebx; /* Largest monitor-line size in bytes */
66432266d443SMichael S. Tsirkin         *ecx = cpu->mwait.ecx; /* flags */
66442266d443SMichael S. Tsirkin         *edx = cpu->mwait.edx; /* mwait substates */
6645fcf5ef2aSThomas Huth         break;
6646fcf5ef2aSThomas Huth     case 6:
6647fcf5ef2aSThomas Huth         /* Thermal and Power Leaf */
6648fcf5ef2aSThomas Huth         *eax = env->features[FEAT_6_EAX];
6649fcf5ef2aSThomas Huth         *ebx = 0;
6650fcf5ef2aSThomas Huth         *ecx = 0;
6651fcf5ef2aSThomas Huth         *edx = 0;
6652fcf5ef2aSThomas Huth         break;
6653fcf5ef2aSThomas Huth     case 7:
6654fcf5ef2aSThomas Huth         /* Structured Extended Feature Flags Enumeration Leaf */
6655fcf5ef2aSThomas Huth         if (count == 0) {
665680db491dSJing Liu             /* Maximum ECX value for sub-leaves */
665780db491dSJing Liu             *eax = env->cpuid_level_func7;
6658fcf5ef2aSThomas Huth             *ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */
6659fcf5ef2aSThomas Huth             *ecx = env->features[FEAT_7_0_ECX]; /* Feature flags */
6660fcf5ef2aSThomas Huth             if ((*ecx & CPUID_7_0_ECX_PKU) && env->cr[4] & CR4_PKE_MASK) {
6661fcf5ef2aSThomas Huth                 *ecx |= CPUID_7_0_ECX_OSPKE;
6662fcf5ef2aSThomas Huth             }
6663fcf5ef2aSThomas Huth             *edx = env->features[FEAT_7_0_EDX]; /* Feature flags */
666480db491dSJing Liu         } else if (count == 1) {
666580db491dSJing Liu             *eax = env->features[FEAT_7_1_EAX];
6666eaaa197dSJiaxi Chen             *edx = env->features[FEAT_7_1_EDX];
666780db491dSJing Liu             *ebx = 0;
666880db491dSJing Liu             *ecx = 0;
66699dd8b710STao Su         } else if (count == 2) {
66709dd8b710STao Su             *edx = env->features[FEAT_7_2_EDX];
66719dd8b710STao Su             *eax = 0;
66729dd8b710STao Su             *ebx = 0;
66739dd8b710STao Su             *ecx = 0;
6674fcf5ef2aSThomas Huth         } else {
6675fcf5ef2aSThomas Huth             *eax = 0;
6676fcf5ef2aSThomas Huth             *ebx = 0;
6677fcf5ef2aSThomas Huth             *ecx = 0;
6678fcf5ef2aSThomas Huth             *edx = 0;
6679fcf5ef2aSThomas Huth         }
6680fcf5ef2aSThomas Huth         break;
6681fcf5ef2aSThomas Huth     case 9:
6682fcf5ef2aSThomas Huth         /* Direct Cache Access Information Leaf */
6683fcf5ef2aSThomas Huth         *eax = 0; /* Bits 0-31 in DCA_CAP MSR */
6684fcf5ef2aSThomas Huth         *ebx = 0;
6685fcf5ef2aSThomas Huth         *ecx = 0;
6686fcf5ef2aSThomas Huth         *edx = 0;
6687fcf5ef2aSThomas Huth         break;
6688fcf5ef2aSThomas Huth     case 0xA:
6689fcf5ef2aSThomas Huth         /* Architectural Performance Monitoring Leaf */
6690da472f94SPhilippe Mathieu-Daudé         if (cpu->enable_pmu) {
6691d19d6ffaSPaolo Bonzini             x86_cpu_get_supported_cpuid(0xA, count, eax, ebx, ecx, edx);
6692fcf5ef2aSThomas Huth         } else {
6693fcf5ef2aSThomas Huth             *eax = 0;
6694fcf5ef2aSThomas Huth             *ebx = 0;
6695fcf5ef2aSThomas Huth             *ecx = 0;
6696fcf5ef2aSThomas Huth             *edx = 0;
6697fcf5ef2aSThomas Huth         }
6698fcf5ef2aSThomas Huth         break;
6699fcf5ef2aSThomas Huth     case 0xB:
6700fcf5ef2aSThomas Huth         /* Extended Topology Enumeration Leaf */
6701fcf5ef2aSThomas Huth         if (!cpu->enable_cpuid_0xb) {
6702fcf5ef2aSThomas Huth                 *eax = *ebx = *ecx = *edx = 0;
6703fcf5ef2aSThomas Huth                 break;
6704fcf5ef2aSThomas Huth         }
6705fcf5ef2aSThomas Huth 
6706fcf5ef2aSThomas Huth         *ecx = count & 0xff;
6707fcf5ef2aSThomas Huth         *edx = cpu->apic_id;
6708fcf5ef2aSThomas Huth 
6709fcf5ef2aSThomas Huth         switch (count) {
6710fcf5ef2aSThomas Huth         case 0:
6711f20dec0bSBabu Moger             *eax = apicid_core_offset(&topo_info);
67122613747aSZhao Liu             *ebx = topo_info.threads_per_core;
67130f6ed7baSZhao Liu             *ecx |= CPUID_B_ECX_TOPO_LEVEL_SMT << 8;
6714fcf5ef2aSThomas Huth             break;
6715fcf5ef2aSThomas Huth         case 1:
6716fb49865dSBabu Moger             *eax = apicid_pkg_offset(&topo_info);
67172613747aSZhao Liu             *ebx = threads_per_pkg;
67180f6ed7baSZhao Liu             *ecx |= CPUID_B_ECX_TOPO_LEVEL_CORE << 8;
6719fcf5ef2aSThomas Huth             break;
6720fcf5ef2aSThomas Huth         default:
6721fcf5ef2aSThomas Huth             *eax = 0;
6722fcf5ef2aSThomas Huth             *ebx = 0;
67230f6ed7baSZhao Liu             *ecx |= CPUID_B_ECX_TOPO_LEVEL_INVALID << 8;
6724fcf5ef2aSThomas Huth         }
6725fcf5ef2aSThomas Huth 
6726fcf5ef2aSThomas Huth         assert(!(*eax & ~0x1f));
6727fcf5ef2aSThomas Huth         *ebx &= 0xffff; /* The count doesn't need to be reliable. */
6728fcf5ef2aSThomas Huth         break;
6729c3c67679SYang Weijiang     case 0x1C:
6730da472f94SPhilippe Mathieu-Daudé         if (cpu->enable_pmu && (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR)) {
6731c3c67679SYang Weijiang             x86_cpu_get_supported_cpuid(0x1C, 0, eax, ebx, ecx, edx);
6732c3c67679SYang Weijiang             *edx = 0;
6733c3c67679SYang Weijiang         }
6734c3c67679SYang Weijiang         break;
6735a94e1428SLike Xu     case 0x1F:
6736a94e1428SLike Xu         /* V2 Extended Topology Enumeration Leaf */
67376ddeb0ecSZhao Liu         if (!x86_has_extended_topo(env->avail_cpu_topo)) {
6738a94e1428SLike Xu             *eax = *ebx = *ecx = *edx = 0;
6739a94e1428SLike Xu             break;
6740a94e1428SLike Xu         }
6741a94e1428SLike Xu 
6742822bce9fSZhao Liu         encode_topo_cpuid1f(env, count, &topo_info, eax, ebx, ecx, edx);
6743a94e1428SLike Xu         break;
6744fcf5ef2aSThomas Huth     case 0xD: {
6745fcf5ef2aSThomas Huth         /* Processor Extended State */
6746fcf5ef2aSThomas Huth         *eax = 0;
6747fcf5ef2aSThomas Huth         *ebx = 0;
6748fcf5ef2aSThomas Huth         *ecx = 0;
6749fcf5ef2aSThomas Huth         *edx = 0;
6750fcf5ef2aSThomas Huth         if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
6751fcf5ef2aSThomas Huth             break;
6752fcf5ef2aSThomas Huth         }
6753fcf5ef2aSThomas Huth 
6754fcf5ef2aSThomas Huth         if (count == 0) {
6755301e9067SYang Weijiang             *ecx = xsave_area_size(x86_cpu_xsave_xcr0_components(cpu), false);
6756301e9067SYang Weijiang             *eax = env->features[FEAT_XSAVE_XCR0_LO];
6757301e9067SYang Weijiang             *edx = env->features[FEAT_XSAVE_XCR0_HI];
675876ecd7a5SBingsong Si             /*
675976ecd7a5SBingsong Si              * The initial value of xcr0 and ebx == 0, On host without kvm
676076ecd7a5SBingsong Si              * commit 412a3c41(e.g., CentOS 6), the ebx's value always == 0
676176ecd7a5SBingsong Si              * even through guest update xcr0, this will crash some legacy guest
6762bad5cfcdSMichael Tokarev              * (e.g., CentOS 6), So set ebx == ecx to workaround it.
676376ecd7a5SBingsong Si              */
6764301e9067SYang Weijiang             *ebx = kvm_enabled() ? *ecx : xsave_area_size(env->xcr0, false);
6765fcf5ef2aSThomas Huth         } else if (count == 1) {
6766301e9067SYang Weijiang             uint64_t xstate = x86_cpu_xsave_xcr0_components(cpu) |
6767301e9067SYang Weijiang                               x86_cpu_xsave_xss_components(cpu);
6768301e9067SYang Weijiang 
6769fcf5ef2aSThomas Huth             *eax = env->features[FEAT_XSAVE];
6770301e9067SYang Weijiang             *ebx = xsave_area_size(xstate, true);
6771301e9067SYang Weijiang             *ecx = env->features[FEAT_XSAVE_XSS_LO];
6772301e9067SYang Weijiang             *edx = env->features[FEAT_XSAVE_XSS_HI];
6773c3c67679SYang Weijiang             if (kvm_enabled() && cpu->enable_pmu &&
6774c3c67679SYang Weijiang                 (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR) &&
6775c3c67679SYang Weijiang                 (*eax & CPUID_XSAVE_XSAVES)) {
6776c3c67679SYang Weijiang                 *ecx |= XSTATE_ARCH_LBR_MASK;
6777c3c67679SYang Weijiang             } else {
6778c3c67679SYang Weijiang                 *ecx &= ~XSTATE_ARCH_LBR_MASK;
6779c3c67679SYang Weijiang             }
6780da472f94SPhilippe Mathieu-Daudé         } else if (count == 0xf && cpu->enable_pmu
6781da472f94SPhilippe Mathieu-Daudé                    && (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR)) {
6782c3c67679SYang Weijiang             x86_cpu_get_supported_cpuid(0xD, count, eax, ebx, ecx, edx);
6783fcf5ef2aSThomas Huth         } else if (count < ARRAY_SIZE(x86_ext_save_areas)) {
6784fcf5ef2aSThomas Huth             const ExtSaveArea *esa = &x86_ext_save_areas[count];
6785301e9067SYang Weijiang 
6786301e9067SYang Weijiang             if (x86_cpu_xsave_xcr0_components(cpu) & (1ULL << count)) {
6787fcf5ef2aSThomas Huth                 *eax = esa->size;
6788fcf5ef2aSThomas Huth                 *ebx = esa->offset;
67890f17f6b3SJing Liu                 *ecx = esa->ecx &
67900f17f6b3SJing Liu                        (ESA_FEATURE_ALIGN64_MASK | ESA_FEATURE_XFD_MASK);
6791301e9067SYang Weijiang             } else if (x86_cpu_xsave_xss_components(cpu) & (1ULL << count)) {
6792301e9067SYang Weijiang                 *eax = esa->size;
6793301e9067SYang Weijiang                 *ebx = 0;
6794301e9067SYang Weijiang                 *ecx = 1;
6795fcf5ef2aSThomas Huth             }
6796fcf5ef2aSThomas Huth         }
6797fcf5ef2aSThomas Huth         break;
6798fcf5ef2aSThomas Huth     }
67991dec2e1fSSean Christopherson     case 0x12:
68001dec2e1fSSean Christopherson #ifndef CONFIG_USER_ONLY
68011dec2e1fSSean Christopherson         if (!kvm_enabled() ||
68021dec2e1fSSean Christopherson             !(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_SGX)) {
68031dec2e1fSSean Christopherson             *eax = *ebx = *ecx = *edx = 0;
68041dec2e1fSSean Christopherson             break;
68051dec2e1fSSean Christopherson         }
68061dec2e1fSSean Christopherson 
68071dec2e1fSSean Christopherson         /*
68081dec2e1fSSean Christopherson          * SGX sub-leafs CPUID.0x12.{0x2..N} enumerate EPC sections.  Retrieve
68091dec2e1fSSean Christopherson          * the EPC properties, e.g. confidentiality and integrity, from the
68101dec2e1fSSean Christopherson          * host's first EPC section, i.e. assume there is one EPC section or
68111dec2e1fSSean Christopherson          * that all EPC sections have the same security properties.
68121dec2e1fSSean Christopherson          */
68131dec2e1fSSean Christopherson         if (count > 1) {
68141dec2e1fSSean Christopherson             uint64_t epc_addr, epc_size;
68151dec2e1fSSean Christopherson 
68161dec2e1fSSean Christopherson             if (sgx_epc_get_section(count - 2, &epc_addr, &epc_size)) {
68171dec2e1fSSean Christopherson                 *eax = *ebx = *ecx = *edx = 0;
68181dec2e1fSSean Christopherson                 break;
68191dec2e1fSSean Christopherson             }
68201dec2e1fSSean Christopherson             host_cpuid(index, 2, eax, ebx, ecx, edx);
68211dec2e1fSSean Christopherson             *eax = (uint32_t)(epc_addr & 0xfffff000) | 0x1;
68221dec2e1fSSean Christopherson             *ebx = (uint32_t)(epc_addr >> 32);
68231dec2e1fSSean Christopherson             *ecx = (uint32_t)(epc_size & 0xfffff000) | (*ecx & 0xf);
68241dec2e1fSSean Christopherson             *edx = (uint32_t)(epc_size >> 32);
68251dec2e1fSSean Christopherson             break;
68261dec2e1fSSean Christopherson         }
68271dec2e1fSSean Christopherson 
68281dec2e1fSSean Christopherson         /*
68291dec2e1fSSean Christopherson          * SGX sub-leafs CPUID.0x12.{0x0,0x1} are heavily dependent on hardware
68301dec2e1fSSean Christopherson          * and KVM, i.e. QEMU cannot emulate features to override what KVM
68311dec2e1fSSean Christopherson          * supports.  Features can be further restricted by userspace, but not
68321dec2e1fSSean Christopherson          * made more permissive.
68331dec2e1fSSean Christopherson          */
6834b0f3184eSYang Zhong         x86_cpu_get_supported_cpuid(0x12, count, eax, ebx, ecx, edx);
68351dec2e1fSSean Christopherson 
68361dec2e1fSSean Christopherson         if (count == 0) {
68371dec2e1fSSean Christopherson             *eax &= env->features[FEAT_SGX_12_0_EAX];
68381dec2e1fSSean Christopherson             *ebx &= env->features[FEAT_SGX_12_0_EBX];
68391dec2e1fSSean Christopherson         } else {
68401dec2e1fSSean Christopherson             *eax &= env->features[FEAT_SGX_12_1_EAX];
68411dec2e1fSSean Christopherson             *ebx &= 0; /* ebx reserve */
684272497cffSYang Zhong             *ecx &= env->features[FEAT_XSAVE_XCR0_LO];
684372497cffSYang Zhong             *edx &= env->features[FEAT_XSAVE_XCR0_HI];
68441dec2e1fSSean Christopherson 
68451dec2e1fSSean Christopherson             /* FP and SSE are always allowed regardless of XSAVE/XCR0. */
68461dec2e1fSSean Christopherson             *ecx |= XSTATE_FP_MASK | XSTATE_SSE_MASK;
68471dec2e1fSSean Christopherson 
68481dec2e1fSSean Christopherson             /* Access to PROVISIONKEY requires additional credentials. */
6849c22f5467SSean Christopherson             if ((*eax & (1U << 4)) &&
6850c22f5467SSean Christopherson                 !kvm_enable_sgx_provisioning(cs->kvm_state)) {
68511dec2e1fSSean Christopherson                 *eax &= ~(1U << 4);
68521dec2e1fSSean Christopherson             }
6853c22f5467SSean Christopherson         }
68541dec2e1fSSean Christopherson #endif
68551dec2e1fSSean Christopherson         break;
6856e37a5c7fSChao Peng     case 0x14: {
6857e37a5c7fSChao Peng         /* Intel Processor Trace Enumeration */
6858e37a5c7fSChao Peng         *eax = 0;
6859e37a5c7fSChao Peng         *ebx = 0;
6860e37a5c7fSChao Peng         *ecx = 0;
6861e37a5c7fSChao Peng         *edx = 0;
6862e37a5c7fSChao Peng         if (!(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) ||
6863e37a5c7fSChao Peng             !kvm_enabled()) {
6864e37a5c7fSChao Peng             break;
6865e37a5c7fSChao Peng         }
6866e37a5c7fSChao Peng 
6867028ade14SPaolo Bonzini         /*
6868028ade14SPaolo Bonzini          * If these are changed, they should stay in sync with
6869028ade14SPaolo Bonzini          * x86_cpu_filter_features().
6870028ade14SPaolo Bonzini          */
6871e37a5c7fSChao Peng         if (count == 0) {
6872e37a5c7fSChao Peng             *eax = INTEL_PT_MAX_SUBLEAF;
6873e37a5c7fSChao Peng             *ebx = INTEL_PT_MINIMAL_EBX;
6874e37a5c7fSChao Peng             *ecx = INTEL_PT_MINIMAL_ECX;
6875d1615ea5SLuwei Kang             if (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP) {
6876d1615ea5SLuwei Kang                 *ecx |= CPUID_14_0_ECX_LIP;
6877d1615ea5SLuwei Kang             }
6878e37a5c7fSChao Peng         } else if (count == 1) {
6879e37a5c7fSChao Peng             *eax = INTEL_PT_MTC_BITMAP | INTEL_PT_ADDR_RANGES_NUM;
6880e37a5c7fSChao Peng             *ebx = INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP;
6881e37a5c7fSChao Peng         }
6882e37a5c7fSChao Peng         break;
6883e37a5c7fSChao Peng     }
6884f21a4817SJing Liu     case 0x1D: {
68857eb061b0SWang, Lei         /* AMX TILE, for now hardcoded for Sapphire Rapids*/
6886f21a4817SJing Liu         *eax = 0;
6887f21a4817SJing Liu         *ebx = 0;
6888f21a4817SJing Liu         *ecx = 0;
6889f21a4817SJing Liu         *edx = 0;
6890f21a4817SJing Liu         if (!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE)) {
6891f21a4817SJing Liu             break;
6892f21a4817SJing Liu         }
6893f21a4817SJing Liu 
6894f21a4817SJing Liu         if (count == 0) {
6895f21a4817SJing Liu             /* Highest numbered palette subleaf */
6896f21a4817SJing Liu             *eax = INTEL_AMX_TILE_MAX_SUBLEAF;
6897f21a4817SJing Liu         } else if (count == 1) {
6898f21a4817SJing Liu             *eax = INTEL_AMX_TOTAL_TILE_BYTES |
6899f21a4817SJing Liu                    (INTEL_AMX_BYTES_PER_TILE << 16);
6900f21a4817SJing Liu             *ebx = INTEL_AMX_BYTES_PER_ROW | (INTEL_AMX_TILE_MAX_NAMES << 16);
6901f21a4817SJing Liu             *ecx = INTEL_AMX_TILE_MAX_ROWS;
6902f21a4817SJing Liu         }
6903f21a4817SJing Liu         break;
6904f21a4817SJing Liu     }
6905f21a4817SJing Liu     case 0x1E: {
69067eb061b0SWang, Lei         /* AMX TMUL, for now hardcoded for Sapphire Rapids */
6907f21a4817SJing Liu         *eax = 0;
6908f21a4817SJing Liu         *ebx = 0;
6909f21a4817SJing Liu         *ecx = 0;
6910f21a4817SJing Liu         *edx = 0;
6911f21a4817SJing Liu         if (!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE)) {
6912f21a4817SJing Liu             break;
6913f21a4817SJing Liu         }
6914f21a4817SJing Liu 
6915f21a4817SJing Liu         if (count == 0) {
6916f21a4817SJing Liu             /* Highest numbered palette subleaf */
6917f21a4817SJing Liu             *ebx = INTEL_AMX_TMUL_MAX_K | (INTEL_AMX_TMUL_MAX_N << 8);
6918f21a4817SJing Liu         }
6919f21a4817SJing Liu         break;
6920f21a4817SJing Liu     }
6921bccfb846STao Su     case 0x24: {
6922bccfb846STao Su         *eax = 0;
6923bccfb846STao Su         *ebx = 0;
6924bccfb846STao Su         *ecx = 0;
6925bccfb846STao Su         *edx = 0;
6926bccfb846STao Su         if ((env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10) && count == 0) {
6927bccfb846STao Su             *ebx = env->features[FEAT_24_0_EBX] | env->avx10_version;
6928bccfb846STao Su         }
6929bccfb846STao Su         break;
6930bccfb846STao Su     }
69311ce36bfeSDaniel P. Berrange     case 0x40000000:
69321ce36bfeSDaniel P. Berrange         /*
69331ce36bfeSDaniel P. Berrange          * CPUID code in kvm_arch_init_vcpu() ignores stuff
69341ce36bfeSDaniel P. Berrange          * set here, but we restrict to TCG none the less.
69351ce36bfeSDaniel P. Berrange          */
69361ce36bfeSDaniel P. Berrange         if (tcg_enabled() && cpu->expose_tcg) {
69371ce36bfeSDaniel P. Berrange             memcpy(signature, "TCGTCGTCGTCG", 12);
69381ce36bfeSDaniel P. Berrange             *eax = 0x40000001;
69391ce36bfeSDaniel P. Berrange             *ebx = signature[0];
69401ce36bfeSDaniel P. Berrange             *ecx = signature[1];
69411ce36bfeSDaniel P. Berrange             *edx = signature[2];
69421ce36bfeSDaniel P. Berrange         } else {
69431ce36bfeSDaniel P. Berrange             *eax = 0;
69441ce36bfeSDaniel P. Berrange             *ebx = 0;
69451ce36bfeSDaniel P. Berrange             *ecx = 0;
69461ce36bfeSDaniel P. Berrange             *edx = 0;
69471ce36bfeSDaniel P. Berrange         }
69481ce36bfeSDaniel P. Berrange         break;
69491ce36bfeSDaniel P. Berrange     case 0x40000001:
69501ce36bfeSDaniel P. Berrange         *eax = 0;
69511ce36bfeSDaniel P. Berrange         *ebx = 0;
69521ce36bfeSDaniel P. Berrange         *ecx = 0;
69531ce36bfeSDaniel P. Berrange         *edx = 0;
69541ce36bfeSDaniel P. Berrange         break;
6955fcf5ef2aSThomas Huth     case 0x80000000:
6956fcf5ef2aSThomas Huth         *eax = env->cpuid_xlevel;
6957fcf5ef2aSThomas Huth         *ebx = env->cpuid_vendor1;
6958fcf5ef2aSThomas Huth         *edx = env->cpuid_vendor2;
6959fcf5ef2aSThomas Huth         *ecx = env->cpuid_vendor3;
6960fcf5ef2aSThomas Huth         break;
6961fcf5ef2aSThomas Huth     case 0x80000001:
6962fcf5ef2aSThomas Huth         *eax = env->cpuid_version;
6963fcf5ef2aSThomas Huth         *ebx = 0;
6964fcf5ef2aSThomas Huth         *ecx = env->features[FEAT_8000_0001_ECX];
6965fcf5ef2aSThomas Huth         *edx = env->features[FEAT_8000_0001_EDX];
6966fcf5ef2aSThomas Huth 
6967fcf5ef2aSThomas Huth         /* The Linux kernel checks for the CMPLegacy bit and
6968fcf5ef2aSThomas Huth          * discards multiple thread information if it is set.
6969fcf5ef2aSThomas Huth          * So don't set it here for Intel to make Linux guests happy.
6970fcf5ef2aSThomas Huth          */
69712613747aSZhao Liu         if (threads_per_pkg > 1) {
6972fcf5ef2aSThomas Huth             if (env->cpuid_vendor1 != CPUID_VENDOR_INTEL_1 ||
6973fcf5ef2aSThomas Huth                 env->cpuid_vendor2 != CPUID_VENDOR_INTEL_2 ||
6974fcf5ef2aSThomas Huth                 env->cpuid_vendor3 != CPUID_VENDOR_INTEL_3) {
6975fcf5ef2aSThomas Huth                 *ecx |= 1 << 1;    /* CmpLegacy bit */
6976fcf5ef2aSThomas Huth             }
6977fcf5ef2aSThomas Huth         }
6978fd5dcb1cSPaolo Bonzini         if (tcg_enabled() && env->cpuid_vendor1 == CPUID_VENDOR_INTEL_1 &&
6979fd5dcb1cSPaolo Bonzini             !(env->hflags & HF_LMA_MASK)) {
6980fd5dcb1cSPaolo Bonzini             *edx &= ~CPUID_EXT2_SYSCALL;
6981fd5dcb1cSPaolo Bonzini         }
6982fcf5ef2aSThomas Huth         break;
6983fcf5ef2aSThomas Huth     case 0x80000002:
6984fcf5ef2aSThomas Huth     case 0x80000003:
6985fcf5ef2aSThomas Huth     case 0x80000004:
6986fcf5ef2aSThomas Huth         *eax = env->cpuid_model[(index - 0x80000002) * 4 + 0];
6987fcf5ef2aSThomas Huth         *ebx = env->cpuid_model[(index - 0x80000002) * 4 + 1];
6988fcf5ef2aSThomas Huth         *ecx = env->cpuid_model[(index - 0x80000002) * 4 + 2];
6989fcf5ef2aSThomas Huth         *edx = env->cpuid_model[(index - 0x80000002) * 4 + 3];
6990fcf5ef2aSThomas Huth         break;
6991fcf5ef2aSThomas Huth     case 0x80000005:
6992fcf5ef2aSThomas Huth         /* cache info (L1 cache) */
6993fcf5ef2aSThomas Huth         if (cpu->cache_info_passthrough) {
6994798d8ec0SPaolo Bonzini             x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
6995fcf5ef2aSThomas Huth             break;
6996fcf5ef2aSThomas Huth         }
699778ee6bd0SPhilippe Mathieu-Daudé         *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) |
6998fcf5ef2aSThomas Huth                (L1_ITLB_2M_ASSOC <<  8) | (L1_ITLB_2M_ENTRIES);
699978ee6bd0SPhilippe Mathieu-Daudé         *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) |
7000fcf5ef2aSThomas Huth                (L1_ITLB_4K_ASSOC <<  8) | (L1_ITLB_4K_ENTRIES);
7001a9f27ea9SEduardo Habkost         *ecx = encode_cache_cpuid80000005(env->cache_info_amd.l1d_cache);
7002a9f27ea9SEduardo Habkost         *edx = encode_cache_cpuid80000005(env->cache_info_amd.l1i_cache);
7003fcf5ef2aSThomas Huth         break;
7004fcf5ef2aSThomas Huth     case 0x80000006:
7005fcf5ef2aSThomas Huth         /* cache info (L2 cache) */
7006fcf5ef2aSThomas Huth         if (cpu->cache_info_passthrough) {
7007798d8ec0SPaolo Bonzini             x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx);
7008fcf5ef2aSThomas Huth             break;
7009fcf5ef2aSThomas Huth         }
701078ee6bd0SPhilippe Mathieu-Daudé         *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) |
701178ee6bd0SPhilippe Mathieu-Daudé                (L2_DTLB_2M_ENTRIES << 16) |
701278ee6bd0SPhilippe Mathieu-Daudé                (AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) |
7013fcf5ef2aSThomas Huth                (L2_ITLB_2M_ENTRIES);
701478ee6bd0SPhilippe Mathieu-Daudé         *ebx = (AMD_ENC_ASSOC(L2_DTLB_4K_ASSOC) << 28) |
701578ee6bd0SPhilippe Mathieu-Daudé                (L2_DTLB_4K_ENTRIES << 16) |
701678ee6bd0SPhilippe Mathieu-Daudé                (AMD_ENC_ASSOC(L2_ITLB_4K_ASSOC) << 12) |
7017fcf5ef2aSThomas Huth                (L2_ITLB_4K_ENTRIES);
7018a9f27ea9SEduardo Habkost         encode_cache_cpuid80000006(env->cache_info_amd.l2_cache,
7019ab8f992eSBabu Moger                                    cpu->enable_l3_cache ?
7020a9f27ea9SEduardo Habkost                                    env->cache_info_amd.l3_cache : NULL,
70217e3482f8SEduardo Habkost                                    ecx, edx);
7022fcf5ef2aSThomas Huth         break;
7023fcf5ef2aSThomas Huth     case 0x80000007:
7024fcf5ef2aSThomas Huth         *eax = 0;
70252ba8b7eeSJohn Allen         *ebx = env->features[FEAT_8000_0007_EBX];
7026fcf5ef2aSThomas Huth         *ecx = 0;
7027fcf5ef2aSThomas Huth         *edx = env->features[FEAT_8000_0007_EDX];
7028fcf5ef2aSThomas Huth         break;
7029fcf5ef2aSThomas Huth     case 0x80000008:
7030fcf5ef2aSThomas Huth         /* virtual & phys address size in low 2 bytes. */
703197afb47eSLara Lazier         *eax = cpu->phys_bits;
7032fcf5ef2aSThomas Huth         if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
70336c7c3c21SKirill A. Shutemov             /* 64 bit processor */
703497afb47eSLara Lazier              *eax |= (cpu_x86_virtual_addr_width(env) << 8);
7035513ba32dSGerd Hoffmann              *eax |= (cpu->guest_phys_bits << 16);
7036fcf5ef2aSThomas Huth         }
70371b3420e1SEduardo Habkost         *ebx = env->features[FEAT_8000_0008_EBX];
70382613747aSZhao Liu         if (threads_per_pkg > 1) {
7039cac9edfcSBabu Moger             /*
7040cac9edfcSBabu Moger              * Bits 15:12 is "The number of bits in the initial
7041cac9edfcSBabu Moger              * Core::X86::Apic::ApicId[ApicId] value that indicate
7042fb49865dSBabu Moger              * thread ID within a package".
7043cac9edfcSBabu Moger              * Bits 7:0 is "The number of threads in the package is NC+1"
7044cac9edfcSBabu Moger              */
7045fb49865dSBabu Moger             *ecx = (apicid_pkg_offset(&topo_info) << 12) |
70462613747aSZhao Liu                    (threads_per_pkg - 1);
7047cac9edfcSBabu Moger         } else {
7048cac9edfcSBabu Moger             *ecx = 0;
7049fcf5ef2aSThomas Huth         }
7050cac9edfcSBabu Moger         *edx = 0;
7051fcf5ef2aSThomas Huth         break;
7052fcf5ef2aSThomas Huth     case 0x8000000A:
7053fcf5ef2aSThomas Huth         if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
7054fcf5ef2aSThomas Huth             *eax = 0x00000001; /* SVM Revision */
7055fcf5ef2aSThomas Huth             *ebx = 0x00000010; /* nr of ASIDs */
7056fcf5ef2aSThomas Huth             *ecx = 0;
7057fcf5ef2aSThomas Huth             *edx = env->features[FEAT_SVM]; /* optional features */
7058fcf5ef2aSThomas Huth         } else {
7059fcf5ef2aSThomas Huth             *eax = 0;
7060fcf5ef2aSThomas Huth             *ebx = 0;
7061fcf5ef2aSThomas Huth             *ecx = 0;
7062fcf5ef2aSThomas Huth             *edx = 0;
7063fcf5ef2aSThomas Huth         }
7064fcf5ef2aSThomas Huth         break;
70658f4202fbSBabu Moger     case 0x8000001D:
70668f4202fbSBabu Moger         *eax = 0;
7067a4e0b436SStanislav Lanci         if (cpu->cache_info_passthrough) {
7068798d8ec0SPaolo Bonzini             x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx);
7069a4e0b436SStanislav Lanci             break;
7070a4e0b436SStanislav Lanci         }
70718f4202fbSBabu Moger         switch (count) {
70728f4202fbSBabu Moger         case 0: /* L1 dcache info */
70732f084d1eSBabu Moger             encode_cache_cpuid8000001d(env->cache_info_amd.l1d_cache,
70742f084d1eSBabu Moger                                        &topo_info, eax, ebx, ecx, edx);
70758f4202fbSBabu Moger             break;
70768f4202fbSBabu Moger         case 1: /* L1 icache info */
70772f084d1eSBabu Moger             encode_cache_cpuid8000001d(env->cache_info_amd.l1i_cache,
70782f084d1eSBabu Moger                                        &topo_info, eax, ebx, ecx, edx);
70798f4202fbSBabu Moger             break;
70808f4202fbSBabu Moger         case 2: /* L2 cache info */
70812f084d1eSBabu Moger             encode_cache_cpuid8000001d(env->cache_info_amd.l2_cache,
70822f084d1eSBabu Moger                                        &topo_info, eax, ebx, ecx, edx);
70838f4202fbSBabu Moger             break;
70848f4202fbSBabu Moger         case 3: /* L3 cache info */
70852f084d1eSBabu Moger             encode_cache_cpuid8000001d(env->cache_info_amd.l3_cache,
70862f084d1eSBabu Moger                                        &topo_info, eax, ebx, ecx, edx);
70878f4202fbSBabu Moger             break;
70888f4202fbSBabu Moger         default: /* end of info */
70898f4202fbSBabu Moger             *eax = *ebx = *ecx = *edx = 0;
70908f4202fbSBabu Moger             break;
70918f4202fbSBabu Moger         }
709229a51b2bSPaolo Bonzini         if (cpu->amd_topoext_features_only) {
709329a51b2bSPaolo Bonzini             *edx &= CACHE_NO_INVD_SHARING | CACHE_INCLUSIVE;
709429a51b2bSPaolo Bonzini         }
70958f4202fbSBabu Moger         break;
7096ed78467aSBabu Moger     case 0x8000001E:
709735ac5dfbSBabu Moger         if (cpu->core_id <= 255) {
709835ac5dfbSBabu Moger             encode_topo_cpuid8000001e(cpu, &topo_info, eax, ebx, ecx, edx);
709935ac5dfbSBabu Moger         } else {
710035ac5dfbSBabu Moger             *eax = 0;
710135ac5dfbSBabu Moger             *ebx = 0;
710235ac5dfbSBabu Moger             *ecx = 0;
710335ac5dfbSBabu Moger             *edx = 0;
710435ac5dfbSBabu Moger         }
7105ed78467aSBabu Moger         break;
7106209b0ac1SSandipan Das     case 0x80000022:
7107209b0ac1SSandipan Das         *eax = *ebx = *ecx = *edx = 0;
7108209b0ac1SSandipan Das         /* AMD Extended Performance Monitoring and Debug */
7109209b0ac1SSandipan Das         if (kvm_enabled() && cpu->enable_pmu &&
7110209b0ac1SSandipan Das             (env->features[FEAT_8000_0022_EAX] & CPUID_8000_0022_EAX_PERFMON_V2)) {
7111209b0ac1SSandipan Das             *eax |= CPUID_8000_0022_EAX_PERFMON_V2;
7112209b0ac1SSandipan Das             *ebx |= kvm_arch_get_supported_cpuid(cs->kvm_state, index, count,
7113209b0ac1SSandipan Das                                                  R_EBX) & 0xf;
7114209b0ac1SSandipan Das         }
7115209b0ac1SSandipan Das         break;
7116fcf5ef2aSThomas Huth     case 0xC0000000:
7117fcf5ef2aSThomas Huth         *eax = env->cpuid_xlevel2;
7118fcf5ef2aSThomas Huth         *ebx = 0;
7119fcf5ef2aSThomas Huth         *ecx = 0;
7120fcf5ef2aSThomas Huth         *edx = 0;
7121fcf5ef2aSThomas Huth         break;
7122fcf5ef2aSThomas Huth     case 0xC0000001:
7123fcf5ef2aSThomas Huth         /* Support for VIA CPU's CPUID instruction */
7124fcf5ef2aSThomas Huth         *eax = env->cpuid_version;
7125fcf5ef2aSThomas Huth         *ebx = 0;
7126fcf5ef2aSThomas Huth         *ecx = 0;
7127fcf5ef2aSThomas Huth         *edx = env->features[FEAT_C000_0001_EDX];
7128fcf5ef2aSThomas Huth         break;
7129fcf5ef2aSThomas Huth     case 0xC0000002:
7130fcf5ef2aSThomas Huth     case 0xC0000003:
7131fcf5ef2aSThomas Huth     case 0xC0000004:
7132fcf5ef2aSThomas Huth         /* Reserved for the future, and now filled with zero */
7133fcf5ef2aSThomas Huth         *eax = 0;
7134fcf5ef2aSThomas Huth         *ebx = 0;
7135fcf5ef2aSThomas Huth         *ecx = 0;
7136fcf5ef2aSThomas Huth         *edx = 0;
7137fcf5ef2aSThomas Huth         break;
71386cb8f2a6SBrijesh Singh     case 0x8000001F:
713902eacf31SPhilippe Mathieu-Daudé         *eax = *ebx = *ecx = *edx = 0;
714002eacf31SPhilippe Mathieu-Daudé         if (sev_enabled()) {
714102eacf31SPhilippe Mathieu-Daudé             *eax = 0x2;
71426b98e96fSTom Lendacky             *eax |= sev_es_enabled() ? 0x8 : 0;
714378312219SMichael Roth             *eax |= sev_snp_enabled() ? 0x10 : 0;
7144fb6bbafcSTom Lendacky             *ebx = sev_get_cbit_position() & 0x3f; /* EBX[5:0] */
7145fb6bbafcSTom Lendacky             *ebx |= (sev_get_reduced_phys_bits() & 0x3f) << 6; /* EBX[11:6] */
714602eacf31SPhilippe Mathieu-Daudé         }
71476cb8f2a6SBrijesh Singh         break;
7148b70eec31SBabu Moger     case 0x80000021:
71499c07a7afSBabu Moger         *eax = *ebx = *ecx = *edx = 0;
7150b70eec31SBabu Moger         *eax = env->features[FEAT_8000_0021_EAX];
71519c07a7afSBabu Moger         *ebx = env->features[FEAT_8000_0021_EBX];
7152b70eec31SBabu Moger         break;
7153fcf5ef2aSThomas Huth     default:
7154fcf5ef2aSThomas Huth         /* reserved values: zero */
7155fcf5ef2aSThomas Huth         *eax = 0;
7156fcf5ef2aSThomas Huth         *ebx = 0;
7157fcf5ef2aSThomas Huth         *ecx = 0;
7158fcf5ef2aSThomas Huth         *edx = 0;
7159fcf5ef2aSThomas Huth         break;
7160fcf5ef2aSThomas Huth     }
7161fcf5ef2aSThomas Huth }
7162fcf5ef2aSThomas Huth 
x86_cpu_set_sgxlepubkeyhash(CPUX86State * env)7163db888065SSean Christopherson static void x86_cpu_set_sgxlepubkeyhash(CPUX86State *env)
7164db888065SSean Christopherson {
7165db888065SSean Christopherson #ifndef CONFIG_USER_ONLY
7166db888065SSean Christopherson     /* Those default values are defined in Skylake HW */
7167db888065SSean Christopherson     env->msr_ia32_sgxlepubkeyhash[0] = 0xa6053e051270b7acULL;
7168db888065SSean Christopherson     env->msr_ia32_sgxlepubkeyhash[1] = 0x6cfbe8ba8b3b413dULL;
7169db888065SSean Christopherson     env->msr_ia32_sgxlepubkeyhash[2] = 0xc4916d99f2b3735dULL;
7170db888065SSean Christopherson     env->msr_ia32_sgxlepubkeyhash[3] = 0xd4f8c05909f9bb3bULL;
7171db888065SSean Christopherson #endif
7172db888065SSean Christopherson }
7173db888065SSean Christopherson 
cpuid_has_xsave_feature(CPUX86State * env,const ExtSaveArea * esa)7174b888c780SPaolo Bonzini static bool cpuid_has_xsave_feature(CPUX86State *env, const ExtSaveArea *esa)
7175b888c780SPaolo Bonzini {
7176b888c780SPaolo Bonzini     if (!esa->size) {
7177b888c780SPaolo Bonzini         return false;
7178b888c780SPaolo Bonzini     }
7179b888c780SPaolo Bonzini 
71800d7475beSTao Su     if (env->features[esa->feature] & esa->bits) {
71810d7475beSTao Su         return true;
71820d7475beSTao Su     }
71830d7475beSTao Su     if (esa->feature == FEAT_7_0_EBX && esa->bits == CPUID_7_0_EBX_AVX512F
71840d7475beSTao Su         && (env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10)) {
71850d7475beSTao Su         return true;
71860d7475beSTao Su     }
71870d7475beSTao Su 
71880d7475beSTao Su     return false;
7189b888c780SPaolo Bonzini }
7190b888c780SPaolo Bonzini 
x86_cpu_reset_hold(Object * obj,ResetType type)7191ad80e367SPeter Maydell static void x86_cpu_reset_hold(Object *obj, ResetType type)
7192fcf5ef2aSThomas Huth {
7193348802b5SPhilippe Mathieu-Daudé     CPUState *cs = CPU(obj);
7194348802b5SPhilippe Mathieu-Daudé     X86CPU *cpu = X86_CPU(cs);
7195348802b5SPhilippe Mathieu-Daudé     X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
7196fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
7197fcf5ef2aSThomas Huth     target_ulong cr4;
7198fcf5ef2aSThomas Huth     uint64_t xcr0;
7199fcf5ef2aSThomas Huth     int i;
7200fcf5ef2aSThomas Huth 
7201e86787d3SPeter Maydell     if (xcc->parent_phases.hold) {
7202ad80e367SPeter Maydell         xcc->parent_phases.hold(obj, type);
7203e86787d3SPeter Maydell     }
7204fcf5ef2aSThomas Huth 
7205fcf5ef2aSThomas Huth     memset(env, 0, offsetof(CPUX86State, end_reset_fields));
7206fcf5ef2aSThomas Huth 
720762d39b28SPeter Maydell     if (tcg_enabled()) {
720862d39b28SPeter Maydell         cpu_init_fp_statuses(env);
720962d39b28SPeter Maydell     }
721062d39b28SPeter Maydell 
7211fcf5ef2aSThomas Huth     env->old_exception = -1;
7212fcf5ef2aSThomas Huth 
7213fcf5ef2aSThomas Huth     /* init to reset state */
7214e3126a5cSLara Lazier     env->int_ctl = 0;
7215fcf5ef2aSThomas Huth     env->hflags2 |= HF2_GIF_MASK;
7216b67e2796SLara Lazier     env->hflags2 |= HF2_VGIF_MASK;
7217b16c0e20SPaolo Bonzini     env->hflags &= ~HF_GUEST_MASK;
7218fcf5ef2aSThomas Huth 
7219fcf5ef2aSThomas Huth     cpu_x86_update_cr0(env, 0x60000010);
7220fcf5ef2aSThomas Huth     env->a20_mask = ~0x0;
7221fcf5ef2aSThomas Huth     env->smbase = 0x30000;
7222e13713dbSLiran Alon     env->msr_smi_count = 0;
7223fcf5ef2aSThomas Huth 
7224fcf5ef2aSThomas Huth     env->idt.limit = 0xffff;
7225fcf5ef2aSThomas Huth     env->gdt.limit = 0xffff;
7226fcf5ef2aSThomas Huth     env->ldt.limit = 0xffff;
7227fcf5ef2aSThomas Huth     env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT);
7228fcf5ef2aSThomas Huth     env->tr.limit = 0xffff;
7229fcf5ef2aSThomas Huth     env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT);
7230fcf5ef2aSThomas Huth 
7231fcf5ef2aSThomas Huth     cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff,
7232fcf5ef2aSThomas Huth                            DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK |
7233fcf5ef2aSThomas Huth                            DESC_R_MASK | DESC_A_MASK);
7234fcf5ef2aSThomas Huth     cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff,
7235fcf5ef2aSThomas Huth                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
7236fcf5ef2aSThomas Huth                            DESC_A_MASK);
7237fcf5ef2aSThomas Huth     cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff,
7238fcf5ef2aSThomas Huth                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
7239fcf5ef2aSThomas Huth                            DESC_A_MASK);
7240fcf5ef2aSThomas Huth     cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff,
7241fcf5ef2aSThomas Huth                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
7242fcf5ef2aSThomas Huth                            DESC_A_MASK);
7243fcf5ef2aSThomas Huth     cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff,
7244fcf5ef2aSThomas Huth                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
7245fcf5ef2aSThomas Huth                            DESC_A_MASK);
7246fcf5ef2aSThomas Huth     cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff,
7247fcf5ef2aSThomas Huth                            DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
7248fcf5ef2aSThomas Huth                            DESC_A_MASK);
7249fcf5ef2aSThomas Huth 
7250fcf5ef2aSThomas Huth     env->eip = 0xfff0;
7251fcf5ef2aSThomas Huth     env->regs[R_EDX] = env->cpuid_version;
7252fcf5ef2aSThomas Huth 
7253fcf5ef2aSThomas Huth     env->eflags = 0x2;
7254fcf5ef2aSThomas Huth 
7255fcf5ef2aSThomas Huth     /* FPU init */
7256fcf5ef2aSThomas Huth     for (i = 0; i < 8; i++) {
7257fcf5ef2aSThomas Huth         env->fptags[i] = 1;
7258fcf5ef2aSThomas Huth     }
7259fcf5ef2aSThomas Huth     cpu_set_fpuc(env, 0x37f);
7260fcf5ef2aSThomas Huth 
7261fcf5ef2aSThomas Huth     env->mxcsr = 0x1f80;
7262fcf5ef2aSThomas Huth     /* All units are in INIT state.  */
7263fcf5ef2aSThomas Huth     env->xstate_bv = 0;
7264fcf5ef2aSThomas Huth 
7265fcf5ef2aSThomas Huth     env->pat = 0x0007040600070406ULL;
72665286c366SPaolo Bonzini 
72675286c366SPaolo Bonzini     if (kvm_enabled()) {
72685286c366SPaolo Bonzini         /*
72695286c366SPaolo Bonzini          * KVM handles TSC = 0 specially and thinks we are hot-plugging
72705286c366SPaolo Bonzini          * a new CPU, use 1 instead to force a reset.
72715286c366SPaolo Bonzini          */
72725286c366SPaolo Bonzini         if (env->tsc != 0) {
72735286c366SPaolo Bonzini             env->tsc = 1;
72745286c366SPaolo Bonzini         }
72755286c366SPaolo Bonzini     } else {
72765286c366SPaolo Bonzini         env->tsc = 0;
72775286c366SPaolo Bonzini     }
72785286c366SPaolo Bonzini 
7279fcf5ef2aSThomas Huth     env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT;
72804cfd7babSWanpeng Li     if (env->features[FEAT_1_ECX] & CPUID_EXT_MONITOR) {
72814cfd7babSWanpeng Li         env->msr_ia32_misc_enable |= MSR_IA32_MISC_ENABLE_MWAIT;
72824cfd7babSWanpeng Li     }
7283fcf5ef2aSThomas Huth 
7284fcf5ef2aSThomas Huth     memset(env->dr, 0, sizeof(env->dr));
7285fcf5ef2aSThomas Huth     env->dr[6] = DR6_FIXED_1;
7286fcf5ef2aSThomas Huth     env->dr[7] = DR7_FIXED_1;
7287348802b5SPhilippe Mathieu-Daudé     cpu_breakpoint_remove_all(cs, BP_CPU);
7288348802b5SPhilippe Mathieu-Daudé     cpu_watchpoint_remove_all(cs, BP_CPU);
7289fcf5ef2aSThomas Huth 
7290fcf5ef2aSThomas Huth     cr4 = 0;
7291fcf5ef2aSThomas Huth     xcr0 = XSTATE_FP_MASK;
7292fcf5ef2aSThomas Huth 
7293fcf5ef2aSThomas Huth #ifdef CONFIG_USER_ONLY
7294fcf5ef2aSThomas Huth     /* Enable all the features for user-mode.  */
7295fcf5ef2aSThomas Huth     if (env->features[FEAT_1_EDX] & CPUID_SSE) {
7296fcf5ef2aSThomas Huth         xcr0 |= XSTATE_SSE_MASK;
7297fcf5ef2aSThomas Huth     }
7298fcf5ef2aSThomas Huth     for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
7299fcf5ef2aSThomas Huth         const ExtSaveArea *esa = &x86_ext_save_areas[i];
7300301e9067SYang Weijiang         if (!((1 << i) & CPUID_XSTATE_XCR0_MASK)) {
7301301e9067SYang Weijiang             continue;
7302301e9067SYang Weijiang         }
7303b888c780SPaolo Bonzini         if (cpuid_has_xsave_feature(env, esa)) {
7304fcf5ef2aSThomas Huth             xcr0 |= 1ull << i;
7305fcf5ef2aSThomas Huth         }
7306fcf5ef2aSThomas Huth     }
7307fcf5ef2aSThomas Huth 
7308fcf5ef2aSThomas Huth     if (env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE) {
7309fcf5ef2aSThomas Huth         cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK;
7310fcf5ef2aSThomas Huth     }
7311fcf5ef2aSThomas Huth     if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_FSGSBASE) {
7312fcf5ef2aSThomas Huth         cr4 |= CR4_FSGSBASE_MASK;
7313fcf5ef2aSThomas Huth     }
7314fcf5ef2aSThomas Huth #endif
7315fcf5ef2aSThomas Huth 
7316fcf5ef2aSThomas Huth     env->xcr0 = xcr0;
7317fcf5ef2aSThomas Huth     cpu_x86_update_cr4(env, cr4);
7318fcf5ef2aSThomas Huth 
7319fcf5ef2aSThomas Huth     /*
7320fcf5ef2aSThomas Huth      * SDM 11.11.5 requires:
7321fcf5ef2aSThomas Huth      *  - IA32_MTRR_DEF_TYPE MSR.E = 0
7322fcf5ef2aSThomas Huth      *  - IA32_MTRR_PHYSMASKn.V = 0
7323fcf5ef2aSThomas Huth      * All other bits are undefined.  For simplification, zero it all.
7324fcf5ef2aSThomas Huth      */
7325fcf5ef2aSThomas Huth     env->mtrr_deftype = 0;
7326fcf5ef2aSThomas Huth     memset(env->mtrr_var, 0, sizeof(env->mtrr_var));
7327fcf5ef2aSThomas Huth     memset(env->mtrr_fixed, 0, sizeof(env->mtrr_fixed));
7328fcf5ef2aSThomas Huth 
7329b7394c83SSergio Andres Gomez Del Real     env->interrupt_injected = -1;
7330fd13f23bSLiran Alon     env->exception_nr = -1;
7331fd13f23bSLiran Alon     env->exception_pending = 0;
7332fd13f23bSLiran Alon     env->exception_injected = 0;
7333fd13f23bSLiran Alon     env->exception_has_payload = false;
7334fd13f23bSLiran Alon     env->exception_payload = 0;
7335b7394c83SSergio Andres Gomez Del Real     env->nmi_injected = false;
733612f89a39SChenyi Qiang     env->triple_fault_pending = false;
7337fcf5ef2aSThomas Huth #if !defined(CONFIG_USER_ONLY)
7338fcf5ef2aSThomas Huth     /* We hard-wire the BSP to the first CPU. */
7339348802b5SPhilippe Mathieu-Daudé     apic_designate_bsp(cpu->apic_state, cs->cpu_index == 0);
7340fcf5ef2aSThomas Huth 
7341348802b5SPhilippe Mathieu-Daudé     cs->halted = !cpu_is_bsp(cpu);
7342fcf5ef2aSThomas Huth 
7343fcf5ef2aSThomas Huth     if (kvm_enabled()) {
7344fcf5ef2aSThomas Huth         kvm_arch_reset_vcpu(cpu);
7345fcf5ef2aSThomas Huth     }
7346db888065SSean Christopherson 
7347db888065SSean Christopherson     x86_cpu_set_sgxlepubkeyhash(env);
7348cabf9862SMaxim Levitsky 
7349cabf9862SMaxim Levitsky     env->amd_tsc_scale_msr =  MSR_AMD64_TSC_RATIO_DEFAULT;
7350cabf9862SMaxim Levitsky 
7351fcf5ef2aSThomas Huth #endif
7352fcf5ef2aSThomas Huth }
7353fcf5ef2aSThomas Huth 
x86_cpu_after_reset(X86CPU * cpu)7354ec19444aSMaciej S. Szmigiero void x86_cpu_after_reset(X86CPU *cpu)
7355ec19444aSMaciej S. Szmigiero {
7356ec19444aSMaciej S. Szmigiero #ifndef CONFIG_USER_ONLY
7357ec19444aSMaciej S. Szmigiero     if (kvm_enabled()) {
7358ec19444aSMaciej S. Szmigiero         kvm_arch_after_reset_vcpu(cpu);
7359ec19444aSMaciej S. Szmigiero     }
7360ec19444aSMaciej S. Szmigiero 
7361ec19444aSMaciej S. Szmigiero     if (cpu->apic_state) {
736208c4f4dbSPeter Maydell         device_cold_reset(cpu->apic_state);
7363ec19444aSMaciej S. Szmigiero     }
7364ec19444aSMaciej S. Szmigiero #endif
7365ec19444aSMaciej S. Szmigiero }
7366ec19444aSMaciej S. Szmigiero 
mce_init(X86CPU * cpu)7367fcf5ef2aSThomas Huth static void mce_init(X86CPU *cpu)
7368fcf5ef2aSThomas Huth {
7369fcf5ef2aSThomas Huth     CPUX86State *cenv = &cpu->env;
7370fcf5ef2aSThomas Huth     unsigned int bank;
7371fcf5ef2aSThomas Huth 
7372fcf5ef2aSThomas Huth     if (((cenv->cpuid_version >> 8) & 0xf) >= 6
7373fcf5ef2aSThomas Huth         && (cenv->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) ==
7374fcf5ef2aSThomas Huth             (CPUID_MCE | CPUID_MCA)) {
7375fcf5ef2aSThomas Huth         cenv->mcg_cap = MCE_CAP_DEF | MCE_BANKS_DEF |
7376fcf5ef2aSThomas Huth                         (cpu->enable_lmce ? MCG_LMCE_P : 0);
7377fcf5ef2aSThomas Huth         cenv->mcg_ctl = ~(uint64_t)0;
7378fcf5ef2aSThomas Huth         for (bank = 0; bank < MCE_BANKS_DEF; bank++) {
7379fcf5ef2aSThomas Huth             cenv->mce_banks[bank * 4] = ~(uint64_t)0;
7380fcf5ef2aSThomas Huth         }
7381fcf5ef2aSThomas Huth     }
7382fcf5ef2aSThomas Huth }
7383fcf5ef2aSThomas Huth 
x86_cpu_adjust_level(X86CPU * cpu,uint32_t * min,uint32_t value)7384fcf5ef2aSThomas Huth static void x86_cpu_adjust_level(X86CPU *cpu, uint32_t *min, uint32_t value)
7385fcf5ef2aSThomas Huth {
7386fcf5ef2aSThomas Huth     if (*min < value) {
7387fcf5ef2aSThomas Huth         *min = value;
7388fcf5ef2aSThomas Huth     }
7389fcf5ef2aSThomas Huth }
7390fcf5ef2aSThomas Huth 
7391fcf5ef2aSThomas Huth /* Increase cpuid_min_{level,xlevel,xlevel2} automatically, if appropriate */
x86_cpu_adjust_feat_level(X86CPU * cpu,FeatureWord w)7392fcf5ef2aSThomas Huth static void x86_cpu_adjust_feat_level(X86CPU *cpu, FeatureWord w)
7393fcf5ef2aSThomas Huth {
7394fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
7395fcf5ef2aSThomas Huth     FeatureWordInfo *fi = &feature_word_info[w];
739607585923SRobert Hoo     uint32_t eax = fi->cpuid.eax;
7397fcf5ef2aSThomas Huth     uint32_t region = eax & 0xF0000000;
7398fcf5ef2aSThomas Huth 
739907585923SRobert Hoo     assert(feature_word_info[w].type == CPUID_FEATURE_WORD);
7400fcf5ef2aSThomas Huth     if (!env->features[w]) {
7401fcf5ef2aSThomas Huth         return;
7402fcf5ef2aSThomas Huth     }
7403fcf5ef2aSThomas Huth 
7404fcf5ef2aSThomas Huth     switch (region) {
7405fcf5ef2aSThomas Huth     case 0x00000000:
7406fcf5ef2aSThomas Huth         x86_cpu_adjust_level(cpu, &env->cpuid_min_level, eax);
7407fcf5ef2aSThomas Huth     break;
7408fcf5ef2aSThomas Huth     case 0x80000000:
7409fcf5ef2aSThomas Huth         x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, eax);
7410fcf5ef2aSThomas Huth     break;
7411fcf5ef2aSThomas Huth     case 0xC0000000:
7412fcf5ef2aSThomas Huth         x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel2, eax);
7413fcf5ef2aSThomas Huth     break;
7414fcf5ef2aSThomas Huth     }
741580db491dSJing Liu 
741680db491dSJing Liu     if (eax == 7) {
741780db491dSJing Liu         x86_cpu_adjust_level(cpu, &env->cpuid_min_level_func7,
741880db491dSJing Liu                              fi->cpuid.ecx);
741980db491dSJing Liu     }
7420fcf5ef2aSThomas Huth }
7421fcf5ef2aSThomas Huth 
7422fcf5ef2aSThomas Huth /* Calculate XSAVE components based on the configured CPU feature flags */
x86_cpu_enable_xsave_components(X86CPU * cpu)7423fcf5ef2aSThomas Huth static void x86_cpu_enable_xsave_components(X86CPU *cpu)
7424fcf5ef2aSThomas Huth {
7425fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
7426fcf5ef2aSThomas Huth     int i;
7427fcf5ef2aSThomas Huth     uint64_t mask;
742819db68caSYang Zhong     static bool request_perm;
7429fcf5ef2aSThomas Huth 
7430fcf5ef2aSThomas Huth     if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
7431301e9067SYang Weijiang         env->features[FEAT_XSAVE_XCR0_LO] = 0;
7432301e9067SYang Weijiang         env->features[FEAT_XSAVE_XCR0_HI] = 0;
743381f5cad3SXiaoyao Li         env->features[FEAT_XSAVE_XSS_LO] = 0;
743481f5cad3SXiaoyao Li         env->features[FEAT_XSAVE_XSS_HI] = 0;
7435fcf5ef2aSThomas Huth         return;
7436fcf5ef2aSThomas Huth     }
7437fcf5ef2aSThomas Huth 
7438fcf5ef2aSThomas Huth     mask = 0;
7439fcf5ef2aSThomas Huth     for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
7440fcf5ef2aSThomas Huth         const ExtSaveArea *esa = &x86_ext_save_areas[i];
7441b888c780SPaolo Bonzini         if (cpuid_has_xsave_feature(env, esa)) {
7442fcf5ef2aSThomas Huth             mask |= (1ULL << i);
7443fcf5ef2aSThomas Huth         }
7444fcf5ef2aSThomas Huth     }
7445fcf5ef2aSThomas Huth 
744619db68caSYang Zhong     /* Only request permission for first vcpu */
744719db68caSYang Zhong     if (kvm_enabled() && !request_perm) {
744819db68caSYang Zhong         kvm_request_xsave_components(cpu, mask);
744919db68caSYang Zhong         request_perm = true;
745019db68caSYang Zhong     }
745119db68caSYang Zhong 
7452301e9067SYang Weijiang     env->features[FEAT_XSAVE_XCR0_LO] = mask & CPUID_XSTATE_XCR0_MASK;
7453a11a3651SXiaoyao Li     env->features[FEAT_XSAVE_XCR0_HI] = (mask & CPUID_XSTATE_XCR0_MASK) >> 32;
7454301e9067SYang Weijiang     env->features[FEAT_XSAVE_XSS_LO] = mask & CPUID_XSTATE_XSS_MASK;
7455a11a3651SXiaoyao Li     env->features[FEAT_XSAVE_XSS_HI] = (mask & CPUID_XSTATE_XSS_MASK) >> 32;
7456fcf5ef2aSThomas Huth }
7457fcf5ef2aSThomas Huth 
7458b8d834a0SEduardo Habkost /***** Steps involved on loading and filtering CPUID data
7459b8d834a0SEduardo Habkost  *
7460b8d834a0SEduardo Habkost  * When initializing and realizing a CPU object, the steps
7461b8d834a0SEduardo Habkost  * involved in setting up CPUID data are:
7462b8d834a0SEduardo Habkost  *
7463b8d834a0SEduardo Habkost  * 1) Loading CPU model definition (X86CPUDefinition). This is
7464dcafd1efSEduardo Habkost  *    implemented by x86_cpu_load_model() and should be completely
7465b8d834a0SEduardo Habkost  *    transparent, as it is done automatically by instance_init.
7466b8d834a0SEduardo Habkost  *    No code should need to look at X86CPUDefinition structs
7467b8d834a0SEduardo Habkost  *    outside instance_init.
7468b8d834a0SEduardo Habkost  *
7469b8d834a0SEduardo Habkost  * 2) CPU expansion. This is done by realize before CPUID
7470b8d834a0SEduardo Habkost  *    filtering, and will make sure host/accelerator data is
7471b8d834a0SEduardo Habkost  *    loaded for CPU models that depend on host capabilities
7472b8d834a0SEduardo Habkost  *    (e.g. "host"). Done by x86_cpu_expand_features().
7473b8d834a0SEduardo Habkost  *
7474b8d834a0SEduardo Habkost  * 3) CPUID filtering. This initializes extra data related to
7475b8d834a0SEduardo Habkost  *    CPUID, and checks if the host supports all capabilities
7476b8d834a0SEduardo Habkost  *    required by the CPU. Runnability of a CPU model is
7477b8d834a0SEduardo Habkost  *    determined at this step. Done by x86_cpu_filter_features().
7478b8d834a0SEduardo Habkost  *
7479b8d834a0SEduardo Habkost  * Some operations don't require all steps to be performed.
7480b8d834a0SEduardo Habkost  * More precisely:
7481b8d834a0SEduardo Habkost  *
7482b8d834a0SEduardo Habkost  * - CPU instance creation (instance_init) will run only CPU
7483b8d834a0SEduardo Habkost  *   model loading. CPU expansion can't run at instance_init-time
7484b8d834a0SEduardo Habkost  *   because host/accelerator data may be not available yet.
7485b8d834a0SEduardo Habkost  * - CPU realization will perform both CPU model expansion and CPUID
7486b8d834a0SEduardo Habkost  *   filtering, and return an error in case one of them fails.
7487b8d834a0SEduardo Habkost  * - query-cpu-definitions needs to run all 3 steps. It needs
7488b8d834a0SEduardo Habkost  *   to run CPUID filtering, as the 'unavailable-features'
7489b8d834a0SEduardo Habkost  *   field is set based on the filtering results.
7490b8d834a0SEduardo Habkost  * - The query-cpu-model-expansion QMP command only needs to run
7491b8d834a0SEduardo Habkost  *   CPU model loading and CPU expansion. It should not filter
7492b8d834a0SEduardo Habkost  *   any CPUID data based on host capabilities.
7493b8d834a0SEduardo Habkost  */
7494b8d834a0SEduardo Habkost 
7495b8d834a0SEduardo Habkost /* Expand CPU configuration data, based on configured features
7496b8d834a0SEduardo Habkost  * and host/accelerator capabilities when appropriate.
7497b8d834a0SEduardo Habkost  */
x86_cpu_expand_features(X86CPU * cpu,Error ** errp)749879f1a68aSClaudio Fontana void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
7499fcf5ef2aSThomas Huth {
7500fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
7501fcf5ef2aSThomas Huth     FeatureWord w;
750299e24dbdSPaolo Bonzini     int i;
7503fcf5ef2aSThomas Huth     GList *l;
7504fcf5ef2aSThomas Huth 
750599e24dbdSPaolo Bonzini     for (l = plus_features; l; l = l->next) {
750699e24dbdSPaolo Bonzini         const char *prop = l->data;
7507992861fbSMarkus Armbruster         if (!object_property_set_bool(OBJECT(cpu), prop, true, errp)) {
7508992861fbSMarkus Armbruster             return;
750999e24dbdSPaolo Bonzini         }
751099e24dbdSPaolo Bonzini     }
751199e24dbdSPaolo Bonzini 
751299e24dbdSPaolo Bonzini     for (l = minus_features; l; l = l->next) {
751399e24dbdSPaolo Bonzini         const char *prop = l->data;
7514992861fbSMarkus Armbruster         if (!object_property_set_bool(OBJECT(cpu), prop, false, errp)) {
7515992861fbSMarkus Armbruster             return;
751699e24dbdSPaolo Bonzini         }
751799e24dbdSPaolo Bonzini     }
751899e24dbdSPaolo Bonzini 
7519d4a606b3SEduardo Habkost     /*TODO: Now cpu->max_features doesn't overwrite features
7520d4a606b3SEduardo Habkost      * set using QOM properties, and we can convert
7521fcf5ef2aSThomas Huth      * plus_features & minus_features to global properties
7522fcf5ef2aSThomas Huth      * inside x86_cpu_parse_featurestr() too.
7523fcf5ef2aSThomas Huth      */
752444bd8e53SEduardo Habkost     if (cpu->max_features) {
7525fcf5ef2aSThomas Huth         for (w = 0; w < FEATURE_WORDS; w++) {
7526d4a606b3SEduardo Habkost             /* Override only features that weren't set explicitly
7527d4a606b3SEduardo Habkost              * by the user.
7528d4a606b3SEduardo Habkost              */
7529d4a606b3SEduardo Habkost             env->features[w] |=
75308dee3848SPaolo Bonzini                 x86_cpu_get_supported_feature_word(cpu, w) &
753178ee6bd0SPhilippe Mathieu-Daudé                 ~env->user_features[w] &
75320d914f39SEduardo Habkost                 ~feature_word_info[w].no_autoenable_flags;
7533fcf5ef2aSThomas Huth         }
7534bccfb846STao Su 
7535bccfb846STao Su         if ((env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10) && !env->avx10_version) {
7536bccfb846STao Su             uint32_t eax, ebx, ecx, edx;
7537bccfb846STao Su             x86_cpu_get_supported_cpuid(0x24, 0, &eax, &ebx, &ecx, &edx);
7538bccfb846STao Su             env->avx10_version = ebx & 0xff;
7539bccfb846STao Su         }
7540fcf5ef2aSThomas Huth     }
7541fcf5ef2aSThomas Huth 
754299e24dbdSPaolo Bonzini     for (i = 0; i < ARRAY_SIZE(feature_dependencies); i++) {
754399e24dbdSPaolo Bonzini         FeatureDep *d = &feature_dependencies[i];
754499e24dbdSPaolo Bonzini         if (!(env->features[d->from.index] & d->from.mask)) {
7545ede146c2SPaolo Bonzini             uint64_t unavailable_features = env->features[d->to.index] & d->to.mask;
7546fcf5ef2aSThomas Huth 
754799e24dbdSPaolo Bonzini             /* Not an error unless the dependent feature was added explicitly.  */
754899e24dbdSPaolo Bonzini             mark_unavailable_features(cpu, d->to.index,
754999e24dbdSPaolo Bonzini                                       unavailable_features & env->user_features[d->to.index],
755099e24dbdSPaolo Bonzini                                       "This feature depends on other features that were not requested");
755199e24dbdSPaolo Bonzini 
755299e24dbdSPaolo Bonzini             env->features[d->to.index] &= ~unavailable_features;
7553fcf5ef2aSThomas Huth         }
7554fcf5ef2aSThomas Huth     }
7555fcf5ef2aSThomas Huth 
7556fcf5ef2aSThomas Huth     if (!kvm_enabled() || !cpu->expose_kvm) {
7557fcf5ef2aSThomas Huth         env->features[FEAT_KVM] = 0;
7558fcf5ef2aSThomas Huth     }
7559fcf5ef2aSThomas Huth 
7560fcf5ef2aSThomas Huth     x86_cpu_enable_xsave_components(cpu);
7561fcf5ef2aSThomas Huth 
7562fcf5ef2aSThomas Huth     /* CPUID[EAX=7,ECX=0].EBX always increased level automatically: */
7563fcf5ef2aSThomas Huth     x86_cpu_adjust_feat_level(cpu, FEAT_7_0_EBX);
7564fcf5ef2aSThomas Huth     if (cpu->full_cpuid_auto_level) {
7565fcf5ef2aSThomas Huth         x86_cpu_adjust_feat_level(cpu, FEAT_1_EDX);
7566fcf5ef2aSThomas Huth         x86_cpu_adjust_feat_level(cpu, FEAT_1_ECX);
7567fcf5ef2aSThomas Huth         x86_cpu_adjust_feat_level(cpu, FEAT_6_EAX);
7568fcf5ef2aSThomas Huth         x86_cpu_adjust_feat_level(cpu, FEAT_7_0_ECX);
756980db491dSJing Liu         x86_cpu_adjust_feat_level(cpu, FEAT_7_1_EAX);
75708731336eSTao Su         x86_cpu_adjust_feat_level(cpu, FEAT_7_1_EDX);
75719dd8b710STao Su         x86_cpu_adjust_feat_level(cpu, FEAT_7_2_EDX);
7572fcf5ef2aSThomas Huth         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_EDX);
7573fcf5ef2aSThomas Huth         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_ECX);
7574fcf5ef2aSThomas Huth         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0007_EDX);
75751b3420e1SEduardo Habkost         x86_cpu_adjust_feat_level(cpu, FEAT_8000_0008_EBX);
7576fcf5ef2aSThomas Huth         x86_cpu_adjust_feat_level(cpu, FEAT_C000_0001_EDX);
7577fcf5ef2aSThomas Huth         x86_cpu_adjust_feat_level(cpu, FEAT_SVM);
7578fcf5ef2aSThomas Huth         x86_cpu_adjust_feat_level(cpu, FEAT_XSAVE);
7579f24c3a79SLuwei Kang 
7580f24c3a79SLuwei Kang         /* Intel Processor Trace requires CPUID[0x14] */
7581ddc2fc9eSLuwei Kang         if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT)) {
7582ddc2fc9eSLuwei Kang             if (cpu->intel_pt_auto_level) {
7583f24c3a79SLuwei Kang                 x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14);
7584ddc2fc9eSLuwei Kang             } else if (cpu->env.cpuid_min_level < 0x14) {
7585ddc2fc9eSLuwei Kang                 mark_unavailable_features(cpu, FEAT_7_0_EBX,
7586ddc2fc9eSLuwei Kang                     CPUID_7_0_EBX_INTEL_PT,
7587b7d77f5aSDaniel P. Berrangé                     "Intel PT need CPUID leaf 0x14, please set by \"-cpu ...,intel-pt=on,min-level=0x14\"");
7588ddc2fc9eSLuwei Kang             }
7589f24c3a79SLuwei Kang         }
7590f24c3a79SLuwei Kang 
7591760746acSzhenwei pi         /*
7592760746acSzhenwei pi          * Intel CPU topology with multi-dies support requires CPUID[0x1F].
7593760746acSzhenwei pi          * For AMD Rome/Milan, cpuid level is 0x10, and guest OS should detect
7594760746acSzhenwei pi          * extended toplogy by leaf 0xB. Only adjust it for Intel CPU, unless
7595760746acSzhenwei pi          * cpu->vendor_cpuid_only has been unset for compatibility with older
7596760746acSzhenwei pi          * machine types.
7597760746acSzhenwei pi          */
75986ddeb0ecSZhao Liu         if (x86_has_extended_topo(env->avail_cpu_topo) &&
7599760746acSzhenwei pi             (IS_INTEL_CPU(env) || !cpu->vendor_cpuid_only)) {
7600a94e1428SLike Xu             x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x1F);
7601a94e1428SLike Xu         }
7602a94e1428SLike Xu 
7603bccfb846STao Su         /* Advanced Vector Extensions 10 (AVX10) requires CPUID[0x24] */
7604bccfb846STao Su         if (env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10) {
7605bccfb846STao Su             x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x24);
7606bccfb846STao Su         }
7607bccfb846STao Su 
7608fcf5ef2aSThomas Huth         /* SVM requires CPUID[0x8000000A] */
7609fcf5ef2aSThomas Huth         if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
7610fcf5ef2aSThomas Huth             x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000000A);
7611fcf5ef2aSThomas Huth         }
76126cb8f2a6SBrijesh Singh 
76136cb8f2a6SBrijesh Singh         /* SEV requires CPUID[0x8000001F] */
76146cb8f2a6SBrijesh Singh         if (sev_enabled()) {
76156cb8f2a6SBrijesh Singh             x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000001F);
76166cb8f2a6SBrijesh Singh         }
7617dca6cffcSSean Christopherson 
7618b70eec31SBabu Moger         if (env->features[FEAT_8000_0021_EAX]) {
7619b70eec31SBabu Moger             x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x80000021);
7620b70eec31SBabu Moger         }
7621b70eec31SBabu Moger 
7622dca6cffcSSean Christopherson         /* SGX requires CPUID[0x12] for EPC enumeration */
7623dca6cffcSSean Christopherson         if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_SGX) {
7624dca6cffcSSean Christopherson             x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x12);
7625dca6cffcSSean Christopherson         }
7626fcf5ef2aSThomas Huth     }
7627fcf5ef2aSThomas Huth 
7628fcf5ef2aSThomas Huth     /* Set cpuid_*level* based on cpuid_min_*level, if not explicitly set */
762980db491dSJing Liu     if (env->cpuid_level_func7 == UINT32_MAX) {
763080db491dSJing Liu         env->cpuid_level_func7 = env->cpuid_min_level_func7;
763180db491dSJing Liu     }
7632fcf5ef2aSThomas Huth     if (env->cpuid_level == UINT32_MAX) {
7633fcf5ef2aSThomas Huth         env->cpuid_level = env->cpuid_min_level;
7634fcf5ef2aSThomas Huth     }
7635fcf5ef2aSThomas Huth     if (env->cpuid_xlevel == UINT32_MAX) {
7636fcf5ef2aSThomas Huth         env->cpuid_xlevel = env->cpuid_min_xlevel;
7637fcf5ef2aSThomas Huth     }
7638fcf5ef2aSThomas Huth     if (env->cpuid_xlevel2 == UINT32_MAX) {
7639fcf5ef2aSThomas Huth         env->cpuid_xlevel2 = env->cpuid_min_xlevel2;
7640fcf5ef2aSThomas Huth     }
7641071ce4b0SVitaly Kuznetsov 
7642652a5f22SPhilippe Mathieu-Daudé     if (kvm_enabled() && !kvm_hyperv_expand_features(cpu, errp)) {
7643652a5f22SPhilippe Mathieu-Daudé         return;
7644071ce4b0SVitaly Kuznetsov     }
7645fcf5ef2aSThomas Huth }
7646fcf5ef2aSThomas Huth 
7647b8d834a0SEduardo Habkost /*
7648b8d834a0SEduardo Habkost  * Finishes initialization of CPUID data, filters CPU feature
7649b8d834a0SEduardo Habkost  * words based on host availability of each feature.
7650b8d834a0SEduardo Habkost  *
76513507c6f0SPaolo Bonzini  * Returns: true if any flag is not supported by the host, false otherwise.
7652b8d834a0SEduardo Habkost  */
x86_cpu_filter_features(X86CPU * cpu,bool verbose)76533507c6f0SPaolo Bonzini static bool x86_cpu_filter_features(X86CPU *cpu, bool verbose)
7654b8d834a0SEduardo Habkost {
7655b8d834a0SEduardo Habkost     CPUX86State *env = &cpu->env;
7656b8d834a0SEduardo Habkost     FeatureWord w;
7657245edd0cSPaolo Bonzini     const char *prefix = NULL;
7658bccfb846STao Su     bool have_filtered_features;
7659bccfb846STao Su 
7660bccfb846STao Su     uint32_t eax_0, ebx_0, ecx_0, edx_0;
7661bccfb846STao Su     uint32_t eax_1, ebx_1, ecx_1, edx_1;
7662245edd0cSPaolo Bonzini 
7663245edd0cSPaolo Bonzini     if (verbose) {
7664245edd0cSPaolo Bonzini         prefix = accel_uses_host_cpuid()
7665245edd0cSPaolo Bonzini                  ? "host doesn't support requested feature"
7666245edd0cSPaolo Bonzini                  : "TCG doesn't support requested feature";
7667245edd0cSPaolo Bonzini     }
7668b8d834a0SEduardo Habkost 
7669b8d834a0SEduardo Habkost     for (w = 0; w < FEATURE_WORDS; w++) {
7670ede146c2SPaolo Bonzini         uint64_t host_feat =
76718dee3848SPaolo Bonzini             x86_cpu_get_supported_feature_word(NULL, w);
7672ede146c2SPaolo Bonzini         uint64_t requested_features = env->features[w];
7673ede146c2SPaolo Bonzini         uint64_t unavailable_features = requested_features & ~host_feat;
7674245edd0cSPaolo Bonzini         mark_unavailable_features(cpu, w, unavailable_features, prefix);
7675b8d834a0SEduardo Habkost     }
7676b8d834a0SEduardo Habkost 
7677028ade14SPaolo Bonzini     /*
7678028ade14SPaolo Bonzini      * Check that KVM actually allows the processor tracing features that
7679028ade14SPaolo Bonzini      * are advertised by cpu_x86_cpuid().  Keep these two in sync.
7680028ade14SPaolo Bonzini      */
7681028ade14SPaolo Bonzini     if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) &&
7682028ade14SPaolo Bonzini         kvm_enabled()) {
7683d0474024SPhilippe Mathieu-Daudé         x86_cpu_get_supported_cpuid(0x14, 0,
7684bccfb846STao Su                                     &eax_0, &ebx_0, &ecx_0, &edx_0);
7685d0474024SPhilippe Mathieu-Daudé         x86_cpu_get_supported_cpuid(0x14, 1,
7686bccfb846STao Su                                     &eax_1, &ebx_1, &ecx_1, &edx_1);
7687e37a5c7fSChao Peng 
7688e37a5c7fSChao Peng         if (!eax_0 ||
7689e37a5c7fSChao Peng            ((ebx_0 & INTEL_PT_MINIMAL_EBX) != INTEL_PT_MINIMAL_EBX) ||
7690e37a5c7fSChao Peng            ((ecx_0 & INTEL_PT_MINIMAL_ECX) != INTEL_PT_MINIMAL_ECX) ||
7691e37a5c7fSChao Peng            ((eax_1 & INTEL_PT_MTC_BITMAP) != INTEL_PT_MTC_BITMAP) ||
7692e37a5c7fSChao Peng            ((eax_1 & INTEL_PT_ADDR_RANGES_NUM_MASK) <
7693e37a5c7fSChao Peng                                            INTEL_PT_ADDR_RANGES_NUM) ||
7694e37a5c7fSChao Peng            ((ebx_1 & (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) !=
7695c078ca96SLuwei Kang                 (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) ||
7696d1615ea5SLuwei Kang            ((ecx_0 & CPUID_14_0_ECX_LIP) !=
7697d1615ea5SLuwei Kang                 (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP))) {
7698e37a5c7fSChao Peng             /*
7699e37a5c7fSChao Peng              * Processor Trace capabilities aren't configurable, so if the
7700e37a5c7fSChao Peng              * host can't emulate the capabilities we report on
7701e37a5c7fSChao Peng              * cpu_x86_cpuid(), intel-pt can't be enabled on the current host.
7702e37a5c7fSChao Peng              */
7703245edd0cSPaolo Bonzini             mark_unavailable_features(cpu, FEAT_7_0_EBX, CPUID_7_0_EBX_INTEL_PT, prefix);
7704e37a5c7fSChao Peng         }
7705e37a5c7fSChao Peng     }
77063507c6f0SPaolo Bonzini 
7707bccfb846STao Su     have_filtered_features = x86_cpu_have_filtered_features(cpu);
7708bccfb846STao Su 
7709bccfb846STao Su     if (env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10) {
7710bccfb846STao Su         x86_cpu_get_supported_cpuid(0x24, 0,
7711bccfb846STao Su                                     &eax_0, &ebx_0, &ecx_0, &edx_0);
7712bccfb846STao Su         uint8_t version = ebx_0 & 0xff;
7713bccfb846STao Su 
7714bccfb846STao Su         if (version < env->avx10_version) {
7715bccfb846STao Su             if (prefix) {
7716bccfb846STao Su                 warn_report("%s: avx10.%d. Adjust to avx10.%d",
7717bccfb846STao Su                             prefix, env->avx10_version, version);
7718bccfb846STao Su             }
7719bccfb846STao Su             env->avx10_version = version;
7720bccfb846STao Su             have_filtered_features = true;
7721bccfb846STao Su         }
7722*2f5f6cb9SZhao Liu     } else if (env->avx10_version) {
7723*2f5f6cb9SZhao Liu         if (prefix) {
7724bccfb846STao Su             warn_report("%s: avx10.%d.", prefix, env->avx10_version);
7725*2f5f6cb9SZhao Liu         }
7726bccfb846STao Su         have_filtered_features = true;
7727bccfb846STao Su     }
7728bccfb846STao Su 
7729bccfb846STao Su     return have_filtered_features;
7730b8d834a0SEduardo Habkost }
7731b8d834a0SEduardo Habkost 
x86_cpu_hyperv_realize(X86CPU * cpu)773208856771SVitaly Kuznetsov static void x86_cpu_hyperv_realize(X86CPU *cpu)
773308856771SVitaly Kuznetsov {
773408856771SVitaly Kuznetsov     size_t len;
773508856771SVitaly Kuznetsov 
773608856771SVitaly Kuznetsov     /* Hyper-V vendor id */
773708856771SVitaly Kuznetsov     if (!cpu->hyperv_vendor) {
77384519259aSVitaly Kuznetsov         object_property_set_str(OBJECT(cpu), "hv-vendor-id", "Microsoft Hv",
77394519259aSVitaly Kuznetsov                                 &error_abort);
77404519259aSVitaly Kuznetsov     }
774108856771SVitaly Kuznetsov     len = strlen(cpu->hyperv_vendor);
774208856771SVitaly Kuznetsov     if (len > 12) {
774308856771SVitaly Kuznetsov         warn_report("hv-vendor-id truncated to 12 characters");
774408856771SVitaly Kuznetsov         len = 12;
774508856771SVitaly Kuznetsov     }
774608856771SVitaly Kuznetsov     memset(cpu->hyperv_vendor_id, 0, 12);
774708856771SVitaly Kuznetsov     memcpy(cpu->hyperv_vendor_id, cpu->hyperv_vendor, len);
7748735db465SVitaly Kuznetsov 
7749735db465SVitaly Kuznetsov     /* 'Hv#1' interface identification*/
7750735db465SVitaly Kuznetsov     cpu->hyperv_interface_id[0] = 0x31237648;
7751735db465SVitaly Kuznetsov     cpu->hyperv_interface_id[1] = 0;
7752735db465SVitaly Kuznetsov     cpu->hyperv_interface_id[2] = 0;
7753735db465SVitaly Kuznetsov     cpu->hyperv_interface_id[3] = 0;
7754fb7e31aaSVitaly Kuznetsov 
775523eb5d03SVitaly Kuznetsov     /* Hypervisor implementation limits */
775623eb5d03SVitaly Kuznetsov     cpu->hyperv_limits[0] = 64;
775723eb5d03SVitaly Kuznetsov     cpu->hyperv_limits[1] = 0;
775823eb5d03SVitaly Kuznetsov     cpu->hyperv_limits[2] = 0;
775908856771SVitaly Kuznetsov }
776008856771SVitaly Kuznetsov 
x86_cpu_realizefn(DeviceState * dev,Error ** errp)7761fcf5ef2aSThomas Huth static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
7762fcf5ef2aSThomas Huth {
7763fcf5ef2aSThomas Huth     CPUState *cs = CPU(dev);
7764fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(dev);
7765fcf5ef2aSThomas Huth     X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
7766fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
7767fcf5ef2aSThomas Huth     Error *local_err = NULL;
7768f06d8a18SYang Weijiang     unsigned requested_lbr_fmt;
7769fcf5ef2aSThomas Huth 
7770b94b8c60SPhilippe Mathieu-Daudé #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
7771492f8b88SAnton Johansson     /* Use pc-relative instructions in system-mode */
7772b254c342SPhilippe Mathieu-Daudé     tcg_cflags_set(cs, CF_PCREL);
7773492f8b88SAnton Johansson #endif
7774492f8b88SAnton Johansson 
7775fcf5ef2aSThomas Huth     if (cpu->apic_id == UNASSIGNED_APIC_ID) {
7776fcf5ef2aSThomas Huth         error_setg(errp, "apic-id property was not initialized properly");
7777fcf5ef2aSThomas Huth         return;
7778fcf5ef2aSThomas Huth     }
7779fcf5ef2aSThomas Huth 
7780662175b9SClaudio Fontana     /*
7781662175b9SClaudio Fontana      * Process Hyper-V enlightenments.
7782662175b9SClaudio Fontana      * Note: this currently has to happen before the expansion of CPU features.
7783662175b9SClaudio Fontana      */
7784662175b9SClaudio Fontana     x86_cpu_hyperv_realize(cpu);
7785662175b9SClaudio Fontana 
7786b8d834a0SEduardo Habkost     x86_cpu_expand_features(cpu, &local_err);
7787fcf5ef2aSThomas Huth     if (local_err) {
7788fcf5ef2aSThomas Huth         goto out;
7789fcf5ef2aSThomas Huth     }
7790fcf5ef2aSThomas Huth 
7791f06d8a18SYang Weijiang     /*
7792f06d8a18SYang Weijiang      * Override env->features[FEAT_PERF_CAPABILITIES].LBR_FMT
7793f06d8a18SYang Weijiang      * with user-provided setting.
7794f06d8a18SYang Weijiang      */
7795f06d8a18SYang Weijiang     if (cpu->lbr_fmt != ~PERF_CAP_LBR_FMT) {
7796f06d8a18SYang Weijiang         if ((cpu->lbr_fmt & PERF_CAP_LBR_FMT) != cpu->lbr_fmt) {
7797f06d8a18SYang Weijiang             error_setg(errp, "invalid lbr-fmt");
7798f06d8a18SYang Weijiang             return;
7799f06d8a18SYang Weijiang         }
7800f06d8a18SYang Weijiang         env->features[FEAT_PERF_CAPABILITIES] &= ~PERF_CAP_LBR_FMT;
7801f06d8a18SYang Weijiang         env->features[FEAT_PERF_CAPABILITIES] |= cpu->lbr_fmt;
7802f06d8a18SYang Weijiang     }
7803f06d8a18SYang Weijiang 
7804f06d8a18SYang Weijiang     /*
7805f06d8a18SYang Weijiang      * vPMU LBR is supported when 1) KVM is enabled 2) Option pmu=on and
7806f06d8a18SYang Weijiang      * 3)vPMU LBR format matches that of host setting.
7807f06d8a18SYang Weijiang      */
7808f06d8a18SYang Weijiang     requested_lbr_fmt =
7809f06d8a18SYang Weijiang         env->features[FEAT_PERF_CAPABILITIES] & PERF_CAP_LBR_FMT;
7810f06d8a18SYang Weijiang     if (requested_lbr_fmt && kvm_enabled()) {
7811f06d8a18SYang Weijiang         uint64_t host_perf_cap =
78128dee3848SPaolo Bonzini             x86_cpu_get_supported_feature_word(NULL, FEAT_PERF_CAPABILITIES);
7813f06d8a18SYang Weijiang         unsigned host_lbr_fmt = host_perf_cap & PERF_CAP_LBR_FMT;
7814f06d8a18SYang Weijiang 
7815f06d8a18SYang Weijiang         if (!cpu->enable_pmu) {
7816f06d8a18SYang Weijiang             error_setg(errp, "vPMU: LBR is unsupported without pmu=on");
7817f06d8a18SYang Weijiang             return;
7818f06d8a18SYang Weijiang         }
7819f06d8a18SYang Weijiang         if (requested_lbr_fmt != host_lbr_fmt) {
7820f06d8a18SYang Weijiang             error_setg(errp, "vPMU: the lbr-fmt value (0x%x) does not match "
7821f06d8a18SYang Weijiang                         "the host value (0x%x).",
7822f06d8a18SYang Weijiang                         requested_lbr_fmt, host_lbr_fmt);
7823f06d8a18SYang Weijiang             return;
7824f06d8a18SYang Weijiang         }
7825f06d8a18SYang Weijiang     }
7826f06d8a18SYang Weijiang 
78273507c6f0SPaolo Bonzini     if (x86_cpu_filter_features(cpu, cpu->check_cpuid || cpu->enforce_cpuid)) {
78283507c6f0SPaolo Bonzini         if (cpu->enforce_cpuid) {
7829fcf5ef2aSThomas Huth             error_setg(&local_err,
7830d6dcc558SSergio Andres Gomez Del Real                        accel_uses_host_cpuid() ?
7831fcf5ef2aSThomas Huth                        "Host doesn't support requested features" :
7832fcf5ef2aSThomas Huth                        "TCG doesn't support requested features");
7833fcf5ef2aSThomas Huth             goto out;
7834fcf5ef2aSThomas Huth         }
78353507c6f0SPaolo Bonzini     }
7836fcf5ef2aSThomas Huth 
7837fcf5ef2aSThomas Huth     /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on
7838fcf5ef2aSThomas Huth      * CPUID[1].EDX.
7839fcf5ef2aSThomas Huth      */
7840fcf5ef2aSThomas Huth     if (IS_AMD_CPU(env)) {
7841fcf5ef2aSThomas Huth         env->features[FEAT_8000_0001_EDX] &= ~CPUID_EXT2_AMD_ALIASES;
7842fcf5ef2aSThomas Huth         env->features[FEAT_8000_0001_EDX] |= (env->features[FEAT_1_EDX]
7843fcf5ef2aSThomas Huth            & CPUID_EXT2_AMD_ALIASES);
7844fcf5ef2aSThomas Huth     }
7845fcf5ef2aSThomas Huth 
7846db888065SSean Christopherson     x86_cpu_set_sgxlepubkeyhash(env);
7847db888065SSean Christopherson 
7848662175b9SClaudio Fontana     /*
7849662175b9SClaudio Fontana      * note: the call to the framework needs to happen after feature expansion,
7850662175b9SClaudio Fontana      * but before the checks/modifications to ucode_rev, mwait, phys_bits.
7851662175b9SClaudio Fontana      * These may be set by the accel-specific code,
7852662175b9SClaudio Fontana      * and the results are subsequently checked / assumed in this function.
7853662175b9SClaudio Fontana      */
7854662175b9SClaudio Fontana     cpu_exec_realizefn(cs, &local_err);
7855662175b9SClaudio Fontana     if (local_err != NULL) {
7856662175b9SClaudio Fontana         error_propagate(errp, local_err);
7857662175b9SClaudio Fontana         return;
7858662175b9SClaudio Fontana     }
7859662175b9SClaudio Fontana 
7860662175b9SClaudio Fontana     if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
7861662175b9SClaudio Fontana         g_autofree char *name = x86_cpu_class_get_model_name(xcc);
7862662175b9SClaudio Fontana         error_setg(&local_err, "CPU model '%s' requires KVM or HVF", name);
7863662175b9SClaudio Fontana         goto out;
7864662175b9SClaudio Fontana     }
7865662175b9SClaudio Fontana 
7866513ba32dSGerd Hoffmann     if (cpu->guest_phys_bits == -1) {
7867513ba32dSGerd Hoffmann         /*
7868513ba32dSGerd Hoffmann          * If it was not set by the user, or by the accelerator via
7869513ba32dSGerd Hoffmann          * cpu_exec_realizefn, clear.
7870513ba32dSGerd Hoffmann          */
7871513ba32dSGerd Hoffmann         cpu->guest_phys_bits = 0;
7872513ba32dSGerd Hoffmann     }
7873513ba32dSGerd Hoffmann 
7874662175b9SClaudio Fontana     if (cpu->ucode_rev == 0) {
7875662175b9SClaudio Fontana         /*
7876662175b9SClaudio Fontana          * The default is the same as KVM's. Note that this check
7877662175b9SClaudio Fontana          * needs to happen after the evenual setting of ucode_rev in
7878662175b9SClaudio Fontana          * accel-specific code in cpu_exec_realizefn.
7879662175b9SClaudio Fontana          */
7880662175b9SClaudio Fontana         if (IS_AMD_CPU(env)) {
7881662175b9SClaudio Fontana             cpu->ucode_rev = 0x01000065;
7882662175b9SClaudio Fontana         } else {
7883662175b9SClaudio Fontana             cpu->ucode_rev = 0x100000000ULL;
7884662175b9SClaudio Fontana         }
7885662175b9SClaudio Fontana     }
7886662175b9SClaudio Fontana 
7887662175b9SClaudio Fontana     /*
7888662175b9SClaudio Fontana      * mwait extended info: needed for Core compatibility
7889662175b9SClaudio Fontana      * We always wake on interrupt even if host does not have the capability.
7890662175b9SClaudio Fontana      *
7891662175b9SClaudio Fontana      * requires the accel-specific code in cpu_exec_realizefn to
7892662175b9SClaudio Fontana      * have already acquired the CPUID data into cpu->mwait.
7893662175b9SClaudio Fontana      */
7894662175b9SClaudio Fontana     cpu->mwait.ecx |= CPUID_MWAIT_EMX | CPUID_MWAIT_IBE;
7895662175b9SClaudio Fontana 
7896fcf5ef2aSThomas Huth     /* For 64bit systems think about the number of physical bits to present.
7897fcf5ef2aSThomas Huth      * ideally this should be the same as the host; anything other than matching
7898fcf5ef2aSThomas Huth      * the host can cause incorrect guest behaviour.
7899fcf5ef2aSThomas Huth      * QEMU used to pick the magic value of 40 bits that corresponds to
7900fcf5ef2aSThomas Huth      * consumer AMD devices but nothing else.
7901662175b9SClaudio Fontana      *
7902662175b9SClaudio Fontana      * Note that this code assumes features expansion has already been done
7903662175b9SClaudio Fontana      * (as it checks for CPUID_EXT2_LM), and also assumes that potential
7904662175b9SClaudio Fontana      * phys_bits adjustments to match the host have been already done in
7905662175b9SClaudio Fontana      * accel-specific code in cpu_exec_realizefn.
7906fcf5ef2aSThomas Huth      */
7907fcf5ef2aSThomas Huth     if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
7908fcf5ef2aSThomas Huth         if (cpu->phys_bits &&
7909fcf5ef2aSThomas Huth             (cpu->phys_bits > TARGET_PHYS_ADDR_SPACE_BITS ||
7910fcf5ef2aSThomas Huth             cpu->phys_bits < 32)) {
7911fcf5ef2aSThomas Huth             error_setg(errp, "phys-bits should be between 32 and %u "
7912fcf5ef2aSThomas Huth                              " (but is %u)",
7913fcf5ef2aSThomas Huth                              TARGET_PHYS_ADDR_SPACE_BITS, cpu->phys_bits);
7914fcf5ef2aSThomas Huth             return;
7915fcf5ef2aSThomas Huth         }
7916f5cc5a5cSClaudio Fontana         /*
7917f5cc5a5cSClaudio Fontana          * 0 means it was not explicitly set by the user (or by machine
7918f5cc5a5cSClaudio Fontana          * compat_props or by the host code in host-cpu.c).
7919f5cc5a5cSClaudio Fontana          * In this case, the default is the value used by TCG (40).
7920fcf5ef2aSThomas Huth          */
7921fcf5ef2aSThomas Huth         if (cpu->phys_bits == 0) {
7922fcf5ef2aSThomas Huth             cpu->phys_bits = TCG_PHYS_ADDR_BITS;
7923fcf5ef2aSThomas Huth         }
7924513ba32dSGerd Hoffmann         if (cpu->guest_phys_bits &&
7925513ba32dSGerd Hoffmann             (cpu->guest_phys_bits > cpu->phys_bits ||
7926513ba32dSGerd Hoffmann             cpu->guest_phys_bits < 32)) {
7927513ba32dSGerd Hoffmann             error_setg(errp, "guest-phys-bits should be between 32 and %u "
7928513ba32dSGerd Hoffmann                              " (but is %u)",
7929513ba32dSGerd Hoffmann                              cpu->phys_bits, cpu->guest_phys_bits);
7930513ba32dSGerd Hoffmann             return;
7931513ba32dSGerd Hoffmann         }
7932fcf5ef2aSThomas Huth     } else {
7933fcf5ef2aSThomas Huth         /* For 32 bit systems don't use the user set value, but keep
7934fcf5ef2aSThomas Huth          * phys_bits consistent with what we tell the guest.
7935fcf5ef2aSThomas Huth          */
7936fcf5ef2aSThomas Huth         if (cpu->phys_bits != 0) {
7937fcf5ef2aSThomas Huth             error_setg(errp, "phys-bits is not user-configurable in 32 bit");
7938fcf5ef2aSThomas Huth             return;
7939fcf5ef2aSThomas Huth         }
7940513ba32dSGerd Hoffmann         if (cpu->guest_phys_bits != 0) {
7941513ba32dSGerd Hoffmann             error_setg(errp, "guest-phys-bits is not user-configurable in 32 bit");
7942513ba32dSGerd Hoffmann             return;
7943513ba32dSGerd Hoffmann         }
7944fcf5ef2aSThomas Huth 
7945d8300542SAni Sinha         if (env->features[FEAT_1_EDX] & (CPUID_PSE36 | CPUID_PAE)) {
7946fcf5ef2aSThomas Huth             cpu->phys_bits = 36;
7947fcf5ef2aSThomas Huth         } else {
7948fcf5ef2aSThomas Huth             cpu->phys_bits = 32;
7949fcf5ef2aSThomas Huth         }
7950fcf5ef2aSThomas Huth     }
7951a9f27ea9SEduardo Habkost 
7952a9f27ea9SEduardo Habkost     /* Cache information initialization */
7953a9f27ea9SEduardo Habkost     if (!cpu->legacy_cache) {
7954cca0a000SMichael Roth         const CPUCaches *cache_info =
7955cca0a000SMichael Roth             x86_cpu_get_versioned_cache_info(cpu, xcc->model);
7956cca0a000SMichael Roth 
7957cca0a000SMichael Roth         if (!xcc->model || !cache_info) {
795888703ce2SEduardo Habkost             g_autofree char *name = x86_cpu_class_get_model_name(xcc);
7959a9f27ea9SEduardo Habkost             error_setg(errp,
7960a9f27ea9SEduardo Habkost                        "CPU model '%s' doesn't support legacy-cache=off", name);
7961a9f27ea9SEduardo Habkost             return;
7962a9f27ea9SEduardo Habkost         }
7963a9f27ea9SEduardo Habkost         env->cache_info_cpuid2 = env->cache_info_cpuid4 = env->cache_info_amd =
7964cca0a000SMichael Roth             *cache_info;
7965a9f27ea9SEduardo Habkost     } else {
7966a9f27ea9SEduardo Habkost         /* Build legacy cache information */
7967a9f27ea9SEduardo Habkost         env->cache_info_cpuid2.l1d_cache = &legacy_l1d_cache;
7968a9f27ea9SEduardo Habkost         env->cache_info_cpuid2.l1i_cache = &legacy_l1i_cache;
7969a9f27ea9SEduardo Habkost         env->cache_info_cpuid2.l2_cache = &legacy_l2_cache_cpuid2;
7970a9f27ea9SEduardo Habkost         env->cache_info_cpuid2.l3_cache = &legacy_l3_cache;
7971a9f27ea9SEduardo Habkost 
7972a9f27ea9SEduardo Habkost         env->cache_info_cpuid4.l1d_cache = &legacy_l1d_cache;
7973a9f27ea9SEduardo Habkost         env->cache_info_cpuid4.l1i_cache = &legacy_l1i_cache;
7974a9f27ea9SEduardo Habkost         env->cache_info_cpuid4.l2_cache = &legacy_l2_cache;
7975a9f27ea9SEduardo Habkost         env->cache_info_cpuid4.l3_cache = &legacy_l3_cache;
7976a9f27ea9SEduardo Habkost 
7977a9f27ea9SEduardo Habkost         env->cache_info_amd.l1d_cache = &legacy_l1d_cache_amd;
7978a9f27ea9SEduardo Habkost         env->cache_info_amd.l1i_cache = &legacy_l1i_cache_amd;
7979a9f27ea9SEduardo Habkost         env->cache_info_amd.l2_cache = &legacy_l2_cache_amd;
7980a9f27ea9SEduardo Habkost         env->cache_info_amd.l3_cache = &legacy_l3_cache;
7981a9f27ea9SEduardo Habkost     }
7982a9f27ea9SEduardo Habkost 
7983fcf5ef2aSThomas Huth #ifndef CONFIG_USER_ONLY
79840e11fc69SLike Xu     MachineState *ms = MACHINE(qdev_get_machine());
7985fcf5ef2aSThomas Huth     qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
7986fcf5ef2aSThomas Huth 
79870e11fc69SLike Xu     if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || ms->smp.cpus > 1) {
7988fcf5ef2aSThomas Huth         x86_cpu_apic_create(cpu, &local_err);
7989fcf5ef2aSThomas Huth         if (local_err != NULL) {
7990fcf5ef2aSThomas Huth             goto out;
7991fcf5ef2aSThomas Huth         }
7992fcf5ef2aSThomas Huth     }
7993fcf5ef2aSThomas Huth #endif
7994fcf5ef2aSThomas Huth 
7995fcf5ef2aSThomas Huth     mce_init(cpu);
7996fcf5ef2aSThomas Huth 
7997ac2fb86aSIlya Leoshkevich     x86_cpu_gdb_init(cs);
7998fcf5ef2aSThomas Huth     qemu_init_vcpu(cs);
7999fcf5ef2aSThomas Huth 
80006b2942f9SBabu Moger     /*
80016b2942f9SBabu Moger      * Most Intel and certain AMD CPUs support hyperthreading. Even though QEMU
80026b2942f9SBabu Moger      * fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
80036b2942f9SBabu Moger      * based on inputs (sockets,cores,threads), it is still better to give
8004fcf5ef2aSThomas Huth      * users a warning.
8005fcf5ef2aSThomas Huth      *
8006fcf5ef2aSThomas Huth      * NOTE: the following code has to follow qemu_init_vcpu(). Otherwise
8007fcf5ef2aSThomas Huth      * cs->nr_threads hasn't be populated yet and the checking is incorrect.
8008fcf5ef2aSThomas Huth      */
80096b2942f9SBabu Moger     if (IS_AMD_CPU(env) &&
80106b2942f9SBabu Moger         !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) &&
80118e3991ebSZhao Liu         cs->nr_threads > 1) {
80128e3991ebSZhao Liu             warn_report_once("This family of AMD CPU doesn't support "
8013aec202cbSZhao Liu                              "hyperthreading(%d). Please configure -smp "
8014aec202cbSZhao Liu                              "options properly or try enabling topoext "
8015aec202cbSZhao Liu                              "feature.", cs->nr_threads);
8016fcf5ef2aSThomas Huth     }
8017fcf5ef2aSThomas Huth 
801879f1a68aSClaudio Fontana #ifndef CONFIG_USER_ONLY
8019fcf5ef2aSThomas Huth     x86_cpu_apic_realize(cpu, &local_err);
8020fcf5ef2aSThomas Huth     if (local_err != NULL) {
8021fcf5ef2aSThomas Huth         goto out;
8022fcf5ef2aSThomas Huth     }
802379f1a68aSClaudio Fontana #endif /* !CONFIG_USER_ONLY */
8024fcf5ef2aSThomas Huth     cpu_reset(cs);
8025fcf5ef2aSThomas Huth 
8026fcf5ef2aSThomas Huth     xcc->parent_realize(dev, &local_err);
8027fcf5ef2aSThomas Huth 
8028fcf5ef2aSThomas Huth out:
8029fcf5ef2aSThomas Huth     if (local_err != NULL) {
8030fcf5ef2aSThomas Huth         error_propagate(errp, local_err);
8031fcf5ef2aSThomas Huth         return;
8032fcf5ef2aSThomas Huth     }
8033fcf5ef2aSThomas Huth }
8034fcf5ef2aSThomas Huth 
x86_cpu_unrealizefn(DeviceState * dev)8035b69c3c21SMarkus Armbruster static void x86_cpu_unrealizefn(DeviceState *dev)
8036fcf5ef2aSThomas Huth {
8037fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(dev);
8038fcf5ef2aSThomas Huth     X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
8039fcf5ef2aSThomas Huth 
8040fcf5ef2aSThomas Huth #ifndef CONFIG_USER_ONLY
8041fcf5ef2aSThomas Huth     cpu_remove_sync(CPU(dev));
8042fcf5ef2aSThomas Huth     qemu_unregister_reset(x86_cpu_machine_reset_cb, dev);
8043fcf5ef2aSThomas Huth #endif
8044fcf5ef2aSThomas Huth 
8045fcf5ef2aSThomas Huth     if (cpu->apic_state) {
8046fcf5ef2aSThomas Huth         object_unparent(OBJECT(cpu->apic_state));
8047fcf5ef2aSThomas Huth         cpu->apic_state = NULL;
8048fcf5ef2aSThomas Huth     }
8049fcf5ef2aSThomas Huth 
8050b69c3c21SMarkus Armbruster     xcc->parent_unrealize(dev);
8051fcf5ef2aSThomas Huth }
8052fcf5ef2aSThomas Huth 
8053fcf5ef2aSThomas Huth typedef struct BitProperty {
8054a7b0ffacSEduardo Habkost     FeatureWord w;
8055ede146c2SPaolo Bonzini     uint64_t mask;
8056fcf5ef2aSThomas Huth } BitProperty;
8057fcf5ef2aSThomas Huth 
x86_cpu_get_bit_prop(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)8058fcf5ef2aSThomas Huth static void x86_cpu_get_bit_prop(Object *obj, Visitor *v, const char *name,
8059fcf5ef2aSThomas Huth                                  void *opaque, Error **errp)
8060fcf5ef2aSThomas Huth {
8061a7b0ffacSEduardo Habkost     X86CPU *cpu = X86_CPU(obj);
8062fcf5ef2aSThomas Huth     BitProperty *fp = opaque;
8063ede146c2SPaolo Bonzini     uint64_t f = cpu->env.features[fp->w];
8064a7b0ffacSEduardo Habkost     bool value = (f & fp->mask) == fp->mask;
8065fcf5ef2aSThomas Huth     visit_type_bool(v, name, &value, errp);
8066fcf5ef2aSThomas Huth }
8067fcf5ef2aSThomas Huth 
x86_cpu_set_bit_prop(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)8068fcf5ef2aSThomas Huth static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
8069fcf5ef2aSThomas Huth                                  void *opaque, Error **errp)
8070fcf5ef2aSThomas Huth {
8071fcf5ef2aSThomas Huth     DeviceState *dev = DEVICE(obj);
8072a7b0ffacSEduardo Habkost     X86CPU *cpu = X86_CPU(obj);
8073fcf5ef2aSThomas Huth     BitProperty *fp = opaque;
8074fcf5ef2aSThomas Huth     bool value;
8075fcf5ef2aSThomas Huth 
8076fcf5ef2aSThomas Huth     if (dev->realized) {
8077fcf5ef2aSThomas Huth         qdev_prop_set_after_realize(dev, name, errp);
8078fcf5ef2aSThomas Huth         return;
8079fcf5ef2aSThomas Huth     }
8080fcf5ef2aSThomas Huth 
8081668f62ecSMarkus Armbruster     if (!visit_type_bool(v, name, &value, errp)) {
8082fcf5ef2aSThomas Huth         return;
8083fcf5ef2aSThomas Huth     }
8084fcf5ef2aSThomas Huth 
8085fcf5ef2aSThomas Huth     if (value) {
8086a7b0ffacSEduardo Habkost         cpu->env.features[fp->w] |= fp->mask;
8087fcf5ef2aSThomas Huth     } else {
8088a7b0ffacSEduardo Habkost         cpu->env.features[fp->w] &= ~fp->mask;
8089fcf5ef2aSThomas Huth     }
8090d4a606b3SEduardo Habkost     cpu->env.user_features[fp->w] |= fp->mask;
8091fcf5ef2aSThomas Huth }
8092fcf5ef2aSThomas Huth 
8093fcf5ef2aSThomas Huth /* Register a boolean property to get/set a single bit in a uint32_t field.
8094fcf5ef2aSThomas Huth  *
8095fcf5ef2aSThomas Huth  * The same property name can be registered multiple times to make it affect
8096fcf5ef2aSThomas Huth  * multiple bits in the same FeatureWord. In that case, the getter will return
8097fcf5ef2aSThomas Huth  * true only if all bits are set.
8098fcf5ef2aSThomas Huth  */
x86_cpu_register_bit_prop(X86CPUClass * xcc,const char * prop_name,FeatureWord w,int bitnr)8099f5730c69SEduardo Habkost static void x86_cpu_register_bit_prop(X86CPUClass *xcc,
8100fcf5ef2aSThomas Huth                                       const char *prop_name,
8101a7b0ffacSEduardo Habkost                                       FeatureWord w,
8102fcf5ef2aSThomas Huth                                       int bitnr)
8103fcf5ef2aSThomas Huth {
8104f5730c69SEduardo Habkost     ObjectClass *oc = OBJECT_CLASS(xcc);
8105fcf5ef2aSThomas Huth     BitProperty *fp;
8106fcf5ef2aSThomas Huth     ObjectProperty *op;
8107ede146c2SPaolo Bonzini     uint64_t mask = (1ULL << bitnr);
8108fcf5ef2aSThomas Huth 
8109f5730c69SEduardo Habkost     op = object_class_property_find(oc, prop_name);
8110fcf5ef2aSThomas Huth     if (op) {
8111fcf5ef2aSThomas Huth         fp = op->opaque;
8112a7b0ffacSEduardo Habkost         assert(fp->w == w);
8113fcf5ef2aSThomas Huth         fp->mask |= mask;
8114fcf5ef2aSThomas Huth     } else {
8115fcf5ef2aSThomas Huth         fp = g_new0(BitProperty, 1);
8116a7b0ffacSEduardo Habkost         fp->w = w;
8117fcf5ef2aSThomas Huth         fp->mask = mask;
8118f5730c69SEduardo Habkost         object_class_property_add(oc, prop_name, "bool",
8119fcf5ef2aSThomas Huth                                   x86_cpu_get_bit_prop,
8120fcf5ef2aSThomas Huth                                   x86_cpu_set_bit_prop,
8121f5730c69SEduardo Habkost                                   NULL, fp);
8122fcf5ef2aSThomas Huth     }
8123fcf5ef2aSThomas Huth }
8124fcf5ef2aSThomas Huth 
x86_cpu_register_feature_bit_props(X86CPUClass * xcc,FeatureWord w,int bitnr)8125f5730c69SEduardo Habkost static void x86_cpu_register_feature_bit_props(X86CPUClass *xcc,
8126fcf5ef2aSThomas Huth                                                FeatureWord w,
8127fcf5ef2aSThomas Huth                                                int bitnr)
8128fcf5ef2aSThomas Huth {
8129fcf5ef2aSThomas Huth     FeatureWordInfo *fi = &feature_word_info[w];
8130fcf5ef2aSThomas Huth     const char *name = fi->feat_names[bitnr];
8131fcf5ef2aSThomas Huth 
8132fcf5ef2aSThomas Huth     if (!name) {
8133fcf5ef2aSThomas Huth         return;
8134fcf5ef2aSThomas Huth     }
8135fcf5ef2aSThomas Huth 
8136fcf5ef2aSThomas Huth     /* Property names should use "-" instead of "_".
8137fcf5ef2aSThomas Huth      * Old names containing underscores are registered as aliases
8138fcf5ef2aSThomas Huth      * using object_property_add_alias()
8139fcf5ef2aSThomas Huth      */
8140fcf5ef2aSThomas Huth     assert(!strchr(name, '_'));
8141fcf5ef2aSThomas Huth     /* aliases don't use "|" delimiters anymore, they are registered
8142fcf5ef2aSThomas Huth      * manually using object_property_add_alias() */
8143fcf5ef2aSThomas Huth     assert(!strchr(name, '|'));
8144f5730c69SEduardo Habkost     x86_cpu_register_bit_prop(xcc, name, w, bitnr);
8145fcf5ef2aSThomas Huth }
8146fcf5ef2aSThomas Huth 
x86_cpu_post_initfn(Object * obj)81474db4385aSClaudio Fontana static void x86_cpu_post_initfn(Object *obj)
81484db4385aSClaudio Fontana {
8149b888c780SPaolo Bonzini     static bool first = true;
8150b888c780SPaolo Bonzini     uint64_t supported_xcr0;
8151b888c780SPaolo Bonzini     int i;
8152b888c780SPaolo Bonzini 
8153b888c780SPaolo Bonzini     if (first) {
8154b888c780SPaolo Bonzini         first = false;
8155b888c780SPaolo Bonzini 
8156b888c780SPaolo Bonzini         supported_xcr0 =
8157b888c780SPaolo Bonzini             ((uint64_t) x86_cpu_get_supported_feature_word(NULL, FEAT_XSAVE_XCR0_HI) << 32) |
8158b888c780SPaolo Bonzini             x86_cpu_get_supported_feature_word(NULL, FEAT_XSAVE_XCR0_LO);
8159b888c780SPaolo Bonzini 
8160b888c780SPaolo Bonzini         for (i = XSTATE_SSE_BIT + 1; i < XSAVE_STATE_AREA_COUNT; i++) {
8161b888c780SPaolo Bonzini             ExtSaveArea *esa = &x86_ext_save_areas[i];
8162b888c780SPaolo Bonzini 
8163b888c780SPaolo Bonzini             if (!(supported_xcr0 & (1 << i))) {
8164b888c780SPaolo Bonzini                 esa->size = 0;
8165b888c780SPaolo Bonzini             }
8166b888c780SPaolo Bonzini         }
8167b888c780SPaolo Bonzini     }
8168b888c780SPaolo Bonzini 
81694db4385aSClaudio Fontana     accel_cpu_instance_init(CPU(obj));
81704db4385aSClaudio Fontana }
81714db4385aSClaudio Fontana 
x86_cpu_init_default_topo(X86CPU * cpu)81726ddeb0ecSZhao Liu static void x86_cpu_init_default_topo(X86CPU *cpu)
81736ddeb0ecSZhao Liu {
81746ddeb0ecSZhao Liu     CPUX86State *env = &cpu->env;
81756ddeb0ecSZhao Liu 
817681c392abSZhao Liu     env->nr_modules = 1;
81776ddeb0ecSZhao Liu     env->nr_dies = 1;
81786ddeb0ecSZhao Liu 
8179e823ebe7SZhao Liu     /* thread, core and socket levels are set by default. */
8180e823ebe7SZhao Liu     set_bit(CPU_TOPOLOGY_LEVEL_THREAD, env->avail_cpu_topo);
8181e823ebe7SZhao Liu     set_bit(CPU_TOPOLOGY_LEVEL_CORE, env->avail_cpu_topo);
8182e823ebe7SZhao Liu     set_bit(CPU_TOPOLOGY_LEVEL_SOCKET, env->avail_cpu_topo);
81836ddeb0ecSZhao Liu }
81846ddeb0ecSZhao Liu 
x86_cpu_initfn(Object * obj)8185fcf5ef2aSThomas Huth static void x86_cpu_initfn(Object *obj)
8186fcf5ef2aSThomas Huth {
8187fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(obj);
8188fcf5ef2aSThomas Huth     X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
8189fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
8190fcf5ef2aSThomas Huth 
81916ddeb0ecSZhao Liu     x86_cpu_init_default_topo(cpu);
8192fcf5ef2aSThomas Huth 
8193fcf5ef2aSThomas Huth     object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo",
8194fcf5ef2aSThomas Huth                         x86_cpu_get_feature_words,
8195d2623129SMarkus Armbruster                         NULL, NULL, (void *)env->features);
8196fcf5ef2aSThomas Huth     object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo",
8197fcf5ef2aSThomas Huth                         x86_cpu_get_feature_words,
8198d2623129SMarkus Armbruster                         NULL, NULL, (void *)cpu->filtered_features);
8199d187e08dSAnton Nefedov 
8200d2623129SMarkus Armbruster     object_property_add_alias(obj, "sse3", obj, "pni");
8201d2623129SMarkus Armbruster     object_property_add_alias(obj, "pclmuldq", obj, "pclmulqdq");
8202d2623129SMarkus Armbruster     object_property_add_alias(obj, "sse4-1", obj, "sse4.1");
8203d2623129SMarkus Armbruster     object_property_add_alias(obj, "sse4-2", obj, "sse4.2");
8204d2623129SMarkus Armbruster     object_property_add_alias(obj, "xd", obj, "nx");
8205d2623129SMarkus Armbruster     object_property_add_alias(obj, "ffxsr", obj, "fxsr-opt");
8206d2623129SMarkus Armbruster     object_property_add_alias(obj, "i64", obj, "lm");
8207fcf5ef2aSThomas Huth 
8208d2623129SMarkus Armbruster     object_property_add_alias(obj, "ds_cpl", obj, "ds-cpl");
8209d2623129SMarkus Armbruster     object_property_add_alias(obj, "tsc_adjust", obj, "tsc-adjust");
8210d2623129SMarkus Armbruster     object_property_add_alias(obj, "fxsr_opt", obj, "fxsr-opt");
8211d2623129SMarkus Armbruster     object_property_add_alias(obj, "lahf_lm", obj, "lahf-lm");
8212d2623129SMarkus Armbruster     object_property_add_alias(obj, "cmp_legacy", obj, "cmp-legacy");
8213d2623129SMarkus Armbruster     object_property_add_alias(obj, "nodeid_msr", obj, "nodeid-msr");
8214d2623129SMarkus Armbruster     object_property_add_alias(obj, "perfctr_core", obj, "perfctr-core");
8215d2623129SMarkus Armbruster     object_property_add_alias(obj, "perfctr_nb", obj, "perfctr-nb");
8216d2623129SMarkus Armbruster     object_property_add_alias(obj, "kvm_nopiodelay", obj, "kvm-nopiodelay");
8217d2623129SMarkus Armbruster     object_property_add_alias(obj, "kvm_mmu", obj, "kvm-mmu");
8218d2623129SMarkus Armbruster     object_property_add_alias(obj, "kvm_asyncpf", obj, "kvm-asyncpf");
8219db5daafaSVitaly Kuznetsov     object_property_add_alias(obj, "kvm_asyncpf_int", obj, "kvm-asyncpf-int");
8220d2623129SMarkus Armbruster     object_property_add_alias(obj, "kvm_steal_time", obj, "kvm-steal-time");
8221d2623129SMarkus Armbruster     object_property_add_alias(obj, "kvm_pv_eoi", obj, "kvm-pv-eoi");
8222d2623129SMarkus Armbruster     object_property_add_alias(obj, "kvm_pv_unhalt", obj, "kvm-pv-unhalt");
8223d2623129SMarkus Armbruster     object_property_add_alias(obj, "kvm_poll_control", obj, "kvm-poll-control");
8224d2623129SMarkus Armbruster     object_property_add_alias(obj, "svm_lock", obj, "svm-lock");
8225d2623129SMarkus Armbruster     object_property_add_alias(obj, "nrip_save", obj, "nrip-save");
8226d2623129SMarkus Armbruster     object_property_add_alias(obj, "tsc_scale", obj, "tsc-scale");
8227d2623129SMarkus Armbruster     object_property_add_alias(obj, "vmcb_clean", obj, "vmcb-clean");
8228d2623129SMarkus Armbruster     object_property_add_alias(obj, "pause_filter", obj, "pause-filter");
8229d2623129SMarkus Armbruster     object_property_add_alias(obj, "sse4_1", obj, "sse4.1");
8230d2623129SMarkus Armbruster     object_property_add_alias(obj, "sse4_2", obj, "sse4.2");
8231fcf5ef2aSThomas Huth 
8232e1f9a8e8SVitaly Kuznetsov     object_property_add_alias(obj, "hv-apicv", obj, "hv-avic");
8233f06d8a18SYang Weijiang     cpu->lbr_fmt = ~PERF_CAP_LBR_FMT;
8234f06d8a18SYang Weijiang     object_property_add_alias(obj, "lbr_fmt", obj, "lbr-fmt");
8235e1f9a8e8SVitaly Kuznetsov 
8236dcafd1efSEduardo Habkost     if (xcc->model) {
823749e2fa85SMarkus Armbruster         x86_cpu_load_model(cpu, xcc->model);
8238fcf5ef2aSThomas Huth     }
82390bacd8b3SEduardo Habkost }
8240fcf5ef2aSThomas Huth 
x86_cpu_get_arch_id(CPUState * cs)8241fcf5ef2aSThomas Huth static int64_t x86_cpu_get_arch_id(CPUState *cs)
8242fcf5ef2aSThomas Huth {
8243fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(cs);
8244fcf5ef2aSThomas Huth 
8245fcf5ef2aSThomas Huth     return cpu->apic_id;
8246fcf5ef2aSThomas Huth }
8247fcf5ef2aSThomas Huth 
82486bc0d6a0SPhilippe Mathieu-Daudé #if !defined(CONFIG_USER_ONLY)
x86_cpu_get_paging_enabled(const CPUState * cs)8249fcf5ef2aSThomas Huth static bool x86_cpu_get_paging_enabled(const CPUState *cs)
8250fcf5ef2aSThomas Huth {
8251fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(cs);
8252fcf5ef2aSThomas Huth 
8253fcf5ef2aSThomas Huth     return cpu->env.cr[0] & CR0_PG_MASK;
8254fcf5ef2aSThomas Huth }
82556bc0d6a0SPhilippe Mathieu-Daudé #endif /* !CONFIG_USER_ONLY */
8256fcf5ef2aSThomas Huth 
x86_cpu_set_pc(CPUState * cs,vaddr value)8257fcf5ef2aSThomas Huth static void x86_cpu_set_pc(CPUState *cs, vaddr value)
8258fcf5ef2aSThomas Huth {
8259fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(cs);
8260fcf5ef2aSThomas Huth 
8261fcf5ef2aSThomas Huth     cpu->env.eip = value;
8262fcf5ef2aSThomas Huth }
8263fcf5ef2aSThomas Huth 
x86_cpu_get_pc(CPUState * cs)8264e4fdf9dfSRichard Henderson static vaddr x86_cpu_get_pc(CPUState *cs)
8265e4fdf9dfSRichard Henderson {
8266e4fdf9dfSRichard Henderson     X86CPU *cpu = X86_CPU(cs);
8267e4fdf9dfSRichard Henderson 
8268e4fdf9dfSRichard Henderson     /* Match cpu_get_tb_cpu_state. */
8269e4fdf9dfSRichard Henderson     return cpu->env.eip + cpu->env.segs[R_CS].base;
8270e4fdf9dfSRichard Henderson }
8271e4fdf9dfSRichard Henderson 
x86_cpu_pending_interrupt(CPUState * cs,int interrupt_request)827292d5f1a4SPaolo Bonzini int x86_cpu_pending_interrupt(CPUState *cs, int interrupt_request)
8273fcf5ef2aSThomas Huth {
8274fcf5ef2aSThomas Huth     X86CPU *cpu = X86_CPU(cs);
8275fcf5ef2aSThomas Huth     CPUX86State *env = &cpu->env;
8276fcf5ef2aSThomas Huth 
827792d5f1a4SPaolo Bonzini #if !defined(CONFIG_USER_ONLY)
827892d5f1a4SPaolo Bonzini     if (interrupt_request & CPU_INTERRUPT_POLL) {
827992d5f1a4SPaolo Bonzini         return CPU_INTERRUPT_POLL;
828092d5f1a4SPaolo Bonzini     }
828192d5f1a4SPaolo Bonzini #endif
828292d5f1a4SPaolo Bonzini     if (interrupt_request & CPU_INTERRUPT_SIPI) {
828392d5f1a4SPaolo Bonzini         return CPU_INTERRUPT_SIPI;
828492d5f1a4SPaolo Bonzini     }
828592d5f1a4SPaolo Bonzini 
828692d5f1a4SPaolo Bonzini     if (env->hflags2 & HF2_GIF_MASK) {
828792d5f1a4SPaolo Bonzini         if ((interrupt_request & CPU_INTERRUPT_SMI) &&
828892d5f1a4SPaolo Bonzini             !(env->hflags & HF_SMM_MASK)) {
828992d5f1a4SPaolo Bonzini             return CPU_INTERRUPT_SMI;
829092d5f1a4SPaolo Bonzini         } else if ((interrupt_request & CPU_INTERRUPT_NMI) &&
829192d5f1a4SPaolo Bonzini                    !(env->hflags2 & HF2_NMI_MASK)) {
829292d5f1a4SPaolo Bonzini             return CPU_INTERRUPT_NMI;
829392d5f1a4SPaolo Bonzini         } else if (interrupt_request & CPU_INTERRUPT_MCE) {
829492d5f1a4SPaolo Bonzini             return CPU_INTERRUPT_MCE;
829592d5f1a4SPaolo Bonzini         } else if ((interrupt_request & CPU_INTERRUPT_HARD) &&
829692d5f1a4SPaolo Bonzini                    (((env->hflags2 & HF2_VINTR_MASK) &&
829792d5f1a4SPaolo Bonzini                      (env->hflags2 & HF2_HIF_MASK)) ||
829892d5f1a4SPaolo Bonzini                     (!(env->hflags2 & HF2_VINTR_MASK) &&
829992d5f1a4SPaolo Bonzini                      (env->eflags & IF_MASK &&
830092d5f1a4SPaolo Bonzini                       !(env->hflags & HF_INHIBIT_IRQ_MASK))))) {
830192d5f1a4SPaolo Bonzini             return CPU_INTERRUPT_HARD;
830292d5f1a4SPaolo Bonzini #if !defined(CONFIG_USER_ONLY)
8303b67e2796SLara Lazier         } else if (env->hflags2 & HF2_VGIF_MASK) {
8304b67e2796SLara Lazier             if((interrupt_request & CPU_INTERRUPT_VIRQ) &&
830592d5f1a4SPaolo Bonzini                    (env->eflags & IF_MASK) &&
830692d5f1a4SPaolo Bonzini                    !(env->hflags & HF_INHIBIT_IRQ_MASK)) {
830792d5f1a4SPaolo Bonzini                         return CPU_INTERRUPT_VIRQ;
8308b67e2796SLara Lazier             }
830992d5f1a4SPaolo Bonzini #endif
831092d5f1a4SPaolo Bonzini         }
831192d5f1a4SPaolo Bonzini     }
831292d5f1a4SPaolo Bonzini 
831392d5f1a4SPaolo Bonzini     return 0;
831492d5f1a4SPaolo Bonzini }
831592d5f1a4SPaolo Bonzini 
x86_cpu_has_work(CPUState * cs)831692d5f1a4SPaolo Bonzini static bool x86_cpu_has_work(CPUState *cs)
831792d5f1a4SPaolo Bonzini {
831892d5f1a4SPaolo Bonzini     return x86_cpu_pending_interrupt(cs, cs->interrupt_request) != 0;
8319fcf5ef2aSThomas Huth }
8320fcf5ef2aSThomas Huth 
x86_mmu_index_pl(CPUX86State * env,unsigned pl)8321fffe424bSRichard Henderson int x86_mmu_index_pl(CPUX86State *env, unsigned pl)
8322ace0c5feSRichard Henderson {
83232cc68629SPaolo Bonzini     int mmu_index_32 = (env->hflags & HF_CS64_MASK) ? 0 : 1;
832490f64153SPaolo Bonzini     int mmu_index_base =
8325fffe424bSRichard Henderson         pl == 3 ? MMU_USER64_IDX :
832690f64153SPaolo Bonzini         !(env->hflags & HF_SMAP_MASK) ? MMU_KNOSMAP64_IDX :
832790f64153SPaolo Bonzini         (env->eflags & AC_MASK) ? MMU_KNOSMAP64_IDX : MMU_KSMAP64_IDX;
8328ace0c5feSRichard Henderson 
832990f64153SPaolo Bonzini     return mmu_index_base + mmu_index_32;
8330ace0c5feSRichard Henderson }
8331ace0c5feSRichard Henderson 
x86_cpu_mmu_index(CPUState * cs,bool ifetch)8332fffe424bSRichard Henderson static int x86_cpu_mmu_index(CPUState *cs, bool ifetch)
8333fffe424bSRichard Henderson {
8334fffe424bSRichard Henderson     CPUX86State *env = cpu_env(cs);
8335fffe424bSRichard Henderson     return x86_mmu_index_pl(env, env->hflags & HF_CPL_MASK);
8336fffe424bSRichard Henderson }
8337fffe424bSRichard Henderson 
x86_mmu_index_kernel_pl(CPUX86State * env,unsigned pl)8338fffe424bSRichard Henderson static int x86_mmu_index_kernel_pl(CPUX86State *env, unsigned pl)
8339fffe424bSRichard Henderson {
8340fffe424bSRichard Henderson     int mmu_index_32 = (env->hflags & HF_LMA_MASK) ? 0 : 1;
8341fffe424bSRichard Henderson     int mmu_index_base =
8342fffe424bSRichard Henderson         !(env->hflags & HF_SMAP_MASK) ? MMU_KNOSMAP64_IDX :
8343fffe424bSRichard Henderson         (pl < 3 && (env->eflags & AC_MASK)
8344fffe424bSRichard Henderson          ? MMU_KNOSMAP64_IDX : MMU_KSMAP64_IDX);
8345fffe424bSRichard Henderson 
8346fffe424bSRichard Henderson     return mmu_index_base + mmu_index_32;
8347fffe424bSRichard Henderson }
8348fffe424bSRichard Henderson 
cpu_mmu_index_kernel(CPUX86State * env)8349fffe424bSRichard Henderson int cpu_mmu_index_kernel(CPUX86State *env)
8350fffe424bSRichard Henderson {
8351fffe424bSRichard Henderson     return x86_mmu_index_kernel_pl(env, env->hflags & HF_CPL_MASK);
8352fffe424bSRichard Henderson }
8353fffe424bSRichard Henderson 
x86_disas_set_info(CPUState * cs,disassemble_info * info)8354f50f3dd5SRichard Henderson static void x86_disas_set_info(CPUState *cs, disassemble_info *info)
8355f50f3dd5SRichard Henderson {
8356f50f3dd5SRichard Henderson     X86CPU *cpu = X86_CPU(cs);
8357f50f3dd5SRichard Henderson     CPUX86State *env = &cpu->env;
8358f50f3dd5SRichard Henderson 
8359f50f3dd5SRichard Henderson     info->mach = (env->hflags & HF_CS64_MASK ? bfd_mach_x86_64
8360f50f3dd5SRichard Henderson                   : env->hflags & HF_CS32_MASK ? bfd_mach_i386_i386
8361f50f3dd5SRichard Henderson                   : bfd_mach_i386_i8086);
8362b666d2a4SRichard Henderson 
8363b666d2a4SRichard Henderson     info->cap_arch = CS_ARCH_X86;
8364b666d2a4SRichard Henderson     info->cap_mode = (env->hflags & HF_CS64_MASK ? CS_MODE_64
8365b666d2a4SRichard Henderson                       : env->hflags & HF_CS32_MASK ? CS_MODE_32
8366b666d2a4SRichard Henderson                       : CS_MODE_16);
836715fa1a0aSRichard Henderson     info->cap_insn_unit = 1;
836815fa1a0aSRichard Henderson     info->cap_insn_split = 8;
8369f50f3dd5SRichard Henderson }
8370f50f3dd5SRichard Henderson 
x86_update_hflags(CPUX86State * env)837135b1b927STao Wu void x86_update_hflags(CPUX86State *env)
837235b1b927STao Wu {
837335b1b927STao Wu    uint32_t hflags;
837435b1b927STao Wu #define HFLAG_COPY_MASK \
837535b1b927STao Wu     ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
837635b1b927STao Wu        HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
837735b1b927STao Wu        HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
837835b1b927STao Wu        HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK)
837935b1b927STao Wu 
838035b1b927STao Wu     hflags = env->hflags & HFLAG_COPY_MASK;
838135b1b927STao Wu     hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
838235b1b927STao Wu     hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
838335b1b927STao Wu     hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
838435b1b927STao Wu                 (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
838535b1b927STao Wu     hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
838635b1b927STao Wu 
838735b1b927STao Wu     if (env->cr[4] & CR4_OSFXSR_MASK) {
838835b1b927STao Wu         hflags |= HF_OSFXSR_MASK;
838935b1b927STao Wu     }
839035b1b927STao Wu 
839135b1b927STao Wu     if (env->efer & MSR_EFER_LMA) {
839235b1b927STao Wu         hflags |= HF_LMA_MASK;
839335b1b927STao Wu     }
839435b1b927STao Wu 
839535b1b927STao Wu     if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
839635b1b927STao Wu         hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
839735b1b927STao Wu     } else {
839835b1b927STao Wu         hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
839935b1b927STao Wu                     (DESC_B_SHIFT - HF_CS32_SHIFT);
840035b1b927STao Wu         hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
840135b1b927STao Wu                     (DESC_B_SHIFT - HF_SS32_SHIFT);
840235b1b927STao Wu         if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) ||
840335b1b927STao Wu             !(hflags & HF_CS32_MASK)) {
840435b1b927STao Wu             hflags |= HF_ADDSEG_MASK;
840535b1b927STao Wu         } else {
840635b1b927STao Wu             hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base |
840735b1b927STao Wu                         env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
840835b1b927STao Wu         }
840935b1b927STao Wu     }
841035b1b927STao Wu     env->hflags = hflags;
841135b1b927STao Wu }
841235b1b927STao Wu 
8413fcf5ef2aSThomas Huth static Property x86_cpu_properties[] = {
8414fcf5ef2aSThomas Huth #ifdef CONFIG_USER_ONLY
8415fcf5ef2aSThomas Huth     /* apic_id = 0 by default for *-user, see commit 9886e834 */
8416fcf5ef2aSThomas Huth     DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, 0),
8417fcf5ef2aSThomas Huth     DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, 0),
8418fcf5ef2aSThomas Huth     DEFINE_PROP_INT32("core-id", X86CPU, core_id, 0),
841958820834SZhao Liu     DEFINE_PROP_INT32("module-id", X86CPU, module_id, 0),
8420176d2cdaSLike Xu     DEFINE_PROP_INT32("die-id", X86CPU, die_id, 0),
8421fcf5ef2aSThomas Huth     DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, 0),
8422fcf5ef2aSThomas Huth #else
8423fcf5ef2aSThomas Huth     DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, UNASSIGNED_APIC_ID),
8424fcf5ef2aSThomas Huth     DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, -1),
8425fcf5ef2aSThomas Huth     DEFINE_PROP_INT32("core-id", X86CPU, core_id, -1),
842658820834SZhao Liu     DEFINE_PROP_INT32("module-id", X86CPU, module_id, -1),
8427176d2cdaSLike Xu     DEFINE_PROP_INT32("die-id", X86CPU, die_id, -1),
8428fcf5ef2aSThomas Huth     DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, -1),
8429fcf5ef2aSThomas Huth #endif
843015f8b142SIgor Mammedov     DEFINE_PROP_INT32("node-id", X86CPU, node_id, CPU_UNSET_NUMA_NODE_ID),
8431fcf5ef2aSThomas Huth     DEFINE_PROP_BOOL("pmu", X86CPU, enable_pmu, false),
8432f06d8a18SYang Weijiang     DEFINE_PROP_UINT64_CHECKMASK("lbr-fmt", X86CPU, lbr_fmt, PERF_CAP_LBR_FMT),
84332d384d7cSVitaly Kuznetsov 
8434915aee93SRoman Kagan     DEFINE_PROP_UINT32("hv-spinlocks", X86CPU, hyperv_spinlock_attempts,
8435f701c082SVitaly Kuznetsov                        HYPERV_SPINLOCK_NEVER_NOTIFY),
84362d384d7cSVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-relaxed", X86CPU, hyperv_features,
84372d384d7cSVitaly Kuznetsov                       HYPERV_FEAT_RELAXED, 0),
84382d384d7cSVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-vapic", X86CPU, hyperv_features,
84392d384d7cSVitaly Kuznetsov                       HYPERV_FEAT_VAPIC, 0),
84402d384d7cSVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-time", X86CPU, hyperv_features,
84412d384d7cSVitaly Kuznetsov                       HYPERV_FEAT_TIME, 0),
84422d384d7cSVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-crash", X86CPU, hyperv_features,
84432d384d7cSVitaly Kuznetsov                       HYPERV_FEAT_CRASH, 0),
84442d384d7cSVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-reset", X86CPU, hyperv_features,
84452d384d7cSVitaly Kuznetsov                       HYPERV_FEAT_RESET, 0),
84462d384d7cSVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-vpindex", X86CPU, hyperv_features,
84472d384d7cSVitaly Kuznetsov                       HYPERV_FEAT_VPINDEX, 0),
84482d384d7cSVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-runtime", X86CPU, hyperv_features,
84492d384d7cSVitaly Kuznetsov                       HYPERV_FEAT_RUNTIME, 0),
84502d384d7cSVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-synic", X86CPU, hyperv_features,
84512d384d7cSVitaly Kuznetsov                       HYPERV_FEAT_SYNIC, 0),
84522d384d7cSVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-stimer", X86CPU, hyperv_features,
84532d384d7cSVitaly Kuznetsov                       HYPERV_FEAT_STIMER, 0),
84542d384d7cSVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-frequencies", X86CPU, hyperv_features,
84552d384d7cSVitaly Kuznetsov                       HYPERV_FEAT_FREQUENCIES, 0),
84562d384d7cSVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-reenlightenment", X86CPU, hyperv_features,
84572d384d7cSVitaly Kuznetsov                       HYPERV_FEAT_REENLIGHTENMENT, 0),
84582d384d7cSVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-tlbflush", X86CPU, hyperv_features,
84592d384d7cSVitaly Kuznetsov                       HYPERV_FEAT_TLBFLUSH, 0),
84602d384d7cSVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-evmcs", X86CPU, hyperv_features,
84612d384d7cSVitaly Kuznetsov                       HYPERV_FEAT_EVMCS, 0),
84622d384d7cSVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-ipi", X86CPU, hyperv_features,
84632d384d7cSVitaly Kuznetsov                       HYPERV_FEAT_IPI, 0),
8464128531d9SVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-stimer-direct", X86CPU, hyperv_features,
8465128531d9SVitaly Kuznetsov                       HYPERV_FEAT_STIMER_DIRECT, 0),
8466e1f9a8e8SVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-avic", X86CPU, hyperv_features,
8467e1f9a8e8SVitaly Kuznetsov                       HYPERV_FEAT_AVIC, 0),
8468869840d2SVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-emsr-bitmap", X86CPU, hyperv_features,
8469869840d2SVitaly Kuznetsov                       HYPERV_FEAT_MSR_BITMAP, 0),
84709411e8b6SVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-xmm-input", X86CPU, hyperv_features,
84719411e8b6SVitaly Kuznetsov                       HYPERV_FEAT_XMM_INPUT, 0),
8472aa6bb5faSVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-tlbflush-ext", X86CPU, hyperv_features,
8473aa6bb5faSVitaly Kuznetsov                       HYPERV_FEAT_TLBFLUSH_EXT, 0),
84743aae0854SVitaly Kuznetsov     DEFINE_PROP_BIT64("hv-tlbflush-direct", X86CPU, hyperv_features,
84753aae0854SVitaly Kuznetsov                       HYPERV_FEAT_TLBFLUSH_DIRECT, 0),
847630d6ff66SVitaly Kuznetsov     DEFINE_PROP_ON_OFF_AUTO("hv-no-nonarch-coresharing", X86CPU,
847730d6ff66SVitaly Kuznetsov                             hyperv_no_nonarch_cs, ON_OFF_AUTO_OFF),
8478bbf3810fSVitaly Kuznetsov #ifdef CONFIG_SYNDBG
847973d24074SJon Doron     DEFINE_PROP_BIT64("hv-syndbg", X86CPU, hyperv_features,
848073d24074SJon Doron                       HYPERV_FEAT_SYNDBG, 0),
8481bbf3810fSVitaly Kuznetsov #endif
8482e48ddcc6SVitaly Kuznetsov     DEFINE_PROP_BOOL("hv-passthrough", X86CPU, hyperv_passthrough, false),
848370367f09SVitaly Kuznetsov     DEFINE_PROP_BOOL("hv-enforce-cpuid", X86CPU, hyperv_enforce_cpuid, false),
84842d384d7cSVitaly Kuznetsov 
8485af7228b8SVitaly Kuznetsov     /* WS2008R2 identify by default */
8486af7228b8SVitaly Kuznetsov     DEFINE_PROP_UINT32("hv-version-id-build", X86CPU, hyperv_ver_id_build,
8487f701ececSVitaly Kuznetsov                        0x3839),
8488af7228b8SVitaly Kuznetsov     DEFINE_PROP_UINT16("hv-version-id-major", X86CPU, hyperv_ver_id_major,
8489f701ececSVitaly Kuznetsov                        0x000A),
8490af7228b8SVitaly Kuznetsov     DEFINE_PROP_UINT16("hv-version-id-minor", X86CPU, hyperv_ver_id_minor,
8491f701ececSVitaly Kuznetsov                        0x0000),
8492af7228b8SVitaly Kuznetsov     DEFINE_PROP_UINT32("hv-version-id-spack", X86CPU, hyperv_ver_id_sp, 0),
8493af7228b8SVitaly Kuznetsov     DEFINE_PROP_UINT8("hv-version-id-sbranch", X86CPU, hyperv_ver_id_sb, 0),
8494af7228b8SVitaly Kuznetsov     DEFINE_PROP_UINT32("hv-version-id-snumber", X86CPU, hyperv_ver_id_sn, 0),
8495af7228b8SVitaly Kuznetsov 
8496fcf5ef2aSThomas Huth     DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true),
8497fcf5ef2aSThomas Huth     DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
8498dac1deaeSEduardo Habkost     DEFINE_PROP_BOOL("x-force-features", X86CPU, force_features, false),
8499fcf5ef2aSThomas Huth     DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true),
8500fcf5ef2aSThomas Huth     DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 0),
8501513ba32dSGerd Hoffmann     DEFINE_PROP_UINT32("guest-phys-bits", X86CPU, guest_phys_bits, -1),
8502fcf5ef2aSThomas Huth     DEFINE_PROP_BOOL("host-phys-bits", X86CPU, host_phys_bits, false),
8503258fe08bSEduardo Habkost     DEFINE_PROP_UINT8("host-phys-bits-limit", X86CPU, host_phys_bits_limit, 0),
8504fcf5ef2aSThomas Huth     DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true),
850580db491dSJing Liu     DEFINE_PROP_UINT32("level-func7", X86CPU, env.cpuid_level_func7,
850680db491dSJing Liu                        UINT32_MAX),
8507fcf5ef2aSThomas Huth     DEFINE_PROP_UINT32("level", X86CPU, env.cpuid_level, UINT32_MAX),
8508fcf5ef2aSThomas Huth     DEFINE_PROP_UINT32("xlevel", X86CPU, env.cpuid_xlevel, UINT32_MAX),
8509fcf5ef2aSThomas Huth     DEFINE_PROP_UINT32("xlevel2", X86CPU, env.cpuid_xlevel2, UINT32_MAX),
8510fcf5ef2aSThomas Huth     DEFINE_PROP_UINT32("min-level", X86CPU, env.cpuid_min_level, 0),
8511fcf5ef2aSThomas Huth     DEFINE_PROP_UINT32("min-xlevel", X86CPU, env.cpuid_min_xlevel, 0),
8512fcf5ef2aSThomas Huth     DEFINE_PROP_UINT32("min-xlevel2", X86CPU, env.cpuid_min_xlevel2, 0),
8513bccfb846STao Su     DEFINE_PROP_UINT8("avx10-version", X86CPU, env.avx10_version, 0),
85144e45aff3SPaolo Bonzini     DEFINE_PROP_UINT64("ucode-rev", X86CPU, ucode_rev, 0),
8515fcf5ef2aSThomas Huth     DEFINE_PROP_BOOL("full-cpuid-auto-level", X86CPU, full_cpuid_auto_level, true),
851608856771SVitaly Kuznetsov     DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor),
8517fcf5ef2aSThomas Huth     DEFINE_PROP_BOOL("cpuid-0xb", X86CPU, enable_cpuid_0xb, true),
8518a7a0da84SMichael Roth     DEFINE_PROP_BOOL("x-vendor-cpuid-only", X86CPU, vendor_cpuid_only, true),
851929a51b2bSPaolo Bonzini     DEFINE_PROP_BOOL("x-amd-topoext-features-only", X86CPU, amd_topoext_features_only, true),
8520fcf5ef2aSThomas Huth     DEFINE_PROP_BOOL("lmce", X86CPU, enable_lmce, false),
8521fcf5ef2aSThomas Huth     DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true),
8522988f7b8bSVitaly Kuznetsov     DEFINE_PROP_BOOL("kvm-pv-enforce-cpuid", X86CPU, kvm_pv_enforce_cpuid,
8523988f7b8bSVitaly Kuznetsov                      false),
85240b564e6fSPhil Dennis-Jordan     DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true),
85251ce36bfeSDaniel P. Berrange     DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true),
8526990e0be2SPaolo Bonzini     DEFINE_PROP_BOOL("x-migrate-smi-count", X86CPU, migrate_smi_count,
8527990e0be2SPaolo Bonzini                      true),
8528ab8f992eSBabu Moger     /*
8529a9f27ea9SEduardo Habkost      * lecacy_cache defaults to true unless the CPU model provides its
8530a9f27ea9SEduardo Habkost      * own cache information (see x86_cpu_load_def()).
8531ab8f992eSBabu Moger      */
8532a9f27ea9SEduardo Habkost     DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, true),
8533b776569aSBabu Moger     DEFINE_PROP_BOOL("legacy-multi-node", X86CPU, legacy_multi_node, false),
8534f66b8a83SJoao Martins     DEFINE_PROP_BOOL("xen-vapic", X86CPU, xen_vapic, false),
85356c69dfb6SGonglei 
85366c69dfb6SGonglei     /*
85376c69dfb6SGonglei      * From "Requirements for Implementing the Microsoft
85386c69dfb6SGonglei      * Hypervisor Interface":
85396c69dfb6SGonglei      * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs
85406c69dfb6SGonglei      *
85416c69dfb6SGonglei      * "Starting with Windows Server 2012 and Windows 8, if
85426c69dfb6SGonglei      * CPUID.40000005.EAX contains a value of -1, Windows assumes that
85436c69dfb6SGonglei      * the hypervisor imposes no specific limit to the number of VPs.
85446c69dfb6SGonglei      * In this case, Windows Server 2012 guest VMs may use more than
85456c69dfb6SGonglei      * 64 VPs, up to the maximum supported number of processors applicable
85466c69dfb6SGonglei      * to the specific Windows version being used."
85476c69dfb6SGonglei      */
85486c69dfb6SGonglei     DEFINE_PROP_INT32("x-hv-max-vps", X86CPU, hv_max_vps, -1),
85499b4cf107SRoman Kagan     DEFINE_PROP_BOOL("x-hv-synic-kvm-only", X86CPU, hyperv_synic_kvm_only,
85509b4cf107SRoman Kagan                      false),
8551f24c3a79SLuwei Kang     DEFINE_PROP_BOOL("x-intel-pt-auto-level", X86CPU, intel_pt_auto_level,
8552f24c3a79SLuwei Kang                      true),
855312f6b828SZhao Liu     DEFINE_PROP_BOOL("x-l1-cache-per-thread", X86CPU, l1_cache_per_core, true),
8554fcf5ef2aSThomas Huth     DEFINE_PROP_END_OF_LIST()
8555fcf5ef2aSThomas Huth };
8556fcf5ef2aSThomas Huth 
85578b80bd28SPhilippe Mathieu-Daudé #ifndef CONFIG_USER_ONLY
85588b80bd28SPhilippe Mathieu-Daudé #include "hw/core/sysemu-cpu-ops.h"
85598b80bd28SPhilippe Mathieu-Daudé 
85608b80bd28SPhilippe Mathieu-Daudé static const struct SysemuCPUOps i386_sysemu_ops = {
85612b60b62eSPhilippe Mathieu-Daudé     .get_memory_mapping = x86_cpu_get_memory_mapping,
85626bc0d6a0SPhilippe Mathieu-Daudé     .get_paging_enabled = x86_cpu_get_paging_enabled,
856308928c6dSPhilippe Mathieu-Daudé     .get_phys_page_attrs_debug = x86_cpu_get_phys_page_attrs_debug,
8564faf39e82SPhilippe Mathieu-Daudé     .asidx_from_attrs = x86_asidx_from_attrs,
856583ec01b6SPhilippe Mathieu-Daudé     .get_crash_info = x86_cpu_get_crash_info,
8566715e3c1aSPhilippe Mathieu-Daudé     .write_elf32_note = x86_cpu_write_elf32_note,
8567715e3c1aSPhilippe Mathieu-Daudé     .write_elf64_note = x86_cpu_write_elf64_note,
8568715e3c1aSPhilippe Mathieu-Daudé     .write_elf32_qemunote = x86_cpu_write_elf32_qemunote,
8569715e3c1aSPhilippe Mathieu-Daudé     .write_elf64_qemunote = x86_cpu_write_elf64_qemunote,
8570feece4d0SPhilippe Mathieu-Daudé     .legacy_vmsd = &vmstate_x86_cpu,
85718b80bd28SPhilippe Mathieu-Daudé };
85728b80bd28SPhilippe Mathieu-Daudé #endif
85738b80bd28SPhilippe Mathieu-Daudé 
x86_cpu_common_class_init(ObjectClass * oc,void * data)8574fcf5ef2aSThomas Huth static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
8575fcf5ef2aSThomas Huth {
8576fcf5ef2aSThomas Huth     X86CPUClass *xcc = X86_CPU_CLASS(oc);
8577fcf5ef2aSThomas Huth     CPUClass *cc = CPU_CLASS(oc);
8578fcf5ef2aSThomas Huth     DeviceClass *dc = DEVICE_CLASS(oc);
8579e86787d3SPeter Maydell     ResettableClass *rc = RESETTABLE_CLASS(oc);
8580f5730c69SEduardo Habkost     FeatureWord w;
8581fcf5ef2aSThomas Huth 
8582bf853881SPhilippe Mathieu-Daudé     device_class_set_parent_realize(dc, x86_cpu_realizefn,
8583bf853881SPhilippe Mathieu-Daudé                                     &xcc->parent_realize);
8584bf853881SPhilippe Mathieu-Daudé     device_class_set_parent_unrealize(dc, x86_cpu_unrealizefn,
8585bf853881SPhilippe Mathieu-Daudé                                       &xcc->parent_unrealize);
85864f67d30bSMarc-André Lureau     device_class_set_props(dc, x86_cpu_properties);
8587fcf5ef2aSThomas Huth 
8588e86787d3SPeter Maydell     resettable_class_set_parent_phases(rc, NULL, x86_cpu_reset_hold, NULL,
8589e86787d3SPeter Maydell                                        &xcc->parent_phases);
8590fcf5ef2aSThomas Huth     cc->reset_dump_flags = CPU_DUMP_FPU | CPU_DUMP_CCOP;
8591fcf5ef2aSThomas Huth 
8592fcf5ef2aSThomas Huth     cc->class_by_name = x86_cpu_class_by_name;
8593fcf5ef2aSThomas Huth     cc->parse_features = x86_cpu_parse_featurestr;
8594fcf5ef2aSThomas Huth     cc->has_work = x86_cpu_has_work;
8595ace0c5feSRichard Henderson     cc->mmu_index = x86_cpu_mmu_index;
8596fcf5ef2aSThomas Huth     cc->dump_state = x86_cpu_dump_state;
8597fcf5ef2aSThomas Huth     cc->set_pc = x86_cpu_set_pc;
8598e4fdf9dfSRichard Henderson     cc->get_pc = x86_cpu_get_pc;
8599fcf5ef2aSThomas Huth     cc->gdb_read_register = x86_cpu_gdb_read_register;
8600fcf5ef2aSThomas Huth     cc->gdb_write_register = x86_cpu_gdb_write_register;
8601fcf5ef2aSThomas Huth     cc->get_arch_id = x86_cpu_get_arch_id;
8602ed69e831SClaudio Fontana 
86035d004421SRichard Henderson #ifndef CONFIG_USER_ONLY
86048b80bd28SPhilippe Mathieu-Daudé     cc->sysemu_ops = &i386_sysemu_ops;
8605ed69e831SClaudio Fontana #endif /* !CONFIG_USER_ONLY */
8606ed69e831SClaudio Fontana 
860700fcd100SAbdallah Bouassida     cc->gdb_arch_name = x86_gdb_arch_name;
860800fcd100SAbdallah Bouassida #ifdef TARGET_X86_64
8609b8158192SAbdallah Bouassida     cc->gdb_core_xml_file = "i386-64bit.xml";
861000fcd100SAbdallah Bouassida #else
8611b8158192SAbdallah Bouassida     cc->gdb_core_xml_file = "i386-32bit.xml";
861200fcd100SAbdallah Bouassida #endif
8613f50f3dd5SRichard Henderson     cc->disas_set_info = x86_disas_set_info;
8614fcf5ef2aSThomas Huth 
8615e90f2a8cSEduardo Habkost     dc->user_creatable = true;
86163e0dceafSEduardo Habkost 
86173e0dceafSEduardo Habkost     object_class_property_add(oc, "family", "int",
86183e0dceafSEduardo Habkost                               x86_cpuid_version_get_family,
86193e0dceafSEduardo Habkost                               x86_cpuid_version_set_family, NULL, NULL);
86203e0dceafSEduardo Habkost     object_class_property_add(oc, "model", "int",
86213e0dceafSEduardo Habkost                               x86_cpuid_version_get_model,
86223e0dceafSEduardo Habkost                               x86_cpuid_version_set_model, NULL, NULL);
86233e0dceafSEduardo Habkost     object_class_property_add(oc, "stepping", "int",
86243e0dceafSEduardo Habkost                               x86_cpuid_version_get_stepping,
86253e0dceafSEduardo Habkost                               x86_cpuid_version_set_stepping, NULL, NULL);
86263e0dceafSEduardo Habkost     object_class_property_add_str(oc, "vendor",
86273e0dceafSEduardo Habkost                                   x86_cpuid_get_vendor,
86283e0dceafSEduardo Habkost                                   x86_cpuid_set_vendor);
86293e0dceafSEduardo Habkost     object_class_property_add_str(oc, "model-id",
86303e0dceafSEduardo Habkost                                   x86_cpuid_get_model_id,
86313e0dceafSEduardo Habkost                                   x86_cpuid_set_model_id);
86323e0dceafSEduardo Habkost     object_class_property_add(oc, "tsc-frequency", "int",
86333e0dceafSEduardo Habkost                               x86_cpuid_get_tsc_freq,
86343e0dceafSEduardo Habkost                               x86_cpuid_set_tsc_freq, NULL, NULL);
86353e0dceafSEduardo Habkost     /*
86363e0dceafSEduardo Habkost      * The "unavailable-features" property has the same semantics as
86373e0dceafSEduardo Habkost      * CpuDefinitionInfo.unavailable-features on the "query-cpu-definitions"
86383e0dceafSEduardo Habkost      * QMP command: they list the features that would have prevented the
86393e0dceafSEduardo Habkost      * CPU from running if the "enforce" flag was set.
86403e0dceafSEduardo Habkost      */
86413e0dceafSEduardo Habkost     object_class_property_add(oc, "unavailable-features", "strList",
86423e0dceafSEduardo Habkost                               x86_cpu_get_unavailable_features,
86433e0dceafSEduardo Habkost                               NULL, NULL, NULL);
86443e0dceafSEduardo Habkost 
86453e0dceafSEduardo Habkost #if !defined(CONFIG_USER_ONLY)
86463e0dceafSEduardo Habkost     object_class_property_add(oc, "crash-information", "GuestPanicInformation",
86473e0dceafSEduardo Habkost                               x86_cpu_get_crash_info_qom, NULL, NULL, NULL);
86483e0dceafSEduardo Habkost #endif
86493e0dceafSEduardo Habkost 
8650f5730c69SEduardo Habkost     for (w = 0; w < FEATURE_WORDS; w++) {
8651f5730c69SEduardo Habkost         int bitnr;
8652f5730c69SEduardo Habkost         for (bitnr = 0; bitnr < 64; bitnr++) {
8653f5730c69SEduardo Habkost             x86_cpu_register_feature_bit_props(xcc, w, bitnr);
8654f5730c69SEduardo Habkost         }
8655f5730c69SEduardo Habkost     }
8656fcf5ef2aSThomas Huth }
8657fcf5ef2aSThomas Huth 
8658fcf5ef2aSThomas Huth static const TypeInfo x86_cpu_type_info = {
8659fcf5ef2aSThomas Huth     .name = TYPE_X86_CPU,
8660fcf5ef2aSThomas Huth     .parent = TYPE_CPU,
8661fcf5ef2aSThomas Huth     .instance_size = sizeof(X86CPU),
8662f669c992SRichard Henderson     .instance_align = __alignof(X86CPU),
8663fcf5ef2aSThomas Huth     .instance_init = x86_cpu_initfn,
86644db4385aSClaudio Fontana     .instance_post_init = x86_cpu_post_initfn,
86654db4385aSClaudio Fontana 
8666fcf5ef2aSThomas Huth     .abstract = true,
8667fcf5ef2aSThomas Huth     .class_size = sizeof(X86CPUClass),
8668fcf5ef2aSThomas Huth     .class_init = x86_cpu_common_class_init,
8669fcf5ef2aSThomas Huth };
8670fcf5ef2aSThomas Huth 
86715adbed30SEduardo Habkost /* "base" CPU model, used by query-cpu-model-expansion */
x86_cpu_base_class_init(ObjectClass * oc,void * data)86725adbed30SEduardo Habkost static void x86_cpu_base_class_init(ObjectClass *oc, void *data)
86735adbed30SEduardo Habkost {
86745adbed30SEduardo Habkost     X86CPUClass *xcc = X86_CPU_CLASS(oc);
86755adbed30SEduardo Habkost 
86765adbed30SEduardo Habkost     xcc->static_model = true;
86775adbed30SEduardo Habkost     xcc->migration_safe = true;
86785adbed30SEduardo Habkost     xcc->model_description = "base CPU model type with no features enabled";
86795adbed30SEduardo Habkost     xcc->ordering = 8;
86805adbed30SEduardo Habkost }
86815adbed30SEduardo Habkost 
86825adbed30SEduardo Habkost static const TypeInfo x86_base_cpu_type_info = {
86835adbed30SEduardo Habkost         .name = X86_CPU_TYPE_NAME("base"),
86845adbed30SEduardo Habkost         .parent = TYPE_X86_CPU,
86855adbed30SEduardo Habkost         .class_init = x86_cpu_base_class_init,
86865adbed30SEduardo Habkost };
86875adbed30SEduardo Habkost 
x86_cpu_register_types(void)8688fcf5ef2aSThomas Huth static void x86_cpu_register_types(void)
8689fcf5ef2aSThomas Huth {
8690fcf5ef2aSThomas Huth     int i;
8691fcf5ef2aSThomas Huth 
8692fcf5ef2aSThomas Huth     type_register_static(&x86_cpu_type_info);
8693fcf5ef2aSThomas Huth     for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) {
8694dcafd1efSEduardo Habkost         x86_register_cpudef_types(&builtin_x86_defs[i]);
8695fcf5ef2aSThomas Huth     }
8696c62f2630SEduardo Habkost     type_register_static(&max_x86_cpu_type_info);
86975adbed30SEduardo Habkost     type_register_static(&x86_base_cpu_type_info);
8698fcf5ef2aSThomas Huth }
8699fcf5ef2aSThomas Huth 
8700fcf5ef2aSThomas Huth type_init(x86_cpu_register_types)
8701