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 20 #include "qemu/osdep.h" 21 #include "qemu/units.h" 22 #include "qemu/cutils.h" 23 #include "qemu/bitops.h" 24 25 #include "cpu.h" 26 #include "exec/exec-all.h" 27 #include "sysemu/kvm.h" 28 #include "sysemu/hvf.h" 29 #include "sysemu/cpus.h" 30 #include "kvm_i386.h" 31 #include "sev_i386.h" 32 33 #include "qemu/error-report.h" 34 #include "qemu/option.h" 35 #include "qemu/config-file.h" 36 #include "qapi/error.h" 37 #include "qapi/qapi-visit-misc.h" 38 #include "qapi/qapi-visit-run-state.h" 39 #include "qapi/qmp/qdict.h" 40 #include "qapi/qmp/qerror.h" 41 #include "qapi/visitor.h" 42 #include "qom/qom-qobject.h" 43 #include "sysemu/arch_init.h" 44 45 #include "standard-headers/asm-x86/kvm_para.h" 46 47 #include "sysemu/sysemu.h" 48 #include "hw/qdev-properties.h" 49 #include "hw/i386/topology.h" 50 #ifndef CONFIG_USER_ONLY 51 #include "exec/address-spaces.h" 52 #include "hw/hw.h" 53 #include "hw/xen/xen.h" 54 #include "hw/i386/apic_internal.h" 55 #endif 56 57 #include "disas/capstone.h" 58 59 /* Helpers for building CPUID[2] descriptors: */ 60 61 struct CPUID2CacheDescriptorInfo { 62 enum CacheType type; 63 int level; 64 int size; 65 int line_size; 66 int associativity; 67 }; 68 69 /* 70 * Known CPUID 2 cache descriptors. 71 * From Intel SDM Volume 2A, CPUID instruction 72 */ 73 struct CPUID2CacheDescriptorInfo cpuid2_cache_descriptors[] = { 74 [0x06] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 8 * KiB, 75 .associativity = 4, .line_size = 32, }, 76 [0x08] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 16 * KiB, 77 .associativity = 4, .line_size = 32, }, 78 [0x09] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 32 * KiB, 79 .associativity = 4, .line_size = 64, }, 80 [0x0A] = { .level = 1, .type = DATA_CACHE, .size = 8 * KiB, 81 .associativity = 2, .line_size = 32, }, 82 [0x0C] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB, 83 .associativity = 4, .line_size = 32, }, 84 [0x0D] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB, 85 .associativity = 4, .line_size = 64, }, 86 [0x0E] = { .level = 1, .type = DATA_CACHE, .size = 24 * KiB, 87 .associativity = 6, .line_size = 64, }, 88 [0x1D] = { .level = 2, .type = UNIFIED_CACHE, .size = 128 * KiB, 89 .associativity = 2, .line_size = 64, }, 90 [0x21] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB, 91 .associativity = 8, .line_size = 64, }, 92 /* lines per sector is not supported cpuid2_cache_descriptor(), 93 * so descriptors 0x22, 0x23 are not included 94 */ 95 [0x24] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB, 96 .associativity = 16, .line_size = 64, }, 97 /* lines per sector is not supported cpuid2_cache_descriptor(), 98 * so descriptors 0x25, 0x20 are not included 99 */ 100 [0x2C] = { .level = 1, .type = DATA_CACHE, .size = 32 * KiB, 101 .associativity = 8, .line_size = 64, }, 102 [0x30] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 32 * KiB, 103 .associativity = 8, .line_size = 64, }, 104 [0x41] = { .level = 2, .type = UNIFIED_CACHE, .size = 128 * KiB, 105 .associativity = 4, .line_size = 32, }, 106 [0x42] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB, 107 .associativity = 4, .line_size = 32, }, 108 [0x43] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB, 109 .associativity = 4, .line_size = 32, }, 110 [0x44] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB, 111 .associativity = 4, .line_size = 32, }, 112 [0x45] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB, 113 .associativity = 4, .line_size = 32, }, 114 [0x46] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB, 115 .associativity = 4, .line_size = 64, }, 116 [0x47] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB, 117 .associativity = 8, .line_size = 64, }, 118 [0x48] = { .level = 2, .type = UNIFIED_CACHE, .size = 3 * MiB, 119 .associativity = 12, .line_size = 64, }, 120 /* Descriptor 0x49 depends on CPU family/model, so it is not included */ 121 [0x4A] = { .level = 3, .type = UNIFIED_CACHE, .size = 6 * MiB, 122 .associativity = 12, .line_size = 64, }, 123 [0x4B] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB, 124 .associativity = 16, .line_size = 64, }, 125 [0x4C] = { .level = 3, .type = UNIFIED_CACHE, .size = 12 * MiB, 126 .associativity = 12, .line_size = 64, }, 127 [0x4D] = { .level = 3, .type = UNIFIED_CACHE, .size = 16 * MiB, 128 .associativity = 16, .line_size = 64, }, 129 [0x4E] = { .level = 2, .type = UNIFIED_CACHE, .size = 6 * MiB, 130 .associativity = 24, .line_size = 64, }, 131 [0x60] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB, 132 .associativity = 8, .line_size = 64, }, 133 [0x66] = { .level = 1, .type = DATA_CACHE, .size = 8 * KiB, 134 .associativity = 4, .line_size = 64, }, 135 [0x67] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB, 136 .associativity = 4, .line_size = 64, }, 137 [0x68] = { .level = 1, .type = DATA_CACHE, .size = 32 * KiB, 138 .associativity = 4, .line_size = 64, }, 139 [0x78] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB, 140 .associativity = 4, .line_size = 64, }, 141 /* lines per sector is not supported cpuid2_cache_descriptor(), 142 * so descriptors 0x79, 0x7A, 0x7B, 0x7C are not included. 143 */ 144 [0x7D] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB, 145 .associativity = 8, .line_size = 64, }, 146 [0x7F] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB, 147 .associativity = 2, .line_size = 64, }, 148 [0x80] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB, 149 .associativity = 8, .line_size = 64, }, 150 [0x82] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB, 151 .associativity = 8, .line_size = 32, }, 152 [0x83] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB, 153 .associativity = 8, .line_size = 32, }, 154 [0x84] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB, 155 .associativity = 8, .line_size = 32, }, 156 [0x85] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB, 157 .associativity = 8, .line_size = 32, }, 158 [0x86] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB, 159 .associativity = 4, .line_size = 64, }, 160 [0x87] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB, 161 .associativity = 8, .line_size = 64, }, 162 [0xD0] = { .level = 3, .type = UNIFIED_CACHE, .size = 512 * KiB, 163 .associativity = 4, .line_size = 64, }, 164 [0xD1] = { .level = 3, .type = UNIFIED_CACHE, .size = 1 * MiB, 165 .associativity = 4, .line_size = 64, }, 166 [0xD2] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB, 167 .associativity = 4, .line_size = 64, }, 168 [0xD6] = { .level = 3, .type = UNIFIED_CACHE, .size = 1 * MiB, 169 .associativity = 8, .line_size = 64, }, 170 [0xD7] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB, 171 .associativity = 8, .line_size = 64, }, 172 [0xD8] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB, 173 .associativity = 8, .line_size = 64, }, 174 [0xDC] = { .level = 3, .type = UNIFIED_CACHE, .size = 1.5 * MiB, 175 .associativity = 12, .line_size = 64, }, 176 [0xDD] = { .level = 3, .type = UNIFIED_CACHE, .size = 3 * MiB, 177 .associativity = 12, .line_size = 64, }, 178 [0xDE] = { .level = 3, .type = UNIFIED_CACHE, .size = 6 * MiB, 179 .associativity = 12, .line_size = 64, }, 180 [0xE2] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB, 181 .associativity = 16, .line_size = 64, }, 182 [0xE3] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB, 183 .associativity = 16, .line_size = 64, }, 184 [0xE4] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB, 185 .associativity = 16, .line_size = 64, }, 186 [0xEA] = { .level = 3, .type = UNIFIED_CACHE, .size = 12 * MiB, 187 .associativity = 24, .line_size = 64, }, 188 [0xEB] = { .level = 3, .type = UNIFIED_CACHE, .size = 18 * MiB, 189 .associativity = 24, .line_size = 64, }, 190 [0xEC] = { .level = 3, .type = UNIFIED_CACHE, .size = 24 * MiB, 191 .associativity = 24, .line_size = 64, }, 192 }; 193 194 /* 195 * "CPUID leaf 2 does not report cache descriptor information, 196 * use CPUID leaf 4 to query cache parameters" 197 */ 198 #define CACHE_DESCRIPTOR_UNAVAILABLE 0xFF 199 200 /* 201 * Return a CPUID 2 cache descriptor for a given cache. 202 * If no known descriptor is found, return CACHE_DESCRIPTOR_UNAVAILABLE 203 */ 204 static uint8_t cpuid2_cache_descriptor(CPUCacheInfo *cache) 205 { 206 int i; 207 208 assert(cache->size > 0); 209 assert(cache->level > 0); 210 assert(cache->line_size > 0); 211 assert(cache->associativity > 0); 212 for (i = 0; i < ARRAY_SIZE(cpuid2_cache_descriptors); i++) { 213 struct CPUID2CacheDescriptorInfo *d = &cpuid2_cache_descriptors[i]; 214 if (d->level == cache->level && d->type == cache->type && 215 d->size == cache->size && d->line_size == cache->line_size && 216 d->associativity == cache->associativity) { 217 return i; 218 } 219 } 220 221 return CACHE_DESCRIPTOR_UNAVAILABLE; 222 } 223 224 /* CPUID Leaf 4 constants: */ 225 226 /* EAX: */ 227 #define CACHE_TYPE_D 1 228 #define CACHE_TYPE_I 2 229 #define CACHE_TYPE_UNIFIED 3 230 231 #define CACHE_LEVEL(l) (l << 5) 232 233 #define CACHE_SELF_INIT_LEVEL (1 << 8) 234 235 /* EDX: */ 236 #define CACHE_NO_INVD_SHARING (1 << 0) 237 #define CACHE_INCLUSIVE (1 << 1) 238 #define CACHE_COMPLEX_IDX (1 << 2) 239 240 /* Encode CacheType for CPUID[4].EAX */ 241 #define CACHE_TYPE(t) (((t) == DATA_CACHE) ? CACHE_TYPE_D : \ 242 ((t) == INSTRUCTION_CACHE) ? CACHE_TYPE_I : \ 243 ((t) == UNIFIED_CACHE) ? CACHE_TYPE_UNIFIED : \ 244 0 /* Invalid value */) 245 246 247 /* Encode cache info for CPUID[4] */ 248 static void encode_cache_cpuid4(CPUCacheInfo *cache, 249 int num_apic_ids, int num_cores, 250 uint32_t *eax, uint32_t *ebx, 251 uint32_t *ecx, uint32_t *edx) 252 { 253 assert(cache->size == cache->line_size * cache->associativity * 254 cache->partitions * cache->sets); 255 256 assert(num_apic_ids > 0); 257 *eax = CACHE_TYPE(cache->type) | 258 CACHE_LEVEL(cache->level) | 259 (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0) | 260 ((num_cores - 1) << 26) | 261 ((num_apic_ids - 1) << 14); 262 263 assert(cache->line_size > 0); 264 assert(cache->partitions > 0); 265 assert(cache->associativity > 0); 266 /* We don't implement fully-associative caches */ 267 assert(cache->associativity < cache->sets); 268 *ebx = (cache->line_size - 1) | 269 ((cache->partitions - 1) << 12) | 270 ((cache->associativity - 1) << 22); 271 272 assert(cache->sets > 0); 273 *ecx = cache->sets - 1; 274 275 *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) | 276 (cache->inclusive ? CACHE_INCLUSIVE : 0) | 277 (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0); 278 } 279 280 /* Encode cache info for CPUID[0x80000005].ECX or CPUID[0x80000005].EDX */ 281 static uint32_t encode_cache_cpuid80000005(CPUCacheInfo *cache) 282 { 283 assert(cache->size % 1024 == 0); 284 assert(cache->lines_per_tag > 0); 285 assert(cache->associativity > 0); 286 assert(cache->line_size > 0); 287 return ((cache->size / 1024) << 24) | (cache->associativity << 16) | 288 (cache->lines_per_tag << 8) | (cache->line_size); 289 } 290 291 #define ASSOC_FULL 0xFF 292 293 /* AMD associativity encoding used on CPUID Leaf 0x80000006: */ 294 #define AMD_ENC_ASSOC(a) (a <= 1 ? a : \ 295 a == 2 ? 0x2 : \ 296 a == 4 ? 0x4 : \ 297 a == 8 ? 0x6 : \ 298 a == 16 ? 0x8 : \ 299 a == 32 ? 0xA : \ 300 a == 48 ? 0xB : \ 301 a == 64 ? 0xC : \ 302 a == 96 ? 0xD : \ 303 a == 128 ? 0xE : \ 304 a == ASSOC_FULL ? 0xF : \ 305 0 /* invalid value */) 306 307 /* 308 * Encode cache info for CPUID[0x80000006].ECX and CPUID[0x80000006].EDX 309 * @l3 can be NULL. 310 */ 311 static void encode_cache_cpuid80000006(CPUCacheInfo *l2, 312 CPUCacheInfo *l3, 313 uint32_t *ecx, uint32_t *edx) 314 { 315 assert(l2->size % 1024 == 0); 316 assert(l2->associativity > 0); 317 assert(l2->lines_per_tag > 0); 318 assert(l2->line_size > 0); 319 *ecx = ((l2->size / 1024) << 16) | 320 (AMD_ENC_ASSOC(l2->associativity) << 12) | 321 (l2->lines_per_tag << 8) | (l2->line_size); 322 323 if (l3) { 324 assert(l3->size % (512 * 1024) == 0); 325 assert(l3->associativity > 0); 326 assert(l3->lines_per_tag > 0); 327 assert(l3->line_size > 0); 328 *edx = ((l3->size / (512 * 1024)) << 18) | 329 (AMD_ENC_ASSOC(l3->associativity) << 12) | 330 (l3->lines_per_tag << 8) | (l3->line_size); 331 } else { 332 *edx = 0; 333 } 334 } 335 336 /* 337 * Definitions used for building CPUID Leaf 0x8000001D and 0x8000001E 338 * Please refer to the AMD64 Architecture Programmer’s Manual Volume 3. 339 * Define the constants to build the cpu topology. Right now, TOPOEXT 340 * feature is enabled only on EPYC. So, these constants are based on 341 * EPYC supported configurations. We may need to handle the cases if 342 * these values change in future. 343 */ 344 /* Maximum core complexes in a node */ 345 #define MAX_CCX 2 346 /* Maximum cores in a core complex */ 347 #define MAX_CORES_IN_CCX 4 348 /* Maximum cores in a node */ 349 #define MAX_CORES_IN_NODE 8 350 /* Maximum nodes in a socket */ 351 #define MAX_NODES_PER_SOCKET 4 352 353 /* 354 * Figure out the number of nodes required to build this config. 355 * Max cores in a node is 8 356 */ 357 static int nodes_in_socket(int nr_cores) 358 { 359 int nodes; 360 361 nodes = DIV_ROUND_UP(nr_cores, MAX_CORES_IN_NODE); 362 363 /* Hardware does not support config with 3 nodes, return 4 in that case */ 364 return (nodes == 3) ? 4 : nodes; 365 } 366 367 /* 368 * Decide the number of cores in a core complex with the given nr_cores using 369 * following set constants MAX_CCX, MAX_CORES_IN_CCX, MAX_CORES_IN_NODE and 370 * MAX_NODES_PER_SOCKET. Maintain symmetry as much as possible 371 * L3 cache is shared across all cores in a core complex. So, this will also 372 * tell us how many cores are sharing the L3 cache. 373 */ 374 static int cores_in_core_complex(int nr_cores) 375 { 376 int nodes; 377 378 /* Check if we can fit all the cores in one core complex */ 379 if (nr_cores <= MAX_CORES_IN_CCX) { 380 return nr_cores; 381 } 382 /* Get the number of nodes required to build this config */ 383 nodes = nodes_in_socket(nr_cores); 384 385 /* 386 * Divide the cores accros all the core complexes 387 * Return rounded up value 388 */ 389 return DIV_ROUND_UP(nr_cores, nodes * MAX_CCX); 390 } 391 392 /* Encode cache info for CPUID[8000001D] */ 393 static void encode_cache_cpuid8000001d(CPUCacheInfo *cache, CPUState *cs, 394 uint32_t *eax, uint32_t *ebx, 395 uint32_t *ecx, uint32_t *edx) 396 { 397 uint32_t l3_cores; 398 assert(cache->size == cache->line_size * cache->associativity * 399 cache->partitions * cache->sets); 400 401 *eax = CACHE_TYPE(cache->type) | CACHE_LEVEL(cache->level) | 402 (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0); 403 404 /* L3 is shared among multiple cores */ 405 if (cache->level == 3) { 406 l3_cores = cores_in_core_complex(cs->nr_cores); 407 *eax |= ((l3_cores * cs->nr_threads) - 1) << 14; 408 } else { 409 *eax |= ((cs->nr_threads - 1) << 14); 410 } 411 412 assert(cache->line_size > 0); 413 assert(cache->partitions > 0); 414 assert(cache->associativity > 0); 415 /* We don't implement fully-associative caches */ 416 assert(cache->associativity < cache->sets); 417 *ebx = (cache->line_size - 1) | 418 ((cache->partitions - 1) << 12) | 419 ((cache->associativity - 1) << 22); 420 421 assert(cache->sets > 0); 422 *ecx = cache->sets - 1; 423 424 *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) | 425 (cache->inclusive ? CACHE_INCLUSIVE : 0) | 426 (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0); 427 } 428 429 /* Data structure to hold the configuration info for a given core index */ 430 struct core_topology { 431 /* core complex id of the current core index */ 432 int ccx_id; 433 /* 434 * Adjusted core index for this core in the topology 435 * This can be 0,1,2,3 with max 4 cores in a core complex 436 */ 437 int core_id; 438 /* Node id for this core index */ 439 int node_id; 440 /* Number of nodes in this config */ 441 int num_nodes; 442 }; 443 444 /* 445 * Build the configuration closely match the EPYC hardware. Using the EPYC 446 * hardware configuration values (MAX_CCX, MAX_CORES_IN_CCX, MAX_CORES_IN_NODE) 447 * right now. This could change in future. 448 * nr_cores : Total number of cores in the config 449 * core_id : Core index of the current CPU 450 * topo : Data structure to hold all the config info for this core index 451 */ 452 static void build_core_topology(int nr_cores, int core_id, 453 struct core_topology *topo) 454 { 455 int nodes, cores_in_ccx; 456 457 /* First get the number of nodes required */ 458 nodes = nodes_in_socket(nr_cores); 459 460 cores_in_ccx = cores_in_core_complex(nr_cores); 461 462 topo->node_id = core_id / (cores_in_ccx * MAX_CCX); 463 topo->ccx_id = (core_id % (cores_in_ccx * MAX_CCX)) / cores_in_ccx; 464 topo->core_id = core_id % cores_in_ccx; 465 topo->num_nodes = nodes; 466 } 467 468 /* Encode cache info for CPUID[8000001E] */ 469 static void encode_topo_cpuid8000001e(CPUState *cs, X86CPU *cpu, 470 uint32_t *eax, uint32_t *ebx, 471 uint32_t *ecx, uint32_t *edx) 472 { 473 struct core_topology topo = {0}; 474 unsigned long nodes; 475 int shift; 476 477 build_core_topology(cs->nr_cores, cpu->core_id, &topo); 478 *eax = cpu->apic_id; 479 /* 480 * CPUID_Fn8000001E_EBX 481 * 31:16 Reserved 482 * 15:8 Threads per core (The number of threads per core is 483 * Threads per core + 1) 484 * 7:0 Core id (see bit decoding below) 485 * SMT: 486 * 4:3 node id 487 * 2 Core complex id 488 * 1:0 Core id 489 * Non SMT: 490 * 5:4 node id 491 * 3 Core complex id 492 * 1:0 Core id 493 */ 494 if (cs->nr_threads - 1) { 495 *ebx = ((cs->nr_threads - 1) << 8) | (topo.node_id << 3) | 496 (topo.ccx_id << 2) | topo.core_id; 497 } else { 498 *ebx = (topo.node_id << 4) | (topo.ccx_id << 3) | topo.core_id; 499 } 500 /* 501 * CPUID_Fn8000001E_ECX 502 * 31:11 Reserved 503 * 10:8 Nodes per processor (Nodes per processor is number of nodes + 1) 504 * 7:0 Node id (see bit decoding below) 505 * 2 Socket id 506 * 1:0 Node id 507 */ 508 if (topo.num_nodes <= 4) { 509 *ecx = ((topo.num_nodes - 1) << 8) | (cpu->socket_id << 2) | 510 topo.node_id; 511 } else { 512 /* 513 * Node id fix up. Actual hardware supports up to 4 nodes. But with 514 * more than 32 cores, we may end up with more than 4 nodes. 515 * Node id is a combination of socket id and node id. Only requirement 516 * here is that this number should be unique accross the system. 517 * Shift the socket id to accommodate more nodes. We dont expect both 518 * socket id and node id to be big number at the same time. This is not 519 * an ideal config but we need to to support it. Max nodes we can have 520 * is 32 (255/8) with 8 cores per node and 255 max cores. We only need 521 * 5 bits for nodes. Find the left most set bit to represent the total 522 * number of nodes. find_last_bit returns last set bit(0 based). Left 523 * shift(+1) the socket id to represent all the nodes. 524 */ 525 nodes = topo.num_nodes - 1; 526 shift = find_last_bit(&nodes, 8); 527 *ecx = ((topo.num_nodes - 1) << 8) | (cpu->socket_id << (shift + 1)) | 528 topo.node_id; 529 } 530 *edx = 0; 531 } 532 533 /* 534 * Definitions of the hardcoded cache entries we expose: 535 * These are legacy cache values. If there is a need to change any 536 * of these values please use builtin_x86_defs 537 */ 538 539 /* L1 data cache: */ 540 static CPUCacheInfo legacy_l1d_cache = { 541 .type = DATA_CACHE, 542 .level = 1, 543 .size = 32 * KiB, 544 .self_init = 1, 545 .line_size = 64, 546 .associativity = 8, 547 .sets = 64, 548 .partitions = 1, 549 .no_invd_sharing = true, 550 }; 551 552 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */ 553 static CPUCacheInfo legacy_l1d_cache_amd = { 554 .type = DATA_CACHE, 555 .level = 1, 556 .size = 64 * KiB, 557 .self_init = 1, 558 .line_size = 64, 559 .associativity = 2, 560 .sets = 512, 561 .partitions = 1, 562 .lines_per_tag = 1, 563 .no_invd_sharing = true, 564 }; 565 566 /* L1 instruction cache: */ 567 static CPUCacheInfo legacy_l1i_cache = { 568 .type = INSTRUCTION_CACHE, 569 .level = 1, 570 .size = 32 * KiB, 571 .self_init = 1, 572 .line_size = 64, 573 .associativity = 8, 574 .sets = 64, 575 .partitions = 1, 576 .no_invd_sharing = true, 577 }; 578 579 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */ 580 static CPUCacheInfo legacy_l1i_cache_amd = { 581 .type = INSTRUCTION_CACHE, 582 .level = 1, 583 .size = 64 * KiB, 584 .self_init = 1, 585 .line_size = 64, 586 .associativity = 2, 587 .sets = 512, 588 .partitions = 1, 589 .lines_per_tag = 1, 590 .no_invd_sharing = true, 591 }; 592 593 /* Level 2 unified cache: */ 594 static CPUCacheInfo legacy_l2_cache = { 595 .type = UNIFIED_CACHE, 596 .level = 2, 597 .size = 4 * MiB, 598 .self_init = 1, 599 .line_size = 64, 600 .associativity = 16, 601 .sets = 4096, 602 .partitions = 1, 603 .no_invd_sharing = true, 604 }; 605 606 /*FIXME: CPUID leaf 2 descriptor is inconsistent with CPUID leaf 4 */ 607 static CPUCacheInfo legacy_l2_cache_cpuid2 = { 608 .type = UNIFIED_CACHE, 609 .level = 2, 610 .size = 2 * MiB, 611 .line_size = 64, 612 .associativity = 8, 613 }; 614 615 616 /*FIXME: CPUID leaf 0x80000006 is inconsistent with leaves 2 & 4 */ 617 static CPUCacheInfo legacy_l2_cache_amd = { 618 .type = UNIFIED_CACHE, 619 .level = 2, 620 .size = 512 * KiB, 621 .line_size = 64, 622 .lines_per_tag = 1, 623 .associativity = 16, 624 .sets = 512, 625 .partitions = 1, 626 }; 627 628 /* Level 3 unified cache: */ 629 static CPUCacheInfo legacy_l3_cache = { 630 .type = UNIFIED_CACHE, 631 .level = 3, 632 .size = 16 * MiB, 633 .line_size = 64, 634 .associativity = 16, 635 .sets = 16384, 636 .partitions = 1, 637 .lines_per_tag = 1, 638 .self_init = true, 639 .inclusive = true, 640 .complex_indexing = true, 641 }; 642 643 /* TLB definitions: */ 644 645 #define L1_DTLB_2M_ASSOC 1 646 #define L1_DTLB_2M_ENTRIES 255 647 #define L1_DTLB_4K_ASSOC 1 648 #define L1_DTLB_4K_ENTRIES 255 649 650 #define L1_ITLB_2M_ASSOC 1 651 #define L1_ITLB_2M_ENTRIES 255 652 #define L1_ITLB_4K_ASSOC 1 653 #define L1_ITLB_4K_ENTRIES 255 654 655 #define L2_DTLB_2M_ASSOC 0 /* disabled */ 656 #define L2_DTLB_2M_ENTRIES 0 /* disabled */ 657 #define L2_DTLB_4K_ASSOC 4 658 #define L2_DTLB_4K_ENTRIES 512 659 660 #define L2_ITLB_2M_ASSOC 0 /* disabled */ 661 #define L2_ITLB_2M_ENTRIES 0 /* disabled */ 662 #define L2_ITLB_4K_ASSOC 4 663 #define L2_ITLB_4K_ENTRIES 512 664 665 /* CPUID Leaf 0x14 constants: */ 666 #define INTEL_PT_MAX_SUBLEAF 0x1 667 /* 668 * bit[00]: IA32_RTIT_CTL.CR3 filter can be set to 1 and IA32_RTIT_CR3_MATCH 669 * MSR can be accessed; 670 * bit[01]: Support Configurable PSB and Cycle-Accurate Mode; 671 * bit[02]: Support IP Filtering, TraceStop filtering, and preservation 672 * of Intel PT MSRs across warm reset; 673 * bit[03]: Support MTC timing packet and suppression of COFI-based packets; 674 */ 675 #define INTEL_PT_MINIMAL_EBX 0xf 676 /* 677 * bit[00]: Tracing can be enabled with IA32_RTIT_CTL.ToPA = 1 and 678 * IA32_RTIT_OUTPUT_BASE and IA32_RTIT_OUTPUT_MASK_PTRS MSRs can be 679 * accessed; 680 * bit[01]: ToPA tables can hold any number of output entries, up to the 681 * maximum allowed by the MaskOrTableOffset field of 682 * IA32_RTIT_OUTPUT_MASK_PTRS; 683 * bit[02]: Support Single-Range Output scheme; 684 */ 685 #define INTEL_PT_MINIMAL_ECX 0x7 686 /* generated packets which contain IP payloads have LIP values */ 687 #define INTEL_PT_IP_LIP (1 << 31) 688 #define INTEL_PT_ADDR_RANGES_NUM 0x2 /* Number of configurable address ranges */ 689 #define INTEL_PT_ADDR_RANGES_NUM_MASK 0x3 690 #define INTEL_PT_MTC_BITMAP (0x0249 << 16) /* Support ART(0,3,6,9) */ 691 #define INTEL_PT_CYCLE_BITMAP 0x1fff /* Support 0,2^(0~11) */ 692 #define INTEL_PT_PSB_BITMAP (0x003f << 16) /* Support 2K,4K,8K,16K,32K,64K */ 693 694 static void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1, 695 uint32_t vendor2, uint32_t vendor3) 696 { 697 int i; 698 for (i = 0; i < 4; i++) { 699 dst[i] = vendor1 >> (8 * i); 700 dst[i + 4] = vendor2 >> (8 * i); 701 dst[i + 8] = vendor3 >> (8 * i); 702 } 703 dst[CPUID_VENDOR_SZ] = '\0'; 704 } 705 706 #define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE) 707 #define PENTIUM_FEATURES (I486_FEATURES | CPUID_DE | CPUID_TSC | \ 708 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_MMX | CPUID_APIC) 709 #define PENTIUM2_FEATURES (PENTIUM_FEATURES | CPUID_PAE | CPUID_SEP | \ 710 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \ 711 CPUID_PSE36 | CPUID_FXSR) 712 #define PENTIUM3_FEATURES (PENTIUM2_FEATURES | CPUID_SSE) 713 #define PPRO_FEATURES (CPUID_FP87 | CPUID_DE | CPUID_PSE | CPUID_TSC | \ 714 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_PGE | CPUID_CMOV | \ 715 CPUID_PAT | CPUID_FXSR | CPUID_MMX | CPUID_SSE | CPUID_SSE2 | \ 716 CPUID_PAE | CPUID_SEP | CPUID_APIC) 717 718 #define TCG_FEATURES (CPUID_FP87 | CPUID_PSE | CPUID_TSC | CPUID_MSR | \ 719 CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | CPUID_SEP | \ 720 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \ 721 CPUID_PSE36 | CPUID_CLFLUSH | CPUID_ACPI | CPUID_MMX | \ 722 CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS | CPUID_DE) 723 /* partly implemented: 724 CPUID_MTRR, CPUID_MCA, CPUID_CLFLUSH (needed for Win64) */ 725 /* missing: 726 CPUID_VME, CPUID_DTS, CPUID_SS, CPUID_HT, CPUID_TM, CPUID_PBE */ 727 #define TCG_EXT_FEATURES (CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | \ 728 CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | \ 729 CPUID_EXT_SSE41 | CPUID_EXT_SSE42 | CPUID_EXT_POPCNT | \ 730 CPUID_EXT_XSAVE | /* CPUID_EXT_OSXSAVE is dynamic */ \ 731 CPUID_EXT_MOVBE | CPUID_EXT_AES | CPUID_EXT_HYPERVISOR) 732 /* missing: 733 CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_SMX, 734 CPUID_EXT_EST, CPUID_EXT_TM2, CPUID_EXT_CID, CPUID_EXT_FMA, 735 CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_PCID, CPUID_EXT_DCA, 736 CPUID_EXT_X2APIC, CPUID_EXT_TSC_DEADLINE_TIMER, CPUID_EXT_AVX, 737 CPUID_EXT_F16C, CPUID_EXT_RDRAND */ 738 739 #ifdef TARGET_X86_64 740 #define TCG_EXT2_X86_64_FEATURES (CPUID_EXT2_SYSCALL | CPUID_EXT2_LM) 741 #else 742 #define TCG_EXT2_X86_64_FEATURES 0 743 #endif 744 745 #define TCG_EXT2_FEATURES ((TCG_FEATURES & CPUID_EXT2_AMD_ALIASES) | \ 746 CPUID_EXT2_NX | CPUID_EXT2_MMXEXT | CPUID_EXT2_RDTSCP | \ 747 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_PDPE1GB | \ 748 TCG_EXT2_X86_64_FEATURES) 749 #define TCG_EXT3_FEATURES (CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | \ 750 CPUID_EXT3_CR8LEG | CPUID_EXT3_ABM | CPUID_EXT3_SSE4A) 751 #define TCG_EXT4_FEATURES 0 752 #define TCG_SVM_FEATURES CPUID_SVM_NPT 753 #define TCG_KVM_FEATURES 0 754 #define TCG_7_0_EBX_FEATURES (CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_SMAP | \ 755 CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX | \ 756 CPUID_7_0_EBX_PCOMMIT | CPUID_7_0_EBX_CLFLUSHOPT | \ 757 CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_FSGSBASE | \ 758 CPUID_7_0_EBX_ERMS) 759 /* missing: 760 CPUID_7_0_EBX_HLE, CPUID_7_0_EBX_AVX2, 761 CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM, 762 CPUID_7_0_EBX_RDSEED */ 763 #define TCG_7_0_ECX_FEATURES (CPUID_7_0_ECX_PKU | \ 764 /* CPUID_7_0_ECX_OSPKE is dynamic */ \ 765 CPUID_7_0_ECX_LA57) 766 #define TCG_7_0_EDX_FEATURES 0 767 #define TCG_APM_FEATURES 0 768 #define TCG_6_EAX_FEATURES CPUID_6_EAX_ARAT 769 #define TCG_XSAVE_FEATURES (CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XGETBV1) 770 /* missing: 771 CPUID_XSAVE_XSAVEC, CPUID_XSAVE_XSAVES */ 772 773 typedef enum FeatureWordType { 774 CPUID_FEATURE_WORD, 775 MSR_FEATURE_WORD, 776 } FeatureWordType; 777 778 typedef struct FeatureWordInfo { 779 FeatureWordType type; 780 /* feature flags names are taken from "Intel Processor Identification and 781 * the CPUID Instruction" and AMD's "CPUID Specification". 782 * In cases of disagreement between feature naming conventions, 783 * aliases may be added. 784 */ 785 const char *feat_names[32]; 786 union { 787 /* If type==CPUID_FEATURE_WORD */ 788 struct { 789 uint32_t eax; /* Input EAX for CPUID */ 790 bool needs_ecx; /* CPUID instruction uses ECX as input */ 791 uint32_t ecx; /* Input ECX value for CPUID */ 792 int reg; /* output register (R_* constant) */ 793 } cpuid; 794 /* If type==MSR_FEATURE_WORD */ 795 struct { 796 uint32_t index; 797 struct { /*CPUID that enumerate this MSR*/ 798 FeatureWord cpuid_class; 799 uint32_t cpuid_flag; 800 } cpuid_dep; 801 } msr; 802 }; 803 uint32_t tcg_features; /* Feature flags supported by TCG */ 804 uint32_t unmigratable_flags; /* Feature flags known to be unmigratable */ 805 uint32_t migratable_flags; /* Feature flags known to be migratable */ 806 /* Features that shouldn't be auto-enabled by "-cpu host" */ 807 uint32_t no_autoenable_flags; 808 } FeatureWordInfo; 809 810 static FeatureWordInfo feature_word_info[FEATURE_WORDS] = { 811 [FEAT_1_EDX] = { 812 .type = CPUID_FEATURE_WORD, 813 .feat_names = { 814 "fpu", "vme", "de", "pse", 815 "tsc", "msr", "pae", "mce", 816 "cx8", "apic", NULL, "sep", 817 "mtrr", "pge", "mca", "cmov", 818 "pat", "pse36", "pn" /* Intel psn */, "clflush" /* Intel clfsh */, 819 NULL, "ds" /* Intel dts */, "acpi", "mmx", 820 "fxsr", "sse", "sse2", "ss", 821 "ht" /* Intel htt */, "tm", "ia64", "pbe", 822 }, 823 .cpuid = {.eax = 1, .reg = R_EDX, }, 824 .tcg_features = TCG_FEATURES, 825 }, 826 [FEAT_1_ECX] = { 827 .type = CPUID_FEATURE_WORD, 828 .feat_names = { 829 "pni" /* Intel,AMD sse3 */, "pclmulqdq", "dtes64", "monitor", 830 "ds-cpl", "vmx", "smx", "est", 831 "tm2", "ssse3", "cid", NULL, 832 "fma", "cx16", "xtpr", "pdcm", 833 NULL, "pcid", "dca", "sse4.1", 834 "sse4.2", "x2apic", "movbe", "popcnt", 835 "tsc-deadline", "aes", "xsave", NULL /* osxsave */, 836 "avx", "f16c", "rdrand", "hypervisor", 837 }, 838 .cpuid = { .eax = 1, .reg = R_ECX, }, 839 .tcg_features = TCG_EXT_FEATURES, 840 }, 841 /* Feature names that are already defined on feature_name[] but 842 * are set on CPUID[8000_0001].EDX on AMD CPUs don't have their 843 * names on feat_names below. They are copied automatically 844 * to features[FEAT_8000_0001_EDX] if and only if CPU vendor is AMD. 845 */ 846 [FEAT_8000_0001_EDX] = { 847 .type = CPUID_FEATURE_WORD, 848 .feat_names = { 849 NULL /* fpu */, NULL /* vme */, NULL /* de */, NULL /* pse */, 850 NULL /* tsc */, NULL /* msr */, NULL /* pae */, NULL /* mce */, 851 NULL /* cx8 */, NULL /* apic */, NULL, "syscall", 852 NULL /* mtrr */, NULL /* pge */, NULL /* mca */, NULL /* cmov */, 853 NULL /* pat */, NULL /* pse36 */, NULL, NULL /* Linux mp */, 854 "nx", NULL, "mmxext", NULL /* mmx */, 855 NULL /* fxsr */, "fxsr-opt", "pdpe1gb", "rdtscp", 856 NULL, "lm", "3dnowext", "3dnow", 857 }, 858 .cpuid = { .eax = 0x80000001, .reg = R_EDX, }, 859 .tcg_features = TCG_EXT2_FEATURES, 860 }, 861 [FEAT_8000_0001_ECX] = { 862 .type = CPUID_FEATURE_WORD, 863 .feat_names = { 864 "lahf-lm", "cmp-legacy", "svm", "extapic", 865 "cr8legacy", "abm", "sse4a", "misalignsse", 866 "3dnowprefetch", "osvw", "ibs", "xop", 867 "skinit", "wdt", NULL, "lwp", 868 "fma4", "tce", NULL, "nodeid-msr", 869 NULL, "tbm", "topoext", "perfctr-core", 870 "perfctr-nb", NULL, NULL, NULL, 871 NULL, NULL, NULL, NULL, 872 }, 873 .cpuid = { .eax = 0x80000001, .reg = R_ECX, }, 874 .tcg_features = TCG_EXT3_FEATURES, 875 /* 876 * TOPOEXT is always allowed but can't be enabled blindly by 877 * "-cpu host", as it requires consistent cache topology info 878 * to be provided so it doesn't confuse guests. 879 */ 880 .no_autoenable_flags = CPUID_EXT3_TOPOEXT, 881 }, 882 [FEAT_C000_0001_EDX] = { 883 .type = CPUID_FEATURE_WORD, 884 .feat_names = { 885 NULL, NULL, "xstore", "xstore-en", 886 NULL, NULL, "xcrypt", "xcrypt-en", 887 "ace2", "ace2-en", "phe", "phe-en", 888 "pmm", "pmm-en", NULL, NULL, 889 NULL, NULL, NULL, NULL, 890 NULL, NULL, NULL, NULL, 891 NULL, NULL, NULL, NULL, 892 NULL, NULL, NULL, NULL, 893 }, 894 .cpuid = { .eax = 0xC0000001, .reg = R_EDX, }, 895 .tcg_features = TCG_EXT4_FEATURES, 896 }, 897 [FEAT_KVM] = { 898 .type = CPUID_FEATURE_WORD, 899 .feat_names = { 900 "kvmclock", "kvm-nopiodelay", "kvm-mmu", "kvmclock", 901 "kvm-asyncpf", "kvm-steal-time", "kvm-pv-eoi", "kvm-pv-unhalt", 902 NULL, "kvm-pv-tlb-flush", NULL, "kvm-pv-ipi", 903 NULL, NULL, NULL, NULL, 904 NULL, NULL, NULL, NULL, 905 NULL, NULL, NULL, NULL, 906 "kvmclock-stable-bit", NULL, NULL, NULL, 907 NULL, NULL, NULL, NULL, 908 }, 909 .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EAX, }, 910 .tcg_features = TCG_KVM_FEATURES, 911 }, 912 [FEAT_KVM_HINTS] = { 913 .type = CPUID_FEATURE_WORD, 914 .feat_names = { 915 "kvm-hint-dedicated", NULL, NULL, NULL, 916 NULL, NULL, NULL, NULL, 917 NULL, NULL, NULL, NULL, 918 NULL, NULL, NULL, NULL, 919 NULL, NULL, NULL, NULL, 920 NULL, NULL, NULL, NULL, 921 NULL, NULL, NULL, NULL, 922 NULL, NULL, NULL, NULL, 923 }, 924 .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EDX, }, 925 .tcg_features = TCG_KVM_FEATURES, 926 /* 927 * KVM hints aren't auto-enabled by -cpu host, they need to be 928 * explicitly enabled in the command-line. 929 */ 930 .no_autoenable_flags = ~0U, 931 }, 932 /* 933 * .feat_names are commented out for Hyper-V enlightenments because we 934 * don't want to have two different ways for enabling them on QEMU command 935 * line. Some features (e.g. "hyperv_time", "hyperv_vapic", ...) require 936 * enabling several feature bits simultaneously, exposing these bits 937 * individually may just confuse guests. 938 */ 939 [FEAT_HYPERV_EAX] = { 940 .type = CPUID_FEATURE_WORD, 941 .feat_names = { 942 NULL /* hv_msr_vp_runtime_access */, NULL /* hv_msr_time_refcount_access */, 943 NULL /* hv_msr_synic_access */, NULL /* hv_msr_stimer_access */, 944 NULL /* hv_msr_apic_access */, NULL /* hv_msr_hypercall_access */, 945 NULL /* hv_vpindex_access */, NULL /* hv_msr_reset_access */, 946 NULL /* hv_msr_stats_access */, NULL /* hv_reftsc_access */, 947 NULL /* hv_msr_idle_access */, NULL /* hv_msr_frequency_access */, 948 NULL /* hv_msr_debug_access */, NULL /* hv_msr_reenlightenment_access */, 949 NULL, NULL, 950 NULL, NULL, NULL, NULL, 951 NULL, NULL, NULL, NULL, 952 NULL, NULL, NULL, NULL, 953 NULL, NULL, NULL, NULL, 954 }, 955 .cpuid = { .eax = 0x40000003, .reg = R_EAX, }, 956 }, 957 [FEAT_HYPERV_EBX] = { 958 .type = CPUID_FEATURE_WORD, 959 .feat_names = { 960 NULL /* hv_create_partitions */, NULL /* hv_access_partition_id */, 961 NULL /* hv_access_memory_pool */, NULL /* hv_adjust_message_buffers */, 962 NULL /* hv_post_messages */, NULL /* hv_signal_events */, 963 NULL /* hv_create_port */, NULL /* hv_connect_port */, 964 NULL /* hv_access_stats */, NULL, NULL, NULL /* hv_debugging */, 965 NULL /* hv_cpu_power_management */, NULL /* hv_configure_profiler */, 966 NULL, NULL, 967 NULL, NULL, NULL, NULL, 968 NULL, NULL, NULL, NULL, 969 NULL, NULL, NULL, NULL, 970 NULL, NULL, NULL, NULL, 971 }, 972 .cpuid = { .eax = 0x40000003, .reg = R_EBX, }, 973 }, 974 [FEAT_HYPERV_EDX] = { 975 .type = CPUID_FEATURE_WORD, 976 .feat_names = { 977 NULL /* hv_mwait */, NULL /* hv_guest_debugging */, 978 NULL /* hv_perf_monitor */, NULL /* hv_cpu_dynamic_part */, 979 NULL /* hv_hypercall_params_xmm */, NULL /* hv_guest_idle_state */, 980 NULL, NULL, 981 NULL, NULL, NULL /* hv_guest_crash_msr */, NULL, 982 NULL, NULL, NULL, NULL, 983 NULL, NULL, NULL, NULL, 984 NULL, NULL, NULL, NULL, 985 NULL, NULL, NULL, NULL, 986 NULL, NULL, NULL, NULL, 987 }, 988 .cpuid = { .eax = 0x40000003, .reg = R_EDX, }, 989 }, 990 [FEAT_HV_RECOMM_EAX] = { 991 .type = CPUID_FEATURE_WORD, 992 .feat_names = { 993 NULL /* hv_recommend_pv_as_switch */, 994 NULL /* hv_recommend_pv_tlbflush_local */, 995 NULL /* hv_recommend_pv_tlbflush_remote */, 996 NULL /* hv_recommend_msr_apic_access */, 997 NULL /* hv_recommend_msr_reset */, 998 NULL /* hv_recommend_relaxed_timing */, 999 NULL /* hv_recommend_dma_remapping */, 1000 NULL /* hv_recommend_int_remapping */, 1001 NULL /* hv_recommend_x2apic_msrs */, 1002 NULL /* hv_recommend_autoeoi_deprecation */, 1003 NULL /* hv_recommend_pv_ipi */, 1004 NULL /* hv_recommend_ex_hypercalls */, 1005 NULL /* hv_hypervisor_is_nested */, 1006 NULL /* hv_recommend_int_mbec */, 1007 NULL /* hv_recommend_evmcs */, 1008 NULL, 1009 NULL, NULL, NULL, NULL, 1010 NULL, NULL, NULL, NULL, 1011 NULL, NULL, NULL, NULL, 1012 NULL, NULL, NULL, NULL, 1013 }, 1014 .cpuid = { .eax = 0x40000004, .reg = R_EAX, }, 1015 }, 1016 [FEAT_HV_NESTED_EAX] = { 1017 .type = CPUID_FEATURE_WORD, 1018 .cpuid = { .eax = 0x4000000A, .reg = R_EAX, }, 1019 }, 1020 [FEAT_SVM] = { 1021 .type = CPUID_FEATURE_WORD, 1022 .feat_names = { 1023 "npt", "lbrv", "svm-lock", "nrip-save", 1024 "tsc-scale", "vmcb-clean", "flushbyasid", "decodeassists", 1025 NULL, NULL, "pause-filter", NULL, 1026 "pfthreshold", NULL, NULL, NULL, 1027 NULL, NULL, NULL, NULL, 1028 NULL, NULL, NULL, NULL, 1029 NULL, NULL, NULL, NULL, 1030 NULL, NULL, NULL, NULL, 1031 }, 1032 .cpuid = { .eax = 0x8000000A, .reg = R_EDX, }, 1033 .tcg_features = TCG_SVM_FEATURES, 1034 }, 1035 [FEAT_7_0_EBX] = { 1036 .type = CPUID_FEATURE_WORD, 1037 .feat_names = { 1038 "fsgsbase", "tsc-adjust", NULL, "bmi1", 1039 "hle", "avx2", NULL, "smep", 1040 "bmi2", "erms", "invpcid", "rtm", 1041 NULL, NULL, "mpx", NULL, 1042 "avx512f", "avx512dq", "rdseed", "adx", 1043 "smap", "avx512ifma", "pcommit", "clflushopt", 1044 "clwb", "intel-pt", "avx512pf", "avx512er", 1045 "avx512cd", "sha-ni", "avx512bw", "avx512vl", 1046 }, 1047 .cpuid = { 1048 .eax = 7, 1049 .needs_ecx = true, .ecx = 0, 1050 .reg = R_EBX, 1051 }, 1052 .tcg_features = TCG_7_0_EBX_FEATURES, 1053 }, 1054 [FEAT_7_0_ECX] = { 1055 .type = CPUID_FEATURE_WORD, 1056 .feat_names = { 1057 NULL, "avx512vbmi", "umip", "pku", 1058 NULL /* ospke */, NULL, "avx512vbmi2", NULL, 1059 "gfni", "vaes", "vpclmulqdq", "avx512vnni", 1060 "avx512bitalg", NULL, "avx512-vpopcntdq", NULL, 1061 "la57", NULL, NULL, NULL, 1062 NULL, NULL, "rdpid", NULL, 1063 NULL, "cldemote", NULL, "movdiri", 1064 "movdir64b", NULL, NULL, NULL, 1065 }, 1066 .cpuid = { 1067 .eax = 7, 1068 .needs_ecx = true, .ecx = 0, 1069 .reg = R_ECX, 1070 }, 1071 .tcg_features = TCG_7_0_ECX_FEATURES, 1072 }, 1073 [FEAT_7_0_EDX] = { 1074 .type = CPUID_FEATURE_WORD, 1075 .feat_names = { 1076 NULL, NULL, "avx512-4vnniw", "avx512-4fmaps", 1077 NULL, NULL, NULL, NULL, 1078 NULL, NULL, NULL, NULL, 1079 NULL, NULL, NULL, NULL, 1080 NULL, NULL, "pconfig", NULL, 1081 NULL, NULL, NULL, NULL, 1082 NULL, NULL, "spec-ctrl", "stibp", 1083 NULL, "arch-capabilities", NULL, "ssbd", 1084 }, 1085 .cpuid = { 1086 .eax = 7, 1087 .needs_ecx = true, .ecx = 0, 1088 .reg = R_EDX, 1089 }, 1090 .tcg_features = TCG_7_0_EDX_FEATURES, 1091 .unmigratable_flags = CPUID_7_0_EDX_ARCH_CAPABILITIES, 1092 }, 1093 [FEAT_8000_0007_EDX] = { 1094 .type = CPUID_FEATURE_WORD, 1095 .feat_names = { 1096 NULL, NULL, NULL, NULL, 1097 NULL, NULL, NULL, NULL, 1098 "invtsc", NULL, NULL, NULL, 1099 NULL, NULL, NULL, NULL, 1100 NULL, NULL, NULL, NULL, 1101 NULL, NULL, NULL, NULL, 1102 NULL, NULL, NULL, NULL, 1103 NULL, NULL, NULL, NULL, 1104 }, 1105 .cpuid = { .eax = 0x80000007, .reg = R_EDX, }, 1106 .tcg_features = TCG_APM_FEATURES, 1107 .unmigratable_flags = CPUID_APM_INVTSC, 1108 }, 1109 [FEAT_8000_0008_EBX] = { 1110 .type = CPUID_FEATURE_WORD, 1111 .feat_names = { 1112 NULL, NULL, NULL, NULL, 1113 NULL, NULL, NULL, NULL, 1114 NULL, "wbnoinvd", NULL, NULL, 1115 "ibpb", NULL, NULL, NULL, 1116 NULL, NULL, NULL, NULL, 1117 NULL, NULL, NULL, NULL, 1118 "amd-ssbd", "virt-ssbd", "amd-no-ssb", NULL, 1119 NULL, NULL, NULL, NULL, 1120 }, 1121 .cpuid = { .eax = 0x80000008, .reg = R_EBX, }, 1122 .tcg_features = 0, 1123 .unmigratable_flags = 0, 1124 }, 1125 [FEAT_XSAVE] = { 1126 .type = CPUID_FEATURE_WORD, 1127 .feat_names = { 1128 "xsaveopt", "xsavec", "xgetbv1", "xsaves", 1129 NULL, NULL, NULL, NULL, 1130 NULL, NULL, NULL, NULL, 1131 NULL, NULL, NULL, NULL, 1132 NULL, NULL, NULL, NULL, 1133 NULL, NULL, NULL, NULL, 1134 NULL, NULL, NULL, NULL, 1135 NULL, NULL, NULL, NULL, 1136 }, 1137 .cpuid = { 1138 .eax = 0xd, 1139 .needs_ecx = true, .ecx = 1, 1140 .reg = R_EAX, 1141 }, 1142 .tcg_features = TCG_XSAVE_FEATURES, 1143 }, 1144 [FEAT_6_EAX] = { 1145 .type = CPUID_FEATURE_WORD, 1146 .feat_names = { 1147 NULL, NULL, "arat", NULL, 1148 NULL, NULL, NULL, NULL, 1149 NULL, NULL, NULL, NULL, 1150 NULL, NULL, NULL, NULL, 1151 NULL, NULL, NULL, NULL, 1152 NULL, NULL, NULL, NULL, 1153 NULL, NULL, NULL, NULL, 1154 NULL, NULL, NULL, NULL, 1155 }, 1156 .cpuid = { .eax = 6, .reg = R_EAX, }, 1157 .tcg_features = TCG_6_EAX_FEATURES, 1158 }, 1159 [FEAT_XSAVE_COMP_LO] = { 1160 .type = CPUID_FEATURE_WORD, 1161 .cpuid = { 1162 .eax = 0xD, 1163 .needs_ecx = true, .ecx = 0, 1164 .reg = R_EAX, 1165 }, 1166 .tcg_features = ~0U, 1167 .migratable_flags = XSTATE_FP_MASK | XSTATE_SSE_MASK | 1168 XSTATE_YMM_MASK | XSTATE_BNDREGS_MASK | XSTATE_BNDCSR_MASK | 1169 XSTATE_OPMASK_MASK | XSTATE_ZMM_Hi256_MASK | XSTATE_Hi16_ZMM_MASK | 1170 XSTATE_PKRU_MASK, 1171 }, 1172 [FEAT_XSAVE_COMP_HI] = { 1173 .type = CPUID_FEATURE_WORD, 1174 .cpuid = { 1175 .eax = 0xD, 1176 .needs_ecx = true, .ecx = 0, 1177 .reg = R_EDX, 1178 }, 1179 .tcg_features = ~0U, 1180 }, 1181 /*Below are MSR exposed features*/ 1182 [FEAT_ARCH_CAPABILITIES] = { 1183 .type = MSR_FEATURE_WORD, 1184 .feat_names = { 1185 "rdctl-no", "ibrs-all", "rsba", "skip-l1dfl-vmentry", 1186 "ssb-no", NULL, NULL, NULL, 1187 NULL, NULL, NULL, NULL, 1188 NULL, NULL, NULL, NULL, 1189 NULL, NULL, NULL, NULL, 1190 NULL, NULL, NULL, NULL, 1191 NULL, NULL, NULL, NULL, 1192 NULL, NULL, NULL, NULL, 1193 }, 1194 .msr = { 1195 .index = MSR_IA32_ARCH_CAPABILITIES, 1196 .cpuid_dep = { 1197 FEAT_7_0_EDX, 1198 CPUID_7_0_EDX_ARCH_CAPABILITIES 1199 } 1200 }, 1201 }, 1202 }; 1203 1204 typedef struct X86RegisterInfo32 { 1205 /* Name of register */ 1206 const char *name; 1207 /* QAPI enum value register */ 1208 X86CPURegister32 qapi_enum; 1209 } X86RegisterInfo32; 1210 1211 #define REGISTER(reg) \ 1212 [R_##reg] = { .name = #reg, .qapi_enum = X86_CPU_REGISTER32_##reg } 1213 static const X86RegisterInfo32 x86_reg_info_32[CPU_NB_REGS32] = { 1214 REGISTER(EAX), 1215 REGISTER(ECX), 1216 REGISTER(EDX), 1217 REGISTER(EBX), 1218 REGISTER(ESP), 1219 REGISTER(EBP), 1220 REGISTER(ESI), 1221 REGISTER(EDI), 1222 }; 1223 #undef REGISTER 1224 1225 typedef struct ExtSaveArea { 1226 uint32_t feature, bits; 1227 uint32_t offset, size; 1228 } ExtSaveArea; 1229 1230 static const ExtSaveArea x86_ext_save_areas[] = { 1231 [XSTATE_FP_BIT] = { 1232 /* x87 FP state component is always enabled if XSAVE is supported */ 1233 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE, 1234 /* x87 state is in the legacy region of the XSAVE area */ 1235 .offset = 0, 1236 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader), 1237 }, 1238 [XSTATE_SSE_BIT] = { 1239 /* SSE state component is always enabled if XSAVE is supported */ 1240 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE, 1241 /* SSE state is in the legacy region of the XSAVE area */ 1242 .offset = 0, 1243 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader), 1244 }, 1245 [XSTATE_YMM_BIT] = 1246 { .feature = FEAT_1_ECX, .bits = CPUID_EXT_AVX, 1247 .offset = offsetof(X86XSaveArea, avx_state), 1248 .size = sizeof(XSaveAVX) }, 1249 [XSTATE_BNDREGS_BIT] = 1250 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX, 1251 .offset = offsetof(X86XSaveArea, bndreg_state), 1252 .size = sizeof(XSaveBNDREG) }, 1253 [XSTATE_BNDCSR_BIT] = 1254 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX, 1255 .offset = offsetof(X86XSaveArea, bndcsr_state), 1256 .size = sizeof(XSaveBNDCSR) }, 1257 [XSTATE_OPMASK_BIT] = 1258 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F, 1259 .offset = offsetof(X86XSaveArea, opmask_state), 1260 .size = sizeof(XSaveOpmask) }, 1261 [XSTATE_ZMM_Hi256_BIT] = 1262 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F, 1263 .offset = offsetof(X86XSaveArea, zmm_hi256_state), 1264 .size = sizeof(XSaveZMM_Hi256) }, 1265 [XSTATE_Hi16_ZMM_BIT] = 1266 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F, 1267 .offset = offsetof(X86XSaveArea, hi16_zmm_state), 1268 .size = sizeof(XSaveHi16_ZMM) }, 1269 [XSTATE_PKRU_BIT] = 1270 { .feature = FEAT_7_0_ECX, .bits = CPUID_7_0_ECX_PKU, 1271 .offset = offsetof(X86XSaveArea, pkru_state), 1272 .size = sizeof(XSavePKRU) }, 1273 }; 1274 1275 static uint32_t xsave_area_size(uint64_t mask) 1276 { 1277 int i; 1278 uint64_t ret = 0; 1279 1280 for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) { 1281 const ExtSaveArea *esa = &x86_ext_save_areas[i]; 1282 if ((mask >> i) & 1) { 1283 ret = MAX(ret, esa->offset + esa->size); 1284 } 1285 } 1286 return ret; 1287 } 1288 1289 static inline bool accel_uses_host_cpuid(void) 1290 { 1291 return kvm_enabled() || hvf_enabled(); 1292 } 1293 1294 static inline uint64_t x86_cpu_xsave_components(X86CPU *cpu) 1295 { 1296 return ((uint64_t)cpu->env.features[FEAT_XSAVE_COMP_HI]) << 32 | 1297 cpu->env.features[FEAT_XSAVE_COMP_LO]; 1298 } 1299 1300 const char *get_register_name_32(unsigned int reg) 1301 { 1302 if (reg >= CPU_NB_REGS32) { 1303 return NULL; 1304 } 1305 return x86_reg_info_32[reg].name; 1306 } 1307 1308 /* 1309 * Returns the set of feature flags that are supported and migratable by 1310 * QEMU, for a given FeatureWord. 1311 */ 1312 static uint32_t x86_cpu_get_migratable_flags(FeatureWord w) 1313 { 1314 FeatureWordInfo *wi = &feature_word_info[w]; 1315 uint32_t r = 0; 1316 int i; 1317 1318 for (i = 0; i < 32; i++) { 1319 uint32_t f = 1U << i; 1320 1321 /* If the feature name is known, it is implicitly considered migratable, 1322 * unless it is explicitly set in unmigratable_flags */ 1323 if ((wi->migratable_flags & f) || 1324 (wi->feat_names[i] && !(wi->unmigratable_flags & f))) { 1325 r |= f; 1326 } 1327 } 1328 return r; 1329 } 1330 1331 void host_cpuid(uint32_t function, uint32_t count, 1332 uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) 1333 { 1334 uint32_t vec[4]; 1335 1336 #ifdef __x86_64__ 1337 asm volatile("cpuid" 1338 : "=a"(vec[0]), "=b"(vec[1]), 1339 "=c"(vec[2]), "=d"(vec[3]) 1340 : "0"(function), "c"(count) : "cc"); 1341 #elif defined(__i386__) 1342 asm volatile("pusha \n\t" 1343 "cpuid \n\t" 1344 "mov %%eax, 0(%2) \n\t" 1345 "mov %%ebx, 4(%2) \n\t" 1346 "mov %%ecx, 8(%2) \n\t" 1347 "mov %%edx, 12(%2) \n\t" 1348 "popa" 1349 : : "a"(function), "c"(count), "S"(vec) 1350 : "memory", "cc"); 1351 #else 1352 abort(); 1353 #endif 1354 1355 if (eax) 1356 *eax = vec[0]; 1357 if (ebx) 1358 *ebx = vec[1]; 1359 if (ecx) 1360 *ecx = vec[2]; 1361 if (edx) 1362 *edx = vec[3]; 1363 } 1364 1365 void host_vendor_fms(char *vendor, int *family, int *model, int *stepping) 1366 { 1367 uint32_t eax, ebx, ecx, edx; 1368 1369 host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx); 1370 x86_cpu_vendor_words2str(vendor, ebx, edx, ecx); 1371 1372 host_cpuid(0x1, 0, &eax, &ebx, &ecx, &edx); 1373 if (family) { 1374 *family = ((eax >> 8) & 0x0F) + ((eax >> 20) & 0xFF); 1375 } 1376 if (model) { 1377 *model = ((eax >> 4) & 0x0F) | ((eax & 0xF0000) >> 12); 1378 } 1379 if (stepping) { 1380 *stepping = eax & 0x0F; 1381 } 1382 } 1383 1384 /* CPU class name definitions: */ 1385 1386 /* Return type name for a given CPU model name 1387 * Caller is responsible for freeing the returned string. 1388 */ 1389 static char *x86_cpu_type_name(const char *model_name) 1390 { 1391 return g_strdup_printf(X86_CPU_TYPE_NAME("%s"), model_name); 1392 } 1393 1394 static ObjectClass *x86_cpu_class_by_name(const char *cpu_model) 1395 { 1396 ObjectClass *oc; 1397 char *typename = x86_cpu_type_name(cpu_model); 1398 oc = object_class_by_name(typename); 1399 g_free(typename); 1400 return oc; 1401 } 1402 1403 static char *x86_cpu_class_get_model_name(X86CPUClass *cc) 1404 { 1405 const char *class_name = object_class_get_name(OBJECT_CLASS(cc)); 1406 assert(g_str_has_suffix(class_name, X86_CPU_TYPE_SUFFIX)); 1407 return g_strndup(class_name, 1408 strlen(class_name) - strlen(X86_CPU_TYPE_SUFFIX)); 1409 } 1410 1411 struct X86CPUDefinition { 1412 const char *name; 1413 uint32_t level; 1414 uint32_t xlevel; 1415 /* vendor is zero-terminated, 12 character ASCII string */ 1416 char vendor[CPUID_VENDOR_SZ + 1]; 1417 int family; 1418 int model; 1419 int stepping; 1420 FeatureWordArray features; 1421 const char *model_id; 1422 CPUCaches *cache_info; 1423 }; 1424 1425 static CPUCaches epyc_cache_info = { 1426 .l1d_cache = &(CPUCacheInfo) { 1427 .type = DATA_CACHE, 1428 .level = 1, 1429 .size = 32 * KiB, 1430 .line_size = 64, 1431 .associativity = 8, 1432 .partitions = 1, 1433 .sets = 64, 1434 .lines_per_tag = 1, 1435 .self_init = 1, 1436 .no_invd_sharing = true, 1437 }, 1438 .l1i_cache = &(CPUCacheInfo) { 1439 .type = INSTRUCTION_CACHE, 1440 .level = 1, 1441 .size = 64 * KiB, 1442 .line_size = 64, 1443 .associativity = 4, 1444 .partitions = 1, 1445 .sets = 256, 1446 .lines_per_tag = 1, 1447 .self_init = 1, 1448 .no_invd_sharing = true, 1449 }, 1450 .l2_cache = &(CPUCacheInfo) { 1451 .type = UNIFIED_CACHE, 1452 .level = 2, 1453 .size = 512 * KiB, 1454 .line_size = 64, 1455 .associativity = 8, 1456 .partitions = 1, 1457 .sets = 1024, 1458 .lines_per_tag = 1, 1459 }, 1460 .l3_cache = &(CPUCacheInfo) { 1461 .type = UNIFIED_CACHE, 1462 .level = 3, 1463 .size = 8 * MiB, 1464 .line_size = 64, 1465 .associativity = 16, 1466 .partitions = 1, 1467 .sets = 8192, 1468 .lines_per_tag = 1, 1469 .self_init = true, 1470 .inclusive = true, 1471 .complex_indexing = true, 1472 }, 1473 }; 1474 1475 static X86CPUDefinition builtin_x86_defs[] = { 1476 { 1477 .name = "qemu64", 1478 .level = 0xd, 1479 .vendor = CPUID_VENDOR_AMD, 1480 .family = 6, 1481 .model = 6, 1482 .stepping = 3, 1483 .features[FEAT_1_EDX] = 1484 PPRO_FEATURES | 1485 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | 1486 CPUID_PSE36, 1487 .features[FEAT_1_ECX] = 1488 CPUID_EXT_SSE3 | CPUID_EXT_CX16, 1489 .features[FEAT_8000_0001_EDX] = 1490 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, 1491 .features[FEAT_8000_0001_ECX] = 1492 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM, 1493 .xlevel = 0x8000000A, 1494 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION, 1495 }, 1496 { 1497 .name = "phenom", 1498 .level = 5, 1499 .vendor = CPUID_VENDOR_AMD, 1500 .family = 16, 1501 .model = 2, 1502 .stepping = 3, 1503 /* Missing: CPUID_HT */ 1504 .features[FEAT_1_EDX] = 1505 PPRO_FEATURES | 1506 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | 1507 CPUID_PSE36 | CPUID_VME, 1508 .features[FEAT_1_ECX] = 1509 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_CX16 | 1510 CPUID_EXT_POPCNT, 1511 .features[FEAT_8000_0001_EDX] = 1512 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | 1513 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_MMXEXT | 1514 CPUID_EXT2_FFXSR | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP, 1515 /* Missing: CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC, 1516 CPUID_EXT3_CR8LEG, 1517 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH, 1518 CPUID_EXT3_OSVW, CPUID_EXT3_IBS */ 1519 .features[FEAT_8000_0001_ECX] = 1520 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | 1521 CPUID_EXT3_ABM | CPUID_EXT3_SSE4A, 1522 /* Missing: CPUID_SVM_LBRV */ 1523 .features[FEAT_SVM] = 1524 CPUID_SVM_NPT, 1525 .xlevel = 0x8000001A, 1526 .model_id = "AMD Phenom(tm) 9550 Quad-Core Processor" 1527 }, 1528 { 1529 .name = "core2duo", 1530 .level = 10, 1531 .vendor = CPUID_VENDOR_INTEL, 1532 .family = 6, 1533 .model = 15, 1534 .stepping = 11, 1535 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */ 1536 .features[FEAT_1_EDX] = 1537 PPRO_FEATURES | 1538 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | 1539 CPUID_PSE36 | CPUID_VME | CPUID_ACPI | CPUID_SS, 1540 /* Missing: CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_EST, 1541 * CPUID_EXT_TM2, CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_VMX */ 1542 .features[FEAT_1_ECX] = 1543 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | 1544 CPUID_EXT_CX16, 1545 .features[FEAT_8000_0001_EDX] = 1546 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, 1547 .features[FEAT_8000_0001_ECX] = 1548 CPUID_EXT3_LAHF_LM, 1549 .xlevel = 0x80000008, 1550 .model_id = "Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz", 1551 }, 1552 { 1553 .name = "kvm64", 1554 .level = 0xd, 1555 .vendor = CPUID_VENDOR_INTEL, 1556 .family = 15, 1557 .model = 6, 1558 .stepping = 1, 1559 /* Missing: CPUID_HT */ 1560 .features[FEAT_1_EDX] = 1561 PPRO_FEATURES | CPUID_VME | 1562 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | 1563 CPUID_PSE36, 1564 /* Missing: CPUID_EXT_POPCNT, CPUID_EXT_MONITOR */ 1565 .features[FEAT_1_ECX] = 1566 CPUID_EXT_SSE3 | CPUID_EXT_CX16, 1567 /* Missing: CPUID_EXT2_PDPE1GB, CPUID_EXT2_RDTSCP */ 1568 .features[FEAT_8000_0001_EDX] = 1569 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, 1570 /* Missing: CPUID_EXT3_LAHF_LM, CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC, 1571 CPUID_EXT3_CR8LEG, CPUID_EXT3_ABM, CPUID_EXT3_SSE4A, 1572 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH, 1573 CPUID_EXT3_OSVW, CPUID_EXT3_IBS, CPUID_EXT3_SVM */ 1574 .features[FEAT_8000_0001_ECX] = 1575 0, 1576 .xlevel = 0x80000008, 1577 .model_id = "Common KVM processor" 1578 }, 1579 { 1580 .name = "qemu32", 1581 .level = 4, 1582 .vendor = CPUID_VENDOR_INTEL, 1583 .family = 6, 1584 .model = 6, 1585 .stepping = 3, 1586 .features[FEAT_1_EDX] = 1587 PPRO_FEATURES, 1588 .features[FEAT_1_ECX] = 1589 CPUID_EXT_SSE3, 1590 .xlevel = 0x80000004, 1591 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION, 1592 }, 1593 { 1594 .name = "kvm32", 1595 .level = 5, 1596 .vendor = CPUID_VENDOR_INTEL, 1597 .family = 15, 1598 .model = 6, 1599 .stepping = 1, 1600 .features[FEAT_1_EDX] = 1601 PPRO_FEATURES | CPUID_VME | 1602 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_PSE36, 1603 .features[FEAT_1_ECX] = 1604 CPUID_EXT_SSE3, 1605 .features[FEAT_8000_0001_ECX] = 1606 0, 1607 .xlevel = 0x80000008, 1608 .model_id = "Common 32-bit KVM processor" 1609 }, 1610 { 1611 .name = "coreduo", 1612 .level = 10, 1613 .vendor = CPUID_VENDOR_INTEL, 1614 .family = 6, 1615 .model = 14, 1616 .stepping = 8, 1617 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */ 1618 .features[FEAT_1_EDX] = 1619 PPRO_FEATURES | CPUID_VME | 1620 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_ACPI | 1621 CPUID_SS, 1622 /* Missing: CPUID_EXT_EST, CPUID_EXT_TM2 , CPUID_EXT_XTPR, 1623 * CPUID_EXT_PDCM, CPUID_EXT_VMX */ 1624 .features[FEAT_1_ECX] = 1625 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR, 1626 .features[FEAT_8000_0001_EDX] = 1627 CPUID_EXT2_NX, 1628 .xlevel = 0x80000008, 1629 .model_id = "Genuine Intel(R) CPU T2600 @ 2.16GHz", 1630 }, 1631 { 1632 .name = "486", 1633 .level = 1, 1634 .vendor = CPUID_VENDOR_INTEL, 1635 .family = 4, 1636 .model = 8, 1637 .stepping = 0, 1638 .features[FEAT_1_EDX] = 1639 I486_FEATURES, 1640 .xlevel = 0, 1641 .model_id = "", 1642 }, 1643 { 1644 .name = "pentium", 1645 .level = 1, 1646 .vendor = CPUID_VENDOR_INTEL, 1647 .family = 5, 1648 .model = 4, 1649 .stepping = 3, 1650 .features[FEAT_1_EDX] = 1651 PENTIUM_FEATURES, 1652 .xlevel = 0, 1653 .model_id = "", 1654 }, 1655 { 1656 .name = "pentium2", 1657 .level = 2, 1658 .vendor = CPUID_VENDOR_INTEL, 1659 .family = 6, 1660 .model = 5, 1661 .stepping = 2, 1662 .features[FEAT_1_EDX] = 1663 PENTIUM2_FEATURES, 1664 .xlevel = 0, 1665 .model_id = "", 1666 }, 1667 { 1668 .name = "pentium3", 1669 .level = 3, 1670 .vendor = CPUID_VENDOR_INTEL, 1671 .family = 6, 1672 .model = 7, 1673 .stepping = 3, 1674 .features[FEAT_1_EDX] = 1675 PENTIUM3_FEATURES, 1676 .xlevel = 0, 1677 .model_id = "", 1678 }, 1679 { 1680 .name = "athlon", 1681 .level = 2, 1682 .vendor = CPUID_VENDOR_AMD, 1683 .family = 6, 1684 .model = 2, 1685 .stepping = 3, 1686 .features[FEAT_1_EDX] = 1687 PPRO_FEATURES | CPUID_PSE36 | CPUID_VME | CPUID_MTRR | 1688 CPUID_MCA, 1689 .features[FEAT_8000_0001_EDX] = 1690 CPUID_EXT2_MMXEXT | CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT, 1691 .xlevel = 0x80000008, 1692 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION, 1693 }, 1694 { 1695 .name = "n270", 1696 .level = 10, 1697 .vendor = CPUID_VENDOR_INTEL, 1698 .family = 6, 1699 .model = 28, 1700 .stepping = 2, 1701 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */ 1702 .features[FEAT_1_EDX] = 1703 PPRO_FEATURES | 1704 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_VME | 1705 CPUID_ACPI | CPUID_SS, 1706 /* Some CPUs got no CPUID_SEP */ 1707 /* Missing: CPUID_EXT_DSCPL, CPUID_EXT_EST, CPUID_EXT_TM2, 1708 * CPUID_EXT_XTPR */ 1709 .features[FEAT_1_ECX] = 1710 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | 1711 CPUID_EXT_MOVBE, 1712 .features[FEAT_8000_0001_EDX] = 1713 CPUID_EXT2_NX, 1714 .features[FEAT_8000_0001_ECX] = 1715 CPUID_EXT3_LAHF_LM, 1716 .xlevel = 0x80000008, 1717 .model_id = "Intel(R) Atom(TM) CPU N270 @ 1.60GHz", 1718 }, 1719 { 1720 .name = "Conroe", 1721 .level = 10, 1722 .vendor = CPUID_VENDOR_INTEL, 1723 .family = 6, 1724 .model = 15, 1725 .stepping = 3, 1726 .features[FEAT_1_EDX] = 1727 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 1728 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 1729 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 1730 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 1731 CPUID_DE | CPUID_FP87, 1732 .features[FEAT_1_ECX] = 1733 CPUID_EXT_SSSE3 | CPUID_EXT_SSE3, 1734 .features[FEAT_8000_0001_EDX] = 1735 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 1736 .features[FEAT_8000_0001_ECX] = 1737 CPUID_EXT3_LAHF_LM, 1738 .xlevel = 0x80000008, 1739 .model_id = "Intel Celeron_4x0 (Conroe/Merom Class Core 2)", 1740 }, 1741 { 1742 .name = "Penryn", 1743 .level = 10, 1744 .vendor = CPUID_VENDOR_INTEL, 1745 .family = 6, 1746 .model = 23, 1747 .stepping = 3, 1748 .features[FEAT_1_EDX] = 1749 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 1750 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 1751 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 1752 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 1753 CPUID_DE | CPUID_FP87, 1754 .features[FEAT_1_ECX] = 1755 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 1756 CPUID_EXT_SSE3, 1757 .features[FEAT_8000_0001_EDX] = 1758 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 1759 .features[FEAT_8000_0001_ECX] = 1760 CPUID_EXT3_LAHF_LM, 1761 .xlevel = 0x80000008, 1762 .model_id = "Intel Core 2 Duo P9xxx (Penryn Class Core 2)", 1763 }, 1764 { 1765 .name = "Nehalem", 1766 .level = 11, 1767 .vendor = CPUID_VENDOR_INTEL, 1768 .family = 6, 1769 .model = 26, 1770 .stepping = 3, 1771 .features[FEAT_1_EDX] = 1772 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 1773 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 1774 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 1775 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 1776 CPUID_DE | CPUID_FP87, 1777 .features[FEAT_1_ECX] = 1778 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 1779 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3, 1780 .features[FEAT_8000_0001_EDX] = 1781 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, 1782 .features[FEAT_8000_0001_ECX] = 1783 CPUID_EXT3_LAHF_LM, 1784 .xlevel = 0x80000008, 1785 .model_id = "Intel Core i7 9xx (Nehalem Class Core i7)", 1786 }, 1787 { 1788 .name = "Nehalem-IBRS", 1789 .level = 11, 1790 .vendor = CPUID_VENDOR_INTEL, 1791 .family = 6, 1792 .model = 26, 1793 .stepping = 3, 1794 .features[FEAT_1_EDX] = 1795 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 1796 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 1797 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 1798 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 1799 CPUID_DE | CPUID_FP87, 1800 .features[FEAT_1_ECX] = 1801 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 1802 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3, 1803 .features[FEAT_7_0_EDX] = 1804 CPUID_7_0_EDX_SPEC_CTRL, 1805 .features[FEAT_8000_0001_EDX] = 1806 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, 1807 .features[FEAT_8000_0001_ECX] = 1808 CPUID_EXT3_LAHF_LM, 1809 .xlevel = 0x80000008, 1810 .model_id = "Intel Core i7 9xx (Nehalem Core i7, IBRS update)", 1811 }, 1812 { 1813 .name = "Westmere", 1814 .level = 11, 1815 .vendor = CPUID_VENDOR_INTEL, 1816 .family = 6, 1817 .model = 44, 1818 .stepping = 1, 1819 .features[FEAT_1_EDX] = 1820 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 1821 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 1822 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 1823 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 1824 CPUID_DE | CPUID_FP87, 1825 .features[FEAT_1_ECX] = 1826 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | 1827 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 1828 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3, 1829 .features[FEAT_8000_0001_EDX] = 1830 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, 1831 .features[FEAT_8000_0001_ECX] = 1832 CPUID_EXT3_LAHF_LM, 1833 .features[FEAT_6_EAX] = 1834 CPUID_6_EAX_ARAT, 1835 .xlevel = 0x80000008, 1836 .model_id = "Westmere E56xx/L56xx/X56xx (Nehalem-C)", 1837 }, 1838 { 1839 .name = "Westmere-IBRS", 1840 .level = 11, 1841 .vendor = CPUID_VENDOR_INTEL, 1842 .family = 6, 1843 .model = 44, 1844 .stepping = 1, 1845 .features[FEAT_1_EDX] = 1846 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 1847 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 1848 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 1849 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 1850 CPUID_DE | CPUID_FP87, 1851 .features[FEAT_1_ECX] = 1852 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | 1853 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 1854 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3, 1855 .features[FEAT_8000_0001_EDX] = 1856 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, 1857 .features[FEAT_8000_0001_ECX] = 1858 CPUID_EXT3_LAHF_LM, 1859 .features[FEAT_7_0_EDX] = 1860 CPUID_7_0_EDX_SPEC_CTRL, 1861 .features[FEAT_6_EAX] = 1862 CPUID_6_EAX_ARAT, 1863 .xlevel = 0x80000008, 1864 .model_id = "Westmere E56xx/L56xx/X56xx (IBRS update)", 1865 }, 1866 { 1867 .name = "SandyBridge", 1868 .level = 0xd, 1869 .vendor = CPUID_VENDOR_INTEL, 1870 .family = 6, 1871 .model = 42, 1872 .stepping = 1, 1873 .features[FEAT_1_EDX] = 1874 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 1875 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 1876 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 1877 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 1878 CPUID_DE | CPUID_FP87, 1879 .features[FEAT_1_ECX] = 1880 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 1881 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT | 1882 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 1883 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | 1884 CPUID_EXT_SSE3, 1885 .features[FEAT_8000_0001_EDX] = 1886 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 1887 CPUID_EXT2_SYSCALL, 1888 .features[FEAT_8000_0001_ECX] = 1889 CPUID_EXT3_LAHF_LM, 1890 .features[FEAT_XSAVE] = 1891 CPUID_XSAVE_XSAVEOPT, 1892 .features[FEAT_6_EAX] = 1893 CPUID_6_EAX_ARAT, 1894 .xlevel = 0x80000008, 1895 .model_id = "Intel Xeon E312xx (Sandy Bridge)", 1896 }, 1897 { 1898 .name = "SandyBridge-IBRS", 1899 .level = 0xd, 1900 .vendor = CPUID_VENDOR_INTEL, 1901 .family = 6, 1902 .model = 42, 1903 .stepping = 1, 1904 .features[FEAT_1_EDX] = 1905 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 1906 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 1907 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 1908 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 1909 CPUID_DE | CPUID_FP87, 1910 .features[FEAT_1_ECX] = 1911 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 1912 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT | 1913 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 1914 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | 1915 CPUID_EXT_SSE3, 1916 .features[FEAT_8000_0001_EDX] = 1917 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 1918 CPUID_EXT2_SYSCALL, 1919 .features[FEAT_8000_0001_ECX] = 1920 CPUID_EXT3_LAHF_LM, 1921 .features[FEAT_7_0_EDX] = 1922 CPUID_7_0_EDX_SPEC_CTRL, 1923 .features[FEAT_XSAVE] = 1924 CPUID_XSAVE_XSAVEOPT, 1925 .features[FEAT_6_EAX] = 1926 CPUID_6_EAX_ARAT, 1927 .xlevel = 0x80000008, 1928 .model_id = "Intel Xeon E312xx (Sandy Bridge, IBRS update)", 1929 }, 1930 { 1931 .name = "IvyBridge", 1932 .level = 0xd, 1933 .vendor = CPUID_VENDOR_INTEL, 1934 .family = 6, 1935 .model = 58, 1936 .stepping = 9, 1937 .features[FEAT_1_EDX] = 1938 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 1939 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 1940 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 1941 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 1942 CPUID_DE | CPUID_FP87, 1943 .features[FEAT_1_ECX] = 1944 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 1945 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT | 1946 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 1947 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | 1948 CPUID_EXT_SSE3 | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 1949 .features[FEAT_7_0_EBX] = 1950 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP | 1951 CPUID_7_0_EBX_ERMS, 1952 .features[FEAT_8000_0001_EDX] = 1953 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 1954 CPUID_EXT2_SYSCALL, 1955 .features[FEAT_8000_0001_ECX] = 1956 CPUID_EXT3_LAHF_LM, 1957 .features[FEAT_XSAVE] = 1958 CPUID_XSAVE_XSAVEOPT, 1959 .features[FEAT_6_EAX] = 1960 CPUID_6_EAX_ARAT, 1961 .xlevel = 0x80000008, 1962 .model_id = "Intel Xeon E3-12xx v2 (Ivy Bridge)", 1963 }, 1964 { 1965 .name = "IvyBridge-IBRS", 1966 .level = 0xd, 1967 .vendor = CPUID_VENDOR_INTEL, 1968 .family = 6, 1969 .model = 58, 1970 .stepping = 9, 1971 .features[FEAT_1_EDX] = 1972 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 1973 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 1974 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 1975 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 1976 CPUID_DE | CPUID_FP87, 1977 .features[FEAT_1_ECX] = 1978 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 1979 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT | 1980 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 1981 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | 1982 CPUID_EXT_SSE3 | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 1983 .features[FEAT_7_0_EBX] = 1984 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP | 1985 CPUID_7_0_EBX_ERMS, 1986 .features[FEAT_8000_0001_EDX] = 1987 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 1988 CPUID_EXT2_SYSCALL, 1989 .features[FEAT_8000_0001_ECX] = 1990 CPUID_EXT3_LAHF_LM, 1991 .features[FEAT_7_0_EDX] = 1992 CPUID_7_0_EDX_SPEC_CTRL, 1993 .features[FEAT_XSAVE] = 1994 CPUID_XSAVE_XSAVEOPT, 1995 .features[FEAT_6_EAX] = 1996 CPUID_6_EAX_ARAT, 1997 .xlevel = 0x80000008, 1998 .model_id = "Intel Xeon E3-12xx v2 (Ivy Bridge, IBRS)", 1999 }, 2000 { 2001 .name = "Haswell-noTSX", 2002 .level = 0xd, 2003 .vendor = CPUID_VENDOR_INTEL, 2004 .family = 6, 2005 .model = 60, 2006 .stepping = 1, 2007 .features[FEAT_1_EDX] = 2008 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2009 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2010 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2011 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2012 CPUID_DE | CPUID_FP87, 2013 .features[FEAT_1_ECX] = 2014 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 2015 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 2016 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2017 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 2018 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 2019 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 2020 .features[FEAT_8000_0001_EDX] = 2021 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 2022 CPUID_EXT2_SYSCALL, 2023 .features[FEAT_8000_0001_ECX] = 2024 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM, 2025 .features[FEAT_7_0_EBX] = 2026 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 2027 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 2028 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID, 2029 .features[FEAT_XSAVE] = 2030 CPUID_XSAVE_XSAVEOPT, 2031 .features[FEAT_6_EAX] = 2032 CPUID_6_EAX_ARAT, 2033 .xlevel = 0x80000008, 2034 .model_id = "Intel Core Processor (Haswell, no TSX)", 2035 }, 2036 { 2037 .name = "Haswell-noTSX-IBRS", 2038 .level = 0xd, 2039 .vendor = CPUID_VENDOR_INTEL, 2040 .family = 6, 2041 .model = 60, 2042 .stepping = 1, 2043 .features[FEAT_1_EDX] = 2044 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2045 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2046 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2047 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2048 CPUID_DE | CPUID_FP87, 2049 .features[FEAT_1_ECX] = 2050 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 2051 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 2052 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2053 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 2054 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 2055 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 2056 .features[FEAT_8000_0001_EDX] = 2057 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 2058 CPUID_EXT2_SYSCALL, 2059 .features[FEAT_8000_0001_ECX] = 2060 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM, 2061 .features[FEAT_7_0_EDX] = 2062 CPUID_7_0_EDX_SPEC_CTRL, 2063 .features[FEAT_7_0_EBX] = 2064 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 2065 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 2066 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID, 2067 .features[FEAT_XSAVE] = 2068 CPUID_XSAVE_XSAVEOPT, 2069 .features[FEAT_6_EAX] = 2070 CPUID_6_EAX_ARAT, 2071 .xlevel = 0x80000008, 2072 .model_id = "Intel Core Processor (Haswell, no TSX, IBRS)", 2073 }, 2074 { 2075 .name = "Haswell", 2076 .level = 0xd, 2077 .vendor = CPUID_VENDOR_INTEL, 2078 .family = 6, 2079 .model = 60, 2080 .stepping = 4, 2081 .features[FEAT_1_EDX] = 2082 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2083 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2084 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2085 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2086 CPUID_DE | CPUID_FP87, 2087 .features[FEAT_1_ECX] = 2088 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 2089 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 2090 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2091 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 2092 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 2093 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 2094 .features[FEAT_8000_0001_EDX] = 2095 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 2096 CPUID_EXT2_SYSCALL, 2097 .features[FEAT_8000_0001_ECX] = 2098 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM, 2099 .features[FEAT_7_0_EBX] = 2100 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 2101 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 2102 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 2103 CPUID_7_0_EBX_RTM, 2104 .features[FEAT_XSAVE] = 2105 CPUID_XSAVE_XSAVEOPT, 2106 .features[FEAT_6_EAX] = 2107 CPUID_6_EAX_ARAT, 2108 .xlevel = 0x80000008, 2109 .model_id = "Intel Core Processor (Haswell)", 2110 }, 2111 { 2112 .name = "Haswell-IBRS", 2113 .level = 0xd, 2114 .vendor = CPUID_VENDOR_INTEL, 2115 .family = 6, 2116 .model = 60, 2117 .stepping = 4, 2118 .features[FEAT_1_EDX] = 2119 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2120 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2121 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2122 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2123 CPUID_DE | CPUID_FP87, 2124 .features[FEAT_1_ECX] = 2125 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 2126 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 2127 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2128 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 2129 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 2130 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 2131 .features[FEAT_8000_0001_EDX] = 2132 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 2133 CPUID_EXT2_SYSCALL, 2134 .features[FEAT_8000_0001_ECX] = 2135 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM, 2136 .features[FEAT_7_0_EDX] = 2137 CPUID_7_0_EDX_SPEC_CTRL, 2138 .features[FEAT_7_0_EBX] = 2139 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 2140 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 2141 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 2142 CPUID_7_0_EBX_RTM, 2143 .features[FEAT_XSAVE] = 2144 CPUID_XSAVE_XSAVEOPT, 2145 .features[FEAT_6_EAX] = 2146 CPUID_6_EAX_ARAT, 2147 .xlevel = 0x80000008, 2148 .model_id = "Intel Core Processor (Haswell, IBRS)", 2149 }, 2150 { 2151 .name = "Broadwell-noTSX", 2152 .level = 0xd, 2153 .vendor = CPUID_VENDOR_INTEL, 2154 .family = 6, 2155 .model = 61, 2156 .stepping = 2, 2157 .features[FEAT_1_EDX] = 2158 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2159 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2160 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2161 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2162 CPUID_DE | CPUID_FP87, 2163 .features[FEAT_1_ECX] = 2164 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 2165 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 2166 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2167 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 2168 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 2169 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 2170 .features[FEAT_8000_0001_EDX] = 2171 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 2172 CPUID_EXT2_SYSCALL, 2173 .features[FEAT_8000_0001_ECX] = 2174 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 2175 .features[FEAT_7_0_EBX] = 2176 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 2177 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 2178 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 2179 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 2180 CPUID_7_0_EBX_SMAP, 2181 .features[FEAT_XSAVE] = 2182 CPUID_XSAVE_XSAVEOPT, 2183 .features[FEAT_6_EAX] = 2184 CPUID_6_EAX_ARAT, 2185 .xlevel = 0x80000008, 2186 .model_id = "Intel Core Processor (Broadwell, no TSX)", 2187 }, 2188 { 2189 .name = "Broadwell-noTSX-IBRS", 2190 .level = 0xd, 2191 .vendor = CPUID_VENDOR_INTEL, 2192 .family = 6, 2193 .model = 61, 2194 .stepping = 2, 2195 .features[FEAT_1_EDX] = 2196 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2197 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2198 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2199 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2200 CPUID_DE | CPUID_FP87, 2201 .features[FEAT_1_ECX] = 2202 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 2203 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 2204 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2205 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 2206 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 2207 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 2208 .features[FEAT_8000_0001_EDX] = 2209 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 2210 CPUID_EXT2_SYSCALL, 2211 .features[FEAT_8000_0001_ECX] = 2212 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 2213 .features[FEAT_7_0_EDX] = 2214 CPUID_7_0_EDX_SPEC_CTRL, 2215 .features[FEAT_7_0_EBX] = 2216 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 2217 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 2218 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 2219 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 2220 CPUID_7_0_EBX_SMAP, 2221 .features[FEAT_XSAVE] = 2222 CPUID_XSAVE_XSAVEOPT, 2223 .features[FEAT_6_EAX] = 2224 CPUID_6_EAX_ARAT, 2225 .xlevel = 0x80000008, 2226 .model_id = "Intel Core Processor (Broadwell, no TSX, IBRS)", 2227 }, 2228 { 2229 .name = "Broadwell", 2230 .level = 0xd, 2231 .vendor = CPUID_VENDOR_INTEL, 2232 .family = 6, 2233 .model = 61, 2234 .stepping = 2, 2235 .features[FEAT_1_EDX] = 2236 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2237 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2238 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2239 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2240 CPUID_DE | CPUID_FP87, 2241 .features[FEAT_1_ECX] = 2242 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 2243 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 2244 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2245 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 2246 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 2247 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 2248 .features[FEAT_8000_0001_EDX] = 2249 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 2250 CPUID_EXT2_SYSCALL, 2251 .features[FEAT_8000_0001_ECX] = 2252 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 2253 .features[FEAT_7_0_EBX] = 2254 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 2255 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 2256 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 2257 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 2258 CPUID_7_0_EBX_SMAP, 2259 .features[FEAT_XSAVE] = 2260 CPUID_XSAVE_XSAVEOPT, 2261 .features[FEAT_6_EAX] = 2262 CPUID_6_EAX_ARAT, 2263 .xlevel = 0x80000008, 2264 .model_id = "Intel Core Processor (Broadwell)", 2265 }, 2266 { 2267 .name = "Broadwell-IBRS", 2268 .level = 0xd, 2269 .vendor = CPUID_VENDOR_INTEL, 2270 .family = 6, 2271 .model = 61, 2272 .stepping = 2, 2273 .features[FEAT_1_EDX] = 2274 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2275 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2276 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2277 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2278 CPUID_DE | CPUID_FP87, 2279 .features[FEAT_1_ECX] = 2280 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 2281 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 2282 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2283 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 2284 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 2285 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 2286 .features[FEAT_8000_0001_EDX] = 2287 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 2288 CPUID_EXT2_SYSCALL, 2289 .features[FEAT_8000_0001_ECX] = 2290 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 2291 .features[FEAT_7_0_EDX] = 2292 CPUID_7_0_EDX_SPEC_CTRL, 2293 .features[FEAT_7_0_EBX] = 2294 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 2295 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 2296 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 2297 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 2298 CPUID_7_0_EBX_SMAP, 2299 .features[FEAT_XSAVE] = 2300 CPUID_XSAVE_XSAVEOPT, 2301 .features[FEAT_6_EAX] = 2302 CPUID_6_EAX_ARAT, 2303 .xlevel = 0x80000008, 2304 .model_id = "Intel Core Processor (Broadwell, IBRS)", 2305 }, 2306 { 2307 .name = "Skylake-Client", 2308 .level = 0xd, 2309 .vendor = CPUID_VENDOR_INTEL, 2310 .family = 6, 2311 .model = 94, 2312 .stepping = 3, 2313 .features[FEAT_1_EDX] = 2314 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2315 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2316 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2317 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2318 CPUID_DE | CPUID_FP87, 2319 .features[FEAT_1_ECX] = 2320 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 2321 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 2322 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2323 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 2324 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 2325 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 2326 .features[FEAT_8000_0001_EDX] = 2327 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 2328 CPUID_EXT2_SYSCALL, 2329 .features[FEAT_8000_0001_ECX] = 2330 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 2331 .features[FEAT_7_0_EBX] = 2332 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 2333 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 2334 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 2335 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 2336 CPUID_7_0_EBX_SMAP, 2337 /* Missing: XSAVES (not supported by some Linux versions, 2338 * including v4.1 to v4.12). 2339 * KVM doesn't yet expose any XSAVES state save component, 2340 * and the only one defined in Skylake (processor tracing) 2341 * probably will block migration anyway. 2342 */ 2343 .features[FEAT_XSAVE] = 2344 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 2345 CPUID_XSAVE_XGETBV1, 2346 .features[FEAT_6_EAX] = 2347 CPUID_6_EAX_ARAT, 2348 .xlevel = 0x80000008, 2349 .model_id = "Intel Core Processor (Skylake)", 2350 }, 2351 { 2352 .name = "Skylake-Client-IBRS", 2353 .level = 0xd, 2354 .vendor = CPUID_VENDOR_INTEL, 2355 .family = 6, 2356 .model = 94, 2357 .stepping = 3, 2358 .features[FEAT_1_EDX] = 2359 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2360 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2361 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2362 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2363 CPUID_DE | CPUID_FP87, 2364 .features[FEAT_1_ECX] = 2365 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 2366 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 2367 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2368 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 2369 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 2370 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 2371 .features[FEAT_8000_0001_EDX] = 2372 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 2373 CPUID_EXT2_SYSCALL, 2374 .features[FEAT_8000_0001_ECX] = 2375 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 2376 .features[FEAT_7_0_EDX] = 2377 CPUID_7_0_EDX_SPEC_CTRL, 2378 .features[FEAT_7_0_EBX] = 2379 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 2380 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 2381 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 2382 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 2383 CPUID_7_0_EBX_SMAP, 2384 /* Missing: XSAVES (not supported by some Linux versions, 2385 * including v4.1 to v4.12). 2386 * KVM doesn't yet expose any XSAVES state save component, 2387 * and the only one defined in Skylake (processor tracing) 2388 * probably will block migration anyway. 2389 */ 2390 .features[FEAT_XSAVE] = 2391 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 2392 CPUID_XSAVE_XGETBV1, 2393 .features[FEAT_6_EAX] = 2394 CPUID_6_EAX_ARAT, 2395 .xlevel = 0x80000008, 2396 .model_id = "Intel Core Processor (Skylake, IBRS)", 2397 }, 2398 { 2399 .name = "Skylake-Server", 2400 .level = 0xd, 2401 .vendor = CPUID_VENDOR_INTEL, 2402 .family = 6, 2403 .model = 85, 2404 .stepping = 4, 2405 .features[FEAT_1_EDX] = 2406 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2407 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2408 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2409 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2410 CPUID_DE | CPUID_FP87, 2411 .features[FEAT_1_ECX] = 2412 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 2413 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 2414 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2415 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 2416 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 2417 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 2418 .features[FEAT_8000_0001_EDX] = 2419 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP | 2420 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 2421 .features[FEAT_8000_0001_ECX] = 2422 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 2423 .features[FEAT_7_0_EBX] = 2424 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 2425 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 2426 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 2427 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 2428 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB | 2429 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ | 2430 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD | 2431 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT, 2432 .features[FEAT_7_0_ECX] = 2433 CPUID_7_0_ECX_PKU, 2434 /* Missing: XSAVES (not supported by some Linux versions, 2435 * including v4.1 to v4.12). 2436 * KVM doesn't yet expose any XSAVES state save component, 2437 * and the only one defined in Skylake (processor tracing) 2438 * probably will block migration anyway. 2439 */ 2440 .features[FEAT_XSAVE] = 2441 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 2442 CPUID_XSAVE_XGETBV1, 2443 .features[FEAT_6_EAX] = 2444 CPUID_6_EAX_ARAT, 2445 .xlevel = 0x80000008, 2446 .model_id = "Intel Xeon Processor (Skylake)", 2447 }, 2448 { 2449 .name = "Skylake-Server-IBRS", 2450 .level = 0xd, 2451 .vendor = CPUID_VENDOR_INTEL, 2452 .family = 6, 2453 .model = 85, 2454 .stepping = 4, 2455 .features[FEAT_1_EDX] = 2456 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2457 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2458 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2459 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2460 CPUID_DE | CPUID_FP87, 2461 .features[FEAT_1_ECX] = 2462 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 2463 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 2464 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2465 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 2466 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 2467 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 2468 .features[FEAT_8000_0001_EDX] = 2469 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP | 2470 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 2471 .features[FEAT_8000_0001_ECX] = 2472 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 2473 .features[FEAT_7_0_EDX] = 2474 CPUID_7_0_EDX_SPEC_CTRL, 2475 .features[FEAT_7_0_EBX] = 2476 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 2477 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 2478 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 2479 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 2480 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB | 2481 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ | 2482 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD | 2483 CPUID_7_0_EBX_AVX512VL, 2484 .features[FEAT_7_0_ECX] = 2485 CPUID_7_0_ECX_PKU, 2486 /* Missing: XSAVES (not supported by some Linux versions, 2487 * including v4.1 to v4.12). 2488 * KVM doesn't yet expose any XSAVES state save component, 2489 * and the only one defined in Skylake (processor tracing) 2490 * probably will block migration anyway. 2491 */ 2492 .features[FEAT_XSAVE] = 2493 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 2494 CPUID_XSAVE_XGETBV1, 2495 .features[FEAT_6_EAX] = 2496 CPUID_6_EAX_ARAT, 2497 .xlevel = 0x80000008, 2498 .model_id = "Intel Xeon Processor (Skylake, IBRS)", 2499 }, 2500 { 2501 .name = "Cascadelake-Server", 2502 .level = 0xd, 2503 .vendor = CPUID_VENDOR_INTEL, 2504 .family = 6, 2505 .model = 85, 2506 .stepping = 5, 2507 .features[FEAT_1_EDX] = 2508 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2509 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2510 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2511 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2512 CPUID_DE | CPUID_FP87, 2513 .features[FEAT_1_ECX] = 2514 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 2515 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 2516 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2517 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 2518 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 2519 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 2520 .features[FEAT_8000_0001_EDX] = 2521 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP | 2522 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 2523 .features[FEAT_8000_0001_ECX] = 2524 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 2525 .features[FEAT_7_0_EBX] = 2526 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 2527 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 2528 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 2529 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 2530 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB | 2531 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ | 2532 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD | 2533 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT | 2534 CPUID_7_0_EBX_INTEL_PT, 2535 .features[FEAT_7_0_ECX] = 2536 CPUID_7_0_ECX_PKU | CPUID_7_0_ECX_OSPKE | 2537 CPUID_7_0_ECX_AVX512VNNI, 2538 .features[FEAT_7_0_EDX] = 2539 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD, 2540 /* Missing: XSAVES (not supported by some Linux versions, 2541 * including v4.1 to v4.12). 2542 * KVM doesn't yet expose any XSAVES state save component, 2543 * and the only one defined in Skylake (processor tracing) 2544 * probably will block migration anyway. 2545 */ 2546 .features[FEAT_XSAVE] = 2547 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 2548 CPUID_XSAVE_XGETBV1, 2549 .features[FEAT_6_EAX] = 2550 CPUID_6_EAX_ARAT, 2551 .xlevel = 0x80000008, 2552 .model_id = "Intel Xeon Processor (Cascadelake)", 2553 }, 2554 { 2555 .name = "Icelake-Client", 2556 .level = 0xd, 2557 .vendor = CPUID_VENDOR_INTEL, 2558 .family = 6, 2559 .model = 126, 2560 .stepping = 0, 2561 .features[FEAT_1_EDX] = 2562 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2563 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2564 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2565 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2566 CPUID_DE | CPUID_FP87, 2567 .features[FEAT_1_ECX] = 2568 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 2569 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 2570 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2571 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 2572 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 2573 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 2574 .features[FEAT_8000_0001_EDX] = 2575 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 2576 CPUID_EXT2_SYSCALL, 2577 .features[FEAT_8000_0001_ECX] = 2578 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 2579 .features[FEAT_8000_0008_EBX] = 2580 CPUID_8000_0008_EBX_WBNOINVD, 2581 .features[FEAT_7_0_EBX] = 2582 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 2583 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 2584 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 2585 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 2586 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_INTEL_PT, 2587 .features[FEAT_7_0_ECX] = 2588 CPUID_7_0_ECX_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | 2589 CPUID_7_0_ECX_OSPKE | CPUID_7_0_ECX_VBMI2 | CPUID_7_0_ECX_GFNI | 2590 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ | 2591 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG | 2592 CPUID_7_0_ECX_AVX512_VPOPCNTDQ, 2593 .features[FEAT_7_0_EDX] = 2594 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD, 2595 /* Missing: XSAVES (not supported by some Linux versions, 2596 * including v4.1 to v4.12). 2597 * KVM doesn't yet expose any XSAVES state save component, 2598 * and the only one defined in Skylake (processor tracing) 2599 * probably will block migration anyway. 2600 */ 2601 .features[FEAT_XSAVE] = 2602 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 2603 CPUID_XSAVE_XGETBV1, 2604 .features[FEAT_6_EAX] = 2605 CPUID_6_EAX_ARAT, 2606 .xlevel = 0x80000008, 2607 .model_id = "Intel Core Processor (Icelake)", 2608 }, 2609 { 2610 .name = "Icelake-Server", 2611 .level = 0xd, 2612 .vendor = CPUID_VENDOR_INTEL, 2613 .family = 6, 2614 .model = 134, 2615 .stepping = 0, 2616 .features[FEAT_1_EDX] = 2617 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2618 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2619 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2620 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2621 CPUID_DE | CPUID_FP87, 2622 .features[FEAT_1_ECX] = 2623 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 2624 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 2625 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2626 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 2627 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 2628 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 2629 .features[FEAT_8000_0001_EDX] = 2630 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP | 2631 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 2632 .features[FEAT_8000_0001_ECX] = 2633 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 2634 .features[FEAT_8000_0008_EBX] = 2635 CPUID_8000_0008_EBX_WBNOINVD, 2636 .features[FEAT_7_0_EBX] = 2637 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 2638 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 2639 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 2640 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 2641 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB | 2642 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ | 2643 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD | 2644 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT | 2645 CPUID_7_0_EBX_INTEL_PT, 2646 .features[FEAT_7_0_ECX] = 2647 CPUID_7_0_ECX_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | 2648 CPUID_7_0_ECX_OSPKE | CPUID_7_0_ECX_VBMI2 | CPUID_7_0_ECX_GFNI | 2649 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ | 2650 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG | 2651 CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57, 2652 .features[FEAT_7_0_EDX] = 2653 CPUID_7_0_EDX_PCONFIG | CPUID_7_0_EDX_SPEC_CTRL | 2654 CPUID_7_0_EDX_SPEC_CTRL_SSBD, 2655 /* Missing: XSAVES (not supported by some Linux versions, 2656 * including v4.1 to v4.12). 2657 * KVM doesn't yet expose any XSAVES state save component, 2658 * and the only one defined in Skylake (processor tracing) 2659 * probably will block migration anyway. 2660 */ 2661 .features[FEAT_XSAVE] = 2662 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 2663 CPUID_XSAVE_XGETBV1, 2664 .features[FEAT_6_EAX] = 2665 CPUID_6_EAX_ARAT, 2666 .xlevel = 0x80000008, 2667 .model_id = "Intel Xeon Processor (Icelake)", 2668 }, 2669 { 2670 .name = "KnightsMill", 2671 .level = 0xd, 2672 .vendor = CPUID_VENDOR_INTEL, 2673 .family = 6, 2674 .model = 133, 2675 .stepping = 0, 2676 .features[FEAT_1_EDX] = 2677 CPUID_VME | CPUID_SS | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | 2678 CPUID_MMX | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | 2679 CPUID_MCA | CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | 2680 CPUID_CX8 | CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | 2681 CPUID_PSE | CPUID_DE | CPUID_FP87, 2682 .features[FEAT_1_ECX] = 2683 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 2684 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 2685 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2686 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 2687 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 2688 CPUID_EXT_F16C | CPUID_EXT_RDRAND, 2689 .features[FEAT_8000_0001_EDX] = 2690 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP | 2691 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 2692 .features[FEAT_8000_0001_ECX] = 2693 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 2694 .features[FEAT_7_0_EBX] = 2695 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 | 2696 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | 2697 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_AVX512F | 2698 CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_AVX512PF | 2699 CPUID_7_0_EBX_AVX512ER, 2700 .features[FEAT_7_0_ECX] = 2701 CPUID_7_0_ECX_AVX512_VPOPCNTDQ, 2702 .features[FEAT_7_0_EDX] = 2703 CPUID_7_0_EDX_AVX512_4VNNIW | CPUID_7_0_EDX_AVX512_4FMAPS, 2704 .features[FEAT_XSAVE] = 2705 CPUID_XSAVE_XSAVEOPT, 2706 .features[FEAT_6_EAX] = 2707 CPUID_6_EAX_ARAT, 2708 .xlevel = 0x80000008, 2709 .model_id = "Intel Xeon Phi Processor (Knights Mill)", 2710 }, 2711 { 2712 .name = "Opteron_G1", 2713 .level = 5, 2714 .vendor = CPUID_VENDOR_AMD, 2715 .family = 15, 2716 .model = 6, 2717 .stepping = 1, 2718 .features[FEAT_1_EDX] = 2719 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2720 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2721 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2722 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2723 CPUID_DE | CPUID_FP87, 2724 .features[FEAT_1_ECX] = 2725 CPUID_EXT_SSE3, 2726 .features[FEAT_8000_0001_EDX] = 2727 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 2728 .xlevel = 0x80000008, 2729 .model_id = "AMD Opteron 240 (Gen 1 Class Opteron)", 2730 }, 2731 { 2732 .name = "Opteron_G2", 2733 .level = 5, 2734 .vendor = CPUID_VENDOR_AMD, 2735 .family = 15, 2736 .model = 6, 2737 .stepping = 1, 2738 .features[FEAT_1_EDX] = 2739 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2740 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2741 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2742 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2743 CPUID_DE | CPUID_FP87, 2744 .features[FEAT_1_ECX] = 2745 CPUID_EXT_CX16 | CPUID_EXT_SSE3, 2746 .features[FEAT_8000_0001_EDX] = 2747 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 2748 .features[FEAT_8000_0001_ECX] = 2749 CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM, 2750 .xlevel = 0x80000008, 2751 .model_id = "AMD Opteron 22xx (Gen 2 Class Opteron)", 2752 }, 2753 { 2754 .name = "Opteron_G3", 2755 .level = 5, 2756 .vendor = CPUID_VENDOR_AMD, 2757 .family = 16, 2758 .model = 2, 2759 .stepping = 3, 2760 .features[FEAT_1_EDX] = 2761 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2762 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2763 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2764 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2765 CPUID_DE | CPUID_FP87, 2766 .features[FEAT_1_ECX] = 2767 CPUID_EXT_POPCNT | CPUID_EXT_CX16 | CPUID_EXT_MONITOR | 2768 CPUID_EXT_SSE3, 2769 .features[FEAT_8000_0001_EDX] = 2770 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL | 2771 CPUID_EXT2_RDTSCP, 2772 .features[FEAT_8000_0001_ECX] = 2773 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | 2774 CPUID_EXT3_ABM | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM, 2775 .xlevel = 0x80000008, 2776 .model_id = "AMD Opteron 23xx (Gen 3 Class Opteron)", 2777 }, 2778 { 2779 .name = "Opteron_G4", 2780 .level = 0xd, 2781 .vendor = CPUID_VENDOR_AMD, 2782 .family = 21, 2783 .model = 1, 2784 .stepping = 2, 2785 .features[FEAT_1_EDX] = 2786 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2787 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2788 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2789 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2790 CPUID_DE | CPUID_FP87, 2791 .features[FEAT_1_ECX] = 2792 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 2793 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 2794 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | 2795 CPUID_EXT_SSE3, 2796 .features[FEAT_8000_0001_EDX] = 2797 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX | 2798 CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP, 2799 .features[FEAT_8000_0001_ECX] = 2800 CPUID_EXT3_FMA4 | CPUID_EXT3_XOP | 2801 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE | 2802 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM | 2803 CPUID_EXT3_LAHF_LM, 2804 /* no xsaveopt! */ 2805 .xlevel = 0x8000001A, 2806 .model_id = "AMD Opteron 62xx class CPU", 2807 }, 2808 { 2809 .name = "Opteron_G5", 2810 .level = 0xd, 2811 .vendor = CPUID_VENDOR_AMD, 2812 .family = 21, 2813 .model = 2, 2814 .stepping = 0, 2815 .features[FEAT_1_EDX] = 2816 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2817 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2818 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2819 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2820 CPUID_DE | CPUID_FP87, 2821 .features[FEAT_1_ECX] = 2822 CPUID_EXT_F16C | CPUID_EXT_AVX | CPUID_EXT_XSAVE | 2823 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | 2824 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_FMA | 2825 CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3, 2826 .features[FEAT_8000_0001_EDX] = 2827 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX | 2828 CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP, 2829 .features[FEAT_8000_0001_ECX] = 2830 CPUID_EXT3_TBM | CPUID_EXT3_FMA4 | CPUID_EXT3_XOP | 2831 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE | 2832 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM | 2833 CPUID_EXT3_LAHF_LM, 2834 /* no xsaveopt! */ 2835 .xlevel = 0x8000001A, 2836 .model_id = "AMD Opteron 63xx class CPU", 2837 }, 2838 { 2839 .name = "EPYC", 2840 .level = 0xd, 2841 .vendor = CPUID_VENDOR_AMD, 2842 .family = 23, 2843 .model = 1, 2844 .stepping = 2, 2845 .features[FEAT_1_EDX] = 2846 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH | 2847 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE | 2848 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE | 2849 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE | 2850 CPUID_VME | CPUID_FP87, 2851 .features[FEAT_1_ECX] = 2852 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX | 2853 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT | 2854 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 2855 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 | 2856 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3, 2857 .features[FEAT_8000_0001_EDX] = 2858 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB | 2859 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX | 2860 CPUID_EXT2_SYSCALL, 2861 .features[FEAT_8000_0001_ECX] = 2862 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH | 2863 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | 2864 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM | 2865 CPUID_EXT3_TOPOEXT, 2866 .features[FEAT_7_0_EBX] = 2867 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 | 2868 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED | 2869 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT | 2870 CPUID_7_0_EBX_SHA_NI, 2871 /* Missing: XSAVES (not supported by some Linux versions, 2872 * including v4.1 to v4.12). 2873 * KVM doesn't yet expose any XSAVES state save component. 2874 */ 2875 .features[FEAT_XSAVE] = 2876 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 2877 CPUID_XSAVE_XGETBV1, 2878 .features[FEAT_6_EAX] = 2879 CPUID_6_EAX_ARAT, 2880 .xlevel = 0x8000001E, 2881 .model_id = "AMD EPYC Processor", 2882 .cache_info = &epyc_cache_info, 2883 }, 2884 { 2885 .name = "EPYC-IBPB", 2886 .level = 0xd, 2887 .vendor = CPUID_VENDOR_AMD, 2888 .family = 23, 2889 .model = 1, 2890 .stepping = 2, 2891 .features[FEAT_1_EDX] = 2892 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH | 2893 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE | 2894 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE | 2895 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE | 2896 CPUID_VME | CPUID_FP87, 2897 .features[FEAT_1_ECX] = 2898 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX | 2899 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT | 2900 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 2901 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 | 2902 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3, 2903 .features[FEAT_8000_0001_EDX] = 2904 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB | 2905 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX | 2906 CPUID_EXT2_SYSCALL, 2907 .features[FEAT_8000_0001_ECX] = 2908 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH | 2909 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | 2910 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM | 2911 CPUID_EXT3_TOPOEXT, 2912 .features[FEAT_8000_0008_EBX] = 2913 CPUID_8000_0008_EBX_IBPB, 2914 .features[FEAT_7_0_EBX] = 2915 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 | 2916 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED | 2917 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT | 2918 CPUID_7_0_EBX_SHA_NI, 2919 /* Missing: XSAVES (not supported by some Linux versions, 2920 * including v4.1 to v4.12). 2921 * KVM doesn't yet expose any XSAVES state save component. 2922 */ 2923 .features[FEAT_XSAVE] = 2924 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 2925 CPUID_XSAVE_XGETBV1, 2926 .features[FEAT_6_EAX] = 2927 CPUID_6_EAX_ARAT, 2928 .xlevel = 0x8000001E, 2929 .model_id = "AMD EPYC Processor (with IBPB)", 2930 .cache_info = &epyc_cache_info, 2931 }, 2932 }; 2933 2934 typedef struct PropValue { 2935 const char *prop, *value; 2936 } PropValue; 2937 2938 /* KVM-specific features that are automatically added/removed 2939 * from all CPU models when KVM is enabled. 2940 */ 2941 static PropValue kvm_default_props[] = { 2942 { "kvmclock", "on" }, 2943 { "kvm-nopiodelay", "on" }, 2944 { "kvm-asyncpf", "on" }, 2945 { "kvm-steal-time", "on" }, 2946 { "kvm-pv-eoi", "on" }, 2947 { "kvmclock-stable-bit", "on" }, 2948 { "x2apic", "on" }, 2949 { "acpi", "off" }, 2950 { "monitor", "off" }, 2951 { "svm", "off" }, 2952 { NULL, NULL }, 2953 }; 2954 2955 /* TCG-specific defaults that override all CPU models when using TCG 2956 */ 2957 static PropValue tcg_default_props[] = { 2958 { "vme", "off" }, 2959 { NULL, NULL }, 2960 }; 2961 2962 2963 void x86_cpu_change_kvm_default(const char *prop, const char *value) 2964 { 2965 PropValue *pv; 2966 for (pv = kvm_default_props; pv->prop; pv++) { 2967 if (!strcmp(pv->prop, prop)) { 2968 pv->value = value; 2969 break; 2970 } 2971 } 2972 2973 /* It is valid to call this function only for properties that 2974 * are already present in the kvm_default_props table. 2975 */ 2976 assert(pv->prop); 2977 } 2978 2979 static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w, 2980 bool migratable_only); 2981 2982 static bool lmce_supported(void) 2983 { 2984 uint64_t mce_cap = 0; 2985 2986 #ifdef CONFIG_KVM 2987 if (kvm_ioctl(kvm_state, KVM_X86_GET_MCE_CAP_SUPPORTED, &mce_cap) < 0) { 2988 return false; 2989 } 2990 #endif 2991 2992 return !!(mce_cap & MCG_LMCE_P); 2993 } 2994 2995 #define CPUID_MODEL_ID_SZ 48 2996 2997 /** 2998 * cpu_x86_fill_model_id: 2999 * Get CPUID model ID string from host CPU. 3000 * 3001 * @str should have at least CPUID_MODEL_ID_SZ bytes 3002 * 3003 * The function does NOT add a null terminator to the string 3004 * automatically. 3005 */ 3006 static int cpu_x86_fill_model_id(char *str) 3007 { 3008 uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0; 3009 int i; 3010 3011 for (i = 0; i < 3; i++) { 3012 host_cpuid(0x80000002 + i, 0, &eax, &ebx, &ecx, &edx); 3013 memcpy(str + i * 16 + 0, &eax, 4); 3014 memcpy(str + i * 16 + 4, &ebx, 4); 3015 memcpy(str + i * 16 + 8, &ecx, 4); 3016 memcpy(str + i * 16 + 12, &edx, 4); 3017 } 3018 return 0; 3019 } 3020 3021 static Property max_x86_cpu_properties[] = { 3022 DEFINE_PROP_BOOL("migratable", X86CPU, migratable, true), 3023 DEFINE_PROP_BOOL("host-cache-info", X86CPU, cache_info_passthrough, false), 3024 DEFINE_PROP_END_OF_LIST() 3025 }; 3026 3027 static void max_x86_cpu_class_init(ObjectClass *oc, void *data) 3028 { 3029 DeviceClass *dc = DEVICE_CLASS(oc); 3030 X86CPUClass *xcc = X86_CPU_CLASS(oc); 3031 3032 xcc->ordering = 9; 3033 3034 xcc->model_description = 3035 "Enables all features supported by the accelerator in the current host"; 3036 3037 dc->props = max_x86_cpu_properties; 3038 } 3039 3040 static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp); 3041 3042 static void max_x86_cpu_initfn(Object *obj) 3043 { 3044 X86CPU *cpu = X86_CPU(obj); 3045 CPUX86State *env = &cpu->env; 3046 KVMState *s = kvm_state; 3047 3048 /* We can't fill the features array here because we don't know yet if 3049 * "migratable" is true or false. 3050 */ 3051 cpu->max_features = true; 3052 3053 if (accel_uses_host_cpuid()) { 3054 char vendor[CPUID_VENDOR_SZ + 1] = { 0 }; 3055 char model_id[CPUID_MODEL_ID_SZ + 1] = { 0 }; 3056 int family, model, stepping; 3057 X86CPUDefinition host_cpudef = { }; 3058 uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0; 3059 3060 host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx); 3061 x86_cpu_vendor_words2str(host_cpudef.vendor, ebx, edx, ecx); 3062 3063 host_vendor_fms(vendor, &family, &model, &stepping); 3064 3065 cpu_x86_fill_model_id(model_id); 3066 3067 object_property_set_str(OBJECT(cpu), vendor, "vendor", &error_abort); 3068 object_property_set_int(OBJECT(cpu), family, "family", &error_abort); 3069 object_property_set_int(OBJECT(cpu), model, "model", &error_abort); 3070 object_property_set_int(OBJECT(cpu), stepping, "stepping", 3071 &error_abort); 3072 object_property_set_str(OBJECT(cpu), model_id, "model-id", 3073 &error_abort); 3074 3075 if (kvm_enabled()) { 3076 env->cpuid_min_level = 3077 kvm_arch_get_supported_cpuid(s, 0x0, 0, R_EAX); 3078 env->cpuid_min_xlevel = 3079 kvm_arch_get_supported_cpuid(s, 0x80000000, 0, R_EAX); 3080 env->cpuid_min_xlevel2 = 3081 kvm_arch_get_supported_cpuid(s, 0xC0000000, 0, R_EAX); 3082 } else { 3083 env->cpuid_min_level = 3084 hvf_get_supported_cpuid(0x0, 0, R_EAX); 3085 env->cpuid_min_xlevel = 3086 hvf_get_supported_cpuid(0x80000000, 0, R_EAX); 3087 env->cpuid_min_xlevel2 = 3088 hvf_get_supported_cpuid(0xC0000000, 0, R_EAX); 3089 } 3090 3091 if (lmce_supported()) { 3092 object_property_set_bool(OBJECT(cpu), true, "lmce", &error_abort); 3093 } 3094 } else { 3095 object_property_set_str(OBJECT(cpu), CPUID_VENDOR_AMD, 3096 "vendor", &error_abort); 3097 object_property_set_int(OBJECT(cpu), 6, "family", &error_abort); 3098 object_property_set_int(OBJECT(cpu), 6, "model", &error_abort); 3099 object_property_set_int(OBJECT(cpu), 3, "stepping", &error_abort); 3100 object_property_set_str(OBJECT(cpu), 3101 "QEMU TCG CPU version " QEMU_HW_VERSION, 3102 "model-id", &error_abort); 3103 } 3104 3105 object_property_set_bool(OBJECT(cpu), true, "pmu", &error_abort); 3106 } 3107 3108 static const TypeInfo max_x86_cpu_type_info = { 3109 .name = X86_CPU_TYPE_NAME("max"), 3110 .parent = TYPE_X86_CPU, 3111 .instance_init = max_x86_cpu_initfn, 3112 .class_init = max_x86_cpu_class_init, 3113 }; 3114 3115 #if defined(CONFIG_KVM) || defined(CONFIG_HVF) 3116 static void host_x86_cpu_class_init(ObjectClass *oc, void *data) 3117 { 3118 X86CPUClass *xcc = X86_CPU_CLASS(oc); 3119 3120 xcc->host_cpuid_required = true; 3121 xcc->ordering = 8; 3122 3123 #if defined(CONFIG_KVM) 3124 xcc->model_description = 3125 "KVM processor with all supported host features "; 3126 #elif defined(CONFIG_HVF) 3127 xcc->model_description = 3128 "HVF processor with all supported host features "; 3129 #endif 3130 } 3131 3132 static const TypeInfo host_x86_cpu_type_info = { 3133 .name = X86_CPU_TYPE_NAME("host"), 3134 .parent = X86_CPU_TYPE_NAME("max"), 3135 .class_init = host_x86_cpu_class_init, 3136 }; 3137 3138 #endif 3139 3140 static char *feature_word_description(FeatureWordInfo *f, uint32_t bit) 3141 { 3142 assert(f->type == CPUID_FEATURE_WORD || f->type == MSR_FEATURE_WORD); 3143 3144 switch (f->type) { 3145 case CPUID_FEATURE_WORD: 3146 { 3147 const char *reg = get_register_name_32(f->cpuid.reg); 3148 assert(reg); 3149 return g_strdup_printf("CPUID.%02XH:%s", 3150 f->cpuid.eax, reg); 3151 } 3152 case MSR_FEATURE_WORD: 3153 return g_strdup_printf("MSR(%02XH)", 3154 f->msr.index); 3155 } 3156 3157 return NULL; 3158 } 3159 3160 static void report_unavailable_features(FeatureWord w, uint32_t mask) 3161 { 3162 FeatureWordInfo *f = &feature_word_info[w]; 3163 int i; 3164 char *feat_word_str; 3165 3166 for (i = 0; i < 32; ++i) { 3167 if ((1UL << i) & mask) { 3168 feat_word_str = feature_word_description(f, i); 3169 warn_report("%s doesn't support requested feature: %s%s%s [bit %d]", 3170 accel_uses_host_cpuid() ? "host" : "TCG", 3171 feat_word_str, 3172 f->feat_names[i] ? "." : "", 3173 f->feat_names[i] ? f->feat_names[i] : "", i); 3174 g_free(feat_word_str); 3175 } 3176 } 3177 } 3178 3179 static void x86_cpuid_version_get_family(Object *obj, Visitor *v, 3180 const char *name, void *opaque, 3181 Error **errp) 3182 { 3183 X86CPU *cpu = X86_CPU(obj); 3184 CPUX86State *env = &cpu->env; 3185 int64_t value; 3186 3187 value = (env->cpuid_version >> 8) & 0xf; 3188 if (value == 0xf) { 3189 value += (env->cpuid_version >> 20) & 0xff; 3190 } 3191 visit_type_int(v, name, &value, errp); 3192 } 3193 3194 static void x86_cpuid_version_set_family(Object *obj, Visitor *v, 3195 const char *name, void *opaque, 3196 Error **errp) 3197 { 3198 X86CPU *cpu = X86_CPU(obj); 3199 CPUX86State *env = &cpu->env; 3200 const int64_t min = 0; 3201 const int64_t max = 0xff + 0xf; 3202 Error *local_err = NULL; 3203 int64_t value; 3204 3205 visit_type_int(v, name, &value, &local_err); 3206 if (local_err) { 3207 error_propagate(errp, local_err); 3208 return; 3209 } 3210 if (value < min || value > max) { 3211 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "", 3212 name ? name : "null", value, min, max); 3213 return; 3214 } 3215 3216 env->cpuid_version &= ~0xff00f00; 3217 if (value > 0x0f) { 3218 env->cpuid_version |= 0xf00 | ((value - 0x0f) << 20); 3219 } else { 3220 env->cpuid_version |= value << 8; 3221 } 3222 } 3223 3224 static void x86_cpuid_version_get_model(Object *obj, Visitor *v, 3225 const char *name, void *opaque, 3226 Error **errp) 3227 { 3228 X86CPU *cpu = X86_CPU(obj); 3229 CPUX86State *env = &cpu->env; 3230 int64_t value; 3231 3232 value = (env->cpuid_version >> 4) & 0xf; 3233 value |= ((env->cpuid_version >> 16) & 0xf) << 4; 3234 visit_type_int(v, name, &value, errp); 3235 } 3236 3237 static void x86_cpuid_version_set_model(Object *obj, Visitor *v, 3238 const char *name, void *opaque, 3239 Error **errp) 3240 { 3241 X86CPU *cpu = X86_CPU(obj); 3242 CPUX86State *env = &cpu->env; 3243 const int64_t min = 0; 3244 const int64_t max = 0xff; 3245 Error *local_err = NULL; 3246 int64_t value; 3247 3248 visit_type_int(v, name, &value, &local_err); 3249 if (local_err) { 3250 error_propagate(errp, local_err); 3251 return; 3252 } 3253 if (value < min || value > max) { 3254 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "", 3255 name ? name : "null", value, min, max); 3256 return; 3257 } 3258 3259 env->cpuid_version &= ~0xf00f0; 3260 env->cpuid_version |= ((value & 0xf) << 4) | ((value >> 4) << 16); 3261 } 3262 3263 static void x86_cpuid_version_get_stepping(Object *obj, Visitor *v, 3264 const char *name, void *opaque, 3265 Error **errp) 3266 { 3267 X86CPU *cpu = X86_CPU(obj); 3268 CPUX86State *env = &cpu->env; 3269 int64_t value; 3270 3271 value = env->cpuid_version & 0xf; 3272 visit_type_int(v, name, &value, errp); 3273 } 3274 3275 static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v, 3276 const char *name, void *opaque, 3277 Error **errp) 3278 { 3279 X86CPU *cpu = X86_CPU(obj); 3280 CPUX86State *env = &cpu->env; 3281 const int64_t min = 0; 3282 const int64_t max = 0xf; 3283 Error *local_err = NULL; 3284 int64_t value; 3285 3286 visit_type_int(v, name, &value, &local_err); 3287 if (local_err) { 3288 error_propagate(errp, local_err); 3289 return; 3290 } 3291 if (value < min || value > max) { 3292 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "", 3293 name ? name : "null", value, min, max); 3294 return; 3295 } 3296 3297 env->cpuid_version &= ~0xf; 3298 env->cpuid_version |= value & 0xf; 3299 } 3300 3301 static char *x86_cpuid_get_vendor(Object *obj, Error **errp) 3302 { 3303 X86CPU *cpu = X86_CPU(obj); 3304 CPUX86State *env = &cpu->env; 3305 char *value; 3306 3307 value = g_malloc(CPUID_VENDOR_SZ + 1); 3308 x86_cpu_vendor_words2str(value, env->cpuid_vendor1, env->cpuid_vendor2, 3309 env->cpuid_vendor3); 3310 return value; 3311 } 3312 3313 static void x86_cpuid_set_vendor(Object *obj, const char *value, 3314 Error **errp) 3315 { 3316 X86CPU *cpu = X86_CPU(obj); 3317 CPUX86State *env = &cpu->env; 3318 int i; 3319 3320 if (strlen(value) != CPUID_VENDOR_SZ) { 3321 error_setg(errp, QERR_PROPERTY_VALUE_BAD, "", "vendor", value); 3322 return; 3323 } 3324 3325 env->cpuid_vendor1 = 0; 3326 env->cpuid_vendor2 = 0; 3327 env->cpuid_vendor3 = 0; 3328 for (i = 0; i < 4; i++) { 3329 env->cpuid_vendor1 |= ((uint8_t)value[i ]) << (8 * i); 3330 env->cpuid_vendor2 |= ((uint8_t)value[i + 4]) << (8 * i); 3331 env->cpuid_vendor3 |= ((uint8_t)value[i + 8]) << (8 * i); 3332 } 3333 } 3334 3335 static char *x86_cpuid_get_model_id(Object *obj, Error **errp) 3336 { 3337 X86CPU *cpu = X86_CPU(obj); 3338 CPUX86State *env = &cpu->env; 3339 char *value; 3340 int i; 3341 3342 value = g_malloc(48 + 1); 3343 for (i = 0; i < 48; i++) { 3344 value[i] = env->cpuid_model[i >> 2] >> (8 * (i & 3)); 3345 } 3346 value[48] = '\0'; 3347 return value; 3348 } 3349 3350 static void x86_cpuid_set_model_id(Object *obj, const char *model_id, 3351 Error **errp) 3352 { 3353 X86CPU *cpu = X86_CPU(obj); 3354 CPUX86State *env = &cpu->env; 3355 int c, len, i; 3356 3357 if (model_id == NULL) { 3358 model_id = ""; 3359 } 3360 len = strlen(model_id); 3361 memset(env->cpuid_model, 0, 48); 3362 for (i = 0; i < 48; i++) { 3363 if (i >= len) { 3364 c = '\0'; 3365 } else { 3366 c = (uint8_t)model_id[i]; 3367 } 3368 env->cpuid_model[i >> 2] |= c << (8 * (i & 3)); 3369 } 3370 } 3371 3372 static void x86_cpuid_get_tsc_freq(Object *obj, Visitor *v, const char *name, 3373 void *opaque, Error **errp) 3374 { 3375 X86CPU *cpu = X86_CPU(obj); 3376 int64_t value; 3377 3378 value = cpu->env.tsc_khz * 1000; 3379 visit_type_int(v, name, &value, errp); 3380 } 3381 3382 static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name, 3383 void *opaque, Error **errp) 3384 { 3385 X86CPU *cpu = X86_CPU(obj); 3386 const int64_t min = 0; 3387 const int64_t max = INT64_MAX; 3388 Error *local_err = NULL; 3389 int64_t value; 3390 3391 visit_type_int(v, name, &value, &local_err); 3392 if (local_err) { 3393 error_propagate(errp, local_err); 3394 return; 3395 } 3396 if (value < min || value > max) { 3397 error_setg(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "", 3398 name ? name : "null", value, min, max); 3399 return; 3400 } 3401 3402 cpu->env.tsc_khz = cpu->env.user_tsc_khz = value / 1000; 3403 } 3404 3405 /* Generic getter for "feature-words" and "filtered-features" properties */ 3406 static void x86_cpu_get_feature_words(Object *obj, Visitor *v, 3407 const char *name, void *opaque, 3408 Error **errp) 3409 { 3410 uint32_t *array = (uint32_t *)opaque; 3411 FeatureWord w; 3412 X86CPUFeatureWordInfo word_infos[FEATURE_WORDS] = { }; 3413 X86CPUFeatureWordInfoList list_entries[FEATURE_WORDS] = { }; 3414 X86CPUFeatureWordInfoList *list = NULL; 3415 3416 for (w = 0; w < FEATURE_WORDS; w++) { 3417 FeatureWordInfo *wi = &feature_word_info[w]; 3418 /* 3419 * We didn't have MSR features when "feature-words" was 3420 * introduced. Therefore skipped other type entries. 3421 */ 3422 if (wi->type != CPUID_FEATURE_WORD) { 3423 continue; 3424 } 3425 X86CPUFeatureWordInfo *qwi = &word_infos[w]; 3426 qwi->cpuid_input_eax = wi->cpuid.eax; 3427 qwi->has_cpuid_input_ecx = wi->cpuid.needs_ecx; 3428 qwi->cpuid_input_ecx = wi->cpuid.ecx; 3429 qwi->cpuid_register = x86_reg_info_32[wi->cpuid.reg].qapi_enum; 3430 qwi->features = array[w]; 3431 3432 /* List will be in reverse order, but order shouldn't matter */ 3433 list_entries[w].next = list; 3434 list_entries[w].value = &word_infos[w]; 3435 list = &list_entries[w]; 3436 } 3437 3438 visit_type_X86CPUFeatureWordInfoList(v, "feature-words", &list, errp); 3439 } 3440 3441 static void x86_get_hv_spinlocks(Object *obj, Visitor *v, const char *name, 3442 void *opaque, Error **errp) 3443 { 3444 X86CPU *cpu = X86_CPU(obj); 3445 int64_t value = cpu->hyperv_spinlock_attempts; 3446 3447 visit_type_int(v, name, &value, errp); 3448 } 3449 3450 static void x86_set_hv_spinlocks(Object *obj, Visitor *v, const char *name, 3451 void *opaque, Error **errp) 3452 { 3453 const int64_t min = 0xFFF; 3454 const int64_t max = UINT_MAX; 3455 X86CPU *cpu = X86_CPU(obj); 3456 Error *err = NULL; 3457 int64_t value; 3458 3459 visit_type_int(v, name, &value, &err); 3460 if (err) { 3461 error_propagate(errp, err); 3462 return; 3463 } 3464 3465 if (value < min || value > max) { 3466 error_setg(errp, "Property %s.%s doesn't take value %" PRId64 3467 " (minimum: %" PRId64 ", maximum: %" PRId64 ")", 3468 object_get_typename(obj), name ? name : "null", 3469 value, min, max); 3470 return; 3471 } 3472 cpu->hyperv_spinlock_attempts = value; 3473 } 3474 3475 static const PropertyInfo qdev_prop_spinlocks = { 3476 .name = "int", 3477 .get = x86_get_hv_spinlocks, 3478 .set = x86_set_hv_spinlocks, 3479 }; 3480 3481 /* Convert all '_' in a feature string option name to '-', to make feature 3482 * name conform to QOM property naming rule, which uses '-' instead of '_'. 3483 */ 3484 static inline void feat2prop(char *s) 3485 { 3486 while ((s = strchr(s, '_'))) { 3487 *s = '-'; 3488 } 3489 } 3490 3491 /* Return the feature property name for a feature flag bit */ 3492 static const char *x86_cpu_feature_name(FeatureWord w, int bitnr) 3493 { 3494 /* XSAVE components are automatically enabled by other features, 3495 * so return the original feature name instead 3496 */ 3497 if (w == FEAT_XSAVE_COMP_LO || w == FEAT_XSAVE_COMP_HI) { 3498 int comp = (w == FEAT_XSAVE_COMP_HI) ? bitnr + 32 : bitnr; 3499 3500 if (comp < ARRAY_SIZE(x86_ext_save_areas) && 3501 x86_ext_save_areas[comp].bits) { 3502 w = x86_ext_save_areas[comp].feature; 3503 bitnr = ctz32(x86_ext_save_areas[comp].bits); 3504 } 3505 } 3506 3507 assert(bitnr < 32); 3508 assert(w < FEATURE_WORDS); 3509 return feature_word_info[w].feat_names[bitnr]; 3510 } 3511 3512 /* Compatibily hack to maintain legacy +-feat semantic, 3513 * where +-feat overwrites any feature set by 3514 * feat=on|feat even if the later is parsed after +-feat 3515 * (i.e. "-x2apic,x2apic=on" will result in x2apic disabled) 3516 */ 3517 static GList *plus_features, *minus_features; 3518 3519 static gint compare_string(gconstpointer a, gconstpointer b) 3520 { 3521 return g_strcmp0(a, b); 3522 } 3523 3524 /* Parse "+feature,-feature,feature=foo" CPU feature string 3525 */ 3526 static void x86_cpu_parse_featurestr(const char *typename, char *features, 3527 Error **errp) 3528 { 3529 char *featurestr; /* Single 'key=value" string being parsed */ 3530 static bool cpu_globals_initialized; 3531 bool ambiguous = false; 3532 3533 if (cpu_globals_initialized) { 3534 return; 3535 } 3536 cpu_globals_initialized = true; 3537 3538 if (!features) { 3539 return; 3540 } 3541 3542 for (featurestr = strtok(features, ","); 3543 featurestr; 3544 featurestr = strtok(NULL, ",")) { 3545 const char *name; 3546 const char *val = NULL; 3547 char *eq = NULL; 3548 char num[32]; 3549 GlobalProperty *prop; 3550 3551 /* Compatibility syntax: */ 3552 if (featurestr[0] == '+') { 3553 plus_features = g_list_append(plus_features, 3554 g_strdup(featurestr + 1)); 3555 continue; 3556 } else if (featurestr[0] == '-') { 3557 minus_features = g_list_append(minus_features, 3558 g_strdup(featurestr + 1)); 3559 continue; 3560 } 3561 3562 eq = strchr(featurestr, '='); 3563 if (eq) { 3564 *eq++ = 0; 3565 val = eq; 3566 } else { 3567 val = "on"; 3568 } 3569 3570 feat2prop(featurestr); 3571 name = featurestr; 3572 3573 if (g_list_find_custom(plus_features, name, compare_string)) { 3574 warn_report("Ambiguous CPU model string. " 3575 "Don't mix both \"+%s\" and \"%s=%s\"", 3576 name, name, val); 3577 ambiguous = true; 3578 } 3579 if (g_list_find_custom(minus_features, name, compare_string)) { 3580 warn_report("Ambiguous CPU model string. " 3581 "Don't mix both \"-%s\" and \"%s=%s\"", 3582 name, name, val); 3583 ambiguous = true; 3584 } 3585 3586 /* Special case: */ 3587 if (!strcmp(name, "tsc-freq")) { 3588 int ret; 3589 uint64_t tsc_freq; 3590 3591 ret = qemu_strtosz_metric(val, NULL, &tsc_freq); 3592 if (ret < 0 || tsc_freq > INT64_MAX) { 3593 error_setg(errp, "bad numerical value %s", val); 3594 return; 3595 } 3596 snprintf(num, sizeof(num), "%" PRId64, tsc_freq); 3597 val = num; 3598 name = "tsc-frequency"; 3599 } 3600 3601 prop = g_new0(typeof(*prop), 1); 3602 prop->driver = typename; 3603 prop->property = g_strdup(name); 3604 prop->value = g_strdup(val); 3605 qdev_prop_register_global(prop); 3606 } 3607 3608 if (ambiguous) { 3609 warn_report("Compatibility of ambiguous CPU model " 3610 "strings won't be kept on future QEMU versions"); 3611 } 3612 } 3613 3614 static void x86_cpu_expand_features(X86CPU *cpu, Error **errp); 3615 static int x86_cpu_filter_features(X86CPU *cpu); 3616 3617 /* Check for missing features that may prevent the CPU class from 3618 * running using the current machine and accelerator. 3619 */ 3620 static void x86_cpu_class_check_missing_features(X86CPUClass *xcc, 3621 strList **missing_feats) 3622 { 3623 X86CPU *xc; 3624 FeatureWord w; 3625 Error *err = NULL; 3626 strList **next = missing_feats; 3627 3628 if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) { 3629 strList *new = g_new0(strList, 1); 3630 new->value = g_strdup("kvm"); 3631 *missing_feats = new; 3632 return; 3633 } 3634 3635 xc = X86_CPU(object_new(object_class_get_name(OBJECT_CLASS(xcc)))); 3636 3637 x86_cpu_expand_features(xc, &err); 3638 if (err) { 3639 /* Errors at x86_cpu_expand_features should never happen, 3640 * but in case it does, just report the model as not 3641 * runnable at all using the "type" property. 3642 */ 3643 strList *new = g_new0(strList, 1); 3644 new->value = g_strdup("type"); 3645 *next = new; 3646 next = &new->next; 3647 } 3648 3649 x86_cpu_filter_features(xc); 3650 3651 for (w = 0; w < FEATURE_WORDS; w++) { 3652 uint32_t filtered = xc->filtered_features[w]; 3653 int i; 3654 for (i = 0; i < 32; i++) { 3655 if (filtered & (1UL << i)) { 3656 strList *new = g_new0(strList, 1); 3657 new->value = g_strdup(x86_cpu_feature_name(w, i)); 3658 *next = new; 3659 next = &new->next; 3660 } 3661 } 3662 } 3663 3664 object_unref(OBJECT(xc)); 3665 } 3666 3667 /* Print all cpuid feature names in featureset 3668 */ 3669 static void listflags(FILE *f, fprintf_function print, GList *features) 3670 { 3671 size_t len = 0; 3672 GList *tmp; 3673 3674 for (tmp = features; tmp; tmp = tmp->next) { 3675 const char *name = tmp->data; 3676 if ((len + strlen(name) + 1) >= 75) { 3677 print(f, "\n"); 3678 len = 0; 3679 } 3680 print(f, "%s%s", len == 0 ? " " : " ", name); 3681 len += strlen(name) + 1; 3682 } 3683 print(f, "\n"); 3684 } 3685 3686 /* Sort alphabetically by type name, respecting X86CPUClass::ordering. */ 3687 static gint x86_cpu_list_compare(gconstpointer a, gconstpointer b) 3688 { 3689 ObjectClass *class_a = (ObjectClass *)a; 3690 ObjectClass *class_b = (ObjectClass *)b; 3691 X86CPUClass *cc_a = X86_CPU_CLASS(class_a); 3692 X86CPUClass *cc_b = X86_CPU_CLASS(class_b); 3693 char *name_a, *name_b; 3694 int ret; 3695 3696 if (cc_a->ordering != cc_b->ordering) { 3697 ret = cc_a->ordering - cc_b->ordering; 3698 } else { 3699 name_a = x86_cpu_class_get_model_name(cc_a); 3700 name_b = x86_cpu_class_get_model_name(cc_b); 3701 ret = strcmp(name_a, name_b); 3702 g_free(name_a); 3703 g_free(name_b); 3704 } 3705 return ret; 3706 } 3707 3708 static GSList *get_sorted_cpu_model_list(void) 3709 { 3710 GSList *list = object_class_get_list(TYPE_X86_CPU, false); 3711 list = g_slist_sort(list, x86_cpu_list_compare); 3712 return list; 3713 } 3714 3715 static void x86_cpu_list_entry(gpointer data, gpointer user_data) 3716 { 3717 ObjectClass *oc = data; 3718 X86CPUClass *cc = X86_CPU_CLASS(oc); 3719 CPUListState *s = user_data; 3720 char *name = x86_cpu_class_get_model_name(cc); 3721 const char *desc = cc->model_description; 3722 if (!desc && cc->cpu_def) { 3723 desc = cc->cpu_def->model_id; 3724 } 3725 3726 (*s->cpu_fprintf)(s->file, "x86 %-20s %-48s\n", 3727 name, desc); 3728 g_free(name); 3729 } 3730 3731 /* list available CPU models and flags */ 3732 void x86_cpu_list(FILE *f, fprintf_function cpu_fprintf) 3733 { 3734 int i, j; 3735 CPUListState s = { 3736 .file = f, 3737 .cpu_fprintf = cpu_fprintf, 3738 }; 3739 GSList *list; 3740 GList *names = NULL; 3741 3742 (*cpu_fprintf)(f, "Available CPUs:\n"); 3743 list = get_sorted_cpu_model_list(); 3744 g_slist_foreach(list, x86_cpu_list_entry, &s); 3745 g_slist_free(list); 3746 3747 names = NULL; 3748 for (i = 0; i < ARRAY_SIZE(feature_word_info); i++) { 3749 FeatureWordInfo *fw = &feature_word_info[i]; 3750 for (j = 0; j < 32; j++) { 3751 if (fw->feat_names[j]) { 3752 names = g_list_append(names, (gpointer)fw->feat_names[j]); 3753 } 3754 } 3755 } 3756 3757 names = g_list_sort(names, (GCompareFunc)strcmp); 3758 3759 (*cpu_fprintf)(f, "\nRecognized CPUID flags:\n"); 3760 listflags(f, cpu_fprintf, names); 3761 (*cpu_fprintf)(f, "\n"); 3762 g_list_free(names); 3763 } 3764 3765 static void x86_cpu_definition_entry(gpointer data, gpointer user_data) 3766 { 3767 ObjectClass *oc = data; 3768 X86CPUClass *cc = X86_CPU_CLASS(oc); 3769 CpuDefinitionInfoList **cpu_list = user_data; 3770 CpuDefinitionInfoList *entry; 3771 CpuDefinitionInfo *info; 3772 3773 info = g_malloc0(sizeof(*info)); 3774 info->name = x86_cpu_class_get_model_name(cc); 3775 x86_cpu_class_check_missing_features(cc, &info->unavailable_features); 3776 info->has_unavailable_features = true; 3777 info->q_typename = g_strdup(object_class_get_name(oc)); 3778 info->migration_safe = cc->migration_safe; 3779 info->has_migration_safe = true; 3780 info->q_static = cc->static_model; 3781 3782 entry = g_malloc0(sizeof(*entry)); 3783 entry->value = info; 3784 entry->next = *cpu_list; 3785 *cpu_list = entry; 3786 } 3787 3788 CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp) 3789 { 3790 CpuDefinitionInfoList *cpu_list = NULL; 3791 GSList *list = get_sorted_cpu_model_list(); 3792 g_slist_foreach(list, x86_cpu_definition_entry, &cpu_list); 3793 g_slist_free(list); 3794 return cpu_list; 3795 } 3796 3797 static uint32_t x86_cpu_get_supported_feature_word(FeatureWord w, 3798 bool migratable_only) 3799 { 3800 FeatureWordInfo *wi = &feature_word_info[w]; 3801 uint32_t r = 0; 3802 3803 if (kvm_enabled()) { 3804 switch (wi->type) { 3805 case CPUID_FEATURE_WORD: 3806 r = kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid.eax, 3807 wi->cpuid.ecx, 3808 wi->cpuid.reg); 3809 break; 3810 case MSR_FEATURE_WORD: 3811 r = kvm_arch_get_supported_msr_feature(kvm_state, 3812 wi->msr.index); 3813 break; 3814 } 3815 } else if (hvf_enabled()) { 3816 if (wi->type != CPUID_FEATURE_WORD) { 3817 return 0; 3818 } 3819 r = hvf_get_supported_cpuid(wi->cpuid.eax, 3820 wi->cpuid.ecx, 3821 wi->cpuid.reg); 3822 } else if (tcg_enabled()) { 3823 r = wi->tcg_features; 3824 } else { 3825 return ~0; 3826 } 3827 if (migratable_only) { 3828 r &= x86_cpu_get_migratable_flags(w); 3829 } 3830 return r; 3831 } 3832 3833 static void x86_cpu_report_filtered_features(X86CPU *cpu) 3834 { 3835 FeatureWord w; 3836 3837 for (w = 0; w < FEATURE_WORDS; w++) { 3838 report_unavailable_features(w, cpu->filtered_features[w]); 3839 } 3840 } 3841 3842 static void x86_cpu_apply_props(X86CPU *cpu, PropValue *props) 3843 { 3844 PropValue *pv; 3845 for (pv = props; pv->prop; pv++) { 3846 if (!pv->value) { 3847 continue; 3848 } 3849 object_property_parse(OBJECT(cpu), pv->value, pv->prop, 3850 &error_abort); 3851 } 3852 } 3853 3854 /* Load data from X86CPUDefinition into a X86CPU object 3855 */ 3856 static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp) 3857 { 3858 CPUX86State *env = &cpu->env; 3859 const char *vendor; 3860 char host_vendor[CPUID_VENDOR_SZ + 1]; 3861 FeatureWord w; 3862 3863 /*NOTE: any property set by this function should be returned by 3864 * x86_cpu_static_props(), so static expansion of 3865 * query-cpu-model-expansion is always complete. 3866 */ 3867 3868 /* CPU models only set _minimum_ values for level/xlevel: */ 3869 object_property_set_uint(OBJECT(cpu), def->level, "min-level", errp); 3870 object_property_set_uint(OBJECT(cpu), def->xlevel, "min-xlevel", errp); 3871 3872 object_property_set_int(OBJECT(cpu), def->family, "family", errp); 3873 object_property_set_int(OBJECT(cpu), def->model, "model", errp); 3874 object_property_set_int(OBJECT(cpu), def->stepping, "stepping", errp); 3875 object_property_set_str(OBJECT(cpu), def->model_id, "model-id", errp); 3876 for (w = 0; w < FEATURE_WORDS; w++) { 3877 env->features[w] = def->features[w]; 3878 } 3879 3880 /* legacy-cache defaults to 'off' if CPU model provides cache info */ 3881 cpu->legacy_cache = !def->cache_info; 3882 3883 /* Special cases not set in the X86CPUDefinition structs: */ 3884 /* TODO: in-kernel irqchip for hvf */ 3885 if (kvm_enabled()) { 3886 if (!kvm_irqchip_in_kernel()) { 3887 x86_cpu_change_kvm_default("x2apic", "off"); 3888 } 3889 3890 x86_cpu_apply_props(cpu, kvm_default_props); 3891 } else if (tcg_enabled()) { 3892 x86_cpu_apply_props(cpu, tcg_default_props); 3893 } 3894 3895 env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR; 3896 3897 /* sysenter isn't supported in compatibility mode on AMD, 3898 * syscall isn't supported in compatibility mode on Intel. 3899 * Normally we advertise the actual CPU vendor, but you can 3900 * override this using the 'vendor' property if you want to use 3901 * KVM's sysenter/syscall emulation in compatibility mode and 3902 * when doing cross vendor migration 3903 */ 3904 vendor = def->vendor; 3905 if (accel_uses_host_cpuid()) { 3906 uint32_t ebx = 0, ecx = 0, edx = 0; 3907 host_cpuid(0, 0, NULL, &ebx, &ecx, &edx); 3908 x86_cpu_vendor_words2str(host_vendor, ebx, edx, ecx); 3909 vendor = host_vendor; 3910 } 3911 3912 object_property_set_str(OBJECT(cpu), vendor, "vendor", errp); 3913 3914 } 3915 3916 /* Return a QDict containing keys for all properties that can be included 3917 * in static expansion of CPU models. All properties set by x86_cpu_load_def() 3918 * must be included in the dictionary. 3919 */ 3920 static QDict *x86_cpu_static_props(void) 3921 { 3922 FeatureWord w; 3923 int i; 3924 static const char *props[] = { 3925 "min-level", 3926 "min-xlevel", 3927 "family", 3928 "model", 3929 "stepping", 3930 "model-id", 3931 "vendor", 3932 "lmce", 3933 NULL, 3934 }; 3935 static QDict *d; 3936 3937 if (d) { 3938 return d; 3939 } 3940 3941 d = qdict_new(); 3942 for (i = 0; props[i]; i++) { 3943 qdict_put_null(d, props[i]); 3944 } 3945 3946 for (w = 0; w < FEATURE_WORDS; w++) { 3947 FeatureWordInfo *fi = &feature_word_info[w]; 3948 int bit; 3949 for (bit = 0; bit < 32; bit++) { 3950 if (!fi->feat_names[bit]) { 3951 continue; 3952 } 3953 qdict_put_null(d, fi->feat_names[bit]); 3954 } 3955 } 3956 3957 return d; 3958 } 3959 3960 /* Add an entry to @props dict, with the value for property. */ 3961 static void x86_cpu_expand_prop(X86CPU *cpu, QDict *props, const char *prop) 3962 { 3963 QObject *value = object_property_get_qobject(OBJECT(cpu), prop, 3964 &error_abort); 3965 3966 qdict_put_obj(props, prop, value); 3967 } 3968 3969 /* Convert CPU model data from X86CPU object to a property dictionary 3970 * that can recreate exactly the same CPU model. 3971 */ 3972 static void x86_cpu_to_dict(X86CPU *cpu, QDict *props) 3973 { 3974 QDict *sprops = x86_cpu_static_props(); 3975 const QDictEntry *e; 3976 3977 for (e = qdict_first(sprops); e; e = qdict_next(sprops, e)) { 3978 const char *prop = qdict_entry_key(e); 3979 x86_cpu_expand_prop(cpu, props, prop); 3980 } 3981 } 3982 3983 /* Convert CPU model data from X86CPU object to a property dictionary 3984 * that can recreate exactly the same CPU model, including every 3985 * writeable QOM property. 3986 */ 3987 static void x86_cpu_to_dict_full(X86CPU *cpu, QDict *props) 3988 { 3989 ObjectPropertyIterator iter; 3990 ObjectProperty *prop; 3991 3992 object_property_iter_init(&iter, OBJECT(cpu)); 3993 while ((prop = object_property_iter_next(&iter))) { 3994 /* skip read-only or write-only properties */ 3995 if (!prop->get || !prop->set) { 3996 continue; 3997 } 3998 3999 /* "hotplugged" is the only property that is configurable 4000 * on the command-line but will be set differently on CPUs 4001 * created using "-cpu ... -smp ..." and by CPUs created 4002 * on the fly by x86_cpu_from_model() for querying. Skip it. 4003 */ 4004 if (!strcmp(prop->name, "hotplugged")) { 4005 continue; 4006 } 4007 x86_cpu_expand_prop(cpu, props, prop->name); 4008 } 4009 } 4010 4011 static void object_apply_props(Object *obj, QDict *props, Error **errp) 4012 { 4013 const QDictEntry *prop; 4014 Error *err = NULL; 4015 4016 for (prop = qdict_first(props); prop; prop = qdict_next(props, prop)) { 4017 object_property_set_qobject(obj, qdict_entry_value(prop), 4018 qdict_entry_key(prop), &err); 4019 if (err) { 4020 break; 4021 } 4022 } 4023 4024 error_propagate(errp, err); 4025 } 4026 4027 /* Create X86CPU object according to model+props specification */ 4028 static X86CPU *x86_cpu_from_model(const char *model, QDict *props, Error **errp) 4029 { 4030 X86CPU *xc = NULL; 4031 X86CPUClass *xcc; 4032 Error *err = NULL; 4033 4034 xcc = X86_CPU_CLASS(cpu_class_by_name(TYPE_X86_CPU, model)); 4035 if (xcc == NULL) { 4036 error_setg(&err, "CPU model '%s' not found", model); 4037 goto out; 4038 } 4039 4040 xc = X86_CPU(object_new(object_class_get_name(OBJECT_CLASS(xcc)))); 4041 if (props) { 4042 object_apply_props(OBJECT(xc), props, &err); 4043 if (err) { 4044 goto out; 4045 } 4046 } 4047 4048 x86_cpu_expand_features(xc, &err); 4049 if (err) { 4050 goto out; 4051 } 4052 4053 out: 4054 if (err) { 4055 error_propagate(errp, err); 4056 object_unref(OBJECT(xc)); 4057 xc = NULL; 4058 } 4059 return xc; 4060 } 4061 4062 CpuModelExpansionInfo * 4063 arch_query_cpu_model_expansion(CpuModelExpansionType type, 4064 CpuModelInfo *model, 4065 Error **errp) 4066 { 4067 X86CPU *xc = NULL; 4068 Error *err = NULL; 4069 CpuModelExpansionInfo *ret = g_new0(CpuModelExpansionInfo, 1); 4070 QDict *props = NULL; 4071 const char *base_name; 4072 4073 xc = x86_cpu_from_model(model->name, 4074 model->has_props ? 4075 qobject_to(QDict, model->props) : 4076 NULL, &err); 4077 if (err) { 4078 goto out; 4079 } 4080 4081 props = qdict_new(); 4082 ret->model = g_new0(CpuModelInfo, 1); 4083 ret->model->props = QOBJECT(props); 4084 ret->model->has_props = true; 4085 4086 switch (type) { 4087 case CPU_MODEL_EXPANSION_TYPE_STATIC: 4088 /* Static expansion will be based on "base" only */ 4089 base_name = "base"; 4090 x86_cpu_to_dict(xc, props); 4091 break; 4092 case CPU_MODEL_EXPANSION_TYPE_FULL: 4093 /* As we don't return every single property, full expansion needs 4094 * to keep the original model name+props, and add extra 4095 * properties on top of that. 4096 */ 4097 base_name = model->name; 4098 x86_cpu_to_dict_full(xc, props); 4099 break; 4100 default: 4101 error_setg(&err, "Unsupported expansion type"); 4102 goto out; 4103 } 4104 4105 x86_cpu_to_dict(xc, props); 4106 4107 ret->model->name = g_strdup(base_name); 4108 4109 out: 4110 object_unref(OBJECT(xc)); 4111 if (err) { 4112 error_propagate(errp, err); 4113 qapi_free_CpuModelExpansionInfo(ret); 4114 ret = NULL; 4115 } 4116 return ret; 4117 } 4118 4119 static gchar *x86_gdb_arch_name(CPUState *cs) 4120 { 4121 #ifdef TARGET_X86_64 4122 return g_strdup("i386:x86-64"); 4123 #else 4124 return g_strdup("i386"); 4125 #endif 4126 } 4127 4128 static void x86_cpu_cpudef_class_init(ObjectClass *oc, void *data) 4129 { 4130 X86CPUDefinition *cpudef = data; 4131 X86CPUClass *xcc = X86_CPU_CLASS(oc); 4132 4133 xcc->cpu_def = cpudef; 4134 xcc->migration_safe = true; 4135 } 4136 4137 static void x86_register_cpudef_type(X86CPUDefinition *def) 4138 { 4139 char *typename = x86_cpu_type_name(def->name); 4140 TypeInfo ti = { 4141 .name = typename, 4142 .parent = TYPE_X86_CPU, 4143 .class_init = x86_cpu_cpudef_class_init, 4144 .class_data = def, 4145 }; 4146 4147 /* AMD aliases are handled at runtime based on CPUID vendor, so 4148 * they shouldn't be set on the CPU model table. 4149 */ 4150 assert(!(def->features[FEAT_8000_0001_EDX] & CPUID_EXT2_AMD_ALIASES)); 4151 /* catch mistakes instead of silently truncating model_id when too long */ 4152 assert(def->model_id && strlen(def->model_id) <= 48); 4153 4154 4155 type_register(&ti); 4156 g_free(typename); 4157 } 4158 4159 #if !defined(CONFIG_USER_ONLY) 4160 4161 void cpu_clear_apic_feature(CPUX86State *env) 4162 { 4163 env->features[FEAT_1_EDX] &= ~CPUID_APIC; 4164 } 4165 4166 #endif /* !CONFIG_USER_ONLY */ 4167 4168 void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, 4169 uint32_t *eax, uint32_t *ebx, 4170 uint32_t *ecx, uint32_t *edx) 4171 { 4172 X86CPU *cpu = x86_env_get_cpu(env); 4173 CPUState *cs = CPU(cpu); 4174 uint32_t pkg_offset; 4175 uint32_t limit; 4176 uint32_t signature[3]; 4177 4178 /* Calculate & apply limits for different index ranges */ 4179 if (index >= 0xC0000000) { 4180 limit = env->cpuid_xlevel2; 4181 } else if (index >= 0x80000000) { 4182 limit = env->cpuid_xlevel; 4183 } else if (index >= 0x40000000) { 4184 limit = 0x40000001; 4185 } else { 4186 limit = env->cpuid_level; 4187 } 4188 4189 if (index > limit) { 4190 /* Intel documentation states that invalid EAX input will 4191 * return the same information as EAX=cpuid_level 4192 * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID) 4193 */ 4194 index = env->cpuid_level; 4195 } 4196 4197 switch(index) { 4198 case 0: 4199 *eax = env->cpuid_level; 4200 *ebx = env->cpuid_vendor1; 4201 *edx = env->cpuid_vendor2; 4202 *ecx = env->cpuid_vendor3; 4203 break; 4204 case 1: 4205 *eax = env->cpuid_version; 4206 *ebx = (cpu->apic_id << 24) | 4207 8 << 8; /* CLFLUSH size in quad words, Linux wants it. */ 4208 *ecx = env->features[FEAT_1_ECX]; 4209 if ((*ecx & CPUID_EXT_XSAVE) && (env->cr[4] & CR4_OSXSAVE_MASK)) { 4210 *ecx |= CPUID_EXT_OSXSAVE; 4211 } 4212 *edx = env->features[FEAT_1_EDX]; 4213 if (cs->nr_cores * cs->nr_threads > 1) { 4214 *ebx |= (cs->nr_cores * cs->nr_threads) << 16; 4215 *edx |= CPUID_HT; 4216 } 4217 break; 4218 case 2: 4219 /* cache info: needed for Pentium Pro compatibility */ 4220 if (cpu->cache_info_passthrough) { 4221 host_cpuid(index, 0, eax, ebx, ecx, edx); 4222 break; 4223 } 4224 *eax = 1; /* Number of CPUID[EAX=2] calls required */ 4225 *ebx = 0; 4226 if (!cpu->enable_l3_cache) { 4227 *ecx = 0; 4228 } else { 4229 *ecx = cpuid2_cache_descriptor(env->cache_info_cpuid2.l3_cache); 4230 } 4231 *edx = (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1d_cache) << 16) | 4232 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1i_cache) << 8) | 4233 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l2_cache)); 4234 break; 4235 case 4: 4236 /* cache info: needed for Core compatibility */ 4237 if (cpu->cache_info_passthrough) { 4238 host_cpuid(index, count, eax, ebx, ecx, edx); 4239 /* QEMU gives out its own APIC IDs, never pass down bits 31..26. */ 4240 *eax &= ~0xFC000000; 4241 if ((*eax & 31) && cs->nr_cores > 1) { 4242 *eax |= (cs->nr_cores - 1) << 26; 4243 } 4244 } else { 4245 *eax = 0; 4246 switch (count) { 4247 case 0: /* L1 dcache info */ 4248 encode_cache_cpuid4(env->cache_info_cpuid4.l1d_cache, 4249 1, cs->nr_cores, 4250 eax, ebx, ecx, edx); 4251 break; 4252 case 1: /* L1 icache info */ 4253 encode_cache_cpuid4(env->cache_info_cpuid4.l1i_cache, 4254 1, cs->nr_cores, 4255 eax, ebx, ecx, edx); 4256 break; 4257 case 2: /* L2 cache info */ 4258 encode_cache_cpuid4(env->cache_info_cpuid4.l2_cache, 4259 cs->nr_threads, cs->nr_cores, 4260 eax, ebx, ecx, edx); 4261 break; 4262 case 3: /* L3 cache info */ 4263 pkg_offset = apicid_pkg_offset(cs->nr_cores, cs->nr_threads); 4264 if (cpu->enable_l3_cache) { 4265 encode_cache_cpuid4(env->cache_info_cpuid4.l3_cache, 4266 (1 << pkg_offset), cs->nr_cores, 4267 eax, ebx, ecx, edx); 4268 break; 4269 } 4270 /* fall through */ 4271 default: /* end of info */ 4272 *eax = *ebx = *ecx = *edx = 0; 4273 break; 4274 } 4275 } 4276 break; 4277 case 5: 4278 /* MONITOR/MWAIT Leaf */ 4279 *eax = cpu->mwait.eax; /* Smallest monitor-line size in bytes */ 4280 *ebx = cpu->mwait.ebx; /* Largest monitor-line size in bytes */ 4281 *ecx = cpu->mwait.ecx; /* flags */ 4282 *edx = cpu->mwait.edx; /* mwait substates */ 4283 break; 4284 case 6: 4285 /* Thermal and Power Leaf */ 4286 *eax = env->features[FEAT_6_EAX]; 4287 *ebx = 0; 4288 *ecx = 0; 4289 *edx = 0; 4290 break; 4291 case 7: 4292 /* Structured Extended Feature Flags Enumeration Leaf */ 4293 if (count == 0) { 4294 *eax = 0; /* Maximum ECX value for sub-leaves */ 4295 *ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */ 4296 *ecx = env->features[FEAT_7_0_ECX]; /* Feature flags */ 4297 if ((*ecx & CPUID_7_0_ECX_PKU) && env->cr[4] & CR4_PKE_MASK) { 4298 *ecx |= CPUID_7_0_ECX_OSPKE; 4299 } 4300 *edx = env->features[FEAT_7_0_EDX]; /* Feature flags */ 4301 } else { 4302 *eax = 0; 4303 *ebx = 0; 4304 *ecx = 0; 4305 *edx = 0; 4306 } 4307 break; 4308 case 9: 4309 /* Direct Cache Access Information Leaf */ 4310 *eax = 0; /* Bits 0-31 in DCA_CAP MSR */ 4311 *ebx = 0; 4312 *ecx = 0; 4313 *edx = 0; 4314 break; 4315 case 0xA: 4316 /* Architectural Performance Monitoring Leaf */ 4317 if (kvm_enabled() && cpu->enable_pmu) { 4318 KVMState *s = cs->kvm_state; 4319 4320 *eax = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EAX); 4321 *ebx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EBX); 4322 *ecx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_ECX); 4323 *edx = kvm_arch_get_supported_cpuid(s, 0xA, count, R_EDX); 4324 } else if (hvf_enabled() && cpu->enable_pmu) { 4325 *eax = hvf_get_supported_cpuid(0xA, count, R_EAX); 4326 *ebx = hvf_get_supported_cpuid(0xA, count, R_EBX); 4327 *ecx = hvf_get_supported_cpuid(0xA, count, R_ECX); 4328 *edx = hvf_get_supported_cpuid(0xA, count, R_EDX); 4329 } else { 4330 *eax = 0; 4331 *ebx = 0; 4332 *ecx = 0; 4333 *edx = 0; 4334 } 4335 break; 4336 case 0xB: 4337 /* Extended Topology Enumeration Leaf */ 4338 if (!cpu->enable_cpuid_0xb) { 4339 *eax = *ebx = *ecx = *edx = 0; 4340 break; 4341 } 4342 4343 *ecx = count & 0xff; 4344 *edx = cpu->apic_id; 4345 4346 switch (count) { 4347 case 0: 4348 *eax = apicid_core_offset(cs->nr_cores, cs->nr_threads); 4349 *ebx = cs->nr_threads; 4350 *ecx |= CPUID_TOPOLOGY_LEVEL_SMT; 4351 break; 4352 case 1: 4353 *eax = apicid_pkg_offset(cs->nr_cores, cs->nr_threads); 4354 *ebx = cs->nr_cores * cs->nr_threads; 4355 *ecx |= CPUID_TOPOLOGY_LEVEL_CORE; 4356 break; 4357 default: 4358 *eax = 0; 4359 *ebx = 0; 4360 *ecx |= CPUID_TOPOLOGY_LEVEL_INVALID; 4361 } 4362 4363 assert(!(*eax & ~0x1f)); 4364 *ebx &= 0xffff; /* The count doesn't need to be reliable. */ 4365 break; 4366 case 0xD: { 4367 /* Processor Extended State */ 4368 *eax = 0; 4369 *ebx = 0; 4370 *ecx = 0; 4371 *edx = 0; 4372 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) { 4373 break; 4374 } 4375 4376 if (count == 0) { 4377 *ecx = xsave_area_size(x86_cpu_xsave_components(cpu)); 4378 *eax = env->features[FEAT_XSAVE_COMP_LO]; 4379 *edx = env->features[FEAT_XSAVE_COMP_HI]; 4380 *ebx = xsave_area_size(env->xcr0); 4381 } else if (count == 1) { 4382 *eax = env->features[FEAT_XSAVE]; 4383 } else if (count < ARRAY_SIZE(x86_ext_save_areas)) { 4384 if ((x86_cpu_xsave_components(cpu) >> count) & 1) { 4385 const ExtSaveArea *esa = &x86_ext_save_areas[count]; 4386 *eax = esa->size; 4387 *ebx = esa->offset; 4388 } 4389 } 4390 break; 4391 } 4392 case 0x14: { 4393 /* Intel Processor Trace Enumeration */ 4394 *eax = 0; 4395 *ebx = 0; 4396 *ecx = 0; 4397 *edx = 0; 4398 if (!(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) || 4399 !kvm_enabled()) { 4400 break; 4401 } 4402 4403 if (count == 0) { 4404 *eax = INTEL_PT_MAX_SUBLEAF; 4405 *ebx = INTEL_PT_MINIMAL_EBX; 4406 *ecx = INTEL_PT_MINIMAL_ECX; 4407 } else if (count == 1) { 4408 *eax = INTEL_PT_MTC_BITMAP | INTEL_PT_ADDR_RANGES_NUM; 4409 *ebx = INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP; 4410 } 4411 break; 4412 } 4413 case 0x40000000: 4414 /* 4415 * CPUID code in kvm_arch_init_vcpu() ignores stuff 4416 * set here, but we restrict to TCG none the less. 4417 */ 4418 if (tcg_enabled() && cpu->expose_tcg) { 4419 memcpy(signature, "TCGTCGTCGTCG", 12); 4420 *eax = 0x40000001; 4421 *ebx = signature[0]; 4422 *ecx = signature[1]; 4423 *edx = signature[2]; 4424 } else { 4425 *eax = 0; 4426 *ebx = 0; 4427 *ecx = 0; 4428 *edx = 0; 4429 } 4430 break; 4431 case 0x40000001: 4432 *eax = 0; 4433 *ebx = 0; 4434 *ecx = 0; 4435 *edx = 0; 4436 break; 4437 case 0x80000000: 4438 *eax = env->cpuid_xlevel; 4439 *ebx = env->cpuid_vendor1; 4440 *edx = env->cpuid_vendor2; 4441 *ecx = env->cpuid_vendor3; 4442 break; 4443 case 0x80000001: 4444 *eax = env->cpuid_version; 4445 *ebx = 0; 4446 *ecx = env->features[FEAT_8000_0001_ECX]; 4447 *edx = env->features[FEAT_8000_0001_EDX]; 4448 4449 /* The Linux kernel checks for the CMPLegacy bit and 4450 * discards multiple thread information if it is set. 4451 * So don't set it here for Intel to make Linux guests happy. 4452 */ 4453 if (cs->nr_cores * cs->nr_threads > 1) { 4454 if (env->cpuid_vendor1 != CPUID_VENDOR_INTEL_1 || 4455 env->cpuid_vendor2 != CPUID_VENDOR_INTEL_2 || 4456 env->cpuid_vendor3 != CPUID_VENDOR_INTEL_3) { 4457 *ecx |= 1 << 1; /* CmpLegacy bit */ 4458 } 4459 } 4460 break; 4461 case 0x80000002: 4462 case 0x80000003: 4463 case 0x80000004: 4464 *eax = env->cpuid_model[(index - 0x80000002) * 4 + 0]; 4465 *ebx = env->cpuid_model[(index - 0x80000002) * 4 + 1]; 4466 *ecx = env->cpuid_model[(index - 0x80000002) * 4 + 2]; 4467 *edx = env->cpuid_model[(index - 0x80000002) * 4 + 3]; 4468 break; 4469 case 0x80000005: 4470 /* cache info (L1 cache) */ 4471 if (cpu->cache_info_passthrough) { 4472 host_cpuid(index, 0, eax, ebx, ecx, edx); 4473 break; 4474 } 4475 *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) | \ 4476 (L1_ITLB_2M_ASSOC << 8) | (L1_ITLB_2M_ENTRIES); 4477 *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) | \ 4478 (L1_ITLB_4K_ASSOC << 8) | (L1_ITLB_4K_ENTRIES); 4479 *ecx = encode_cache_cpuid80000005(env->cache_info_amd.l1d_cache); 4480 *edx = encode_cache_cpuid80000005(env->cache_info_amd.l1i_cache); 4481 break; 4482 case 0x80000006: 4483 /* cache info (L2 cache) */ 4484 if (cpu->cache_info_passthrough) { 4485 host_cpuid(index, 0, eax, ebx, ecx, edx); 4486 break; 4487 } 4488 *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) | \ 4489 (L2_DTLB_2M_ENTRIES << 16) | \ 4490 (AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) | \ 4491 (L2_ITLB_2M_ENTRIES); 4492 *ebx = (AMD_ENC_ASSOC(L2_DTLB_4K_ASSOC) << 28) | \ 4493 (L2_DTLB_4K_ENTRIES << 16) | \ 4494 (AMD_ENC_ASSOC(L2_ITLB_4K_ASSOC) << 12) | \ 4495 (L2_ITLB_4K_ENTRIES); 4496 encode_cache_cpuid80000006(env->cache_info_amd.l2_cache, 4497 cpu->enable_l3_cache ? 4498 env->cache_info_amd.l3_cache : NULL, 4499 ecx, edx); 4500 break; 4501 case 0x80000007: 4502 *eax = 0; 4503 *ebx = 0; 4504 *ecx = 0; 4505 *edx = env->features[FEAT_8000_0007_EDX]; 4506 break; 4507 case 0x80000008: 4508 /* virtual & phys address size in low 2 bytes. */ 4509 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) { 4510 /* 64 bit processor */ 4511 *eax = cpu->phys_bits; /* configurable physical bits */ 4512 if (env->features[FEAT_7_0_ECX] & CPUID_7_0_ECX_LA57) { 4513 *eax |= 0x00003900; /* 57 bits virtual */ 4514 } else { 4515 *eax |= 0x00003000; /* 48 bits virtual */ 4516 } 4517 } else { 4518 *eax = cpu->phys_bits; 4519 } 4520 *ebx = env->features[FEAT_8000_0008_EBX]; 4521 *ecx = 0; 4522 *edx = 0; 4523 if (cs->nr_cores * cs->nr_threads > 1) { 4524 *ecx |= (cs->nr_cores * cs->nr_threads) - 1; 4525 } 4526 break; 4527 case 0x8000000A: 4528 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) { 4529 *eax = 0x00000001; /* SVM Revision */ 4530 *ebx = 0x00000010; /* nr of ASIDs */ 4531 *ecx = 0; 4532 *edx = env->features[FEAT_SVM]; /* optional features */ 4533 } else { 4534 *eax = 0; 4535 *ebx = 0; 4536 *ecx = 0; 4537 *edx = 0; 4538 } 4539 break; 4540 case 0x8000001D: 4541 *eax = 0; 4542 switch (count) { 4543 case 0: /* L1 dcache info */ 4544 encode_cache_cpuid8000001d(env->cache_info_amd.l1d_cache, cs, 4545 eax, ebx, ecx, edx); 4546 break; 4547 case 1: /* L1 icache info */ 4548 encode_cache_cpuid8000001d(env->cache_info_amd.l1i_cache, cs, 4549 eax, ebx, ecx, edx); 4550 break; 4551 case 2: /* L2 cache info */ 4552 encode_cache_cpuid8000001d(env->cache_info_amd.l2_cache, cs, 4553 eax, ebx, ecx, edx); 4554 break; 4555 case 3: /* L3 cache info */ 4556 encode_cache_cpuid8000001d(env->cache_info_amd.l3_cache, cs, 4557 eax, ebx, ecx, edx); 4558 break; 4559 default: /* end of info */ 4560 *eax = *ebx = *ecx = *edx = 0; 4561 break; 4562 } 4563 break; 4564 case 0x8000001E: 4565 assert(cpu->core_id <= 255); 4566 encode_topo_cpuid8000001e(cs, cpu, 4567 eax, ebx, ecx, edx); 4568 break; 4569 case 0xC0000000: 4570 *eax = env->cpuid_xlevel2; 4571 *ebx = 0; 4572 *ecx = 0; 4573 *edx = 0; 4574 break; 4575 case 0xC0000001: 4576 /* Support for VIA CPU's CPUID instruction */ 4577 *eax = env->cpuid_version; 4578 *ebx = 0; 4579 *ecx = 0; 4580 *edx = env->features[FEAT_C000_0001_EDX]; 4581 break; 4582 case 0xC0000002: 4583 case 0xC0000003: 4584 case 0xC0000004: 4585 /* Reserved for the future, and now filled with zero */ 4586 *eax = 0; 4587 *ebx = 0; 4588 *ecx = 0; 4589 *edx = 0; 4590 break; 4591 case 0x8000001F: 4592 *eax = sev_enabled() ? 0x2 : 0; 4593 *ebx = sev_get_cbit_position(); 4594 *ebx |= sev_get_reduced_phys_bits() << 6; 4595 *ecx = 0; 4596 *edx = 0; 4597 break; 4598 default: 4599 /* reserved values: zero */ 4600 *eax = 0; 4601 *ebx = 0; 4602 *ecx = 0; 4603 *edx = 0; 4604 break; 4605 } 4606 } 4607 4608 /* CPUClass::reset() */ 4609 static void x86_cpu_reset(CPUState *s) 4610 { 4611 X86CPU *cpu = X86_CPU(s); 4612 X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu); 4613 CPUX86State *env = &cpu->env; 4614 target_ulong cr4; 4615 uint64_t xcr0; 4616 int i; 4617 4618 xcc->parent_reset(s); 4619 4620 memset(env, 0, offsetof(CPUX86State, end_reset_fields)); 4621 4622 env->old_exception = -1; 4623 4624 /* init to reset state */ 4625 4626 env->hflags2 |= HF2_GIF_MASK; 4627 4628 cpu_x86_update_cr0(env, 0x60000010); 4629 env->a20_mask = ~0x0; 4630 env->smbase = 0x30000; 4631 env->msr_smi_count = 0; 4632 4633 env->idt.limit = 0xffff; 4634 env->gdt.limit = 0xffff; 4635 env->ldt.limit = 0xffff; 4636 env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT); 4637 env->tr.limit = 0xffff; 4638 env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT); 4639 4640 cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff, 4641 DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK | 4642 DESC_R_MASK | DESC_A_MASK); 4643 cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff, 4644 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | 4645 DESC_A_MASK); 4646 cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff, 4647 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | 4648 DESC_A_MASK); 4649 cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff, 4650 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | 4651 DESC_A_MASK); 4652 cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff, 4653 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | 4654 DESC_A_MASK); 4655 cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff, 4656 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | 4657 DESC_A_MASK); 4658 4659 env->eip = 0xfff0; 4660 env->regs[R_EDX] = env->cpuid_version; 4661 4662 env->eflags = 0x2; 4663 4664 /* FPU init */ 4665 for (i = 0; i < 8; i++) { 4666 env->fptags[i] = 1; 4667 } 4668 cpu_set_fpuc(env, 0x37f); 4669 4670 env->mxcsr = 0x1f80; 4671 /* All units are in INIT state. */ 4672 env->xstate_bv = 0; 4673 4674 env->pat = 0x0007040600070406ULL; 4675 env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT; 4676 4677 memset(env->dr, 0, sizeof(env->dr)); 4678 env->dr[6] = DR6_FIXED_1; 4679 env->dr[7] = DR7_FIXED_1; 4680 cpu_breakpoint_remove_all(s, BP_CPU); 4681 cpu_watchpoint_remove_all(s, BP_CPU); 4682 4683 cr4 = 0; 4684 xcr0 = XSTATE_FP_MASK; 4685 4686 #ifdef CONFIG_USER_ONLY 4687 /* Enable all the features for user-mode. */ 4688 if (env->features[FEAT_1_EDX] & CPUID_SSE) { 4689 xcr0 |= XSTATE_SSE_MASK; 4690 } 4691 for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) { 4692 const ExtSaveArea *esa = &x86_ext_save_areas[i]; 4693 if (env->features[esa->feature] & esa->bits) { 4694 xcr0 |= 1ull << i; 4695 } 4696 } 4697 4698 if (env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE) { 4699 cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK; 4700 } 4701 if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_FSGSBASE) { 4702 cr4 |= CR4_FSGSBASE_MASK; 4703 } 4704 #endif 4705 4706 env->xcr0 = xcr0; 4707 cpu_x86_update_cr4(env, cr4); 4708 4709 /* 4710 * SDM 11.11.5 requires: 4711 * - IA32_MTRR_DEF_TYPE MSR.E = 0 4712 * - IA32_MTRR_PHYSMASKn.V = 0 4713 * All other bits are undefined. For simplification, zero it all. 4714 */ 4715 env->mtrr_deftype = 0; 4716 memset(env->mtrr_var, 0, sizeof(env->mtrr_var)); 4717 memset(env->mtrr_fixed, 0, sizeof(env->mtrr_fixed)); 4718 4719 env->interrupt_injected = -1; 4720 env->exception_injected = -1; 4721 env->nmi_injected = false; 4722 #if !defined(CONFIG_USER_ONLY) 4723 /* We hard-wire the BSP to the first CPU. */ 4724 apic_designate_bsp(cpu->apic_state, s->cpu_index == 0); 4725 4726 s->halted = !cpu_is_bsp(cpu); 4727 4728 if (kvm_enabled()) { 4729 kvm_arch_reset_vcpu(cpu); 4730 } 4731 else if (hvf_enabled()) { 4732 hvf_reset_vcpu(s); 4733 } 4734 #endif 4735 } 4736 4737 #ifndef CONFIG_USER_ONLY 4738 bool cpu_is_bsp(X86CPU *cpu) 4739 { 4740 return cpu_get_apic_base(cpu->apic_state) & MSR_IA32_APICBASE_BSP; 4741 } 4742 4743 /* TODO: remove me, when reset over QOM tree is implemented */ 4744 static void x86_cpu_machine_reset_cb(void *opaque) 4745 { 4746 X86CPU *cpu = opaque; 4747 cpu_reset(CPU(cpu)); 4748 } 4749 #endif 4750 4751 static void mce_init(X86CPU *cpu) 4752 { 4753 CPUX86State *cenv = &cpu->env; 4754 unsigned int bank; 4755 4756 if (((cenv->cpuid_version >> 8) & 0xf) >= 6 4757 && (cenv->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) == 4758 (CPUID_MCE | CPUID_MCA)) { 4759 cenv->mcg_cap = MCE_CAP_DEF | MCE_BANKS_DEF | 4760 (cpu->enable_lmce ? MCG_LMCE_P : 0); 4761 cenv->mcg_ctl = ~(uint64_t)0; 4762 for (bank = 0; bank < MCE_BANKS_DEF; bank++) { 4763 cenv->mce_banks[bank * 4] = ~(uint64_t)0; 4764 } 4765 } 4766 } 4767 4768 #ifndef CONFIG_USER_ONLY 4769 APICCommonClass *apic_get_class(void) 4770 { 4771 const char *apic_type = "apic"; 4772 4773 /* TODO: in-kernel irqchip for hvf */ 4774 if (kvm_apic_in_kernel()) { 4775 apic_type = "kvm-apic"; 4776 } else if (xen_enabled()) { 4777 apic_type = "xen-apic"; 4778 } 4779 4780 return APIC_COMMON_CLASS(object_class_by_name(apic_type)); 4781 } 4782 4783 static void x86_cpu_apic_create(X86CPU *cpu, Error **errp) 4784 { 4785 APICCommonState *apic; 4786 ObjectClass *apic_class = OBJECT_CLASS(apic_get_class()); 4787 4788 cpu->apic_state = DEVICE(object_new(object_class_get_name(apic_class))); 4789 4790 object_property_add_child(OBJECT(cpu), "lapic", 4791 OBJECT(cpu->apic_state), &error_abort); 4792 object_unref(OBJECT(cpu->apic_state)); 4793 4794 qdev_prop_set_uint32(cpu->apic_state, "id", cpu->apic_id); 4795 /* TODO: convert to link<> */ 4796 apic = APIC_COMMON(cpu->apic_state); 4797 apic->cpu = cpu; 4798 apic->apicbase = APIC_DEFAULT_ADDRESS | MSR_IA32_APICBASE_ENABLE; 4799 } 4800 4801 static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp) 4802 { 4803 APICCommonState *apic; 4804 static bool apic_mmio_map_once; 4805 4806 if (cpu->apic_state == NULL) { 4807 return; 4808 } 4809 object_property_set_bool(OBJECT(cpu->apic_state), true, "realized", 4810 errp); 4811 4812 /* Map APIC MMIO area */ 4813 apic = APIC_COMMON(cpu->apic_state); 4814 if (!apic_mmio_map_once) { 4815 memory_region_add_subregion_overlap(get_system_memory(), 4816 apic->apicbase & 4817 MSR_IA32_APICBASE_BASE, 4818 &apic->io_memory, 4819 0x1000); 4820 apic_mmio_map_once = true; 4821 } 4822 } 4823 4824 static void x86_cpu_machine_done(Notifier *n, void *unused) 4825 { 4826 X86CPU *cpu = container_of(n, X86CPU, machine_done); 4827 MemoryRegion *smram = 4828 (MemoryRegion *) object_resolve_path("/machine/smram", NULL); 4829 4830 if (smram) { 4831 cpu->smram = g_new(MemoryRegion, 1); 4832 memory_region_init_alias(cpu->smram, OBJECT(cpu), "smram", 4833 smram, 0, 1ull << 32); 4834 memory_region_set_enabled(cpu->smram, true); 4835 memory_region_add_subregion_overlap(cpu->cpu_as_root, 0, cpu->smram, 1); 4836 } 4837 } 4838 #else 4839 static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp) 4840 { 4841 } 4842 #endif 4843 4844 /* Note: Only safe for use on x86(-64) hosts */ 4845 static uint32_t x86_host_phys_bits(void) 4846 { 4847 uint32_t eax; 4848 uint32_t host_phys_bits; 4849 4850 host_cpuid(0x80000000, 0, &eax, NULL, NULL, NULL); 4851 if (eax >= 0x80000008) { 4852 host_cpuid(0x80000008, 0, &eax, NULL, NULL, NULL); 4853 /* Note: According to AMD doc 25481 rev 2.34 they have a field 4854 * at 23:16 that can specify a maximum physical address bits for 4855 * the guest that can override this value; but I've not seen 4856 * anything with that set. 4857 */ 4858 host_phys_bits = eax & 0xff; 4859 } else { 4860 /* It's an odd 64 bit machine that doesn't have the leaf for 4861 * physical address bits; fall back to 36 that's most older 4862 * Intel. 4863 */ 4864 host_phys_bits = 36; 4865 } 4866 4867 return host_phys_bits; 4868 } 4869 4870 static void x86_cpu_adjust_level(X86CPU *cpu, uint32_t *min, uint32_t value) 4871 { 4872 if (*min < value) { 4873 *min = value; 4874 } 4875 } 4876 4877 /* Increase cpuid_min_{level,xlevel,xlevel2} automatically, if appropriate */ 4878 static void x86_cpu_adjust_feat_level(X86CPU *cpu, FeatureWord w) 4879 { 4880 CPUX86State *env = &cpu->env; 4881 FeatureWordInfo *fi = &feature_word_info[w]; 4882 uint32_t eax = fi->cpuid.eax; 4883 uint32_t region = eax & 0xF0000000; 4884 4885 assert(feature_word_info[w].type == CPUID_FEATURE_WORD); 4886 if (!env->features[w]) { 4887 return; 4888 } 4889 4890 switch (region) { 4891 case 0x00000000: 4892 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, eax); 4893 break; 4894 case 0x80000000: 4895 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, eax); 4896 break; 4897 case 0xC0000000: 4898 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel2, eax); 4899 break; 4900 } 4901 } 4902 4903 /* Calculate XSAVE components based on the configured CPU feature flags */ 4904 static void x86_cpu_enable_xsave_components(X86CPU *cpu) 4905 { 4906 CPUX86State *env = &cpu->env; 4907 int i; 4908 uint64_t mask; 4909 4910 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) { 4911 return; 4912 } 4913 4914 mask = 0; 4915 for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) { 4916 const ExtSaveArea *esa = &x86_ext_save_areas[i]; 4917 if (env->features[esa->feature] & esa->bits) { 4918 mask |= (1ULL << i); 4919 } 4920 } 4921 4922 env->features[FEAT_XSAVE_COMP_LO] = mask; 4923 env->features[FEAT_XSAVE_COMP_HI] = mask >> 32; 4924 } 4925 4926 /***** Steps involved on loading and filtering CPUID data 4927 * 4928 * When initializing and realizing a CPU object, the steps 4929 * involved in setting up CPUID data are: 4930 * 4931 * 1) Loading CPU model definition (X86CPUDefinition). This is 4932 * implemented by x86_cpu_load_def() and should be completely 4933 * transparent, as it is done automatically by instance_init. 4934 * No code should need to look at X86CPUDefinition structs 4935 * outside instance_init. 4936 * 4937 * 2) CPU expansion. This is done by realize before CPUID 4938 * filtering, and will make sure host/accelerator data is 4939 * loaded for CPU models that depend on host capabilities 4940 * (e.g. "host"). Done by x86_cpu_expand_features(). 4941 * 4942 * 3) CPUID filtering. This initializes extra data related to 4943 * CPUID, and checks if the host supports all capabilities 4944 * required by the CPU. Runnability of a CPU model is 4945 * determined at this step. Done by x86_cpu_filter_features(). 4946 * 4947 * Some operations don't require all steps to be performed. 4948 * More precisely: 4949 * 4950 * - CPU instance creation (instance_init) will run only CPU 4951 * model loading. CPU expansion can't run at instance_init-time 4952 * because host/accelerator data may be not available yet. 4953 * - CPU realization will perform both CPU model expansion and CPUID 4954 * filtering, and return an error in case one of them fails. 4955 * - query-cpu-definitions needs to run all 3 steps. It needs 4956 * to run CPUID filtering, as the 'unavailable-features' 4957 * field is set based on the filtering results. 4958 * - The query-cpu-model-expansion QMP command only needs to run 4959 * CPU model loading and CPU expansion. It should not filter 4960 * any CPUID data based on host capabilities. 4961 */ 4962 4963 /* Expand CPU configuration data, based on configured features 4964 * and host/accelerator capabilities when appropriate. 4965 */ 4966 static void x86_cpu_expand_features(X86CPU *cpu, Error **errp) 4967 { 4968 CPUX86State *env = &cpu->env; 4969 FeatureWord w; 4970 GList *l; 4971 Error *local_err = NULL; 4972 4973 /*TODO: Now cpu->max_features doesn't overwrite features 4974 * set using QOM properties, and we can convert 4975 * plus_features & minus_features to global properties 4976 * inside x86_cpu_parse_featurestr() too. 4977 */ 4978 if (cpu->max_features) { 4979 for (w = 0; w < FEATURE_WORDS; w++) { 4980 /* Override only features that weren't set explicitly 4981 * by the user. 4982 */ 4983 env->features[w] |= 4984 x86_cpu_get_supported_feature_word(w, cpu->migratable) & 4985 ~env->user_features[w] & \ 4986 ~feature_word_info[w].no_autoenable_flags; 4987 } 4988 } 4989 4990 for (l = plus_features; l; l = l->next) { 4991 const char *prop = l->data; 4992 object_property_set_bool(OBJECT(cpu), true, prop, &local_err); 4993 if (local_err) { 4994 goto out; 4995 } 4996 } 4997 4998 for (l = minus_features; l; l = l->next) { 4999 const char *prop = l->data; 5000 object_property_set_bool(OBJECT(cpu), false, prop, &local_err); 5001 if (local_err) { 5002 goto out; 5003 } 5004 } 5005 5006 if (!kvm_enabled() || !cpu->expose_kvm) { 5007 env->features[FEAT_KVM] = 0; 5008 } 5009 5010 x86_cpu_enable_xsave_components(cpu); 5011 5012 /* CPUID[EAX=7,ECX=0].EBX always increased level automatically: */ 5013 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_EBX); 5014 if (cpu->full_cpuid_auto_level) { 5015 x86_cpu_adjust_feat_level(cpu, FEAT_1_EDX); 5016 x86_cpu_adjust_feat_level(cpu, FEAT_1_ECX); 5017 x86_cpu_adjust_feat_level(cpu, FEAT_6_EAX); 5018 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_ECX); 5019 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_EDX); 5020 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_ECX); 5021 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0007_EDX); 5022 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0008_EBX); 5023 x86_cpu_adjust_feat_level(cpu, FEAT_C000_0001_EDX); 5024 x86_cpu_adjust_feat_level(cpu, FEAT_SVM); 5025 x86_cpu_adjust_feat_level(cpu, FEAT_XSAVE); 5026 /* SVM requires CPUID[0x8000000A] */ 5027 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) { 5028 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000000A); 5029 } 5030 5031 /* SEV requires CPUID[0x8000001F] */ 5032 if (sev_enabled()) { 5033 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000001F); 5034 } 5035 } 5036 5037 /* Set cpuid_*level* based on cpuid_min_*level, if not explicitly set */ 5038 if (env->cpuid_level == UINT32_MAX) { 5039 env->cpuid_level = env->cpuid_min_level; 5040 } 5041 if (env->cpuid_xlevel == UINT32_MAX) { 5042 env->cpuid_xlevel = env->cpuid_min_xlevel; 5043 } 5044 if (env->cpuid_xlevel2 == UINT32_MAX) { 5045 env->cpuid_xlevel2 = env->cpuid_min_xlevel2; 5046 } 5047 5048 out: 5049 if (local_err != NULL) { 5050 error_propagate(errp, local_err); 5051 } 5052 } 5053 5054 /* 5055 * Finishes initialization of CPUID data, filters CPU feature 5056 * words based on host availability of each feature. 5057 * 5058 * Returns: 0 if all flags are supported by the host, non-zero otherwise. 5059 */ 5060 static int x86_cpu_filter_features(X86CPU *cpu) 5061 { 5062 CPUX86State *env = &cpu->env; 5063 FeatureWord w; 5064 int rv = 0; 5065 5066 for (w = 0; w < FEATURE_WORDS; w++) { 5067 uint32_t host_feat = 5068 x86_cpu_get_supported_feature_word(w, false); 5069 uint32_t requested_features = env->features[w]; 5070 env->features[w] &= host_feat; 5071 cpu->filtered_features[w] = requested_features & ~env->features[w]; 5072 if (cpu->filtered_features[w]) { 5073 rv = 1; 5074 } 5075 } 5076 5077 if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) && 5078 kvm_enabled()) { 5079 KVMState *s = CPU(cpu)->kvm_state; 5080 uint32_t eax_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EAX); 5081 uint32_t ebx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_EBX); 5082 uint32_t ecx_0 = kvm_arch_get_supported_cpuid(s, 0x14, 0, R_ECX); 5083 uint32_t eax_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EAX); 5084 uint32_t ebx_1 = kvm_arch_get_supported_cpuid(s, 0x14, 1, R_EBX); 5085 5086 if (!eax_0 || 5087 ((ebx_0 & INTEL_PT_MINIMAL_EBX) != INTEL_PT_MINIMAL_EBX) || 5088 ((ecx_0 & INTEL_PT_MINIMAL_ECX) != INTEL_PT_MINIMAL_ECX) || 5089 ((eax_1 & INTEL_PT_MTC_BITMAP) != INTEL_PT_MTC_BITMAP) || 5090 ((eax_1 & INTEL_PT_ADDR_RANGES_NUM_MASK) < 5091 INTEL_PT_ADDR_RANGES_NUM) || 5092 ((ebx_1 & (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) != 5093 (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) || 5094 (ecx_0 & INTEL_PT_IP_LIP)) { 5095 /* 5096 * Processor Trace capabilities aren't configurable, so if the 5097 * host can't emulate the capabilities we report on 5098 * cpu_x86_cpuid(), intel-pt can't be enabled on the current host. 5099 */ 5100 env->features[FEAT_7_0_EBX] &= ~CPUID_7_0_EBX_INTEL_PT; 5101 cpu->filtered_features[FEAT_7_0_EBX] |= CPUID_7_0_EBX_INTEL_PT; 5102 rv = 1; 5103 } 5104 } 5105 5106 return rv; 5107 } 5108 5109 #define IS_INTEL_CPU(env) ((env)->cpuid_vendor1 == CPUID_VENDOR_INTEL_1 && \ 5110 (env)->cpuid_vendor2 == CPUID_VENDOR_INTEL_2 && \ 5111 (env)->cpuid_vendor3 == CPUID_VENDOR_INTEL_3) 5112 #define IS_AMD_CPU(env) ((env)->cpuid_vendor1 == CPUID_VENDOR_AMD_1 && \ 5113 (env)->cpuid_vendor2 == CPUID_VENDOR_AMD_2 && \ 5114 (env)->cpuid_vendor3 == CPUID_VENDOR_AMD_3) 5115 static void x86_cpu_realizefn(DeviceState *dev, Error **errp) 5116 { 5117 CPUState *cs = CPU(dev); 5118 X86CPU *cpu = X86_CPU(dev); 5119 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev); 5120 CPUX86State *env = &cpu->env; 5121 Error *local_err = NULL; 5122 static bool ht_warned; 5123 5124 if (xcc->host_cpuid_required) { 5125 if (!accel_uses_host_cpuid()) { 5126 char *name = x86_cpu_class_get_model_name(xcc); 5127 error_setg(&local_err, "CPU model '%s' requires KVM", name); 5128 g_free(name); 5129 goto out; 5130 } 5131 5132 if (enable_cpu_pm) { 5133 host_cpuid(5, 0, &cpu->mwait.eax, &cpu->mwait.ebx, 5134 &cpu->mwait.ecx, &cpu->mwait.edx); 5135 env->features[FEAT_1_ECX] |= CPUID_EXT_MONITOR; 5136 } 5137 } 5138 5139 /* mwait extended info: needed for Core compatibility */ 5140 /* We always wake on interrupt even if host does not have the capability */ 5141 cpu->mwait.ecx |= CPUID_MWAIT_EMX | CPUID_MWAIT_IBE; 5142 5143 if (cpu->apic_id == UNASSIGNED_APIC_ID) { 5144 error_setg(errp, "apic-id property was not initialized properly"); 5145 return; 5146 } 5147 5148 x86_cpu_expand_features(cpu, &local_err); 5149 if (local_err) { 5150 goto out; 5151 } 5152 5153 if (x86_cpu_filter_features(cpu) && 5154 (cpu->check_cpuid || cpu->enforce_cpuid)) { 5155 x86_cpu_report_filtered_features(cpu); 5156 if (cpu->enforce_cpuid) { 5157 error_setg(&local_err, 5158 accel_uses_host_cpuid() ? 5159 "Host doesn't support requested features" : 5160 "TCG doesn't support requested features"); 5161 goto out; 5162 } 5163 } 5164 5165 /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on 5166 * CPUID[1].EDX. 5167 */ 5168 if (IS_AMD_CPU(env)) { 5169 env->features[FEAT_8000_0001_EDX] &= ~CPUID_EXT2_AMD_ALIASES; 5170 env->features[FEAT_8000_0001_EDX] |= (env->features[FEAT_1_EDX] 5171 & CPUID_EXT2_AMD_ALIASES); 5172 } 5173 5174 /* For 64bit systems think about the number of physical bits to present. 5175 * ideally this should be the same as the host; anything other than matching 5176 * the host can cause incorrect guest behaviour. 5177 * QEMU used to pick the magic value of 40 bits that corresponds to 5178 * consumer AMD devices but nothing else. 5179 */ 5180 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) { 5181 if (accel_uses_host_cpuid()) { 5182 uint32_t host_phys_bits = x86_host_phys_bits(); 5183 static bool warned; 5184 5185 if (cpu->host_phys_bits) { 5186 /* The user asked for us to use the host physical bits */ 5187 cpu->phys_bits = host_phys_bits; 5188 if (cpu->host_phys_bits_limit && 5189 cpu->phys_bits > cpu->host_phys_bits_limit) { 5190 cpu->phys_bits = cpu->host_phys_bits_limit; 5191 } 5192 } 5193 5194 /* Print a warning if the user set it to a value that's not the 5195 * host value. 5196 */ 5197 if (cpu->phys_bits != host_phys_bits && cpu->phys_bits != 0 && 5198 !warned) { 5199 warn_report("Host physical bits (%u)" 5200 " does not match phys-bits property (%u)", 5201 host_phys_bits, cpu->phys_bits); 5202 warned = true; 5203 } 5204 5205 if (cpu->phys_bits && 5206 (cpu->phys_bits > TARGET_PHYS_ADDR_SPACE_BITS || 5207 cpu->phys_bits < 32)) { 5208 error_setg(errp, "phys-bits should be between 32 and %u " 5209 " (but is %u)", 5210 TARGET_PHYS_ADDR_SPACE_BITS, cpu->phys_bits); 5211 return; 5212 } 5213 } else { 5214 if (cpu->phys_bits && cpu->phys_bits != TCG_PHYS_ADDR_BITS) { 5215 error_setg(errp, "TCG only supports phys-bits=%u", 5216 TCG_PHYS_ADDR_BITS); 5217 return; 5218 } 5219 } 5220 /* 0 means it was not explicitly set by the user (or by machine 5221 * compat_props or by the host code above). In this case, the default 5222 * is the value used by TCG (40). 5223 */ 5224 if (cpu->phys_bits == 0) { 5225 cpu->phys_bits = TCG_PHYS_ADDR_BITS; 5226 } 5227 } else { 5228 /* For 32 bit systems don't use the user set value, but keep 5229 * phys_bits consistent with what we tell the guest. 5230 */ 5231 if (cpu->phys_bits != 0) { 5232 error_setg(errp, "phys-bits is not user-configurable in 32 bit"); 5233 return; 5234 } 5235 5236 if (env->features[FEAT_1_EDX] & CPUID_PSE36) { 5237 cpu->phys_bits = 36; 5238 } else { 5239 cpu->phys_bits = 32; 5240 } 5241 } 5242 5243 /* Cache information initialization */ 5244 if (!cpu->legacy_cache) { 5245 if (!xcc->cpu_def || !xcc->cpu_def->cache_info) { 5246 char *name = x86_cpu_class_get_model_name(xcc); 5247 error_setg(errp, 5248 "CPU model '%s' doesn't support legacy-cache=off", name); 5249 g_free(name); 5250 return; 5251 } 5252 env->cache_info_cpuid2 = env->cache_info_cpuid4 = env->cache_info_amd = 5253 *xcc->cpu_def->cache_info; 5254 } else { 5255 /* Build legacy cache information */ 5256 env->cache_info_cpuid2.l1d_cache = &legacy_l1d_cache; 5257 env->cache_info_cpuid2.l1i_cache = &legacy_l1i_cache; 5258 env->cache_info_cpuid2.l2_cache = &legacy_l2_cache_cpuid2; 5259 env->cache_info_cpuid2.l3_cache = &legacy_l3_cache; 5260 5261 env->cache_info_cpuid4.l1d_cache = &legacy_l1d_cache; 5262 env->cache_info_cpuid4.l1i_cache = &legacy_l1i_cache; 5263 env->cache_info_cpuid4.l2_cache = &legacy_l2_cache; 5264 env->cache_info_cpuid4.l3_cache = &legacy_l3_cache; 5265 5266 env->cache_info_amd.l1d_cache = &legacy_l1d_cache_amd; 5267 env->cache_info_amd.l1i_cache = &legacy_l1i_cache_amd; 5268 env->cache_info_amd.l2_cache = &legacy_l2_cache_amd; 5269 env->cache_info_amd.l3_cache = &legacy_l3_cache; 5270 } 5271 5272 5273 cpu_exec_realizefn(cs, &local_err); 5274 if (local_err != NULL) { 5275 error_propagate(errp, local_err); 5276 return; 5277 } 5278 5279 #ifndef CONFIG_USER_ONLY 5280 qemu_register_reset(x86_cpu_machine_reset_cb, cpu); 5281 5282 if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || smp_cpus > 1) { 5283 x86_cpu_apic_create(cpu, &local_err); 5284 if (local_err != NULL) { 5285 goto out; 5286 } 5287 } 5288 #endif 5289 5290 mce_init(cpu); 5291 5292 #ifndef CONFIG_USER_ONLY 5293 if (tcg_enabled()) { 5294 cpu->cpu_as_mem = g_new(MemoryRegion, 1); 5295 cpu->cpu_as_root = g_new(MemoryRegion, 1); 5296 5297 /* Outer container... */ 5298 memory_region_init(cpu->cpu_as_root, OBJECT(cpu), "memory", ~0ull); 5299 memory_region_set_enabled(cpu->cpu_as_root, true); 5300 5301 /* ... with two regions inside: normal system memory with low 5302 * priority, and... 5303 */ 5304 memory_region_init_alias(cpu->cpu_as_mem, OBJECT(cpu), "memory", 5305 get_system_memory(), 0, ~0ull); 5306 memory_region_add_subregion_overlap(cpu->cpu_as_root, 0, cpu->cpu_as_mem, 0); 5307 memory_region_set_enabled(cpu->cpu_as_mem, true); 5308 5309 cs->num_ases = 2; 5310 cpu_address_space_init(cs, 0, "cpu-memory", cs->memory); 5311 cpu_address_space_init(cs, 1, "cpu-smm", cpu->cpu_as_root); 5312 5313 /* ... SMRAM with higher priority, linked from /machine/smram. */ 5314 cpu->machine_done.notify = x86_cpu_machine_done; 5315 qemu_add_machine_init_done_notifier(&cpu->machine_done); 5316 } 5317 #endif 5318 5319 qemu_init_vcpu(cs); 5320 5321 /* 5322 * Most Intel and certain AMD CPUs support hyperthreading. Even though QEMU 5323 * fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX 5324 * based on inputs (sockets,cores,threads), it is still better to give 5325 * users a warning. 5326 * 5327 * NOTE: the following code has to follow qemu_init_vcpu(). Otherwise 5328 * cs->nr_threads hasn't be populated yet and the checking is incorrect. 5329 */ 5330 if (IS_AMD_CPU(env) && 5331 !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) && 5332 cs->nr_threads > 1 && !ht_warned) { 5333 warn_report("This family of AMD CPU doesn't support " 5334 "hyperthreading(%d)", 5335 cs->nr_threads); 5336 error_printf("Please configure -smp options properly" 5337 " or try enabling topoext feature.\n"); 5338 ht_warned = true; 5339 } 5340 5341 x86_cpu_apic_realize(cpu, &local_err); 5342 if (local_err != NULL) { 5343 goto out; 5344 } 5345 cpu_reset(cs); 5346 5347 xcc->parent_realize(dev, &local_err); 5348 5349 out: 5350 if (local_err != NULL) { 5351 error_propagate(errp, local_err); 5352 return; 5353 } 5354 } 5355 5356 static void x86_cpu_unrealizefn(DeviceState *dev, Error **errp) 5357 { 5358 X86CPU *cpu = X86_CPU(dev); 5359 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev); 5360 Error *local_err = NULL; 5361 5362 #ifndef CONFIG_USER_ONLY 5363 cpu_remove_sync(CPU(dev)); 5364 qemu_unregister_reset(x86_cpu_machine_reset_cb, dev); 5365 #endif 5366 5367 if (cpu->apic_state) { 5368 object_unparent(OBJECT(cpu->apic_state)); 5369 cpu->apic_state = NULL; 5370 } 5371 5372 xcc->parent_unrealize(dev, &local_err); 5373 if (local_err != NULL) { 5374 error_propagate(errp, local_err); 5375 return; 5376 } 5377 } 5378 5379 typedef struct BitProperty { 5380 FeatureWord w; 5381 uint32_t mask; 5382 } BitProperty; 5383 5384 static void x86_cpu_get_bit_prop(Object *obj, Visitor *v, const char *name, 5385 void *opaque, Error **errp) 5386 { 5387 X86CPU *cpu = X86_CPU(obj); 5388 BitProperty *fp = opaque; 5389 uint32_t f = cpu->env.features[fp->w]; 5390 bool value = (f & fp->mask) == fp->mask; 5391 visit_type_bool(v, name, &value, errp); 5392 } 5393 5394 static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name, 5395 void *opaque, Error **errp) 5396 { 5397 DeviceState *dev = DEVICE(obj); 5398 X86CPU *cpu = X86_CPU(obj); 5399 BitProperty *fp = opaque; 5400 Error *local_err = NULL; 5401 bool value; 5402 5403 if (dev->realized) { 5404 qdev_prop_set_after_realize(dev, name, errp); 5405 return; 5406 } 5407 5408 visit_type_bool(v, name, &value, &local_err); 5409 if (local_err) { 5410 error_propagate(errp, local_err); 5411 return; 5412 } 5413 5414 if (value) { 5415 cpu->env.features[fp->w] |= fp->mask; 5416 } else { 5417 cpu->env.features[fp->w] &= ~fp->mask; 5418 } 5419 cpu->env.user_features[fp->w] |= fp->mask; 5420 } 5421 5422 static void x86_cpu_release_bit_prop(Object *obj, const char *name, 5423 void *opaque) 5424 { 5425 BitProperty *prop = opaque; 5426 g_free(prop); 5427 } 5428 5429 /* Register a boolean property to get/set a single bit in a uint32_t field. 5430 * 5431 * The same property name can be registered multiple times to make it affect 5432 * multiple bits in the same FeatureWord. In that case, the getter will return 5433 * true only if all bits are set. 5434 */ 5435 static void x86_cpu_register_bit_prop(X86CPU *cpu, 5436 const char *prop_name, 5437 FeatureWord w, 5438 int bitnr) 5439 { 5440 BitProperty *fp; 5441 ObjectProperty *op; 5442 uint32_t mask = (1UL << bitnr); 5443 5444 op = object_property_find(OBJECT(cpu), prop_name, NULL); 5445 if (op) { 5446 fp = op->opaque; 5447 assert(fp->w == w); 5448 fp->mask |= mask; 5449 } else { 5450 fp = g_new0(BitProperty, 1); 5451 fp->w = w; 5452 fp->mask = mask; 5453 object_property_add(OBJECT(cpu), prop_name, "bool", 5454 x86_cpu_get_bit_prop, 5455 x86_cpu_set_bit_prop, 5456 x86_cpu_release_bit_prop, fp, &error_abort); 5457 } 5458 } 5459 5460 static void x86_cpu_register_feature_bit_props(X86CPU *cpu, 5461 FeatureWord w, 5462 int bitnr) 5463 { 5464 FeatureWordInfo *fi = &feature_word_info[w]; 5465 const char *name = fi->feat_names[bitnr]; 5466 5467 if (!name) { 5468 return; 5469 } 5470 5471 /* Property names should use "-" instead of "_". 5472 * Old names containing underscores are registered as aliases 5473 * using object_property_add_alias() 5474 */ 5475 assert(!strchr(name, '_')); 5476 /* aliases don't use "|" delimiters anymore, they are registered 5477 * manually using object_property_add_alias() */ 5478 assert(!strchr(name, '|')); 5479 x86_cpu_register_bit_prop(cpu, name, w, bitnr); 5480 } 5481 5482 static GuestPanicInformation *x86_cpu_get_crash_info(CPUState *cs) 5483 { 5484 X86CPU *cpu = X86_CPU(cs); 5485 CPUX86State *env = &cpu->env; 5486 GuestPanicInformation *panic_info = NULL; 5487 5488 if (env->features[FEAT_HYPERV_EDX] & HV_GUEST_CRASH_MSR_AVAILABLE) { 5489 panic_info = g_malloc0(sizeof(GuestPanicInformation)); 5490 5491 panic_info->type = GUEST_PANIC_INFORMATION_TYPE_HYPER_V; 5492 5493 assert(HV_CRASH_PARAMS >= 5); 5494 panic_info->u.hyper_v.arg1 = env->msr_hv_crash_params[0]; 5495 panic_info->u.hyper_v.arg2 = env->msr_hv_crash_params[1]; 5496 panic_info->u.hyper_v.arg3 = env->msr_hv_crash_params[2]; 5497 panic_info->u.hyper_v.arg4 = env->msr_hv_crash_params[3]; 5498 panic_info->u.hyper_v.arg5 = env->msr_hv_crash_params[4]; 5499 } 5500 5501 return panic_info; 5502 } 5503 static void x86_cpu_get_crash_info_qom(Object *obj, Visitor *v, 5504 const char *name, void *opaque, 5505 Error **errp) 5506 { 5507 CPUState *cs = CPU(obj); 5508 GuestPanicInformation *panic_info; 5509 5510 if (!cs->crash_occurred) { 5511 error_setg(errp, "No crash occured"); 5512 return; 5513 } 5514 5515 panic_info = x86_cpu_get_crash_info(cs); 5516 if (panic_info == NULL) { 5517 error_setg(errp, "No crash information"); 5518 return; 5519 } 5520 5521 visit_type_GuestPanicInformation(v, "crash-information", &panic_info, 5522 errp); 5523 qapi_free_GuestPanicInformation(panic_info); 5524 } 5525 5526 static void x86_cpu_initfn(Object *obj) 5527 { 5528 CPUState *cs = CPU(obj); 5529 X86CPU *cpu = X86_CPU(obj); 5530 X86CPUClass *xcc = X86_CPU_GET_CLASS(obj); 5531 CPUX86State *env = &cpu->env; 5532 FeatureWord w; 5533 5534 cs->env_ptr = env; 5535 5536 object_property_add(obj, "family", "int", 5537 x86_cpuid_version_get_family, 5538 x86_cpuid_version_set_family, NULL, NULL, NULL); 5539 object_property_add(obj, "model", "int", 5540 x86_cpuid_version_get_model, 5541 x86_cpuid_version_set_model, NULL, NULL, NULL); 5542 object_property_add(obj, "stepping", "int", 5543 x86_cpuid_version_get_stepping, 5544 x86_cpuid_version_set_stepping, NULL, NULL, NULL); 5545 object_property_add_str(obj, "vendor", 5546 x86_cpuid_get_vendor, 5547 x86_cpuid_set_vendor, NULL); 5548 object_property_add_str(obj, "model-id", 5549 x86_cpuid_get_model_id, 5550 x86_cpuid_set_model_id, NULL); 5551 object_property_add(obj, "tsc-frequency", "int", 5552 x86_cpuid_get_tsc_freq, 5553 x86_cpuid_set_tsc_freq, NULL, NULL, NULL); 5554 object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo", 5555 x86_cpu_get_feature_words, 5556 NULL, NULL, (void *)env->features, NULL); 5557 object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo", 5558 x86_cpu_get_feature_words, 5559 NULL, NULL, (void *)cpu->filtered_features, NULL); 5560 5561 object_property_add(obj, "crash-information", "GuestPanicInformation", 5562 x86_cpu_get_crash_info_qom, NULL, NULL, NULL, NULL); 5563 5564 cpu->hyperv_spinlock_attempts = HYPERV_SPINLOCK_NEVER_RETRY; 5565 5566 for (w = 0; w < FEATURE_WORDS; w++) { 5567 int bitnr; 5568 5569 for (bitnr = 0; bitnr < 32; bitnr++) { 5570 x86_cpu_register_feature_bit_props(cpu, w, bitnr); 5571 } 5572 } 5573 5574 object_property_add_alias(obj, "sse3", obj, "pni", &error_abort); 5575 object_property_add_alias(obj, "pclmuldq", obj, "pclmulqdq", &error_abort); 5576 object_property_add_alias(obj, "sse4-1", obj, "sse4.1", &error_abort); 5577 object_property_add_alias(obj, "sse4-2", obj, "sse4.2", &error_abort); 5578 object_property_add_alias(obj, "xd", obj, "nx", &error_abort); 5579 object_property_add_alias(obj, "ffxsr", obj, "fxsr-opt", &error_abort); 5580 object_property_add_alias(obj, "i64", obj, "lm", &error_abort); 5581 5582 object_property_add_alias(obj, "ds_cpl", obj, "ds-cpl", &error_abort); 5583 object_property_add_alias(obj, "tsc_adjust", obj, "tsc-adjust", &error_abort); 5584 object_property_add_alias(obj, "fxsr_opt", obj, "fxsr-opt", &error_abort); 5585 object_property_add_alias(obj, "lahf_lm", obj, "lahf-lm", &error_abort); 5586 object_property_add_alias(obj, "cmp_legacy", obj, "cmp-legacy", &error_abort); 5587 object_property_add_alias(obj, "nodeid_msr", obj, "nodeid-msr", &error_abort); 5588 object_property_add_alias(obj, "perfctr_core", obj, "perfctr-core", &error_abort); 5589 object_property_add_alias(obj, "perfctr_nb", obj, "perfctr-nb", &error_abort); 5590 object_property_add_alias(obj, "kvm_nopiodelay", obj, "kvm-nopiodelay", &error_abort); 5591 object_property_add_alias(obj, "kvm_mmu", obj, "kvm-mmu", &error_abort); 5592 object_property_add_alias(obj, "kvm_asyncpf", obj, "kvm-asyncpf", &error_abort); 5593 object_property_add_alias(obj, "kvm_steal_time", obj, "kvm-steal-time", &error_abort); 5594 object_property_add_alias(obj, "kvm_pv_eoi", obj, "kvm-pv-eoi", &error_abort); 5595 object_property_add_alias(obj, "kvm_pv_unhalt", obj, "kvm-pv-unhalt", &error_abort); 5596 object_property_add_alias(obj, "svm_lock", obj, "svm-lock", &error_abort); 5597 object_property_add_alias(obj, "nrip_save", obj, "nrip-save", &error_abort); 5598 object_property_add_alias(obj, "tsc_scale", obj, "tsc-scale", &error_abort); 5599 object_property_add_alias(obj, "vmcb_clean", obj, "vmcb-clean", &error_abort); 5600 object_property_add_alias(obj, "pause_filter", obj, "pause-filter", &error_abort); 5601 object_property_add_alias(obj, "sse4_1", obj, "sse4.1", &error_abort); 5602 object_property_add_alias(obj, "sse4_2", obj, "sse4.2", &error_abort); 5603 5604 if (xcc->cpu_def) { 5605 x86_cpu_load_def(cpu, xcc->cpu_def, &error_abort); 5606 } 5607 } 5608 5609 static int64_t x86_cpu_get_arch_id(CPUState *cs) 5610 { 5611 X86CPU *cpu = X86_CPU(cs); 5612 5613 return cpu->apic_id; 5614 } 5615 5616 static bool x86_cpu_get_paging_enabled(const CPUState *cs) 5617 { 5618 X86CPU *cpu = X86_CPU(cs); 5619 5620 return cpu->env.cr[0] & CR0_PG_MASK; 5621 } 5622 5623 static void x86_cpu_set_pc(CPUState *cs, vaddr value) 5624 { 5625 X86CPU *cpu = X86_CPU(cs); 5626 5627 cpu->env.eip = value; 5628 } 5629 5630 static void x86_cpu_synchronize_from_tb(CPUState *cs, TranslationBlock *tb) 5631 { 5632 X86CPU *cpu = X86_CPU(cs); 5633 5634 cpu->env.eip = tb->pc - tb->cs_base; 5635 } 5636 5637 int x86_cpu_pending_interrupt(CPUState *cs, int interrupt_request) 5638 { 5639 X86CPU *cpu = X86_CPU(cs); 5640 CPUX86State *env = &cpu->env; 5641 5642 #if !defined(CONFIG_USER_ONLY) 5643 if (interrupt_request & CPU_INTERRUPT_POLL) { 5644 return CPU_INTERRUPT_POLL; 5645 } 5646 #endif 5647 if (interrupt_request & CPU_INTERRUPT_SIPI) { 5648 return CPU_INTERRUPT_SIPI; 5649 } 5650 5651 if (env->hflags2 & HF2_GIF_MASK) { 5652 if ((interrupt_request & CPU_INTERRUPT_SMI) && 5653 !(env->hflags & HF_SMM_MASK)) { 5654 return CPU_INTERRUPT_SMI; 5655 } else if ((interrupt_request & CPU_INTERRUPT_NMI) && 5656 !(env->hflags2 & HF2_NMI_MASK)) { 5657 return CPU_INTERRUPT_NMI; 5658 } else if (interrupt_request & CPU_INTERRUPT_MCE) { 5659 return CPU_INTERRUPT_MCE; 5660 } else if ((interrupt_request & CPU_INTERRUPT_HARD) && 5661 (((env->hflags2 & HF2_VINTR_MASK) && 5662 (env->hflags2 & HF2_HIF_MASK)) || 5663 (!(env->hflags2 & HF2_VINTR_MASK) && 5664 (env->eflags & IF_MASK && 5665 !(env->hflags & HF_INHIBIT_IRQ_MASK))))) { 5666 return CPU_INTERRUPT_HARD; 5667 #if !defined(CONFIG_USER_ONLY) 5668 } else if ((interrupt_request & CPU_INTERRUPT_VIRQ) && 5669 (env->eflags & IF_MASK) && 5670 !(env->hflags & HF_INHIBIT_IRQ_MASK)) { 5671 return CPU_INTERRUPT_VIRQ; 5672 #endif 5673 } 5674 } 5675 5676 return 0; 5677 } 5678 5679 static bool x86_cpu_has_work(CPUState *cs) 5680 { 5681 return x86_cpu_pending_interrupt(cs, cs->interrupt_request) != 0; 5682 } 5683 5684 static void x86_disas_set_info(CPUState *cs, disassemble_info *info) 5685 { 5686 X86CPU *cpu = X86_CPU(cs); 5687 CPUX86State *env = &cpu->env; 5688 5689 info->mach = (env->hflags & HF_CS64_MASK ? bfd_mach_x86_64 5690 : env->hflags & HF_CS32_MASK ? bfd_mach_i386_i386 5691 : bfd_mach_i386_i8086); 5692 info->print_insn = print_insn_i386; 5693 5694 info->cap_arch = CS_ARCH_X86; 5695 info->cap_mode = (env->hflags & HF_CS64_MASK ? CS_MODE_64 5696 : env->hflags & HF_CS32_MASK ? CS_MODE_32 5697 : CS_MODE_16); 5698 info->cap_insn_unit = 1; 5699 info->cap_insn_split = 8; 5700 } 5701 5702 void x86_update_hflags(CPUX86State *env) 5703 { 5704 uint32_t hflags; 5705 #define HFLAG_COPY_MASK \ 5706 ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \ 5707 HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \ 5708 HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \ 5709 HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK) 5710 5711 hflags = env->hflags & HFLAG_COPY_MASK; 5712 hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK; 5713 hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT); 5714 hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) & 5715 (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK); 5716 hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK)); 5717 5718 if (env->cr[4] & CR4_OSFXSR_MASK) { 5719 hflags |= HF_OSFXSR_MASK; 5720 } 5721 5722 if (env->efer & MSR_EFER_LMA) { 5723 hflags |= HF_LMA_MASK; 5724 } 5725 5726 if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) { 5727 hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK; 5728 } else { 5729 hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >> 5730 (DESC_B_SHIFT - HF_CS32_SHIFT); 5731 hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >> 5732 (DESC_B_SHIFT - HF_SS32_SHIFT); 5733 if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) || 5734 !(hflags & HF_CS32_MASK)) { 5735 hflags |= HF_ADDSEG_MASK; 5736 } else { 5737 hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base | 5738 env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT; 5739 } 5740 } 5741 env->hflags = hflags; 5742 } 5743 5744 static Property x86_cpu_properties[] = { 5745 #ifdef CONFIG_USER_ONLY 5746 /* apic_id = 0 by default for *-user, see commit 9886e834 */ 5747 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, 0), 5748 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, 0), 5749 DEFINE_PROP_INT32("core-id", X86CPU, core_id, 0), 5750 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, 0), 5751 #else 5752 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, UNASSIGNED_APIC_ID), 5753 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, -1), 5754 DEFINE_PROP_INT32("core-id", X86CPU, core_id, -1), 5755 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, -1), 5756 #endif 5757 DEFINE_PROP_INT32("node-id", X86CPU, node_id, CPU_UNSET_NUMA_NODE_ID), 5758 DEFINE_PROP_BOOL("pmu", X86CPU, enable_pmu, false), 5759 { .name = "hv-spinlocks", .info = &qdev_prop_spinlocks }, 5760 DEFINE_PROP_BOOL("hv-relaxed", X86CPU, hyperv_relaxed_timing, false), 5761 DEFINE_PROP_BOOL("hv-vapic", X86CPU, hyperv_vapic, false), 5762 DEFINE_PROP_BOOL("hv-time", X86CPU, hyperv_time, false), 5763 DEFINE_PROP_BOOL("hv-crash", X86CPU, hyperv_crash, false), 5764 DEFINE_PROP_BOOL("hv-reset", X86CPU, hyperv_reset, false), 5765 DEFINE_PROP_BOOL("hv-vpindex", X86CPU, hyperv_vpindex, false), 5766 DEFINE_PROP_BOOL("hv-runtime", X86CPU, hyperv_runtime, false), 5767 DEFINE_PROP_BOOL("hv-synic", X86CPU, hyperv_synic, false), 5768 DEFINE_PROP_BOOL("hv-stimer", X86CPU, hyperv_stimer, false), 5769 DEFINE_PROP_BOOL("hv-frequencies", X86CPU, hyperv_frequencies, false), 5770 DEFINE_PROP_BOOL("hv-reenlightenment", X86CPU, hyperv_reenlightenment, false), 5771 DEFINE_PROP_BOOL("hv-tlbflush", X86CPU, hyperv_tlbflush, false), 5772 DEFINE_PROP_BOOL("hv-evmcs", X86CPU, hyperv_evmcs, false), 5773 DEFINE_PROP_BOOL("hv-ipi", X86CPU, hyperv_ipi, false), 5774 DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true), 5775 DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false), 5776 DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true), 5777 DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 0), 5778 DEFINE_PROP_BOOL("host-phys-bits", X86CPU, host_phys_bits, false), 5779 DEFINE_PROP_UINT8("host-phys-bits-limit", X86CPU, host_phys_bits_limit, 0), 5780 DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true), 5781 DEFINE_PROP_UINT32("level", X86CPU, env.cpuid_level, UINT32_MAX), 5782 DEFINE_PROP_UINT32("xlevel", X86CPU, env.cpuid_xlevel, UINT32_MAX), 5783 DEFINE_PROP_UINT32("xlevel2", X86CPU, env.cpuid_xlevel2, UINT32_MAX), 5784 DEFINE_PROP_UINT32("min-level", X86CPU, env.cpuid_min_level, 0), 5785 DEFINE_PROP_UINT32("min-xlevel", X86CPU, env.cpuid_min_xlevel, 0), 5786 DEFINE_PROP_UINT32("min-xlevel2", X86CPU, env.cpuid_min_xlevel2, 0), 5787 DEFINE_PROP_BOOL("full-cpuid-auto-level", X86CPU, full_cpuid_auto_level, true), 5788 DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor_id), 5789 DEFINE_PROP_BOOL("cpuid-0xb", X86CPU, enable_cpuid_0xb, true), 5790 DEFINE_PROP_BOOL("lmce", X86CPU, enable_lmce, false), 5791 DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true), 5792 DEFINE_PROP_BOOL("kvm-no-smi-migration", X86CPU, kvm_no_smi_migration, 5793 false), 5794 DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true), 5795 DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true), 5796 DEFINE_PROP_BOOL("x-migrate-smi-count", X86CPU, migrate_smi_count, 5797 true), 5798 /* 5799 * lecacy_cache defaults to true unless the CPU model provides its 5800 * own cache information (see x86_cpu_load_def()). 5801 */ 5802 DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, true), 5803 5804 /* 5805 * From "Requirements for Implementing the Microsoft 5806 * Hypervisor Interface": 5807 * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs 5808 * 5809 * "Starting with Windows Server 2012 and Windows 8, if 5810 * CPUID.40000005.EAX contains a value of -1, Windows assumes that 5811 * the hypervisor imposes no specific limit to the number of VPs. 5812 * In this case, Windows Server 2012 guest VMs may use more than 5813 * 64 VPs, up to the maximum supported number of processors applicable 5814 * to the specific Windows version being used." 5815 */ 5816 DEFINE_PROP_INT32("x-hv-max-vps", X86CPU, hv_max_vps, -1), 5817 DEFINE_PROP_BOOL("x-hv-synic-kvm-only", X86CPU, hyperv_synic_kvm_only, 5818 false), 5819 DEFINE_PROP_END_OF_LIST() 5820 }; 5821 5822 static void x86_cpu_common_class_init(ObjectClass *oc, void *data) 5823 { 5824 X86CPUClass *xcc = X86_CPU_CLASS(oc); 5825 CPUClass *cc = CPU_CLASS(oc); 5826 DeviceClass *dc = DEVICE_CLASS(oc); 5827 5828 device_class_set_parent_realize(dc, x86_cpu_realizefn, 5829 &xcc->parent_realize); 5830 device_class_set_parent_unrealize(dc, x86_cpu_unrealizefn, 5831 &xcc->parent_unrealize); 5832 dc->props = x86_cpu_properties; 5833 5834 xcc->parent_reset = cc->reset; 5835 cc->reset = x86_cpu_reset; 5836 cc->reset_dump_flags = CPU_DUMP_FPU | CPU_DUMP_CCOP; 5837 5838 cc->class_by_name = x86_cpu_class_by_name; 5839 cc->parse_features = x86_cpu_parse_featurestr; 5840 cc->has_work = x86_cpu_has_work; 5841 #ifdef CONFIG_TCG 5842 cc->do_interrupt = x86_cpu_do_interrupt; 5843 cc->cpu_exec_interrupt = x86_cpu_exec_interrupt; 5844 #endif 5845 cc->dump_state = x86_cpu_dump_state; 5846 cc->get_crash_info = x86_cpu_get_crash_info; 5847 cc->set_pc = x86_cpu_set_pc; 5848 cc->synchronize_from_tb = x86_cpu_synchronize_from_tb; 5849 cc->gdb_read_register = x86_cpu_gdb_read_register; 5850 cc->gdb_write_register = x86_cpu_gdb_write_register; 5851 cc->get_arch_id = x86_cpu_get_arch_id; 5852 cc->get_paging_enabled = x86_cpu_get_paging_enabled; 5853 #ifdef CONFIG_USER_ONLY 5854 cc->handle_mmu_fault = x86_cpu_handle_mmu_fault; 5855 #else 5856 cc->asidx_from_attrs = x86_asidx_from_attrs; 5857 cc->get_memory_mapping = x86_cpu_get_memory_mapping; 5858 cc->get_phys_page_debug = x86_cpu_get_phys_page_debug; 5859 cc->write_elf64_note = x86_cpu_write_elf64_note; 5860 cc->write_elf64_qemunote = x86_cpu_write_elf64_qemunote; 5861 cc->write_elf32_note = x86_cpu_write_elf32_note; 5862 cc->write_elf32_qemunote = x86_cpu_write_elf32_qemunote; 5863 cc->vmsd = &vmstate_x86_cpu; 5864 #endif 5865 cc->gdb_arch_name = x86_gdb_arch_name; 5866 #ifdef TARGET_X86_64 5867 cc->gdb_core_xml_file = "i386-64bit.xml"; 5868 cc->gdb_num_core_regs = 57; 5869 #else 5870 cc->gdb_core_xml_file = "i386-32bit.xml"; 5871 cc->gdb_num_core_regs = 41; 5872 #endif 5873 #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY) 5874 cc->debug_excp_handler = breakpoint_handler; 5875 #endif 5876 cc->cpu_exec_enter = x86_cpu_exec_enter; 5877 cc->cpu_exec_exit = x86_cpu_exec_exit; 5878 #ifdef CONFIG_TCG 5879 cc->tcg_initialize = tcg_x86_init; 5880 #endif 5881 cc->disas_set_info = x86_disas_set_info; 5882 5883 dc->user_creatable = true; 5884 } 5885 5886 static const TypeInfo x86_cpu_type_info = { 5887 .name = TYPE_X86_CPU, 5888 .parent = TYPE_CPU, 5889 .instance_size = sizeof(X86CPU), 5890 .instance_init = x86_cpu_initfn, 5891 .abstract = true, 5892 .class_size = sizeof(X86CPUClass), 5893 .class_init = x86_cpu_common_class_init, 5894 }; 5895 5896 5897 /* "base" CPU model, used by query-cpu-model-expansion */ 5898 static void x86_cpu_base_class_init(ObjectClass *oc, void *data) 5899 { 5900 X86CPUClass *xcc = X86_CPU_CLASS(oc); 5901 5902 xcc->static_model = true; 5903 xcc->migration_safe = true; 5904 xcc->model_description = "base CPU model type with no features enabled"; 5905 xcc->ordering = 8; 5906 } 5907 5908 static const TypeInfo x86_base_cpu_type_info = { 5909 .name = X86_CPU_TYPE_NAME("base"), 5910 .parent = TYPE_X86_CPU, 5911 .class_init = x86_cpu_base_class_init, 5912 }; 5913 5914 static void x86_cpu_register_types(void) 5915 { 5916 int i; 5917 5918 type_register_static(&x86_cpu_type_info); 5919 for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) { 5920 x86_register_cpudef_type(&builtin_x86_defs[i]); 5921 } 5922 type_register_static(&max_x86_cpu_type_info); 5923 type_register_static(&x86_base_cpu_type_info); 5924 #if defined(CONFIG_KVM) || defined(CONFIG_HVF) 5925 type_register_static(&host_x86_cpu_type_info); 5926 #endif 5927 } 5928 5929 type_init(x86_cpu_register_types) 5930