]> git.proxmox.com Git - mirror_qemu.git/blame - target/i386/cpu.c
i386: improve alignment of CPU model listing
[mirror_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"
f348b6d1 21#include "qemu/cutils.h"
c6dc6f63
AP
22
23#include "cpu.h"
63c91552 24#include "exec/exec-all.h"
9c17d615 25#include "sysemu/kvm.h"
d6dcc558 26#include "sysemu/hvf.h"
8932cfdf 27#include "sysemu/cpus.h"
50a2c6e5 28#include "kvm_i386.h"
6cb8f2a6 29#include "sev_i386.h"
c6dc6f63 30
d49b6836 31#include "qemu/error-report.h"
1de7afc9
PB
32#include "qemu/option.h"
33#include "qemu/config-file.h"
e688df6b 34#include "qapi/error.h"
112ed241
MA
35#include "qapi/qapi-visit-misc.h"
36#include "qapi/qapi-visit-run-state.h"
452fcdbc 37#include "qapi/qmp/qdict.h"
7b1b5d19 38#include "qapi/qmp/qerror.h"
7b1b5d19 39#include "qapi/visitor.h"
f99fd7ca 40#include "qom/qom-qobject.h"
9c17d615 41#include "sysemu/arch_init.h"
71ad61d3 42
1814eab6 43#include "standard-headers/asm-x86/kvm_para.h"
65dee380 44
9c17d615 45#include "sysemu/sysemu.h"
53a89e26 46#include "hw/qdev-properties.h"
5232d00a 47#include "hw/i386/topology.h"
bdeec802 48#ifndef CONFIG_USER_ONLY
2001d0cd 49#include "exec/address-spaces.h"
741da0d3 50#include "hw/hw.h"
0d09e41a 51#include "hw/xen/xen.h"
0d09e41a 52#include "hw/i386/apic_internal.h"
bdeec802
IM
53#endif
54
b666d2a4
RH
55#include "disas/capstone.h"
56
7e3482f8
EH
57/* Helpers for building CPUID[2] descriptors: */
58
59struct CPUID2CacheDescriptorInfo {
60 enum CacheType type;
61 int level;
62 int size;
63 int line_size;
64 int associativity;
65};
5e891bf8 66
7e3482f8
EH
67#define KiB 1024
68#define MiB (1024 * 1024)
5e891bf8 69
7e3482f8
EH
70/*
71 * Known CPUID 2 cache descriptors.
72 * From Intel SDM Volume 2A, CPUID instruction
73 */
74struct CPUID2CacheDescriptorInfo cpuid2_cache_descriptors[] = {
75 [0x06] = { .level = 1, .type = ICACHE, .size = 8 * KiB,
76 .associativity = 4, .line_size = 32, },
77 [0x08] = { .level = 1, .type = ICACHE, .size = 16 * KiB,
78 .associativity = 4, .line_size = 32, },
79 [0x09] = { .level = 1, .type = ICACHE, .size = 32 * KiB,
80 .associativity = 4, .line_size = 64, },
81 [0x0A] = { .level = 1, .type = DCACHE, .size = 8 * KiB,
82 .associativity = 2, .line_size = 32, },
83 [0x0C] = { .level = 1, .type = DCACHE, .size = 16 * KiB,
84 .associativity = 4, .line_size = 32, },
85 [0x0D] = { .level = 1, .type = DCACHE, .size = 16 * KiB,
86 .associativity = 4, .line_size = 64, },
87 [0x0E] = { .level = 1, .type = DCACHE, .size = 24 * KiB,
88 .associativity = 6, .line_size = 64, },
89 [0x1D] = { .level = 2, .type = UNIFIED_CACHE, .size = 128 * KiB,
90 .associativity = 2, .line_size = 64, },
91 [0x21] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
92 .associativity = 8, .line_size = 64, },
93 /* lines per sector is not supported cpuid2_cache_descriptor(),
94 * so descriptors 0x22, 0x23 are not included
95 */
96 [0x24] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
97 .associativity = 16, .line_size = 64, },
98 /* lines per sector is not supported cpuid2_cache_descriptor(),
99 * so descriptors 0x25, 0x20 are not included
100 */
101 [0x2C] = { .level = 1, .type = DCACHE, .size = 32 * KiB,
102 .associativity = 8, .line_size = 64, },
103 [0x30] = { .level = 1, .type = ICACHE, .size = 32 * KiB,
104 .associativity = 8, .line_size = 64, },
105 [0x41] = { .level = 2, .type = UNIFIED_CACHE, .size = 128 * KiB,
106 .associativity = 4, .line_size = 32, },
107 [0x42] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
108 .associativity = 4, .line_size = 32, },
109 [0x43] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
110 .associativity = 4, .line_size = 32, },
111 [0x44] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
112 .associativity = 4, .line_size = 32, },
113 [0x45] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
114 .associativity = 4, .line_size = 32, },
115 [0x46] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
116 .associativity = 4, .line_size = 64, },
117 [0x47] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
118 .associativity = 8, .line_size = 64, },
119 [0x48] = { .level = 2, .type = UNIFIED_CACHE, .size = 3 * MiB,
120 .associativity = 12, .line_size = 64, },
121 /* Descriptor 0x49 depends on CPU family/model, so it is not included */
122 [0x4A] = { .level = 3, .type = UNIFIED_CACHE, .size = 6 * MiB,
123 .associativity = 12, .line_size = 64, },
124 [0x4B] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
125 .associativity = 16, .line_size = 64, },
126 [0x4C] = { .level = 3, .type = UNIFIED_CACHE, .size = 12 * MiB,
127 .associativity = 12, .line_size = 64, },
128 [0x4D] = { .level = 3, .type = UNIFIED_CACHE, .size = 16 * MiB,
129 .associativity = 16, .line_size = 64, },
130 [0x4E] = { .level = 2, .type = UNIFIED_CACHE, .size = 6 * MiB,
131 .associativity = 24, .line_size = 64, },
132 [0x60] = { .level = 1, .type = DCACHE, .size = 16 * KiB,
133 .associativity = 8, .line_size = 64, },
134 [0x66] = { .level = 1, .type = DCACHE, .size = 8 * KiB,
135 .associativity = 4, .line_size = 64, },
136 [0x67] = { .level = 1, .type = DCACHE, .size = 16 * KiB,
137 .associativity = 4, .line_size = 64, },
138 [0x68] = { .level = 1, .type = DCACHE, .size = 32 * KiB,
139 .associativity = 4, .line_size = 64, },
140 [0x78] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
141 .associativity = 4, .line_size = 64, },
142 /* lines per sector is not supported cpuid2_cache_descriptor(),
143 * so descriptors 0x79, 0x7A, 0x7B, 0x7C are not included.
144 */
145 [0x7D] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
146 .associativity = 8, .line_size = 64, },
147 [0x7F] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
148 .associativity = 2, .line_size = 64, },
149 [0x80] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
150 .associativity = 8, .line_size = 64, },
151 [0x82] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB,
152 .associativity = 8, .line_size = 32, },
153 [0x83] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
154 .associativity = 8, .line_size = 32, },
155 [0x84] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
156 .associativity = 8, .line_size = 32, },
157 [0x85] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB,
158 .associativity = 8, .line_size = 32, },
159 [0x86] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB,
160 .associativity = 4, .line_size = 64, },
161 [0x87] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB,
162 .associativity = 8, .line_size = 64, },
163 [0xD0] = { .level = 3, .type = UNIFIED_CACHE, .size = 512 * KiB,
164 .associativity = 4, .line_size = 64, },
165 [0xD1] = { .level = 3, .type = UNIFIED_CACHE, .size = 1 * MiB,
166 .associativity = 4, .line_size = 64, },
167 [0xD2] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
168 .associativity = 4, .line_size = 64, },
169 [0xD6] = { .level = 3, .type = UNIFIED_CACHE, .size = 1 * MiB,
170 .associativity = 8, .line_size = 64, },
171 [0xD7] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
172 .associativity = 8, .line_size = 64, },
173 [0xD8] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
174 .associativity = 8, .line_size = 64, },
175 [0xDC] = { .level = 3, .type = UNIFIED_CACHE, .size = 1.5 * MiB,
176 .associativity = 12, .line_size = 64, },
177 [0xDD] = { .level = 3, .type = UNIFIED_CACHE, .size = 3 * MiB,
178 .associativity = 12, .line_size = 64, },
179 [0xDE] = { .level = 3, .type = UNIFIED_CACHE, .size = 6 * MiB,
180 .associativity = 12, .line_size = 64, },
181 [0xE2] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB,
182 .associativity = 16, .line_size = 64, },
183 [0xE3] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB,
184 .associativity = 16, .line_size = 64, },
185 [0xE4] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB,
186 .associativity = 16, .line_size = 64, },
187 [0xEA] = { .level = 3, .type = UNIFIED_CACHE, .size = 12 * MiB,
188 .associativity = 24, .line_size = 64, },
189 [0xEB] = { .level = 3, .type = UNIFIED_CACHE, .size = 18 * MiB,
190 .associativity = 24, .line_size = 64, },
191 [0xEC] = { .level = 3, .type = UNIFIED_CACHE, .size = 24 * MiB,
192 .associativity = 24, .line_size = 64, },
193};
194
195/*
196 * "CPUID leaf 2 does not report cache descriptor information,
197 * use CPUID leaf 4 to query cache parameters"
198 */
199#define CACHE_DESCRIPTOR_UNAVAILABLE 0xFF
5e891bf8 200
7e3482f8
EH
201/*
202 * Return a CPUID 2 cache descriptor for a given cache.
203 * If no known descriptor is found, return CACHE_DESCRIPTOR_UNAVAILABLE
204 */
205static uint8_t cpuid2_cache_descriptor(CPUCacheInfo *cache)
206{
207 int i;
208
209 assert(cache->size > 0);
210 assert(cache->level > 0);
211 assert(cache->line_size > 0);
212 assert(cache->associativity > 0);
213 for (i = 0; i < ARRAY_SIZE(cpuid2_cache_descriptors); i++) {
214 struct CPUID2CacheDescriptorInfo *d = &cpuid2_cache_descriptors[i];
215 if (d->level == cache->level && d->type == cache->type &&
216 d->size == cache->size && d->line_size == cache->line_size &&
217 d->associativity == cache->associativity) {
218 return i;
219 }
220 }
5e891bf8 221
7e3482f8
EH
222 return CACHE_DESCRIPTOR_UNAVAILABLE;
223}
5e891bf8
EH
224
225/* CPUID Leaf 4 constants: */
226
227/* EAX: */
7e3482f8
EH
228#define CACHE_TYPE_D 1
229#define CACHE_TYPE_I 2
230#define CACHE_TYPE_UNIFIED 3
5e891bf8 231
7e3482f8 232#define CACHE_LEVEL(l) (l << 5)
5e891bf8 233
7e3482f8 234#define CACHE_SELF_INIT_LEVEL (1 << 8)
5e891bf8
EH
235
236/* EDX: */
7e3482f8
EH
237#define CACHE_NO_INVD_SHARING (1 << 0)
238#define CACHE_INCLUSIVE (1 << 1)
239#define CACHE_COMPLEX_IDX (1 << 2)
240
241/* Encode CacheType for CPUID[4].EAX */
242#define CACHE_TYPE(t) (((t) == DCACHE) ? CACHE_TYPE_D : \
243 ((t) == ICACHE) ? CACHE_TYPE_I : \
244 ((t) == UNIFIED_CACHE) ? CACHE_TYPE_UNIFIED : \
245 0 /* Invalid value */)
246
247
248/* Encode cache info for CPUID[4] */
249static void encode_cache_cpuid4(CPUCacheInfo *cache,
250 int num_apic_ids, int num_cores,
251 uint32_t *eax, uint32_t *ebx,
252 uint32_t *ecx, uint32_t *edx)
253{
254 assert(cache->size == cache->line_size * cache->associativity *
255 cache->partitions * cache->sets);
256
257 assert(num_apic_ids > 0);
258 *eax = CACHE_TYPE(cache->type) |
259 CACHE_LEVEL(cache->level) |
260 (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0) |
261 ((num_cores - 1) << 26) |
262 ((num_apic_ids - 1) << 14);
263
264 assert(cache->line_size > 0);
265 assert(cache->partitions > 0);
266 assert(cache->associativity > 0);
267 /* We don't implement fully-associative caches */
268 assert(cache->associativity < cache->sets);
269 *ebx = (cache->line_size - 1) |
270 ((cache->partitions - 1) << 12) |
271 ((cache->associativity - 1) << 22);
272
273 assert(cache->sets > 0);
274 *ecx = cache->sets - 1;
275
276 *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
277 (cache->inclusive ? CACHE_INCLUSIVE : 0) |
278 (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
279}
280
281/* Encode cache info for CPUID[0x80000005].ECX or CPUID[0x80000005].EDX */
282static uint32_t encode_cache_cpuid80000005(CPUCacheInfo *cache)
283{
284 assert(cache->size % 1024 == 0);
285 assert(cache->lines_per_tag > 0);
286 assert(cache->associativity > 0);
287 assert(cache->line_size > 0);
288 return ((cache->size / 1024) << 24) | (cache->associativity << 16) |
289 (cache->lines_per_tag << 8) | (cache->line_size);
290}
5e891bf8
EH
291
292#define ASSOC_FULL 0xFF
293
294/* AMD associativity encoding used on CPUID Leaf 0x80000006: */
295#define AMD_ENC_ASSOC(a) (a <= 1 ? a : \
296 a == 2 ? 0x2 : \
297 a == 4 ? 0x4 : \
298 a == 8 ? 0x6 : \
299 a == 16 ? 0x8 : \
300 a == 32 ? 0xA : \
301 a == 48 ? 0xB : \
302 a == 64 ? 0xC : \
303 a == 96 ? 0xD : \
304 a == 128 ? 0xE : \
305 a == ASSOC_FULL ? 0xF : \
306 0 /* invalid value */)
307
7e3482f8
EH
308/*
309 * Encode cache info for CPUID[0x80000006].ECX and CPUID[0x80000006].EDX
310 * @l3 can be NULL.
311 */
312static void encode_cache_cpuid80000006(CPUCacheInfo *l2,
313 CPUCacheInfo *l3,
314 uint32_t *ecx, uint32_t *edx)
315{
316 assert(l2->size % 1024 == 0);
317 assert(l2->associativity > 0);
318 assert(l2->lines_per_tag > 0);
319 assert(l2->line_size > 0);
320 *ecx = ((l2->size / 1024) << 16) |
321 (AMD_ENC_ASSOC(l2->associativity) << 12) |
322 (l2->lines_per_tag << 8) | (l2->line_size);
323
324 if (l3) {
325 assert(l3->size % (512 * 1024) == 0);
326 assert(l3->associativity > 0);
327 assert(l3->lines_per_tag > 0);
328 assert(l3->line_size > 0);
329 *edx = ((l3->size / (512 * 1024)) << 18) |
330 (AMD_ENC_ASSOC(l3->associativity) << 12) |
331 (l3->lines_per_tag << 8) | (l3->line_size);
332 } else {
333 *edx = 0;
334 }
335}
5e891bf8 336
8f4202fb
BM
337/*
338 * Definitions used for building CPUID Leaf 0x8000001D and 0x8000001E
339 * Please refer to the AMD64 Architecture Programmer’s Manual Volume 3.
340 * Define the constants to build the cpu topology. Right now, TOPOEXT
341 * feature is enabled only on EPYC. So, these constants are based on
342 * EPYC supported configurations. We may need to handle the cases if
343 * these values change in future.
344 */
345/* Maximum core complexes in a node */
346#define MAX_CCX 2
347/* Maximum cores in a core complex */
348#define MAX_CORES_IN_CCX 4
349/* Maximum cores in a node */
350#define MAX_CORES_IN_NODE 8
351/* Maximum nodes in a socket */
352#define MAX_NODES_PER_SOCKET 4
353
354/*
355 * Figure out the number of nodes required to build this config.
356 * Max cores in a node is 8
357 */
358static int nodes_in_socket(int nr_cores)
359{
360 int nodes;
361
362 nodes = DIV_ROUND_UP(nr_cores, MAX_CORES_IN_NODE);
363
364 /* Hardware does not support config with 3 nodes, return 4 in that case */
365 return (nodes == 3) ? 4 : nodes;
366}
367
368/*
369 * Decide the number of cores in a core complex with the given nr_cores using
370 * following set constants MAX_CCX, MAX_CORES_IN_CCX, MAX_CORES_IN_NODE and
371 * MAX_NODES_PER_SOCKET. Maintain symmetry as much as possible
372 * L3 cache is shared across all cores in a core complex. So, this will also
373 * tell us how many cores are sharing the L3 cache.
374 */
375static int cores_in_core_complex(int nr_cores)
376{
377 int nodes;
378
379 /* Check if we can fit all the cores in one core complex */
380 if (nr_cores <= MAX_CORES_IN_CCX) {
381 return nr_cores;
382 }
383 /* Get the number of nodes required to build this config */
384 nodes = nodes_in_socket(nr_cores);
385
386 /*
387 * Divide the cores accros all the core complexes
388 * Return rounded up value
389 */
390 return DIV_ROUND_UP(nr_cores, nodes * MAX_CCX);
391}
392
393/* Encode cache info for CPUID[8000001D] */
394static void encode_cache_cpuid8000001d(CPUCacheInfo *cache, CPUState *cs,
395 uint32_t *eax, uint32_t *ebx,
396 uint32_t *ecx, uint32_t *edx)
397{
398 uint32_t l3_cores;
399 assert(cache->size == cache->line_size * cache->associativity *
400 cache->partitions * cache->sets);
401
402 *eax = CACHE_TYPE(cache->type) | CACHE_LEVEL(cache->level) |
403 (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0);
404
405 /* L3 is shared among multiple cores */
406 if (cache->level == 3) {
407 l3_cores = cores_in_core_complex(cs->nr_cores);
408 *eax |= ((l3_cores * cs->nr_threads) - 1) << 14;
409 } else {
410 *eax |= ((cs->nr_threads - 1) << 14);
411 }
412
413 assert(cache->line_size > 0);
414 assert(cache->partitions > 0);
415 assert(cache->associativity > 0);
416 /* We don't implement fully-associative caches */
417 assert(cache->associativity < cache->sets);
418 *ebx = (cache->line_size - 1) |
419 ((cache->partitions - 1) << 12) |
420 ((cache->associativity - 1) << 22);
421
422 assert(cache->sets > 0);
423 *ecx = cache->sets - 1;
424
425 *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) |
426 (cache->inclusive ? CACHE_INCLUSIVE : 0) |
427 (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0);
428}
429
ed78467a
BM
430/* Data structure to hold the configuration info for a given core index */
431struct core_topology {
432 /* core complex id of the current core index */
433 int ccx_id;
434 /*
435 * Adjusted core index for this core in the topology
436 * This can be 0,1,2,3 with max 4 cores in a core complex
437 */
438 int core_id;
439 /* Node id for this core index */
440 int node_id;
441 /* Number of nodes in this config */
442 int num_nodes;
443};
444
445/*
446 * Build the configuration closely match the EPYC hardware. Using the EPYC
447 * hardware configuration values (MAX_CCX, MAX_CORES_IN_CCX, MAX_CORES_IN_NODE)
448 * right now. This could change in future.
449 * nr_cores : Total number of cores in the config
450 * core_id : Core index of the current CPU
451 * topo : Data structure to hold all the config info for this core index
452 */
453static void build_core_topology(int nr_cores, int core_id,
454 struct core_topology *topo)
455{
456 int nodes, cores_in_ccx;
457
458 /* First get the number of nodes required */
459 nodes = nodes_in_socket(nr_cores);
460
461 cores_in_ccx = cores_in_core_complex(nr_cores);
462
463 topo->node_id = core_id / (cores_in_ccx * MAX_CCX);
464 topo->ccx_id = (core_id % (cores_in_ccx * MAX_CCX)) / cores_in_ccx;
465 topo->core_id = core_id % cores_in_ccx;
466 topo->num_nodes = nodes;
467}
468
469/* Encode cache info for CPUID[8000001E] */
470static void encode_topo_cpuid8000001e(CPUState *cs, X86CPU *cpu,
471 uint32_t *eax, uint32_t *ebx,
472 uint32_t *ecx, uint32_t *edx)
473{
474 struct core_topology topo = {0};
475
476 build_core_topology(cs->nr_cores, cpu->core_id, &topo);
477 *eax = cpu->apic_id;
478 /*
479 * CPUID_Fn8000001E_EBX
480 * 31:16 Reserved
481 * 15:8 Threads per core (The number of threads per core is
482 * Threads per core + 1)
483 * 7:0 Core id (see bit decoding below)
484 * SMT:
485 * 4:3 node id
486 * 2 Core complex id
487 * 1:0 Core id
488 * Non SMT:
489 * 5:4 node id
490 * 3 Core complex id
491 * 1:0 Core id
492 */
493 if (cs->nr_threads - 1) {
494 *ebx = ((cs->nr_threads - 1) << 8) | (topo.node_id << 3) |
495 (topo.ccx_id << 2) | topo.core_id;
496 } else {
497 *ebx = (topo.node_id << 4) | (topo.ccx_id << 3) | topo.core_id;
498 }
499 /*
500 * CPUID_Fn8000001E_ECX
501 * 31:11 Reserved
502 * 10:8 Nodes per processor (Nodes per processor is number of nodes + 1)
503 * 7:0 Node id (see bit decoding below)
504 * 2 Socket id
505 * 1:0 Node id
506 */
507 *ecx = ((topo.num_nodes - 1) << 8) | (cpu->socket_id << 2) | topo.node_id;
508 *edx = 0;
509}
510
ab8f992e
BM
511/*
512 * Definitions of the hardcoded cache entries we expose:
513 * These are legacy cache values. If there is a need to change any
514 * of these values please use builtin_x86_defs
515 */
5e891bf8
EH
516
517/* L1 data cache: */
ab8f992e 518static CPUCacheInfo legacy_l1d_cache = {
7e3482f8
EH
519 .type = DCACHE,
520 .level = 1,
521 .size = 32 * KiB,
522 .self_init = 1,
523 .line_size = 64,
524 .associativity = 8,
525 .sets = 64,
526 .partitions = 1,
527 .no_invd_sharing = true,
528};
529
5e891bf8 530/*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
ab8f992e 531static CPUCacheInfo legacy_l1d_cache_amd = {
7e3482f8
EH
532 .type = DCACHE,
533 .level = 1,
534 .size = 64 * KiB,
535 .self_init = 1,
536 .line_size = 64,
537 .associativity = 2,
538 .sets = 512,
539 .partitions = 1,
540 .lines_per_tag = 1,
541 .no_invd_sharing = true,
542};
5e891bf8
EH
543
544/* L1 instruction cache: */
ab8f992e 545static CPUCacheInfo legacy_l1i_cache = {
7e3482f8
EH
546 .type = ICACHE,
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_l1i_cache_amd = {
7e3482f8
EH
559 .type = ICACHE,
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/* Level 2 unified cache: */
ab8f992e 572static CPUCacheInfo legacy_l2_cache = {
7e3482f8
EH
573 .type = UNIFIED_CACHE,
574 .level = 2,
575 .size = 4 * MiB,
576 .self_init = 1,
577 .line_size = 64,
578 .associativity = 16,
579 .sets = 4096,
580 .partitions = 1,
581 .no_invd_sharing = true,
582};
583
5e891bf8 584/*FIXME: CPUID leaf 2 descriptor is inconsistent with CPUID leaf 4 */
ab8f992e 585static CPUCacheInfo legacy_l2_cache_cpuid2 = {
7e3482f8
EH
586 .type = UNIFIED_CACHE,
587 .level = 2,
588 .size = 2 * MiB,
589 .line_size = 64,
590 .associativity = 8,
591};
592
593
5e891bf8 594/*FIXME: CPUID leaf 0x80000006 is inconsistent with leaves 2 & 4 */
ab8f992e 595static CPUCacheInfo legacy_l2_cache_amd = {
7e3482f8
EH
596 .type = UNIFIED_CACHE,
597 .level = 2,
598 .size = 512 * KiB,
599 .line_size = 64,
600 .lines_per_tag = 1,
601 .associativity = 16,
602 .sets = 512,
603 .partitions = 1,
604};
5e891bf8 605
14c985cf 606/* Level 3 unified cache: */
ab8f992e 607static CPUCacheInfo legacy_l3_cache = {
7e3482f8
EH
608 .type = UNIFIED_CACHE,
609 .level = 3,
610 .size = 16 * MiB,
611 .line_size = 64,
612 .associativity = 16,
613 .sets = 16384,
614 .partitions = 1,
615 .lines_per_tag = 1,
616 .self_init = true,
617 .inclusive = true,
618 .complex_indexing = true,
619};
5e891bf8
EH
620
621/* TLB definitions: */
622
623#define L1_DTLB_2M_ASSOC 1
624#define L1_DTLB_2M_ENTRIES 255
625#define L1_DTLB_4K_ASSOC 1
626#define L1_DTLB_4K_ENTRIES 255
627
628#define L1_ITLB_2M_ASSOC 1
629#define L1_ITLB_2M_ENTRIES 255
630#define L1_ITLB_4K_ASSOC 1
631#define L1_ITLB_4K_ENTRIES 255
632
633#define L2_DTLB_2M_ASSOC 0 /* disabled */
634#define L2_DTLB_2M_ENTRIES 0 /* disabled */
635#define L2_DTLB_4K_ASSOC 4
636#define L2_DTLB_4K_ENTRIES 512
637
638#define L2_ITLB_2M_ASSOC 0 /* disabled */
639#define L2_ITLB_2M_ENTRIES 0 /* disabled */
640#define L2_ITLB_4K_ASSOC 4
641#define L2_ITLB_4K_ENTRIES 512
642
e37a5c7f
CP
643/* CPUID Leaf 0x14 constants: */
644#define INTEL_PT_MAX_SUBLEAF 0x1
645/*
646 * bit[00]: IA32_RTIT_CTL.CR3 filter can be set to 1 and IA32_RTIT_CR3_MATCH
647 * MSR can be accessed;
648 * bit[01]: Support Configurable PSB and Cycle-Accurate Mode;
649 * bit[02]: Support IP Filtering, TraceStop filtering, and preservation
650 * of Intel PT MSRs across warm reset;
651 * bit[03]: Support MTC timing packet and suppression of COFI-based packets;
652 */
653#define INTEL_PT_MINIMAL_EBX 0xf
654/*
655 * bit[00]: Tracing can be enabled with IA32_RTIT_CTL.ToPA = 1 and
656 * IA32_RTIT_OUTPUT_BASE and IA32_RTIT_OUTPUT_MASK_PTRS MSRs can be
657 * accessed;
658 * bit[01]: ToPA tables can hold any number of output entries, up to the
659 * maximum allowed by the MaskOrTableOffset field of
660 * IA32_RTIT_OUTPUT_MASK_PTRS;
661 * bit[02]: Support Single-Range Output scheme;
662 */
663#define INTEL_PT_MINIMAL_ECX 0x7
c078ca96
LK
664/* generated packets which contain IP payloads have LIP values */
665#define INTEL_PT_IP_LIP (1 << 31)
e37a5c7f
CP
666#define INTEL_PT_ADDR_RANGES_NUM 0x2 /* Number of configurable address ranges */
667#define INTEL_PT_ADDR_RANGES_NUM_MASK 0x3
668#define INTEL_PT_MTC_BITMAP (0x0249 << 16) /* Support ART(0,3,6,9) */
669#define INTEL_PT_CYCLE_BITMAP 0x1fff /* Support 0,2^(0~11) */
670#define INTEL_PT_PSB_BITMAP (0x003f << 16) /* Support 2K,4K,8K,16K,32K,64K */
5e891bf8 671
99b88a17
IM
672static void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1,
673 uint32_t vendor2, uint32_t vendor3)
674{
675 int i;
676 for (i = 0; i < 4; i++) {
677 dst[i] = vendor1 >> (8 * i);
678 dst[i + 4] = vendor2 >> (8 * i);
679 dst[i + 8] = vendor3 >> (8 * i);
680 }
681 dst[CPUID_VENDOR_SZ] = '\0';
682}
683
621626ce
EH
684#define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
685#define PENTIUM_FEATURES (I486_FEATURES | CPUID_DE | CPUID_TSC | \
686 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_MMX | CPUID_APIC)
687#define PENTIUM2_FEATURES (PENTIUM_FEATURES | CPUID_PAE | CPUID_SEP | \
688 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
689 CPUID_PSE36 | CPUID_FXSR)
690#define PENTIUM3_FEATURES (PENTIUM2_FEATURES | CPUID_SSE)
691#define PPRO_FEATURES (CPUID_FP87 | CPUID_DE | CPUID_PSE | CPUID_TSC | \
692 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_PGE | CPUID_CMOV | \
693 CPUID_PAT | CPUID_FXSR | CPUID_MMX | CPUID_SSE | CPUID_SSE2 | \
694 CPUID_PAE | CPUID_SEP | CPUID_APIC)
695
696#define TCG_FEATURES (CPUID_FP87 | CPUID_PSE | CPUID_TSC | CPUID_MSR | \
697 CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | CPUID_SEP | \
698 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
699 CPUID_PSE36 | CPUID_CLFLUSH | CPUID_ACPI | CPUID_MMX | \
b6c5a6f0 700 CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS | CPUID_DE)
621626ce
EH
701 /* partly implemented:
702 CPUID_MTRR, CPUID_MCA, CPUID_CLFLUSH (needed for Win64) */
703 /* missing:
704 CPUID_VME, CPUID_DTS, CPUID_SS, CPUID_HT, CPUID_TM, CPUID_PBE */
705#define TCG_EXT_FEATURES (CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | \
706 CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | \
707 CPUID_EXT_SSE41 | CPUID_EXT_SSE42 | CPUID_EXT_POPCNT | \
19dc85db 708 CPUID_EXT_XSAVE | /* CPUID_EXT_OSXSAVE is dynamic */ \
621626ce
EH
709 CPUID_EXT_MOVBE | CPUID_EXT_AES | CPUID_EXT_HYPERVISOR)
710 /* missing:
711 CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_SMX,
712 CPUID_EXT_EST, CPUID_EXT_TM2, CPUID_EXT_CID, CPUID_EXT_FMA,
713 CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_PCID, CPUID_EXT_DCA,
19dc85db
RH
714 CPUID_EXT_X2APIC, CPUID_EXT_TSC_DEADLINE_TIMER, CPUID_EXT_AVX,
715 CPUID_EXT_F16C, CPUID_EXT_RDRAND */
621626ce
EH
716
717#ifdef TARGET_X86_64
718#define TCG_EXT2_X86_64_FEATURES (CPUID_EXT2_SYSCALL | CPUID_EXT2_LM)
719#else
720#define TCG_EXT2_X86_64_FEATURES 0
721#endif
722
723#define TCG_EXT2_FEATURES ((TCG_FEATURES & CPUID_EXT2_AMD_ALIASES) | \
724 CPUID_EXT2_NX | CPUID_EXT2_MMXEXT | CPUID_EXT2_RDTSCP | \
725 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_PDPE1GB | \
726 TCG_EXT2_X86_64_FEATURES)
727#define TCG_EXT3_FEATURES (CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | \
728 CPUID_EXT3_CR8LEG | CPUID_EXT3_ABM | CPUID_EXT3_SSE4A)
729#define TCG_EXT4_FEATURES 0
730#define TCG_SVM_FEATURES 0
731#define TCG_KVM_FEATURES 0
732#define TCG_7_0_EBX_FEATURES (CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_SMAP | \
0c47242b
XG
733 CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX | \
734 CPUID_7_0_EBX_PCOMMIT | CPUID_7_0_EBX_CLFLUSHOPT | \
7eb24386
PB
735 CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_FSGSBASE | \
736 CPUID_7_0_EBX_ERMS)
621626ce 737 /* missing:
07929f2a 738 CPUID_7_0_EBX_HLE, CPUID_7_0_EBX_AVX2,
7eb24386 739 CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM,
621626ce 740 CPUID_7_0_EBX_RDSEED */
6c7c3c21
KS
741#define TCG_7_0_ECX_FEATURES (CPUID_7_0_ECX_PKU | CPUID_7_0_ECX_OSPKE | \
742 CPUID_7_0_ECX_LA57)
95ea69fb 743#define TCG_7_0_EDX_FEATURES 0
303752a9 744#define TCG_APM_FEATURES 0
28b8e4d0 745#define TCG_6_EAX_FEATURES CPUID_6_EAX_ARAT
c9cfe8f9
RH
746#define TCG_XSAVE_FEATURES (CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XGETBV1)
747 /* missing:
748 CPUID_XSAVE_XSAVEC, CPUID_XSAVE_XSAVES */
621626ce 749
5ef57876 750typedef struct FeatureWordInfo {
2d5312da
EH
751 /* feature flags names are taken from "Intel Processor Identification and
752 * the CPUID Instruction" and AMD's "CPUID Specification".
753 * In cases of disagreement between feature naming conventions,
754 * aliases may be added.
755 */
756 const char *feat_names[32];
04d104b6
EH
757 uint32_t cpuid_eax; /* Input EAX for CPUID */
758 bool cpuid_needs_ecx; /* CPUID instruction uses ECX as input */
759 uint32_t cpuid_ecx; /* Input ECX value for CPUID */
760 int cpuid_reg; /* output register (R_* constant) */
37ce3522 761 uint32_t tcg_features; /* Feature flags supported by TCG */
84f1b92f 762 uint32_t unmigratable_flags; /* Feature flags known to be unmigratable */
6fb2fff7 763 uint32_t migratable_flags; /* Feature flags known to be migratable */
0d914f39
EH
764 /* Features that shouldn't be auto-enabled by "-cpu host" */
765 uint32_t no_autoenable_flags;
5ef57876
EH
766} FeatureWordInfo;
767
768static FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
bffd67b0 769 [FEAT_1_EDX] = {
2d5312da
EH
770 .feat_names = {
771 "fpu", "vme", "de", "pse",
772 "tsc", "msr", "pae", "mce",
773 "cx8", "apic", NULL, "sep",
774 "mtrr", "pge", "mca", "cmov",
775 "pat", "pse36", "pn" /* Intel psn */, "clflush" /* Intel clfsh */,
776 NULL, "ds" /* Intel dts */, "acpi", "mmx",
777 "fxsr", "sse", "sse2", "ss",
778 "ht" /* Intel htt */, "tm", "ia64", "pbe",
779 },
bffd67b0 780 .cpuid_eax = 1, .cpuid_reg = R_EDX,
37ce3522 781 .tcg_features = TCG_FEATURES,
bffd67b0
EH
782 },
783 [FEAT_1_ECX] = {
2d5312da 784 .feat_names = {
16d2fcaa 785 "pni" /* Intel,AMD sse3 */, "pclmulqdq", "dtes64", "monitor",
fc7dfd20 786 "ds-cpl", "vmx", "smx", "est",
2d5312da
EH
787 "tm2", "ssse3", "cid", NULL,
788 "fma", "cx16", "xtpr", "pdcm",
16d2fcaa
EH
789 NULL, "pcid", "dca", "sse4.1",
790 "sse4.2", "x2apic", "movbe", "popcnt",
2d5312da
EH
791 "tsc-deadline", "aes", "xsave", "osxsave",
792 "avx", "f16c", "rdrand", "hypervisor",
793 },
bffd67b0 794 .cpuid_eax = 1, .cpuid_reg = R_ECX,
37ce3522 795 .tcg_features = TCG_EXT_FEATURES,
bffd67b0 796 },
2d5312da
EH
797 /* Feature names that are already defined on feature_name[] but
798 * are set on CPUID[8000_0001].EDX on AMD CPUs don't have their
799 * names on feat_names below. They are copied automatically
800 * to features[FEAT_8000_0001_EDX] if and only if CPU vendor is AMD.
801 */
bffd67b0 802 [FEAT_8000_0001_EDX] = {
2d5312da
EH
803 .feat_names = {
804 NULL /* fpu */, NULL /* vme */, NULL /* de */, NULL /* pse */,
805 NULL /* tsc */, NULL /* msr */, NULL /* pae */, NULL /* mce */,
806 NULL /* cx8 */, NULL /* apic */, NULL, "syscall",
807 NULL /* mtrr */, NULL /* pge */, NULL /* mca */, NULL /* cmov */,
808 NULL /* pat */, NULL /* pse36 */, NULL, NULL /* Linux mp */,
16d2fcaa
EH
809 "nx", NULL, "mmxext", NULL /* mmx */,
810 NULL /* fxsr */, "fxsr-opt", "pdpe1gb", "rdtscp",
811 NULL, "lm", "3dnowext", "3dnow",
2d5312da 812 },
bffd67b0 813 .cpuid_eax = 0x80000001, .cpuid_reg = R_EDX,
37ce3522 814 .tcg_features = TCG_EXT2_FEATURES,
bffd67b0
EH
815 },
816 [FEAT_8000_0001_ECX] = {
2d5312da 817 .feat_names = {
fc7dfd20 818 "lahf-lm", "cmp-legacy", "svm", "extapic",
2d5312da
EH
819 "cr8legacy", "abm", "sse4a", "misalignsse",
820 "3dnowprefetch", "osvw", "ibs", "xop",
821 "skinit", "wdt", NULL, "lwp",
fc7dfd20
EH
822 "fma4", "tce", NULL, "nodeid-msr",
823 NULL, "tbm", "topoext", "perfctr-core",
824 "perfctr-nb", NULL, NULL, NULL,
2d5312da
EH
825 NULL, NULL, NULL, NULL,
826 },
bffd67b0 827 .cpuid_eax = 0x80000001, .cpuid_reg = R_ECX,
37ce3522 828 .tcg_features = TCG_EXT3_FEATURES,
bffd67b0 829 },
89e49c8b 830 [FEAT_C000_0001_EDX] = {
2d5312da
EH
831 .feat_names = {
832 NULL, NULL, "xstore", "xstore-en",
833 NULL, NULL, "xcrypt", "xcrypt-en",
834 "ace2", "ace2-en", "phe", "phe-en",
835 "pmm", "pmm-en", NULL, NULL,
836 NULL, NULL, NULL, NULL,
837 NULL, NULL, NULL, NULL,
838 NULL, NULL, NULL, NULL,
839 NULL, NULL, NULL, NULL,
840 },
89e49c8b 841 .cpuid_eax = 0xC0000001, .cpuid_reg = R_EDX,
37ce3522 842 .tcg_features = TCG_EXT4_FEATURES,
89e49c8b 843 },
bffd67b0 844 [FEAT_KVM] = {
2d5312da 845 .feat_names = {
fc7dfd20
EH
846 "kvmclock", "kvm-nopiodelay", "kvm-mmu", "kvmclock",
847 "kvm-asyncpf", "kvm-steal-time", "kvm-pv-eoi", "kvm-pv-unhalt",
6976af66 848 NULL, "kvm-pv-tlb-flush", NULL, NULL,
2d5312da
EH
849 NULL, NULL, NULL, NULL,
850 NULL, NULL, NULL, NULL,
851 NULL, NULL, NULL, NULL,
852 "kvmclock-stable-bit", NULL, NULL, NULL,
853 NULL, NULL, NULL, NULL,
854 },
bffd67b0 855 .cpuid_eax = KVM_CPUID_FEATURES, .cpuid_reg = R_EAX,
37ce3522 856 .tcg_features = TCG_KVM_FEATURES,
bffd67b0 857 },
be777326
WL
858 [FEAT_KVM_HINTS] = {
859 .feat_names = {
860 "kvm-hint-dedicated", NULL, NULL, NULL,
861 NULL, NULL, NULL, NULL,
862 NULL, NULL, NULL, NULL,
863 NULL, NULL, NULL, NULL,
864 NULL, NULL, NULL, NULL,
865 NULL, NULL, NULL, NULL,
866 NULL, NULL, NULL, NULL,
867 NULL, NULL, NULL, NULL,
868 },
869 .cpuid_eax = KVM_CPUID_FEATURES, .cpuid_reg = R_EDX,
870 .tcg_features = TCG_KVM_FEATURES,
0d914f39
EH
871 /*
872 * KVM hints aren't auto-enabled by -cpu host, they need to be
873 * explicitly enabled in the command-line.
874 */
875 .no_autoenable_flags = ~0U,
be777326 876 },
c35bd19a 877 [FEAT_HYPERV_EAX] = {
2d5312da
EH
878 .feat_names = {
879 NULL /* hv_msr_vp_runtime_access */, NULL /* hv_msr_time_refcount_access */,
880 NULL /* hv_msr_synic_access */, NULL /* hv_msr_stimer_access */,
881 NULL /* hv_msr_apic_access */, NULL /* hv_msr_hypercall_access */,
882 NULL /* hv_vpindex_access */, NULL /* hv_msr_reset_access */,
883 NULL /* hv_msr_stats_access */, NULL /* hv_reftsc_access */,
884 NULL /* hv_msr_idle_access */, NULL /* hv_msr_frequency_access */,
ba6a4fd9
VK
885 NULL /* hv_msr_debug_access */, NULL /* hv_msr_reenlightenment_access */,
886 NULL, NULL,
2d5312da
EH
887 NULL, NULL, NULL, NULL,
888 NULL, NULL, NULL, NULL,
889 NULL, NULL, NULL, NULL,
890 NULL, NULL, NULL, NULL,
891 },
c35bd19a
EY
892 .cpuid_eax = 0x40000003, .cpuid_reg = R_EAX,
893 },
894 [FEAT_HYPERV_EBX] = {
2d5312da
EH
895 .feat_names = {
896 NULL /* hv_create_partitions */, NULL /* hv_access_partition_id */,
897 NULL /* hv_access_memory_pool */, NULL /* hv_adjust_message_buffers */,
898 NULL /* hv_post_messages */, NULL /* hv_signal_events */,
899 NULL /* hv_create_port */, NULL /* hv_connect_port */,
900 NULL /* hv_access_stats */, NULL, NULL, NULL /* hv_debugging */,
901 NULL /* hv_cpu_power_management */, NULL /* hv_configure_profiler */,
902 NULL, NULL,
903 NULL, NULL, NULL, NULL,
904 NULL, NULL, NULL, NULL,
905 NULL, NULL, NULL, NULL,
906 NULL, NULL, NULL, NULL,
907 },
c35bd19a
EY
908 .cpuid_eax = 0x40000003, .cpuid_reg = R_EBX,
909 },
910 [FEAT_HYPERV_EDX] = {
2d5312da
EH
911 .feat_names = {
912 NULL /* hv_mwait */, NULL /* hv_guest_debugging */,
913 NULL /* hv_perf_monitor */, NULL /* hv_cpu_dynamic_part */,
914 NULL /* hv_hypercall_params_xmm */, NULL /* hv_guest_idle_state */,
915 NULL, NULL,
916 NULL, NULL, NULL /* hv_guest_crash_msr */, NULL,
917 NULL, NULL, NULL, NULL,
918 NULL, NULL, NULL, NULL,
919 NULL, NULL, NULL, NULL,
920 NULL, NULL, NULL, NULL,
921 NULL, NULL, NULL, NULL,
922 },
c35bd19a
EY
923 .cpuid_eax = 0x40000003, .cpuid_reg = R_EDX,
924 },
bffd67b0 925 [FEAT_SVM] = {
2d5312da 926 .feat_names = {
fc7dfd20
EH
927 "npt", "lbrv", "svm-lock", "nrip-save",
928 "tsc-scale", "vmcb-clean", "flushbyasid", "decodeassists",
929 NULL, NULL, "pause-filter", NULL,
2d5312da
EH
930 "pfthreshold", NULL, NULL, NULL,
931 NULL, NULL, NULL, NULL,
932 NULL, NULL, NULL, NULL,
933 NULL, NULL, NULL, NULL,
934 NULL, NULL, NULL, NULL,
935 },
bffd67b0 936 .cpuid_eax = 0x8000000A, .cpuid_reg = R_EDX,
37ce3522 937 .tcg_features = TCG_SVM_FEATURES,
bffd67b0
EH
938 },
939 [FEAT_7_0_EBX] = {
2d5312da 940 .feat_names = {
fc7dfd20 941 "fsgsbase", "tsc-adjust", NULL, "bmi1",
2d5312da
EH
942 "hle", "avx2", NULL, "smep",
943 "bmi2", "erms", "invpcid", "rtm",
944 NULL, NULL, "mpx", NULL,
945 "avx512f", "avx512dq", "rdseed", "adx",
946 "smap", "avx512ifma", "pcommit", "clflushopt",
e37a5c7f 947 "clwb", "intel-pt", "avx512pf", "avx512er",
638cbd45 948 "avx512cd", "sha-ni", "avx512bw", "avx512vl",
2d5312da 949 },
04d104b6
EH
950 .cpuid_eax = 7,
951 .cpuid_needs_ecx = true, .cpuid_ecx = 0,
952 .cpuid_reg = R_EBX,
37ce3522 953 .tcg_features = TCG_7_0_EBX_FEATURES,
bffd67b0 954 },
f74eefe0 955 [FEAT_7_0_ECX] = {
2d5312da
EH
956 .feat_names = {
957 NULL, "avx512vbmi", "umip", "pku",
aff9e6e4
YZ
958 "ospke", NULL, "avx512vbmi2", NULL,
959 "gfni", "vaes", "vpclmulqdq", "avx512vnni",
960 "avx512bitalg", NULL, "avx512-vpopcntdq", NULL,
6c7c3c21 961 "la57", NULL, NULL, NULL,
2d5312da 962 NULL, NULL, "rdpid", NULL,
0da0fb06 963 NULL, "cldemote", NULL, NULL,
2d5312da
EH
964 NULL, NULL, NULL, NULL,
965 },
f74eefe0
HH
966 .cpuid_eax = 7,
967 .cpuid_needs_ecx = true, .cpuid_ecx = 0,
968 .cpuid_reg = R_ECX,
969 .tcg_features = TCG_7_0_ECX_FEATURES,
970 },
95ea69fb
LK
971 [FEAT_7_0_EDX] = {
972 .feat_names = {
973 NULL, NULL, "avx512-4vnniw", "avx512-4fmaps",
974 NULL, NULL, NULL, NULL,
975 NULL, NULL, NULL, NULL,
976 NULL, NULL, NULL, NULL,
977 NULL, NULL, NULL, NULL,
978 NULL, NULL, NULL, NULL,
a2381f09 979 NULL, NULL, "spec-ctrl", NULL,
d19d1f96 980 NULL, NULL, NULL, "ssbd",
95ea69fb
LK
981 },
982 .cpuid_eax = 7,
983 .cpuid_needs_ecx = true, .cpuid_ecx = 0,
984 .cpuid_reg = R_EDX,
985 .tcg_features = TCG_7_0_EDX_FEATURES,
986 },
303752a9 987 [FEAT_8000_0007_EDX] = {
2d5312da
EH
988 .feat_names = {
989 NULL, NULL, NULL, NULL,
990 NULL, NULL, NULL, NULL,
991 "invtsc", NULL, NULL, NULL,
992 NULL, NULL, NULL, NULL,
993 NULL, NULL, NULL, NULL,
994 NULL, NULL, NULL, NULL,
995 NULL, NULL, NULL, NULL,
996 NULL, NULL, NULL, NULL,
997 },
303752a9
MT
998 .cpuid_eax = 0x80000007,
999 .cpuid_reg = R_EDX,
1000 .tcg_features = TCG_APM_FEATURES,
1001 .unmigratable_flags = CPUID_APM_INVTSC,
1002 },
1b3420e1
EH
1003 [FEAT_8000_0008_EBX] = {
1004 .feat_names = {
1005 NULL, NULL, NULL, NULL,
1006 NULL, NULL, NULL, NULL,
1007 NULL, NULL, NULL, NULL,
1008 "ibpb", NULL, NULL, NULL,
1009 NULL, NULL, NULL, NULL,
1010 NULL, NULL, NULL, NULL,
403503b1 1011 NULL, "virt-ssbd", NULL, NULL,
1b3420e1
EH
1012 NULL, NULL, NULL, NULL,
1013 },
1014 .cpuid_eax = 0x80000008,
1015 .cpuid_reg = R_EBX,
1016 .tcg_features = 0,
1017 .unmigratable_flags = 0,
1018 },
0bb0b2d2 1019 [FEAT_XSAVE] = {
2d5312da
EH
1020 .feat_names = {
1021 "xsaveopt", "xsavec", "xgetbv1", "xsaves",
1022 NULL, NULL, NULL, NULL,
1023 NULL, NULL, NULL, NULL,
1024 NULL, NULL, NULL, NULL,
1025 NULL, NULL, NULL, NULL,
1026 NULL, NULL, NULL, NULL,
1027 NULL, NULL, NULL, NULL,
1028 NULL, NULL, NULL, NULL,
1029 },
0bb0b2d2
PB
1030 .cpuid_eax = 0xd,
1031 .cpuid_needs_ecx = true, .cpuid_ecx = 1,
1032 .cpuid_reg = R_EAX,
c9cfe8f9 1033 .tcg_features = TCG_XSAVE_FEATURES,
0bb0b2d2 1034 },
28b8e4d0 1035 [FEAT_6_EAX] = {
2d5312da
EH
1036 .feat_names = {
1037 NULL, NULL, "arat", NULL,
1038 NULL, NULL, NULL, NULL,
1039 NULL, NULL, NULL, NULL,
1040 NULL, NULL, NULL, NULL,
1041 NULL, NULL, NULL, NULL,
1042 NULL, NULL, NULL, NULL,
1043 NULL, NULL, NULL, NULL,
1044 NULL, NULL, NULL, NULL,
1045 },
28b8e4d0
JK
1046 .cpuid_eax = 6, .cpuid_reg = R_EAX,
1047 .tcg_features = TCG_6_EAX_FEATURES,
1048 },
96193c22
EH
1049 [FEAT_XSAVE_COMP_LO] = {
1050 .cpuid_eax = 0xD,
1051 .cpuid_needs_ecx = true, .cpuid_ecx = 0,
1052 .cpuid_reg = R_EAX,
1053 .tcg_features = ~0U,
6fb2fff7
EH
1054 .migratable_flags = XSTATE_FP_MASK | XSTATE_SSE_MASK |
1055 XSTATE_YMM_MASK | XSTATE_BNDREGS_MASK | XSTATE_BNDCSR_MASK |
1056 XSTATE_OPMASK_MASK | XSTATE_ZMM_Hi256_MASK | XSTATE_Hi16_ZMM_MASK |
1057 XSTATE_PKRU_MASK,
96193c22
EH
1058 },
1059 [FEAT_XSAVE_COMP_HI] = {
1060 .cpuid_eax = 0xD,
1061 .cpuid_needs_ecx = true, .cpuid_ecx = 0,
1062 .cpuid_reg = R_EDX,
1063 .tcg_features = ~0U,
1064 },
5ef57876
EH
1065};
1066
8e8aba50
EH
1067typedef struct X86RegisterInfo32 {
1068 /* Name of register */
1069 const char *name;
1070 /* QAPI enum value register */
1071 X86CPURegister32 qapi_enum;
1072} X86RegisterInfo32;
1073
1074#define REGISTER(reg) \
5d371f41 1075 [R_##reg] = { .name = #reg, .qapi_enum = X86_CPU_REGISTER32_##reg }
a443bc34 1076static const X86RegisterInfo32 x86_reg_info_32[CPU_NB_REGS32] = {
8e8aba50
EH
1077 REGISTER(EAX),
1078 REGISTER(ECX),
1079 REGISTER(EDX),
1080 REGISTER(EBX),
1081 REGISTER(ESP),
1082 REGISTER(EBP),
1083 REGISTER(ESI),
1084 REGISTER(EDI),
1085};
1086#undef REGISTER
1087
3f32bd21
RH
1088typedef struct ExtSaveArea {
1089 uint32_t feature, bits;
1090 uint32_t offset, size;
1091} ExtSaveArea;
1092
1093static const ExtSaveArea x86_ext_save_areas[] = {
e3c9022b
EH
1094 [XSTATE_FP_BIT] = {
1095 /* x87 FP state component is always enabled if XSAVE is supported */
1096 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
1097 /* x87 state is in the legacy region of the XSAVE area */
1098 .offset = 0,
1099 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1100 },
1101 [XSTATE_SSE_BIT] = {
1102 /* SSE state component is always enabled if XSAVE is supported */
1103 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
1104 /* SSE state is in the legacy region of the XSAVE area */
1105 .offset = 0,
1106 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
1107 },
cfc3b074
PB
1108 [XSTATE_YMM_BIT] =
1109 { .feature = FEAT_1_ECX, .bits = CPUID_EXT_AVX,
ee1b09f6
EH
1110 .offset = offsetof(X86XSaveArea, avx_state),
1111 .size = sizeof(XSaveAVX) },
cfc3b074
PB
1112 [XSTATE_BNDREGS_BIT] =
1113 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
ee1b09f6
EH
1114 .offset = offsetof(X86XSaveArea, bndreg_state),
1115 .size = sizeof(XSaveBNDREG) },
cfc3b074
PB
1116 [XSTATE_BNDCSR_BIT] =
1117 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
ee1b09f6
EH
1118 .offset = offsetof(X86XSaveArea, bndcsr_state),
1119 .size = sizeof(XSaveBNDCSR) },
cfc3b074
PB
1120 [XSTATE_OPMASK_BIT] =
1121 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
ee1b09f6
EH
1122 .offset = offsetof(X86XSaveArea, opmask_state),
1123 .size = sizeof(XSaveOpmask) },
cfc3b074
PB
1124 [XSTATE_ZMM_Hi256_BIT] =
1125 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
ee1b09f6
EH
1126 .offset = offsetof(X86XSaveArea, zmm_hi256_state),
1127 .size = sizeof(XSaveZMM_Hi256) },
cfc3b074
PB
1128 [XSTATE_Hi16_ZMM_BIT] =
1129 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
ee1b09f6
EH
1130 .offset = offsetof(X86XSaveArea, hi16_zmm_state),
1131 .size = sizeof(XSaveHi16_ZMM) },
cfc3b074
PB
1132 [XSTATE_PKRU_BIT] =
1133 { .feature = FEAT_7_0_ECX, .bits = CPUID_7_0_ECX_PKU,
ee1b09f6
EH
1134 .offset = offsetof(X86XSaveArea, pkru_state),
1135 .size = sizeof(XSavePKRU) },
2560f19f 1136};
8e8aba50 1137
1fda6198
EH
1138static uint32_t xsave_area_size(uint64_t mask)
1139{
1140 int i;
e3c9022b 1141 uint64_t ret = 0;
1fda6198 1142
e3c9022b 1143 for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
1fda6198
EH
1144 const ExtSaveArea *esa = &x86_ext_save_areas[i];
1145 if ((mask >> i) & 1) {
1146 ret = MAX(ret, esa->offset + esa->size);
1147 }
1148 }
1149 return ret;
1150}
1151
d6dcc558
SAGDR
1152static inline bool accel_uses_host_cpuid(void)
1153{
1154 return kvm_enabled() || hvf_enabled();
1155}
1156
96193c22
EH
1157static inline uint64_t x86_cpu_xsave_components(X86CPU *cpu)
1158{
1159 return ((uint64_t)cpu->env.features[FEAT_XSAVE_COMP_HI]) << 32 |
1160 cpu->env.features[FEAT_XSAVE_COMP_LO];
1161}
1162
8b4beddc
EH
1163const char *get_register_name_32(unsigned int reg)
1164{
31ccdde2 1165 if (reg >= CPU_NB_REGS32) {
8b4beddc
EH
1166 return NULL;
1167 }
8e8aba50 1168 return x86_reg_info_32[reg].name;
8b4beddc
EH
1169}
1170
84f1b92f
EH
1171/*
1172 * Returns the set of feature flags that are supported and migratable by
1173 * QEMU, for a given FeatureWord.
1174 */
1175static uint32_t x86_cpu_get_migratable_flags(FeatureWord w)
1176{
1177 FeatureWordInfo *wi = &feature_word_info[w];
1178 uint32_t r = 0;
1179 int i;
1180
1181 for (i = 0; i < 32; i++) {
1182 uint32_t f = 1U << i;
6fb2fff7
EH
1183
1184 /* If the feature name is known, it is implicitly considered migratable,
1185 * unless it is explicitly set in unmigratable_flags */
1186 if ((wi->migratable_flags & f) ||
1187 (wi->feat_names[i] && !(wi->unmigratable_flags & f))) {
1188 r |= f;
84f1b92f 1189 }
84f1b92f
EH
1190 }
1191 return r;
1192}
1193
bb44e0d1
JK
1194void host_cpuid(uint32_t function, uint32_t count,
1195 uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
bdde476a 1196{
a1fd24af
AL
1197 uint32_t vec[4];
1198
1199#ifdef __x86_64__
1200 asm volatile("cpuid"
1201 : "=a"(vec[0]), "=b"(vec[1]),
1202 "=c"(vec[2]), "=d"(vec[3])
1203 : "0"(function), "c"(count) : "cc");
c1f41226 1204#elif defined(__i386__)
a1fd24af
AL
1205 asm volatile("pusha \n\t"
1206 "cpuid \n\t"
1207 "mov %%eax, 0(%2) \n\t"
1208 "mov %%ebx, 4(%2) \n\t"
1209 "mov %%ecx, 8(%2) \n\t"
1210 "mov %%edx, 12(%2) \n\t"
1211 "popa"
1212 : : "a"(function), "c"(count), "S"(vec)
1213 : "memory", "cc");
c1f41226
EH
1214#else
1215 abort();
a1fd24af
AL
1216#endif
1217
bdde476a 1218 if (eax)
a1fd24af 1219 *eax = vec[0];
bdde476a 1220 if (ebx)
a1fd24af 1221 *ebx = vec[1];
bdde476a 1222 if (ecx)
a1fd24af 1223 *ecx = vec[2];
bdde476a 1224 if (edx)
a1fd24af 1225 *edx = vec[3];
bdde476a 1226}
c6dc6f63 1227
20271d48
EH
1228void host_vendor_fms(char *vendor, int *family, int *model, int *stepping)
1229{
1230 uint32_t eax, ebx, ecx, edx;
1231
1232 host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx);
1233 x86_cpu_vendor_words2str(vendor, ebx, edx, ecx);
1234
1235 host_cpuid(0x1, 0, &eax, &ebx, &ecx, &edx);
1236 if (family) {
1237 *family = ((eax >> 8) & 0x0F) + ((eax >> 20) & 0xFF);
1238 }
1239 if (model) {
1240 *model = ((eax >> 4) & 0x0F) | ((eax & 0xF0000) >> 12);
1241 }
1242 if (stepping) {
1243 *stepping = eax & 0x0F;
1244 }
1245}
1246
d940ee9b
EH
1247/* CPU class name definitions: */
1248
d940ee9b
EH
1249/* Return type name for a given CPU model name
1250 * Caller is responsible for freeing the returned string.
1251 */
1252static char *x86_cpu_type_name(const char *model_name)
1253{
1254 return g_strdup_printf(X86_CPU_TYPE_NAME("%s"), model_name);
1255}
1256
500050d1
AF
1257static ObjectClass *x86_cpu_class_by_name(const char *cpu_model)
1258{
d940ee9b 1259 ObjectClass *oc;
99193d8f 1260 char *typename = x86_cpu_type_name(cpu_model);
d940ee9b
EH
1261 oc = object_class_by_name(typename);
1262 g_free(typename);
1263 return oc;
500050d1
AF
1264}
1265
104494ea
IM
1266static char *x86_cpu_class_get_model_name(X86CPUClass *cc)
1267{
1268 const char *class_name = object_class_get_name(OBJECT_CLASS(cc));
1269 assert(g_str_has_suffix(class_name, X86_CPU_TYPE_SUFFIX));
1270 return g_strndup(class_name,
1271 strlen(class_name) - strlen(X86_CPU_TYPE_SUFFIX));
1272}
1273
d940ee9b 1274struct X86CPUDefinition {
c6dc6f63
AP
1275 const char *name;
1276 uint32_t level;
90e4b0c3 1277 uint32_t xlevel;
99b88a17
IM
1278 /* vendor is zero-terminated, 12 character ASCII string */
1279 char vendor[CPUID_VENDOR_SZ + 1];
c6dc6f63
AP
1280 int family;
1281 int model;
1282 int stepping;
0514ef2f 1283 FeatureWordArray features;
807e9869 1284 const char *model_id;
6aaeb054 1285 CPUCaches *cache_info;
d940ee9b 1286};
c6dc6f63 1287
fe52acd2 1288static CPUCaches epyc_cache_info = {
a9f27ea9 1289 .l1d_cache = &(CPUCacheInfo) {
fe52acd2
BM
1290 .type = DCACHE,
1291 .level = 1,
1292 .size = 32 * KiB,
1293 .line_size = 64,
1294 .associativity = 8,
1295 .partitions = 1,
1296 .sets = 64,
1297 .lines_per_tag = 1,
1298 .self_init = 1,
1299 .no_invd_sharing = true,
1300 },
a9f27ea9 1301 .l1i_cache = &(CPUCacheInfo) {
fe52acd2
BM
1302 .type = ICACHE,
1303 .level = 1,
1304 .size = 64 * KiB,
1305 .line_size = 64,
1306 .associativity = 4,
1307 .partitions = 1,
1308 .sets = 256,
1309 .lines_per_tag = 1,
1310 .self_init = 1,
1311 .no_invd_sharing = true,
1312 },
a9f27ea9 1313 .l2_cache = &(CPUCacheInfo) {
fe52acd2
BM
1314 .type = UNIFIED_CACHE,
1315 .level = 2,
1316 .size = 512 * KiB,
1317 .line_size = 64,
1318 .associativity = 8,
1319 .partitions = 1,
1320 .sets = 1024,
1321 .lines_per_tag = 1,
1322 },
a9f27ea9 1323 .l3_cache = &(CPUCacheInfo) {
fe52acd2
BM
1324 .type = UNIFIED_CACHE,
1325 .level = 3,
1326 .size = 8 * MiB,
1327 .line_size = 64,
1328 .associativity = 16,
1329 .partitions = 1,
1330 .sets = 8192,
1331 .lines_per_tag = 1,
1332 .self_init = true,
1333 .inclusive = true,
1334 .complex_indexing = true,
1335 },
1336};
1337
9576de75 1338static X86CPUDefinition builtin_x86_defs[] = {
c6dc6f63
AP
1339 {
1340 .name = "qemu64",
3046bb5d 1341 .level = 0xd,
99b88a17 1342 .vendor = CPUID_VENDOR_AMD,
c6dc6f63 1343 .family = 6,
f8e6a11a 1344 .model = 6,
c6dc6f63 1345 .stepping = 3,
0514ef2f 1346 .features[FEAT_1_EDX] =
27861ecc 1347 PPRO_FEATURES |
c6dc6f63 1348 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
c6dc6f63 1349 CPUID_PSE36,
0514ef2f 1350 .features[FEAT_1_ECX] =
6aa91e4a 1351 CPUID_EXT_SSE3 | CPUID_EXT_CX16,
0514ef2f 1352 .features[FEAT_8000_0001_EDX] =
c6dc6f63 1353 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
0514ef2f 1354 .features[FEAT_8000_0001_ECX] =
71195672 1355 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM,
c6dc6f63 1356 .xlevel = 0x8000000A,
9cf2cc3d 1357 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
c6dc6f63
AP
1358 },
1359 {
1360 .name = "phenom",
1361 .level = 5,
99b88a17 1362 .vendor = CPUID_VENDOR_AMD,
c6dc6f63
AP
1363 .family = 16,
1364 .model = 2,
1365 .stepping = 3,
b9fc20bc 1366 /* Missing: CPUID_HT */
0514ef2f 1367 .features[FEAT_1_EDX] =
27861ecc 1368 PPRO_FEATURES |
c6dc6f63 1369 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
b9fc20bc 1370 CPUID_PSE36 | CPUID_VME,
0514ef2f 1371 .features[FEAT_1_ECX] =
27861ecc 1372 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_CX16 |
c6dc6f63 1373 CPUID_EXT_POPCNT,
0514ef2f 1374 .features[FEAT_8000_0001_EDX] =
c6dc6f63
AP
1375 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX |
1376 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_MMXEXT |
8560efed 1377 CPUID_EXT2_FFXSR | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP,
c6dc6f63
AP
1378 /* Missing: CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
1379 CPUID_EXT3_CR8LEG,
1380 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
1381 CPUID_EXT3_OSVW, CPUID_EXT3_IBS */
0514ef2f 1382 .features[FEAT_8000_0001_ECX] =
27861ecc 1383 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM |
c6dc6f63 1384 CPUID_EXT3_ABM | CPUID_EXT3_SSE4A,
b9fc20bc 1385 /* Missing: CPUID_SVM_LBRV */
0514ef2f 1386 .features[FEAT_SVM] =
b9fc20bc 1387 CPUID_SVM_NPT,
c6dc6f63
AP
1388 .xlevel = 0x8000001A,
1389 .model_id = "AMD Phenom(tm) 9550 Quad-Core Processor"
1390 },
1391 {
1392 .name = "core2duo",
1393 .level = 10,
99b88a17 1394 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
1395 .family = 6,
1396 .model = 15,
1397 .stepping = 11,
b9fc20bc 1398 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
0514ef2f 1399 .features[FEAT_1_EDX] =
27861ecc 1400 PPRO_FEATURES |
c6dc6f63 1401 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
b9fc20bc
EH
1402 CPUID_PSE36 | CPUID_VME | CPUID_ACPI | CPUID_SS,
1403 /* Missing: CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_EST,
e93abc14 1404 * CPUID_EXT_TM2, CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_VMX */
0514ef2f 1405 .features[FEAT_1_ECX] =
27861ecc 1406 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
e93abc14 1407 CPUID_EXT_CX16,
0514ef2f 1408 .features[FEAT_8000_0001_EDX] =
27861ecc 1409 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
0514ef2f 1410 .features[FEAT_8000_0001_ECX] =
27861ecc 1411 CPUID_EXT3_LAHF_LM,
c6dc6f63
AP
1412 .xlevel = 0x80000008,
1413 .model_id = "Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz",
1414 },
1415 {
1416 .name = "kvm64",
3046bb5d 1417 .level = 0xd,
99b88a17 1418 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
1419 .family = 15,
1420 .model = 6,
1421 .stepping = 1,
b3a4f0b1 1422 /* Missing: CPUID_HT */
0514ef2f 1423 .features[FEAT_1_EDX] =
b3a4f0b1 1424 PPRO_FEATURES | CPUID_VME |
c6dc6f63
AP
1425 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
1426 CPUID_PSE36,
1427 /* Missing: CPUID_EXT_POPCNT, CPUID_EXT_MONITOR */
0514ef2f 1428 .features[FEAT_1_ECX] =
27861ecc 1429 CPUID_EXT_SSE3 | CPUID_EXT_CX16,
c6dc6f63 1430 /* Missing: CPUID_EXT2_PDPE1GB, CPUID_EXT2_RDTSCP */
0514ef2f 1431 .features[FEAT_8000_0001_EDX] =
c6dc6f63
AP
1432 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1433 /* Missing: CPUID_EXT3_LAHF_LM, CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
1434 CPUID_EXT3_CR8LEG, CPUID_EXT3_ABM, CPUID_EXT3_SSE4A,
1435 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
1436 CPUID_EXT3_OSVW, CPUID_EXT3_IBS, CPUID_EXT3_SVM */
0514ef2f 1437 .features[FEAT_8000_0001_ECX] =
27861ecc 1438 0,
c6dc6f63
AP
1439 .xlevel = 0x80000008,
1440 .model_id = "Common KVM processor"
1441 },
c6dc6f63
AP
1442 {
1443 .name = "qemu32",
1444 .level = 4,
99b88a17 1445 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63 1446 .family = 6,
f8e6a11a 1447 .model = 6,
c6dc6f63 1448 .stepping = 3,
0514ef2f 1449 .features[FEAT_1_EDX] =
27861ecc 1450 PPRO_FEATURES,
0514ef2f 1451 .features[FEAT_1_ECX] =
6aa91e4a 1452 CPUID_EXT_SSE3,
58012d66 1453 .xlevel = 0x80000004,
9cf2cc3d 1454 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
c6dc6f63 1455 },
eafaf1e5
AP
1456 {
1457 .name = "kvm32",
1458 .level = 5,
99b88a17 1459 .vendor = CPUID_VENDOR_INTEL,
eafaf1e5
AP
1460 .family = 15,
1461 .model = 6,
1462 .stepping = 1,
0514ef2f 1463 .features[FEAT_1_EDX] =
b3a4f0b1 1464 PPRO_FEATURES | CPUID_VME |
eafaf1e5 1465 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_PSE36,
0514ef2f 1466 .features[FEAT_1_ECX] =
27861ecc 1467 CPUID_EXT_SSE3,
0514ef2f 1468 .features[FEAT_8000_0001_ECX] =
27861ecc 1469 0,
eafaf1e5
AP
1470 .xlevel = 0x80000008,
1471 .model_id = "Common 32-bit KVM processor"
1472 },
c6dc6f63
AP
1473 {
1474 .name = "coreduo",
1475 .level = 10,
99b88a17 1476 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
1477 .family = 6,
1478 .model = 14,
1479 .stepping = 8,
b9fc20bc 1480 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
0514ef2f 1481 .features[FEAT_1_EDX] =
27861ecc 1482 PPRO_FEATURES | CPUID_VME |
b9fc20bc
EH
1483 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_ACPI |
1484 CPUID_SS,
1485 /* Missing: CPUID_EXT_EST, CPUID_EXT_TM2 , CPUID_EXT_XTPR,
e93abc14 1486 * CPUID_EXT_PDCM, CPUID_EXT_VMX */
0514ef2f 1487 .features[FEAT_1_ECX] =
e93abc14 1488 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR,
0514ef2f 1489 .features[FEAT_8000_0001_EDX] =
27861ecc 1490 CPUID_EXT2_NX,
c6dc6f63
AP
1491 .xlevel = 0x80000008,
1492 .model_id = "Genuine Intel(R) CPU T2600 @ 2.16GHz",
1493 },
1494 {
1495 .name = "486",
58012d66 1496 .level = 1,
99b88a17 1497 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63 1498 .family = 4,
b2a856d9 1499 .model = 8,
c6dc6f63 1500 .stepping = 0,
0514ef2f 1501 .features[FEAT_1_EDX] =
27861ecc 1502 I486_FEATURES,
c6dc6f63 1503 .xlevel = 0,
807e9869 1504 .model_id = "",
c6dc6f63
AP
1505 },
1506 {
1507 .name = "pentium",
1508 .level = 1,
99b88a17 1509 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
1510 .family = 5,
1511 .model = 4,
1512 .stepping = 3,
0514ef2f 1513 .features[FEAT_1_EDX] =
27861ecc 1514 PENTIUM_FEATURES,
c6dc6f63 1515 .xlevel = 0,
807e9869 1516 .model_id = "",
c6dc6f63
AP
1517 },
1518 {
1519 .name = "pentium2",
1520 .level = 2,
99b88a17 1521 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
1522 .family = 6,
1523 .model = 5,
1524 .stepping = 2,
0514ef2f 1525 .features[FEAT_1_EDX] =
27861ecc 1526 PENTIUM2_FEATURES,
c6dc6f63 1527 .xlevel = 0,
807e9869 1528 .model_id = "",
c6dc6f63
AP
1529 },
1530 {
1531 .name = "pentium3",
3046bb5d 1532 .level = 3,
99b88a17 1533 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
1534 .family = 6,
1535 .model = 7,
1536 .stepping = 3,
0514ef2f 1537 .features[FEAT_1_EDX] =
27861ecc 1538 PENTIUM3_FEATURES,
c6dc6f63 1539 .xlevel = 0,
807e9869 1540 .model_id = "",
c6dc6f63
AP
1541 },
1542 {
1543 .name = "athlon",
1544 .level = 2,
99b88a17 1545 .vendor = CPUID_VENDOR_AMD,
c6dc6f63
AP
1546 .family = 6,
1547 .model = 2,
1548 .stepping = 3,
0514ef2f 1549 .features[FEAT_1_EDX] =
27861ecc 1550 PPRO_FEATURES | CPUID_PSE36 | CPUID_VME | CPUID_MTRR |
60032ac0 1551 CPUID_MCA,
0514ef2f 1552 .features[FEAT_8000_0001_EDX] =
60032ac0 1553 CPUID_EXT2_MMXEXT | CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT,
c6dc6f63 1554 .xlevel = 0x80000008,
9cf2cc3d 1555 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
c6dc6f63
AP
1556 },
1557 {
1558 .name = "n270",
3046bb5d 1559 .level = 10,
99b88a17 1560 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
1561 .family = 6,
1562 .model = 28,
1563 .stepping = 2,
b9fc20bc 1564 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
0514ef2f 1565 .features[FEAT_1_EDX] =
27861ecc 1566 PPRO_FEATURES |
b9fc20bc
EH
1567 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_VME |
1568 CPUID_ACPI | CPUID_SS,
c6dc6f63 1569 /* Some CPUs got no CPUID_SEP */
b9fc20bc
EH
1570 /* Missing: CPUID_EXT_DSCPL, CPUID_EXT_EST, CPUID_EXT_TM2,
1571 * CPUID_EXT_XTPR */
0514ef2f 1572 .features[FEAT_1_ECX] =
27861ecc 1573 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
4458c236 1574 CPUID_EXT_MOVBE,
0514ef2f 1575 .features[FEAT_8000_0001_EDX] =
60032ac0 1576 CPUID_EXT2_NX,
0514ef2f 1577 .features[FEAT_8000_0001_ECX] =
27861ecc 1578 CPUID_EXT3_LAHF_LM,
3046bb5d 1579 .xlevel = 0x80000008,
c6dc6f63
AP
1580 .model_id = "Intel(R) Atom(TM) CPU N270 @ 1.60GHz",
1581 },
3eca4642
EH
1582 {
1583 .name = "Conroe",
3046bb5d 1584 .level = 10,
99b88a17 1585 .vendor = CPUID_VENDOR_INTEL,
3eca4642 1586 .family = 6,
ffce9ebb 1587 .model = 15,
3eca4642 1588 .stepping = 3,
0514ef2f 1589 .features[FEAT_1_EDX] =
b3a4f0b1 1590 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
1591 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1592 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1593 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1594 CPUID_DE | CPUID_FP87,
0514ef2f 1595 .features[FEAT_1_ECX] =
27861ecc 1596 CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
0514ef2f 1597 .features[FEAT_8000_0001_EDX] =
27861ecc 1598 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
0514ef2f 1599 .features[FEAT_8000_0001_ECX] =
27861ecc 1600 CPUID_EXT3_LAHF_LM,
3046bb5d 1601 .xlevel = 0x80000008,
3eca4642
EH
1602 .model_id = "Intel Celeron_4x0 (Conroe/Merom Class Core 2)",
1603 },
1604 {
1605 .name = "Penryn",
3046bb5d 1606 .level = 10,
99b88a17 1607 .vendor = CPUID_VENDOR_INTEL,
3eca4642 1608 .family = 6,
ffce9ebb 1609 .model = 23,
3eca4642 1610 .stepping = 3,
0514ef2f 1611 .features[FEAT_1_EDX] =
b3a4f0b1 1612 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
1613 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1614 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1615 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1616 CPUID_DE | CPUID_FP87,
0514ef2f 1617 .features[FEAT_1_ECX] =
27861ecc 1618 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
b3fb3a20 1619 CPUID_EXT_SSE3,
0514ef2f 1620 .features[FEAT_8000_0001_EDX] =
27861ecc 1621 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
0514ef2f 1622 .features[FEAT_8000_0001_ECX] =
27861ecc 1623 CPUID_EXT3_LAHF_LM,
3046bb5d 1624 .xlevel = 0x80000008,
3eca4642
EH
1625 .model_id = "Intel Core 2 Duo P9xxx (Penryn Class Core 2)",
1626 },
1627 {
1628 .name = "Nehalem",
3046bb5d 1629 .level = 11,
99b88a17 1630 .vendor = CPUID_VENDOR_INTEL,
3eca4642 1631 .family = 6,
ffce9ebb 1632 .model = 26,
3eca4642 1633 .stepping = 3,
0514ef2f 1634 .features[FEAT_1_EDX] =
b3a4f0b1 1635 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
1636 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1637 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1638 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1639 CPUID_DE | CPUID_FP87,
0514ef2f 1640 .features[FEAT_1_ECX] =
27861ecc 1641 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
b3fb3a20 1642 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
0514ef2f 1643 .features[FEAT_8000_0001_EDX] =
27861ecc 1644 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
0514ef2f 1645 .features[FEAT_8000_0001_ECX] =
27861ecc 1646 CPUID_EXT3_LAHF_LM,
3046bb5d 1647 .xlevel = 0x80000008,
3eca4642
EH
1648 .model_id = "Intel Core i7 9xx (Nehalem Class Core i7)",
1649 },
ac96c413
EH
1650 {
1651 .name = "Nehalem-IBRS",
1652 .level = 11,
1653 .vendor = CPUID_VENDOR_INTEL,
1654 .family = 6,
1655 .model = 26,
1656 .stepping = 3,
1657 .features[FEAT_1_EDX] =
1658 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1659 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1660 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1661 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1662 CPUID_DE | CPUID_FP87,
1663 .features[FEAT_1_ECX] =
1664 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
1665 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
1666 .features[FEAT_7_0_EDX] =
1667 CPUID_7_0_EDX_SPEC_CTRL,
1668 .features[FEAT_8000_0001_EDX] =
1669 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1670 .features[FEAT_8000_0001_ECX] =
1671 CPUID_EXT3_LAHF_LM,
1672 .xlevel = 0x80000008,
1673 .model_id = "Intel Core i7 9xx (Nehalem Core i7, IBRS update)",
1674 },
3eca4642
EH
1675 {
1676 .name = "Westmere",
1677 .level = 11,
99b88a17 1678 .vendor = CPUID_VENDOR_INTEL,
3eca4642
EH
1679 .family = 6,
1680 .model = 44,
1681 .stepping = 1,
0514ef2f 1682 .features[FEAT_1_EDX] =
b3a4f0b1 1683 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
1684 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1685 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1686 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1687 CPUID_DE | CPUID_FP87,
0514ef2f 1688 .features[FEAT_1_ECX] =
27861ecc 1689 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
b3fb3a20
EH
1690 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
1691 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
0514ef2f 1692 .features[FEAT_8000_0001_EDX] =
27861ecc 1693 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
0514ef2f 1694 .features[FEAT_8000_0001_ECX] =
27861ecc 1695 CPUID_EXT3_LAHF_LM,
28b8e4d0
JK
1696 .features[FEAT_6_EAX] =
1697 CPUID_6_EAX_ARAT,
3046bb5d 1698 .xlevel = 0x80000008,
3eca4642
EH
1699 .model_id = "Westmere E56xx/L56xx/X56xx (Nehalem-C)",
1700 },
ac96c413
EH
1701 {
1702 .name = "Westmere-IBRS",
1703 .level = 11,
1704 .vendor = CPUID_VENDOR_INTEL,
1705 .family = 6,
1706 .model = 44,
1707 .stepping = 1,
1708 .features[FEAT_1_EDX] =
1709 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1710 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1711 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1712 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1713 CPUID_DE | CPUID_FP87,
1714 .features[FEAT_1_ECX] =
1715 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
1716 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
1717 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
1718 .features[FEAT_8000_0001_EDX] =
1719 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
1720 .features[FEAT_8000_0001_ECX] =
1721 CPUID_EXT3_LAHF_LM,
1722 .features[FEAT_7_0_EDX] =
1723 CPUID_7_0_EDX_SPEC_CTRL,
1724 .features[FEAT_6_EAX] =
1725 CPUID_6_EAX_ARAT,
1726 .xlevel = 0x80000008,
1727 .model_id = "Westmere E56xx/L56xx/X56xx (IBRS update)",
1728 },
3eca4642
EH
1729 {
1730 .name = "SandyBridge",
1731 .level = 0xd,
99b88a17 1732 .vendor = CPUID_VENDOR_INTEL,
3eca4642
EH
1733 .family = 6,
1734 .model = 42,
1735 .stepping = 1,
0514ef2f 1736 .features[FEAT_1_EDX] =
b3a4f0b1 1737 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
1738 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1739 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1740 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1741 CPUID_DE | CPUID_FP87,
0514ef2f 1742 .features[FEAT_1_ECX] =
27861ecc 1743 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
b3fb3a20
EH
1744 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
1745 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
1746 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
1747 CPUID_EXT_SSE3,
0514ef2f 1748 .features[FEAT_8000_0001_EDX] =
27861ecc 1749 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
b3fb3a20 1750 CPUID_EXT2_SYSCALL,
0514ef2f 1751 .features[FEAT_8000_0001_ECX] =
27861ecc 1752 CPUID_EXT3_LAHF_LM,
0bb0b2d2
PB
1753 .features[FEAT_XSAVE] =
1754 CPUID_XSAVE_XSAVEOPT,
28b8e4d0
JK
1755 .features[FEAT_6_EAX] =
1756 CPUID_6_EAX_ARAT,
3046bb5d 1757 .xlevel = 0x80000008,
3eca4642
EH
1758 .model_id = "Intel Xeon E312xx (Sandy Bridge)",
1759 },
ac96c413
EH
1760 {
1761 .name = "SandyBridge-IBRS",
1762 .level = 0xd,
1763 .vendor = CPUID_VENDOR_INTEL,
1764 .family = 6,
1765 .model = 42,
1766 .stepping = 1,
1767 .features[FEAT_1_EDX] =
1768 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1769 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1770 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1771 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1772 CPUID_DE | CPUID_FP87,
1773 .features[FEAT_1_ECX] =
1774 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
1775 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
1776 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
1777 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
1778 CPUID_EXT_SSE3,
1779 .features[FEAT_8000_0001_EDX] =
1780 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
1781 CPUID_EXT2_SYSCALL,
1782 .features[FEAT_8000_0001_ECX] =
1783 CPUID_EXT3_LAHF_LM,
1784 .features[FEAT_7_0_EDX] =
1785 CPUID_7_0_EDX_SPEC_CTRL,
1786 .features[FEAT_XSAVE] =
1787 CPUID_XSAVE_XSAVEOPT,
1788 .features[FEAT_6_EAX] =
1789 CPUID_6_EAX_ARAT,
1790 .xlevel = 0x80000008,
1791 .model_id = "Intel Xeon E312xx (Sandy Bridge, IBRS update)",
1792 },
2f9ac42a
PB
1793 {
1794 .name = "IvyBridge",
1795 .level = 0xd,
1796 .vendor = CPUID_VENDOR_INTEL,
1797 .family = 6,
1798 .model = 58,
1799 .stepping = 9,
1800 .features[FEAT_1_EDX] =
1801 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1802 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1803 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1804 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1805 CPUID_DE | CPUID_FP87,
1806 .features[FEAT_1_ECX] =
1807 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
1808 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
1809 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
1810 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
1811 CPUID_EXT_SSE3 | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
1812 .features[FEAT_7_0_EBX] =
1813 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP |
1814 CPUID_7_0_EBX_ERMS,
1815 .features[FEAT_8000_0001_EDX] =
1816 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
1817 CPUID_EXT2_SYSCALL,
1818 .features[FEAT_8000_0001_ECX] =
1819 CPUID_EXT3_LAHF_LM,
1820 .features[FEAT_XSAVE] =
1821 CPUID_XSAVE_XSAVEOPT,
28b8e4d0
JK
1822 .features[FEAT_6_EAX] =
1823 CPUID_6_EAX_ARAT,
3046bb5d 1824 .xlevel = 0x80000008,
2f9ac42a
PB
1825 .model_id = "Intel Xeon E3-12xx v2 (Ivy Bridge)",
1826 },
ac96c413
EH
1827 {
1828 .name = "IvyBridge-IBRS",
1829 .level = 0xd,
1830 .vendor = CPUID_VENDOR_INTEL,
1831 .family = 6,
1832 .model = 58,
1833 .stepping = 9,
1834 .features[FEAT_1_EDX] =
1835 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1836 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1837 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1838 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1839 CPUID_DE | CPUID_FP87,
1840 .features[FEAT_1_ECX] =
1841 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
1842 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
1843 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
1844 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
1845 CPUID_EXT_SSE3 | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
1846 .features[FEAT_7_0_EBX] =
1847 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP |
1848 CPUID_7_0_EBX_ERMS,
1849 .features[FEAT_8000_0001_EDX] =
1850 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
1851 CPUID_EXT2_SYSCALL,
1852 .features[FEAT_8000_0001_ECX] =
1853 CPUID_EXT3_LAHF_LM,
1854 .features[FEAT_7_0_EDX] =
1855 CPUID_7_0_EDX_SPEC_CTRL,
1856 .features[FEAT_XSAVE] =
1857 CPUID_XSAVE_XSAVEOPT,
1858 .features[FEAT_6_EAX] =
1859 CPUID_6_EAX_ARAT,
1860 .xlevel = 0x80000008,
1861 .model_id = "Intel Xeon E3-12xx v2 (Ivy Bridge, IBRS)",
1862 },
37507094 1863 {
a356850b
EH
1864 .name = "Haswell-noTSX",
1865 .level = 0xd,
1866 .vendor = CPUID_VENDOR_INTEL,
1867 .family = 6,
1868 .model = 60,
1869 .stepping = 1,
1870 .features[FEAT_1_EDX] =
1871 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1872 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1873 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1874 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1875 CPUID_DE | CPUID_FP87,
1876 .features[FEAT_1_ECX] =
1877 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
1878 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
1879 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
1880 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
1881 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
1882 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
1883 .features[FEAT_8000_0001_EDX] =
1884 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
1885 CPUID_EXT2_SYSCALL,
1886 .features[FEAT_8000_0001_ECX] =
becb6667 1887 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
a356850b
EH
1888 .features[FEAT_7_0_EBX] =
1889 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
1890 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
1891 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID,
1892 .features[FEAT_XSAVE] =
1893 CPUID_XSAVE_XSAVEOPT,
28b8e4d0
JK
1894 .features[FEAT_6_EAX] =
1895 CPUID_6_EAX_ARAT,
3046bb5d 1896 .xlevel = 0x80000008,
a356850b 1897 .model_id = "Intel Core Processor (Haswell, no TSX)",
ac96c413
EH
1898 },
1899 {
1900 .name = "Haswell-noTSX-IBRS",
1901 .level = 0xd,
1902 .vendor = CPUID_VENDOR_INTEL,
1903 .family = 6,
1904 .model = 60,
1905 .stepping = 1,
1906 .features[FEAT_1_EDX] =
1907 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1908 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1909 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1910 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1911 CPUID_DE | CPUID_FP87,
1912 .features[FEAT_1_ECX] =
1913 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
1914 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
1915 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
1916 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
1917 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
1918 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
1919 .features[FEAT_8000_0001_EDX] =
1920 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
1921 CPUID_EXT2_SYSCALL,
1922 .features[FEAT_8000_0001_ECX] =
1923 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
1924 .features[FEAT_7_0_EDX] =
1925 CPUID_7_0_EDX_SPEC_CTRL,
1926 .features[FEAT_7_0_EBX] =
1927 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
1928 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
1929 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID,
1930 .features[FEAT_XSAVE] =
1931 CPUID_XSAVE_XSAVEOPT,
1932 .features[FEAT_6_EAX] =
1933 CPUID_6_EAX_ARAT,
1934 .xlevel = 0x80000008,
1935 .model_id = "Intel Core Processor (Haswell, no TSX, IBRS)",
1936 },
1937 {
37507094
EH
1938 .name = "Haswell",
1939 .level = 0xd,
99b88a17 1940 .vendor = CPUID_VENDOR_INTEL,
37507094
EH
1941 .family = 6,
1942 .model = 60,
ec56a4a7 1943 .stepping = 4,
0514ef2f 1944 .features[FEAT_1_EDX] =
b3a4f0b1 1945 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
1946 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1947 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1948 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1949 CPUID_DE | CPUID_FP87,
0514ef2f 1950 .features[FEAT_1_ECX] =
27861ecc 1951 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
b3fb3a20
EH
1952 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
1953 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
1954 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
1955 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
78a611f1 1956 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
0514ef2f 1957 .features[FEAT_8000_0001_EDX] =
27861ecc 1958 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
b3fb3a20 1959 CPUID_EXT2_SYSCALL,
0514ef2f 1960 .features[FEAT_8000_0001_ECX] =
becb6667 1961 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
0514ef2f 1962 .features[FEAT_7_0_EBX] =
27861ecc 1963 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
1ee91598
EH
1964 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
1965 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
1966 CPUID_7_0_EBX_RTM,
0bb0b2d2
PB
1967 .features[FEAT_XSAVE] =
1968 CPUID_XSAVE_XSAVEOPT,
28b8e4d0
JK
1969 .features[FEAT_6_EAX] =
1970 CPUID_6_EAX_ARAT,
3046bb5d 1971 .xlevel = 0x80000008,
37507094
EH
1972 .model_id = "Intel Core Processor (Haswell)",
1973 },
ac96c413
EH
1974 {
1975 .name = "Haswell-IBRS",
1976 .level = 0xd,
1977 .vendor = CPUID_VENDOR_INTEL,
1978 .family = 6,
1979 .model = 60,
1980 .stepping = 4,
1981 .features[FEAT_1_EDX] =
1982 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1983 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1984 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1985 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1986 CPUID_DE | CPUID_FP87,
1987 .features[FEAT_1_ECX] =
1988 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
1989 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
1990 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
1991 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
1992 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
1993 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
1994 .features[FEAT_8000_0001_EDX] =
1995 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
1996 CPUID_EXT2_SYSCALL,
1997 .features[FEAT_8000_0001_ECX] =
1998 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
1999 .features[FEAT_7_0_EDX] =
2000 CPUID_7_0_EDX_SPEC_CTRL,
2001 .features[FEAT_7_0_EBX] =
2002 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2003 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2004 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2005 CPUID_7_0_EBX_RTM,
2006 .features[FEAT_XSAVE] =
2007 CPUID_XSAVE_XSAVEOPT,
2008 .features[FEAT_6_EAX] =
2009 CPUID_6_EAX_ARAT,
2010 .xlevel = 0x80000008,
2011 .model_id = "Intel Core Processor (Haswell, IBRS)",
2012 },
a356850b
EH
2013 {
2014 .name = "Broadwell-noTSX",
2015 .level = 0xd,
2016 .vendor = CPUID_VENDOR_INTEL,
2017 .family = 6,
2018 .model = 61,
2019 .stepping = 2,
2020 .features[FEAT_1_EDX] =
2021 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2022 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2023 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2024 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2025 CPUID_DE | CPUID_FP87,
2026 .features[FEAT_1_ECX] =
2027 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2028 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2029 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2030 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2031 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2032 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2033 .features[FEAT_8000_0001_EDX] =
2034 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2035 CPUID_EXT2_SYSCALL,
2036 .features[FEAT_8000_0001_ECX] =
becb6667 2037 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
a356850b
EH
2038 .features[FEAT_7_0_EBX] =
2039 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2040 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2041 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2042 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2043 CPUID_7_0_EBX_SMAP,
2044 .features[FEAT_XSAVE] =
2045 CPUID_XSAVE_XSAVEOPT,
28b8e4d0
JK
2046 .features[FEAT_6_EAX] =
2047 CPUID_6_EAX_ARAT,
3046bb5d 2048 .xlevel = 0x80000008,
a356850b
EH
2049 .model_id = "Intel Core Processor (Broadwell, no TSX)",
2050 },
ac96c413
EH
2051 {
2052 .name = "Broadwell-noTSX-IBRS",
2053 .level = 0xd,
2054 .vendor = CPUID_VENDOR_INTEL,
2055 .family = 6,
2056 .model = 61,
2057 .stepping = 2,
2058 .features[FEAT_1_EDX] =
2059 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2060 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2061 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2062 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2063 CPUID_DE | CPUID_FP87,
2064 .features[FEAT_1_ECX] =
2065 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2066 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2067 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2068 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2069 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2070 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2071 .features[FEAT_8000_0001_EDX] =
2072 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2073 CPUID_EXT2_SYSCALL,
2074 .features[FEAT_8000_0001_ECX] =
2075 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2076 .features[FEAT_7_0_EDX] =
2077 CPUID_7_0_EDX_SPEC_CTRL,
2078 .features[FEAT_7_0_EBX] =
2079 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2080 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2081 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2082 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2083 CPUID_7_0_EBX_SMAP,
2084 .features[FEAT_XSAVE] =
2085 CPUID_XSAVE_XSAVEOPT,
2086 .features[FEAT_6_EAX] =
2087 CPUID_6_EAX_ARAT,
2088 .xlevel = 0x80000008,
2089 .model_id = "Intel Core Processor (Broadwell, no TSX, IBRS)",
2090 },
ece01354
EH
2091 {
2092 .name = "Broadwell",
2093 .level = 0xd,
2094 .vendor = CPUID_VENDOR_INTEL,
2095 .family = 6,
2096 .model = 61,
2097 .stepping = 2,
2098 .features[FEAT_1_EDX] =
b3a4f0b1 2099 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
ece01354
EH
2100 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2101 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2102 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2103 CPUID_DE | CPUID_FP87,
2104 .features[FEAT_1_ECX] =
2105 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2106 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2107 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2108 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2109 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
78a611f1 2110 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
ece01354
EH
2111 .features[FEAT_8000_0001_EDX] =
2112 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2113 CPUID_EXT2_SYSCALL,
2114 .features[FEAT_8000_0001_ECX] =
becb6667 2115 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
ece01354
EH
2116 .features[FEAT_7_0_EBX] =
2117 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
1ee91598 2118 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
ece01354 2119 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
1ee91598 2120 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
ece01354 2121 CPUID_7_0_EBX_SMAP,
0bb0b2d2
PB
2122 .features[FEAT_XSAVE] =
2123 CPUID_XSAVE_XSAVEOPT,
28b8e4d0
JK
2124 .features[FEAT_6_EAX] =
2125 CPUID_6_EAX_ARAT,
3046bb5d 2126 .xlevel = 0x80000008,
ece01354
EH
2127 .model_id = "Intel Core Processor (Broadwell)",
2128 },
ac96c413
EH
2129 {
2130 .name = "Broadwell-IBRS",
2131 .level = 0xd,
2132 .vendor = CPUID_VENDOR_INTEL,
2133 .family = 6,
2134 .model = 61,
2135 .stepping = 2,
2136 .features[FEAT_1_EDX] =
2137 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2138 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2139 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2140 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2141 CPUID_DE | CPUID_FP87,
2142 .features[FEAT_1_ECX] =
2143 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2144 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2145 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2146 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2147 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2148 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2149 .features[FEAT_8000_0001_EDX] =
2150 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2151 CPUID_EXT2_SYSCALL,
2152 .features[FEAT_8000_0001_ECX] =
2153 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2154 .features[FEAT_7_0_EDX] =
2155 CPUID_7_0_EDX_SPEC_CTRL,
2156 .features[FEAT_7_0_EBX] =
2157 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2158 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2159 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2160 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2161 CPUID_7_0_EBX_SMAP,
2162 .features[FEAT_XSAVE] =
2163 CPUID_XSAVE_XSAVEOPT,
2164 .features[FEAT_6_EAX] =
2165 CPUID_6_EAX_ARAT,
2166 .xlevel = 0x80000008,
2167 .model_id = "Intel Core Processor (Broadwell, IBRS)",
2168 },
f6f949e9
EH
2169 {
2170 .name = "Skylake-Client",
2171 .level = 0xd,
2172 .vendor = CPUID_VENDOR_INTEL,
2173 .family = 6,
2174 .model = 94,
2175 .stepping = 3,
2176 .features[FEAT_1_EDX] =
2177 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2178 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2179 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2180 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2181 CPUID_DE | CPUID_FP87,
2182 .features[FEAT_1_ECX] =
2183 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2184 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2185 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2186 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2187 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2188 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2189 .features[FEAT_8000_0001_EDX] =
2190 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2191 CPUID_EXT2_SYSCALL,
2192 .features[FEAT_8000_0001_ECX] =
2193 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2194 .features[FEAT_7_0_EBX] =
2195 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2196 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2197 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2198 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2199 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_MPX,
2200 /* Missing: XSAVES (not supported by some Linux versions,
cf70879f 2201 * including v4.1 to v4.12).
f6f949e9
EH
2202 * KVM doesn't yet expose any XSAVES state save component,
2203 * and the only one defined in Skylake (processor tracing)
2204 * probably will block migration anyway.
2205 */
2206 .features[FEAT_XSAVE] =
2207 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2208 CPUID_XSAVE_XGETBV1,
2209 .features[FEAT_6_EAX] =
2210 CPUID_6_EAX_ARAT,
2211 .xlevel = 0x80000008,
2212 .model_id = "Intel Core Processor (Skylake)",
2213 },
ac96c413
EH
2214 {
2215 .name = "Skylake-Client-IBRS",
2216 .level = 0xd,
2217 .vendor = CPUID_VENDOR_INTEL,
2218 .family = 6,
2219 .model = 94,
2220 .stepping = 3,
2221 .features[FEAT_1_EDX] =
2222 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2223 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2224 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2225 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2226 CPUID_DE | CPUID_FP87,
2227 .features[FEAT_1_ECX] =
2228 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2229 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2230 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2231 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2232 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2233 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2234 .features[FEAT_8000_0001_EDX] =
2235 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
2236 CPUID_EXT2_SYSCALL,
2237 .features[FEAT_8000_0001_ECX] =
2238 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2239 .features[FEAT_7_0_EDX] =
2240 CPUID_7_0_EDX_SPEC_CTRL,
2241 .features[FEAT_7_0_EBX] =
2242 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2243 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2244 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2245 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2246 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_MPX,
2247 /* Missing: XSAVES (not supported by some Linux versions,
2248 * including v4.1 to v4.12).
2249 * KVM doesn't yet expose any XSAVES state save component,
2250 * and the only one defined in Skylake (processor tracing)
2251 * probably will block migration anyway.
2252 */
2253 .features[FEAT_XSAVE] =
2254 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2255 CPUID_XSAVE_XGETBV1,
2256 .features[FEAT_6_EAX] =
2257 CPUID_6_EAX_ARAT,
2258 .xlevel = 0x80000008,
2259 .model_id = "Intel Core Processor (Skylake, IBRS)",
2260 },
53f9a6f4
BF
2261 {
2262 .name = "Skylake-Server",
2263 .level = 0xd,
2264 .vendor = CPUID_VENDOR_INTEL,
2265 .family = 6,
2266 .model = 85,
2267 .stepping = 4,
2268 .features[FEAT_1_EDX] =
2269 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2270 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2271 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2272 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2273 CPUID_DE | CPUID_FP87,
2274 .features[FEAT_1_ECX] =
2275 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2276 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2277 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2278 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2279 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2280 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2281 .features[FEAT_8000_0001_EDX] =
2282 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
2283 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2284 .features[FEAT_8000_0001_ECX] =
2285 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2286 .features[FEAT_7_0_EBX] =
2287 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2288 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2289 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2290 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2291 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_CLWB |
2292 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
2293 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
c68bcb3a 2294 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT,
53f9a6f4
BF
2295 /* Missing: XSAVES (not supported by some Linux versions,
2296 * including v4.1 to v4.12).
2297 * KVM doesn't yet expose any XSAVES state save component,
2298 * and the only one defined in Skylake (processor tracing)
2299 * probably will block migration anyway.
2300 */
2301 .features[FEAT_XSAVE] =
2302 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2303 CPUID_XSAVE_XGETBV1,
2304 .features[FEAT_6_EAX] =
2305 CPUID_6_EAX_ARAT,
2306 .xlevel = 0x80000008,
2307 .model_id = "Intel Xeon Processor (Skylake)",
2308 },
ac96c413
EH
2309 {
2310 .name = "Skylake-Server-IBRS",
2311 .level = 0xd,
2312 .vendor = CPUID_VENDOR_INTEL,
2313 .family = 6,
2314 .model = 85,
2315 .stepping = 4,
2316 .features[FEAT_1_EDX] =
2317 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
2318 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2319 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2320 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2321 CPUID_DE | CPUID_FP87,
2322 .features[FEAT_1_ECX] =
2323 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2324 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2325 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2326 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2327 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2328 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2329 .features[FEAT_8000_0001_EDX] =
2330 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
2331 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2332 .features[FEAT_8000_0001_ECX] =
2333 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2334 .features[FEAT_7_0_EDX] =
2335 CPUID_7_0_EDX_SPEC_CTRL,
2336 .features[FEAT_7_0_EBX] =
2337 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
2338 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
2339 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
2340 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
2341 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_CLWB |
2342 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ |
2343 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD |
2344 CPUID_7_0_EBX_AVX512VL,
2345 /* Missing: XSAVES (not supported by some Linux versions,
2346 * including v4.1 to v4.12).
2347 * KVM doesn't yet expose any XSAVES state save component,
2348 * and the only one defined in Skylake (processor tracing)
2349 * probably will block migration anyway.
2350 */
2351 .features[FEAT_XSAVE] =
2352 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2353 CPUID_XSAVE_XGETBV1,
2354 .features[FEAT_6_EAX] =
2355 CPUID_6_EAX_ARAT,
2356 .xlevel = 0x80000008,
2357 .model_id = "Intel Xeon Processor (Skylake, IBRS)",
2358 },
a1849515
BF
2359 {
2360 .name = "KnightsMill",
2361 .level = 0xd,
2362 .vendor = CPUID_VENDOR_INTEL,
2363 .family = 6,
2364 .model = 133,
2365 .stepping = 0,
2366 .features[FEAT_1_EDX] =
2367 CPUID_VME | CPUID_SS | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR |
2368 CPUID_MMX | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV |
2369 CPUID_MCA | CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC |
2370 CPUID_CX8 | CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC |
2371 CPUID_PSE | CPUID_DE | CPUID_FP87,
2372 .features[FEAT_1_ECX] =
2373 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
2374 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
2375 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
2376 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
2377 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
2378 CPUID_EXT_F16C | CPUID_EXT_RDRAND,
2379 .features[FEAT_8000_0001_EDX] =
2380 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP |
2381 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
2382 .features[FEAT_8000_0001_ECX] =
2383 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
2384 .features[FEAT_7_0_EBX] =
2385 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
2386 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS |
2387 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_AVX512F |
2388 CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_AVX512PF |
2389 CPUID_7_0_EBX_AVX512ER,
2390 .features[FEAT_7_0_ECX] =
2391 CPUID_7_0_ECX_AVX512_VPOPCNTDQ,
2392 .features[FEAT_7_0_EDX] =
2393 CPUID_7_0_EDX_AVX512_4VNNIW | CPUID_7_0_EDX_AVX512_4FMAPS,
2394 .features[FEAT_XSAVE] =
2395 CPUID_XSAVE_XSAVEOPT,
2396 .features[FEAT_6_EAX] =
2397 CPUID_6_EAX_ARAT,
2398 .xlevel = 0x80000008,
2399 .model_id = "Intel Xeon Phi Processor (Knights Mill)",
2400 },
3eca4642
EH
2401 {
2402 .name = "Opteron_G1",
2403 .level = 5,
99b88a17 2404 .vendor = CPUID_VENDOR_AMD,
3eca4642
EH
2405 .family = 15,
2406 .model = 6,
2407 .stepping = 1,
0514ef2f 2408 .features[FEAT_1_EDX] =
b3a4f0b1 2409 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
2410 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2411 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2412 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2413 CPUID_DE | CPUID_FP87,
0514ef2f 2414 .features[FEAT_1_ECX] =
27861ecc 2415 CPUID_EXT_SSE3,
0514ef2f 2416 .features[FEAT_8000_0001_EDX] =
2a923a29 2417 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
3eca4642
EH
2418 .xlevel = 0x80000008,
2419 .model_id = "AMD Opteron 240 (Gen 1 Class Opteron)",
2420 },
2421 {
2422 .name = "Opteron_G2",
2423 .level = 5,
99b88a17 2424 .vendor = CPUID_VENDOR_AMD,
3eca4642
EH
2425 .family = 15,
2426 .model = 6,
2427 .stepping = 1,
0514ef2f 2428 .features[FEAT_1_EDX] =
b3a4f0b1 2429 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
2430 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2431 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2432 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2433 CPUID_DE | CPUID_FP87,
0514ef2f 2434 .features[FEAT_1_ECX] =
27861ecc 2435 CPUID_EXT_CX16 | CPUID_EXT_SSE3,
33b5e8c0 2436 /* Missing: CPUID_EXT2_RDTSCP */
0514ef2f 2437 .features[FEAT_8000_0001_EDX] =
2a923a29 2438 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
0514ef2f 2439 .features[FEAT_8000_0001_ECX] =
27861ecc 2440 CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
3eca4642
EH
2441 .xlevel = 0x80000008,
2442 .model_id = "AMD Opteron 22xx (Gen 2 Class Opteron)",
2443 },
2444 {
2445 .name = "Opteron_G3",
2446 .level = 5,
99b88a17 2447 .vendor = CPUID_VENDOR_AMD,
339892d7
EY
2448 .family = 16,
2449 .model = 2,
2450 .stepping = 3,
0514ef2f 2451 .features[FEAT_1_EDX] =
b3a4f0b1 2452 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
2453 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2454 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2455 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2456 CPUID_DE | CPUID_FP87,
0514ef2f 2457 .features[FEAT_1_ECX] =
27861ecc 2458 CPUID_EXT_POPCNT | CPUID_EXT_CX16 | CPUID_EXT_MONITOR |
b3fb3a20 2459 CPUID_EXT_SSE3,
33b5e8c0 2460 /* Missing: CPUID_EXT2_RDTSCP */
0514ef2f 2461 .features[FEAT_8000_0001_EDX] =
2a923a29 2462 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
0514ef2f 2463 .features[FEAT_8000_0001_ECX] =
27861ecc 2464 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A |
b3fb3a20 2465 CPUID_EXT3_ABM | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
3eca4642
EH
2466 .xlevel = 0x80000008,
2467 .model_id = "AMD Opteron 23xx (Gen 3 Class Opteron)",
2468 },
2469 {
2470 .name = "Opteron_G4",
2471 .level = 0xd,
99b88a17 2472 .vendor = CPUID_VENDOR_AMD,
3eca4642
EH
2473 .family = 21,
2474 .model = 1,
2475 .stepping = 2,
0514ef2f 2476 .features[FEAT_1_EDX] =
b3a4f0b1 2477 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
2478 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2479 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2480 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2481 CPUID_DE | CPUID_FP87,
0514ef2f 2482 .features[FEAT_1_ECX] =
27861ecc 2483 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
b3fb3a20
EH
2484 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2485 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
2486 CPUID_EXT_SSE3,
33b5e8c0 2487 /* Missing: CPUID_EXT2_RDTSCP */
0514ef2f 2488 .features[FEAT_8000_0001_EDX] =
2a923a29
EH
2489 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
2490 CPUID_EXT2_SYSCALL,
0514ef2f 2491 .features[FEAT_8000_0001_ECX] =
27861ecc 2492 CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
b3fb3a20
EH
2493 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
2494 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
2495 CPUID_EXT3_LAHF_LM,
0bb0b2d2 2496 /* no xsaveopt! */
3eca4642
EH
2497 .xlevel = 0x8000001A,
2498 .model_id = "AMD Opteron 62xx class CPU",
2499 },
021941b9
AP
2500 {
2501 .name = "Opteron_G5",
2502 .level = 0xd,
99b88a17 2503 .vendor = CPUID_VENDOR_AMD,
021941b9
AP
2504 .family = 21,
2505 .model = 2,
2506 .stepping = 0,
0514ef2f 2507 .features[FEAT_1_EDX] =
b3a4f0b1 2508 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
2509 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
2510 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
2511 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
2512 CPUID_DE | CPUID_FP87,
0514ef2f 2513 .features[FEAT_1_ECX] =
27861ecc 2514 CPUID_EXT_F16C | CPUID_EXT_AVX | CPUID_EXT_XSAVE |
b3fb3a20
EH
2515 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
2516 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_FMA |
2517 CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
33b5e8c0 2518 /* Missing: CPUID_EXT2_RDTSCP */
0514ef2f 2519 .features[FEAT_8000_0001_EDX] =
2a923a29
EH
2520 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX |
2521 CPUID_EXT2_SYSCALL,
0514ef2f 2522 .features[FEAT_8000_0001_ECX] =
27861ecc 2523 CPUID_EXT3_TBM | CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
b3fb3a20
EH
2524 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
2525 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
2526 CPUID_EXT3_LAHF_LM,
0bb0b2d2 2527 /* no xsaveopt! */
021941b9
AP
2528 .xlevel = 0x8000001A,
2529 .model_id = "AMD Opteron 63xx class CPU",
2530 },
2e2efc7d
BS
2531 {
2532 .name = "EPYC",
2533 .level = 0xd,
2534 .vendor = CPUID_VENDOR_AMD,
2535 .family = 23,
2536 .model = 1,
2537 .stepping = 2,
2538 .features[FEAT_1_EDX] =
2539 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
2540 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
2541 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
2542 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
2543 CPUID_VME | CPUID_FP87,
2544 .features[FEAT_1_ECX] =
2545 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
2546 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
2547 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2548 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
2549 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
2550 .features[FEAT_8000_0001_EDX] =
2551 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
2552 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
2553 CPUID_EXT2_SYSCALL,
2554 .features[FEAT_8000_0001_ECX] =
2555 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
2556 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
2557 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
2558 .features[FEAT_7_0_EBX] =
2559 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
2560 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
2561 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
2562 CPUID_7_0_EBX_SHA_NI,
2563 /* Missing: XSAVES (not supported by some Linux versions,
2564 * including v4.1 to v4.12).
2565 * KVM doesn't yet expose any XSAVES state save component.
2566 */
2567 .features[FEAT_XSAVE] =
2568 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2569 CPUID_XSAVE_XGETBV1,
2570 .features[FEAT_6_EAX] =
2571 CPUID_6_EAX_ARAT,
2572 .xlevel = 0x8000000A,
2573 .model_id = "AMD EPYC Processor",
fe52acd2 2574 .cache_info = &epyc_cache_info,
2e2efc7d 2575 },
6cfbc54e
EH
2576 {
2577 .name = "EPYC-IBPB",
2578 .level = 0xd,
2579 .vendor = CPUID_VENDOR_AMD,
2580 .family = 23,
2581 .model = 1,
2582 .stepping = 2,
2583 .features[FEAT_1_EDX] =
2584 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH |
2585 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE |
2586 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE |
2587 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE |
2588 CPUID_VME | CPUID_FP87,
2589 .features[FEAT_1_ECX] =
2590 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX |
2591 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT |
2592 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
2593 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 |
2594 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
2595 .features[FEAT_8000_0001_EDX] =
2596 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB |
2597 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX |
2598 CPUID_EXT2_SYSCALL,
2599 .features[FEAT_8000_0001_ECX] =
2600 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH |
2601 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM |
2602 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
2603 .features[FEAT_8000_0008_EBX] =
2604 CPUID_8000_0008_EBX_IBPB,
2605 .features[FEAT_7_0_EBX] =
2606 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 |
2607 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED |
2608 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT |
2609 CPUID_7_0_EBX_SHA_NI,
2610 /* Missing: XSAVES (not supported by some Linux versions,
2611 * including v4.1 to v4.12).
2612 * KVM doesn't yet expose any XSAVES state save component.
2613 */
2614 .features[FEAT_XSAVE] =
2615 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
2616 CPUID_XSAVE_XGETBV1,
2617 .features[FEAT_6_EAX] =
2618 CPUID_6_EAX_ARAT,
2619 .xlevel = 0x8000000A,
2620 .model_id = "AMD EPYC Processor (with IBPB)",
fe52acd2 2621 .cache_info = &epyc_cache_info,
6cfbc54e 2622 },
c6dc6f63
AP
2623};
2624
5114e842
EH
2625typedef struct PropValue {
2626 const char *prop, *value;
2627} PropValue;
2628
2629/* KVM-specific features that are automatically added/removed
2630 * from all CPU models when KVM is enabled.
2631 */
2632static PropValue kvm_default_props[] = {
2633 { "kvmclock", "on" },
2634 { "kvm-nopiodelay", "on" },
2635 { "kvm-asyncpf", "on" },
2636 { "kvm-steal-time", "on" },
2637 { "kvm-pv-eoi", "on" },
2638 { "kvmclock-stable-bit", "on" },
2639 { "x2apic", "on" },
2640 { "acpi", "off" },
2641 { "monitor", "off" },
2642 { "svm", "off" },
2643 { NULL, NULL },
2644};
2645
04d99c3c
EH
2646/* TCG-specific defaults that override all CPU models when using TCG
2647 */
2648static PropValue tcg_default_props[] = {
2649 { "vme", "off" },
2650 { NULL, NULL },
2651};
2652
2653
5114e842
EH
2654void x86_cpu_change_kvm_default(const char *prop, const char *value)
2655{
2656 PropValue *pv;
2657 for (pv = kvm_default_props; pv->prop; pv++) {
2658 if (!strcmp(pv->prop, prop)) {
2659 pv->value = value;
2660 break;
2661 }
2662 }
2663
2664 /* It is valid to call this function only for properties that
2665 * are already present in the kvm_default_props table.
2666 */
2667 assert(pv->prop);
2668}
2669
4d1b279b
EH
2670static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w,
2671 bool migratable_only);
2672
40bfe48f
HZ
2673static bool lmce_supported(void)
2674{
c62f2630 2675 uint64_t mce_cap = 0;
40bfe48f 2676
c62f2630 2677#ifdef CONFIG_KVM
40bfe48f
HZ
2678 if (kvm_ioctl(kvm_state, KVM_X86_GET_MCE_CAP_SUPPORTED, &mce_cap) < 0) {
2679 return false;
2680 }
c62f2630 2681#endif
40bfe48f
HZ
2682
2683 return !!(mce_cap & MCG_LMCE_P);
2684}
2685
7d8050b5
EH
2686#define CPUID_MODEL_ID_SZ 48
2687
2688/**
2689 * cpu_x86_fill_model_id:
2690 * Get CPUID model ID string from host CPU.
2691 *
2692 * @str should have at least CPUID_MODEL_ID_SZ bytes
2693 *
2694 * The function does NOT add a null terminator to the string
2695 * automatically.
2696 */
c6dc6f63
AP
2697static int cpu_x86_fill_model_id(char *str)
2698{
2699 uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0;
2700 int i;
2701
2702 for (i = 0; i < 3; i++) {
2703 host_cpuid(0x80000002 + i, 0, &eax, &ebx, &ecx, &edx);
2704 memcpy(str + i * 16 + 0, &eax, 4);
2705 memcpy(str + i * 16 + 4, &ebx, 4);
2706 memcpy(str + i * 16 + 8, &ecx, 4);
2707 memcpy(str + i * 16 + 12, &edx, 4);
2708 }
2709 return 0;
2710}
2711
c62f2630 2712static Property max_x86_cpu_properties[] = {
120eee7d 2713 DEFINE_PROP_BOOL("migratable", X86CPU, migratable, true),
e265e3e4 2714 DEFINE_PROP_BOOL("host-cache-info", X86CPU, cache_info_passthrough, false),
84f1b92f
EH
2715 DEFINE_PROP_END_OF_LIST()
2716};
2717
c62f2630 2718static void max_x86_cpu_class_init(ObjectClass *oc, void *data)
c6dc6f63 2719{
84f1b92f 2720 DeviceClass *dc = DEVICE_CLASS(oc);
d940ee9b 2721 X86CPUClass *xcc = X86_CPU_CLASS(oc);
c6dc6f63 2722
f48c8837 2723 xcc->ordering = 9;
6e746f30 2724
ee465a3e 2725 xcc->model_description =
c62f2630 2726 "Enables all features supported by the accelerator in the current host";
d940ee9b 2727
c62f2630 2728 dc->props = max_x86_cpu_properties;
d940ee9b
EH
2729}
2730
0bacd8b3
EH
2731static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp);
2732
c62f2630 2733static void max_x86_cpu_initfn(Object *obj)
d940ee9b
EH
2734{
2735 X86CPU *cpu = X86_CPU(obj);
2736 CPUX86State *env = &cpu->env;
2737 KVMState *s = kvm_state;
d940ee9b 2738
4d1b279b
EH
2739 /* We can't fill the features array here because we don't know yet if
2740 * "migratable" is true or false.
2741 */
44bd8e53 2742 cpu->max_features = true;
4d1b279b 2743
d6dcc558 2744 if (accel_uses_host_cpuid()) {
bd182022
EH
2745 char vendor[CPUID_VENDOR_SZ + 1] = { 0 };
2746 char model_id[CPUID_MODEL_ID_SZ + 1] = { 0 };
2747 int family, model, stepping;
d6dcc558
SAGDR
2748 X86CPUDefinition host_cpudef = { };
2749 uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0;
2750
2751 host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx);
2752 x86_cpu_vendor_words2str(host_cpudef.vendor, ebx, edx, ecx);
0bacd8b3 2753
bd182022 2754 host_vendor_fms(vendor, &family, &model, &stepping);
0bacd8b3 2755
bd182022 2756 cpu_x86_fill_model_id(model_id);
0bacd8b3 2757
bd182022
EH
2758 object_property_set_str(OBJECT(cpu), vendor, "vendor", &error_abort);
2759 object_property_set_int(OBJECT(cpu), family, "family", &error_abort);
2760 object_property_set_int(OBJECT(cpu), model, "model", &error_abort);
2761 object_property_set_int(OBJECT(cpu), stepping, "stepping",
2762 &error_abort);
2763 object_property_set_str(OBJECT(cpu), model_id, "model-id",
2764 &error_abort);
0bacd8b3 2765
d6dcc558
SAGDR
2766 if (kvm_enabled()) {
2767 env->cpuid_min_level =
2768 kvm_arch_get_supported_cpuid(s, 0x0, 0, R_EAX);
2769 env->cpuid_min_xlevel =
2770 kvm_arch_get_supported_cpuid(s, 0x80000000, 0, R_EAX);
2771 env->cpuid_min_xlevel2 =
2772 kvm_arch_get_supported_cpuid(s, 0xC0000000, 0, R_EAX);
2773 } else {
2774 env->cpuid_min_level =
2775 hvf_get_supported_cpuid(0x0, 0, R_EAX);
2776 env->cpuid_min_xlevel =
2777 hvf_get_supported_cpuid(0x80000000, 0, R_EAX);
2778 env->cpuid_min_xlevel2 =
2779 hvf_get_supported_cpuid(0xC0000000, 0, R_EAX);
2780 }
40bfe48f
HZ
2781
2782 if (lmce_supported()) {
2783 object_property_set_bool(OBJECT(cpu), true, "lmce", &error_abort);
2784 }
6900d1cc
EH
2785 } else {
2786 object_property_set_str(OBJECT(cpu), CPUID_VENDOR_AMD,
2787 "vendor", &error_abort);
2788 object_property_set_int(OBJECT(cpu), 6, "family", &error_abort);
2789 object_property_set_int(OBJECT(cpu), 6, "model", &error_abort);
2790 object_property_set_int(OBJECT(cpu), 3, "stepping", &error_abort);
2791 object_property_set_str(OBJECT(cpu),
2792 "QEMU TCG CPU version " QEMU_HW_VERSION,
2793 "model-id", &error_abort);
e4356010 2794 }
2a573259 2795
d940ee9b 2796 object_property_set_bool(OBJECT(cpu), true, "pmu", &error_abort);
c6dc6f63
AP
2797}
2798
c62f2630
EH
2799static const TypeInfo max_x86_cpu_type_info = {
2800 .name = X86_CPU_TYPE_NAME("max"),
2801 .parent = TYPE_X86_CPU,
2802 .instance_init = max_x86_cpu_initfn,
2803 .class_init = max_x86_cpu_class_init,
2804};
2805
d6dcc558 2806#if defined(CONFIG_KVM) || defined(CONFIG_HVF)
c62f2630
EH
2807static void host_x86_cpu_class_init(ObjectClass *oc, void *data)
2808{
2809 X86CPUClass *xcc = X86_CPU_CLASS(oc);
2810
d6dcc558 2811 xcc->host_cpuid_required = true;
c62f2630
EH
2812 xcc->ordering = 8;
2813
d6dcc558
SAGDR
2814 if (kvm_enabled()) {
2815 xcc->model_description =
2816 "KVM processor with all supported host features ";
2817 } else if (hvf_enabled()) {
2818 xcc->model_description =
2819 "HVF processor with all supported host features ";
2820 }
c62f2630
EH
2821}
2822
d940ee9b
EH
2823static const TypeInfo host_x86_cpu_type_info = {
2824 .name = X86_CPU_TYPE_NAME("host"),
c62f2630 2825 .parent = X86_CPU_TYPE_NAME("max"),
d940ee9b
EH
2826 .class_init = host_x86_cpu_class_init,
2827};
2828
2829#endif
2830
8459e396 2831static void report_unavailable_features(FeatureWord w, uint32_t mask)
c6dc6f63 2832{
8459e396 2833 FeatureWordInfo *f = &feature_word_info[w];
c6dc6f63
AP
2834 int i;
2835
857aee33 2836 for (i = 0; i < 32; ++i) {
72370dc1 2837 if ((1UL << i) & mask) {
bffd67b0 2838 const char *reg = get_register_name_32(f->cpuid_reg);
8b4beddc 2839 assert(reg);
8297be80
AF
2840 warn_report("%s doesn't support requested feature: "
2841 "CPUID.%02XH:%s%s%s [bit %d]",
d6dcc558 2842 accel_uses_host_cpuid() ? "host" : "TCG",
8297be80
AF
2843 f->cpuid_eax, reg,
2844 f->feat_names[i] ? "." : "",
2845 f->feat_names[i] ? f->feat_names[i] : "", i);
c6dc6f63 2846 }
857aee33 2847 }
c6dc6f63
AP
2848}
2849
d7bce999
EB
2850static void x86_cpuid_version_get_family(Object *obj, Visitor *v,
2851 const char *name, void *opaque,
2852 Error **errp)
95b8519d
AF
2853{
2854 X86CPU *cpu = X86_CPU(obj);
2855 CPUX86State *env = &cpu->env;
2856 int64_t value;
2857
2858 value = (env->cpuid_version >> 8) & 0xf;
2859 if (value == 0xf) {
2860 value += (env->cpuid_version >> 20) & 0xff;
2861 }
51e72bc1 2862 visit_type_int(v, name, &value, errp);
95b8519d
AF
2863}
2864
d7bce999
EB
2865static void x86_cpuid_version_set_family(Object *obj, Visitor *v,
2866 const char *name, void *opaque,
2867 Error **errp)
ed5e1ec3 2868{
71ad61d3
AF
2869 X86CPU *cpu = X86_CPU(obj);
2870 CPUX86State *env = &cpu->env;
2871 const int64_t min = 0;
2872 const int64_t max = 0xff + 0xf;
65cd9064 2873 Error *local_err = NULL;
71ad61d3
AF
2874 int64_t value;
2875
51e72bc1 2876 visit_type_int(v, name, &value, &local_err);
65cd9064
MA
2877 if (local_err) {
2878 error_propagate(errp, local_err);
71ad61d3
AF
2879 return;
2880 }
2881 if (value < min || value > max) {
c6bd8c70
MA
2882 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
2883 name ? name : "null", value, min, max);
71ad61d3
AF
2884 return;
2885 }
2886
ed5e1ec3 2887 env->cpuid_version &= ~0xff00f00;
71ad61d3
AF
2888 if (value > 0x0f) {
2889 env->cpuid_version |= 0xf00 | ((value - 0x0f) << 20);
ed5e1ec3 2890 } else {
71ad61d3 2891 env->cpuid_version |= value << 8;
ed5e1ec3
AF
2892 }
2893}
2894
d7bce999
EB
2895static void x86_cpuid_version_get_model(Object *obj, Visitor *v,
2896 const char *name, void *opaque,
2897 Error **errp)
67e30c83
AF
2898{
2899 X86CPU *cpu = X86_CPU(obj);
2900 CPUX86State *env = &cpu->env;
2901 int64_t value;
2902
2903 value = (env->cpuid_version >> 4) & 0xf;
2904 value |= ((env->cpuid_version >> 16) & 0xf) << 4;
51e72bc1 2905 visit_type_int(v, name, &value, errp);
67e30c83
AF
2906}
2907
d7bce999
EB
2908static void x86_cpuid_version_set_model(Object *obj, Visitor *v,
2909 const char *name, void *opaque,
2910 Error **errp)
b0704cbd 2911{
c5291a4f
AF
2912 X86CPU *cpu = X86_CPU(obj);
2913 CPUX86State *env = &cpu->env;
2914 const int64_t min = 0;
2915 const int64_t max = 0xff;
65cd9064 2916 Error *local_err = NULL;
c5291a4f
AF
2917 int64_t value;
2918
51e72bc1 2919 visit_type_int(v, name, &value, &local_err);
65cd9064
MA
2920 if (local_err) {
2921 error_propagate(errp, local_err);
c5291a4f
AF
2922 return;
2923 }
2924 if (value < min || value > max) {
c6bd8c70
MA
2925 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
2926 name ? name : "null", value, min, max);
c5291a4f
AF
2927 return;
2928 }
2929
b0704cbd 2930 env->cpuid_version &= ~0xf00f0;
c5291a4f 2931 env->cpuid_version |= ((value & 0xf) << 4) | ((value >> 4) << 16);
b0704cbd
AF
2932}
2933
35112e41 2934static void x86_cpuid_version_get_stepping(Object *obj, Visitor *v,
d7bce999 2935 const char *name, void *opaque,
35112e41
AF
2936 Error **errp)
2937{
2938 X86CPU *cpu = X86_CPU(obj);
2939 CPUX86State *env = &cpu->env;
2940 int64_t value;
2941
2942 value = env->cpuid_version & 0xf;
51e72bc1 2943 visit_type_int(v, name, &value, errp);
35112e41
AF
2944}
2945
036e2222 2946static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v,
d7bce999 2947 const char *name, void *opaque,
036e2222 2948 Error **errp)
38c3dc46 2949{
036e2222
AF
2950 X86CPU *cpu = X86_CPU(obj);
2951 CPUX86State *env = &cpu->env;
2952 const int64_t min = 0;
2953 const int64_t max = 0xf;
65cd9064 2954 Error *local_err = NULL;
036e2222
AF
2955 int64_t value;
2956
51e72bc1 2957 visit_type_int(v, name, &value, &local_err);
65cd9064
MA
2958 if (local_err) {
2959 error_propagate(errp, local_err);
036e2222
AF
2960 return;
2961 }
2962 if (value < min || value > max) {
c6bd8c70
MA
2963 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
2964 name ? name : "null", value, min, max);
036e2222
AF
2965 return;
2966 }
2967
38c3dc46 2968 env->cpuid_version &= ~0xf;
036e2222 2969 env->cpuid_version |= value & 0xf;
38c3dc46
AF
2970}
2971
d480e1af
AF
2972static char *x86_cpuid_get_vendor(Object *obj, Error **errp)
2973{
2974 X86CPU *cpu = X86_CPU(obj);
2975 CPUX86State *env = &cpu->env;
2976 char *value;
d480e1af 2977
e42a92ae 2978 value = g_malloc(CPUID_VENDOR_SZ + 1);
99b88a17
IM
2979 x86_cpu_vendor_words2str(value, env->cpuid_vendor1, env->cpuid_vendor2,
2980 env->cpuid_vendor3);
d480e1af
AF
2981 return value;
2982}
2983
2984static void x86_cpuid_set_vendor(Object *obj, const char *value,
2985 Error **errp)
2986{
2987 X86CPU *cpu = X86_CPU(obj);
2988 CPUX86State *env = &cpu->env;
2989 int i;
2990
9df694ee 2991 if (strlen(value) != CPUID_VENDOR_SZ) {
c6bd8c70 2992 error_setg(errp, QERR_PROPERTY_VALUE_BAD, "", "vendor", value);
d480e1af
AF
2993 return;
2994 }
2995
2996 env->cpuid_vendor1 = 0;
2997 env->cpuid_vendor2 = 0;
2998 env->cpuid_vendor3 = 0;
2999 for (i = 0; i < 4; i++) {
3000 env->cpuid_vendor1 |= ((uint8_t)value[i ]) << (8 * i);
3001 env->cpuid_vendor2 |= ((uint8_t)value[i + 4]) << (8 * i);
3002 env->cpuid_vendor3 |= ((uint8_t)value[i + 8]) << (8 * i);
3003 }
d480e1af
AF
3004}
3005
63e886eb
AF
3006static char *x86_cpuid_get_model_id(Object *obj, Error **errp)
3007{
3008 X86CPU *cpu = X86_CPU(obj);
3009 CPUX86State *env = &cpu->env;
3010 char *value;
3011 int i;
3012
3013 value = g_malloc(48 + 1);
3014 for (i = 0; i < 48; i++) {
3015 value[i] = env->cpuid_model[i >> 2] >> (8 * (i & 3));
3016 }
3017 value[48] = '\0';
3018 return value;
3019}
3020
938d4c25
AF
3021static void x86_cpuid_set_model_id(Object *obj, const char *model_id,
3022 Error **errp)
dcce6675 3023{
938d4c25
AF
3024 X86CPU *cpu = X86_CPU(obj);
3025 CPUX86State *env = &cpu->env;
dcce6675
AF
3026 int c, len, i;
3027
3028 if (model_id == NULL) {
3029 model_id = "";
3030 }
3031 len = strlen(model_id);
d0a6acf4 3032 memset(env->cpuid_model, 0, 48);
dcce6675
AF
3033 for (i = 0; i < 48; i++) {
3034 if (i >= len) {
3035 c = '\0';
3036 } else {
3037 c = (uint8_t)model_id[i];
3038 }
3039 env->cpuid_model[i >> 2] |= c << (8 * (i & 3));
3040 }
3041}
3042
d7bce999
EB
3043static void x86_cpuid_get_tsc_freq(Object *obj, Visitor *v, const char *name,
3044 void *opaque, Error **errp)
89e48965
AF
3045{
3046 X86CPU *cpu = X86_CPU(obj);
3047 int64_t value;
3048
3049 value = cpu->env.tsc_khz * 1000;
51e72bc1 3050 visit_type_int(v, name, &value, errp);
89e48965
AF
3051}
3052
d7bce999
EB
3053static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name,
3054 void *opaque, Error **errp)
89e48965
AF
3055{
3056 X86CPU *cpu = X86_CPU(obj);
3057 const int64_t min = 0;
2e84849a 3058 const int64_t max = INT64_MAX;
65cd9064 3059 Error *local_err = NULL;
89e48965
AF
3060 int64_t value;
3061
51e72bc1 3062 visit_type_int(v, name, &value, &local_err);
65cd9064
MA
3063 if (local_err) {
3064 error_propagate(errp, local_err);
89e48965
AF
3065 return;
3066 }
3067 if (value < min || value > max) {
c6bd8c70
MA
3068 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
3069 name ? name : "null", value, min, max);
89e48965
AF
3070 return;
3071 }
3072
36f96c4b 3073 cpu->env.tsc_khz = cpu->env.user_tsc_khz = value / 1000;
89e48965
AF
3074}
3075
7e5292b5 3076/* Generic getter for "feature-words" and "filtered-features" properties */
d7bce999
EB
3077static void x86_cpu_get_feature_words(Object *obj, Visitor *v,
3078 const char *name, void *opaque,
3079 Error **errp)
8e8aba50 3080{
7e5292b5 3081 uint32_t *array = (uint32_t *)opaque;
8e8aba50 3082 FeatureWord w;
8e8aba50
EH
3083 X86CPUFeatureWordInfo word_infos[FEATURE_WORDS] = { };
3084 X86CPUFeatureWordInfoList list_entries[FEATURE_WORDS] = { };
3085 X86CPUFeatureWordInfoList *list = NULL;
3086
3087 for (w = 0; w < FEATURE_WORDS; w++) {
3088 FeatureWordInfo *wi = &feature_word_info[w];
3089 X86CPUFeatureWordInfo *qwi = &word_infos[w];
3090 qwi->cpuid_input_eax = wi->cpuid_eax;
3091 qwi->has_cpuid_input_ecx = wi->cpuid_needs_ecx;
3092 qwi->cpuid_input_ecx = wi->cpuid_ecx;
3093 qwi->cpuid_register = x86_reg_info_32[wi->cpuid_reg].qapi_enum;
7e5292b5 3094 qwi->features = array[w];
8e8aba50
EH
3095
3096 /* List will be in reverse order, but order shouldn't matter */
3097 list_entries[w].next = list;
3098 list_entries[w].value = &word_infos[w];
3099 list = &list_entries[w];
3100 }
3101
6b62d961 3102 visit_type_X86CPUFeatureWordInfoList(v, "feature-words", &list, errp);
8e8aba50
EH
3103}
3104
d7bce999
EB
3105static void x86_get_hv_spinlocks(Object *obj, Visitor *v, const char *name,
3106 void *opaque, Error **errp)
c8f0f88e
IM
3107{
3108 X86CPU *cpu = X86_CPU(obj);
3109 int64_t value = cpu->hyperv_spinlock_attempts;
3110
51e72bc1 3111 visit_type_int(v, name, &value, errp);
c8f0f88e
IM
3112}
3113
d7bce999
EB
3114static void x86_set_hv_spinlocks(Object *obj, Visitor *v, const char *name,
3115 void *opaque, Error **errp)
c8f0f88e
IM
3116{
3117 const int64_t min = 0xFFF;
3118 const int64_t max = UINT_MAX;
3119 X86CPU *cpu = X86_CPU(obj);
3120 Error *err = NULL;
3121 int64_t value;
3122
51e72bc1 3123 visit_type_int(v, name, &value, &err);
c8f0f88e
IM
3124 if (err) {
3125 error_propagate(errp, err);
3126 return;
3127 }
3128
3129 if (value < min || value > max) {
3130 error_setg(errp, "Property %s.%s doesn't take value %" PRId64
5bb4c35d 3131 " (minimum: %" PRId64 ", maximum: %" PRId64 ")",
3132 object_get_typename(obj), name ? name : "null",
3133 value, min, max);
c8f0f88e
IM
3134 return;
3135 }
3136 cpu->hyperv_spinlock_attempts = value;
3137}
3138
1b6b7d10 3139static const PropertyInfo qdev_prop_spinlocks = {
c8f0f88e
IM
3140 .name = "int",
3141 .get = x86_get_hv_spinlocks,
3142 .set = x86_set_hv_spinlocks,
3143};
3144
72ac2e87
IM
3145/* Convert all '_' in a feature string option name to '-', to make feature
3146 * name conform to QOM property naming rule, which uses '-' instead of '_'.
3147 */
3148static inline void feat2prop(char *s)
3149{
3150 while ((s = strchr(s, '_'))) {
3151 *s = '-';
3152 }
3153}
3154
b54c9377
EH
3155/* Return the feature property name for a feature flag bit */
3156static const char *x86_cpu_feature_name(FeatureWord w, int bitnr)
3157{
3158 /* XSAVE components are automatically enabled by other features,
3159 * so return the original feature name instead
3160 */
3161 if (w == FEAT_XSAVE_COMP_LO || w == FEAT_XSAVE_COMP_HI) {
3162 int comp = (w == FEAT_XSAVE_COMP_HI) ? bitnr + 32 : bitnr;
3163
3164 if (comp < ARRAY_SIZE(x86_ext_save_areas) &&
3165 x86_ext_save_areas[comp].bits) {
3166 w = x86_ext_save_areas[comp].feature;
3167 bitnr = ctz32(x86_ext_save_areas[comp].bits);
3168 }
3169 }
3170
3171 assert(bitnr < 32);
3172 assert(w < FEATURE_WORDS);
3173 return feature_word_info[w].feat_names[bitnr];
3174}
3175
dc15c051
IM
3176/* Compatibily hack to maintain legacy +-feat semantic,
3177 * where +-feat overwrites any feature set by
3178 * feat=on|feat even if the later is parsed after +-feat
3179 * (i.e. "-x2apic,x2apic=on" will result in x2apic disabled)
3180 */
2fae0d96 3181static GList *plus_features, *minus_features;
dc15c051 3182
83a00f60
EH
3183static gint compare_string(gconstpointer a, gconstpointer b)
3184{
3185 return g_strcmp0(a, b);
3186}
3187
8f961357
EH
3188/* Parse "+feature,-feature,feature=foo" CPU feature string
3189 */
62a48a2a 3190static void x86_cpu_parse_featurestr(const char *typename, char *features,
94a444b2 3191 Error **errp)
8f961357 3192{
8f961357 3193 char *featurestr; /* Single 'key=value" string being parsed */
62a48a2a 3194 static bool cpu_globals_initialized;
83a00f60 3195 bool ambiguous = false;
62a48a2a
IM
3196
3197 if (cpu_globals_initialized) {
3198 return;
3199 }
3200 cpu_globals_initialized = true;
8f961357 3201
f6750e95
EH
3202 if (!features) {
3203 return;
3204 }
3205
3206 for (featurestr = strtok(features, ",");
685479bd 3207 featurestr;
f6750e95
EH
3208 featurestr = strtok(NULL, ",")) {
3209 const char *name;
3210 const char *val = NULL;
3211 char *eq = NULL;
cf2887c9 3212 char num[32];
62a48a2a 3213 GlobalProperty *prop;
c6dc6f63 3214
f6750e95 3215 /* Compatibility syntax: */
c6dc6f63 3216 if (featurestr[0] == '+') {
2fae0d96
EH
3217 plus_features = g_list_append(plus_features,
3218 g_strdup(featurestr + 1));
f6750e95 3219 continue;
c6dc6f63 3220 } else if (featurestr[0] == '-') {
2fae0d96
EH
3221 minus_features = g_list_append(minus_features,
3222 g_strdup(featurestr + 1));
f6750e95
EH
3223 continue;
3224 }
3225
3226 eq = strchr(featurestr, '=');
3227 if (eq) {
3228 *eq++ = 0;
3229 val = eq;
c6dc6f63 3230 } else {
f6750e95 3231 val = "on";
a91987c2 3232 }
f6750e95
EH
3233
3234 feat2prop(featurestr);
3235 name = featurestr;
3236
83a00f60 3237 if (g_list_find_custom(plus_features, name, compare_string)) {
3dc6f869
AF
3238 warn_report("Ambiguous CPU model string. "
3239 "Don't mix both \"+%s\" and \"%s=%s\"",
3240 name, name, val);
83a00f60
EH
3241 ambiguous = true;
3242 }
3243 if (g_list_find_custom(minus_features, name, compare_string)) {
3dc6f869
AF
3244 warn_report("Ambiguous CPU model string. "
3245 "Don't mix both \"-%s\" and \"%s=%s\"",
3246 name, name, val);
83a00f60
EH
3247 ambiguous = true;
3248 }
3249
f6750e95
EH
3250 /* Special case: */
3251 if (!strcmp(name, "tsc-freq")) {
f17fd4fd 3252 int ret;
f46bfdbf 3253 uint64_t tsc_freq;
f6750e95 3254
f17fd4fd 3255 ret = qemu_strtosz_metric(val, NULL, &tsc_freq);
f46bfdbf 3256 if (ret < 0 || tsc_freq > INT64_MAX) {
f6750e95
EH
3257 error_setg(errp, "bad numerical value %s", val);
3258 return;
3259 }
3260 snprintf(num, sizeof(num), "%" PRId64, tsc_freq);
3261 val = num;
3262 name = "tsc-frequency";
c6dc6f63 3263 }
f6750e95 3264
62a48a2a
IM
3265 prop = g_new0(typeof(*prop), 1);
3266 prop->driver = typename;
3267 prop->property = g_strdup(name);
3268 prop->value = g_strdup(val);
3269 prop->errp = &error_fatal;
3270 qdev_prop_register_global(prop);
f6750e95
EH
3271 }
3272
83a00f60 3273 if (ambiguous) {
3dc6f869
AF
3274 warn_report("Compatibility of ambiguous CPU model "
3275 "strings won't be kept on future QEMU versions");
83a00f60 3276 }
c6dc6f63
AP
3277}
3278
b8d834a0 3279static void x86_cpu_expand_features(X86CPU *cpu, Error **errp);
b54c9377
EH
3280static int x86_cpu_filter_features(X86CPU *cpu);
3281
3282/* Check for missing features that may prevent the CPU class from
3283 * running using the current machine and accelerator.
3284 */
3285static void x86_cpu_class_check_missing_features(X86CPUClass *xcc,
3286 strList **missing_feats)
3287{
3288 X86CPU *xc;
3289 FeatureWord w;
3290 Error *err = NULL;
3291 strList **next = missing_feats;
3292
d6dcc558 3293 if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
b54c9377 3294 strList *new = g_new0(strList, 1);
3c254ab8 3295 new->value = g_strdup("kvm");
b54c9377
EH
3296 *missing_feats = new;
3297 return;
3298 }
3299
3300 xc = X86_CPU(object_new(object_class_get_name(OBJECT_CLASS(xcc))));
3301
b8d834a0 3302 x86_cpu_expand_features(xc, &err);
b54c9377 3303 if (err) {
b8d834a0 3304 /* Errors at x86_cpu_expand_features should never happen,
b54c9377
EH
3305 * but in case it does, just report the model as not
3306 * runnable at all using the "type" property.
3307 */
3308 strList *new = g_new0(strList, 1);
3309 new->value = g_strdup("type");
3310 *next = new;
3311 next = &new->next;
3312 }
3313
3314 x86_cpu_filter_features(xc);
3315
3316 for (w = 0; w < FEATURE_WORDS; w++) {
3317 uint32_t filtered = xc->filtered_features[w];
3318 int i;
3319 for (i = 0; i < 32; i++) {
3320 if (filtered & (1UL << i)) {
3321 strList *new = g_new0(strList, 1);
3322 new->value = g_strdup(x86_cpu_feature_name(w, i));
3323 *next = new;
3324 next = &new->next;
3325 }
3326 }
3327 }
3328
3329 object_unref(OBJECT(xc));
3330}
3331
8c3329e5 3332/* Print all cpuid feature names in featureset
c6dc6f63 3333 */
8c3329e5 3334static void listflags(FILE *f, fprintf_function print, const char **featureset)
0856579c 3335{
8c3329e5
EH
3336 int bit;
3337 bool first = true;
3338
3339 for (bit = 0; bit < 32; bit++) {
3340 if (featureset[bit]) {
3341 print(f, "%s%s", first ? "" : " ", featureset[bit]);
3342 first = false;
c6dc6f63 3343 }
8c3329e5 3344 }
c6dc6f63
AP
3345}
3346
f48c8837 3347/* Sort alphabetically by type name, respecting X86CPUClass::ordering. */
ee465a3e
EH
3348static gint x86_cpu_list_compare(gconstpointer a, gconstpointer b)
3349{
3350 ObjectClass *class_a = (ObjectClass *)a;
3351 ObjectClass *class_b = (ObjectClass *)b;
3352 X86CPUClass *cc_a = X86_CPU_CLASS(class_a);
3353 X86CPUClass *cc_b = X86_CPU_CLASS(class_b);
3354 const char *name_a, *name_b;
3355
f48c8837
EH
3356 if (cc_a->ordering != cc_b->ordering) {
3357 return cc_a->ordering - cc_b->ordering;
ee465a3e
EH
3358 } else {
3359 name_a = object_class_get_name(class_a);
3360 name_b = object_class_get_name(class_b);
3361 return strcmp(name_a, name_b);
3362 }
3363}
3364
3365static GSList *get_sorted_cpu_model_list(void)
3366{
3367 GSList *list = object_class_get_list(TYPE_X86_CPU, false);
3368 list = g_slist_sort(list, x86_cpu_list_compare);
3369 return list;
3370}
3371
3372static void x86_cpu_list_entry(gpointer data, gpointer user_data)
3373{
3374 ObjectClass *oc = data;
3375 X86CPUClass *cc = X86_CPU_CLASS(oc);
3376 CPUListState *s = user_data;
3377 char *name = x86_cpu_class_get_model_name(cc);
3378 const char *desc = cc->model_description;
0bacd8b3 3379 if (!desc && cc->cpu_def) {
ee465a3e
EH
3380 desc = cc->cpu_def->model_id;
3381 }
3382
081492ca 3383 (*s->cpu_fprintf)(s->file, "x86 %-20s %-48s\n",
ee465a3e
EH
3384 name, desc);
3385 g_free(name);
3386}
3387
3388/* list available CPU models and flags */
e916cbf8 3389void x86_cpu_list(FILE *f, fprintf_function cpu_fprintf)
c6dc6f63 3390{
7fc9b714 3391 int i;
ee465a3e
EH
3392 CPUListState s = {
3393 .file = f,
3394 .cpu_fprintf = cpu_fprintf,
3395 };
3396 GSList *list;
c6dc6f63 3397
ee465a3e
EH
3398 (*cpu_fprintf)(f, "Available CPUs:\n");
3399 list = get_sorted_cpu_model_list();
3400 g_slist_foreach(list, x86_cpu_list_entry, &s);
3401 g_slist_free(list);
21ad7789 3402
6cdf8854 3403 (*cpu_fprintf)(f, "\nRecognized CPUID flags:\n");
3af60be2
JK
3404 for (i = 0; i < ARRAY_SIZE(feature_word_info); i++) {
3405 FeatureWordInfo *fw = &feature_word_info[i];
3406
8c3329e5
EH
3407 (*cpu_fprintf)(f, " ");
3408 listflags(f, cpu_fprintf, fw->feat_names);
3409 (*cpu_fprintf)(f, "\n");
3af60be2 3410 }
c6dc6f63
AP
3411}
3412
ee465a3e
EH
3413static void x86_cpu_definition_entry(gpointer data, gpointer user_data)
3414{
3415 ObjectClass *oc = data;
3416 X86CPUClass *cc = X86_CPU_CLASS(oc);
3417 CpuDefinitionInfoList **cpu_list = user_data;
3418 CpuDefinitionInfoList *entry;
3419 CpuDefinitionInfo *info;
3420
3421 info = g_malloc0(sizeof(*info));
3422 info->name = x86_cpu_class_get_model_name(cc);
b54c9377
EH
3423 x86_cpu_class_check_missing_features(cc, &info->unavailable_features);
3424 info->has_unavailable_features = true;
8ed877b7 3425 info->q_typename = g_strdup(object_class_get_name(oc));
bd72159d
EH
3426 info->migration_safe = cc->migration_safe;
3427 info->has_migration_safe = true;
5adbed30 3428 info->q_static = cc->static_model;
ee465a3e
EH
3429
3430 entry = g_malloc0(sizeof(*entry));
3431 entry->value = info;
3432 entry->next = *cpu_list;
3433 *cpu_list = entry;
3434}
3435
76b64a7a 3436CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp)
e3966126
AL
3437{
3438 CpuDefinitionInfoList *cpu_list = NULL;
ee465a3e
EH
3439 GSList *list = get_sorted_cpu_model_list();
3440 g_slist_foreach(list, x86_cpu_definition_entry, &cpu_list);
3441 g_slist_free(list);
e3966126
AL
3442 return cpu_list;
3443}
3444
84f1b92f
EH
3445static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w,
3446 bool migratable_only)
27418adf
EH
3447{
3448 FeatureWordInfo *wi = &feature_word_info[w];
84f1b92f 3449 uint32_t r;
27418adf 3450
fefb41bf 3451 if (kvm_enabled()) {
84f1b92f
EH
3452 r = kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid_eax,
3453 wi->cpuid_ecx,
3454 wi->cpuid_reg);
d6dcc558
SAGDR
3455 } else if (hvf_enabled()) {
3456 r = hvf_get_supported_cpuid(wi->cpuid_eax,
3457 wi->cpuid_ecx,
3458 wi->cpuid_reg);
fefb41bf 3459 } else if (tcg_enabled()) {
84f1b92f 3460 r = wi->tcg_features;
fefb41bf
EH
3461 } else {
3462 return ~0;
3463 }
84f1b92f
EH
3464 if (migratable_only) {
3465 r &= x86_cpu_get_migratable_flags(w);
3466 }
3467 return r;
27418adf
EH
3468}
3469
8ca30e86
EH
3470static void x86_cpu_report_filtered_features(X86CPU *cpu)
3471{
3472 FeatureWord w;
3473
3474 for (w = 0; w < FEATURE_WORDS; w++) {
3475 report_unavailable_features(w, cpu->filtered_features[w]);
3476 }
3477}
3478
5114e842
EH
3479static void x86_cpu_apply_props(X86CPU *cpu, PropValue *props)
3480{
3481 PropValue *pv;
3482 for (pv = props; pv->prop; pv++) {
3483 if (!pv->value) {
3484 continue;
3485 }
3486 object_property_parse(OBJECT(cpu), pv->value, pv->prop,
3487 &error_abort);
3488 }
3489}
3490
f99fd7ca 3491/* Load data from X86CPUDefinition into a X86CPU object
c080e30e 3492 */
d940ee9b 3493static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp)
c6dc6f63 3494{
61dcd775 3495 CPUX86State *env = &cpu->env;
74f54bc4
EH
3496 const char *vendor;
3497 char host_vendor[CPUID_VENDOR_SZ + 1];
e1c224b4 3498 FeatureWord w;
c6dc6f63 3499
f99fd7ca
EH
3500 /*NOTE: any property set by this function should be returned by
3501 * x86_cpu_static_props(), so static expansion of
3502 * query-cpu-model-expansion is always complete.
3503 */
3504
c39c0edf 3505 /* CPU models only set _minimum_ values for level/xlevel: */
709fa704
MAL
3506 object_property_set_uint(OBJECT(cpu), def->level, "min-level", errp);
3507 object_property_set_uint(OBJECT(cpu), def->xlevel, "min-xlevel", errp);
c39c0edf 3508
2d64255b
AF
3509 object_property_set_int(OBJECT(cpu), def->family, "family", errp);
3510 object_property_set_int(OBJECT(cpu), def->model, "model", errp);
3511 object_property_set_int(OBJECT(cpu), def->stepping, "stepping", errp);
2d64255b 3512 object_property_set_str(OBJECT(cpu), def->model_id, "model-id", errp);
e1c224b4
EH
3513 for (w = 0; w < FEATURE_WORDS; w++) {
3514 env->features[w] = def->features[w];
3515 }
82beb536 3516
a9f27ea9
EH
3517 /* legacy-cache defaults to 'off' if CPU model provides cache info */
3518 cpu->legacy_cache = !def->cache_info;
ab8f992e 3519
9576de75 3520 /* Special cases not set in the X86CPUDefinition structs: */
d6dcc558 3521 /* TODO: in-kernel irqchip for hvf */
82beb536 3522 if (kvm_enabled()) {
492a4c94
LT
3523 if (!kvm_irqchip_in_kernel()) {
3524 x86_cpu_change_kvm_default("x2apic", "off");
3525 }
3526
5114e842 3527 x86_cpu_apply_props(cpu, kvm_default_props);
04d99c3c
EH
3528 } else if (tcg_enabled()) {
3529 x86_cpu_apply_props(cpu, tcg_default_props);
82beb536 3530 }
5fcca9ff 3531
82beb536 3532 env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR;
7c08db30
EH
3533
3534 /* sysenter isn't supported in compatibility mode on AMD,
3535 * syscall isn't supported in compatibility mode on Intel.
3536 * Normally we advertise the actual CPU vendor, but you can
3537 * override this using the 'vendor' property if you want to use
3538 * KVM's sysenter/syscall emulation in compatibility mode and
3539 * when doing cross vendor migration
3540 */
74f54bc4 3541 vendor = def->vendor;
d6dcc558 3542 if (accel_uses_host_cpuid()) {
7c08db30
EH
3543 uint32_t ebx = 0, ecx = 0, edx = 0;
3544 host_cpuid(0, 0, NULL, &ebx, &ecx, &edx);
3545 x86_cpu_vendor_words2str(host_vendor, ebx, edx, ecx);
3546 vendor = host_vendor;
3547 }
3548
3549 object_property_set_str(OBJECT(cpu), vendor, "vendor", errp);
3550
c6dc6f63
AP
3551}
3552
f99fd7ca
EH
3553/* Return a QDict containing keys for all properties that can be included
3554 * in static expansion of CPU models. All properties set by x86_cpu_load_def()
3555 * must be included in the dictionary.
3556 */
3557static QDict *x86_cpu_static_props(void)
3558{
3559 FeatureWord w;
3560 int i;
3561 static const char *props[] = {
3562 "min-level",
3563 "min-xlevel",
3564 "family",
3565 "model",
3566 "stepping",
3567 "model-id",
3568 "vendor",
3569 "lmce",
3570 NULL,
3571 };
3572 static QDict *d;
3573
3574 if (d) {
3575 return d;
3576 }
3577
3578 d = qdict_new();
3579 for (i = 0; props[i]; i++) {
0f9afc2a 3580 qdict_put_null(d, props[i]);
f99fd7ca
EH
3581 }
3582
3583 for (w = 0; w < FEATURE_WORDS; w++) {
3584 FeatureWordInfo *fi = &feature_word_info[w];
3585 int bit;
3586 for (bit = 0; bit < 32; bit++) {
3587 if (!fi->feat_names[bit]) {
3588 continue;
3589 }
0f9afc2a 3590 qdict_put_null(d, fi->feat_names[bit]);
f99fd7ca
EH
3591 }
3592 }
3593
3594 return d;
3595}
3596
3597/* Add an entry to @props dict, with the value for property. */
3598static void x86_cpu_expand_prop(X86CPU *cpu, QDict *props, const char *prop)
3599{
3600 QObject *value = object_property_get_qobject(OBJECT(cpu), prop,
3601 &error_abort);
3602
3603 qdict_put_obj(props, prop, value);
3604}
3605
3606/* Convert CPU model data from X86CPU object to a property dictionary
3607 * that can recreate exactly the same CPU model.
3608 */
3609static void x86_cpu_to_dict(X86CPU *cpu, QDict *props)
3610{
3611 QDict *sprops = x86_cpu_static_props();
3612 const QDictEntry *e;
3613
3614 for (e = qdict_first(sprops); e; e = qdict_next(sprops, e)) {
3615 const char *prop = qdict_entry_key(e);
3616 x86_cpu_expand_prop(cpu, props, prop);
3617 }
3618}
3619
b8097deb
EH
3620/* Convert CPU model data from X86CPU object to a property dictionary
3621 * that can recreate exactly the same CPU model, including every
3622 * writeable QOM property.
3623 */
3624static void x86_cpu_to_dict_full(X86CPU *cpu, QDict *props)
3625{
3626 ObjectPropertyIterator iter;
3627 ObjectProperty *prop;
3628
3629 object_property_iter_init(&iter, OBJECT(cpu));
3630 while ((prop = object_property_iter_next(&iter))) {
3631 /* skip read-only or write-only properties */
3632 if (!prop->get || !prop->set) {
3633 continue;
3634 }
3635
3636 /* "hotplugged" is the only property that is configurable
3637 * on the command-line but will be set differently on CPUs
3638 * created using "-cpu ... -smp ..." and by CPUs created
3639 * on the fly by x86_cpu_from_model() for querying. Skip it.
3640 */
3641 if (!strcmp(prop->name, "hotplugged")) {
3642 continue;
3643 }
3644 x86_cpu_expand_prop(cpu, props, prop->name);
3645 }
3646}
3647
f99fd7ca
EH
3648static void object_apply_props(Object *obj, QDict *props, Error **errp)
3649{
3650 const QDictEntry *prop;
3651 Error *err = NULL;
3652
3653 for (prop = qdict_first(props); prop; prop = qdict_next(props, prop)) {
3654 object_property_set_qobject(obj, qdict_entry_value(prop),
3655 qdict_entry_key(prop), &err);
3656 if (err) {
3657 break;
3658 }
3659 }
3660
3661 error_propagate(errp, err);
3662}
3663
3664/* Create X86CPU object according to model+props specification */
3665static X86CPU *x86_cpu_from_model(const char *model, QDict *props, Error **errp)
3666{
3667 X86CPU *xc = NULL;
3668 X86CPUClass *xcc;
3669 Error *err = NULL;
3670
3671 xcc = X86_CPU_CLASS(cpu_class_by_name(TYPE_X86_CPU, model));
3672 if (xcc == NULL) {
3673 error_setg(&err, "CPU model '%s' not found", model);
3674 goto out;
3675 }
3676
3677 xc = X86_CPU(object_new(object_class_get_name(OBJECT_CLASS(xcc))));
3678 if (props) {
3679 object_apply_props(OBJECT(xc), props, &err);
3680 if (err) {
3681 goto out;
3682 }
3683 }
3684
3685 x86_cpu_expand_features(xc, &err);
3686 if (err) {
3687 goto out;
3688 }
3689
3690out:
3691 if (err) {
3692 error_propagate(errp, err);
3693 object_unref(OBJECT(xc));
3694 xc = NULL;
3695 }
3696 return xc;
3697}
3698
3699CpuModelExpansionInfo *
3700arch_query_cpu_model_expansion(CpuModelExpansionType type,
3701 CpuModelInfo *model,
3702 Error **errp)
3703{
3704 X86CPU *xc = NULL;
3705 Error *err = NULL;
3706 CpuModelExpansionInfo *ret = g_new0(CpuModelExpansionInfo, 1);
3707 QDict *props = NULL;
3708 const char *base_name;
3709
3710 xc = x86_cpu_from_model(model->name,
3711 model->has_props ?
7dc847eb 3712 qobject_to(QDict, model->props) :
f99fd7ca
EH
3713 NULL, &err);
3714 if (err) {
3715 goto out;
3716 }
3717
b8097deb 3718 props = qdict_new();
f99fd7ca
EH
3719
3720 switch (type) {
3721 case CPU_MODEL_EXPANSION_TYPE_STATIC:
3722 /* Static expansion will be based on "base" only */
3723 base_name = "base";
b8097deb 3724 x86_cpu_to_dict(xc, props);
f99fd7ca
EH
3725 break;
3726 case CPU_MODEL_EXPANSION_TYPE_FULL:
3727 /* As we don't return every single property, full expansion needs
3728 * to keep the original model name+props, and add extra
3729 * properties on top of that.
3730 */
3731 base_name = model->name;
b8097deb 3732 x86_cpu_to_dict_full(xc, props);
f99fd7ca
EH
3733 break;
3734 default:
3735 error_setg(&err, "Unsupportted expansion type");
3736 goto out;
3737 }
3738
3739 if (!props) {
3740 props = qdict_new();
3741 }
3742 x86_cpu_to_dict(xc, props);
3743
3744 ret->model = g_new0(CpuModelInfo, 1);
3745 ret->model->name = g_strdup(base_name);
3746 ret->model->props = QOBJECT(props);
3747 ret->model->has_props = true;
3748
3749out:
3750 object_unref(OBJECT(xc));
3751 if (err) {
3752 error_propagate(errp, err);
3753 qapi_free_CpuModelExpansionInfo(ret);
3754 ret = NULL;
3755 }
3756 return ret;
3757}
3758
00fcd100
AB
3759static gchar *x86_gdb_arch_name(CPUState *cs)
3760{
3761#ifdef TARGET_X86_64
3762 return g_strdup("i386:x86-64");
3763#else
3764 return g_strdup("i386");
3765#endif
3766}
3767
d940ee9b
EH
3768static void x86_cpu_cpudef_class_init(ObjectClass *oc, void *data)
3769{
3770 X86CPUDefinition *cpudef = data;
3771 X86CPUClass *xcc = X86_CPU_CLASS(oc);
3772
3773 xcc->cpu_def = cpudef;
bd72159d 3774 xcc->migration_safe = true;
d940ee9b
EH
3775}
3776
3777static void x86_register_cpudef_type(X86CPUDefinition *def)
3778{
3779 char *typename = x86_cpu_type_name(def->name);
3780 TypeInfo ti = {
3781 .name = typename,
3782 .parent = TYPE_X86_CPU,
3783 .class_init = x86_cpu_cpudef_class_init,
3784 .class_data = def,
3785 };
3786
2a923a29
EH
3787 /* AMD aliases are handled at runtime based on CPUID vendor, so
3788 * they shouldn't be set on the CPU model table.
3789 */
3790 assert(!(def->features[FEAT_8000_0001_EDX] & CPUID_EXT2_AMD_ALIASES));
807e9869
EH
3791 /* catch mistakes instead of silently truncating model_id when too long */
3792 assert(def->model_id && strlen(def->model_id) <= 48);
3793
2a923a29 3794
d940ee9b
EH
3795 type_register(&ti);
3796 g_free(typename);
3797}
3798
c6dc6f63 3799#if !defined(CONFIG_USER_ONLY)
c6dc6f63 3800
0e26b7b8
BS
3801void cpu_clear_apic_feature(CPUX86State *env)
3802{
0514ef2f 3803 env->features[FEAT_1_EDX] &= ~CPUID_APIC;
0e26b7b8
BS
3804}
3805
c6dc6f63
AP
3806#endif /* !CONFIG_USER_ONLY */
3807
c6dc6f63
AP
3808void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
3809 uint32_t *eax, uint32_t *ebx,
3810 uint32_t *ecx, uint32_t *edx)
3811{
a60f24b5
AF
3812 X86CPU *cpu = x86_env_get_cpu(env);
3813 CPUState *cs = CPU(cpu);
14c985cf 3814 uint32_t pkg_offset;
4ed3d478 3815 uint32_t limit;
1ce36bfe 3816 uint32_t signature[3];
a60f24b5 3817
4ed3d478
DB
3818 /* Calculate & apply limits for different index ranges */
3819 if (index >= 0xC0000000) {
3820 limit = env->cpuid_xlevel2;
3821 } else if (index >= 0x80000000) {
3822 limit = env->cpuid_xlevel;
1ce36bfe
DB
3823 } else if (index >= 0x40000000) {
3824 limit = 0x40000001;
c6dc6f63 3825 } else {
4ed3d478
DB
3826 limit = env->cpuid_level;
3827 }
3828
3829 if (index > limit) {
3830 /* Intel documentation states that invalid EAX input will
3831 * return the same information as EAX=cpuid_level
3832 * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID)
3833 */
3834 index = env->cpuid_level;
c6dc6f63
AP
3835 }
3836
3837 switch(index) {
3838 case 0:
3839 *eax = env->cpuid_level;
5eb2f7a4
EH
3840 *ebx = env->cpuid_vendor1;
3841 *edx = env->cpuid_vendor2;
3842 *ecx = env->cpuid_vendor3;
c6dc6f63
AP
3843 break;
3844 case 1:
3845 *eax = env->cpuid_version;
7e72a45c
EH
3846 *ebx = (cpu->apic_id << 24) |
3847 8 << 8; /* CLFLUSH size in quad words, Linux wants it. */
0514ef2f 3848 *ecx = env->features[FEAT_1_ECX];
19dc85db
RH
3849 if ((*ecx & CPUID_EXT_XSAVE) && (env->cr[4] & CR4_OSXSAVE_MASK)) {
3850 *ecx |= CPUID_EXT_OSXSAVE;
3851 }
0514ef2f 3852 *edx = env->features[FEAT_1_EDX];
ce3960eb
AF
3853 if (cs->nr_cores * cs->nr_threads > 1) {
3854 *ebx |= (cs->nr_cores * cs->nr_threads) << 16;
19dc85db 3855 *edx |= CPUID_HT;
c6dc6f63
AP
3856 }
3857 break;
3858 case 2:
3859 /* cache info: needed for Pentium Pro compatibility */
787aaf57
BC
3860 if (cpu->cache_info_passthrough) {
3861 host_cpuid(index, 0, eax, ebx, ecx, edx);
3862 break;
3863 }
5e891bf8 3864 *eax = 1; /* Number of CPUID[EAX=2] calls required */
c6dc6f63 3865 *ebx = 0;
14c985cf
LM
3866 if (!cpu->enable_l3_cache) {
3867 *ecx = 0;
3868 } else {
a9f27ea9 3869 *ecx = cpuid2_cache_descriptor(env->cache_info_cpuid2.l3_cache);
14c985cf 3870 }
a9f27ea9
EH
3871 *edx = (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1d_cache) << 16) |
3872 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1i_cache) << 8) |
3873 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l2_cache));
c6dc6f63
AP
3874 break;
3875 case 4:
3876 /* cache info: needed for Core compatibility */
787aaf57
BC
3877 if (cpu->cache_info_passthrough) {
3878 host_cpuid(index, count, eax, ebx, ecx, edx);
7e3482f8 3879 /* QEMU gives out its own APIC IDs, never pass down bits 31..26. */
76c2975a 3880 *eax &= ~0xFC000000;
7e3482f8
EH
3881 if ((*eax & 31) && cs->nr_cores > 1) {
3882 *eax |= (cs->nr_cores - 1) << 26;
3883 }
c6dc6f63 3884 } else {
2f7a21c4 3885 *eax = 0;
76c2975a 3886 switch (count) {
c6dc6f63 3887 case 0: /* L1 dcache info */
a9f27ea9
EH
3888 encode_cache_cpuid4(env->cache_info_cpuid4.l1d_cache,
3889 1, cs->nr_cores,
7e3482f8 3890 eax, ebx, ecx, edx);
c6dc6f63
AP
3891 break;
3892 case 1: /* L1 icache info */
a9f27ea9
EH
3893 encode_cache_cpuid4(env->cache_info_cpuid4.l1i_cache,
3894 1, cs->nr_cores,
7e3482f8 3895 eax, ebx, ecx, edx);
c6dc6f63
AP
3896 break;
3897 case 2: /* L2 cache info */
a9f27ea9
EH
3898 encode_cache_cpuid4(env->cache_info_cpuid4.l2_cache,
3899 cs->nr_threads, cs->nr_cores,
7e3482f8 3900 eax, ebx, ecx, edx);
c6dc6f63 3901 break;
14c985cf 3902 case 3: /* L3 cache info */
7e3482f8
EH
3903 pkg_offset = apicid_pkg_offset(cs->nr_cores, cs->nr_threads);
3904 if (cpu->enable_l3_cache) {
a9f27ea9
EH
3905 encode_cache_cpuid4(env->cache_info_cpuid4.l3_cache,
3906 (1 << pkg_offset), cs->nr_cores,
7e3482f8 3907 eax, ebx, ecx, edx);
14c985cf
LM
3908 break;
3909 }
7e3482f8 3910 /* fall through */
c6dc6f63 3911 default: /* end of info */
7e3482f8 3912 *eax = *ebx = *ecx = *edx = 0;
c6dc6f63 3913 break;
76c2975a
PB
3914 }
3915 }
c6dc6f63
AP
3916 break;
3917 case 5:
3918 /* mwait info: needed for Core compatibility */
3919 *eax = 0; /* Smallest monitor-line size in bytes */
3920 *ebx = 0; /* Largest monitor-line size in bytes */
3921 *ecx = CPUID_MWAIT_EMX | CPUID_MWAIT_IBE;
3922 *edx = 0;
3923 break;
3924 case 6:
3925 /* Thermal and Power Leaf */
28b8e4d0 3926 *eax = env->features[FEAT_6_EAX];
c6dc6f63
AP
3927 *ebx = 0;
3928 *ecx = 0;
3929 *edx = 0;
3930 break;
f7911686 3931 case 7:
13526728
EH
3932 /* Structured Extended Feature Flags Enumeration Leaf */
3933 if (count == 0) {
3934 *eax = 0; /* Maximum ECX value for sub-leaves */
0514ef2f 3935 *ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */
f74eefe0 3936 *ecx = env->features[FEAT_7_0_ECX]; /* Feature flags */
0f70ed47
PB
3937 if ((*ecx & CPUID_7_0_ECX_PKU) && env->cr[4] & CR4_PKE_MASK) {
3938 *ecx |= CPUID_7_0_ECX_OSPKE;
3939 }
95ea69fb 3940 *edx = env->features[FEAT_7_0_EDX]; /* Feature flags */
f7911686
YW
3941 } else {
3942 *eax = 0;
3943 *ebx = 0;
3944 *ecx = 0;
3945 *edx = 0;
3946 }
3947 break;
c6dc6f63
AP
3948 case 9:
3949 /* Direct Cache Access Information Leaf */
3950 *eax = 0; /* Bits 0-31 in DCA_CAP MSR */
3951 *ebx = 0;
3952 *ecx = 0;
3953 *edx = 0;
3954 break;
3955 case 0xA:
3956 /* Architectural Performance Monitoring Leaf */
9337e3b6 3957 if (kvm_enabled() && cpu->enable_pmu) {
a60f24b5 3958 KVMState *s = cs->kvm_state;
a0fa8208
GN
3959
3960 *eax = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EAX);
3961 *ebx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EBX);
3962 *ecx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_ECX);
3963 *edx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EDX);
d6dcc558
SAGDR
3964 } else if (hvf_enabled() && cpu->enable_pmu) {
3965 *eax = hvf_get_supported_cpuid(0xA, count, R_EAX);
3966 *ebx = hvf_get_supported_cpuid(0xA, count, R_EBX);
3967 *ecx = hvf_get_supported_cpuid(0xA, count, R_ECX);
3968 *edx = hvf_get_supported_cpuid(0xA, count, R_EDX);
a0fa8208
GN
3969 } else {
3970 *eax = 0;
3971 *ebx = 0;
3972 *ecx = 0;
3973 *edx = 0;
3974 }
c6dc6f63 3975 break;
5232d00a
RK
3976 case 0xB:
3977 /* Extended Topology Enumeration Leaf */
3978 if (!cpu->enable_cpuid_0xb) {
3979 *eax = *ebx = *ecx = *edx = 0;
3980 break;
3981 }
3982
3983 *ecx = count & 0xff;
3984 *edx = cpu->apic_id;
3985
3986 switch (count) {
3987 case 0:
eab60fb9
MAL
3988 *eax = apicid_core_offset(cs->nr_cores, cs->nr_threads);
3989 *ebx = cs->nr_threads;
5232d00a
RK
3990 *ecx |= CPUID_TOPOLOGY_LEVEL_SMT;
3991 break;
3992 case 1:
eab60fb9
MAL
3993 *eax = apicid_pkg_offset(cs->nr_cores, cs->nr_threads);
3994 *ebx = cs->nr_cores * cs->nr_threads;
5232d00a
RK
3995 *ecx |= CPUID_TOPOLOGY_LEVEL_CORE;
3996 break;
3997 default:
3998 *eax = 0;
3999 *ebx = 0;
4000 *ecx |= CPUID_TOPOLOGY_LEVEL_INVALID;
4001 }
4002
4003 assert(!(*eax & ~0x1f));
4004 *ebx &= 0xffff; /* The count doesn't need to be reliable. */
4005 break;
2560f19f 4006 case 0xD: {
51e49430 4007 /* Processor Extended State */
2560f19f
PB
4008 *eax = 0;
4009 *ebx = 0;
4010 *ecx = 0;
4011 *edx = 0;
19dc85db 4012 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
51e49430
SY
4013 break;
4014 }
4928cd6d 4015
2560f19f 4016 if (count == 0) {
96193c22
EH
4017 *ecx = xsave_area_size(x86_cpu_xsave_components(cpu));
4018 *eax = env->features[FEAT_XSAVE_COMP_LO];
4019 *edx = env->features[FEAT_XSAVE_COMP_HI];
2560f19f
PB
4020 *ebx = *ecx;
4021 } else if (count == 1) {
0bb0b2d2 4022 *eax = env->features[FEAT_XSAVE];
f4f1110e 4023 } else if (count < ARRAY_SIZE(x86_ext_save_areas)) {
96193c22
EH
4024 if ((x86_cpu_xsave_components(cpu) >> count) & 1) {
4025 const ExtSaveArea *esa = &x86_ext_save_areas[count];
33f373d7
LJ
4026 *eax = esa->size;
4027 *ebx = esa->offset;
2560f19f 4028 }
51e49430
SY
4029 }
4030 break;
2560f19f 4031 }
e37a5c7f
CP
4032 case 0x14: {
4033 /* Intel Processor Trace Enumeration */
4034 *eax = 0;
4035 *ebx = 0;
4036 *ecx = 0;
4037 *edx = 0;
4038 if (!(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) ||
4039 !kvm_enabled()) {
4040 break;
4041 }
4042
4043 if (count == 0) {
4044 *eax = INTEL_PT_MAX_SUBLEAF;
4045 *ebx = INTEL_PT_MINIMAL_EBX;
4046 *ecx = INTEL_PT_MINIMAL_ECX;
4047 } else if (count == 1) {
4048 *eax = INTEL_PT_MTC_BITMAP | INTEL_PT_ADDR_RANGES_NUM;
4049 *ebx = INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP;
4050 }
4051 break;
4052 }
1ce36bfe
DB
4053 case 0x40000000:
4054 /*
4055 * CPUID code in kvm_arch_init_vcpu() ignores stuff
4056 * set here, but we restrict to TCG none the less.
4057 */
4058 if (tcg_enabled() && cpu->expose_tcg) {
4059 memcpy(signature, "TCGTCGTCGTCG", 12);
4060 *eax = 0x40000001;
4061 *ebx = signature[0];
4062 *ecx = signature[1];
4063 *edx = signature[2];
4064 } else {
4065 *eax = 0;
4066 *ebx = 0;
4067 *ecx = 0;
4068 *edx = 0;
4069 }
4070 break;
4071 case 0x40000001:
4072 *eax = 0;
4073 *ebx = 0;
4074 *ecx = 0;
4075 *edx = 0;
4076 break;
c6dc6f63
AP
4077 case 0x80000000:
4078 *eax = env->cpuid_xlevel;
4079 *ebx = env->cpuid_vendor1;
4080 *edx = env->cpuid_vendor2;
4081 *ecx = env->cpuid_vendor3;
4082 break;
4083 case 0x80000001:
4084 *eax = env->cpuid_version;
4085 *ebx = 0;
0514ef2f
EH
4086 *ecx = env->features[FEAT_8000_0001_ECX];
4087 *edx = env->features[FEAT_8000_0001_EDX];
c6dc6f63
AP
4088
4089 /* The Linux kernel checks for the CMPLegacy bit and
4090 * discards multiple thread information if it is set.
cb8d4c8f 4091 * So don't set it here for Intel to make Linux guests happy.
c6dc6f63 4092 */
ce3960eb 4093 if (cs->nr_cores * cs->nr_threads > 1) {
5eb2f7a4
EH
4094 if (env->cpuid_vendor1 != CPUID_VENDOR_INTEL_1 ||
4095 env->cpuid_vendor2 != CPUID_VENDOR_INTEL_2 ||
4096 env->cpuid_vendor3 != CPUID_VENDOR_INTEL_3) {
c6dc6f63
AP
4097 *ecx |= 1 << 1; /* CmpLegacy bit */
4098 }
4099 }
c6dc6f63
AP
4100 break;
4101 case 0x80000002:
4102 case 0x80000003:
4103 case 0x80000004:
4104 *eax = env->cpuid_model[(index - 0x80000002) * 4 + 0];
4105 *ebx = env->cpuid_model[(index - 0x80000002) * 4 + 1];
4106 *ecx = env->cpuid_model[(index - 0x80000002) * 4 + 2];
4107 *edx = env->cpuid_model[(index - 0x80000002) * 4 + 3];
4108 break;
4109 case 0x80000005:
4110 /* cache info (L1 cache) */
787aaf57
BC
4111 if (cpu->cache_info_passthrough) {
4112 host_cpuid(index, 0, eax, ebx, ecx, edx);
4113 break;
4114 }
5e891bf8
EH
4115 *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) | \
4116 (L1_ITLB_2M_ASSOC << 8) | (L1_ITLB_2M_ENTRIES);
4117 *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) | \
4118 (L1_ITLB_4K_ASSOC << 8) | (L1_ITLB_4K_ENTRIES);
a9f27ea9
EH
4119 *ecx = encode_cache_cpuid80000005(env->cache_info_amd.l1d_cache);
4120 *edx = encode_cache_cpuid80000005(env->cache_info_amd.l1i_cache);
c6dc6f63
AP
4121 break;
4122 case 0x80000006:
4123 /* cache info (L2 cache) */
787aaf57
BC
4124 if (cpu->cache_info_passthrough) {
4125 host_cpuid(index, 0, eax, ebx, ecx, edx);
4126 break;
4127 }
5e891bf8
EH
4128 *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) | \
4129 (L2_DTLB_2M_ENTRIES << 16) | \
4130 (AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) | \
4131 (L2_ITLB_2M_ENTRIES);
4132 *ebx = (AMD_ENC_ASSOC(L2_DTLB_4K_ASSOC) << 28) | \
4133 (L2_DTLB_4K_ENTRIES << 16) | \
4134 (AMD_ENC_ASSOC(L2_ITLB_4K_ASSOC) << 12) | \
4135 (L2_ITLB_4K_ENTRIES);
a9f27ea9
EH
4136 encode_cache_cpuid80000006(env->cache_info_amd.l2_cache,
4137 cpu->enable_l3_cache ?
4138 env->cache_info_amd.l3_cache : NULL,
4139 ecx, edx);
c6dc6f63 4140 break;
303752a9
MT
4141 case 0x80000007:
4142 *eax = 0;
4143 *ebx = 0;
4144 *ecx = 0;
4145 *edx = env->features[FEAT_8000_0007_EDX];
4146 break;
c6dc6f63
AP
4147 case 0x80000008:
4148 /* virtual & phys address size in low 2 bytes. */
0514ef2f 4149 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
6c7c3c21
KS
4150 /* 64 bit processor */
4151 *eax = cpu->phys_bits; /* configurable physical bits */
4152 if (env->features[FEAT_7_0_ECX] & CPUID_7_0_ECX_LA57) {
4153 *eax |= 0x00003900; /* 57 bits virtual */
4154 } else {
4155 *eax |= 0x00003000; /* 48 bits virtual */
4156 }
c6dc6f63 4157 } else {
af45907a 4158 *eax = cpu->phys_bits;
c6dc6f63 4159 }
1b3420e1 4160 *ebx = env->features[FEAT_8000_0008_EBX];
c6dc6f63
AP
4161 *ecx = 0;
4162 *edx = 0;
ce3960eb
AF
4163 if (cs->nr_cores * cs->nr_threads > 1) {
4164 *ecx |= (cs->nr_cores * cs->nr_threads) - 1;
c6dc6f63
AP
4165 }
4166 break;
4167 case 0x8000000A:
0514ef2f 4168 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
9f3fb565
EH
4169 *eax = 0x00000001; /* SVM Revision */
4170 *ebx = 0x00000010; /* nr of ASIDs */
4171 *ecx = 0;
0514ef2f 4172 *edx = env->features[FEAT_SVM]; /* optional features */
9f3fb565
EH
4173 } else {
4174 *eax = 0;
4175 *ebx = 0;
4176 *ecx = 0;
4177 *edx = 0;
4178 }
c6dc6f63 4179 break;
8f4202fb
BM
4180 case 0x8000001D:
4181 *eax = 0;
4182 switch (count) {
4183 case 0: /* L1 dcache info */
4184 encode_cache_cpuid8000001d(env->cache_info_amd.l1d_cache, cs,
4185 eax, ebx, ecx, edx);
4186 break;
4187 case 1: /* L1 icache info */
4188 encode_cache_cpuid8000001d(env->cache_info_amd.l1i_cache, cs,
4189 eax, ebx, ecx, edx);
4190 break;
4191 case 2: /* L2 cache info */
4192 encode_cache_cpuid8000001d(env->cache_info_amd.l2_cache, cs,
4193 eax, ebx, ecx, edx);
4194 break;
4195 case 3: /* L3 cache info */
4196 encode_cache_cpuid8000001d(env->cache_info_amd.l3_cache, cs,
4197 eax, ebx, ecx, edx);
4198 break;
4199 default: /* end of info */
4200 *eax = *ebx = *ecx = *edx = 0;
4201 break;
4202 }
4203 break;
ed78467a
BM
4204 case 0x8000001E:
4205 assert(cpu->core_id <= 255);
4206 encode_topo_cpuid8000001e(cs, cpu,
4207 eax, ebx, ecx, edx);
4208 break;
b3baa152
BW
4209 case 0xC0000000:
4210 *eax = env->cpuid_xlevel2;
4211 *ebx = 0;
4212 *ecx = 0;
4213 *edx = 0;
4214 break;
4215 case 0xC0000001:
4216 /* Support for VIA CPU's CPUID instruction */
4217 *eax = env->cpuid_version;
4218 *ebx = 0;
4219 *ecx = 0;
0514ef2f 4220 *edx = env->features[FEAT_C000_0001_EDX];
b3baa152
BW
4221 break;
4222 case 0xC0000002:
4223 case 0xC0000003:
4224 case 0xC0000004:
4225 /* Reserved for the future, and now filled with zero */
4226 *eax = 0;
4227 *ebx = 0;
4228 *ecx = 0;
4229 *edx = 0;
4230 break;
6cb8f2a6
BS
4231 case 0x8000001F:
4232 *eax = sev_enabled() ? 0x2 : 0;
4233 *ebx = sev_get_cbit_position();
4234 *ebx |= sev_get_reduced_phys_bits() << 6;
4235 *ecx = 0;
4236 *edx = 0;
4237 break;
c6dc6f63
AP
4238 default:
4239 /* reserved values: zero */
4240 *eax = 0;
4241 *ebx = 0;
4242 *ecx = 0;
4243 *edx = 0;
4244 break;
4245 }
4246}
5fd2087a
AF
4247
4248/* CPUClass::reset() */
4249static void x86_cpu_reset(CPUState *s)
4250{
4251 X86CPU *cpu = X86_CPU(s);
4252 X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu);
4253 CPUX86State *env = &cpu->env;
a114d25d
RH
4254 target_ulong cr4;
4255 uint64_t xcr0;
c1958aea
AF
4256 int i;
4257
5fd2087a
AF
4258 xcc->parent_reset(s);
4259
5e992a8e 4260 memset(env, 0, offsetof(CPUX86State, end_reset_fields));
c1958aea 4261
c1958aea
AF
4262 env->old_exception = -1;
4263
4264 /* init to reset state */
4265
c1958aea
AF
4266 env->hflags2 |= HF2_GIF_MASK;
4267
4268 cpu_x86_update_cr0(env, 0x60000010);
4269 env->a20_mask = ~0x0;
4270 env->smbase = 0x30000;
e13713db 4271 env->msr_smi_count = 0;
c1958aea
AF
4272
4273 env->idt.limit = 0xffff;
4274 env->gdt.limit = 0xffff;
4275 env->ldt.limit = 0xffff;
4276 env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT);
4277 env->tr.limit = 0xffff;
4278 env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT);
4279
4280 cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff,
4281 DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK |
4282 DESC_R_MASK | DESC_A_MASK);
4283 cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff,
4284 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
4285 DESC_A_MASK);
4286 cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff,
4287 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
4288 DESC_A_MASK);
4289 cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff,
4290 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
4291 DESC_A_MASK);
4292 cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff,
4293 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
4294 DESC_A_MASK);
4295 cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff,
4296 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
4297 DESC_A_MASK);
4298
4299 env->eip = 0xfff0;
4300 env->regs[R_EDX] = env->cpuid_version;
4301
4302 env->eflags = 0x2;
4303
4304 /* FPU init */
4305 for (i = 0; i < 8; i++) {
4306 env->fptags[i] = 1;
4307 }
5bde1407 4308 cpu_set_fpuc(env, 0x37f);
c1958aea
AF
4309
4310 env->mxcsr = 0x1f80;
a114d25d
RH
4311 /* All units are in INIT state. */
4312 env->xstate_bv = 0;
c1958aea
AF
4313
4314 env->pat = 0x0007040600070406ULL;
4315 env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT;
4316
4317 memset(env->dr, 0, sizeof(env->dr));
4318 env->dr[6] = DR6_FIXED_1;
4319 env->dr[7] = DR7_FIXED_1;
b3310ab3 4320 cpu_breakpoint_remove_all(s, BP_CPU);
75a34036 4321 cpu_watchpoint_remove_all(s, BP_CPU);
dd673288 4322
a114d25d 4323 cr4 = 0;
cfc3b074 4324 xcr0 = XSTATE_FP_MASK;
a114d25d
RH
4325
4326#ifdef CONFIG_USER_ONLY
4327 /* Enable all the features for user-mode. */
4328 if (env->features[FEAT_1_EDX] & CPUID_SSE) {
cfc3b074 4329 xcr0 |= XSTATE_SSE_MASK;
a114d25d 4330 }
0f70ed47
PB
4331 for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
4332 const ExtSaveArea *esa = &x86_ext_save_areas[i];
9646f492 4333 if (env->features[esa->feature] & esa->bits) {
0f70ed47
PB
4334 xcr0 |= 1ull << i;
4335 }
a114d25d 4336 }
0f70ed47 4337
a114d25d
RH
4338 if (env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE) {
4339 cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK;
4340 }
07929f2a
RH
4341 if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_FSGSBASE) {
4342 cr4 |= CR4_FSGSBASE_MASK;
4343 }
a114d25d
RH
4344#endif
4345
4346 env->xcr0 = xcr0;
4347 cpu_x86_update_cr4(env, cr4);
0522604b 4348
9db2efd9
AW
4349 /*
4350 * SDM 11.11.5 requires:
4351 * - IA32_MTRR_DEF_TYPE MSR.E = 0
4352 * - IA32_MTRR_PHYSMASKn.V = 0
4353 * All other bits are undefined. For simplification, zero it all.
4354 */
4355 env->mtrr_deftype = 0;
4356 memset(env->mtrr_var, 0, sizeof(env->mtrr_var));
4357 memset(env->mtrr_fixed, 0, sizeof(env->mtrr_fixed));
4358
b7394c83
SAGDR
4359 env->interrupt_injected = -1;
4360 env->exception_injected = -1;
4361 env->nmi_injected = false;
dd673288
IM
4362#if !defined(CONFIG_USER_ONLY)
4363 /* We hard-wire the BSP to the first CPU. */
9cb11fd7 4364 apic_designate_bsp(cpu->apic_state, s->cpu_index == 0);
dd673288 4365
259186a7 4366 s->halted = !cpu_is_bsp(cpu);
50a2c6e5
PB
4367
4368 if (kvm_enabled()) {
4369 kvm_arch_reset_vcpu(cpu);
4370 }
d6dcc558
SAGDR
4371 else if (hvf_enabled()) {
4372 hvf_reset_vcpu(s);
4373 }
dd673288 4374#endif
5fd2087a
AF
4375}
4376
dd673288
IM
4377#ifndef CONFIG_USER_ONLY
4378bool cpu_is_bsp(X86CPU *cpu)
4379{
02e51483 4380 return cpu_get_apic_base(cpu->apic_state) & MSR_IA32_APICBASE_BSP;
dd673288 4381}
65dee380
IM
4382
4383/* TODO: remove me, when reset over QOM tree is implemented */
4384static void x86_cpu_machine_reset_cb(void *opaque)
4385{
4386 X86CPU *cpu = opaque;
4387 cpu_reset(CPU(cpu));
4388}
dd673288
IM
4389#endif
4390
de024815
AF
4391static void mce_init(X86CPU *cpu)
4392{
4393 CPUX86State *cenv = &cpu->env;
4394 unsigned int bank;
4395
4396 if (((cenv->cpuid_version >> 8) & 0xf) >= 6
0514ef2f 4397 && (cenv->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) ==
de024815 4398 (CPUID_MCE | CPUID_MCA)) {
87f8b626
AR
4399 cenv->mcg_cap = MCE_CAP_DEF | MCE_BANKS_DEF |
4400 (cpu->enable_lmce ? MCG_LMCE_P : 0);
de024815
AF
4401 cenv->mcg_ctl = ~(uint64_t)0;
4402 for (bank = 0; bank < MCE_BANKS_DEF; bank++) {
4403 cenv->mce_banks[bank * 4] = ~(uint64_t)0;
4404 }
4405 }
4406}
4407
bdeec802 4408#ifndef CONFIG_USER_ONLY
2f114315 4409APICCommonClass *apic_get_class(void)
bdeec802 4410{
bdeec802
IM
4411 const char *apic_type = "apic";
4412
d6dcc558 4413 /* TODO: in-kernel irqchip for hvf */
15eafc2e 4414 if (kvm_apic_in_kernel()) {
bdeec802
IM
4415 apic_type = "kvm-apic";
4416 } else if (xen_enabled()) {
4417 apic_type = "xen-apic";
4418 }
4419
2f114315
RK
4420 return APIC_COMMON_CLASS(object_class_by_name(apic_type));
4421}
4422
4423static void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
4424{
4425 APICCommonState *apic;
4426 ObjectClass *apic_class = OBJECT_CLASS(apic_get_class());
4427
4428 cpu->apic_state = DEVICE(object_new(object_class_get_name(apic_class)));
bdeec802 4429
6816b1b3
IM
4430 object_property_add_child(OBJECT(cpu), "lapic",
4431 OBJECT(cpu->apic_state), &error_abort);
67e55caa 4432 object_unref(OBJECT(cpu->apic_state));
6816b1b3 4433
33d7a288 4434 qdev_prop_set_uint32(cpu->apic_state, "id", cpu->apic_id);
bdeec802 4435 /* TODO: convert to link<> */
02e51483 4436 apic = APIC_COMMON(cpu->apic_state);
60671e58 4437 apic->cpu = cpu;
8d42d2d3 4438 apic->apicbase = APIC_DEFAULT_ADDRESS | MSR_IA32_APICBASE_ENABLE;
d3c64d6a
IM
4439}
4440
4441static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
4442{
8d42d2d3
CF
4443 APICCommonState *apic;
4444 static bool apic_mmio_map_once;
4445
02e51483 4446 if (cpu->apic_state == NULL) {
d3c64d6a
IM
4447 return;
4448 }
6e8e2651
MA
4449 object_property_set_bool(OBJECT(cpu->apic_state), true, "realized",
4450 errp);
8d42d2d3
CF
4451
4452 /* Map APIC MMIO area */
4453 apic = APIC_COMMON(cpu->apic_state);
4454 if (!apic_mmio_map_once) {
4455 memory_region_add_subregion_overlap(get_system_memory(),
4456 apic->apicbase &
4457 MSR_IA32_APICBASE_BASE,
4458 &apic->io_memory,
4459 0x1000);
4460 apic_mmio_map_once = true;
4461 }
bdeec802 4462}
f809c605
PB
4463
4464static void x86_cpu_machine_done(Notifier *n, void *unused)
4465{
4466 X86CPU *cpu = container_of(n, X86CPU, machine_done);
4467 MemoryRegion *smram =
4468 (MemoryRegion *) object_resolve_path("/machine/smram", NULL);
4469
4470 if (smram) {
4471 cpu->smram = g_new(MemoryRegion, 1);
4472 memory_region_init_alias(cpu->smram, OBJECT(cpu), "smram",
4473 smram, 0, 1ull << 32);
f8c45c65 4474 memory_region_set_enabled(cpu->smram, true);
f809c605
PB
4475 memory_region_add_subregion_overlap(cpu->cpu_as_root, 0, cpu->smram, 1);
4476 }
4477}
d3c64d6a
IM
4478#else
4479static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
4480{
4481}
bdeec802
IM
4482#endif
4483
11f6fee5
DDAG
4484/* Note: Only safe for use on x86(-64) hosts */
4485static uint32_t x86_host_phys_bits(void)
4486{
4487 uint32_t eax;
4488 uint32_t host_phys_bits;
4489
4490 host_cpuid(0x80000000, 0, &eax, NULL, NULL, NULL);
4491 if (eax >= 0x80000008) {
4492 host_cpuid(0x80000008, 0, &eax, NULL, NULL, NULL);
4493 /* Note: According to AMD doc 25481 rev 2.34 they have a field
4494 * at 23:16 that can specify a maximum physical address bits for
4495 * the guest that can override this value; but I've not seen
4496 * anything with that set.
4497 */
4498 host_phys_bits = eax & 0xff;
4499 } else {
4500 /* It's an odd 64 bit machine that doesn't have the leaf for
4501 * physical address bits; fall back to 36 that's most older
4502 * Intel.
4503 */
4504 host_phys_bits = 36;
4505 }
4506
4507 return host_phys_bits;
4508}
e48638fd 4509
c39c0edf
EH
4510static void x86_cpu_adjust_level(X86CPU *cpu, uint32_t *min, uint32_t value)
4511{
4512 if (*min < value) {
4513 *min = value;
4514 }
4515}
4516
4517/* Increase cpuid_min_{level,xlevel,xlevel2} automatically, if appropriate */
4518static void x86_cpu_adjust_feat_level(X86CPU *cpu, FeatureWord w)
4519{
4520 CPUX86State *env = &cpu->env;
4521 FeatureWordInfo *fi = &feature_word_info[w];
4522 uint32_t eax = fi->cpuid_eax;
4523 uint32_t region = eax & 0xF0000000;
4524
4525 if (!env->features[w]) {
4526 return;
4527 }
4528
4529 switch (region) {
4530 case 0x00000000:
4531 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, eax);
4532 break;
4533 case 0x80000000:
4534 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, eax);
4535 break;
4536 case 0xC0000000:
4537 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel2, eax);
4538 break;
4539 }
4540}
4541
2ca8a8be
EH
4542/* Calculate XSAVE components based on the configured CPU feature flags */
4543static void x86_cpu_enable_xsave_components(X86CPU *cpu)
4544{
4545 CPUX86State *env = &cpu->env;
4546 int i;
96193c22 4547 uint64_t mask;
2ca8a8be
EH
4548
4549 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
4550 return;
4551 }
4552
e3c9022b
EH
4553 mask = 0;
4554 for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
2ca8a8be
EH
4555 const ExtSaveArea *esa = &x86_ext_save_areas[i];
4556 if (env->features[esa->feature] & esa->bits) {
96193c22 4557 mask |= (1ULL << i);
2ca8a8be
EH
4558 }
4559 }
4560
96193c22
EH
4561 env->features[FEAT_XSAVE_COMP_LO] = mask;
4562 env->features[FEAT_XSAVE_COMP_HI] = mask >> 32;
2ca8a8be
EH
4563}
4564
b8d834a0
EH
4565/***** Steps involved on loading and filtering CPUID data
4566 *
4567 * When initializing and realizing a CPU object, the steps
4568 * involved in setting up CPUID data are:
4569 *
4570 * 1) Loading CPU model definition (X86CPUDefinition). This is
4571 * implemented by x86_cpu_load_def() and should be completely
4572 * transparent, as it is done automatically by instance_init.
4573 * No code should need to look at X86CPUDefinition structs
4574 * outside instance_init.
4575 *
4576 * 2) CPU expansion. This is done by realize before CPUID
4577 * filtering, and will make sure host/accelerator data is
4578 * loaded for CPU models that depend on host capabilities
4579 * (e.g. "host"). Done by x86_cpu_expand_features().
4580 *
4581 * 3) CPUID filtering. This initializes extra data related to
4582 * CPUID, and checks if the host supports all capabilities
4583 * required by the CPU. Runnability of a CPU model is
4584 * determined at this step. Done by x86_cpu_filter_features().
4585 *
4586 * Some operations don't require all steps to be performed.
4587 * More precisely:
4588 *
4589 * - CPU instance creation (instance_init) will run only CPU
4590 * model loading. CPU expansion can't run at instance_init-time
4591 * because host/accelerator data may be not available yet.
4592 * - CPU realization will perform both CPU model expansion and CPUID
4593 * filtering, and return an error in case one of them fails.
4594 * - query-cpu-definitions needs to run all 3 steps. It needs
4595 * to run CPUID filtering, as the 'unavailable-features'
4596 * field is set based on the filtering results.
4597 * - The query-cpu-model-expansion QMP command only needs to run
4598 * CPU model loading and CPU expansion. It should not filter
4599 * any CPUID data based on host capabilities.
4600 */
4601
4602/* Expand CPU configuration data, based on configured features
4603 * and host/accelerator capabilities when appropriate.
4604 */
4605static void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
7a059953 4606{
b34d12d1 4607 CPUX86State *env = &cpu->env;
dc15c051 4608 FeatureWord w;
2fae0d96 4609 GList *l;
41f3d4d6 4610 Error *local_err = NULL;
9886e834 4611
d4a606b3
EH
4612 /*TODO: Now cpu->max_features doesn't overwrite features
4613 * set using QOM properties, and we can convert
dc15c051
IM
4614 * plus_features & minus_features to global properties
4615 * inside x86_cpu_parse_featurestr() too.
4616 */
44bd8e53 4617 if (cpu->max_features) {
dc15c051 4618 for (w = 0; w < FEATURE_WORDS; w++) {
d4a606b3
EH
4619 /* Override only features that weren't set explicitly
4620 * by the user.
4621 */
4622 env->features[w] |=
4623 x86_cpu_get_supported_feature_word(w, cpu->migratable) &
0d914f39
EH
4624 ~env->user_features[w] & \
4625 ~feature_word_info[w].no_autoenable_flags;
dc15c051
IM
4626 }
4627 }
4628
2fae0d96
EH
4629 for (l = plus_features; l; l = l->next) {
4630 const char *prop = l->data;
4631 object_property_set_bool(OBJECT(cpu), true, prop, &local_err);
4632 if (local_err) {
4633 goto out;
4634 }
4635 }
4636
4637 for (l = minus_features; l; l = l->next) {
4638 const char *prop = l->data;
4639 object_property_set_bool(OBJECT(cpu), false, prop, &local_err);
4640 if (local_err) {
4641 goto out;
4642 }
dc15c051
IM
4643 }
4644
aec661de
EH
4645 if (!kvm_enabled() || !cpu->expose_kvm) {
4646 env->features[FEAT_KVM] = 0;
4647 }
4648
2ca8a8be 4649 x86_cpu_enable_xsave_components(cpu);
c39c0edf
EH
4650
4651 /* CPUID[EAX=7,ECX=0].EBX always increased level automatically: */
4652 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_EBX);
4653 if (cpu->full_cpuid_auto_level) {
4654 x86_cpu_adjust_feat_level(cpu, FEAT_1_EDX);
4655 x86_cpu_adjust_feat_level(cpu, FEAT_1_ECX);
4656 x86_cpu_adjust_feat_level(cpu, FEAT_6_EAX);
4657 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_ECX);
4658 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_EDX);
4659 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_ECX);
4660 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0007_EDX);
1b3420e1 4661 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0008_EBX);
c39c0edf
EH
4662 x86_cpu_adjust_feat_level(cpu, FEAT_C000_0001_EDX);
4663 x86_cpu_adjust_feat_level(cpu, FEAT_SVM);
4664 x86_cpu_adjust_feat_level(cpu, FEAT_XSAVE);
0c3d7c00
EH
4665 /* SVM requires CPUID[0x8000000A] */
4666 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
4667 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000000A);
4668 }
6cb8f2a6
BS
4669
4670 /* SEV requires CPUID[0x8000001F] */
4671 if (sev_enabled()) {
4672 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000001F);
4673 }
c39c0edf
EH
4674 }
4675
4676 /* Set cpuid_*level* based on cpuid_min_*level, if not explicitly set */
4677 if (env->cpuid_level == UINT32_MAX) {
4678 env->cpuid_level = env->cpuid_min_level;
4679 }
4680 if (env->cpuid_xlevel == UINT32_MAX) {
4681 env->cpuid_xlevel = env->cpuid_min_xlevel;
4682 }
4683 if (env->cpuid_xlevel2 == UINT32_MAX) {
4684 env->cpuid_xlevel2 = env->cpuid_min_xlevel2;
b34d12d1 4685 }
7a059953 4686
41f3d4d6
EH
4687out:
4688 if (local_err != NULL) {
4689 error_propagate(errp, local_err);
4690 }
4691}
4692
b8d834a0
EH
4693/*
4694 * Finishes initialization of CPUID data, filters CPU feature
4695 * words based on host availability of each feature.
4696 *
4697 * Returns: 0 if all flags are supported by the host, non-zero otherwise.
4698 */
4699static int x86_cpu_filter_features(X86CPU *cpu)
4700{
4701 CPUX86State *env = &cpu->env;
4702 FeatureWord w;
4703 int rv = 0;
4704
4705 for (w = 0; w < FEATURE_WORDS; w++) {
4706 uint32_t host_feat =
4707 x86_cpu_get_supported_feature_word(w, false);
4708 uint32_t requested_features = env->features[w];
4709 env->features[w] &= host_feat;
4710 cpu->filtered_features[w] = requested_features & ~env->features[w];
4711 if (cpu->filtered_features[w]) {
4712 rv = 1;
4713 }
4714 }
4715
e37a5c7f
CP
4716 if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) &&
4717 kvm_enabled()) {
4718 KVMState *s = CPU(cpu)->kvm_state;
4719 uint32_t eax_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EAX);
4720 uint32_t ebx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EBX);
4721 uint32_t ecx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_ECX);
4722 uint32_t eax_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EAX);
4723 uint32_t ebx_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EBX);
4724
4725 if (!eax_0 ||
4726 ((ebx_0 & INTEL_PT_MINIMAL_EBX) != INTEL_PT_MINIMAL_EBX) ||
4727 ((ecx_0 & INTEL_PT_MINIMAL_ECX) != INTEL_PT_MINIMAL_ECX) ||
4728 ((eax_1 & INTEL_PT_MTC_BITMAP) != INTEL_PT_MTC_BITMAP) ||
4729 ((eax_1 & INTEL_PT_ADDR_RANGES_NUM_MASK) <
4730 INTEL_PT_ADDR_RANGES_NUM) ||
4731 ((ebx_1 & (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) !=
c078ca96
LK
4732 (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) ||
4733 (ecx_0 & INTEL_PT_IP_LIP)) {
e37a5c7f
CP
4734 /*
4735 * Processor Trace capabilities aren't configurable, so if the
4736 * host can't emulate the capabilities we report on
4737 * cpu_x86_cpuid(), intel-pt can't be enabled on the current host.
4738 */
4739 env->features[FEAT_7_0_EBX] &= ~CPUID_7_0_EBX_INTEL_PT;
4740 cpu->filtered_features[FEAT_7_0_EBX] |= CPUID_7_0_EBX_INTEL_PT;
4741 rv = 1;
4742 }
4743 }
4744
b8d834a0
EH
4745 return rv;
4746}
4747
41f3d4d6
EH
4748#define IS_INTEL_CPU(env) ((env)->cpuid_vendor1 == CPUID_VENDOR_INTEL_1 && \
4749 (env)->cpuid_vendor2 == CPUID_VENDOR_INTEL_2 && \
4750 (env)->cpuid_vendor3 == CPUID_VENDOR_INTEL_3)
4751#define IS_AMD_CPU(env) ((env)->cpuid_vendor1 == CPUID_VENDOR_AMD_1 && \
4752 (env)->cpuid_vendor2 == CPUID_VENDOR_AMD_2 && \
4753 (env)->cpuid_vendor3 == CPUID_VENDOR_AMD_3)
4754static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
4755{
4756 CPUState *cs = CPU(dev);
4757 X86CPU *cpu = X86_CPU(dev);
4758 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
4759 CPUX86State *env = &cpu->env;
4760 Error *local_err = NULL;
4761 static bool ht_warned;
4762
d6dcc558 4763 if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) {
41f3d4d6
EH
4764 char *name = x86_cpu_class_get_model_name(xcc);
4765 error_setg(&local_err, "CPU model '%s' requires KVM", name);
4766 g_free(name);
4767 goto out;
4768 }
4769
4770 if (cpu->apic_id == UNASSIGNED_APIC_ID) {
4771 error_setg(errp, "apic-id property was not initialized properly");
4772 return;
4773 }
4774
b8d834a0 4775 x86_cpu_expand_features(cpu, &local_err);
41f3d4d6
EH
4776 if (local_err) {
4777 goto out;
4778 }
4779
8ca30e86
EH
4780 if (x86_cpu_filter_features(cpu) &&
4781 (cpu->check_cpuid || cpu->enforce_cpuid)) {
4782 x86_cpu_report_filtered_features(cpu);
4783 if (cpu->enforce_cpuid) {
4784 error_setg(&local_err,
d6dcc558 4785 accel_uses_host_cpuid() ?
8ca30e86
EH
4786 "Host doesn't support requested features" :
4787 "TCG doesn't support requested features");
4788 goto out;
4789 }
9997cf7b
EH
4790 }
4791
9b15cd9e
IM
4792 /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on
4793 * CPUID[1].EDX.
4794 */
e48638fd 4795 if (IS_AMD_CPU(env)) {
0514ef2f
EH
4796 env->features[FEAT_8000_0001_EDX] &= ~CPUID_EXT2_AMD_ALIASES;
4797 env->features[FEAT_8000_0001_EDX] |= (env->features[FEAT_1_EDX]
9b15cd9e
IM
4798 & CPUID_EXT2_AMD_ALIASES);
4799 }
4800
11f6fee5
DDAG
4801 /* For 64bit systems think about the number of physical bits to present.
4802 * ideally this should be the same as the host; anything other than matching
4803 * the host can cause incorrect guest behaviour.
4804 * QEMU used to pick the magic value of 40 bits that corresponds to
4805 * consumer AMD devices but nothing else.
4806 */
af45907a 4807 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
d6dcc558 4808 if (accel_uses_host_cpuid()) {
11f6fee5
DDAG
4809 uint32_t host_phys_bits = x86_host_phys_bits();
4810 static bool warned;
4811
4812 if (cpu->host_phys_bits) {
4813 /* The user asked for us to use the host physical bits */
4814 cpu->phys_bits = host_phys_bits;
4815 }
4816
4817 /* Print a warning if the user set it to a value that's not the
4818 * host value.
4819 */
4820 if (cpu->phys_bits != host_phys_bits && cpu->phys_bits != 0 &&
4821 !warned) {
3dc6f869
AF
4822 warn_report("Host physical bits (%u)"
4823 " does not match phys-bits property (%u)",
4824 host_phys_bits, cpu->phys_bits);
11f6fee5
DDAG
4825 warned = true;
4826 }
4827
4828 if (cpu->phys_bits &&
4829 (cpu->phys_bits > TARGET_PHYS_ADDR_SPACE_BITS ||
4830 cpu->phys_bits < 32)) {
af45907a
DDAG
4831 error_setg(errp, "phys-bits should be between 32 and %u "
4832 " (but is %u)",
4833 TARGET_PHYS_ADDR_SPACE_BITS, cpu->phys_bits);
4834 return;
4835 }
4836 } else {
11f6fee5 4837 if (cpu->phys_bits && cpu->phys_bits != TCG_PHYS_ADDR_BITS) {
af45907a
DDAG
4838 error_setg(errp, "TCG only supports phys-bits=%u",
4839 TCG_PHYS_ADDR_BITS);
4840 return;
4841 }
4842 }
11f6fee5
DDAG
4843 /* 0 means it was not explicitly set by the user (or by machine
4844 * compat_props or by the host code above). In this case, the default
4845 * is the value used by TCG (40).
4846 */
4847 if (cpu->phys_bits == 0) {
4848 cpu->phys_bits = TCG_PHYS_ADDR_BITS;
4849 }
af45907a
DDAG
4850 } else {
4851 /* For 32 bit systems don't use the user set value, but keep
4852 * phys_bits consistent with what we tell the guest.
4853 */
4854 if (cpu->phys_bits != 0) {
4855 error_setg(errp, "phys-bits is not user-configurable in 32 bit");
4856 return;
4857 }
fefb41bf 4858
af45907a
DDAG
4859 if (env->features[FEAT_1_EDX] & CPUID_PSE36) {
4860 cpu->phys_bits = 36;
4861 } else {
4862 cpu->phys_bits = 32;
4863 }
4864 }
a9f27ea9
EH
4865
4866 /* Cache information initialization */
4867 if (!cpu->legacy_cache) {
4868 if (!xcc->cpu_def || !xcc->cpu_def->cache_info) {
4869 char *name = x86_cpu_class_get_model_name(xcc);
4870 error_setg(errp,
4871 "CPU model '%s' doesn't support legacy-cache=off", name);
4872 g_free(name);
4873 return;
4874 }
4875 env->cache_info_cpuid2 = env->cache_info_cpuid4 = env->cache_info_amd =
4876 *xcc->cpu_def->cache_info;
4877 } else {
4878 /* Build legacy cache information */
4879 env->cache_info_cpuid2.l1d_cache = &legacy_l1d_cache;
4880 env->cache_info_cpuid2.l1i_cache = &legacy_l1i_cache;
4881 env->cache_info_cpuid2.l2_cache = &legacy_l2_cache_cpuid2;
4882 env->cache_info_cpuid2.l3_cache = &legacy_l3_cache;
4883
4884 env->cache_info_cpuid4.l1d_cache = &legacy_l1d_cache;
4885 env->cache_info_cpuid4.l1i_cache = &legacy_l1i_cache;
4886 env->cache_info_cpuid4.l2_cache = &legacy_l2_cache;
4887 env->cache_info_cpuid4.l3_cache = &legacy_l3_cache;
4888
4889 env->cache_info_amd.l1d_cache = &legacy_l1d_cache_amd;
4890 env->cache_info_amd.l1i_cache = &legacy_l1i_cache_amd;
4891 env->cache_info_amd.l2_cache = &legacy_l2_cache_amd;
4892 env->cache_info_amd.l3_cache = &legacy_l3_cache;
4893 }
4894
4895
ce5b1bbf
LV
4896 cpu_exec_realizefn(cs, &local_err);
4897 if (local_err != NULL) {
4898 error_propagate(errp, local_err);
4899 return;
4900 }
42ecabaa 4901
65dee380
IM
4902#ifndef CONFIG_USER_ONLY
4903 qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
bdeec802 4904
0514ef2f 4905 if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || smp_cpus > 1) {
d3c64d6a 4906 x86_cpu_apic_create(cpu, &local_err);
2b6f294c 4907 if (local_err != NULL) {
4dc1f449 4908 goto out;
bdeec802
IM
4909 }
4910 }
65dee380
IM
4911#endif
4912
7a059953 4913 mce_init(cpu);
2001d0cd
PB
4914
4915#ifndef CONFIG_USER_ONLY
4916 if (tcg_enabled()) {
f809c605 4917 cpu->cpu_as_mem = g_new(MemoryRegion, 1);
2001d0cd 4918 cpu->cpu_as_root = g_new(MemoryRegion, 1);
f809c605
PB
4919
4920 /* Outer container... */
4921 memory_region_init(cpu->cpu_as_root, OBJECT(cpu), "memory", ~0ull);
2001d0cd 4922 memory_region_set_enabled(cpu->cpu_as_root, true);
f809c605
PB
4923
4924 /* ... with two regions inside: normal system memory with low
4925 * priority, and...
4926 */
4927 memory_region_init_alias(cpu->cpu_as_mem, OBJECT(cpu), "memory",
4928 get_system_memory(), 0, ~0ull);
4929 memory_region_add_subregion_overlap(cpu->cpu_as_root, 0, cpu->cpu_as_mem, 0);
4930 memory_region_set_enabled(cpu->cpu_as_mem, true);
f8c45c65
PB
4931
4932 cs->num_ases = 2;
80ceb07a
PX
4933 cpu_address_space_init(cs, 0, "cpu-memory", cs->memory);
4934 cpu_address_space_init(cs, 1, "cpu-smm", cpu->cpu_as_root);
f809c605
PB
4935
4936 /* ... SMRAM with higher priority, linked from /machine/smram. */
4937 cpu->machine_done.notify = x86_cpu_machine_done;
4938 qemu_add_machine_init_done_notifier(&cpu->machine_done);
2001d0cd
PB
4939 }
4940#endif
4941
14a10fc3 4942 qemu_init_vcpu(cs);
d3c64d6a 4943
e48638fd
WH
4944 /* Only Intel CPUs support hyperthreading. Even though QEMU fixes this
4945 * issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
4946 * based on inputs (sockets,cores,threads), it is still better to gives
4947 * users a warning.
4948 *
4949 * NOTE: the following code has to follow qemu_init_vcpu(). Otherwise
4950 * cs->nr_threads hasn't be populated yet and the checking is incorrect.
4951 */
4952 if (!IS_INTEL_CPU(env) && cs->nr_threads > 1 && !ht_warned) {
4953 error_report("AMD CPU doesn't support hyperthreading. Please configure"
4954 " -smp options properly.");
4955 ht_warned = true;
4956 }
4957
d3c64d6a
IM
4958 x86_cpu_apic_realize(cpu, &local_err);
4959 if (local_err != NULL) {
4960 goto out;
4961 }
14a10fc3 4962 cpu_reset(cs);
2b6f294c 4963
4dc1f449 4964 xcc->parent_realize(dev, &local_err);
2001d0cd 4965
4dc1f449
IM
4966out:
4967 if (local_err != NULL) {
4968 error_propagate(errp, local_err);
4969 return;
4970 }
7a059953
AF
4971}
4972
c884776e
IM
4973static void x86_cpu_unrealizefn(DeviceState *dev, Error **errp)
4974{
4975 X86CPU *cpu = X86_CPU(dev);
7bbc124e
LV
4976 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
4977 Error *local_err = NULL;
c884776e
IM
4978
4979#ifndef CONFIG_USER_ONLY
4980 cpu_remove_sync(CPU(dev));
4981 qemu_unregister_reset(x86_cpu_machine_reset_cb, dev);
4982#endif
4983
4984 if (cpu->apic_state) {
4985 object_unparent(OBJECT(cpu->apic_state));
4986 cpu->apic_state = NULL;
4987 }
7bbc124e
LV
4988
4989 xcc->parent_unrealize(dev, &local_err);
4990 if (local_err != NULL) {
4991 error_propagate(errp, local_err);
4992 return;
4993 }
c884776e
IM
4994}
4995
38e5c119 4996typedef struct BitProperty {
a7b0ffac 4997 FeatureWord w;
38e5c119
EH
4998 uint32_t mask;
4999} BitProperty;
5000
d7bce999
EB
5001static void x86_cpu_get_bit_prop(Object *obj, Visitor *v, const char *name,
5002 void *opaque, Error **errp)
38e5c119 5003{
a7b0ffac 5004 X86CPU *cpu = X86_CPU(obj);
38e5c119 5005 BitProperty *fp = opaque;
a7b0ffac
EH
5006 uint32_t f = cpu->env.features[fp->w];
5007 bool value = (f & fp->mask) == fp->mask;
51e72bc1 5008 visit_type_bool(v, name, &value, errp);
38e5c119
EH
5009}
5010
d7bce999
EB
5011static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
5012 void *opaque, Error **errp)
38e5c119
EH
5013{
5014 DeviceState *dev = DEVICE(obj);
a7b0ffac 5015 X86CPU *cpu = X86_CPU(obj);
38e5c119
EH
5016 BitProperty *fp = opaque;
5017 Error *local_err = NULL;
5018 bool value;
5019
5020 if (dev->realized) {
5021 qdev_prop_set_after_realize(dev, name, errp);
5022 return;
5023 }
5024
51e72bc1 5025 visit_type_bool(v, name, &value, &local_err);
38e5c119
EH
5026 if (local_err) {
5027 error_propagate(errp, local_err);
5028 return;
5029 }
5030
5031 if (value) {
a7b0ffac 5032 cpu->env.features[fp->w] |= fp->mask;
38e5c119 5033 } else {
a7b0ffac 5034 cpu->env.features[fp->w] &= ~fp->mask;
38e5c119 5035 }
d4a606b3 5036 cpu->env.user_features[fp->w] |= fp->mask;
38e5c119
EH
5037}
5038
5039static void x86_cpu_release_bit_prop(Object *obj, const char *name,
5040 void *opaque)
5041{
5042 BitProperty *prop = opaque;
5043 g_free(prop);
5044}
5045
5046/* Register a boolean property to get/set a single bit in a uint32_t field.
5047 *
5048 * The same property name can be registered multiple times to make it affect
5049 * multiple bits in the same FeatureWord. In that case, the getter will return
5050 * true only if all bits are set.
5051 */
5052static void x86_cpu_register_bit_prop(X86CPU *cpu,
5053 const char *prop_name,
a7b0ffac 5054 FeatureWord w,
38e5c119
EH
5055 int bitnr)
5056{
5057 BitProperty *fp;
5058 ObjectProperty *op;
5059 uint32_t mask = (1UL << bitnr);
5060
5061 op = object_property_find(OBJECT(cpu), prop_name, NULL);
5062 if (op) {
5063 fp = op->opaque;
a7b0ffac 5064 assert(fp->w == w);
38e5c119
EH
5065 fp->mask |= mask;
5066 } else {
5067 fp = g_new0(BitProperty, 1);
a7b0ffac 5068 fp->w = w;
38e5c119
EH
5069 fp->mask = mask;
5070 object_property_add(OBJECT(cpu), prop_name, "bool",
5071 x86_cpu_get_bit_prop,
5072 x86_cpu_set_bit_prop,
5073 x86_cpu_release_bit_prop, fp, &error_abort);
5074 }
5075}
5076
5077static void x86_cpu_register_feature_bit_props(X86CPU *cpu,
5078 FeatureWord w,
5079 int bitnr)
5080{
38e5c119 5081 FeatureWordInfo *fi = &feature_word_info[w];
16d2fcaa 5082 const char *name = fi->feat_names[bitnr];
38e5c119 5083
16d2fcaa 5084 if (!name) {
38e5c119
EH
5085 return;
5086 }
5087
fc7dfd20
EH
5088 /* Property names should use "-" instead of "_".
5089 * Old names containing underscores are registered as aliases
5090 * using object_property_add_alias()
5091 */
16d2fcaa
EH
5092 assert(!strchr(name, '_'));
5093 /* aliases don't use "|" delimiters anymore, they are registered
5094 * manually using object_property_add_alias() */
5095 assert(!strchr(name, '|'));
a7b0ffac 5096 x86_cpu_register_bit_prop(cpu, name, w, bitnr);
38e5c119
EH
5097}
5098
d187e08d
AN
5099static GuestPanicInformation *x86_cpu_get_crash_info(CPUState *cs)
5100{
5101 X86CPU *cpu = X86_CPU(cs);
5102 CPUX86State *env = &cpu->env;
5103 GuestPanicInformation *panic_info = NULL;
5104
5e953812 5105 if (env->features[FEAT_HYPERV_EDX] & HV_GUEST_CRASH_MSR_AVAILABLE) {
d187e08d
AN
5106 panic_info = g_malloc0(sizeof(GuestPanicInformation));
5107
e8ed97a6 5108 panic_info->type = GUEST_PANIC_INFORMATION_TYPE_HYPER_V;
d187e08d 5109
5e953812 5110 assert(HV_CRASH_PARAMS >= 5);
e8ed97a6
AN
5111 panic_info->u.hyper_v.arg1 = env->msr_hv_crash_params[0];
5112 panic_info->u.hyper_v.arg2 = env->msr_hv_crash_params[1];
5113 panic_info->u.hyper_v.arg3 = env->msr_hv_crash_params[2];
5114 panic_info->u.hyper_v.arg4 = env->msr_hv_crash_params[3];
5115 panic_info->u.hyper_v.arg5 = env->msr_hv_crash_params[4];
d187e08d
AN
5116 }
5117
5118 return panic_info;
5119}
5120static void x86_cpu_get_crash_info_qom(Object *obj, Visitor *v,
5121 const char *name, void *opaque,
5122 Error **errp)
5123{
5124 CPUState *cs = CPU(obj);
5125 GuestPanicInformation *panic_info;
5126
5127 if (!cs->crash_occurred) {
5128 error_setg(errp, "No crash occured");
5129 return;
5130 }
5131
5132 panic_info = x86_cpu_get_crash_info(cs);
5133 if (panic_info == NULL) {
5134 error_setg(errp, "No crash information");
5135 return;
5136 }
5137
5138 visit_type_GuestPanicInformation(v, "crash-information", &panic_info,
5139 errp);
5140 qapi_free_GuestPanicInformation(panic_info);
5141}
5142
de024815
AF
5143static void x86_cpu_initfn(Object *obj)
5144{
55e5c285 5145 CPUState *cs = CPU(obj);
de024815 5146 X86CPU *cpu = X86_CPU(obj);
d940ee9b 5147 X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
de024815 5148 CPUX86State *env = &cpu->env;
38e5c119 5149 FeatureWord w;
de024815 5150
c05efcb1 5151 cs->env_ptr = env;
71ad61d3
AF
5152
5153 object_property_add(obj, "family", "int",
95b8519d 5154 x86_cpuid_version_get_family,
71ad61d3 5155 x86_cpuid_version_set_family, NULL, NULL, NULL);
c5291a4f 5156 object_property_add(obj, "model", "int",
67e30c83 5157 x86_cpuid_version_get_model,
c5291a4f 5158 x86_cpuid_version_set_model, NULL, NULL, NULL);
036e2222 5159 object_property_add(obj, "stepping", "int",
35112e41 5160 x86_cpuid_version_get_stepping,
036e2222 5161 x86_cpuid_version_set_stepping, NULL, NULL, NULL);
d480e1af
AF
5162 object_property_add_str(obj, "vendor",
5163 x86_cpuid_get_vendor,
5164 x86_cpuid_set_vendor, NULL);
938d4c25 5165 object_property_add_str(obj, "model-id",
63e886eb 5166 x86_cpuid_get_model_id,
938d4c25 5167 x86_cpuid_set_model_id, NULL);
89e48965
AF
5168 object_property_add(obj, "tsc-frequency", "int",
5169 x86_cpuid_get_tsc_freq,
5170 x86_cpuid_set_tsc_freq, NULL, NULL, NULL);
8e8aba50
EH
5171 object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo",
5172 x86_cpu_get_feature_words,
7e5292b5
EH
5173 NULL, NULL, (void *)env->features, NULL);
5174 object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo",
5175 x86_cpu_get_feature_words,
5176 NULL, NULL, (void *)cpu->filtered_features, NULL);
71ad61d3 5177
d187e08d
AN
5178 object_property_add(obj, "crash-information", "GuestPanicInformation",
5179 x86_cpu_get_crash_info_qom, NULL, NULL, NULL, NULL);
5180
92067bf4 5181 cpu->hyperv_spinlock_attempts = HYPERV_SPINLOCK_NEVER_RETRY;
d65e9815 5182
38e5c119
EH
5183 for (w = 0; w < FEATURE_WORDS; w++) {
5184 int bitnr;
5185
5186 for (bitnr = 0; bitnr < 32; bitnr++) {
5187 x86_cpu_register_feature_bit_props(cpu, w, bitnr);
5188 }
5189 }
5190
16d2fcaa
EH
5191 object_property_add_alias(obj, "sse3", obj, "pni", &error_abort);
5192 object_property_add_alias(obj, "pclmuldq", obj, "pclmulqdq", &error_abort);
5193 object_property_add_alias(obj, "sse4-1", obj, "sse4.1", &error_abort);
5194 object_property_add_alias(obj, "sse4-2", obj, "sse4.2", &error_abort);
5195 object_property_add_alias(obj, "xd", obj, "nx", &error_abort);
5196 object_property_add_alias(obj, "ffxsr", obj, "fxsr-opt", &error_abort);
5197 object_property_add_alias(obj, "i64", obj, "lm", &error_abort);
5198
54b8dc7c
EH
5199 object_property_add_alias(obj, "ds_cpl", obj, "ds-cpl", &error_abort);
5200 object_property_add_alias(obj, "tsc_adjust", obj, "tsc-adjust", &error_abort);
5201 object_property_add_alias(obj, "fxsr_opt", obj, "fxsr-opt", &error_abort);
5202 object_property_add_alias(obj, "lahf_lm", obj, "lahf-lm", &error_abort);
5203 object_property_add_alias(obj, "cmp_legacy", obj, "cmp-legacy", &error_abort);
5204 object_property_add_alias(obj, "nodeid_msr", obj, "nodeid-msr", &error_abort);
5205 object_property_add_alias(obj, "perfctr_core", obj, "perfctr-core", &error_abort);
5206 object_property_add_alias(obj, "perfctr_nb", obj, "perfctr-nb", &error_abort);
5207 object_property_add_alias(obj, "kvm_nopiodelay", obj, "kvm-nopiodelay", &error_abort);
5208 object_property_add_alias(obj, "kvm_mmu", obj, "kvm-mmu", &error_abort);
5209 object_property_add_alias(obj, "kvm_asyncpf", obj, "kvm-asyncpf", &error_abort);
5210 object_property_add_alias(obj, "kvm_steal_time", obj, "kvm-steal-time", &error_abort);
5211 object_property_add_alias(obj, "kvm_pv_eoi", obj, "kvm-pv-eoi", &error_abort);
5212 object_property_add_alias(obj, "kvm_pv_unhalt", obj, "kvm-pv-unhalt", &error_abort);
5213 object_property_add_alias(obj, "svm_lock", obj, "svm-lock", &error_abort);
5214 object_property_add_alias(obj, "nrip_save", obj, "nrip-save", &error_abort);
5215 object_property_add_alias(obj, "tsc_scale", obj, "tsc-scale", &error_abort);
5216 object_property_add_alias(obj, "vmcb_clean", obj, "vmcb-clean", &error_abort);
5217 object_property_add_alias(obj, "pause_filter", obj, "pause-filter", &error_abort);
5218 object_property_add_alias(obj, "sse4_1", obj, "sse4.1", &error_abort);
5219 object_property_add_alias(obj, "sse4_2", obj, "sse4.2", &error_abort);
5220
0bacd8b3
EH
5221 if (xcc->cpu_def) {
5222 x86_cpu_load_def(cpu, xcc->cpu_def, &error_abort);
5223 }
de024815
AF
5224}
5225
997395d3
IM
5226static int64_t x86_cpu_get_arch_id(CPUState *cs)
5227{
5228 X86CPU *cpu = X86_CPU(cs);
997395d3 5229
7e72a45c 5230 return cpu->apic_id;
997395d3
IM
5231}
5232
444d5590
AF
5233static bool x86_cpu_get_paging_enabled(const CPUState *cs)
5234{
5235 X86CPU *cpu = X86_CPU(cs);
5236
5237 return cpu->env.cr[0] & CR0_PG_MASK;
5238}
5239
f45748f1
AF
5240static void x86_cpu_set_pc(CPUState *cs, vaddr value)
5241{
5242 X86CPU *cpu = X86_CPU(cs);
5243
5244 cpu->env.eip = value;
5245}
5246
bdf7ae5b
AF
5247static void x86_cpu_synchronize_from_tb(CPUState *cs, TranslationBlock *tb)
5248{
5249 X86CPU *cpu = X86_CPU(cs);
5250
5251 cpu->env.eip = tb->pc - tb->cs_base;
5252}
5253
8c2e1b00
AF
5254static bool x86_cpu_has_work(CPUState *cs)
5255{
5256 X86CPU *cpu = X86_CPU(cs);
5257 CPUX86State *env = &cpu->env;
5258
6220e900
PD
5259 return ((cs->interrupt_request & (CPU_INTERRUPT_HARD |
5260 CPU_INTERRUPT_POLL)) &&
8c2e1b00
AF
5261 (env->eflags & IF_MASK)) ||
5262 (cs->interrupt_request & (CPU_INTERRUPT_NMI |
5263 CPU_INTERRUPT_INIT |
5264 CPU_INTERRUPT_SIPI |
a9bad65d
PB
5265 CPU_INTERRUPT_MCE)) ||
5266 ((cs->interrupt_request & CPU_INTERRUPT_SMI) &&
5267 !(env->hflags & HF_SMM_MASK));
8c2e1b00
AF
5268}
5269
f50f3dd5
RH
5270static void x86_disas_set_info(CPUState *cs, disassemble_info *info)
5271{
5272 X86CPU *cpu = X86_CPU(cs);
5273 CPUX86State *env = &cpu->env;
5274
5275 info->mach = (env->hflags & HF_CS64_MASK ? bfd_mach_x86_64
5276 : env->hflags & HF_CS32_MASK ? bfd_mach_i386_i386
5277 : bfd_mach_i386_i8086);
5278 info->print_insn = print_insn_i386;
b666d2a4
RH
5279
5280 info->cap_arch = CS_ARCH_X86;
5281 info->cap_mode = (env->hflags & HF_CS64_MASK ? CS_MODE_64
5282 : env->hflags & HF_CS32_MASK ? CS_MODE_32
5283 : CS_MODE_16);
15fa1a0a
RH
5284 info->cap_insn_unit = 1;
5285 info->cap_insn_split = 8;
f50f3dd5
RH
5286}
5287
35b1b927
TW
5288void x86_update_hflags(CPUX86State *env)
5289{
5290 uint32_t hflags;
5291#define HFLAG_COPY_MASK \
5292 ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
5293 HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
5294 HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
5295 HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK)
5296
5297 hflags = env->hflags & HFLAG_COPY_MASK;
5298 hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
5299 hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
5300 hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
5301 (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
5302 hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
5303
5304 if (env->cr[4] & CR4_OSFXSR_MASK) {
5305 hflags |= HF_OSFXSR_MASK;
5306 }
5307
5308 if (env->efer & MSR_EFER_LMA) {
5309 hflags |= HF_LMA_MASK;
5310 }
5311
5312 if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
5313 hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
5314 } else {
5315 hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
5316 (DESC_B_SHIFT - HF_CS32_SHIFT);
5317 hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
5318 (DESC_B_SHIFT - HF_SS32_SHIFT);
5319 if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) ||
5320 !(hflags & HF_CS32_MASK)) {
5321 hflags |= HF_ADDSEG_MASK;
5322 } else {
5323 hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base |
5324 env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
5325 }
5326 }
5327 env->hflags = hflags;
5328}
5329
9337e3b6 5330static Property x86_cpu_properties[] = {
2da00e31
IM
5331#ifdef CONFIG_USER_ONLY
5332 /* apic_id = 0 by default for *-user, see commit 9886e834 */
5333 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, 0),
d89c2b8b
IM
5334 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, 0),
5335 DEFINE_PROP_INT32("core-id", X86CPU, core_id, 0),
5336 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, 0),
2da00e31
IM
5337#else
5338 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, UNASSIGNED_APIC_ID),
d89c2b8b
IM
5339 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, -1),
5340 DEFINE_PROP_INT32("core-id", X86CPU, core_id, -1),
5341 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, -1),
2da00e31 5342#endif
15f8b142 5343 DEFINE_PROP_INT32("node-id", X86CPU, node_id, CPU_UNSET_NUMA_NODE_ID),
9337e3b6 5344 DEFINE_PROP_BOOL("pmu", X86CPU, enable_pmu, false),
c8f0f88e 5345 { .name = "hv-spinlocks", .info = &qdev_prop_spinlocks },
89314504 5346 DEFINE_PROP_BOOL("hv-relaxed", X86CPU, hyperv_relaxed_timing, false),
0f46685d 5347 DEFINE_PROP_BOOL("hv-vapic", X86CPU, hyperv_vapic, false),
48a5f3bc 5348 DEFINE_PROP_BOOL("hv-time", X86CPU, hyperv_time, false),
f2a53c9e 5349 DEFINE_PROP_BOOL("hv-crash", X86CPU, hyperv_crash, false),
744b8a94 5350 DEFINE_PROP_BOOL("hv-reset", X86CPU, hyperv_reset, false),
8c145d7c 5351 DEFINE_PROP_BOOL("hv-vpindex", X86CPU, hyperv_vpindex, false),
46eb8f98 5352 DEFINE_PROP_BOOL("hv-runtime", X86CPU, hyperv_runtime, false),
866eea9a 5353 DEFINE_PROP_BOOL("hv-synic", X86CPU, hyperv_synic, false),
ff99aa64 5354 DEFINE_PROP_BOOL("hv-stimer", X86CPU, hyperv_stimer, false),
9445597b 5355 DEFINE_PROP_BOOL("hv-frequencies", X86CPU, hyperv_frequencies, false),
ba6a4fd9 5356 DEFINE_PROP_BOOL("hv-reenlightenment", X86CPU, hyperv_reenlightenment, false),
15e41345 5357 DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true),
912ffc47 5358 DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
f522d2ac 5359 DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true),
af45907a 5360 DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 0),
11f6fee5 5361 DEFINE_PROP_BOOL("host-phys-bits", X86CPU, host_phys_bits, false),
fcc35e7c 5362 DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true),
c39c0edf
EH
5363 DEFINE_PROP_UINT32("level", X86CPU, env.cpuid_level, UINT32_MAX),
5364 DEFINE_PROP_UINT32("xlevel", X86CPU, env.cpuid_xlevel, UINT32_MAX),
5365 DEFINE_PROP_UINT32("xlevel2", X86CPU, env.cpuid_xlevel2, UINT32_MAX),
5366 DEFINE_PROP_UINT32("min-level", X86CPU, env.cpuid_min_level, 0),
5367 DEFINE_PROP_UINT32("min-xlevel", X86CPU, env.cpuid_min_xlevel, 0),
5368 DEFINE_PROP_UINT32("min-xlevel2", X86CPU, env.cpuid_min_xlevel2, 0),
5369 DEFINE_PROP_BOOL("full-cpuid-auto-level", X86CPU, full_cpuid_auto_level, true),
1c4a55db 5370 DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor_id),
5232d00a 5371 DEFINE_PROP_BOOL("cpuid-0xb", X86CPU, enable_cpuid_0xb, true),
87f8b626 5372 DEFINE_PROP_BOOL("lmce", X86CPU, enable_lmce, false),
14c985cf 5373 DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true),
fc3a1fd7
DDAG
5374 DEFINE_PROP_BOOL("kvm-no-smi-migration", X86CPU, kvm_no_smi_migration,
5375 false),
0b564e6f 5376 DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true),
1ce36bfe 5377 DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true),
ab8f992e 5378 /*
a9f27ea9
EH
5379 * lecacy_cache defaults to true unless the CPU model provides its
5380 * own cache information (see x86_cpu_load_def()).
ab8f992e 5381 */
a9f27ea9 5382 DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, true),
6c69dfb6
GA
5383
5384 /*
5385 * From "Requirements for Implementing the Microsoft
5386 * Hypervisor Interface":
5387 * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs
5388 *
5389 * "Starting with Windows Server 2012 and Windows 8, if
5390 * CPUID.40000005.EAX contains a value of -1, Windows assumes that
5391 * the hypervisor imposes no specific limit to the number of VPs.
5392 * In this case, Windows Server 2012 guest VMs may use more than
5393 * 64 VPs, up to the maximum supported number of processors applicable
5394 * to the specific Windows version being used."
5395 */
5396 DEFINE_PROP_INT32("x-hv-max-vps", X86CPU, hv_max_vps, -1),
9337e3b6
EH
5397 DEFINE_PROP_END_OF_LIST()
5398};
5399
5fd2087a
AF
5400static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
5401{
5402 X86CPUClass *xcc = X86_CPU_CLASS(oc);
5403 CPUClass *cc = CPU_CLASS(oc);
2b6f294c
AF
5404 DeviceClass *dc = DEVICE_CLASS(oc);
5405
bf853881
PMD
5406 device_class_set_parent_realize(dc, x86_cpu_realizefn,
5407 &xcc->parent_realize);
5408 device_class_set_parent_unrealize(dc, x86_cpu_unrealizefn,
5409 &xcc->parent_unrealize);
9337e3b6 5410 dc->props = x86_cpu_properties;
5fd2087a
AF
5411
5412 xcc->parent_reset = cc->reset;
5413 cc->reset = x86_cpu_reset;
91b1df8c 5414 cc->reset_dump_flags = CPU_DUMP_FPU | CPU_DUMP_CCOP;
f56e3a14 5415
500050d1 5416 cc->class_by_name = x86_cpu_class_by_name;
94a444b2 5417 cc->parse_features = x86_cpu_parse_featurestr;
8c2e1b00 5418 cc->has_work = x86_cpu_has_work;
79c664f6 5419#ifdef CONFIG_TCG
97a8ea5a 5420 cc->do_interrupt = x86_cpu_do_interrupt;
42f53fea 5421 cc->cpu_exec_interrupt = x86_cpu_exec_interrupt;
79c664f6 5422#endif
878096ee 5423 cc->dump_state = x86_cpu_dump_state;
c86f106b 5424 cc->get_crash_info = x86_cpu_get_crash_info;
f45748f1 5425 cc->set_pc = x86_cpu_set_pc;
bdf7ae5b 5426 cc->synchronize_from_tb = x86_cpu_synchronize_from_tb;
5b50e790
AF
5427 cc->gdb_read_register = x86_cpu_gdb_read_register;
5428 cc->gdb_write_register = x86_cpu_gdb_write_register;
444d5590
AF
5429 cc->get_arch_id = x86_cpu_get_arch_id;
5430 cc->get_paging_enabled = x86_cpu_get_paging_enabled;
7510454e
AF
5431#ifdef CONFIG_USER_ONLY
5432 cc->handle_mmu_fault = x86_cpu_handle_mmu_fault;
5433#else
f8c45c65 5434 cc->asidx_from_attrs = x86_asidx_from_attrs;
a23bbfda 5435 cc->get_memory_mapping = x86_cpu_get_memory_mapping;
00b941e5 5436 cc->get_phys_page_debug = x86_cpu_get_phys_page_debug;
c72bf468
JF
5437 cc->write_elf64_note = x86_cpu_write_elf64_note;
5438 cc->write_elf64_qemunote = x86_cpu_write_elf64_qemunote;
5439 cc->write_elf32_note = x86_cpu_write_elf32_note;
5440 cc->write_elf32_qemunote = x86_cpu_write_elf32_qemunote;
00b941e5 5441 cc->vmsd = &vmstate_x86_cpu;
c72bf468 5442#endif
00fcd100
AB
5443 cc->gdb_arch_name = x86_gdb_arch_name;
5444#ifdef TARGET_X86_64
b8158192
AB
5445 cc->gdb_core_xml_file = "i386-64bit.xml";
5446 cc->gdb_num_core_regs = 57;
00fcd100 5447#else
b8158192
AB
5448 cc->gdb_core_xml_file = "i386-32bit.xml";
5449 cc->gdb_num_core_regs = 41;
00fcd100 5450#endif
79c664f6 5451#if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
86025ee4
PM
5452 cc->debug_excp_handler = breakpoint_handler;
5453#endif
374e0cd4
RH
5454 cc->cpu_exec_enter = x86_cpu_exec_enter;
5455 cc->cpu_exec_exit = x86_cpu_exec_exit;
74d7fc7f 5456#ifdef CONFIG_TCG
55c3ceef 5457 cc->tcg_initialize = tcg_x86_init;
74d7fc7f 5458#endif
f50f3dd5 5459 cc->disas_set_info = x86_disas_set_info;
4c315c27 5460
e90f2a8c 5461 dc->user_creatable = true;
5fd2087a
AF
5462}
5463
5464static const TypeInfo x86_cpu_type_info = {
5465 .name = TYPE_X86_CPU,
5466 .parent = TYPE_CPU,
5467 .instance_size = sizeof(X86CPU),
de024815 5468 .instance_init = x86_cpu_initfn,
d940ee9b 5469 .abstract = true,
5fd2087a
AF
5470 .class_size = sizeof(X86CPUClass),
5471 .class_init = x86_cpu_common_class_init,
5472};
5473
5adbed30
EH
5474
5475/* "base" CPU model, used by query-cpu-model-expansion */
5476static void x86_cpu_base_class_init(ObjectClass *oc, void *data)
5477{
5478 X86CPUClass *xcc = X86_CPU_CLASS(oc);
5479
5480 xcc->static_model = true;
5481 xcc->migration_safe = true;
5482 xcc->model_description = "base CPU model type with no features enabled";
5483 xcc->ordering = 8;
5484}
5485
5486static const TypeInfo x86_base_cpu_type_info = {
5487 .name = X86_CPU_TYPE_NAME("base"),
5488 .parent = TYPE_X86_CPU,
5489 .class_init = x86_cpu_base_class_init,
5490};
5491
5fd2087a
AF
5492static void x86_cpu_register_types(void)
5493{
d940ee9b
EH
5494 int i;
5495
5fd2087a 5496 type_register_static(&x86_cpu_type_info);
d940ee9b
EH
5497 for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) {
5498 x86_register_cpudef_type(&builtin_x86_defs[i]);
5499 }
c62f2630 5500 type_register_static(&max_x86_cpu_type_info);
5adbed30 5501 type_register_static(&x86_base_cpu_type_info);
d6dcc558 5502#if defined(CONFIG_KVM) || defined(CONFIG_HVF)
d940ee9b
EH
5503 type_register_static(&host_x86_cpu_type_info);
5504#endif
5fd2087a
AF
5505}
5506
5507type_init(x86_cpu_register_types)