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