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