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