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