]> git.proxmox.com Git - mirror_qemu.git/blame - target/i386/cpu.c
block: drop remaining legacy aio functions in comment
[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 */
1ef26b1f 19#include "qemu/osdep.h"
f348b6d1 20#include "qemu/cutils.h"
c6dc6f63
AP
21
22#include "cpu.h"
63c91552 23#include "exec/exec-all.h"
9c17d615 24#include "sysemu/kvm.h"
8932cfdf 25#include "sysemu/cpus.h"
50a2c6e5 26#include "kvm_i386.h"
c6dc6f63 27
d49b6836 28#include "qemu/error-report.h"
1de7afc9
PB
29#include "qemu/option.h"
30#include "qemu/config-file.h"
7b1b5d19 31#include "qapi/qmp/qerror.h"
c6dc6f63 32
8e8aba50
EH
33#include "qapi-types.h"
34#include "qapi-visit.h"
7b1b5d19 35#include "qapi/visitor.h"
9c17d615 36#include "sysemu/arch_init.h"
71ad61d3 37
b834b508 38#if defined(CONFIG_KVM)
ef8621b1 39#include <linux/kvm_para.h>
b834b508 40#endif
65dee380 41
9c17d615 42#include "sysemu/sysemu.h"
53a89e26 43#include "hw/qdev-properties.h"
5232d00a 44#include "hw/i386/topology.h"
bdeec802 45#ifndef CONFIG_USER_ONLY
2001d0cd 46#include "exec/address-spaces.h"
741da0d3 47#include "hw/hw.h"
0d09e41a 48#include "hw/xen/xen.h"
0d09e41a 49#include "hw/i386/apic_internal.h"
bdeec802
IM
50#endif
51
5e891bf8
EH
52
53/* Cache topology CPUID constants: */
54
55/* CPUID Leaf 2 Descriptors */
56
57#define CPUID_2_L1D_32KB_8WAY_64B 0x2c
58#define CPUID_2_L1I_32KB_8WAY_64B 0x30
59#define CPUID_2_L2_2MB_8WAY_64B 0x7d
14c985cf 60#define CPUID_2_L3_16MB_16WAY_64B 0x4d
5e891bf8
EH
61
62
63/* CPUID Leaf 4 constants: */
64
65/* EAX: */
66#define CPUID_4_TYPE_DCACHE 1
67#define CPUID_4_TYPE_ICACHE 2
68#define CPUID_4_TYPE_UNIFIED 3
69
70#define CPUID_4_LEVEL(l) ((l) << 5)
71
72#define CPUID_4_SELF_INIT_LEVEL (1 << 8)
73#define CPUID_4_FULLY_ASSOC (1 << 9)
74
75/* EDX: */
76#define CPUID_4_NO_INVD_SHARING (1 << 0)
77#define CPUID_4_INCLUSIVE (1 << 1)
78#define CPUID_4_COMPLEX_IDX (1 << 2)
79
80#define ASSOC_FULL 0xFF
81
82/* AMD associativity encoding used on CPUID Leaf 0x80000006: */
83#define AMD_ENC_ASSOC(a) (a <= 1 ? a : \
84 a == 2 ? 0x2 : \
85 a == 4 ? 0x4 : \
86 a == 8 ? 0x6 : \
87 a == 16 ? 0x8 : \
88 a == 32 ? 0xA : \
89 a == 48 ? 0xB : \
90 a == 64 ? 0xC : \
91 a == 96 ? 0xD : \
92 a == 128 ? 0xE : \
93 a == ASSOC_FULL ? 0xF : \
94 0 /* invalid value */)
95
96
97/* Definitions of the hardcoded cache entries we expose: */
98
99/* L1 data cache: */
100#define L1D_LINE_SIZE 64
101#define L1D_ASSOCIATIVITY 8
102#define L1D_SETS 64
103#define L1D_PARTITIONS 1
104/* Size = LINE_SIZE*ASSOCIATIVITY*SETS*PARTITIONS = 32KiB */
105#define L1D_DESCRIPTOR CPUID_2_L1D_32KB_8WAY_64B
106/*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
107#define L1D_LINES_PER_TAG 1
108#define L1D_SIZE_KB_AMD 64
109#define L1D_ASSOCIATIVITY_AMD 2
110
111/* L1 instruction cache: */
112#define L1I_LINE_SIZE 64
113#define L1I_ASSOCIATIVITY 8
114#define L1I_SETS 64
115#define L1I_PARTITIONS 1
116/* Size = LINE_SIZE*ASSOCIATIVITY*SETS*PARTITIONS = 32KiB */
117#define L1I_DESCRIPTOR CPUID_2_L1I_32KB_8WAY_64B
118/*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */
119#define L1I_LINES_PER_TAG 1
120#define L1I_SIZE_KB_AMD 64
121#define L1I_ASSOCIATIVITY_AMD 2
122
123/* Level 2 unified cache: */
124#define L2_LINE_SIZE 64
125#define L2_ASSOCIATIVITY 16
126#define L2_SETS 4096
127#define L2_PARTITIONS 1
128/* Size = LINE_SIZE*ASSOCIATIVITY*SETS*PARTITIONS = 4MiB */
129/*FIXME: CPUID leaf 2 descriptor is inconsistent with CPUID leaf 4 */
130#define L2_DESCRIPTOR CPUID_2_L2_2MB_8WAY_64B
131/*FIXME: CPUID leaf 0x80000006 is inconsistent with leaves 2 & 4 */
132#define L2_LINES_PER_TAG 1
133#define L2_SIZE_KB_AMD 512
134
14c985cf 135/* Level 3 unified cache: */
5e891bf8
EH
136#define L3_SIZE_KB 0 /* disabled */
137#define L3_ASSOCIATIVITY 0 /* disabled */
138#define L3_LINES_PER_TAG 0 /* disabled */
139#define L3_LINE_SIZE 0 /* disabled */
14c985cf
LM
140#define L3_N_LINE_SIZE 64
141#define L3_N_ASSOCIATIVITY 16
142#define L3_N_SETS 16384
143#define L3_N_PARTITIONS 1
144#define L3_N_DESCRIPTOR CPUID_2_L3_16MB_16WAY_64B
145#define L3_N_LINES_PER_TAG 1
146#define L3_N_SIZE_KB_AMD 16384
5e891bf8
EH
147
148/* TLB definitions: */
149
150#define L1_DTLB_2M_ASSOC 1
151#define L1_DTLB_2M_ENTRIES 255
152#define L1_DTLB_4K_ASSOC 1
153#define L1_DTLB_4K_ENTRIES 255
154
155#define L1_ITLB_2M_ASSOC 1
156#define L1_ITLB_2M_ENTRIES 255
157#define L1_ITLB_4K_ASSOC 1
158#define L1_ITLB_4K_ENTRIES 255
159
160#define L2_DTLB_2M_ASSOC 0 /* disabled */
161#define L2_DTLB_2M_ENTRIES 0 /* disabled */
162#define L2_DTLB_4K_ASSOC 4
163#define L2_DTLB_4K_ENTRIES 512
164
165#define L2_ITLB_2M_ASSOC 0 /* disabled */
166#define L2_ITLB_2M_ENTRIES 0 /* disabled */
167#define L2_ITLB_4K_ASSOC 4
168#define L2_ITLB_4K_ENTRIES 512
169
170
171
99b88a17
IM
172static void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1,
173 uint32_t vendor2, uint32_t vendor3)
174{
175 int i;
176 for (i = 0; i < 4; i++) {
177 dst[i] = vendor1 >> (8 * i);
178 dst[i + 4] = vendor2 >> (8 * i);
179 dst[i + 8] = vendor3 >> (8 * i);
180 }
181 dst[CPUID_VENDOR_SZ] = '\0';
182}
183
621626ce
EH
184#define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
185#define PENTIUM_FEATURES (I486_FEATURES | CPUID_DE | CPUID_TSC | \
186 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_MMX | CPUID_APIC)
187#define PENTIUM2_FEATURES (PENTIUM_FEATURES | CPUID_PAE | CPUID_SEP | \
188 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
189 CPUID_PSE36 | CPUID_FXSR)
190#define PENTIUM3_FEATURES (PENTIUM2_FEATURES | CPUID_SSE)
191#define PPRO_FEATURES (CPUID_FP87 | CPUID_DE | CPUID_PSE | CPUID_TSC | \
192 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_PGE | CPUID_CMOV | \
193 CPUID_PAT | CPUID_FXSR | CPUID_MMX | CPUID_SSE | CPUID_SSE2 | \
194 CPUID_PAE | CPUID_SEP | CPUID_APIC)
195
196#define TCG_FEATURES (CPUID_FP87 | CPUID_PSE | CPUID_TSC | CPUID_MSR | \
197 CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | CPUID_SEP | \
198 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
199 CPUID_PSE36 | CPUID_CLFLUSH | CPUID_ACPI | CPUID_MMX | \
b6c5a6f0 200 CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS | CPUID_DE)
621626ce
EH
201 /* partly implemented:
202 CPUID_MTRR, CPUID_MCA, CPUID_CLFLUSH (needed for Win64) */
203 /* missing:
204 CPUID_VME, CPUID_DTS, CPUID_SS, CPUID_HT, CPUID_TM, CPUID_PBE */
205#define TCG_EXT_FEATURES (CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | \
206 CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | \
207 CPUID_EXT_SSE41 | CPUID_EXT_SSE42 | CPUID_EXT_POPCNT | \
19dc85db 208 CPUID_EXT_XSAVE | /* CPUID_EXT_OSXSAVE is dynamic */ \
621626ce
EH
209 CPUID_EXT_MOVBE | CPUID_EXT_AES | CPUID_EXT_HYPERVISOR)
210 /* missing:
211 CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_SMX,
212 CPUID_EXT_EST, CPUID_EXT_TM2, CPUID_EXT_CID, CPUID_EXT_FMA,
213 CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_PCID, CPUID_EXT_DCA,
19dc85db
RH
214 CPUID_EXT_X2APIC, CPUID_EXT_TSC_DEADLINE_TIMER, CPUID_EXT_AVX,
215 CPUID_EXT_F16C, CPUID_EXT_RDRAND */
621626ce
EH
216
217#ifdef TARGET_X86_64
218#define TCG_EXT2_X86_64_FEATURES (CPUID_EXT2_SYSCALL | CPUID_EXT2_LM)
219#else
220#define TCG_EXT2_X86_64_FEATURES 0
221#endif
222
223#define TCG_EXT2_FEATURES ((TCG_FEATURES & CPUID_EXT2_AMD_ALIASES) | \
224 CPUID_EXT2_NX | CPUID_EXT2_MMXEXT | CPUID_EXT2_RDTSCP | \
225 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_PDPE1GB | \
226 TCG_EXT2_X86_64_FEATURES)
227#define TCG_EXT3_FEATURES (CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | \
228 CPUID_EXT3_CR8LEG | CPUID_EXT3_ABM | CPUID_EXT3_SSE4A)
229#define TCG_EXT4_FEATURES 0
230#define TCG_SVM_FEATURES 0
231#define TCG_KVM_FEATURES 0
232#define TCG_7_0_EBX_FEATURES (CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_SMAP | \
0c47242b
XG
233 CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX | \
234 CPUID_7_0_EBX_PCOMMIT | CPUID_7_0_EBX_CLFLUSHOPT | \
7eb24386
PB
235 CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_FSGSBASE | \
236 CPUID_7_0_EBX_ERMS)
621626ce 237 /* missing:
07929f2a 238 CPUID_7_0_EBX_HLE, CPUID_7_0_EBX_AVX2,
7eb24386 239 CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM,
621626ce 240 CPUID_7_0_EBX_RDSEED */
0f70ed47 241#define TCG_7_0_ECX_FEATURES (CPUID_7_0_ECX_PKU | CPUID_7_0_ECX_OSPKE)
95ea69fb 242#define TCG_7_0_EDX_FEATURES 0
303752a9 243#define TCG_APM_FEATURES 0
28b8e4d0 244#define TCG_6_EAX_FEATURES CPUID_6_EAX_ARAT
c9cfe8f9
RH
245#define TCG_XSAVE_FEATURES (CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XGETBV1)
246 /* missing:
247 CPUID_XSAVE_XSAVEC, CPUID_XSAVE_XSAVES */
621626ce 248
5ef57876 249typedef struct FeatureWordInfo {
2d5312da
EH
250 /* feature flags names are taken from "Intel Processor Identification and
251 * the CPUID Instruction" and AMD's "CPUID Specification".
252 * In cases of disagreement between feature naming conventions,
253 * aliases may be added.
254 */
255 const char *feat_names[32];
04d104b6
EH
256 uint32_t cpuid_eax; /* Input EAX for CPUID */
257 bool cpuid_needs_ecx; /* CPUID instruction uses ECX as input */
258 uint32_t cpuid_ecx; /* Input ECX value for CPUID */
259 int cpuid_reg; /* output register (R_* constant) */
37ce3522 260 uint32_t tcg_features; /* Feature flags supported by TCG */
84f1b92f 261 uint32_t unmigratable_flags; /* Feature flags known to be unmigratable */
6fb2fff7 262 uint32_t migratable_flags; /* Feature flags known to be migratable */
5ef57876
EH
263} FeatureWordInfo;
264
265static FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
bffd67b0 266 [FEAT_1_EDX] = {
2d5312da
EH
267 .feat_names = {
268 "fpu", "vme", "de", "pse",
269 "tsc", "msr", "pae", "mce",
270 "cx8", "apic", NULL, "sep",
271 "mtrr", "pge", "mca", "cmov",
272 "pat", "pse36", "pn" /* Intel psn */, "clflush" /* Intel clfsh */,
273 NULL, "ds" /* Intel dts */, "acpi", "mmx",
274 "fxsr", "sse", "sse2", "ss",
275 "ht" /* Intel htt */, "tm", "ia64", "pbe",
276 },
bffd67b0 277 .cpuid_eax = 1, .cpuid_reg = R_EDX,
37ce3522 278 .tcg_features = TCG_FEATURES,
bffd67b0
EH
279 },
280 [FEAT_1_ECX] = {
2d5312da 281 .feat_names = {
16d2fcaa 282 "pni" /* Intel,AMD sse3 */, "pclmulqdq", "dtes64", "monitor",
fc7dfd20 283 "ds-cpl", "vmx", "smx", "est",
2d5312da
EH
284 "tm2", "ssse3", "cid", NULL,
285 "fma", "cx16", "xtpr", "pdcm",
16d2fcaa
EH
286 NULL, "pcid", "dca", "sse4.1",
287 "sse4.2", "x2apic", "movbe", "popcnt",
2d5312da
EH
288 "tsc-deadline", "aes", "xsave", "osxsave",
289 "avx", "f16c", "rdrand", "hypervisor",
290 },
bffd67b0 291 .cpuid_eax = 1, .cpuid_reg = R_ECX,
37ce3522 292 .tcg_features = TCG_EXT_FEATURES,
bffd67b0 293 },
2d5312da
EH
294 /* Feature names that are already defined on feature_name[] but
295 * are set on CPUID[8000_0001].EDX on AMD CPUs don't have their
296 * names on feat_names below. They are copied automatically
297 * to features[FEAT_8000_0001_EDX] if and only if CPU vendor is AMD.
298 */
bffd67b0 299 [FEAT_8000_0001_EDX] = {
2d5312da
EH
300 .feat_names = {
301 NULL /* fpu */, NULL /* vme */, NULL /* de */, NULL /* pse */,
302 NULL /* tsc */, NULL /* msr */, NULL /* pae */, NULL /* mce */,
303 NULL /* cx8 */, NULL /* apic */, NULL, "syscall",
304 NULL /* mtrr */, NULL /* pge */, NULL /* mca */, NULL /* cmov */,
305 NULL /* pat */, NULL /* pse36 */, NULL, NULL /* Linux mp */,
16d2fcaa
EH
306 "nx", NULL, "mmxext", NULL /* mmx */,
307 NULL /* fxsr */, "fxsr-opt", "pdpe1gb", "rdtscp",
308 NULL, "lm", "3dnowext", "3dnow",
2d5312da 309 },
bffd67b0 310 .cpuid_eax = 0x80000001, .cpuid_reg = R_EDX,
37ce3522 311 .tcg_features = TCG_EXT2_FEATURES,
bffd67b0
EH
312 },
313 [FEAT_8000_0001_ECX] = {
2d5312da 314 .feat_names = {
fc7dfd20 315 "lahf-lm", "cmp-legacy", "svm", "extapic",
2d5312da
EH
316 "cr8legacy", "abm", "sse4a", "misalignsse",
317 "3dnowprefetch", "osvw", "ibs", "xop",
318 "skinit", "wdt", NULL, "lwp",
fc7dfd20
EH
319 "fma4", "tce", NULL, "nodeid-msr",
320 NULL, "tbm", "topoext", "perfctr-core",
321 "perfctr-nb", NULL, NULL, NULL,
2d5312da
EH
322 NULL, NULL, NULL, NULL,
323 },
bffd67b0 324 .cpuid_eax = 0x80000001, .cpuid_reg = R_ECX,
37ce3522 325 .tcg_features = TCG_EXT3_FEATURES,
bffd67b0 326 },
89e49c8b 327 [FEAT_C000_0001_EDX] = {
2d5312da
EH
328 .feat_names = {
329 NULL, NULL, "xstore", "xstore-en",
330 NULL, NULL, "xcrypt", "xcrypt-en",
331 "ace2", "ace2-en", "phe", "phe-en",
332 "pmm", "pmm-en", NULL, NULL,
333 NULL, NULL, NULL, NULL,
334 NULL, NULL, NULL, NULL,
335 NULL, NULL, NULL, NULL,
336 NULL, NULL, NULL, NULL,
337 },
89e49c8b 338 .cpuid_eax = 0xC0000001, .cpuid_reg = R_EDX,
37ce3522 339 .tcg_features = TCG_EXT4_FEATURES,
89e49c8b 340 },
bffd67b0 341 [FEAT_KVM] = {
2d5312da 342 .feat_names = {
fc7dfd20
EH
343 "kvmclock", "kvm-nopiodelay", "kvm-mmu", "kvmclock",
344 "kvm-asyncpf", "kvm-steal-time", "kvm-pv-eoi", "kvm-pv-unhalt",
2d5312da
EH
345 NULL, NULL, NULL, NULL,
346 NULL, NULL, NULL, NULL,
347 NULL, NULL, NULL, NULL,
348 NULL, NULL, NULL, NULL,
349 "kvmclock-stable-bit", NULL, NULL, NULL,
350 NULL, NULL, NULL, NULL,
351 },
bffd67b0 352 .cpuid_eax = KVM_CPUID_FEATURES, .cpuid_reg = R_EAX,
37ce3522 353 .tcg_features = TCG_KVM_FEATURES,
bffd67b0 354 },
c35bd19a 355 [FEAT_HYPERV_EAX] = {
2d5312da
EH
356 .feat_names = {
357 NULL /* hv_msr_vp_runtime_access */, NULL /* hv_msr_time_refcount_access */,
358 NULL /* hv_msr_synic_access */, NULL /* hv_msr_stimer_access */,
359 NULL /* hv_msr_apic_access */, NULL /* hv_msr_hypercall_access */,
360 NULL /* hv_vpindex_access */, NULL /* hv_msr_reset_access */,
361 NULL /* hv_msr_stats_access */, NULL /* hv_reftsc_access */,
362 NULL /* hv_msr_idle_access */, NULL /* hv_msr_frequency_access */,
363 NULL, NULL, NULL, NULL,
364 NULL, NULL, NULL, NULL,
365 NULL, NULL, NULL, NULL,
366 NULL, NULL, NULL, NULL,
367 NULL, NULL, NULL, NULL,
368 },
c35bd19a
EY
369 .cpuid_eax = 0x40000003, .cpuid_reg = R_EAX,
370 },
371 [FEAT_HYPERV_EBX] = {
2d5312da
EH
372 .feat_names = {
373 NULL /* hv_create_partitions */, NULL /* hv_access_partition_id */,
374 NULL /* hv_access_memory_pool */, NULL /* hv_adjust_message_buffers */,
375 NULL /* hv_post_messages */, NULL /* hv_signal_events */,
376 NULL /* hv_create_port */, NULL /* hv_connect_port */,
377 NULL /* hv_access_stats */, NULL, NULL, NULL /* hv_debugging */,
378 NULL /* hv_cpu_power_management */, NULL /* hv_configure_profiler */,
379 NULL, NULL,
380 NULL, NULL, NULL, NULL,
381 NULL, NULL, NULL, NULL,
382 NULL, NULL, NULL, NULL,
383 NULL, NULL, NULL, NULL,
384 },
c35bd19a
EY
385 .cpuid_eax = 0x40000003, .cpuid_reg = R_EBX,
386 },
387 [FEAT_HYPERV_EDX] = {
2d5312da
EH
388 .feat_names = {
389 NULL /* hv_mwait */, NULL /* hv_guest_debugging */,
390 NULL /* hv_perf_monitor */, NULL /* hv_cpu_dynamic_part */,
391 NULL /* hv_hypercall_params_xmm */, NULL /* hv_guest_idle_state */,
392 NULL, NULL,
393 NULL, NULL, NULL /* hv_guest_crash_msr */, NULL,
394 NULL, NULL, NULL, NULL,
395 NULL, NULL, NULL, NULL,
396 NULL, NULL, NULL, NULL,
397 NULL, NULL, NULL, NULL,
398 NULL, NULL, NULL, NULL,
399 },
c35bd19a
EY
400 .cpuid_eax = 0x40000003, .cpuid_reg = R_EDX,
401 },
bffd67b0 402 [FEAT_SVM] = {
2d5312da 403 .feat_names = {
fc7dfd20
EH
404 "npt", "lbrv", "svm-lock", "nrip-save",
405 "tsc-scale", "vmcb-clean", "flushbyasid", "decodeassists",
406 NULL, NULL, "pause-filter", NULL,
2d5312da
EH
407 "pfthreshold", NULL, NULL, NULL,
408 NULL, NULL, NULL, NULL,
409 NULL, NULL, NULL, NULL,
410 NULL, NULL, NULL, NULL,
411 NULL, NULL, NULL, NULL,
412 },
bffd67b0 413 .cpuid_eax = 0x8000000A, .cpuid_reg = R_EDX,
37ce3522 414 .tcg_features = TCG_SVM_FEATURES,
bffd67b0
EH
415 },
416 [FEAT_7_0_EBX] = {
2d5312da 417 .feat_names = {
fc7dfd20 418 "fsgsbase", "tsc-adjust", NULL, "bmi1",
2d5312da
EH
419 "hle", "avx2", NULL, "smep",
420 "bmi2", "erms", "invpcid", "rtm",
421 NULL, NULL, "mpx", NULL,
422 "avx512f", "avx512dq", "rdseed", "adx",
423 "smap", "avx512ifma", "pcommit", "clflushopt",
424 "clwb", NULL, "avx512pf", "avx512er",
425 "avx512cd", NULL, "avx512bw", "avx512vl",
426 },
04d104b6
EH
427 .cpuid_eax = 7,
428 .cpuid_needs_ecx = true, .cpuid_ecx = 0,
429 .cpuid_reg = R_EBX,
37ce3522 430 .tcg_features = TCG_7_0_EBX_FEATURES,
bffd67b0 431 },
f74eefe0 432 [FEAT_7_0_ECX] = {
2d5312da
EH
433 .feat_names = {
434 NULL, "avx512vbmi", "umip", "pku",
435 "ospke", NULL, NULL, NULL,
436 NULL, NULL, NULL, NULL,
437 NULL, NULL, NULL, NULL,
438 NULL, NULL, NULL, NULL,
439 NULL, NULL, "rdpid", NULL,
440 NULL, NULL, NULL, NULL,
441 NULL, NULL, NULL, NULL,
442 },
f74eefe0
HH
443 .cpuid_eax = 7,
444 .cpuid_needs_ecx = true, .cpuid_ecx = 0,
445 .cpuid_reg = R_ECX,
446 .tcg_features = TCG_7_0_ECX_FEATURES,
447 },
95ea69fb
LK
448 [FEAT_7_0_EDX] = {
449 .feat_names = {
450 NULL, NULL, "avx512-4vnniw", "avx512-4fmaps",
451 NULL, NULL, NULL, NULL,
452 NULL, NULL, NULL, NULL,
453 NULL, NULL, NULL, NULL,
454 NULL, NULL, NULL, NULL,
455 NULL, NULL, NULL, NULL,
456 NULL, NULL, NULL, NULL,
457 NULL, NULL, NULL, NULL,
458 },
459 .cpuid_eax = 7,
460 .cpuid_needs_ecx = true, .cpuid_ecx = 0,
461 .cpuid_reg = R_EDX,
462 .tcg_features = TCG_7_0_EDX_FEATURES,
463 },
303752a9 464 [FEAT_8000_0007_EDX] = {
2d5312da
EH
465 .feat_names = {
466 NULL, NULL, NULL, NULL,
467 NULL, NULL, NULL, NULL,
468 "invtsc", NULL, NULL, NULL,
469 NULL, NULL, NULL, NULL,
470 NULL, NULL, NULL, NULL,
471 NULL, NULL, NULL, NULL,
472 NULL, NULL, NULL, NULL,
473 NULL, NULL, NULL, NULL,
474 },
303752a9
MT
475 .cpuid_eax = 0x80000007,
476 .cpuid_reg = R_EDX,
477 .tcg_features = TCG_APM_FEATURES,
478 .unmigratable_flags = CPUID_APM_INVTSC,
479 },
0bb0b2d2 480 [FEAT_XSAVE] = {
2d5312da
EH
481 .feat_names = {
482 "xsaveopt", "xsavec", "xgetbv1", "xsaves",
483 NULL, NULL, NULL, NULL,
484 NULL, NULL, NULL, NULL,
485 NULL, NULL, NULL, NULL,
486 NULL, NULL, NULL, NULL,
487 NULL, NULL, NULL, NULL,
488 NULL, NULL, NULL, NULL,
489 NULL, NULL, NULL, NULL,
490 },
0bb0b2d2
PB
491 .cpuid_eax = 0xd,
492 .cpuid_needs_ecx = true, .cpuid_ecx = 1,
493 .cpuid_reg = R_EAX,
c9cfe8f9 494 .tcg_features = TCG_XSAVE_FEATURES,
0bb0b2d2 495 },
28b8e4d0 496 [FEAT_6_EAX] = {
2d5312da
EH
497 .feat_names = {
498 NULL, NULL, "arat", NULL,
499 NULL, NULL, NULL, NULL,
500 NULL, NULL, NULL, NULL,
501 NULL, NULL, NULL, NULL,
502 NULL, NULL, NULL, NULL,
503 NULL, NULL, NULL, NULL,
504 NULL, NULL, NULL, NULL,
505 NULL, NULL, NULL, NULL,
506 },
28b8e4d0
JK
507 .cpuid_eax = 6, .cpuid_reg = R_EAX,
508 .tcg_features = TCG_6_EAX_FEATURES,
509 },
96193c22
EH
510 [FEAT_XSAVE_COMP_LO] = {
511 .cpuid_eax = 0xD,
512 .cpuid_needs_ecx = true, .cpuid_ecx = 0,
513 .cpuid_reg = R_EAX,
514 .tcg_features = ~0U,
6fb2fff7
EH
515 .migratable_flags = XSTATE_FP_MASK | XSTATE_SSE_MASK |
516 XSTATE_YMM_MASK | XSTATE_BNDREGS_MASK | XSTATE_BNDCSR_MASK |
517 XSTATE_OPMASK_MASK | XSTATE_ZMM_Hi256_MASK | XSTATE_Hi16_ZMM_MASK |
518 XSTATE_PKRU_MASK,
96193c22
EH
519 },
520 [FEAT_XSAVE_COMP_HI] = {
521 .cpuid_eax = 0xD,
522 .cpuid_needs_ecx = true, .cpuid_ecx = 0,
523 .cpuid_reg = R_EDX,
524 .tcg_features = ~0U,
525 },
5ef57876
EH
526};
527
8e8aba50
EH
528typedef struct X86RegisterInfo32 {
529 /* Name of register */
530 const char *name;
531 /* QAPI enum value register */
532 X86CPURegister32 qapi_enum;
533} X86RegisterInfo32;
534
535#define REGISTER(reg) \
5d371f41 536 [R_##reg] = { .name = #reg, .qapi_enum = X86_CPU_REGISTER32_##reg }
a443bc34 537static const X86RegisterInfo32 x86_reg_info_32[CPU_NB_REGS32] = {
8e8aba50
EH
538 REGISTER(EAX),
539 REGISTER(ECX),
540 REGISTER(EDX),
541 REGISTER(EBX),
542 REGISTER(ESP),
543 REGISTER(EBP),
544 REGISTER(ESI),
545 REGISTER(EDI),
546};
547#undef REGISTER
548
3f32bd21
RH
549typedef struct ExtSaveArea {
550 uint32_t feature, bits;
551 uint32_t offset, size;
552} ExtSaveArea;
553
554static const ExtSaveArea x86_ext_save_areas[] = {
e3c9022b
EH
555 [XSTATE_FP_BIT] = {
556 /* x87 FP state component is always enabled if XSAVE is supported */
557 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
558 /* x87 state is in the legacy region of the XSAVE area */
559 .offset = 0,
560 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
561 },
562 [XSTATE_SSE_BIT] = {
563 /* SSE state component is always enabled if XSAVE is supported */
564 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE,
565 /* SSE state is in the legacy region of the XSAVE area */
566 .offset = 0,
567 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader),
568 },
cfc3b074
PB
569 [XSTATE_YMM_BIT] =
570 { .feature = FEAT_1_ECX, .bits = CPUID_EXT_AVX,
ee1b09f6
EH
571 .offset = offsetof(X86XSaveArea, avx_state),
572 .size = sizeof(XSaveAVX) },
cfc3b074
PB
573 [XSTATE_BNDREGS_BIT] =
574 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
ee1b09f6
EH
575 .offset = offsetof(X86XSaveArea, bndreg_state),
576 .size = sizeof(XSaveBNDREG) },
cfc3b074
PB
577 [XSTATE_BNDCSR_BIT] =
578 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX,
ee1b09f6
EH
579 .offset = offsetof(X86XSaveArea, bndcsr_state),
580 .size = sizeof(XSaveBNDCSR) },
cfc3b074
PB
581 [XSTATE_OPMASK_BIT] =
582 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
ee1b09f6
EH
583 .offset = offsetof(X86XSaveArea, opmask_state),
584 .size = sizeof(XSaveOpmask) },
cfc3b074
PB
585 [XSTATE_ZMM_Hi256_BIT] =
586 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
ee1b09f6
EH
587 .offset = offsetof(X86XSaveArea, zmm_hi256_state),
588 .size = sizeof(XSaveZMM_Hi256) },
cfc3b074
PB
589 [XSTATE_Hi16_ZMM_BIT] =
590 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F,
ee1b09f6
EH
591 .offset = offsetof(X86XSaveArea, hi16_zmm_state),
592 .size = sizeof(XSaveHi16_ZMM) },
cfc3b074
PB
593 [XSTATE_PKRU_BIT] =
594 { .feature = FEAT_7_0_ECX, .bits = CPUID_7_0_ECX_PKU,
ee1b09f6
EH
595 .offset = offsetof(X86XSaveArea, pkru_state),
596 .size = sizeof(XSavePKRU) },
2560f19f 597};
8e8aba50 598
1fda6198
EH
599static uint32_t xsave_area_size(uint64_t mask)
600{
601 int i;
e3c9022b 602 uint64_t ret = 0;
1fda6198 603
e3c9022b 604 for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
1fda6198
EH
605 const ExtSaveArea *esa = &x86_ext_save_areas[i];
606 if ((mask >> i) & 1) {
607 ret = MAX(ret, esa->offset + esa->size);
608 }
609 }
610 return ret;
611}
612
96193c22
EH
613static inline uint64_t x86_cpu_xsave_components(X86CPU *cpu)
614{
615 return ((uint64_t)cpu->env.features[FEAT_XSAVE_COMP_HI]) << 32 |
616 cpu->env.features[FEAT_XSAVE_COMP_LO];
617}
618
8b4beddc
EH
619const char *get_register_name_32(unsigned int reg)
620{
31ccdde2 621 if (reg >= CPU_NB_REGS32) {
8b4beddc
EH
622 return NULL;
623 }
8e8aba50 624 return x86_reg_info_32[reg].name;
8b4beddc
EH
625}
626
84f1b92f
EH
627/*
628 * Returns the set of feature flags that are supported and migratable by
629 * QEMU, for a given FeatureWord.
630 */
631static uint32_t x86_cpu_get_migratable_flags(FeatureWord w)
632{
633 FeatureWordInfo *wi = &feature_word_info[w];
634 uint32_t r = 0;
635 int i;
636
637 for (i = 0; i < 32; i++) {
638 uint32_t f = 1U << i;
6fb2fff7
EH
639
640 /* If the feature name is known, it is implicitly considered migratable,
641 * unless it is explicitly set in unmigratable_flags */
642 if ((wi->migratable_flags & f) ||
643 (wi->feat_names[i] && !(wi->unmigratable_flags & f))) {
644 r |= f;
84f1b92f 645 }
84f1b92f
EH
646 }
647 return r;
648}
649
bb44e0d1
JK
650void host_cpuid(uint32_t function, uint32_t count,
651 uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
bdde476a 652{
a1fd24af
AL
653 uint32_t vec[4];
654
655#ifdef __x86_64__
656 asm volatile("cpuid"
657 : "=a"(vec[0]), "=b"(vec[1]),
658 "=c"(vec[2]), "=d"(vec[3])
659 : "0"(function), "c"(count) : "cc");
c1f41226 660#elif defined(__i386__)
a1fd24af
AL
661 asm volatile("pusha \n\t"
662 "cpuid \n\t"
663 "mov %%eax, 0(%2) \n\t"
664 "mov %%ebx, 4(%2) \n\t"
665 "mov %%ecx, 8(%2) \n\t"
666 "mov %%edx, 12(%2) \n\t"
667 "popa"
668 : : "a"(function), "c"(count), "S"(vec)
669 : "memory", "cc");
c1f41226
EH
670#else
671 abort();
a1fd24af
AL
672#endif
673
bdde476a 674 if (eax)
a1fd24af 675 *eax = vec[0];
bdde476a 676 if (ebx)
a1fd24af 677 *ebx = vec[1];
bdde476a 678 if (ecx)
a1fd24af 679 *ecx = vec[2];
bdde476a 680 if (edx)
a1fd24af 681 *edx = vec[3];
bdde476a 682}
c6dc6f63 683
d940ee9b
EH
684/* CPU class name definitions: */
685
686#define X86_CPU_TYPE_SUFFIX "-" TYPE_X86_CPU
687#define X86_CPU_TYPE_NAME(name) (name X86_CPU_TYPE_SUFFIX)
688
689/* Return type name for a given CPU model name
690 * Caller is responsible for freeing the returned string.
691 */
692static char *x86_cpu_type_name(const char *model_name)
693{
694 return g_strdup_printf(X86_CPU_TYPE_NAME("%s"), model_name);
695}
696
500050d1
AF
697static ObjectClass *x86_cpu_class_by_name(const char *cpu_model)
698{
d940ee9b
EH
699 ObjectClass *oc;
700 char *typename;
701
500050d1
AF
702 if (cpu_model == NULL) {
703 return NULL;
704 }
705
d940ee9b
EH
706 typename = x86_cpu_type_name(cpu_model);
707 oc = object_class_by_name(typename);
708 g_free(typename);
709 return oc;
500050d1
AF
710}
711
104494ea
IM
712static char *x86_cpu_class_get_model_name(X86CPUClass *cc)
713{
714 const char *class_name = object_class_get_name(OBJECT_CLASS(cc));
715 assert(g_str_has_suffix(class_name, X86_CPU_TYPE_SUFFIX));
716 return g_strndup(class_name,
717 strlen(class_name) - strlen(X86_CPU_TYPE_SUFFIX));
718}
719
d940ee9b 720struct X86CPUDefinition {
c6dc6f63
AP
721 const char *name;
722 uint32_t level;
90e4b0c3 723 uint32_t xlevel;
99b88a17
IM
724 /* vendor is zero-terminated, 12 character ASCII string */
725 char vendor[CPUID_VENDOR_SZ + 1];
c6dc6f63
AP
726 int family;
727 int model;
728 int stepping;
0514ef2f 729 FeatureWordArray features;
c6dc6f63 730 char model_id[48];
d940ee9b 731};
c6dc6f63 732
9576de75 733static X86CPUDefinition builtin_x86_defs[] = {
c6dc6f63
AP
734 {
735 .name = "qemu64",
3046bb5d 736 .level = 0xd,
99b88a17 737 .vendor = CPUID_VENDOR_AMD,
c6dc6f63 738 .family = 6,
f8e6a11a 739 .model = 6,
c6dc6f63 740 .stepping = 3,
0514ef2f 741 .features[FEAT_1_EDX] =
27861ecc 742 PPRO_FEATURES |
c6dc6f63 743 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
c6dc6f63 744 CPUID_PSE36,
0514ef2f 745 .features[FEAT_1_ECX] =
6aa91e4a 746 CPUID_EXT_SSE3 | CPUID_EXT_CX16,
0514ef2f 747 .features[FEAT_8000_0001_EDX] =
c6dc6f63 748 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
0514ef2f 749 .features[FEAT_8000_0001_ECX] =
71195672 750 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM,
c6dc6f63 751 .xlevel = 0x8000000A,
9cf2cc3d 752 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
c6dc6f63
AP
753 },
754 {
755 .name = "phenom",
756 .level = 5,
99b88a17 757 .vendor = CPUID_VENDOR_AMD,
c6dc6f63
AP
758 .family = 16,
759 .model = 2,
760 .stepping = 3,
b9fc20bc 761 /* Missing: CPUID_HT */
0514ef2f 762 .features[FEAT_1_EDX] =
27861ecc 763 PPRO_FEATURES |
c6dc6f63 764 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
b9fc20bc 765 CPUID_PSE36 | CPUID_VME,
0514ef2f 766 .features[FEAT_1_ECX] =
27861ecc 767 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_CX16 |
c6dc6f63 768 CPUID_EXT_POPCNT,
0514ef2f 769 .features[FEAT_8000_0001_EDX] =
c6dc6f63
AP
770 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX |
771 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_MMXEXT |
8560efed 772 CPUID_EXT2_FFXSR | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP,
c6dc6f63
AP
773 /* Missing: CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
774 CPUID_EXT3_CR8LEG,
775 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
776 CPUID_EXT3_OSVW, CPUID_EXT3_IBS */
0514ef2f 777 .features[FEAT_8000_0001_ECX] =
27861ecc 778 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM |
c6dc6f63 779 CPUID_EXT3_ABM | CPUID_EXT3_SSE4A,
b9fc20bc 780 /* Missing: CPUID_SVM_LBRV */
0514ef2f 781 .features[FEAT_SVM] =
b9fc20bc 782 CPUID_SVM_NPT,
c6dc6f63
AP
783 .xlevel = 0x8000001A,
784 .model_id = "AMD Phenom(tm) 9550 Quad-Core Processor"
785 },
786 {
787 .name = "core2duo",
788 .level = 10,
99b88a17 789 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
790 .family = 6,
791 .model = 15,
792 .stepping = 11,
b9fc20bc 793 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
0514ef2f 794 .features[FEAT_1_EDX] =
27861ecc 795 PPRO_FEATURES |
c6dc6f63 796 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
b9fc20bc
EH
797 CPUID_PSE36 | CPUID_VME | CPUID_ACPI | CPUID_SS,
798 /* Missing: CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_EST,
e93abc14 799 * CPUID_EXT_TM2, CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_VMX */
0514ef2f 800 .features[FEAT_1_ECX] =
27861ecc 801 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
e93abc14 802 CPUID_EXT_CX16,
0514ef2f 803 .features[FEAT_8000_0001_EDX] =
27861ecc 804 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
0514ef2f 805 .features[FEAT_8000_0001_ECX] =
27861ecc 806 CPUID_EXT3_LAHF_LM,
c6dc6f63
AP
807 .xlevel = 0x80000008,
808 .model_id = "Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz",
809 },
810 {
811 .name = "kvm64",
3046bb5d 812 .level = 0xd,
99b88a17 813 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
814 .family = 15,
815 .model = 6,
816 .stepping = 1,
b3a4f0b1 817 /* Missing: CPUID_HT */
0514ef2f 818 .features[FEAT_1_EDX] =
b3a4f0b1 819 PPRO_FEATURES | CPUID_VME |
c6dc6f63
AP
820 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
821 CPUID_PSE36,
822 /* Missing: CPUID_EXT_POPCNT, CPUID_EXT_MONITOR */
0514ef2f 823 .features[FEAT_1_ECX] =
27861ecc 824 CPUID_EXT_SSE3 | CPUID_EXT_CX16,
c6dc6f63 825 /* Missing: CPUID_EXT2_PDPE1GB, CPUID_EXT2_RDTSCP */
0514ef2f 826 .features[FEAT_8000_0001_EDX] =
c6dc6f63
AP
827 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
828 /* Missing: CPUID_EXT3_LAHF_LM, CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
829 CPUID_EXT3_CR8LEG, CPUID_EXT3_ABM, CPUID_EXT3_SSE4A,
830 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
831 CPUID_EXT3_OSVW, CPUID_EXT3_IBS, CPUID_EXT3_SVM */
0514ef2f 832 .features[FEAT_8000_0001_ECX] =
27861ecc 833 0,
c6dc6f63
AP
834 .xlevel = 0x80000008,
835 .model_id = "Common KVM processor"
836 },
c6dc6f63
AP
837 {
838 .name = "qemu32",
839 .level = 4,
99b88a17 840 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63 841 .family = 6,
f8e6a11a 842 .model = 6,
c6dc6f63 843 .stepping = 3,
0514ef2f 844 .features[FEAT_1_EDX] =
27861ecc 845 PPRO_FEATURES,
0514ef2f 846 .features[FEAT_1_ECX] =
6aa91e4a 847 CPUID_EXT_SSE3,
58012d66 848 .xlevel = 0x80000004,
9cf2cc3d 849 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
c6dc6f63 850 },
eafaf1e5
AP
851 {
852 .name = "kvm32",
853 .level = 5,
99b88a17 854 .vendor = CPUID_VENDOR_INTEL,
eafaf1e5
AP
855 .family = 15,
856 .model = 6,
857 .stepping = 1,
0514ef2f 858 .features[FEAT_1_EDX] =
b3a4f0b1 859 PPRO_FEATURES | CPUID_VME |
eafaf1e5 860 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_PSE36,
0514ef2f 861 .features[FEAT_1_ECX] =
27861ecc 862 CPUID_EXT_SSE3,
0514ef2f 863 .features[FEAT_8000_0001_ECX] =
27861ecc 864 0,
eafaf1e5
AP
865 .xlevel = 0x80000008,
866 .model_id = "Common 32-bit KVM processor"
867 },
c6dc6f63
AP
868 {
869 .name = "coreduo",
870 .level = 10,
99b88a17 871 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
872 .family = 6,
873 .model = 14,
874 .stepping = 8,
b9fc20bc 875 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
0514ef2f 876 .features[FEAT_1_EDX] =
27861ecc 877 PPRO_FEATURES | CPUID_VME |
b9fc20bc
EH
878 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_ACPI |
879 CPUID_SS,
880 /* Missing: CPUID_EXT_EST, CPUID_EXT_TM2 , CPUID_EXT_XTPR,
e93abc14 881 * CPUID_EXT_PDCM, CPUID_EXT_VMX */
0514ef2f 882 .features[FEAT_1_ECX] =
e93abc14 883 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR,
0514ef2f 884 .features[FEAT_8000_0001_EDX] =
27861ecc 885 CPUID_EXT2_NX,
c6dc6f63
AP
886 .xlevel = 0x80000008,
887 .model_id = "Genuine Intel(R) CPU T2600 @ 2.16GHz",
888 },
889 {
890 .name = "486",
58012d66 891 .level = 1,
99b88a17 892 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63 893 .family = 4,
b2a856d9 894 .model = 8,
c6dc6f63 895 .stepping = 0,
0514ef2f 896 .features[FEAT_1_EDX] =
27861ecc 897 I486_FEATURES,
c6dc6f63
AP
898 .xlevel = 0,
899 },
900 {
901 .name = "pentium",
902 .level = 1,
99b88a17 903 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
904 .family = 5,
905 .model = 4,
906 .stepping = 3,
0514ef2f 907 .features[FEAT_1_EDX] =
27861ecc 908 PENTIUM_FEATURES,
c6dc6f63
AP
909 .xlevel = 0,
910 },
911 {
912 .name = "pentium2",
913 .level = 2,
99b88a17 914 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
915 .family = 6,
916 .model = 5,
917 .stepping = 2,
0514ef2f 918 .features[FEAT_1_EDX] =
27861ecc 919 PENTIUM2_FEATURES,
c6dc6f63
AP
920 .xlevel = 0,
921 },
922 {
923 .name = "pentium3",
3046bb5d 924 .level = 3,
99b88a17 925 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
926 .family = 6,
927 .model = 7,
928 .stepping = 3,
0514ef2f 929 .features[FEAT_1_EDX] =
27861ecc 930 PENTIUM3_FEATURES,
c6dc6f63
AP
931 .xlevel = 0,
932 },
933 {
934 .name = "athlon",
935 .level = 2,
99b88a17 936 .vendor = CPUID_VENDOR_AMD,
c6dc6f63
AP
937 .family = 6,
938 .model = 2,
939 .stepping = 3,
0514ef2f 940 .features[FEAT_1_EDX] =
27861ecc 941 PPRO_FEATURES | CPUID_PSE36 | CPUID_VME | CPUID_MTRR |
60032ac0 942 CPUID_MCA,
0514ef2f 943 .features[FEAT_8000_0001_EDX] =
60032ac0 944 CPUID_EXT2_MMXEXT | CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT,
c6dc6f63 945 .xlevel = 0x80000008,
9cf2cc3d 946 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION,
c6dc6f63
AP
947 },
948 {
949 .name = "n270",
3046bb5d 950 .level = 10,
99b88a17 951 .vendor = CPUID_VENDOR_INTEL,
c6dc6f63
AP
952 .family = 6,
953 .model = 28,
954 .stepping = 2,
b9fc20bc 955 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */
0514ef2f 956 .features[FEAT_1_EDX] =
27861ecc 957 PPRO_FEATURES |
b9fc20bc
EH
958 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_VME |
959 CPUID_ACPI | CPUID_SS,
c6dc6f63 960 /* Some CPUs got no CPUID_SEP */
b9fc20bc
EH
961 /* Missing: CPUID_EXT_DSCPL, CPUID_EXT_EST, CPUID_EXT_TM2,
962 * CPUID_EXT_XTPR */
0514ef2f 963 .features[FEAT_1_ECX] =
27861ecc 964 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 |
4458c236 965 CPUID_EXT_MOVBE,
0514ef2f 966 .features[FEAT_8000_0001_EDX] =
60032ac0 967 CPUID_EXT2_NX,
0514ef2f 968 .features[FEAT_8000_0001_ECX] =
27861ecc 969 CPUID_EXT3_LAHF_LM,
3046bb5d 970 .xlevel = 0x80000008,
c6dc6f63
AP
971 .model_id = "Intel(R) Atom(TM) CPU N270 @ 1.60GHz",
972 },
3eca4642
EH
973 {
974 .name = "Conroe",
3046bb5d 975 .level = 10,
99b88a17 976 .vendor = CPUID_VENDOR_INTEL,
3eca4642 977 .family = 6,
ffce9ebb 978 .model = 15,
3eca4642 979 .stepping = 3,
0514ef2f 980 .features[FEAT_1_EDX] =
b3a4f0b1 981 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
982 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
983 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
984 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
985 CPUID_DE | CPUID_FP87,
0514ef2f 986 .features[FEAT_1_ECX] =
27861ecc 987 CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
0514ef2f 988 .features[FEAT_8000_0001_EDX] =
27861ecc 989 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
0514ef2f 990 .features[FEAT_8000_0001_ECX] =
27861ecc 991 CPUID_EXT3_LAHF_LM,
3046bb5d 992 .xlevel = 0x80000008,
3eca4642
EH
993 .model_id = "Intel Celeron_4x0 (Conroe/Merom Class Core 2)",
994 },
995 {
996 .name = "Penryn",
3046bb5d 997 .level = 10,
99b88a17 998 .vendor = CPUID_VENDOR_INTEL,
3eca4642 999 .family = 6,
ffce9ebb 1000 .model = 23,
3eca4642 1001 .stepping = 3,
0514ef2f 1002 .features[FEAT_1_EDX] =
b3a4f0b1 1003 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
1004 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1005 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1006 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1007 CPUID_DE | CPUID_FP87,
0514ef2f 1008 .features[FEAT_1_ECX] =
27861ecc 1009 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
b3fb3a20 1010 CPUID_EXT_SSE3,
0514ef2f 1011 .features[FEAT_8000_0001_EDX] =
27861ecc 1012 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL,
0514ef2f 1013 .features[FEAT_8000_0001_ECX] =
27861ecc 1014 CPUID_EXT3_LAHF_LM,
3046bb5d 1015 .xlevel = 0x80000008,
3eca4642
EH
1016 .model_id = "Intel Core 2 Duo P9xxx (Penryn Class Core 2)",
1017 },
1018 {
1019 .name = "Nehalem",
3046bb5d 1020 .level = 11,
99b88a17 1021 .vendor = CPUID_VENDOR_INTEL,
3eca4642 1022 .family = 6,
ffce9ebb 1023 .model = 26,
3eca4642 1024 .stepping = 3,
0514ef2f 1025 .features[FEAT_1_EDX] =
b3a4f0b1 1026 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
1027 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1028 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1029 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1030 CPUID_DE | CPUID_FP87,
0514ef2f 1031 .features[FEAT_1_ECX] =
27861ecc 1032 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
b3fb3a20 1033 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3,
0514ef2f 1034 .features[FEAT_8000_0001_EDX] =
27861ecc 1035 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
0514ef2f 1036 .features[FEAT_8000_0001_ECX] =
27861ecc 1037 CPUID_EXT3_LAHF_LM,
3046bb5d 1038 .xlevel = 0x80000008,
3eca4642
EH
1039 .model_id = "Intel Core i7 9xx (Nehalem Class Core i7)",
1040 },
1041 {
1042 .name = "Westmere",
1043 .level = 11,
99b88a17 1044 .vendor = CPUID_VENDOR_INTEL,
3eca4642
EH
1045 .family = 6,
1046 .model = 44,
1047 .stepping = 1,
0514ef2f 1048 .features[FEAT_1_EDX] =
b3a4f0b1 1049 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
1050 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1051 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1052 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1053 CPUID_DE | CPUID_FP87,
0514ef2f 1054 .features[FEAT_1_ECX] =
27861ecc 1055 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
b3fb3a20
EH
1056 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
1057 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
0514ef2f 1058 .features[FEAT_8000_0001_EDX] =
27861ecc 1059 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
0514ef2f 1060 .features[FEAT_8000_0001_ECX] =
27861ecc 1061 CPUID_EXT3_LAHF_LM,
28b8e4d0
JK
1062 .features[FEAT_6_EAX] =
1063 CPUID_6_EAX_ARAT,
3046bb5d 1064 .xlevel = 0x80000008,
3eca4642
EH
1065 .model_id = "Westmere E56xx/L56xx/X56xx (Nehalem-C)",
1066 },
1067 {
1068 .name = "SandyBridge",
1069 .level = 0xd,
99b88a17 1070 .vendor = CPUID_VENDOR_INTEL,
3eca4642
EH
1071 .family = 6,
1072 .model = 42,
1073 .stepping = 1,
0514ef2f 1074 .features[FEAT_1_EDX] =
b3a4f0b1 1075 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
1076 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1077 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1078 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1079 CPUID_DE | CPUID_FP87,
0514ef2f 1080 .features[FEAT_1_ECX] =
27861ecc 1081 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
b3fb3a20
EH
1082 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
1083 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
1084 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
1085 CPUID_EXT_SSE3,
0514ef2f 1086 .features[FEAT_8000_0001_EDX] =
27861ecc 1087 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
b3fb3a20 1088 CPUID_EXT2_SYSCALL,
0514ef2f 1089 .features[FEAT_8000_0001_ECX] =
27861ecc 1090 CPUID_EXT3_LAHF_LM,
0bb0b2d2
PB
1091 .features[FEAT_XSAVE] =
1092 CPUID_XSAVE_XSAVEOPT,
28b8e4d0
JK
1093 .features[FEAT_6_EAX] =
1094 CPUID_6_EAX_ARAT,
3046bb5d 1095 .xlevel = 0x80000008,
3eca4642
EH
1096 .model_id = "Intel Xeon E312xx (Sandy Bridge)",
1097 },
2f9ac42a
PB
1098 {
1099 .name = "IvyBridge",
1100 .level = 0xd,
1101 .vendor = CPUID_VENDOR_INTEL,
1102 .family = 6,
1103 .model = 58,
1104 .stepping = 9,
1105 .features[FEAT_1_EDX] =
1106 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1107 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1108 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1109 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1110 CPUID_DE | CPUID_FP87,
1111 .features[FEAT_1_ECX] =
1112 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
1113 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT |
1114 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
1115 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
1116 CPUID_EXT_SSE3 | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
1117 .features[FEAT_7_0_EBX] =
1118 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP |
1119 CPUID_7_0_EBX_ERMS,
1120 .features[FEAT_8000_0001_EDX] =
1121 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
1122 CPUID_EXT2_SYSCALL,
1123 .features[FEAT_8000_0001_ECX] =
1124 CPUID_EXT3_LAHF_LM,
1125 .features[FEAT_XSAVE] =
1126 CPUID_XSAVE_XSAVEOPT,
28b8e4d0
JK
1127 .features[FEAT_6_EAX] =
1128 CPUID_6_EAX_ARAT,
3046bb5d 1129 .xlevel = 0x80000008,
2f9ac42a
PB
1130 .model_id = "Intel Xeon E3-12xx v2 (Ivy Bridge)",
1131 },
37507094 1132 {
a356850b
EH
1133 .name = "Haswell-noTSX",
1134 .level = 0xd,
1135 .vendor = CPUID_VENDOR_INTEL,
1136 .family = 6,
1137 .model = 60,
1138 .stepping = 1,
1139 .features[FEAT_1_EDX] =
1140 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1141 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1142 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1143 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1144 CPUID_DE | CPUID_FP87,
1145 .features[FEAT_1_ECX] =
1146 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
1147 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
1148 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
1149 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
1150 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
1151 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
1152 .features[FEAT_8000_0001_EDX] =
1153 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
1154 CPUID_EXT2_SYSCALL,
1155 .features[FEAT_8000_0001_ECX] =
becb6667 1156 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
a356850b
EH
1157 .features[FEAT_7_0_EBX] =
1158 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
1159 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
1160 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID,
1161 .features[FEAT_XSAVE] =
1162 CPUID_XSAVE_XSAVEOPT,
28b8e4d0
JK
1163 .features[FEAT_6_EAX] =
1164 CPUID_6_EAX_ARAT,
3046bb5d 1165 .xlevel = 0x80000008,
a356850b
EH
1166 .model_id = "Intel Core Processor (Haswell, no TSX)",
1167 }, {
37507094
EH
1168 .name = "Haswell",
1169 .level = 0xd,
99b88a17 1170 .vendor = CPUID_VENDOR_INTEL,
37507094
EH
1171 .family = 6,
1172 .model = 60,
1173 .stepping = 1,
0514ef2f 1174 .features[FEAT_1_EDX] =
b3a4f0b1 1175 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
1176 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1177 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1178 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1179 CPUID_DE | CPUID_FP87,
0514ef2f 1180 .features[FEAT_1_ECX] =
27861ecc 1181 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
b3fb3a20
EH
1182 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
1183 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
1184 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
1185 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
78a611f1 1186 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
0514ef2f 1187 .features[FEAT_8000_0001_EDX] =
27861ecc 1188 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
b3fb3a20 1189 CPUID_EXT2_SYSCALL,
0514ef2f 1190 .features[FEAT_8000_0001_ECX] =
becb6667 1191 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM,
0514ef2f 1192 .features[FEAT_7_0_EBX] =
27861ecc 1193 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
1ee91598
EH
1194 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
1195 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
1196 CPUID_7_0_EBX_RTM,
0bb0b2d2
PB
1197 .features[FEAT_XSAVE] =
1198 CPUID_XSAVE_XSAVEOPT,
28b8e4d0
JK
1199 .features[FEAT_6_EAX] =
1200 CPUID_6_EAX_ARAT,
3046bb5d 1201 .xlevel = 0x80000008,
37507094
EH
1202 .model_id = "Intel Core Processor (Haswell)",
1203 },
a356850b
EH
1204 {
1205 .name = "Broadwell-noTSX",
1206 .level = 0xd,
1207 .vendor = CPUID_VENDOR_INTEL,
1208 .family = 6,
1209 .model = 61,
1210 .stepping = 2,
1211 .features[FEAT_1_EDX] =
1212 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1213 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1214 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1215 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1216 CPUID_DE | CPUID_FP87,
1217 .features[FEAT_1_ECX] =
1218 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
1219 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
1220 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
1221 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
1222 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
1223 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
1224 .features[FEAT_8000_0001_EDX] =
1225 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
1226 CPUID_EXT2_SYSCALL,
1227 .features[FEAT_8000_0001_ECX] =
becb6667 1228 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
a356850b
EH
1229 .features[FEAT_7_0_EBX] =
1230 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
1231 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
1232 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
1233 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
1234 CPUID_7_0_EBX_SMAP,
1235 .features[FEAT_XSAVE] =
1236 CPUID_XSAVE_XSAVEOPT,
28b8e4d0
JK
1237 .features[FEAT_6_EAX] =
1238 CPUID_6_EAX_ARAT,
3046bb5d 1239 .xlevel = 0x80000008,
a356850b
EH
1240 .model_id = "Intel Core Processor (Broadwell, no TSX)",
1241 },
ece01354
EH
1242 {
1243 .name = "Broadwell",
1244 .level = 0xd,
1245 .vendor = CPUID_VENDOR_INTEL,
1246 .family = 6,
1247 .model = 61,
1248 .stepping = 2,
1249 .features[FEAT_1_EDX] =
b3a4f0b1 1250 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
ece01354
EH
1251 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1252 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1253 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1254 CPUID_DE | CPUID_FP87,
1255 .features[FEAT_1_ECX] =
1256 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
1257 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
1258 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
1259 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
1260 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
78a611f1 1261 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
ece01354
EH
1262 .features[FEAT_8000_0001_EDX] =
1263 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
1264 CPUID_EXT2_SYSCALL,
1265 .features[FEAT_8000_0001_ECX] =
becb6667 1266 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
ece01354
EH
1267 .features[FEAT_7_0_EBX] =
1268 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
1ee91598 1269 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
ece01354 1270 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
1ee91598 1271 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
ece01354 1272 CPUID_7_0_EBX_SMAP,
0bb0b2d2
PB
1273 .features[FEAT_XSAVE] =
1274 CPUID_XSAVE_XSAVEOPT,
28b8e4d0
JK
1275 .features[FEAT_6_EAX] =
1276 CPUID_6_EAX_ARAT,
3046bb5d 1277 .xlevel = 0x80000008,
ece01354
EH
1278 .model_id = "Intel Core Processor (Broadwell)",
1279 },
f6f949e9
EH
1280 {
1281 .name = "Skylake-Client",
1282 .level = 0xd,
1283 .vendor = CPUID_VENDOR_INTEL,
1284 .family = 6,
1285 .model = 94,
1286 .stepping = 3,
1287 .features[FEAT_1_EDX] =
1288 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
1289 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1290 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1291 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1292 CPUID_DE | CPUID_FP87,
1293 .features[FEAT_1_ECX] =
1294 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
1295 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 |
1296 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 |
1297 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 |
1298 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE |
1299 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND,
1300 .features[FEAT_8000_0001_EDX] =
1301 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX |
1302 CPUID_EXT2_SYSCALL,
1303 .features[FEAT_8000_0001_ECX] =
1304 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH,
1305 .features[FEAT_7_0_EBX] =
1306 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 |
1307 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP |
1308 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID |
1309 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX |
1310 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_MPX,
1311 /* Missing: XSAVES (not supported by some Linux versions,
1312 * including v4.1 to v4.6).
1313 * KVM doesn't yet expose any XSAVES state save component,
1314 * and the only one defined in Skylake (processor tracing)
1315 * probably will block migration anyway.
1316 */
1317 .features[FEAT_XSAVE] =
1318 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC |
1319 CPUID_XSAVE_XGETBV1,
1320 .features[FEAT_6_EAX] =
1321 CPUID_6_EAX_ARAT,
1322 .xlevel = 0x80000008,
1323 .model_id = "Intel Core Processor (Skylake)",
1324 },
3eca4642
EH
1325 {
1326 .name = "Opteron_G1",
1327 .level = 5,
99b88a17 1328 .vendor = CPUID_VENDOR_AMD,
3eca4642
EH
1329 .family = 15,
1330 .model = 6,
1331 .stepping = 1,
0514ef2f 1332 .features[FEAT_1_EDX] =
b3a4f0b1 1333 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
1334 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1335 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1336 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1337 CPUID_DE | CPUID_FP87,
0514ef2f 1338 .features[FEAT_1_ECX] =
27861ecc 1339 CPUID_EXT_SSE3,
0514ef2f 1340 .features[FEAT_8000_0001_EDX] =
27861ecc 1341 CPUID_EXT2_LM | CPUID_EXT2_FXSR | CPUID_EXT2_MMX |
b3fb3a20
EH
1342 CPUID_EXT2_NX | CPUID_EXT2_PSE36 | CPUID_EXT2_PAT |
1343 CPUID_EXT2_CMOV | CPUID_EXT2_MCA | CPUID_EXT2_PGE |
1344 CPUID_EXT2_MTRR | CPUID_EXT2_SYSCALL | CPUID_EXT2_APIC |
1345 CPUID_EXT2_CX8 | CPUID_EXT2_MCE | CPUID_EXT2_PAE | CPUID_EXT2_MSR |
1346 CPUID_EXT2_TSC | CPUID_EXT2_PSE | CPUID_EXT2_DE | CPUID_EXT2_FPU,
3eca4642
EH
1347 .xlevel = 0x80000008,
1348 .model_id = "AMD Opteron 240 (Gen 1 Class Opteron)",
1349 },
1350 {
1351 .name = "Opteron_G2",
1352 .level = 5,
99b88a17 1353 .vendor = CPUID_VENDOR_AMD,
3eca4642
EH
1354 .family = 15,
1355 .model = 6,
1356 .stepping = 1,
0514ef2f 1357 .features[FEAT_1_EDX] =
b3a4f0b1 1358 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
1359 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1360 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1361 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1362 CPUID_DE | CPUID_FP87,
0514ef2f 1363 .features[FEAT_1_ECX] =
27861ecc 1364 CPUID_EXT_CX16 | CPUID_EXT_SSE3,
33b5e8c0 1365 /* Missing: CPUID_EXT2_RDTSCP */
0514ef2f 1366 .features[FEAT_8000_0001_EDX] =
33b5e8c0 1367 CPUID_EXT2_LM | CPUID_EXT2_FXSR |
b3fb3a20
EH
1368 CPUID_EXT2_MMX | CPUID_EXT2_NX | CPUID_EXT2_PSE36 |
1369 CPUID_EXT2_PAT | CPUID_EXT2_CMOV | CPUID_EXT2_MCA |
1370 CPUID_EXT2_PGE | CPUID_EXT2_MTRR | CPUID_EXT2_SYSCALL |
1371 CPUID_EXT2_APIC | CPUID_EXT2_CX8 | CPUID_EXT2_MCE |
1372 CPUID_EXT2_PAE | CPUID_EXT2_MSR | CPUID_EXT2_TSC | CPUID_EXT2_PSE |
1373 CPUID_EXT2_DE | CPUID_EXT2_FPU,
0514ef2f 1374 .features[FEAT_8000_0001_ECX] =
27861ecc 1375 CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
3eca4642
EH
1376 .xlevel = 0x80000008,
1377 .model_id = "AMD Opteron 22xx (Gen 2 Class Opteron)",
1378 },
1379 {
1380 .name = "Opteron_G3",
1381 .level = 5,
99b88a17 1382 .vendor = CPUID_VENDOR_AMD,
339892d7
EY
1383 .family = 16,
1384 .model = 2,
1385 .stepping = 3,
0514ef2f 1386 .features[FEAT_1_EDX] =
b3a4f0b1 1387 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
1388 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1389 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1390 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1391 CPUID_DE | CPUID_FP87,
0514ef2f 1392 .features[FEAT_1_ECX] =
27861ecc 1393 CPUID_EXT_POPCNT | CPUID_EXT_CX16 | CPUID_EXT_MONITOR |
b3fb3a20 1394 CPUID_EXT_SSE3,
33b5e8c0 1395 /* Missing: CPUID_EXT2_RDTSCP */
0514ef2f 1396 .features[FEAT_8000_0001_EDX] =
33b5e8c0 1397 CPUID_EXT2_LM | CPUID_EXT2_FXSR |
b3fb3a20
EH
1398 CPUID_EXT2_MMX | CPUID_EXT2_NX | CPUID_EXT2_PSE36 |
1399 CPUID_EXT2_PAT | CPUID_EXT2_CMOV | CPUID_EXT2_MCA |
1400 CPUID_EXT2_PGE | CPUID_EXT2_MTRR | CPUID_EXT2_SYSCALL |
1401 CPUID_EXT2_APIC | CPUID_EXT2_CX8 | CPUID_EXT2_MCE |
1402 CPUID_EXT2_PAE | CPUID_EXT2_MSR | CPUID_EXT2_TSC | CPUID_EXT2_PSE |
1403 CPUID_EXT2_DE | CPUID_EXT2_FPU,
0514ef2f 1404 .features[FEAT_8000_0001_ECX] =
27861ecc 1405 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A |
b3fb3a20 1406 CPUID_EXT3_ABM | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM,
3eca4642
EH
1407 .xlevel = 0x80000008,
1408 .model_id = "AMD Opteron 23xx (Gen 3 Class Opteron)",
1409 },
1410 {
1411 .name = "Opteron_G4",
1412 .level = 0xd,
99b88a17 1413 .vendor = CPUID_VENDOR_AMD,
3eca4642
EH
1414 .family = 21,
1415 .model = 1,
1416 .stepping = 2,
0514ef2f 1417 .features[FEAT_1_EDX] =
b3a4f0b1 1418 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
1419 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1420 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1421 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1422 CPUID_DE | CPUID_FP87,
0514ef2f 1423 .features[FEAT_1_ECX] =
27861ecc 1424 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES |
b3fb3a20
EH
1425 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 |
1426 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ |
1427 CPUID_EXT_SSE3,
33b5e8c0 1428 /* Missing: CPUID_EXT2_RDTSCP */
0514ef2f 1429 .features[FEAT_8000_0001_EDX] =
33b5e8c0 1430 CPUID_EXT2_LM |
b3fb3a20
EH
1431 CPUID_EXT2_PDPE1GB | CPUID_EXT2_FXSR | CPUID_EXT2_MMX |
1432 CPUID_EXT2_NX | CPUID_EXT2_PSE36 | CPUID_EXT2_PAT |
1433 CPUID_EXT2_CMOV | CPUID_EXT2_MCA | CPUID_EXT2_PGE |
1434 CPUID_EXT2_MTRR | CPUID_EXT2_SYSCALL | CPUID_EXT2_APIC |
1435 CPUID_EXT2_CX8 | CPUID_EXT2_MCE | CPUID_EXT2_PAE | CPUID_EXT2_MSR |
1436 CPUID_EXT2_TSC | CPUID_EXT2_PSE | CPUID_EXT2_DE | CPUID_EXT2_FPU,
0514ef2f 1437 .features[FEAT_8000_0001_ECX] =
27861ecc 1438 CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
b3fb3a20
EH
1439 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
1440 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
1441 CPUID_EXT3_LAHF_LM,
0bb0b2d2 1442 /* no xsaveopt! */
3eca4642
EH
1443 .xlevel = 0x8000001A,
1444 .model_id = "AMD Opteron 62xx class CPU",
1445 },
021941b9
AP
1446 {
1447 .name = "Opteron_G5",
1448 .level = 0xd,
99b88a17 1449 .vendor = CPUID_VENDOR_AMD,
021941b9
AP
1450 .family = 21,
1451 .model = 2,
1452 .stepping = 0,
0514ef2f 1453 .features[FEAT_1_EDX] =
b3a4f0b1 1454 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX |
b3fb3a20
EH
1455 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA |
1456 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 |
1457 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE |
1458 CPUID_DE | CPUID_FP87,
0514ef2f 1459 .features[FEAT_1_ECX] =
27861ecc 1460 CPUID_EXT_F16C | CPUID_EXT_AVX | CPUID_EXT_XSAVE |
b3fb3a20
EH
1461 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 |
1462 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_FMA |
1463 CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3,
33b5e8c0 1464 /* Missing: CPUID_EXT2_RDTSCP */
0514ef2f 1465 .features[FEAT_8000_0001_EDX] =
33b5e8c0 1466 CPUID_EXT2_LM |
b3fb3a20
EH
1467 CPUID_EXT2_PDPE1GB | CPUID_EXT2_FXSR | CPUID_EXT2_MMX |
1468 CPUID_EXT2_NX | CPUID_EXT2_PSE36 | CPUID_EXT2_PAT |
1469 CPUID_EXT2_CMOV | CPUID_EXT2_MCA | CPUID_EXT2_PGE |
1470 CPUID_EXT2_MTRR | CPUID_EXT2_SYSCALL | CPUID_EXT2_APIC |
1471 CPUID_EXT2_CX8 | CPUID_EXT2_MCE | CPUID_EXT2_PAE | CPUID_EXT2_MSR |
1472 CPUID_EXT2_TSC | CPUID_EXT2_PSE | CPUID_EXT2_DE | CPUID_EXT2_FPU,
0514ef2f 1473 .features[FEAT_8000_0001_ECX] =
27861ecc 1474 CPUID_EXT3_TBM | CPUID_EXT3_FMA4 | CPUID_EXT3_XOP |
b3fb3a20
EH
1475 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE |
1476 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM |
1477 CPUID_EXT3_LAHF_LM,
0bb0b2d2 1478 /* no xsaveopt! */
021941b9
AP
1479 .xlevel = 0x8000001A,
1480 .model_id = "AMD Opteron 63xx class CPU",
1481 },
c6dc6f63
AP
1482};
1483
5114e842
EH
1484typedef struct PropValue {
1485 const char *prop, *value;
1486} PropValue;
1487
1488/* KVM-specific features that are automatically added/removed
1489 * from all CPU models when KVM is enabled.
1490 */
1491static PropValue kvm_default_props[] = {
1492 { "kvmclock", "on" },
1493 { "kvm-nopiodelay", "on" },
1494 { "kvm-asyncpf", "on" },
1495 { "kvm-steal-time", "on" },
1496 { "kvm-pv-eoi", "on" },
1497 { "kvmclock-stable-bit", "on" },
1498 { "x2apic", "on" },
1499 { "acpi", "off" },
1500 { "monitor", "off" },
1501 { "svm", "off" },
1502 { NULL, NULL },
1503};
1504
04d99c3c
EH
1505/* TCG-specific defaults that override all CPU models when using TCG
1506 */
1507static PropValue tcg_default_props[] = {
1508 { "vme", "off" },
1509 { NULL, NULL },
1510};
1511
1512
5114e842
EH
1513void x86_cpu_change_kvm_default(const char *prop, const char *value)
1514{
1515 PropValue *pv;
1516 for (pv = kvm_default_props; pv->prop; pv++) {
1517 if (!strcmp(pv->prop, prop)) {
1518 pv->value = value;
1519 break;
1520 }
1521 }
1522
1523 /* It is valid to call this function only for properties that
1524 * are already present in the kvm_default_props table.
1525 */
1526 assert(pv->prop);
1527}
1528
4d1b279b
EH
1529static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w,
1530 bool migratable_only);
1531
d940ee9b
EH
1532#ifdef CONFIG_KVM
1533
40bfe48f
HZ
1534static bool lmce_supported(void)
1535{
1536 uint64_t mce_cap;
1537
1538 if (kvm_ioctl(kvm_state, KVM_X86_GET_MCE_CAP_SUPPORTED, &mce_cap) < 0) {
1539 return false;
1540 }
1541
1542 return !!(mce_cap & MCG_LMCE_P);
1543}
1544
c6dc6f63
AP
1545static int cpu_x86_fill_model_id(char *str)
1546{
1547 uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0;
1548 int i;
1549
1550 for (i = 0; i < 3; i++) {
1551 host_cpuid(0x80000002 + i, 0, &eax, &ebx, &ecx, &edx);
1552 memcpy(str + i * 16 + 0, &eax, 4);
1553 memcpy(str + i * 16 + 4, &ebx, 4);
1554 memcpy(str + i * 16 + 8, &ecx, 4);
1555 memcpy(str + i * 16 + 12, &edx, 4);
1556 }
1557 return 0;
1558}
1559
d940ee9b
EH
1560static X86CPUDefinition host_cpudef;
1561
84f1b92f 1562static Property host_x86_cpu_properties[] = {
120eee7d 1563 DEFINE_PROP_BOOL("migratable", X86CPU, migratable, true),
e265e3e4 1564 DEFINE_PROP_BOOL("host-cache-info", X86CPU, cache_info_passthrough, false),
84f1b92f
EH
1565 DEFINE_PROP_END_OF_LIST()
1566};
1567
d940ee9b 1568/* class_init for the "host" CPU model
6e746f30 1569 *
d940ee9b 1570 * This function may be called before KVM is initialized.
6e746f30 1571 */
d940ee9b 1572static void host_x86_cpu_class_init(ObjectClass *oc, void *data)
c6dc6f63 1573{
84f1b92f 1574 DeviceClass *dc = DEVICE_CLASS(oc);
d940ee9b 1575 X86CPUClass *xcc = X86_CPU_CLASS(oc);
c6dc6f63
AP
1576 uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0;
1577
d940ee9b 1578 xcc->kvm_required = true;
6e746f30 1579
c6dc6f63 1580 host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx);
d940ee9b 1581 x86_cpu_vendor_words2str(host_cpudef.vendor, ebx, edx, ecx);
c6dc6f63
AP
1582
1583 host_cpuid(0x1, 0, &eax, &ebx, &ecx, &edx);
d940ee9b
EH
1584 host_cpudef.family = ((eax >> 8) & 0x0F) + ((eax >> 20) & 0xFF);
1585 host_cpudef.model = ((eax >> 4) & 0x0F) | ((eax & 0xF0000) >> 12);
1586 host_cpudef.stepping = eax & 0x0F;
c6dc6f63 1587
d940ee9b 1588 cpu_x86_fill_model_id(host_cpudef.model_id);
2a573259 1589
d940ee9b 1590 xcc->cpu_def = &host_cpudef;
ee465a3e
EH
1591 xcc->model_description =
1592 "KVM processor with all supported host features "
1593 "(only available in KVM mode)";
d940ee9b
EH
1594
1595 /* level, xlevel, xlevel2, and the feature words are initialized on
1596 * instance_init, because they require KVM to be initialized.
1597 */
84f1b92f
EH
1598
1599 dc->props = host_x86_cpu_properties;
4c315c27
MA
1600 /* Reason: host_x86_cpu_initfn() dies when !kvm_enabled() */
1601 dc->cannot_destroy_with_object_finalize_yet = true;
d940ee9b
EH
1602}
1603
1604static void host_x86_cpu_initfn(Object *obj)
1605{
1606 X86CPU *cpu = X86_CPU(obj);
1607 CPUX86State *env = &cpu->env;
1608 KVMState *s = kvm_state;
d940ee9b 1609
4d1b279b
EH
1610 /* We can't fill the features array here because we don't know yet if
1611 * "migratable" is true or false.
1612 */
1613 cpu->host_features = true;
1614
104494ea 1615 /* If KVM is disabled, x86_cpu_realizefn() will report an error later */
e4356010 1616 if (kvm_enabled()) {
c39c0edf
EH
1617 env->cpuid_min_level =
1618 kvm_arch_get_supported_cpuid(s, 0x0, 0, R_EAX);
1619 env->cpuid_min_xlevel =
1620 kvm_arch_get_supported_cpuid(s, 0x80000000, 0, R_EAX);
1621 env->cpuid_min_xlevel2 =
1622 kvm_arch_get_supported_cpuid(s, 0xC0000000, 0, R_EAX);
40bfe48f
HZ
1623
1624 if (lmce_supported()) {
1625 object_property_set_bool(OBJECT(cpu), true, "lmce", &error_abort);
1626 }
e4356010 1627 }
2a573259 1628
d940ee9b 1629 object_property_set_bool(OBJECT(cpu), true, "pmu", &error_abort);
c6dc6f63
AP
1630}
1631
d940ee9b
EH
1632static const TypeInfo host_x86_cpu_type_info = {
1633 .name = X86_CPU_TYPE_NAME("host"),
1634 .parent = TYPE_X86_CPU,
1635 .instance_init = host_x86_cpu_initfn,
1636 .class_init = host_x86_cpu_class_init,
1637};
1638
1639#endif
1640
8459e396 1641static void report_unavailable_features(FeatureWord w, uint32_t mask)
c6dc6f63 1642{
8459e396 1643 FeatureWordInfo *f = &feature_word_info[w];
c6dc6f63
AP
1644 int i;
1645
857aee33 1646 for (i = 0; i < 32; ++i) {
72370dc1 1647 if ((1UL << i) & mask) {
bffd67b0 1648 const char *reg = get_register_name_32(f->cpuid_reg);
8b4beddc 1649 assert(reg);
fefb41bf 1650 fprintf(stderr, "warning: %s doesn't support requested feature: "
8b4beddc 1651 "CPUID.%02XH:%s%s%s [bit %d]\n",
fefb41bf 1652 kvm_enabled() ? "host" : "TCG",
bffd67b0
EH
1653 f->cpuid_eax, reg,
1654 f->feat_names[i] ? "." : "",
1655 f->feat_names[i] ? f->feat_names[i] : "", i);
c6dc6f63 1656 }
857aee33 1657 }
c6dc6f63
AP
1658}
1659
d7bce999
EB
1660static void x86_cpuid_version_get_family(Object *obj, Visitor *v,
1661 const char *name, void *opaque,
1662 Error **errp)
95b8519d
AF
1663{
1664 X86CPU *cpu = X86_CPU(obj);
1665 CPUX86State *env = &cpu->env;
1666 int64_t value;
1667
1668 value = (env->cpuid_version >> 8) & 0xf;
1669 if (value == 0xf) {
1670 value += (env->cpuid_version >> 20) & 0xff;
1671 }
51e72bc1 1672 visit_type_int(v, name, &value, errp);
95b8519d
AF
1673}
1674
d7bce999
EB
1675static void x86_cpuid_version_set_family(Object *obj, Visitor *v,
1676 const char *name, void *opaque,
1677 Error **errp)
ed5e1ec3 1678{
71ad61d3
AF
1679 X86CPU *cpu = X86_CPU(obj);
1680 CPUX86State *env = &cpu->env;
1681 const int64_t min = 0;
1682 const int64_t max = 0xff + 0xf;
65cd9064 1683 Error *local_err = NULL;
71ad61d3
AF
1684 int64_t value;
1685
51e72bc1 1686 visit_type_int(v, name, &value, &local_err);
65cd9064
MA
1687 if (local_err) {
1688 error_propagate(errp, local_err);
71ad61d3
AF
1689 return;
1690 }
1691 if (value < min || value > max) {
c6bd8c70
MA
1692 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
1693 name ? name : "null", value, min, max);
71ad61d3
AF
1694 return;
1695 }
1696
ed5e1ec3 1697 env->cpuid_version &= ~0xff00f00;
71ad61d3
AF
1698 if (value > 0x0f) {
1699 env->cpuid_version |= 0xf00 | ((value - 0x0f) << 20);
ed5e1ec3 1700 } else {
71ad61d3 1701 env->cpuid_version |= value << 8;
ed5e1ec3
AF
1702 }
1703}
1704
d7bce999
EB
1705static void x86_cpuid_version_get_model(Object *obj, Visitor *v,
1706 const char *name, void *opaque,
1707 Error **errp)
67e30c83
AF
1708{
1709 X86CPU *cpu = X86_CPU(obj);
1710 CPUX86State *env = &cpu->env;
1711 int64_t value;
1712
1713 value = (env->cpuid_version >> 4) & 0xf;
1714 value |= ((env->cpuid_version >> 16) & 0xf) << 4;
51e72bc1 1715 visit_type_int(v, name, &value, errp);
67e30c83
AF
1716}
1717
d7bce999
EB
1718static void x86_cpuid_version_set_model(Object *obj, Visitor *v,
1719 const char *name, void *opaque,
1720 Error **errp)
b0704cbd 1721{
c5291a4f
AF
1722 X86CPU *cpu = X86_CPU(obj);
1723 CPUX86State *env = &cpu->env;
1724 const int64_t min = 0;
1725 const int64_t max = 0xff;
65cd9064 1726 Error *local_err = NULL;
c5291a4f
AF
1727 int64_t value;
1728
51e72bc1 1729 visit_type_int(v, name, &value, &local_err);
65cd9064
MA
1730 if (local_err) {
1731 error_propagate(errp, local_err);
c5291a4f
AF
1732 return;
1733 }
1734 if (value < min || value > max) {
c6bd8c70
MA
1735 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
1736 name ? name : "null", value, min, max);
c5291a4f
AF
1737 return;
1738 }
1739
b0704cbd 1740 env->cpuid_version &= ~0xf00f0;
c5291a4f 1741 env->cpuid_version |= ((value & 0xf) << 4) | ((value >> 4) << 16);
b0704cbd
AF
1742}
1743
35112e41 1744static void x86_cpuid_version_get_stepping(Object *obj, Visitor *v,
d7bce999 1745 const char *name, void *opaque,
35112e41
AF
1746 Error **errp)
1747{
1748 X86CPU *cpu = X86_CPU(obj);
1749 CPUX86State *env = &cpu->env;
1750 int64_t value;
1751
1752 value = env->cpuid_version & 0xf;
51e72bc1 1753 visit_type_int(v, name, &value, errp);
35112e41
AF
1754}
1755
036e2222 1756static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v,
d7bce999 1757 const char *name, void *opaque,
036e2222 1758 Error **errp)
38c3dc46 1759{
036e2222
AF
1760 X86CPU *cpu = X86_CPU(obj);
1761 CPUX86State *env = &cpu->env;
1762 const int64_t min = 0;
1763 const int64_t max = 0xf;
65cd9064 1764 Error *local_err = NULL;
036e2222
AF
1765 int64_t value;
1766
51e72bc1 1767 visit_type_int(v, name, &value, &local_err);
65cd9064
MA
1768 if (local_err) {
1769 error_propagate(errp, local_err);
036e2222
AF
1770 return;
1771 }
1772 if (value < min || value > max) {
c6bd8c70
MA
1773 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
1774 name ? name : "null", value, min, max);
036e2222
AF
1775 return;
1776 }
1777
38c3dc46 1778 env->cpuid_version &= ~0xf;
036e2222 1779 env->cpuid_version |= value & 0xf;
38c3dc46
AF
1780}
1781
d480e1af
AF
1782static char *x86_cpuid_get_vendor(Object *obj, Error **errp)
1783{
1784 X86CPU *cpu = X86_CPU(obj);
1785 CPUX86State *env = &cpu->env;
1786 char *value;
d480e1af 1787
e42a92ae 1788 value = g_malloc(CPUID_VENDOR_SZ + 1);
99b88a17
IM
1789 x86_cpu_vendor_words2str(value, env->cpuid_vendor1, env->cpuid_vendor2,
1790 env->cpuid_vendor3);
d480e1af
AF
1791 return value;
1792}
1793
1794static void x86_cpuid_set_vendor(Object *obj, const char *value,
1795 Error **errp)
1796{
1797 X86CPU *cpu = X86_CPU(obj);
1798 CPUX86State *env = &cpu->env;
1799 int i;
1800
9df694ee 1801 if (strlen(value) != CPUID_VENDOR_SZ) {
c6bd8c70 1802 error_setg(errp, QERR_PROPERTY_VALUE_BAD, "", "vendor", value);
d480e1af
AF
1803 return;
1804 }
1805
1806 env->cpuid_vendor1 = 0;
1807 env->cpuid_vendor2 = 0;
1808 env->cpuid_vendor3 = 0;
1809 for (i = 0; i < 4; i++) {
1810 env->cpuid_vendor1 |= ((uint8_t)value[i ]) << (8 * i);
1811 env->cpuid_vendor2 |= ((uint8_t)value[i + 4]) << (8 * i);
1812 env->cpuid_vendor3 |= ((uint8_t)value[i + 8]) << (8 * i);
1813 }
d480e1af
AF
1814}
1815
63e886eb
AF
1816static char *x86_cpuid_get_model_id(Object *obj, Error **errp)
1817{
1818 X86CPU *cpu = X86_CPU(obj);
1819 CPUX86State *env = &cpu->env;
1820 char *value;
1821 int i;
1822
1823 value = g_malloc(48 + 1);
1824 for (i = 0; i < 48; i++) {
1825 value[i] = env->cpuid_model[i >> 2] >> (8 * (i & 3));
1826 }
1827 value[48] = '\0';
1828 return value;
1829}
1830
938d4c25
AF
1831static void x86_cpuid_set_model_id(Object *obj, const char *model_id,
1832 Error **errp)
dcce6675 1833{
938d4c25
AF
1834 X86CPU *cpu = X86_CPU(obj);
1835 CPUX86State *env = &cpu->env;
dcce6675
AF
1836 int c, len, i;
1837
1838 if (model_id == NULL) {
1839 model_id = "";
1840 }
1841 len = strlen(model_id);
d0a6acf4 1842 memset(env->cpuid_model, 0, 48);
dcce6675
AF
1843 for (i = 0; i < 48; i++) {
1844 if (i >= len) {
1845 c = '\0';
1846 } else {
1847 c = (uint8_t)model_id[i];
1848 }
1849 env->cpuid_model[i >> 2] |= c << (8 * (i & 3));
1850 }
1851}
1852
d7bce999
EB
1853static void x86_cpuid_get_tsc_freq(Object *obj, Visitor *v, const char *name,
1854 void *opaque, Error **errp)
89e48965
AF
1855{
1856 X86CPU *cpu = X86_CPU(obj);
1857 int64_t value;
1858
1859 value = cpu->env.tsc_khz * 1000;
51e72bc1 1860 visit_type_int(v, name, &value, errp);
89e48965
AF
1861}
1862
d7bce999
EB
1863static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name,
1864 void *opaque, Error **errp)
89e48965
AF
1865{
1866 X86CPU *cpu = X86_CPU(obj);
1867 const int64_t min = 0;
2e84849a 1868 const int64_t max = INT64_MAX;
65cd9064 1869 Error *local_err = NULL;
89e48965
AF
1870 int64_t value;
1871
51e72bc1 1872 visit_type_int(v, name, &value, &local_err);
65cd9064
MA
1873 if (local_err) {
1874 error_propagate(errp, local_err);
89e48965
AF
1875 return;
1876 }
1877 if (value < min || value > max) {
c6bd8c70
MA
1878 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "",
1879 name ? name : "null", value, min, max);
89e48965
AF
1880 return;
1881 }
1882
36f96c4b 1883 cpu->env.tsc_khz = cpu->env.user_tsc_khz = value / 1000;
89e48965
AF
1884}
1885
7e5292b5 1886/* Generic getter for "feature-words" and "filtered-features" properties */
d7bce999
EB
1887static void x86_cpu_get_feature_words(Object *obj, Visitor *v,
1888 const char *name, void *opaque,
1889 Error **errp)
8e8aba50 1890{
7e5292b5 1891 uint32_t *array = (uint32_t *)opaque;
8e8aba50 1892 FeatureWord w;
8e8aba50
EH
1893 X86CPUFeatureWordInfo word_infos[FEATURE_WORDS] = { };
1894 X86CPUFeatureWordInfoList list_entries[FEATURE_WORDS] = { };
1895 X86CPUFeatureWordInfoList *list = NULL;
1896
1897 for (w = 0; w < FEATURE_WORDS; w++) {
1898 FeatureWordInfo *wi = &feature_word_info[w];
1899 X86CPUFeatureWordInfo *qwi = &word_infos[w];
1900 qwi->cpuid_input_eax = wi->cpuid_eax;
1901 qwi->has_cpuid_input_ecx = wi->cpuid_needs_ecx;
1902 qwi->cpuid_input_ecx = wi->cpuid_ecx;
1903 qwi->cpuid_register = x86_reg_info_32[wi->cpuid_reg].qapi_enum;
7e5292b5 1904 qwi->features = array[w];
8e8aba50
EH
1905
1906 /* List will be in reverse order, but order shouldn't matter */
1907 list_entries[w].next = list;
1908 list_entries[w].value = &word_infos[w];
1909 list = &list_entries[w];
1910 }
1911
6b62d961 1912 visit_type_X86CPUFeatureWordInfoList(v, "feature-words", &list, errp);
8e8aba50
EH
1913}
1914
d7bce999
EB
1915static void x86_get_hv_spinlocks(Object *obj, Visitor *v, const char *name,
1916 void *opaque, Error **errp)
c8f0f88e
IM
1917{
1918 X86CPU *cpu = X86_CPU(obj);
1919 int64_t value = cpu->hyperv_spinlock_attempts;
1920
51e72bc1 1921 visit_type_int(v, name, &value, errp);
c8f0f88e
IM
1922}
1923
d7bce999
EB
1924static void x86_set_hv_spinlocks(Object *obj, Visitor *v, const char *name,
1925 void *opaque, Error **errp)
c8f0f88e
IM
1926{
1927 const int64_t min = 0xFFF;
1928 const int64_t max = UINT_MAX;
1929 X86CPU *cpu = X86_CPU(obj);
1930 Error *err = NULL;
1931 int64_t value;
1932
51e72bc1 1933 visit_type_int(v, name, &value, &err);
c8f0f88e
IM
1934 if (err) {
1935 error_propagate(errp, err);
1936 return;
1937 }
1938
1939 if (value < min || value > max) {
1940 error_setg(errp, "Property %s.%s doesn't take value %" PRId64
5bb4c35d 1941 " (minimum: %" PRId64 ", maximum: %" PRId64 ")",
1942 object_get_typename(obj), name ? name : "null",
1943 value, min, max);
c8f0f88e
IM
1944 return;
1945 }
1946 cpu->hyperv_spinlock_attempts = value;
1947}
1948
1949static PropertyInfo qdev_prop_spinlocks = {
1950 .name = "int",
1951 .get = x86_get_hv_spinlocks,
1952 .set = x86_set_hv_spinlocks,
1953};
1954
72ac2e87
IM
1955/* Convert all '_' in a feature string option name to '-', to make feature
1956 * name conform to QOM property naming rule, which uses '-' instead of '_'.
1957 */
1958static inline void feat2prop(char *s)
1959{
1960 while ((s = strchr(s, '_'))) {
1961 *s = '-';
1962 }
1963}
1964
b54c9377
EH
1965/* Return the feature property name for a feature flag bit */
1966static const char *x86_cpu_feature_name(FeatureWord w, int bitnr)
1967{
1968 /* XSAVE components are automatically enabled by other features,
1969 * so return the original feature name instead
1970 */
1971 if (w == FEAT_XSAVE_COMP_LO || w == FEAT_XSAVE_COMP_HI) {
1972 int comp = (w == FEAT_XSAVE_COMP_HI) ? bitnr + 32 : bitnr;
1973
1974 if (comp < ARRAY_SIZE(x86_ext_save_areas) &&
1975 x86_ext_save_areas[comp].bits) {
1976 w = x86_ext_save_areas[comp].feature;
1977 bitnr = ctz32(x86_ext_save_areas[comp].bits);
1978 }
1979 }
1980
1981 assert(bitnr < 32);
1982 assert(w < FEATURE_WORDS);
1983 return feature_word_info[w].feat_names[bitnr];
1984}
1985
dc15c051
IM
1986/* Compatibily hack to maintain legacy +-feat semantic,
1987 * where +-feat overwrites any feature set by
1988 * feat=on|feat even if the later is parsed after +-feat
1989 * (i.e. "-x2apic,x2apic=on" will result in x2apic disabled)
1990 */
2fae0d96 1991static GList *plus_features, *minus_features;
dc15c051 1992
83a00f60
EH
1993static gint compare_string(gconstpointer a, gconstpointer b)
1994{
1995 return g_strcmp0(a, b);
1996}
1997
8f961357
EH
1998/* Parse "+feature,-feature,feature=foo" CPU feature string
1999 */
62a48a2a 2000static void x86_cpu_parse_featurestr(const char *typename, char *features,
94a444b2 2001 Error **errp)
8f961357 2002{
8f961357 2003 char *featurestr; /* Single 'key=value" string being parsed */
62a48a2a 2004 static bool cpu_globals_initialized;
83a00f60 2005 bool ambiguous = false;
62a48a2a
IM
2006
2007 if (cpu_globals_initialized) {
2008 return;
2009 }
2010 cpu_globals_initialized = true;
8f961357 2011
f6750e95
EH
2012 if (!features) {
2013 return;
2014 }
2015
2016 for (featurestr = strtok(features, ",");
685479bd 2017 featurestr;
f6750e95
EH
2018 featurestr = strtok(NULL, ",")) {
2019 const char *name;
2020 const char *val = NULL;
2021 char *eq = NULL;
cf2887c9 2022 char num[32];
62a48a2a 2023 GlobalProperty *prop;
c6dc6f63 2024
f6750e95 2025 /* Compatibility syntax: */
c6dc6f63 2026 if (featurestr[0] == '+') {
2fae0d96
EH
2027 plus_features = g_list_append(plus_features,
2028 g_strdup(featurestr + 1));
f6750e95 2029 continue;
c6dc6f63 2030 } else if (featurestr[0] == '-') {
2fae0d96
EH
2031 minus_features = g_list_append(minus_features,
2032 g_strdup(featurestr + 1));
f6750e95
EH
2033 continue;
2034 }
2035
2036 eq = strchr(featurestr, '=');
2037 if (eq) {
2038 *eq++ = 0;
2039 val = eq;
c6dc6f63 2040 } else {
f6750e95 2041 val = "on";
a91987c2 2042 }
f6750e95
EH
2043
2044 feat2prop(featurestr);
2045 name = featurestr;
2046
83a00f60
EH
2047 if (g_list_find_custom(plus_features, name, compare_string)) {
2048 error_report("warning: Ambiguous CPU model string. "
2049 "Don't mix both \"+%s\" and \"%s=%s\"",
2050 name, name, val);
2051 ambiguous = true;
2052 }
2053 if (g_list_find_custom(minus_features, name, compare_string)) {
2054 error_report("warning: Ambiguous CPU model string. "
2055 "Don't mix both \"-%s\" and \"%s=%s\"",
2056 name, name, val);
2057 ambiguous = true;
2058 }
2059
f6750e95
EH
2060 /* Special case: */
2061 if (!strcmp(name, "tsc-freq")) {
2062 int64_t tsc_freq;
2063 char *err;
f6750e95
EH
2064
2065 tsc_freq = qemu_strtosz_suffix_unit(val, &err,
2066 QEMU_STRTOSZ_DEFSUFFIX_B, 1000);
2067 if (tsc_freq < 0 || *err) {
2068 error_setg(errp, "bad numerical value %s", val);
2069 return;
2070 }
2071 snprintf(num, sizeof(num), "%" PRId64, tsc_freq);
2072 val = num;
2073 name = "tsc-frequency";
c6dc6f63 2074 }
f6750e95 2075
62a48a2a
IM
2076 prop = g_new0(typeof(*prop), 1);
2077 prop->driver = typename;
2078 prop->property = g_strdup(name);
2079 prop->value = g_strdup(val);
2080 prop->errp = &error_fatal;
2081 qdev_prop_register_global(prop);
f6750e95
EH
2082 }
2083
83a00f60
EH
2084 if (ambiguous) {
2085 error_report("warning: Compatibility of ambiguous CPU model "
2086 "strings won't be kept on future QEMU versions");
2087 }
c6dc6f63
AP
2088}
2089
b54c9377
EH
2090static void x86_cpu_load_features(X86CPU *cpu, Error **errp);
2091static int x86_cpu_filter_features(X86CPU *cpu);
2092
2093/* Check for missing features that may prevent the CPU class from
2094 * running using the current machine and accelerator.
2095 */
2096static void x86_cpu_class_check_missing_features(X86CPUClass *xcc,
2097 strList **missing_feats)
2098{
2099 X86CPU *xc;
2100 FeatureWord w;
2101 Error *err = NULL;
2102 strList **next = missing_feats;
2103
2104 if (xcc->kvm_required && !kvm_enabled()) {
2105 strList *new = g_new0(strList, 1);
2106 new->value = g_strdup("kvm");;
2107 *missing_feats = new;
2108 return;
2109 }
2110
2111 xc = X86_CPU(object_new(object_class_get_name(OBJECT_CLASS(xcc))));
2112
2113 x86_cpu_load_features(xc, &err);
2114 if (err) {
2115 /* Errors at x86_cpu_load_features should never happen,
2116 * but in case it does, just report the model as not
2117 * runnable at all using the "type" property.
2118 */
2119 strList *new = g_new0(strList, 1);
2120 new->value = g_strdup("type");
2121 *next = new;
2122 next = &new->next;
2123 }
2124
2125 x86_cpu_filter_features(xc);
2126
2127 for (w = 0; w < FEATURE_WORDS; w++) {
2128 uint32_t filtered = xc->filtered_features[w];
2129 int i;
2130 for (i = 0; i < 32; i++) {
2131 if (filtered & (1UL << i)) {
2132 strList *new = g_new0(strList, 1);
2133 new->value = g_strdup(x86_cpu_feature_name(w, i));
2134 *next = new;
2135 next = &new->next;
2136 }
2137 }
2138 }
2139
2140 object_unref(OBJECT(xc));
2141}
2142
8c3329e5 2143/* Print all cpuid feature names in featureset
c6dc6f63 2144 */
8c3329e5 2145static void listflags(FILE *f, fprintf_function print, const char **featureset)
0856579c 2146{
8c3329e5
EH
2147 int bit;
2148 bool first = true;
2149
2150 for (bit = 0; bit < 32; bit++) {
2151 if (featureset[bit]) {
2152 print(f, "%s%s", first ? "" : " ", featureset[bit]);
2153 first = false;
c6dc6f63 2154 }
8c3329e5 2155 }
c6dc6f63
AP
2156}
2157
ee465a3e
EH
2158/* Sort alphabetically by type name, listing kvm_required models last. */
2159static gint x86_cpu_list_compare(gconstpointer a, gconstpointer b)
2160{
2161 ObjectClass *class_a = (ObjectClass *)a;
2162 ObjectClass *class_b = (ObjectClass *)b;
2163 X86CPUClass *cc_a = X86_CPU_CLASS(class_a);
2164 X86CPUClass *cc_b = X86_CPU_CLASS(class_b);
2165 const char *name_a, *name_b;
2166
2167 if (cc_a->kvm_required != cc_b->kvm_required) {
2168 /* kvm_required items go last */
2169 return cc_a->kvm_required ? 1 : -1;
2170 } else {
2171 name_a = object_class_get_name(class_a);
2172 name_b = object_class_get_name(class_b);
2173 return strcmp(name_a, name_b);
2174 }
2175}
2176
2177static GSList *get_sorted_cpu_model_list(void)
2178{
2179 GSList *list = object_class_get_list(TYPE_X86_CPU, false);
2180 list = g_slist_sort(list, x86_cpu_list_compare);
2181 return list;
2182}
2183
2184static void x86_cpu_list_entry(gpointer data, gpointer user_data)
2185{
2186 ObjectClass *oc = data;
2187 X86CPUClass *cc = X86_CPU_CLASS(oc);
2188 CPUListState *s = user_data;
2189 char *name = x86_cpu_class_get_model_name(cc);
2190 const char *desc = cc->model_description;
2191 if (!desc) {
2192 desc = cc->cpu_def->model_id;
2193 }
2194
2195 (*s->cpu_fprintf)(s->file, "x86 %16s %-48s\n",
2196 name, desc);
2197 g_free(name);
2198}
2199
2200/* list available CPU models and flags */
e916cbf8 2201void x86_cpu_list(FILE *f, fprintf_function cpu_fprintf)
c6dc6f63 2202{
7fc9b714 2203 int i;
ee465a3e
EH
2204 CPUListState s = {
2205 .file = f,
2206 .cpu_fprintf = cpu_fprintf,
2207 };
2208 GSList *list;
c6dc6f63 2209
ee465a3e
EH
2210 (*cpu_fprintf)(f, "Available CPUs:\n");
2211 list = get_sorted_cpu_model_list();
2212 g_slist_foreach(list, x86_cpu_list_entry, &s);
2213 g_slist_free(list);
21ad7789 2214
6cdf8854 2215 (*cpu_fprintf)(f, "\nRecognized CPUID flags:\n");
3af60be2
JK
2216 for (i = 0; i < ARRAY_SIZE(feature_word_info); i++) {
2217 FeatureWordInfo *fw = &feature_word_info[i];
2218
8c3329e5
EH
2219 (*cpu_fprintf)(f, " ");
2220 listflags(f, cpu_fprintf, fw->feat_names);
2221 (*cpu_fprintf)(f, "\n");
3af60be2 2222 }
c6dc6f63
AP
2223}
2224
ee465a3e
EH
2225static void x86_cpu_definition_entry(gpointer data, gpointer user_data)
2226{
2227 ObjectClass *oc = data;
2228 X86CPUClass *cc = X86_CPU_CLASS(oc);
2229 CpuDefinitionInfoList **cpu_list = user_data;
2230 CpuDefinitionInfoList *entry;
2231 CpuDefinitionInfo *info;
2232
2233 info = g_malloc0(sizeof(*info));
2234 info->name = x86_cpu_class_get_model_name(cc);
b54c9377
EH
2235 x86_cpu_class_check_missing_features(cc, &info->unavailable_features);
2236 info->has_unavailable_features = true;
ee465a3e
EH
2237
2238 entry = g_malloc0(sizeof(*entry));
2239 entry->value = info;
2240 entry->next = *cpu_list;
2241 *cpu_list = entry;
2242}
2243
76b64a7a 2244CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp)
e3966126
AL
2245{
2246 CpuDefinitionInfoList *cpu_list = NULL;
ee465a3e
EH
2247 GSList *list = get_sorted_cpu_model_list();
2248 g_slist_foreach(list, x86_cpu_definition_entry, &cpu_list);
2249 g_slist_free(list);
e3966126
AL
2250 return cpu_list;
2251}
2252
84f1b92f
EH
2253static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w,
2254 bool migratable_only)
27418adf
EH
2255{
2256 FeatureWordInfo *wi = &feature_word_info[w];
84f1b92f 2257 uint32_t r;
27418adf 2258
fefb41bf 2259 if (kvm_enabled()) {
84f1b92f
EH
2260 r = kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid_eax,
2261 wi->cpuid_ecx,
2262 wi->cpuid_reg);
fefb41bf 2263 } else if (tcg_enabled()) {
84f1b92f 2264 r = wi->tcg_features;
fefb41bf
EH
2265 } else {
2266 return ~0;
2267 }
84f1b92f
EH
2268 if (migratable_only) {
2269 r &= x86_cpu_get_migratable_flags(w);
2270 }
2271 return r;
27418adf
EH
2272}
2273
51f63aed
EH
2274/*
2275 * Filters CPU feature words based on host availability of each feature.
2276 *
51f63aed
EH
2277 * Returns: 0 if all flags are supported by the host, non-zero otherwise.
2278 */
27418adf 2279static int x86_cpu_filter_features(X86CPU *cpu)
bc74b7db
EH
2280{
2281 CPUX86State *env = &cpu->env;
bd87d2a2 2282 FeatureWord w;
51f63aed
EH
2283 int rv = 0;
2284
bd87d2a2 2285 for (w = 0; w < FEATURE_WORDS; w++) {
84f1b92f 2286 uint32_t host_feat =
46c032f3 2287 x86_cpu_get_supported_feature_word(w, false);
034acf4a
EH
2288 uint32_t requested_features = env->features[w];
2289 env->features[w] &= host_feat;
2290 cpu->filtered_features[w] = requested_features & ~env->features[w];
51f63aed 2291 if (cpu->filtered_features[w]) {
51f63aed
EH
2292 rv = 1;
2293 }
bd87d2a2 2294 }
51f63aed
EH
2295
2296 return rv;
bc74b7db 2297}
bc74b7db 2298
8ca30e86
EH
2299static void x86_cpu_report_filtered_features(X86CPU *cpu)
2300{
2301 FeatureWord w;
2302
2303 for (w = 0; w < FEATURE_WORDS; w++) {
2304 report_unavailable_features(w, cpu->filtered_features[w]);
2305 }
2306}
2307
5114e842
EH
2308static void x86_cpu_apply_props(X86CPU *cpu, PropValue *props)
2309{
2310 PropValue *pv;
2311 for (pv = props; pv->prop; pv++) {
2312 if (!pv->value) {
2313 continue;
2314 }
2315 object_property_parse(OBJECT(cpu), pv->value, pv->prop,
2316 &error_abort);
2317 }
2318}
2319
d940ee9b 2320/* Load data from X86CPUDefinition
c080e30e 2321 */
d940ee9b 2322static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp)
c6dc6f63 2323{
61dcd775 2324 CPUX86State *env = &cpu->env;
74f54bc4
EH
2325 const char *vendor;
2326 char host_vendor[CPUID_VENDOR_SZ + 1];
e1c224b4 2327 FeatureWord w;
c6dc6f63 2328
c39c0edf
EH
2329 /* CPU models only set _minimum_ values for level/xlevel: */
2330 object_property_set_int(OBJECT(cpu), def->level, "min-level", errp);
2331 object_property_set_int(OBJECT(cpu), def->xlevel, "min-xlevel", errp);
2332
2d64255b
AF
2333 object_property_set_int(OBJECT(cpu), def->family, "family", errp);
2334 object_property_set_int(OBJECT(cpu), def->model, "model", errp);
2335 object_property_set_int(OBJECT(cpu), def->stepping, "stepping", errp);
2d64255b 2336 object_property_set_str(OBJECT(cpu), def->model_id, "model-id", errp);
e1c224b4
EH
2337 for (w = 0; w < FEATURE_WORDS; w++) {
2338 env->features[w] = def->features[w];
2339 }
82beb536 2340
9576de75 2341 /* Special cases not set in the X86CPUDefinition structs: */
82beb536 2342 if (kvm_enabled()) {
492a4c94
LT
2343 if (!kvm_irqchip_in_kernel()) {
2344 x86_cpu_change_kvm_default("x2apic", "off");
2345 }
2346
5114e842 2347 x86_cpu_apply_props(cpu, kvm_default_props);
04d99c3c
EH
2348 } else if (tcg_enabled()) {
2349 x86_cpu_apply_props(cpu, tcg_default_props);
82beb536 2350 }
5fcca9ff 2351
82beb536 2352 env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR;
7c08db30
EH
2353
2354 /* sysenter isn't supported in compatibility mode on AMD,
2355 * syscall isn't supported in compatibility mode on Intel.
2356 * Normally we advertise the actual CPU vendor, but you can
2357 * override this using the 'vendor' property if you want to use
2358 * KVM's sysenter/syscall emulation in compatibility mode and
2359 * when doing cross vendor migration
2360 */
74f54bc4 2361 vendor = def->vendor;
7c08db30
EH
2362 if (kvm_enabled()) {
2363 uint32_t ebx = 0, ecx = 0, edx = 0;
2364 host_cpuid(0, 0, NULL, &ebx, &ecx, &edx);
2365 x86_cpu_vendor_words2str(host_vendor, ebx, edx, ecx);
2366 vendor = host_vendor;
2367 }
2368
2369 object_property_set_str(OBJECT(cpu), vendor, "vendor", errp);
2370
c6dc6f63
AP
2371}
2372
0856579c 2373X86CPU *cpu_x86_init(const char *cpu_model)
7f833247 2374{
a57d0163 2375 return X86_CPU(cpu_generic_init(TYPE_X86_CPU, cpu_model));
5c3c6a68
AF
2376}
2377
d940ee9b
EH
2378static void x86_cpu_cpudef_class_init(ObjectClass *oc, void *data)
2379{
2380 X86CPUDefinition *cpudef = data;
2381 X86CPUClass *xcc = X86_CPU_CLASS(oc);
2382
2383 xcc->cpu_def = cpudef;
2384}
2385
2386static void x86_register_cpudef_type(X86CPUDefinition *def)
2387{
2388 char *typename = x86_cpu_type_name(def->name);
2389 TypeInfo ti = {
2390 .name = typename,
2391 .parent = TYPE_X86_CPU,
2392 .class_init = x86_cpu_cpudef_class_init,
2393 .class_data = def,
2394 };
2395
2396 type_register(&ti);
2397 g_free(typename);
2398}
2399
c6dc6f63 2400#if !defined(CONFIG_USER_ONLY)
c6dc6f63 2401
0e26b7b8
BS
2402void cpu_clear_apic_feature(CPUX86State *env)
2403{
0514ef2f 2404 env->features[FEAT_1_EDX] &= ~CPUID_APIC;
0e26b7b8
BS
2405}
2406
c6dc6f63
AP
2407#endif /* !CONFIG_USER_ONLY */
2408
c6dc6f63
AP
2409void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
2410 uint32_t *eax, uint32_t *ebx,
2411 uint32_t *ecx, uint32_t *edx)
2412{
a60f24b5
AF
2413 X86CPU *cpu = x86_env_get_cpu(env);
2414 CPUState *cs = CPU(cpu);
14c985cf 2415 uint32_t pkg_offset;
a60f24b5 2416
c6dc6f63
AP
2417 /* test if maximum index reached */
2418 if (index & 0x80000000) {
b3baa152
BW
2419 if (index > env->cpuid_xlevel) {
2420 if (env->cpuid_xlevel2 > 0) {
2421 /* Handle the Centaur's CPUID instruction. */
2422 if (index > env->cpuid_xlevel2) {
2423 index = env->cpuid_xlevel2;
2424 } else if (index < 0xC0000000) {
2425 index = env->cpuid_xlevel;
2426 }
2427 } else {
57f26ae7
EH
2428 /* Intel documentation states that invalid EAX input will
2429 * return the same information as EAX=cpuid_level
2430 * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID)
2431 */
2432 index = env->cpuid_level;
b3baa152
BW
2433 }
2434 }
c6dc6f63
AP
2435 } else {
2436 if (index > env->cpuid_level)
2437 index = env->cpuid_level;
2438 }
2439
2440 switch(index) {
2441 case 0:
2442 *eax = env->cpuid_level;
5eb2f7a4
EH
2443 *ebx = env->cpuid_vendor1;
2444 *edx = env->cpuid_vendor2;
2445 *ecx = env->cpuid_vendor3;
c6dc6f63
AP
2446 break;
2447 case 1:
2448 *eax = env->cpuid_version;
7e72a45c
EH
2449 *ebx = (cpu->apic_id << 24) |
2450 8 << 8; /* CLFLUSH size in quad words, Linux wants it. */
0514ef2f 2451 *ecx = env->features[FEAT_1_ECX];
19dc85db
RH
2452 if ((*ecx & CPUID_EXT_XSAVE) && (env->cr[4] & CR4_OSXSAVE_MASK)) {
2453 *ecx |= CPUID_EXT_OSXSAVE;
2454 }
0514ef2f 2455 *edx = env->features[FEAT_1_EDX];
ce3960eb
AF
2456 if (cs->nr_cores * cs->nr_threads > 1) {
2457 *ebx |= (cs->nr_cores * cs->nr_threads) << 16;
19dc85db 2458 *edx |= CPUID_HT;
c6dc6f63
AP
2459 }
2460 break;
2461 case 2:
2462 /* cache info: needed for Pentium Pro compatibility */
787aaf57
BC
2463 if (cpu->cache_info_passthrough) {
2464 host_cpuid(index, 0, eax, ebx, ecx, edx);
2465 break;
2466 }
5e891bf8 2467 *eax = 1; /* Number of CPUID[EAX=2] calls required */
c6dc6f63 2468 *ebx = 0;
14c985cf
LM
2469 if (!cpu->enable_l3_cache) {
2470 *ecx = 0;
2471 } else {
2472 *ecx = L3_N_DESCRIPTOR;
2473 }
5e891bf8
EH
2474 *edx = (L1D_DESCRIPTOR << 16) | \
2475 (L1I_DESCRIPTOR << 8) | \
2476 (L2_DESCRIPTOR);
c6dc6f63
AP
2477 break;
2478 case 4:
2479 /* cache info: needed for Core compatibility */
787aaf57
BC
2480 if (cpu->cache_info_passthrough) {
2481 host_cpuid(index, count, eax, ebx, ecx, edx);
76c2975a 2482 *eax &= ~0xFC000000;
c6dc6f63 2483 } else {
2f7a21c4 2484 *eax = 0;
76c2975a 2485 switch (count) {
c6dc6f63 2486 case 0: /* L1 dcache info */
5e891bf8
EH
2487 *eax |= CPUID_4_TYPE_DCACHE | \
2488 CPUID_4_LEVEL(1) | \
2489 CPUID_4_SELF_INIT_LEVEL;
2490 *ebx = (L1D_LINE_SIZE - 1) | \
2491 ((L1D_PARTITIONS - 1) << 12) | \
2492 ((L1D_ASSOCIATIVITY - 1) << 22);
2493 *ecx = L1D_SETS - 1;
2494 *edx = CPUID_4_NO_INVD_SHARING;
c6dc6f63
AP
2495 break;
2496 case 1: /* L1 icache info */
5e891bf8
EH
2497 *eax |= CPUID_4_TYPE_ICACHE | \
2498 CPUID_4_LEVEL(1) | \
2499 CPUID_4_SELF_INIT_LEVEL;
2500 *ebx = (L1I_LINE_SIZE - 1) | \
2501 ((L1I_PARTITIONS - 1) << 12) | \
2502 ((L1I_ASSOCIATIVITY - 1) << 22);
2503 *ecx = L1I_SETS - 1;
2504 *edx = CPUID_4_NO_INVD_SHARING;
c6dc6f63
AP
2505 break;
2506 case 2: /* L2 cache info */
5e891bf8
EH
2507 *eax |= CPUID_4_TYPE_UNIFIED | \
2508 CPUID_4_LEVEL(2) | \
2509 CPUID_4_SELF_INIT_LEVEL;
ce3960eb
AF
2510 if (cs->nr_threads > 1) {
2511 *eax |= (cs->nr_threads - 1) << 14;
c6dc6f63 2512 }
5e891bf8
EH
2513 *ebx = (L2_LINE_SIZE - 1) | \
2514 ((L2_PARTITIONS - 1) << 12) | \
2515 ((L2_ASSOCIATIVITY - 1) << 22);
2516 *ecx = L2_SETS - 1;
2517 *edx = CPUID_4_NO_INVD_SHARING;
c6dc6f63 2518 break;
14c985cf
LM
2519 case 3: /* L3 cache info */
2520 if (!cpu->enable_l3_cache) {
2521 *eax = 0;
2522 *ebx = 0;
2523 *ecx = 0;
2524 *edx = 0;
2525 break;
2526 }
2527 *eax |= CPUID_4_TYPE_UNIFIED | \
2528 CPUID_4_LEVEL(3) | \
2529 CPUID_4_SELF_INIT_LEVEL;
2530 pkg_offset = apicid_pkg_offset(cs->nr_cores, cs->nr_threads);
2531 *eax |= ((1 << pkg_offset) - 1) << 14;
2532 *ebx = (L3_N_LINE_SIZE - 1) | \
2533 ((L3_N_PARTITIONS - 1) << 12) | \
2534 ((L3_N_ASSOCIATIVITY - 1) << 22);
2535 *ecx = L3_N_SETS - 1;
2536 *edx = CPUID_4_INCLUSIVE | CPUID_4_COMPLEX_IDX;
2537 break;
c6dc6f63
AP
2538 default: /* end of info */
2539 *eax = 0;
2540 *ebx = 0;
2541 *ecx = 0;
2542 *edx = 0;
2543 break;
76c2975a
PB
2544 }
2545 }
2546
2547 /* QEMU gives out its own APIC IDs, never pass down bits 31..26. */
2548 if ((*eax & 31) && cs->nr_cores > 1) {
2549 *eax |= (cs->nr_cores - 1) << 26;
c6dc6f63
AP
2550 }
2551 break;
2552 case 5:
2553 /* mwait info: needed for Core compatibility */
2554 *eax = 0; /* Smallest monitor-line size in bytes */
2555 *ebx = 0; /* Largest monitor-line size in bytes */
2556 *ecx = CPUID_MWAIT_EMX | CPUID_MWAIT_IBE;
2557 *edx = 0;
2558 break;
2559 case 6:
2560 /* Thermal and Power Leaf */
28b8e4d0 2561 *eax = env->features[FEAT_6_EAX];
c6dc6f63
AP
2562 *ebx = 0;
2563 *ecx = 0;
2564 *edx = 0;
2565 break;
f7911686 2566 case 7:
13526728
EH
2567 /* Structured Extended Feature Flags Enumeration Leaf */
2568 if (count == 0) {
2569 *eax = 0; /* Maximum ECX value for sub-leaves */
0514ef2f 2570 *ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */
f74eefe0 2571 *ecx = env->features[FEAT_7_0_ECX]; /* Feature flags */
0f70ed47
PB
2572 if ((*ecx & CPUID_7_0_ECX_PKU) && env->cr[4] & CR4_PKE_MASK) {
2573 *ecx |= CPUID_7_0_ECX_OSPKE;
2574 }
95ea69fb 2575 *edx = env->features[FEAT_7_0_EDX]; /* Feature flags */
f7911686
YW
2576 } else {
2577 *eax = 0;
2578 *ebx = 0;
2579 *ecx = 0;
2580 *edx = 0;
2581 }
2582 break;
c6dc6f63
AP
2583 case 9:
2584 /* Direct Cache Access Information Leaf */
2585 *eax = 0; /* Bits 0-31 in DCA_CAP MSR */
2586 *ebx = 0;
2587 *ecx = 0;
2588 *edx = 0;
2589 break;
2590 case 0xA:
2591 /* Architectural Performance Monitoring Leaf */
9337e3b6 2592 if (kvm_enabled() && cpu->enable_pmu) {
a60f24b5 2593 KVMState *s = cs->kvm_state;
a0fa8208
GN
2594
2595 *eax = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EAX);
2596 *ebx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EBX);
2597 *ecx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_ECX);
2598 *edx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EDX);
2599 } else {
2600 *eax = 0;
2601 *ebx = 0;
2602 *ecx = 0;
2603 *edx = 0;
2604 }
c6dc6f63 2605 break;
5232d00a
RK
2606 case 0xB:
2607 /* Extended Topology Enumeration Leaf */
2608 if (!cpu->enable_cpuid_0xb) {
2609 *eax = *ebx = *ecx = *edx = 0;
2610 break;
2611 }
2612
2613 *ecx = count & 0xff;
2614 *edx = cpu->apic_id;
2615
2616 switch (count) {
2617 case 0:
eab60fb9
MAL
2618 *eax = apicid_core_offset(cs->nr_cores, cs->nr_threads);
2619 *ebx = cs->nr_threads;
5232d00a
RK
2620 *ecx |= CPUID_TOPOLOGY_LEVEL_SMT;
2621 break;
2622 case 1:
eab60fb9
MAL
2623 *eax = apicid_pkg_offset(cs->nr_cores, cs->nr_threads);
2624 *ebx = cs->nr_cores * cs->nr_threads;
5232d00a
RK
2625 *ecx |= CPUID_TOPOLOGY_LEVEL_CORE;
2626 break;
2627 default:
2628 *eax = 0;
2629 *ebx = 0;
2630 *ecx |= CPUID_TOPOLOGY_LEVEL_INVALID;
2631 }
2632
2633 assert(!(*eax & ~0x1f));
2634 *ebx &= 0xffff; /* The count doesn't need to be reliable. */
2635 break;
2560f19f 2636 case 0xD: {
51e49430 2637 /* Processor Extended State */
2560f19f
PB
2638 *eax = 0;
2639 *ebx = 0;
2640 *ecx = 0;
2641 *edx = 0;
19dc85db 2642 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
51e49430
SY
2643 break;
2644 }
4928cd6d 2645
2560f19f 2646 if (count == 0) {
96193c22
EH
2647 *ecx = xsave_area_size(x86_cpu_xsave_components(cpu));
2648 *eax = env->features[FEAT_XSAVE_COMP_LO];
2649 *edx = env->features[FEAT_XSAVE_COMP_HI];
2560f19f
PB
2650 *ebx = *ecx;
2651 } else if (count == 1) {
0bb0b2d2 2652 *eax = env->features[FEAT_XSAVE];
f4f1110e 2653 } else if (count < ARRAY_SIZE(x86_ext_save_areas)) {
96193c22
EH
2654 if ((x86_cpu_xsave_components(cpu) >> count) & 1) {
2655 const ExtSaveArea *esa = &x86_ext_save_areas[count];
33f373d7
LJ
2656 *eax = esa->size;
2657 *ebx = esa->offset;
2560f19f 2658 }
51e49430
SY
2659 }
2660 break;
2560f19f 2661 }
c6dc6f63
AP
2662 case 0x80000000:
2663 *eax = env->cpuid_xlevel;
2664 *ebx = env->cpuid_vendor1;
2665 *edx = env->cpuid_vendor2;
2666 *ecx = env->cpuid_vendor3;
2667 break;
2668 case 0x80000001:
2669 *eax = env->cpuid_version;
2670 *ebx = 0;
0514ef2f
EH
2671 *ecx = env->features[FEAT_8000_0001_ECX];
2672 *edx = env->features[FEAT_8000_0001_EDX];
c6dc6f63
AP
2673
2674 /* The Linux kernel checks for the CMPLegacy bit and
2675 * discards multiple thread information if it is set.
cb8d4c8f 2676 * So don't set it here for Intel to make Linux guests happy.
c6dc6f63 2677 */
ce3960eb 2678 if (cs->nr_cores * cs->nr_threads > 1) {
5eb2f7a4
EH
2679 if (env->cpuid_vendor1 != CPUID_VENDOR_INTEL_1 ||
2680 env->cpuid_vendor2 != CPUID_VENDOR_INTEL_2 ||
2681 env->cpuid_vendor3 != CPUID_VENDOR_INTEL_3) {
c6dc6f63
AP
2682 *ecx |= 1 << 1; /* CmpLegacy bit */
2683 }
2684 }
c6dc6f63
AP
2685 break;
2686 case 0x80000002:
2687 case 0x80000003:
2688 case 0x80000004:
2689 *eax = env->cpuid_model[(index - 0x80000002) * 4 + 0];
2690 *ebx = env->cpuid_model[(index - 0x80000002) * 4 + 1];
2691 *ecx = env->cpuid_model[(index - 0x80000002) * 4 + 2];
2692 *edx = env->cpuid_model[(index - 0x80000002) * 4 + 3];
2693 break;
2694 case 0x80000005:
2695 /* cache info (L1 cache) */
787aaf57
BC
2696 if (cpu->cache_info_passthrough) {
2697 host_cpuid(index, 0, eax, ebx, ecx, edx);
2698 break;
2699 }
5e891bf8
EH
2700 *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) | \
2701 (L1_ITLB_2M_ASSOC << 8) | (L1_ITLB_2M_ENTRIES);
2702 *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) | \
2703 (L1_ITLB_4K_ASSOC << 8) | (L1_ITLB_4K_ENTRIES);
2704 *ecx = (L1D_SIZE_KB_AMD << 24) | (L1D_ASSOCIATIVITY_AMD << 16) | \
2705 (L1D_LINES_PER_TAG << 8) | (L1D_LINE_SIZE);
2706 *edx = (L1I_SIZE_KB_AMD << 24) | (L1I_ASSOCIATIVITY_AMD << 16) | \
2707 (L1I_LINES_PER_TAG << 8) | (L1I_LINE_SIZE);
c6dc6f63
AP
2708 break;
2709 case 0x80000006:
2710 /* cache info (L2 cache) */
787aaf57
BC
2711 if (cpu->cache_info_passthrough) {
2712 host_cpuid(index, 0, eax, ebx, ecx, edx);
2713 break;
2714 }
5e891bf8
EH
2715 *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) | \
2716 (L2_DTLB_2M_ENTRIES << 16) | \
2717 (AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) | \
2718 (L2_ITLB_2M_ENTRIES);
2719 *ebx = (AMD_ENC_ASSOC(L2_DTLB_4K_ASSOC) << 28) | \
2720 (L2_DTLB_4K_ENTRIES << 16) | \
2721 (AMD_ENC_ASSOC(L2_ITLB_4K_ASSOC) << 12) | \
2722 (L2_ITLB_4K_ENTRIES);
2723 *ecx = (L2_SIZE_KB_AMD << 16) | \
2724 (AMD_ENC_ASSOC(L2_ASSOCIATIVITY) << 12) | \
2725 (L2_LINES_PER_TAG << 8) | (L2_LINE_SIZE);
14c985cf
LM
2726 if (!cpu->enable_l3_cache) {
2727 *edx = ((L3_SIZE_KB / 512) << 18) | \
2728 (AMD_ENC_ASSOC(L3_ASSOCIATIVITY) << 12) | \
2729 (L3_LINES_PER_TAG << 8) | (L3_LINE_SIZE);
2730 } else {
2731 *edx = ((L3_N_SIZE_KB_AMD / 512) << 18) | \
2732 (AMD_ENC_ASSOC(L3_N_ASSOCIATIVITY) << 12) | \
2733 (L3_N_LINES_PER_TAG << 8) | (L3_N_LINE_SIZE);
2734 }
c6dc6f63 2735 break;
303752a9
MT
2736 case 0x80000007:
2737 *eax = 0;
2738 *ebx = 0;
2739 *ecx = 0;
2740 *edx = env->features[FEAT_8000_0007_EDX];
2741 break;
c6dc6f63
AP
2742 case 0x80000008:
2743 /* virtual & phys address size in low 2 bytes. */
0514ef2f 2744 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
af45907a
DDAG
2745 /* 64 bit processor, 48 bits virtual, configurable
2746 * physical bits.
2747 */
2748 *eax = 0x00003000 + cpu->phys_bits;
c6dc6f63 2749 } else {
af45907a 2750 *eax = cpu->phys_bits;
c6dc6f63
AP
2751 }
2752 *ebx = 0;
2753 *ecx = 0;
2754 *edx = 0;
ce3960eb
AF
2755 if (cs->nr_cores * cs->nr_threads > 1) {
2756 *ecx |= (cs->nr_cores * cs->nr_threads) - 1;
c6dc6f63
AP
2757 }
2758 break;
2759 case 0x8000000A:
0514ef2f 2760 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
9f3fb565
EH
2761 *eax = 0x00000001; /* SVM Revision */
2762 *ebx = 0x00000010; /* nr of ASIDs */
2763 *ecx = 0;
0514ef2f 2764 *edx = env->features[FEAT_SVM]; /* optional features */
9f3fb565
EH
2765 } else {
2766 *eax = 0;
2767 *ebx = 0;
2768 *ecx = 0;
2769 *edx = 0;
2770 }
c6dc6f63 2771 break;
b3baa152
BW
2772 case 0xC0000000:
2773 *eax = env->cpuid_xlevel2;
2774 *ebx = 0;
2775 *ecx = 0;
2776 *edx = 0;
2777 break;
2778 case 0xC0000001:
2779 /* Support for VIA CPU's CPUID instruction */
2780 *eax = env->cpuid_version;
2781 *ebx = 0;
2782 *ecx = 0;
0514ef2f 2783 *edx = env->features[FEAT_C000_0001_EDX];
b3baa152
BW
2784 break;
2785 case 0xC0000002:
2786 case 0xC0000003:
2787 case 0xC0000004:
2788 /* Reserved for the future, and now filled with zero */
2789 *eax = 0;
2790 *ebx = 0;
2791 *ecx = 0;
2792 *edx = 0;
2793 break;
c6dc6f63
AP
2794 default:
2795 /* reserved values: zero */
2796 *eax = 0;
2797 *ebx = 0;
2798 *ecx = 0;
2799 *edx = 0;
2800 break;
2801 }
2802}
5fd2087a
AF
2803
2804/* CPUClass::reset() */
2805static void x86_cpu_reset(CPUState *s)
2806{
2807 X86CPU *cpu = X86_CPU(s);
2808 X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu);
2809 CPUX86State *env = &cpu->env;
a114d25d
RH
2810 target_ulong cr4;
2811 uint64_t xcr0;
c1958aea
AF
2812 int i;
2813
5fd2087a
AF
2814 xcc->parent_reset(s);
2815
5e992a8e 2816 memset(env, 0, offsetof(CPUX86State, end_reset_fields));
c1958aea 2817
00c8cb0a 2818 tlb_flush(s, 1);
c1958aea
AF
2819
2820 env->old_exception = -1;
2821
2822 /* init to reset state */
2823
c1958aea
AF
2824 env->hflags2 |= HF2_GIF_MASK;
2825
2826 cpu_x86_update_cr0(env, 0x60000010);
2827 env->a20_mask = ~0x0;
2828 env->smbase = 0x30000;
2829
2830 env->idt.limit = 0xffff;
2831 env->gdt.limit = 0xffff;
2832 env->ldt.limit = 0xffff;
2833 env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT);
2834 env->tr.limit = 0xffff;
2835 env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT);
2836
2837 cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff,
2838 DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK |
2839 DESC_R_MASK | DESC_A_MASK);
2840 cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff,
2841 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
2842 DESC_A_MASK);
2843 cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff,
2844 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
2845 DESC_A_MASK);
2846 cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff,
2847 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
2848 DESC_A_MASK);
2849 cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff,
2850 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
2851 DESC_A_MASK);
2852 cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff,
2853 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK |
2854 DESC_A_MASK);
2855
2856 env->eip = 0xfff0;
2857 env->regs[R_EDX] = env->cpuid_version;
2858
2859 env->eflags = 0x2;
2860
2861 /* FPU init */
2862 for (i = 0; i < 8; i++) {
2863 env->fptags[i] = 1;
2864 }
5bde1407 2865 cpu_set_fpuc(env, 0x37f);
c1958aea
AF
2866
2867 env->mxcsr = 0x1f80;
a114d25d
RH
2868 /* All units are in INIT state. */
2869 env->xstate_bv = 0;
c1958aea
AF
2870
2871 env->pat = 0x0007040600070406ULL;
2872 env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT;
2873
2874 memset(env->dr, 0, sizeof(env->dr));
2875 env->dr[6] = DR6_FIXED_1;
2876 env->dr[7] = DR7_FIXED_1;
b3310ab3 2877 cpu_breakpoint_remove_all(s, BP_CPU);
75a34036 2878 cpu_watchpoint_remove_all(s, BP_CPU);
dd673288 2879
a114d25d 2880 cr4 = 0;
cfc3b074 2881 xcr0 = XSTATE_FP_MASK;
a114d25d
RH
2882
2883#ifdef CONFIG_USER_ONLY
2884 /* Enable all the features for user-mode. */
2885 if (env->features[FEAT_1_EDX] & CPUID_SSE) {
cfc3b074 2886 xcr0 |= XSTATE_SSE_MASK;
a114d25d 2887 }
0f70ed47
PB
2888 for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
2889 const ExtSaveArea *esa = &x86_ext_save_areas[i];
9646f492 2890 if (env->features[esa->feature] & esa->bits) {
0f70ed47
PB
2891 xcr0 |= 1ull << i;
2892 }
a114d25d 2893 }
0f70ed47 2894
a114d25d
RH
2895 if (env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE) {
2896 cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK;
2897 }
07929f2a
RH
2898 if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_FSGSBASE) {
2899 cr4 |= CR4_FSGSBASE_MASK;
2900 }
a114d25d
RH
2901#endif
2902
2903 env->xcr0 = xcr0;
2904 cpu_x86_update_cr4(env, cr4);
0522604b 2905
9db2efd9
AW
2906 /*
2907 * SDM 11.11.5 requires:
2908 * - IA32_MTRR_DEF_TYPE MSR.E = 0
2909 * - IA32_MTRR_PHYSMASKn.V = 0
2910 * All other bits are undefined. For simplification, zero it all.
2911 */
2912 env->mtrr_deftype = 0;
2913 memset(env->mtrr_var, 0, sizeof(env->mtrr_var));
2914 memset(env->mtrr_fixed, 0, sizeof(env->mtrr_fixed));
2915
dd673288
IM
2916#if !defined(CONFIG_USER_ONLY)
2917 /* We hard-wire the BSP to the first CPU. */
9cb11fd7 2918 apic_designate_bsp(cpu->apic_state, s->cpu_index == 0);
dd673288 2919
259186a7 2920 s->halted = !cpu_is_bsp(cpu);
50a2c6e5
PB
2921
2922 if (kvm_enabled()) {
2923 kvm_arch_reset_vcpu(cpu);
2924 }
dd673288 2925#endif
5fd2087a
AF
2926}
2927
dd673288
IM
2928#ifndef CONFIG_USER_ONLY
2929bool cpu_is_bsp(X86CPU *cpu)
2930{
02e51483 2931 return cpu_get_apic_base(cpu->apic_state) & MSR_IA32_APICBASE_BSP;
dd673288 2932}
65dee380
IM
2933
2934/* TODO: remove me, when reset over QOM tree is implemented */
2935static void x86_cpu_machine_reset_cb(void *opaque)
2936{
2937 X86CPU *cpu = opaque;
2938 cpu_reset(CPU(cpu));
2939}
dd673288
IM
2940#endif
2941
de024815
AF
2942static void mce_init(X86CPU *cpu)
2943{
2944 CPUX86State *cenv = &cpu->env;
2945 unsigned int bank;
2946
2947 if (((cenv->cpuid_version >> 8) & 0xf) >= 6
0514ef2f 2948 && (cenv->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) ==
de024815 2949 (CPUID_MCE | CPUID_MCA)) {
87f8b626
AR
2950 cenv->mcg_cap = MCE_CAP_DEF | MCE_BANKS_DEF |
2951 (cpu->enable_lmce ? MCG_LMCE_P : 0);
de024815
AF
2952 cenv->mcg_ctl = ~(uint64_t)0;
2953 for (bank = 0; bank < MCE_BANKS_DEF; bank++) {
2954 cenv->mce_banks[bank * 4] = ~(uint64_t)0;
2955 }
2956 }
2957}
2958
bdeec802 2959#ifndef CONFIG_USER_ONLY
2f114315 2960APICCommonClass *apic_get_class(void)
bdeec802 2961{
bdeec802
IM
2962 const char *apic_type = "apic";
2963
15eafc2e 2964 if (kvm_apic_in_kernel()) {
bdeec802
IM
2965 apic_type = "kvm-apic";
2966 } else if (xen_enabled()) {
2967 apic_type = "xen-apic";
2968 }
2969
2f114315
RK
2970 return APIC_COMMON_CLASS(object_class_by_name(apic_type));
2971}
2972
2973static void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
2974{
2975 APICCommonState *apic;
2976 ObjectClass *apic_class = OBJECT_CLASS(apic_get_class());
2977
2978 cpu->apic_state = DEVICE(object_new(object_class_get_name(apic_class)));
bdeec802 2979
6816b1b3
IM
2980 object_property_add_child(OBJECT(cpu), "lapic",
2981 OBJECT(cpu->apic_state), &error_abort);
67e55caa 2982 object_unref(OBJECT(cpu->apic_state));
6816b1b3 2983
33d7a288 2984 qdev_prop_set_uint32(cpu->apic_state, "id", cpu->apic_id);
bdeec802 2985 /* TODO: convert to link<> */
02e51483 2986 apic = APIC_COMMON(cpu->apic_state);
60671e58 2987 apic->cpu = cpu;
8d42d2d3 2988 apic->apicbase = APIC_DEFAULT_ADDRESS | MSR_IA32_APICBASE_ENABLE;
d3c64d6a
IM
2989}
2990
2991static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
2992{
8d42d2d3
CF
2993 APICCommonState *apic;
2994 static bool apic_mmio_map_once;
2995
02e51483 2996 if (cpu->apic_state == NULL) {
d3c64d6a
IM
2997 return;
2998 }
6e8e2651
MA
2999 object_property_set_bool(OBJECT(cpu->apic_state), true, "realized",
3000 errp);
8d42d2d3
CF
3001
3002 /* Map APIC MMIO area */
3003 apic = APIC_COMMON(cpu->apic_state);
3004 if (!apic_mmio_map_once) {
3005 memory_region_add_subregion_overlap(get_system_memory(),
3006 apic->apicbase &
3007 MSR_IA32_APICBASE_BASE,
3008 &apic->io_memory,
3009 0x1000);
3010 apic_mmio_map_once = true;
3011 }
bdeec802 3012}
f809c605
PB
3013
3014static void x86_cpu_machine_done(Notifier *n, void *unused)
3015{
3016 X86CPU *cpu = container_of(n, X86CPU, machine_done);
3017 MemoryRegion *smram =
3018 (MemoryRegion *) object_resolve_path("/machine/smram", NULL);
3019
3020 if (smram) {
3021 cpu->smram = g_new(MemoryRegion, 1);
3022 memory_region_init_alias(cpu->smram, OBJECT(cpu), "smram",
3023 smram, 0, 1ull << 32);
3024 memory_region_set_enabled(cpu->smram, false);
3025 memory_region_add_subregion_overlap(cpu->cpu_as_root, 0, cpu->smram, 1);
3026 }
3027}
d3c64d6a
IM
3028#else
3029static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
3030{
3031}
bdeec802
IM
3032#endif
3033
11f6fee5
DDAG
3034/* Note: Only safe for use on x86(-64) hosts */
3035static uint32_t x86_host_phys_bits(void)
3036{
3037 uint32_t eax;
3038 uint32_t host_phys_bits;
3039
3040 host_cpuid(0x80000000, 0, &eax, NULL, NULL, NULL);
3041 if (eax >= 0x80000008) {
3042 host_cpuid(0x80000008, 0, &eax, NULL, NULL, NULL);
3043 /* Note: According to AMD doc 25481 rev 2.34 they have a field
3044 * at 23:16 that can specify a maximum physical address bits for
3045 * the guest that can override this value; but I've not seen
3046 * anything with that set.
3047 */
3048 host_phys_bits = eax & 0xff;
3049 } else {
3050 /* It's an odd 64 bit machine that doesn't have the leaf for
3051 * physical address bits; fall back to 36 that's most older
3052 * Intel.
3053 */
3054 host_phys_bits = 36;
3055 }
3056
3057 return host_phys_bits;
3058}
e48638fd 3059
c39c0edf
EH
3060static void x86_cpu_adjust_level(X86CPU *cpu, uint32_t *min, uint32_t value)
3061{
3062 if (*min < value) {
3063 *min = value;
3064 }
3065}
3066
3067/* Increase cpuid_min_{level,xlevel,xlevel2} automatically, if appropriate */
3068static void x86_cpu_adjust_feat_level(X86CPU *cpu, FeatureWord w)
3069{
3070 CPUX86State *env = &cpu->env;
3071 FeatureWordInfo *fi = &feature_word_info[w];
3072 uint32_t eax = fi->cpuid_eax;
3073 uint32_t region = eax & 0xF0000000;
3074
3075 if (!env->features[w]) {
3076 return;
3077 }
3078
3079 switch (region) {
3080 case 0x00000000:
3081 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, eax);
3082 break;
3083 case 0x80000000:
3084 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, eax);
3085 break;
3086 case 0xC0000000:
3087 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel2, eax);
3088 break;
3089 }
3090}
3091
2ca8a8be
EH
3092/* Calculate XSAVE components based on the configured CPU feature flags */
3093static void x86_cpu_enable_xsave_components(X86CPU *cpu)
3094{
3095 CPUX86State *env = &cpu->env;
3096 int i;
96193c22 3097 uint64_t mask;
2ca8a8be
EH
3098
3099 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) {
3100 return;
3101 }
3102
e3c9022b
EH
3103 mask = 0;
3104 for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) {
2ca8a8be
EH
3105 const ExtSaveArea *esa = &x86_ext_save_areas[i];
3106 if (env->features[esa->feature] & esa->bits) {
96193c22 3107 mask |= (1ULL << i);
2ca8a8be
EH
3108 }
3109 }
3110
96193c22
EH
3111 env->features[FEAT_XSAVE_COMP_LO] = mask;
3112 env->features[FEAT_XSAVE_COMP_HI] = mask >> 32;
2ca8a8be
EH
3113}
3114
41f3d4d6
EH
3115/* Load CPUID data based on configured features */
3116static void x86_cpu_load_features(X86CPU *cpu, Error **errp)
7a059953 3117{
b34d12d1 3118 CPUX86State *env = &cpu->env;
dc15c051 3119 FeatureWord w;
2fae0d96 3120 GList *l;
41f3d4d6 3121 Error *local_err = NULL;
9886e834 3122
dc15c051
IM
3123 /*TODO: cpu->host_features incorrectly overwrites features
3124 * set using "feat=on|off". Once we fix this, we can convert
3125 * plus_features & minus_features to global properties
3126 * inside x86_cpu_parse_featurestr() too.
3127 */
3128 if (cpu->host_features) {
3129 for (w = 0; w < FEATURE_WORDS; w++) {
3130 env->features[w] =
3131 x86_cpu_get_supported_feature_word(w, cpu->migratable);
3132 }
3133 }
3134
2fae0d96
EH
3135 for (l = plus_features; l; l = l->next) {
3136 const char *prop = l->data;
3137 object_property_set_bool(OBJECT(cpu), true, prop, &local_err);
3138 if (local_err) {
3139 goto out;
3140 }
3141 }
3142
3143 for (l = minus_features; l; l = l->next) {
3144 const char *prop = l->data;
3145 object_property_set_bool(OBJECT(cpu), false, prop, &local_err);
3146 if (local_err) {
3147 goto out;
3148 }
dc15c051
IM
3149 }
3150
aec661de
EH
3151 if (!kvm_enabled() || !cpu->expose_kvm) {
3152 env->features[FEAT_KVM] = 0;
3153 }
3154
2ca8a8be 3155 x86_cpu_enable_xsave_components(cpu);
c39c0edf
EH
3156
3157 /* CPUID[EAX=7,ECX=0].EBX always increased level automatically: */
3158 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_EBX);
3159 if (cpu->full_cpuid_auto_level) {
3160 x86_cpu_adjust_feat_level(cpu, FEAT_1_EDX);
3161 x86_cpu_adjust_feat_level(cpu, FEAT_1_ECX);
3162 x86_cpu_adjust_feat_level(cpu, FEAT_6_EAX);
3163 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_ECX);
3164 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_EDX);
3165 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_ECX);
3166 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0007_EDX);
3167 x86_cpu_adjust_feat_level(cpu, FEAT_C000_0001_EDX);
3168 x86_cpu_adjust_feat_level(cpu, FEAT_SVM);
3169 x86_cpu_adjust_feat_level(cpu, FEAT_XSAVE);
0c3d7c00
EH
3170 /* SVM requires CPUID[0x8000000A] */
3171 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) {
3172 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000000A);
3173 }
c39c0edf
EH
3174 }
3175
3176 /* Set cpuid_*level* based on cpuid_min_*level, if not explicitly set */
3177 if (env->cpuid_level == UINT32_MAX) {
3178 env->cpuid_level = env->cpuid_min_level;
3179 }
3180 if (env->cpuid_xlevel == UINT32_MAX) {
3181 env->cpuid_xlevel = env->cpuid_min_xlevel;
3182 }
3183 if (env->cpuid_xlevel2 == UINT32_MAX) {
3184 env->cpuid_xlevel2 = env->cpuid_min_xlevel2;
b34d12d1 3185 }
7a059953 3186
41f3d4d6
EH
3187out:
3188 if (local_err != NULL) {
3189 error_propagate(errp, local_err);
3190 }
3191}
3192
3193#define IS_INTEL_CPU(env) ((env)->cpuid_vendor1 == CPUID_VENDOR_INTEL_1 && \
3194 (env)->cpuid_vendor2 == CPUID_VENDOR_INTEL_2 && \
3195 (env)->cpuid_vendor3 == CPUID_VENDOR_INTEL_3)
3196#define IS_AMD_CPU(env) ((env)->cpuid_vendor1 == CPUID_VENDOR_AMD_1 && \
3197 (env)->cpuid_vendor2 == CPUID_VENDOR_AMD_2 && \
3198 (env)->cpuid_vendor3 == CPUID_VENDOR_AMD_3)
3199static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
3200{
3201 CPUState *cs = CPU(dev);
3202 X86CPU *cpu = X86_CPU(dev);
3203 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
3204 CPUX86State *env = &cpu->env;
3205 Error *local_err = NULL;
3206 static bool ht_warned;
3207
3208 if (xcc->kvm_required && !kvm_enabled()) {
3209 char *name = x86_cpu_class_get_model_name(xcc);
3210 error_setg(&local_err, "CPU model '%s' requires KVM", name);
3211 g_free(name);
3212 goto out;
3213 }
3214
3215 if (cpu->apic_id == UNASSIGNED_APIC_ID) {
3216 error_setg(errp, "apic-id property was not initialized properly");
3217 return;
3218 }
3219
3220 x86_cpu_load_features(cpu, &local_err);
3221 if (local_err) {
3222 goto out;
3223 }
3224
8ca30e86
EH
3225 if (x86_cpu_filter_features(cpu) &&
3226 (cpu->check_cpuid || cpu->enforce_cpuid)) {
3227 x86_cpu_report_filtered_features(cpu);
3228 if (cpu->enforce_cpuid) {
3229 error_setg(&local_err,
3230 kvm_enabled() ?
3231 "Host doesn't support requested features" :
3232 "TCG doesn't support requested features");
3233 goto out;
3234 }
9997cf7b
EH
3235 }
3236
9b15cd9e
IM
3237 /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on
3238 * CPUID[1].EDX.
3239 */
e48638fd 3240 if (IS_AMD_CPU(env)) {
0514ef2f
EH
3241 env->features[FEAT_8000_0001_EDX] &= ~CPUID_EXT2_AMD_ALIASES;
3242 env->features[FEAT_8000_0001_EDX] |= (env->features[FEAT_1_EDX]
9b15cd9e
IM
3243 & CPUID_EXT2_AMD_ALIASES);
3244 }
3245
11f6fee5
DDAG
3246 /* For 64bit systems think about the number of physical bits to present.
3247 * ideally this should be the same as the host; anything other than matching
3248 * the host can cause incorrect guest behaviour.
3249 * QEMU used to pick the magic value of 40 bits that corresponds to
3250 * consumer AMD devices but nothing else.
3251 */
af45907a 3252 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) {
af45907a 3253 if (kvm_enabled()) {
11f6fee5
DDAG
3254 uint32_t host_phys_bits = x86_host_phys_bits();
3255 static bool warned;
3256
3257 if (cpu->host_phys_bits) {
3258 /* The user asked for us to use the host physical bits */
3259 cpu->phys_bits = host_phys_bits;
3260 }
3261
3262 /* Print a warning if the user set it to a value that's not the
3263 * host value.
3264 */
3265 if (cpu->phys_bits != host_phys_bits && cpu->phys_bits != 0 &&
3266 !warned) {
3267 error_report("Warning: Host physical bits (%u)"
3268 " does not match phys-bits property (%u)",
3269 host_phys_bits, cpu->phys_bits);
3270 warned = true;
3271 }
3272
3273 if (cpu->phys_bits &&
3274 (cpu->phys_bits > TARGET_PHYS_ADDR_SPACE_BITS ||
3275 cpu->phys_bits < 32)) {
af45907a
DDAG
3276 error_setg(errp, "phys-bits should be between 32 and %u "
3277 " (but is %u)",
3278 TARGET_PHYS_ADDR_SPACE_BITS, cpu->phys_bits);
3279 return;
3280 }
3281 } else {
11f6fee5 3282 if (cpu->phys_bits && cpu->phys_bits != TCG_PHYS_ADDR_BITS) {
af45907a
DDAG
3283 error_setg(errp, "TCG only supports phys-bits=%u",
3284 TCG_PHYS_ADDR_BITS);
3285 return;
3286 }
3287 }
11f6fee5
DDAG
3288 /* 0 means it was not explicitly set by the user (or by machine
3289 * compat_props or by the host code above). In this case, the default
3290 * is the value used by TCG (40).
3291 */
3292 if (cpu->phys_bits == 0) {
3293 cpu->phys_bits = TCG_PHYS_ADDR_BITS;
3294 }
af45907a
DDAG
3295 } else {
3296 /* For 32 bit systems don't use the user set value, but keep
3297 * phys_bits consistent with what we tell the guest.
3298 */
3299 if (cpu->phys_bits != 0) {
3300 error_setg(errp, "phys-bits is not user-configurable in 32 bit");
3301 return;
3302 }
fefb41bf 3303
af45907a
DDAG
3304 if (env->features[FEAT_1_EDX] & CPUID_PSE36) {
3305 cpu->phys_bits = 36;
3306 } else {
3307 cpu->phys_bits = 32;
3308 }
3309 }
ce5b1bbf
LV
3310 cpu_exec_realizefn(cs, &local_err);
3311 if (local_err != NULL) {
3312 error_propagate(errp, local_err);
3313 return;
3314 }
42ecabaa 3315
57f2453a
EH
3316 if (tcg_enabled()) {
3317 tcg_x86_init();
3318 }
3319
65dee380
IM
3320#ifndef CONFIG_USER_ONLY
3321 qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
bdeec802 3322
0514ef2f 3323 if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || smp_cpus > 1) {
d3c64d6a 3324 x86_cpu_apic_create(cpu, &local_err);
2b6f294c 3325 if (local_err != NULL) {
4dc1f449 3326 goto out;
bdeec802
IM
3327 }
3328 }
65dee380
IM
3329#endif
3330
7a059953 3331 mce_init(cpu);
2001d0cd
PB
3332
3333#ifndef CONFIG_USER_ONLY
3334 if (tcg_enabled()) {
56943e8c
PM
3335 AddressSpace *newas = g_new(AddressSpace, 1);
3336
f809c605 3337 cpu->cpu_as_mem = g_new(MemoryRegion, 1);
2001d0cd 3338 cpu->cpu_as_root = g_new(MemoryRegion, 1);
f809c605
PB
3339
3340 /* Outer container... */
3341 memory_region_init(cpu->cpu_as_root, OBJECT(cpu), "memory", ~0ull);
2001d0cd 3342 memory_region_set_enabled(cpu->cpu_as_root, true);
f809c605
PB
3343
3344 /* ... with two regions inside: normal system memory with low
3345 * priority, and...
3346 */
3347 memory_region_init_alias(cpu->cpu_as_mem, OBJECT(cpu), "memory",
3348 get_system_memory(), 0, ~0ull);
3349 memory_region_add_subregion_overlap(cpu->cpu_as_root, 0, cpu->cpu_as_mem, 0);
3350 memory_region_set_enabled(cpu->cpu_as_mem, true);
56943e8c 3351 address_space_init(newas, cpu->cpu_as_root, "CPU");
12ebc9a7 3352 cs->num_ases = 1;
56943e8c 3353 cpu_address_space_init(cs, newas, 0);
f809c605
PB
3354
3355 /* ... SMRAM with higher priority, linked from /machine/smram. */
3356 cpu->machine_done.notify = x86_cpu_machine_done;
3357 qemu_add_machine_init_done_notifier(&cpu->machine_done);
2001d0cd
PB
3358 }
3359#endif
3360
14a10fc3 3361 qemu_init_vcpu(cs);
d3c64d6a 3362
e48638fd
WH
3363 /* Only Intel CPUs support hyperthreading. Even though QEMU fixes this
3364 * issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX
3365 * based on inputs (sockets,cores,threads), it is still better to gives
3366 * users a warning.
3367 *
3368 * NOTE: the following code has to follow qemu_init_vcpu(). Otherwise
3369 * cs->nr_threads hasn't be populated yet and the checking is incorrect.
3370 */
3371 if (!IS_INTEL_CPU(env) && cs->nr_threads > 1 && !ht_warned) {
3372 error_report("AMD CPU doesn't support hyperthreading. Please configure"
3373 " -smp options properly.");
3374 ht_warned = true;
3375 }
3376
d3c64d6a
IM
3377 x86_cpu_apic_realize(cpu, &local_err);
3378 if (local_err != NULL) {
3379 goto out;
3380 }
14a10fc3 3381 cpu_reset(cs);
2b6f294c 3382
4dc1f449 3383 xcc->parent_realize(dev, &local_err);
2001d0cd 3384
4dc1f449
IM
3385out:
3386 if (local_err != NULL) {
3387 error_propagate(errp, local_err);
3388 return;
3389 }
7a059953
AF
3390}
3391
c884776e
IM
3392static void x86_cpu_unrealizefn(DeviceState *dev, Error **errp)
3393{
3394 X86CPU *cpu = X86_CPU(dev);
7bbc124e
LV
3395 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev);
3396 Error *local_err = NULL;
c884776e
IM
3397
3398#ifndef CONFIG_USER_ONLY
3399 cpu_remove_sync(CPU(dev));
3400 qemu_unregister_reset(x86_cpu_machine_reset_cb, dev);
3401#endif
3402
3403 if (cpu->apic_state) {
3404 object_unparent(OBJECT(cpu->apic_state));
3405 cpu->apic_state = NULL;
3406 }
7bbc124e
LV
3407
3408 xcc->parent_unrealize(dev, &local_err);
3409 if (local_err != NULL) {
3410 error_propagate(errp, local_err);
3411 return;
3412 }
c884776e
IM
3413}
3414
38e5c119
EH
3415typedef struct BitProperty {
3416 uint32_t *ptr;
3417 uint32_t mask;
3418} BitProperty;
3419
d7bce999
EB
3420static void x86_cpu_get_bit_prop(Object *obj, Visitor *v, const char *name,
3421 void *opaque, Error **errp)
38e5c119
EH
3422{
3423 BitProperty *fp = opaque;
3424 bool value = (*fp->ptr & fp->mask) == fp->mask;
51e72bc1 3425 visit_type_bool(v, name, &value, errp);
38e5c119
EH
3426}
3427
d7bce999
EB
3428static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name,
3429 void *opaque, Error **errp)
38e5c119
EH
3430{
3431 DeviceState *dev = DEVICE(obj);
3432 BitProperty *fp = opaque;
3433 Error *local_err = NULL;
3434 bool value;
3435
3436 if (dev->realized) {
3437 qdev_prop_set_after_realize(dev, name, errp);
3438 return;
3439 }
3440
51e72bc1 3441 visit_type_bool(v, name, &value, &local_err);
38e5c119
EH
3442 if (local_err) {
3443 error_propagate(errp, local_err);
3444 return;
3445 }
3446
3447 if (value) {
3448 *fp->ptr |= fp->mask;
3449 } else {
3450 *fp->ptr &= ~fp->mask;
3451 }
3452}
3453
3454static void x86_cpu_release_bit_prop(Object *obj, const char *name,
3455 void *opaque)
3456{
3457 BitProperty *prop = opaque;
3458 g_free(prop);
3459}
3460
3461/* Register a boolean property to get/set a single bit in a uint32_t field.
3462 *
3463 * The same property name can be registered multiple times to make it affect
3464 * multiple bits in the same FeatureWord. In that case, the getter will return
3465 * true only if all bits are set.
3466 */
3467static void x86_cpu_register_bit_prop(X86CPU *cpu,
3468 const char *prop_name,
3469 uint32_t *field,
3470 int bitnr)
3471{
3472 BitProperty *fp;
3473 ObjectProperty *op;
3474 uint32_t mask = (1UL << bitnr);
3475
3476 op = object_property_find(OBJECT(cpu), prop_name, NULL);
3477 if (op) {
3478 fp = op->opaque;
3479 assert(fp->ptr == field);
3480 fp->mask |= mask;
3481 } else {
3482 fp = g_new0(BitProperty, 1);
3483 fp->ptr = field;
3484 fp->mask = mask;
3485 object_property_add(OBJECT(cpu), prop_name, "bool",
3486 x86_cpu_get_bit_prop,
3487 x86_cpu_set_bit_prop,
3488 x86_cpu_release_bit_prop, fp, &error_abort);
3489 }
3490}
3491
3492static void x86_cpu_register_feature_bit_props(X86CPU *cpu,
3493 FeatureWord w,
3494 int bitnr)
3495{
38e5c119 3496 FeatureWordInfo *fi = &feature_word_info[w];
16d2fcaa 3497 const char *name = fi->feat_names[bitnr];
38e5c119 3498
16d2fcaa 3499 if (!name) {
38e5c119
EH
3500 return;
3501 }
3502
fc7dfd20
EH
3503 /* Property names should use "-" instead of "_".
3504 * Old names containing underscores are registered as aliases
3505 * using object_property_add_alias()
3506 */
16d2fcaa
EH
3507 assert(!strchr(name, '_'));
3508 /* aliases don't use "|" delimiters anymore, they are registered
3509 * manually using object_property_add_alias() */
3510 assert(!strchr(name, '|'));
3511 x86_cpu_register_bit_prop(cpu, name, &cpu->env.features[w], bitnr);
38e5c119
EH
3512}
3513
de024815
AF
3514static void x86_cpu_initfn(Object *obj)
3515{
55e5c285 3516 CPUState *cs = CPU(obj);
de024815 3517 X86CPU *cpu = X86_CPU(obj);
d940ee9b 3518 X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
de024815 3519 CPUX86State *env = &cpu->env;
38e5c119 3520 FeatureWord w;
de024815 3521
c05efcb1 3522 cs->env_ptr = env;
71ad61d3
AF
3523
3524 object_property_add(obj, "family", "int",
95b8519d 3525 x86_cpuid_version_get_family,
71ad61d3 3526 x86_cpuid_version_set_family, NULL, NULL, NULL);
c5291a4f 3527 object_property_add(obj, "model", "int",
67e30c83 3528 x86_cpuid_version_get_model,
c5291a4f 3529 x86_cpuid_version_set_model, NULL, NULL, NULL);
036e2222 3530 object_property_add(obj, "stepping", "int",
35112e41 3531 x86_cpuid_version_get_stepping,
036e2222 3532 x86_cpuid_version_set_stepping, NULL, NULL, NULL);
d480e1af
AF
3533 object_property_add_str(obj, "vendor",
3534 x86_cpuid_get_vendor,
3535 x86_cpuid_set_vendor, NULL);
938d4c25 3536 object_property_add_str(obj, "model-id",
63e886eb 3537 x86_cpuid_get_model_id,
938d4c25 3538 x86_cpuid_set_model_id, NULL);
89e48965
AF
3539 object_property_add(obj, "tsc-frequency", "int",
3540 x86_cpuid_get_tsc_freq,
3541 x86_cpuid_set_tsc_freq, NULL, NULL, NULL);
8e8aba50
EH
3542 object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo",
3543 x86_cpu_get_feature_words,
7e5292b5
EH
3544 NULL, NULL, (void *)env->features, NULL);
3545 object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo",
3546 x86_cpu_get_feature_words,
3547 NULL, NULL, (void *)cpu->filtered_features, NULL);
71ad61d3 3548
92067bf4 3549 cpu->hyperv_spinlock_attempts = HYPERV_SPINLOCK_NEVER_RETRY;
d65e9815 3550
38e5c119
EH
3551 for (w = 0; w < FEATURE_WORDS; w++) {
3552 int bitnr;
3553
3554 for (bitnr = 0; bitnr < 32; bitnr++) {
3555 x86_cpu_register_feature_bit_props(cpu, w, bitnr);
3556 }
3557 }
3558
16d2fcaa
EH
3559 object_property_add_alias(obj, "sse3", obj, "pni", &error_abort);
3560 object_property_add_alias(obj, "pclmuldq", obj, "pclmulqdq", &error_abort);
3561 object_property_add_alias(obj, "sse4-1", obj, "sse4.1", &error_abort);
3562 object_property_add_alias(obj, "sse4-2", obj, "sse4.2", &error_abort);
3563 object_property_add_alias(obj, "xd", obj, "nx", &error_abort);
3564 object_property_add_alias(obj, "ffxsr", obj, "fxsr-opt", &error_abort);
3565 object_property_add_alias(obj, "i64", obj, "lm", &error_abort);
3566
54b8dc7c
EH
3567 object_property_add_alias(obj, "ds_cpl", obj, "ds-cpl", &error_abort);
3568 object_property_add_alias(obj, "tsc_adjust", obj, "tsc-adjust", &error_abort);
3569 object_property_add_alias(obj, "fxsr_opt", obj, "fxsr-opt", &error_abort);
3570 object_property_add_alias(obj, "lahf_lm", obj, "lahf-lm", &error_abort);
3571 object_property_add_alias(obj, "cmp_legacy", obj, "cmp-legacy", &error_abort);
3572 object_property_add_alias(obj, "nodeid_msr", obj, "nodeid-msr", &error_abort);
3573 object_property_add_alias(obj, "perfctr_core", obj, "perfctr-core", &error_abort);
3574 object_property_add_alias(obj, "perfctr_nb", obj, "perfctr-nb", &error_abort);
3575 object_property_add_alias(obj, "kvm_nopiodelay", obj, "kvm-nopiodelay", &error_abort);
3576 object_property_add_alias(obj, "kvm_mmu", obj, "kvm-mmu", &error_abort);
3577 object_property_add_alias(obj, "kvm_asyncpf", obj, "kvm-asyncpf", &error_abort);
3578 object_property_add_alias(obj, "kvm_steal_time", obj, "kvm-steal-time", &error_abort);
3579 object_property_add_alias(obj, "kvm_pv_eoi", obj, "kvm-pv-eoi", &error_abort);
3580 object_property_add_alias(obj, "kvm_pv_unhalt", obj, "kvm-pv-unhalt", &error_abort);
3581 object_property_add_alias(obj, "svm_lock", obj, "svm-lock", &error_abort);
3582 object_property_add_alias(obj, "nrip_save", obj, "nrip-save", &error_abort);
3583 object_property_add_alias(obj, "tsc_scale", obj, "tsc-scale", &error_abort);
3584 object_property_add_alias(obj, "vmcb_clean", obj, "vmcb-clean", &error_abort);
3585 object_property_add_alias(obj, "pause_filter", obj, "pause-filter", &error_abort);
3586 object_property_add_alias(obj, "sse4_1", obj, "sse4.1", &error_abort);
3587 object_property_add_alias(obj, "sse4_2", obj, "sse4.2", &error_abort);
3588
d940ee9b 3589 x86_cpu_load_def(cpu, xcc->cpu_def, &error_abort);
de024815
AF
3590}
3591
997395d3
IM
3592static int64_t x86_cpu_get_arch_id(CPUState *cs)
3593{
3594 X86CPU *cpu = X86_CPU(cs);
997395d3 3595
7e72a45c 3596 return cpu->apic_id;
997395d3
IM
3597}
3598
444d5590
AF
3599static bool x86_cpu_get_paging_enabled(const CPUState *cs)
3600{
3601 X86CPU *cpu = X86_CPU(cs);
3602
3603 return cpu->env.cr[0] & CR0_PG_MASK;
3604}
3605
f45748f1
AF
3606static void x86_cpu_set_pc(CPUState *cs, vaddr value)
3607{
3608 X86CPU *cpu = X86_CPU(cs);
3609
3610 cpu->env.eip = value;
3611}
3612
bdf7ae5b
AF
3613static void x86_cpu_synchronize_from_tb(CPUState *cs, TranslationBlock *tb)
3614{
3615 X86CPU *cpu = X86_CPU(cs);
3616
3617 cpu->env.eip = tb->pc - tb->cs_base;
3618}
3619
8c2e1b00
AF
3620static bool x86_cpu_has_work(CPUState *cs)
3621{
3622 X86CPU *cpu = X86_CPU(cs);
3623 CPUX86State *env = &cpu->env;
3624
6220e900
PD
3625 return ((cs->interrupt_request & (CPU_INTERRUPT_HARD |
3626 CPU_INTERRUPT_POLL)) &&
8c2e1b00
AF
3627 (env->eflags & IF_MASK)) ||
3628 (cs->interrupt_request & (CPU_INTERRUPT_NMI |
3629 CPU_INTERRUPT_INIT |
3630 CPU_INTERRUPT_SIPI |
a9bad65d
PB
3631 CPU_INTERRUPT_MCE)) ||
3632 ((cs->interrupt_request & CPU_INTERRUPT_SMI) &&
3633 !(env->hflags & HF_SMM_MASK));
8c2e1b00
AF
3634}
3635
9337e3b6 3636static Property x86_cpu_properties[] = {
2da00e31
IM
3637#ifdef CONFIG_USER_ONLY
3638 /* apic_id = 0 by default for *-user, see commit 9886e834 */
3639 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, 0),
d89c2b8b
IM
3640 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, 0),
3641 DEFINE_PROP_INT32("core-id", X86CPU, core_id, 0),
3642 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, 0),
2da00e31
IM
3643#else
3644 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, UNASSIGNED_APIC_ID),
d89c2b8b
IM
3645 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, -1),
3646 DEFINE_PROP_INT32("core-id", X86CPU, core_id, -1),
3647 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, -1),
2da00e31 3648#endif
9337e3b6 3649 DEFINE_PROP_BOOL("pmu", X86CPU, enable_pmu, false),
c8f0f88e 3650 { .name = "hv-spinlocks", .info = &qdev_prop_spinlocks },
89314504 3651 DEFINE_PROP_BOOL("hv-relaxed", X86CPU, hyperv_relaxed_timing, false),
0f46685d 3652 DEFINE_PROP_BOOL("hv-vapic", X86CPU, hyperv_vapic, false),
48a5f3bc 3653 DEFINE_PROP_BOOL("hv-time", X86CPU, hyperv_time, false),
f2a53c9e 3654 DEFINE_PROP_BOOL("hv-crash", X86CPU, hyperv_crash, false),
744b8a94 3655 DEFINE_PROP_BOOL("hv-reset", X86CPU, hyperv_reset, false),
8c145d7c 3656 DEFINE_PROP_BOOL("hv-vpindex", X86CPU, hyperv_vpindex, false),
46eb8f98 3657 DEFINE_PROP_BOOL("hv-runtime", X86CPU, hyperv_runtime, false),
866eea9a 3658 DEFINE_PROP_BOOL("hv-synic", X86CPU, hyperv_synic, false),
ff99aa64 3659 DEFINE_PROP_BOOL("hv-stimer", X86CPU, hyperv_stimer, false),
15e41345 3660 DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true),
912ffc47 3661 DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false),
f522d2ac 3662 DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true),
af45907a 3663 DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 0),
11f6fee5 3664 DEFINE_PROP_BOOL("host-phys-bits", X86CPU, host_phys_bits, false),
fcc35e7c 3665 DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true),
c39c0edf
EH
3666 DEFINE_PROP_UINT32("level", X86CPU, env.cpuid_level, UINT32_MAX),
3667 DEFINE_PROP_UINT32("xlevel", X86CPU, env.cpuid_xlevel, UINT32_MAX),
3668 DEFINE_PROP_UINT32("xlevel2", X86CPU, env.cpuid_xlevel2, UINT32_MAX),
3669 DEFINE_PROP_UINT32("min-level", X86CPU, env.cpuid_min_level, 0),
3670 DEFINE_PROP_UINT32("min-xlevel", X86CPU, env.cpuid_min_xlevel, 0),
3671 DEFINE_PROP_UINT32("min-xlevel2", X86CPU, env.cpuid_min_xlevel2, 0),
3672 DEFINE_PROP_BOOL("full-cpuid-auto-level", X86CPU, full_cpuid_auto_level, true),
1c4a55db 3673 DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor_id),
5232d00a 3674 DEFINE_PROP_BOOL("cpuid-0xb", X86CPU, enable_cpuid_0xb, true),
87f8b626 3675 DEFINE_PROP_BOOL("lmce", X86CPU, enable_lmce, false),
14c985cf 3676 DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true),
9337e3b6
EH
3677 DEFINE_PROP_END_OF_LIST()
3678};
3679
5fd2087a
AF
3680static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
3681{
3682 X86CPUClass *xcc = X86_CPU_CLASS(oc);
3683 CPUClass *cc = CPU_CLASS(oc);
2b6f294c
AF
3684 DeviceClass *dc = DEVICE_CLASS(oc);
3685
3686 xcc->parent_realize = dc->realize;
7bbc124e 3687 xcc->parent_unrealize = dc->unrealize;
2b6f294c 3688 dc->realize = x86_cpu_realizefn;
c884776e 3689 dc->unrealize = x86_cpu_unrealizefn;
9337e3b6 3690 dc->props = x86_cpu_properties;
5fd2087a
AF
3691
3692 xcc->parent_reset = cc->reset;
3693 cc->reset = x86_cpu_reset;
91b1df8c 3694 cc->reset_dump_flags = CPU_DUMP_FPU | CPU_DUMP_CCOP;
f56e3a14 3695
500050d1 3696 cc->class_by_name = x86_cpu_class_by_name;
94a444b2 3697 cc->parse_features = x86_cpu_parse_featurestr;
8c2e1b00 3698 cc->has_work = x86_cpu_has_work;
97a8ea5a 3699 cc->do_interrupt = x86_cpu_do_interrupt;
42f53fea 3700 cc->cpu_exec_interrupt = x86_cpu_exec_interrupt;
878096ee 3701 cc->dump_state = x86_cpu_dump_state;
f45748f1 3702 cc->set_pc = x86_cpu_set_pc;
bdf7ae5b 3703 cc->synchronize_from_tb = x86_cpu_synchronize_from_tb;
5b50e790
AF
3704 cc->gdb_read_register = x86_cpu_gdb_read_register;
3705 cc->gdb_write_register = x86_cpu_gdb_write_register;
444d5590
AF
3706 cc->get_arch_id = x86_cpu_get_arch_id;
3707 cc->get_paging_enabled = x86_cpu_get_paging_enabled;
7510454e
AF
3708#ifdef CONFIG_USER_ONLY
3709 cc->handle_mmu_fault = x86_cpu_handle_mmu_fault;
3710#else
a23bbfda 3711 cc->get_memory_mapping = x86_cpu_get_memory_mapping;
00b941e5 3712 cc->get_phys_page_debug = x86_cpu_get_phys_page_debug;
c72bf468
JF
3713 cc->write_elf64_note = x86_cpu_write_elf64_note;
3714 cc->write_elf64_qemunote = x86_cpu_write_elf64_qemunote;
3715 cc->write_elf32_note = x86_cpu_write_elf32_note;
3716 cc->write_elf32_qemunote = x86_cpu_write_elf32_qemunote;
00b941e5 3717 cc->vmsd = &vmstate_x86_cpu;
c72bf468 3718#endif
175cad36
DE
3719 /* CPU_NB_REGS * 2 = general regs + xmm regs
3720 * 25 = eip, eflags, 6 seg regs, st[0-7], fctrl,...,fop, mxcsr.
3721 */
a0e372f0 3722 cc->gdb_num_core_regs = CPU_NB_REGS * 2 + 25;
86025ee4
PM
3723#ifndef CONFIG_USER_ONLY
3724 cc->debug_excp_handler = breakpoint_handler;
3725#endif
374e0cd4
RH
3726 cc->cpu_exec_enter = x86_cpu_exec_enter;
3727 cc->cpu_exec_exit = x86_cpu_exec_exit;
4c315c27 3728
edd12111 3729 dc->cannot_instantiate_with_device_add_yet = false;
5fd2087a
AF
3730}
3731
3732static const TypeInfo x86_cpu_type_info = {
3733 .name = TYPE_X86_CPU,
3734 .parent = TYPE_CPU,
3735 .instance_size = sizeof(X86CPU),
de024815 3736 .instance_init = x86_cpu_initfn,
d940ee9b 3737 .abstract = true,
5fd2087a
AF
3738 .class_size = sizeof(X86CPUClass),
3739 .class_init = x86_cpu_common_class_init,
3740};
3741
3742static void x86_cpu_register_types(void)
3743{
d940ee9b
EH
3744 int i;
3745
5fd2087a 3746 type_register_static(&x86_cpu_type_info);
d940ee9b
EH
3747 for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) {
3748 x86_register_cpudef_type(&builtin_x86_defs[i]);
3749 }
3750#ifdef CONFIG_KVM
3751 type_register_static(&host_x86_cpu_type_info);
3752#endif
5fd2087a
AF
3753}
3754
3755type_init(x86_cpu_register_types)