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