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