1 /* 2 * i386 CPUID, CPU class, definitions, models 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.1 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/qemu-print.h" 24 #include "qemu/hw-version.h" 25 #include "cpu.h" 26 #include "tcg/helper-tcg.h" 27 #include "exec/translation-block.h" 28 #include "system/hvf.h" 29 #include "hvf/hvf-i386.h" 30 #include "kvm/kvm_i386.h" 31 #include "sev.h" 32 #include "qapi/error.h" 33 #include "qemu/error-report.h" 34 #include "qapi/qapi-visit-machine.h" 35 #include "standard-headers/asm-x86/kvm_para.h" 36 #include "hw/qdev-properties.h" 37 #include "hw/i386/topology.h" 38 #include "exec/watchpoint.h" 39 #ifndef CONFIG_USER_ONLY 40 #include "system/reset.h" 41 #include "qapi/qapi-commands-machine-target.h" 42 #include "system/address-spaces.h" 43 #include "hw/boards.h" 44 #include "hw/i386/sgx-epc.h" 45 #endif 46 #include "tcg/tcg-cpu.h" 47 48 #include "disas/capstone.h" 49 #include "cpu-internal.h" 50 51 static void x86_cpu_realizefn(DeviceState *dev, Error **errp); 52 static void x86_cpu_get_supported_cpuid(uint32_t func, uint32_t index, 53 uint32_t *eax, uint32_t *ebx, 54 uint32_t *ecx, uint32_t *edx); 55 56 /* Helpers for building CPUID[2] descriptors: */ 57 58 struct CPUID2CacheDescriptorInfo { 59 enum CacheType type; 60 int level; 61 int size; 62 int line_size; 63 int associativity; 64 }; 65 66 /* 67 * Known CPUID 2 cache descriptors. 68 * From Intel SDM Volume 2A, CPUID instruction 69 */ 70 struct CPUID2CacheDescriptorInfo cpuid2_cache_descriptors[] = { 71 [0x06] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 8 * KiB, 72 .associativity = 4, .line_size = 32, }, 73 [0x08] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 16 * KiB, 74 .associativity = 4, .line_size = 32, }, 75 [0x09] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 32 * KiB, 76 .associativity = 4, .line_size = 64, }, 77 [0x0A] = { .level = 1, .type = DATA_CACHE, .size = 8 * KiB, 78 .associativity = 2, .line_size = 32, }, 79 [0x0C] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB, 80 .associativity = 4, .line_size = 32, }, 81 [0x0D] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB, 82 .associativity = 4, .line_size = 64, }, 83 [0x0E] = { .level = 1, .type = DATA_CACHE, .size = 24 * KiB, 84 .associativity = 6, .line_size = 64, }, 85 [0x1D] = { .level = 2, .type = UNIFIED_CACHE, .size = 128 * KiB, 86 .associativity = 2, .line_size = 64, }, 87 [0x21] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB, 88 .associativity = 8, .line_size = 64, }, 89 /* lines per sector is not supported cpuid2_cache_descriptor(), 90 * so descriptors 0x22, 0x23 are not included 91 */ 92 [0x24] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB, 93 .associativity = 16, .line_size = 64, }, 94 /* lines per sector is not supported cpuid2_cache_descriptor(), 95 * so descriptors 0x25, 0x20 are not included 96 */ 97 [0x2C] = { .level = 1, .type = DATA_CACHE, .size = 32 * KiB, 98 .associativity = 8, .line_size = 64, }, 99 [0x30] = { .level = 1, .type = INSTRUCTION_CACHE, .size = 32 * KiB, 100 .associativity = 8, .line_size = 64, }, 101 [0x41] = { .level = 2, .type = UNIFIED_CACHE, .size = 128 * KiB, 102 .associativity = 4, .line_size = 32, }, 103 [0x42] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB, 104 .associativity = 4, .line_size = 32, }, 105 [0x43] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB, 106 .associativity = 4, .line_size = 32, }, 107 [0x44] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB, 108 .associativity = 4, .line_size = 32, }, 109 [0x45] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB, 110 .associativity = 4, .line_size = 32, }, 111 [0x46] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB, 112 .associativity = 4, .line_size = 64, }, 113 [0x47] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB, 114 .associativity = 8, .line_size = 64, }, 115 [0x48] = { .level = 2, .type = UNIFIED_CACHE, .size = 3 * MiB, 116 .associativity = 12, .line_size = 64, }, 117 /* Descriptor 0x49 depends on CPU family/model, so it is not included */ 118 [0x4A] = { .level = 3, .type = UNIFIED_CACHE, .size = 6 * MiB, 119 .associativity = 12, .line_size = 64, }, 120 [0x4B] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB, 121 .associativity = 16, .line_size = 64, }, 122 [0x4C] = { .level = 3, .type = UNIFIED_CACHE, .size = 12 * MiB, 123 .associativity = 12, .line_size = 64, }, 124 [0x4D] = { .level = 3, .type = UNIFIED_CACHE, .size = 16 * MiB, 125 .associativity = 16, .line_size = 64, }, 126 [0x4E] = { .level = 2, .type = UNIFIED_CACHE, .size = 6 * MiB, 127 .associativity = 24, .line_size = 64, }, 128 [0x60] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB, 129 .associativity = 8, .line_size = 64, }, 130 [0x66] = { .level = 1, .type = DATA_CACHE, .size = 8 * KiB, 131 .associativity = 4, .line_size = 64, }, 132 [0x67] = { .level = 1, .type = DATA_CACHE, .size = 16 * KiB, 133 .associativity = 4, .line_size = 64, }, 134 [0x68] = { .level = 1, .type = DATA_CACHE, .size = 32 * KiB, 135 .associativity = 4, .line_size = 64, }, 136 [0x78] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB, 137 .associativity = 4, .line_size = 64, }, 138 /* lines per sector is not supported cpuid2_cache_descriptor(), 139 * so descriptors 0x79, 0x7A, 0x7B, 0x7C are not included. 140 */ 141 [0x7D] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB, 142 .associativity = 8, .line_size = 64, }, 143 [0x7F] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB, 144 .associativity = 2, .line_size = 64, }, 145 [0x80] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB, 146 .associativity = 8, .line_size = 64, }, 147 [0x82] = { .level = 2, .type = UNIFIED_CACHE, .size = 256 * KiB, 148 .associativity = 8, .line_size = 32, }, 149 [0x83] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB, 150 .associativity = 8, .line_size = 32, }, 151 [0x84] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB, 152 .associativity = 8, .line_size = 32, }, 153 [0x85] = { .level = 2, .type = UNIFIED_CACHE, .size = 2 * MiB, 154 .associativity = 8, .line_size = 32, }, 155 [0x86] = { .level = 2, .type = UNIFIED_CACHE, .size = 512 * KiB, 156 .associativity = 4, .line_size = 64, }, 157 [0x87] = { .level = 2, .type = UNIFIED_CACHE, .size = 1 * MiB, 158 .associativity = 8, .line_size = 64, }, 159 [0xD0] = { .level = 3, .type = UNIFIED_CACHE, .size = 512 * KiB, 160 .associativity = 4, .line_size = 64, }, 161 [0xD1] = { .level = 3, .type = UNIFIED_CACHE, .size = 1 * MiB, 162 .associativity = 4, .line_size = 64, }, 163 [0xD2] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB, 164 .associativity = 4, .line_size = 64, }, 165 [0xD6] = { .level = 3, .type = UNIFIED_CACHE, .size = 1 * MiB, 166 .associativity = 8, .line_size = 64, }, 167 [0xD7] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB, 168 .associativity = 8, .line_size = 64, }, 169 [0xD8] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB, 170 .associativity = 8, .line_size = 64, }, 171 [0xDC] = { .level = 3, .type = UNIFIED_CACHE, .size = 1.5 * MiB, 172 .associativity = 12, .line_size = 64, }, 173 [0xDD] = { .level = 3, .type = UNIFIED_CACHE, .size = 3 * MiB, 174 .associativity = 12, .line_size = 64, }, 175 [0xDE] = { .level = 3, .type = UNIFIED_CACHE, .size = 6 * MiB, 176 .associativity = 12, .line_size = 64, }, 177 [0xE2] = { .level = 3, .type = UNIFIED_CACHE, .size = 2 * MiB, 178 .associativity = 16, .line_size = 64, }, 179 [0xE3] = { .level = 3, .type = UNIFIED_CACHE, .size = 4 * MiB, 180 .associativity = 16, .line_size = 64, }, 181 [0xE4] = { .level = 3, .type = UNIFIED_CACHE, .size = 8 * MiB, 182 .associativity = 16, .line_size = 64, }, 183 [0xEA] = { .level = 3, .type = UNIFIED_CACHE, .size = 12 * MiB, 184 .associativity = 24, .line_size = 64, }, 185 [0xEB] = { .level = 3, .type = UNIFIED_CACHE, .size = 18 * MiB, 186 .associativity = 24, .line_size = 64, }, 187 [0xEC] = { .level = 3, .type = UNIFIED_CACHE, .size = 24 * MiB, 188 .associativity = 24, .line_size = 64, }, 189 }; 190 191 /* 192 * "CPUID leaf 2 does not report cache descriptor information, 193 * use CPUID leaf 4 to query cache parameters" 194 */ 195 #define CACHE_DESCRIPTOR_UNAVAILABLE 0xFF 196 197 /* 198 * Return a CPUID 2 cache descriptor for a given cache. 199 * If no known descriptor is found, return CACHE_DESCRIPTOR_UNAVAILABLE 200 */ 201 static uint8_t cpuid2_cache_descriptor(CPUCacheInfo *cache) 202 { 203 int i; 204 205 assert(cache->size > 0); 206 assert(cache->level > 0); 207 assert(cache->line_size > 0); 208 assert(cache->associativity > 0); 209 for (i = 0; i < ARRAY_SIZE(cpuid2_cache_descriptors); i++) { 210 struct CPUID2CacheDescriptorInfo *d = &cpuid2_cache_descriptors[i]; 211 if (d->level == cache->level && d->type == cache->type && 212 d->size == cache->size && d->line_size == cache->line_size && 213 d->associativity == cache->associativity) { 214 return i; 215 } 216 } 217 218 return CACHE_DESCRIPTOR_UNAVAILABLE; 219 } 220 221 /* CPUID Leaf 4 constants: */ 222 223 /* EAX: */ 224 #define CACHE_TYPE_D 1 225 #define CACHE_TYPE_I 2 226 #define CACHE_TYPE_UNIFIED 3 227 228 #define CACHE_LEVEL(l) (l << 5) 229 230 #define CACHE_SELF_INIT_LEVEL (1 << 8) 231 232 /* EDX: */ 233 #define CACHE_NO_INVD_SHARING (1 << 0) 234 #define CACHE_INCLUSIVE (1 << 1) 235 #define CACHE_COMPLEX_IDX (1 << 2) 236 237 /* Encode CacheType for CPUID[4].EAX */ 238 #define CACHE_TYPE(t) (((t) == DATA_CACHE) ? CACHE_TYPE_D : \ 239 ((t) == INSTRUCTION_CACHE) ? CACHE_TYPE_I : \ 240 ((t) == UNIFIED_CACHE) ? CACHE_TYPE_UNIFIED : \ 241 0 /* Invalid value */) 242 243 static uint32_t max_thread_ids_for_cache(X86CPUTopoInfo *topo_info, 244 enum CpuTopologyLevel share_level) 245 { 246 uint32_t num_ids = 0; 247 248 switch (share_level) { 249 case CPU_TOPOLOGY_LEVEL_CORE: 250 num_ids = 1 << apicid_core_offset(topo_info); 251 break; 252 case CPU_TOPOLOGY_LEVEL_MODULE: 253 num_ids = 1 << apicid_module_offset(topo_info); 254 break; 255 case CPU_TOPOLOGY_LEVEL_DIE: 256 num_ids = 1 << apicid_die_offset(topo_info); 257 break; 258 case CPU_TOPOLOGY_LEVEL_SOCKET: 259 num_ids = 1 << apicid_pkg_offset(topo_info); 260 break; 261 default: 262 /* 263 * Currently there is no use case for THREAD, so use 264 * assert directly to facilitate debugging. 265 */ 266 g_assert_not_reached(); 267 } 268 269 return num_ids - 1; 270 } 271 272 static uint32_t max_core_ids_in_package(X86CPUTopoInfo *topo_info) 273 { 274 uint32_t num_cores = 1 << (apicid_pkg_offset(topo_info) - 275 apicid_core_offset(topo_info)); 276 return num_cores - 1; 277 } 278 279 /* Encode cache info for CPUID[4] */ 280 static void encode_cache_cpuid4(CPUCacheInfo *cache, 281 X86CPUTopoInfo *topo_info, 282 uint32_t *eax, uint32_t *ebx, 283 uint32_t *ecx, uint32_t *edx) 284 { 285 assert(cache->size == cache->line_size * cache->associativity * 286 cache->partitions * cache->sets); 287 288 *eax = CACHE_TYPE(cache->type) | 289 CACHE_LEVEL(cache->level) | 290 (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0) | 291 (max_core_ids_in_package(topo_info) << 26) | 292 (max_thread_ids_for_cache(topo_info, cache->share_level) << 14); 293 294 assert(cache->line_size > 0); 295 assert(cache->partitions > 0); 296 assert(cache->associativity > 0); 297 /* We don't implement fully-associative caches */ 298 assert(cache->associativity < cache->sets); 299 *ebx = (cache->line_size - 1) | 300 ((cache->partitions - 1) << 12) | 301 ((cache->associativity - 1) << 22); 302 303 assert(cache->sets > 0); 304 *ecx = cache->sets - 1; 305 306 *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) | 307 (cache->inclusive ? CACHE_INCLUSIVE : 0) | 308 (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0); 309 } 310 311 static uint32_t num_threads_by_topo_level(X86CPUTopoInfo *topo_info, 312 enum CpuTopologyLevel topo_level) 313 { 314 switch (topo_level) { 315 case CPU_TOPOLOGY_LEVEL_THREAD: 316 return 1; 317 case CPU_TOPOLOGY_LEVEL_CORE: 318 return topo_info->threads_per_core; 319 case CPU_TOPOLOGY_LEVEL_MODULE: 320 return x86_threads_per_module(topo_info); 321 case CPU_TOPOLOGY_LEVEL_DIE: 322 return x86_threads_per_die(topo_info); 323 case CPU_TOPOLOGY_LEVEL_SOCKET: 324 return x86_threads_per_pkg(topo_info); 325 default: 326 g_assert_not_reached(); 327 } 328 return 0; 329 } 330 331 static uint32_t apicid_offset_by_topo_level(X86CPUTopoInfo *topo_info, 332 enum CpuTopologyLevel topo_level) 333 { 334 switch (topo_level) { 335 case CPU_TOPOLOGY_LEVEL_THREAD: 336 return 0; 337 case CPU_TOPOLOGY_LEVEL_CORE: 338 return apicid_core_offset(topo_info); 339 case CPU_TOPOLOGY_LEVEL_MODULE: 340 return apicid_module_offset(topo_info); 341 case CPU_TOPOLOGY_LEVEL_DIE: 342 return apicid_die_offset(topo_info); 343 case CPU_TOPOLOGY_LEVEL_SOCKET: 344 return apicid_pkg_offset(topo_info); 345 default: 346 g_assert_not_reached(); 347 } 348 return 0; 349 } 350 351 static uint32_t cpuid1f_topo_type(enum CpuTopologyLevel topo_level) 352 { 353 switch (topo_level) { 354 case CPU_TOPOLOGY_LEVEL_INVALID: 355 return CPUID_1F_ECX_TOPO_LEVEL_INVALID; 356 case CPU_TOPOLOGY_LEVEL_THREAD: 357 return CPUID_1F_ECX_TOPO_LEVEL_SMT; 358 case CPU_TOPOLOGY_LEVEL_CORE: 359 return CPUID_1F_ECX_TOPO_LEVEL_CORE; 360 case CPU_TOPOLOGY_LEVEL_MODULE: 361 return CPUID_1F_ECX_TOPO_LEVEL_MODULE; 362 case CPU_TOPOLOGY_LEVEL_DIE: 363 return CPUID_1F_ECX_TOPO_LEVEL_DIE; 364 default: 365 /* Other types are not supported in QEMU. */ 366 g_assert_not_reached(); 367 } 368 return 0; 369 } 370 371 static void encode_topo_cpuid1f(CPUX86State *env, uint32_t count, 372 X86CPUTopoInfo *topo_info, 373 uint32_t *eax, uint32_t *ebx, 374 uint32_t *ecx, uint32_t *edx) 375 { 376 X86CPU *cpu = env_archcpu(env); 377 unsigned long level, base_level, next_level; 378 uint32_t num_threads_next_level, offset_next_level; 379 380 assert(count <= CPU_TOPOLOGY_LEVEL_SOCKET); 381 382 /* 383 * Find the No.(count + 1) topology level in avail_cpu_topo bitmap. 384 * The search starts from bit 0 (CPU_TOPOLOGY_LEVEL_THREAD). 385 */ 386 level = CPU_TOPOLOGY_LEVEL_THREAD; 387 base_level = level; 388 for (int i = 0; i <= count; i++) { 389 level = find_next_bit(env->avail_cpu_topo, 390 CPU_TOPOLOGY_LEVEL_SOCKET, 391 base_level); 392 393 /* 394 * CPUID[0x1f] doesn't explicitly encode the package level, 395 * and it just encodes the invalid level (all fields are 0) 396 * into the last subleaf of 0x1f. 397 */ 398 if (level == CPU_TOPOLOGY_LEVEL_SOCKET) { 399 level = CPU_TOPOLOGY_LEVEL_INVALID; 400 break; 401 } 402 /* Search the next level. */ 403 base_level = level + 1; 404 } 405 406 if (level == CPU_TOPOLOGY_LEVEL_INVALID) { 407 num_threads_next_level = 0; 408 offset_next_level = 0; 409 } else { 410 next_level = find_next_bit(env->avail_cpu_topo, 411 CPU_TOPOLOGY_LEVEL_SOCKET, 412 level + 1); 413 num_threads_next_level = num_threads_by_topo_level(topo_info, 414 next_level); 415 offset_next_level = apicid_offset_by_topo_level(topo_info, 416 next_level); 417 } 418 419 *eax = offset_next_level; 420 /* The count (bits 15-00) doesn't need to be reliable. */ 421 *ebx = num_threads_next_level & 0xffff; 422 *ecx = (count & 0xff) | (cpuid1f_topo_type(level) << 8); 423 *edx = cpu->apic_id; 424 425 assert(!(*eax & ~0x1f)); 426 } 427 428 /* Encode cache info for CPUID[0x80000005].ECX or CPUID[0x80000005].EDX */ 429 static uint32_t encode_cache_cpuid80000005(CPUCacheInfo *cache) 430 { 431 assert(cache->size % 1024 == 0); 432 assert(cache->lines_per_tag > 0); 433 assert(cache->associativity > 0); 434 assert(cache->line_size > 0); 435 return ((cache->size / 1024) << 24) | (cache->associativity << 16) | 436 (cache->lines_per_tag << 8) | (cache->line_size); 437 } 438 439 #define ASSOC_FULL 0xFF 440 441 /* AMD associativity encoding used on CPUID Leaf 0x80000006: */ 442 #define AMD_ENC_ASSOC(a) (a <= 1 ? a : \ 443 a == 2 ? 0x2 : \ 444 a == 4 ? 0x4 : \ 445 a == 8 ? 0x6 : \ 446 a == 16 ? 0x8 : \ 447 a == 32 ? 0xA : \ 448 a == 48 ? 0xB : \ 449 a == 64 ? 0xC : \ 450 a == 96 ? 0xD : \ 451 a == 128 ? 0xE : \ 452 a == ASSOC_FULL ? 0xF : \ 453 0 /* invalid value */) 454 455 /* 456 * Encode cache info for CPUID[0x80000006].ECX and CPUID[0x80000006].EDX 457 * @l3 can be NULL. 458 */ 459 static void encode_cache_cpuid80000006(CPUCacheInfo *l2, 460 CPUCacheInfo *l3, 461 uint32_t *ecx, uint32_t *edx) 462 { 463 assert(l2->size % 1024 == 0); 464 assert(l2->associativity > 0); 465 assert(l2->lines_per_tag > 0); 466 assert(l2->line_size > 0); 467 *ecx = ((l2->size / 1024) << 16) | 468 (AMD_ENC_ASSOC(l2->associativity) << 12) | 469 (l2->lines_per_tag << 8) | (l2->line_size); 470 471 if (l3) { 472 assert(l3->size % (512 * 1024) == 0); 473 assert(l3->associativity > 0); 474 assert(l3->lines_per_tag > 0); 475 assert(l3->line_size > 0); 476 *edx = ((l3->size / (512 * 1024)) << 18) | 477 (AMD_ENC_ASSOC(l3->associativity) << 12) | 478 (l3->lines_per_tag << 8) | (l3->line_size); 479 } else { 480 *edx = 0; 481 } 482 } 483 484 /* Encode cache info for CPUID[8000001D] */ 485 static void encode_cache_cpuid8000001d(CPUCacheInfo *cache, 486 X86CPUTopoInfo *topo_info, 487 uint32_t *eax, uint32_t *ebx, 488 uint32_t *ecx, uint32_t *edx) 489 { 490 assert(cache->size == cache->line_size * cache->associativity * 491 cache->partitions * cache->sets); 492 493 *eax = CACHE_TYPE(cache->type) | CACHE_LEVEL(cache->level) | 494 (cache->self_init ? CACHE_SELF_INIT_LEVEL : 0); 495 *eax |= max_thread_ids_for_cache(topo_info, cache->share_level) << 14; 496 497 assert(cache->line_size > 0); 498 assert(cache->partitions > 0); 499 assert(cache->associativity > 0); 500 /* We don't implement fully-associative caches */ 501 assert(cache->associativity < cache->sets); 502 *ebx = (cache->line_size - 1) | 503 ((cache->partitions - 1) << 12) | 504 ((cache->associativity - 1) << 22); 505 506 assert(cache->sets > 0); 507 *ecx = cache->sets - 1; 508 509 *edx = (cache->no_invd_sharing ? CACHE_NO_INVD_SHARING : 0) | 510 (cache->inclusive ? CACHE_INCLUSIVE : 0) | 511 (cache->complex_indexing ? CACHE_COMPLEX_IDX : 0); 512 } 513 514 /* Encode cache info for CPUID[8000001E] */ 515 static void encode_topo_cpuid8000001e(X86CPU *cpu, X86CPUTopoInfo *topo_info, 516 uint32_t *eax, uint32_t *ebx, 517 uint32_t *ecx, uint32_t *edx) 518 { 519 X86CPUTopoIDs topo_ids; 520 521 x86_topo_ids_from_apicid(cpu->apic_id, topo_info, &topo_ids); 522 523 *eax = cpu->apic_id; 524 525 /* 526 * CPUID_Fn8000001E_EBX [Core Identifiers] (CoreId) 527 * Read-only. Reset: 0000_XXXXh. 528 * See Core::X86::Cpuid::ExtApicId. 529 * Core::X86::Cpuid::CoreId_lthree[1:0]_core[3:0]_thread[1:0]; 530 * Bits Description 531 * 31:16 Reserved. 532 * 15:8 ThreadsPerCore: threads per core. Read-only. Reset: XXh. 533 * The number of threads per core is ThreadsPerCore+1. 534 * 7:0 CoreId: core ID. Read-only. Reset: XXh. 535 * 536 * NOTE: CoreId is already part of apic_id. Just use it. We can 537 * use all the 8 bits to represent the core_id here. 538 */ 539 *ebx = ((topo_info->threads_per_core - 1) << 8) | (topo_ids.core_id & 0xFF); 540 541 /* 542 * CPUID_Fn8000001E_ECX [Node Identifiers] (NodeId) 543 * Read-only. Reset: 0000_0XXXh. 544 * Core::X86::Cpuid::NodeId_lthree[1:0]_core[3:0]_thread[1:0]; 545 * Bits Description 546 * 31:11 Reserved. 547 * 10:8 NodesPerProcessor: Node per processor. Read-only. Reset: XXXb. 548 * ValidValues: 549 * Value Description 550 * 0h 1 node per processor. 551 * 7h-1h Reserved. 552 * 7:0 NodeId: Node ID. Read-only. Reset: XXh. 553 * 554 * NOTE: Hardware reserves 3 bits for number of nodes per processor. 555 * But users can create more nodes than the actual hardware can 556 * support. To genaralize we can use all the upper 8 bits for nodes. 557 * NodeId is combination of node and socket_id which is already decoded 558 * in apic_id. Just use it by shifting. 559 */ 560 if (cpu->legacy_multi_node) { 561 *ecx = ((topo_info->dies_per_pkg - 1) << 8) | 562 ((cpu->apic_id >> apicid_die_offset(topo_info)) & 0xFF); 563 } else { 564 *ecx = (cpu->apic_id >> apicid_pkg_offset(topo_info)) & 0xFF; 565 } 566 567 *edx = 0; 568 } 569 570 /* 571 * Definitions of the hardcoded cache entries we expose: 572 * These are legacy cache values. If there is a need to change any 573 * of these values please use builtin_x86_defs 574 */ 575 576 /* L1 data cache: */ 577 static CPUCacheInfo legacy_l1d_cache = { 578 .type = DATA_CACHE, 579 .level = 1, 580 .size = 32 * KiB, 581 .self_init = 1, 582 .line_size = 64, 583 .associativity = 8, 584 .sets = 64, 585 .partitions = 1, 586 .no_invd_sharing = true, 587 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 588 }; 589 590 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */ 591 static CPUCacheInfo legacy_l1d_cache_amd = { 592 .type = DATA_CACHE, 593 .level = 1, 594 .size = 64 * KiB, 595 .self_init = 1, 596 .line_size = 64, 597 .associativity = 2, 598 .sets = 512, 599 .partitions = 1, 600 .lines_per_tag = 1, 601 .no_invd_sharing = true, 602 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 603 }; 604 605 /* L1 instruction cache: */ 606 static CPUCacheInfo legacy_l1i_cache = { 607 .type = INSTRUCTION_CACHE, 608 .level = 1, 609 .size = 32 * KiB, 610 .self_init = 1, 611 .line_size = 64, 612 .associativity = 8, 613 .sets = 64, 614 .partitions = 1, 615 .no_invd_sharing = true, 616 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 617 }; 618 619 /*FIXME: CPUID leaf 0x80000005 is inconsistent with leaves 2 & 4 */ 620 static CPUCacheInfo legacy_l1i_cache_amd = { 621 .type = INSTRUCTION_CACHE, 622 .level = 1, 623 .size = 64 * KiB, 624 .self_init = 1, 625 .line_size = 64, 626 .associativity = 2, 627 .sets = 512, 628 .partitions = 1, 629 .lines_per_tag = 1, 630 .no_invd_sharing = true, 631 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 632 }; 633 634 /* Level 2 unified cache: */ 635 static CPUCacheInfo legacy_l2_cache = { 636 .type = UNIFIED_CACHE, 637 .level = 2, 638 .size = 4 * MiB, 639 .self_init = 1, 640 .line_size = 64, 641 .associativity = 16, 642 .sets = 4096, 643 .partitions = 1, 644 .no_invd_sharing = true, 645 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 646 }; 647 648 /*FIXME: CPUID leaf 2 descriptor is inconsistent with CPUID leaf 4 */ 649 static CPUCacheInfo legacy_l2_cache_cpuid2 = { 650 .type = UNIFIED_CACHE, 651 .level = 2, 652 .size = 2 * MiB, 653 .line_size = 64, 654 .associativity = 8, 655 .share_level = CPU_TOPOLOGY_LEVEL_INVALID, 656 }; 657 658 659 /*FIXME: CPUID leaf 0x80000006 is inconsistent with leaves 2 & 4 */ 660 static CPUCacheInfo legacy_l2_cache_amd = { 661 .type = UNIFIED_CACHE, 662 .level = 2, 663 .size = 512 * KiB, 664 .line_size = 64, 665 .lines_per_tag = 1, 666 .associativity = 16, 667 .sets = 512, 668 .partitions = 1, 669 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 670 }; 671 672 /* Level 3 unified cache: */ 673 static CPUCacheInfo legacy_l3_cache = { 674 .type = UNIFIED_CACHE, 675 .level = 3, 676 .size = 16 * MiB, 677 .line_size = 64, 678 .associativity = 16, 679 .sets = 16384, 680 .partitions = 1, 681 .lines_per_tag = 1, 682 .self_init = true, 683 .inclusive = true, 684 .complex_indexing = true, 685 .share_level = CPU_TOPOLOGY_LEVEL_DIE, 686 }; 687 688 /* TLB definitions: */ 689 690 #define L1_DTLB_2M_ASSOC 1 691 #define L1_DTLB_2M_ENTRIES 255 692 #define L1_DTLB_4K_ASSOC 1 693 #define L1_DTLB_4K_ENTRIES 255 694 695 #define L1_ITLB_2M_ASSOC 1 696 #define L1_ITLB_2M_ENTRIES 255 697 #define L1_ITLB_4K_ASSOC 1 698 #define L1_ITLB_4K_ENTRIES 255 699 700 #define L2_DTLB_2M_ASSOC 0 /* disabled */ 701 #define L2_DTLB_2M_ENTRIES 0 /* disabled */ 702 #define L2_DTLB_4K_ASSOC 4 703 #define L2_DTLB_4K_ENTRIES 512 704 705 #define L2_ITLB_2M_ASSOC 0 /* disabled */ 706 #define L2_ITLB_2M_ENTRIES 0 /* disabled */ 707 #define L2_ITLB_4K_ASSOC 4 708 #define L2_ITLB_4K_ENTRIES 512 709 710 /* CPUID Leaf 0x14 constants: */ 711 #define INTEL_PT_MAX_SUBLEAF 0x1 712 /* 713 * bit[00]: IA32_RTIT_CTL.CR3 filter can be set to 1 and IA32_RTIT_CR3_MATCH 714 * MSR can be accessed; 715 * bit[01]: Support Configurable PSB and Cycle-Accurate Mode; 716 * bit[02]: Support IP Filtering, TraceStop filtering, and preservation 717 * of Intel PT MSRs across warm reset; 718 * bit[03]: Support MTC timing packet and suppression of COFI-based packets; 719 */ 720 #define INTEL_PT_MINIMAL_EBX 0xf 721 /* 722 * bit[00]: Tracing can be enabled with IA32_RTIT_CTL.ToPA = 1 and 723 * IA32_RTIT_OUTPUT_BASE and IA32_RTIT_OUTPUT_MASK_PTRS MSRs can be 724 * accessed; 725 * bit[01]: ToPA tables can hold any number of output entries, up to the 726 * maximum allowed by the MaskOrTableOffset field of 727 * IA32_RTIT_OUTPUT_MASK_PTRS; 728 * bit[02]: Support Single-Range Output scheme; 729 */ 730 #define INTEL_PT_MINIMAL_ECX 0x7 731 /* generated packets which contain IP payloads have LIP values */ 732 #define INTEL_PT_IP_LIP (1 << 31) 733 #define INTEL_PT_ADDR_RANGES_NUM 0x2 /* Number of configurable address ranges */ 734 #define INTEL_PT_ADDR_RANGES_NUM_MASK 0x3 735 #define INTEL_PT_MTC_BITMAP (0x0249 << 16) /* Support ART(0,3,6,9) */ 736 #define INTEL_PT_CYCLE_BITMAP 0x1fff /* Support 0,2^(0~11) */ 737 #define INTEL_PT_PSB_BITMAP (0x003f << 16) /* Support 2K,4K,8K,16K,32K,64K */ 738 739 /* CPUID Leaf 0x1D constants: */ 740 #define INTEL_AMX_TILE_MAX_SUBLEAF 0x1 741 #define INTEL_AMX_TOTAL_TILE_BYTES 0x2000 742 #define INTEL_AMX_BYTES_PER_TILE 0x400 743 #define INTEL_AMX_BYTES_PER_ROW 0x40 744 #define INTEL_AMX_TILE_MAX_NAMES 0x8 745 #define INTEL_AMX_TILE_MAX_ROWS 0x10 746 747 /* CPUID Leaf 0x1E constants: */ 748 #define INTEL_AMX_TMUL_MAX_K 0x10 749 #define INTEL_AMX_TMUL_MAX_N 0x40 750 751 void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1, 752 uint32_t vendor2, uint32_t vendor3) 753 { 754 int i; 755 for (i = 0; i < 4; i++) { 756 dst[i] = vendor1 >> (8 * i); 757 dst[i + 4] = vendor2 >> (8 * i); 758 dst[i + 8] = vendor3 >> (8 * i); 759 } 760 dst[CPUID_VENDOR_SZ] = '\0'; 761 } 762 763 #define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE) 764 #define PENTIUM_FEATURES (I486_FEATURES | CPUID_DE | CPUID_TSC | \ 765 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_MMX | CPUID_APIC) 766 #define PENTIUM2_FEATURES (PENTIUM_FEATURES | CPUID_PAE | CPUID_SEP | \ 767 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \ 768 CPUID_PSE36 | CPUID_FXSR) 769 #define PENTIUM3_FEATURES (PENTIUM2_FEATURES | CPUID_SSE) 770 #define PPRO_FEATURES (CPUID_FP87 | CPUID_DE | CPUID_PSE | CPUID_TSC | \ 771 CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_PGE | CPUID_CMOV | \ 772 CPUID_PAT | CPUID_FXSR | CPUID_MMX | CPUID_SSE | CPUID_SSE2 | \ 773 CPUID_PAE | CPUID_SEP | CPUID_APIC) 774 775 #define TCG_FEATURES (CPUID_FP87 | CPUID_PSE | CPUID_TSC | CPUID_MSR | \ 776 CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | CPUID_SEP | \ 777 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \ 778 CPUID_PSE36 | CPUID_CLFLUSH | CPUID_ACPI | CPUID_MMX | \ 779 CPUID_FXSR | CPUID_SSE | CPUID_SSE2 | CPUID_SS | CPUID_DE) 780 /* partly implemented: 781 CPUID_MTRR, CPUID_MCA, CPUID_CLFLUSH (needed for Win64) */ 782 /* missing: 783 CPUID_VME, CPUID_DTS, CPUID_SS, CPUID_HT, CPUID_TM, CPUID_PBE */ 784 785 /* 786 * Kernel-only features that can be shown to usermode programs even if 787 * they aren't actually supported by TCG, because qemu-user only runs 788 * in CPL=3; remove them if they are ever implemented for system emulation. 789 */ 790 #if defined CONFIG_USER_ONLY 791 #define CPUID_EXT_KERNEL_FEATURES \ 792 (CPUID_EXT_PCID | CPUID_EXT_TSC_DEADLINE_TIMER) 793 #else 794 #define CPUID_EXT_KERNEL_FEATURES 0 795 #endif 796 #define TCG_EXT_FEATURES (CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | \ 797 CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | \ 798 CPUID_EXT_SSE41 | CPUID_EXT_SSE42 | CPUID_EXT_POPCNT | \ 799 CPUID_EXT_XSAVE | /* CPUID_EXT_OSXSAVE is dynamic */ \ 800 CPUID_EXT_MOVBE | CPUID_EXT_AES | CPUID_EXT_HYPERVISOR | \ 801 CPUID_EXT_RDRAND | CPUID_EXT_AVX | CPUID_EXT_F16C | \ 802 CPUID_EXT_FMA | CPUID_EXT_X2APIC | CPUID_EXT_KERNEL_FEATURES) 803 /* missing: 804 CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_SMX, 805 CPUID_EXT_EST, CPUID_EXT_TM2, CPUID_EXT_CID, 806 CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_PCID, CPUID_EXT_DCA, 807 CPUID_EXT_TSC_DEADLINE_TIMER 808 */ 809 810 #ifdef TARGET_X86_64 811 #define TCG_EXT2_X86_64_FEATURES CPUID_EXT2_LM 812 #else 813 #define TCG_EXT2_X86_64_FEATURES 0 814 #endif 815 816 /* 817 * CPUID_*_KERNEL_FEATURES denotes bits and features that are not usable 818 * in usermode or by 32-bit programs. Those are added to supported 819 * TCG features unconditionally in user-mode emulation mode. This may 820 * indeed seem strange or incorrect, but it works because code running 821 * under usermode emulation cannot access them. 822 * 823 * Even for long mode, qemu-i386 is not running "a userspace program on a 824 * 32-bit CPU"; it's running "a userspace program with a 32-bit code segment" 825 * and therefore using the 32-bit ABI; the CPU itself might be 64-bit 826 * but again the difference is only visible in kernel mode. 827 */ 828 #if defined CONFIG_LINUX_USER 829 #define CPUID_EXT2_KERNEL_FEATURES (CPUID_EXT2_LM | CPUID_EXT2_FFXSR) 830 #elif defined CONFIG_USER_ONLY 831 /* FIXME: Long mode not yet supported for i386 bsd-user */ 832 #define CPUID_EXT2_KERNEL_FEATURES CPUID_EXT2_FFXSR 833 #else 834 #define CPUID_EXT2_KERNEL_FEATURES 0 835 #endif 836 837 #define TCG_EXT2_FEATURES ((TCG_FEATURES & CPUID_EXT2_AMD_ALIASES) | \ 838 CPUID_EXT2_NX | CPUID_EXT2_MMXEXT | CPUID_EXT2_RDTSCP | \ 839 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_PDPE1GB | \ 840 CPUID_EXT2_SYSCALL | TCG_EXT2_X86_64_FEATURES | \ 841 CPUID_EXT2_KERNEL_FEATURES) 842 843 #if defined CONFIG_USER_ONLY 844 #define CPUID_EXT3_KERNEL_FEATURES CPUID_EXT3_OSVW 845 #else 846 #define CPUID_EXT3_KERNEL_FEATURES 0 847 #endif 848 849 #define TCG_EXT3_FEATURES (CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | \ 850 CPUID_EXT3_CR8LEG | CPUID_EXT3_ABM | CPUID_EXT3_SSE4A | \ 851 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_KERNEL_FEATURES) 852 853 #define TCG_EXT4_FEATURES 0 854 855 #if defined CONFIG_USER_ONLY 856 #define CPUID_SVM_KERNEL_FEATURES (CPUID_SVM_NRIPSAVE | CPUID_SVM_VNMI) 857 #else 858 #define CPUID_SVM_KERNEL_FEATURES 0 859 #endif 860 #define TCG_SVM_FEATURES (CPUID_SVM_NPT | CPUID_SVM_VGIF | \ 861 CPUID_SVM_SVME_ADDR_CHK | CPUID_SVM_KERNEL_FEATURES) 862 863 #define TCG_KVM_FEATURES 0 864 865 #if defined CONFIG_USER_ONLY 866 #define CPUID_7_0_EBX_KERNEL_FEATURES CPUID_7_0_EBX_INVPCID 867 #else 868 #define CPUID_7_0_EBX_KERNEL_FEATURES 0 869 #endif 870 #define TCG_7_0_EBX_FEATURES (CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_SMAP | \ 871 CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX | \ 872 CPUID_7_0_EBX_CLFLUSHOPT | \ 873 CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_FSGSBASE | \ 874 CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_RDSEED | \ 875 CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_KERNEL_FEATURES) 876 /* missing: 877 CPUID_7_0_EBX_HLE 878 CPUID_7_0_EBX_INVPCID, CPUID_7_0_EBX_RTM */ 879 880 #if !defined CONFIG_USER_ONLY || defined CONFIG_LINUX 881 #define TCG_7_0_ECX_RDPID CPUID_7_0_ECX_RDPID 882 #else 883 #define TCG_7_0_ECX_RDPID 0 884 #endif 885 #define TCG_7_0_ECX_FEATURES (CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | \ 886 /* CPUID_7_0_ECX_OSPKE is dynamic */ \ 887 CPUID_7_0_ECX_LA57 | CPUID_7_0_ECX_PKS | CPUID_7_0_ECX_VAES | \ 888 TCG_7_0_ECX_RDPID) 889 890 #if defined CONFIG_USER_ONLY 891 #define CPUID_7_0_EDX_KERNEL_FEATURES (CPUID_7_0_EDX_SPEC_CTRL | \ 892 CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD) 893 #else 894 #define CPUID_7_0_EDX_KERNEL_FEATURES 0 895 #endif 896 #define TCG_7_0_EDX_FEATURES (CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_KERNEL_FEATURES) 897 898 #define TCG_7_1_EAX_FEATURES (CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | \ 899 CPUID_7_1_EAX_FSRC | CPUID_7_1_EAX_CMPCCXADD) 900 #define TCG_7_1_EDX_FEATURES 0 901 #define TCG_7_2_EDX_FEATURES 0 902 #define TCG_APM_FEATURES 0 903 #define TCG_6_EAX_FEATURES CPUID_6_EAX_ARAT 904 #define TCG_XSAVE_FEATURES (CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XGETBV1) 905 /* missing: 906 CPUID_XSAVE_XSAVEC, CPUID_XSAVE_XSAVES */ 907 #define TCG_14_0_ECX_FEATURES 0 908 #define TCG_SGX_12_0_EAX_FEATURES 0 909 #define TCG_SGX_12_0_EBX_FEATURES 0 910 #define TCG_SGX_12_1_EAX_FEATURES 0 911 #define TCG_24_0_EBX_FEATURES 0 912 913 #if defined CONFIG_USER_ONLY 914 #define CPUID_8000_0008_EBX_KERNEL_FEATURES (CPUID_8000_0008_EBX_IBPB | \ 915 CPUID_8000_0008_EBX_IBRS | CPUID_8000_0008_EBX_STIBP | \ 916 CPUID_8000_0008_EBX_STIBP_ALWAYS_ON | CPUID_8000_0008_EBX_AMD_SSBD | \ 917 CPUID_8000_0008_EBX_AMD_PSFD) 918 #else 919 #define CPUID_8000_0008_EBX_KERNEL_FEATURES 0 920 #endif 921 922 #define TCG_8000_0008_EBX (CPUID_8000_0008_EBX_XSAVEERPTR | \ 923 CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_KERNEL_FEATURES) 924 925 FeatureWordInfo feature_word_info[FEATURE_WORDS] = { 926 [FEAT_1_EDX] = { 927 .type = CPUID_FEATURE_WORD, 928 .feat_names = { 929 "fpu", "vme", "de", "pse", 930 "tsc", "msr", "pae", "mce", 931 "cx8", "apic", NULL, "sep", 932 "mtrr", "pge", "mca", "cmov", 933 "pat", "pse36", "pn" /* Intel psn */, "clflush" /* Intel clfsh */, 934 NULL, "ds" /* Intel dts */, "acpi", "mmx", 935 "fxsr", "sse", "sse2", "ss", 936 "ht" /* Intel htt */, "tm", "ia64", "pbe", 937 }, 938 .cpuid = {.eax = 1, .reg = R_EDX, }, 939 .tcg_features = TCG_FEATURES, 940 .no_autoenable_flags = CPUID_HT, 941 }, 942 [FEAT_1_ECX] = { 943 .type = CPUID_FEATURE_WORD, 944 .feat_names = { 945 "pni" /* Intel,AMD sse3 */, "pclmulqdq", "dtes64", "monitor", 946 "ds-cpl", "vmx", "smx", "est", 947 "tm2", "ssse3", "cid", NULL, 948 "fma", "cx16", "xtpr", "pdcm", 949 NULL, "pcid", "dca", "sse4.1", 950 "sse4.2", "x2apic", "movbe", "popcnt", 951 "tsc-deadline", "aes", "xsave", NULL /* osxsave */, 952 "avx", "f16c", "rdrand", "hypervisor", 953 }, 954 .cpuid = { .eax = 1, .reg = R_ECX, }, 955 .tcg_features = TCG_EXT_FEATURES, 956 }, 957 /* Feature names that are already defined on feature_name[] but 958 * are set on CPUID[8000_0001].EDX on AMD CPUs don't have their 959 * names on feat_names below. They are copied automatically 960 * to features[FEAT_8000_0001_EDX] if and only if CPU vendor is AMD. 961 */ 962 [FEAT_8000_0001_EDX] = { 963 .type = CPUID_FEATURE_WORD, 964 .feat_names = { 965 NULL /* fpu */, NULL /* vme */, NULL /* de */, NULL /* pse */, 966 NULL /* tsc */, NULL /* msr */, NULL /* pae */, NULL /* mce */, 967 NULL /* cx8 */, NULL /* apic */, NULL, "syscall", 968 NULL /* mtrr */, NULL /* pge */, NULL /* mca */, NULL /* cmov */, 969 NULL /* pat */, NULL /* pse36 */, NULL, NULL /* Linux mp */, 970 "nx", NULL, "mmxext", NULL /* mmx */, 971 NULL /* fxsr */, "fxsr-opt", "pdpe1gb", "rdtscp", 972 NULL, "lm", "3dnowext", "3dnow", 973 }, 974 .cpuid = { .eax = 0x80000001, .reg = R_EDX, }, 975 .tcg_features = TCG_EXT2_FEATURES, 976 }, 977 [FEAT_8000_0001_ECX] = { 978 .type = CPUID_FEATURE_WORD, 979 .feat_names = { 980 "lahf-lm", "cmp-legacy", "svm", "extapic", 981 "cr8legacy", "abm", "sse4a", "misalignsse", 982 "3dnowprefetch", "osvw", "ibs", "xop", 983 "skinit", "wdt", NULL, "lwp", 984 "fma4", "tce", NULL, "nodeid-msr", 985 NULL, "tbm", "topoext", "perfctr-core", 986 "perfctr-nb", NULL, NULL, NULL, 987 NULL, NULL, NULL, NULL, 988 }, 989 .cpuid = { .eax = 0x80000001, .reg = R_ECX, }, 990 .tcg_features = TCG_EXT3_FEATURES, 991 /* 992 * TOPOEXT is always allowed but can't be enabled blindly by 993 * "-cpu host", as it requires consistent cache topology info 994 * to be provided so it doesn't confuse guests. 995 */ 996 .no_autoenable_flags = CPUID_EXT3_TOPOEXT, 997 }, 998 [FEAT_C000_0001_EDX] = { 999 .type = CPUID_FEATURE_WORD, 1000 .feat_names = { 1001 NULL, NULL, "xstore", "xstore-en", 1002 NULL, NULL, "xcrypt", "xcrypt-en", 1003 "ace2", "ace2-en", "phe", "phe-en", 1004 "pmm", "pmm-en", NULL, NULL, 1005 NULL, NULL, NULL, NULL, 1006 NULL, NULL, NULL, NULL, 1007 NULL, NULL, NULL, NULL, 1008 NULL, NULL, NULL, NULL, 1009 }, 1010 .cpuid = { .eax = 0xC0000001, .reg = R_EDX, }, 1011 .tcg_features = TCG_EXT4_FEATURES, 1012 }, 1013 [FEAT_KVM] = { 1014 .type = CPUID_FEATURE_WORD, 1015 .feat_names = { 1016 "kvmclock", "kvm-nopiodelay", "kvm-mmu", "kvmclock", 1017 "kvm-asyncpf", "kvm-steal-time", "kvm-pv-eoi", "kvm-pv-unhalt", 1018 NULL, "kvm-pv-tlb-flush", "kvm-asyncpf-vmexit", "kvm-pv-ipi", 1019 "kvm-poll-control", "kvm-pv-sched-yield", "kvm-asyncpf-int", "kvm-msi-ext-dest-id", 1020 NULL, NULL, NULL, NULL, 1021 NULL, NULL, NULL, NULL, 1022 "kvmclock-stable-bit", NULL, NULL, NULL, 1023 NULL, NULL, NULL, NULL, 1024 }, 1025 .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EAX, }, 1026 .tcg_features = TCG_KVM_FEATURES, 1027 }, 1028 [FEAT_KVM_HINTS] = { 1029 .type = CPUID_FEATURE_WORD, 1030 .feat_names = { 1031 "kvm-hint-dedicated", NULL, NULL, NULL, 1032 NULL, NULL, NULL, NULL, 1033 NULL, NULL, NULL, NULL, 1034 NULL, NULL, NULL, NULL, 1035 NULL, NULL, NULL, NULL, 1036 NULL, NULL, NULL, NULL, 1037 NULL, NULL, NULL, NULL, 1038 NULL, NULL, NULL, NULL, 1039 }, 1040 .cpuid = { .eax = KVM_CPUID_FEATURES, .reg = R_EDX, }, 1041 .tcg_features = TCG_KVM_FEATURES, 1042 /* 1043 * KVM hints aren't auto-enabled by -cpu host, they need to be 1044 * explicitly enabled in the command-line. 1045 */ 1046 .no_autoenable_flags = ~0U, 1047 }, 1048 [FEAT_SVM] = { 1049 .type = CPUID_FEATURE_WORD, 1050 .feat_names = { 1051 "npt", "lbrv", "svm-lock", "nrip-save", 1052 "tsc-scale", "vmcb-clean", "flushbyasid", "decodeassists", 1053 NULL, NULL, "pause-filter", NULL, 1054 "pfthreshold", "avic", NULL, "v-vmsave-vmload", 1055 "vgif", NULL, NULL, NULL, 1056 NULL, NULL, NULL, NULL, 1057 NULL, "vnmi", NULL, NULL, 1058 "svme-addr-chk", NULL, NULL, NULL, 1059 }, 1060 .cpuid = { .eax = 0x8000000A, .reg = R_EDX, }, 1061 .tcg_features = TCG_SVM_FEATURES, 1062 }, 1063 [FEAT_7_0_EBX] = { 1064 .type = CPUID_FEATURE_WORD, 1065 .feat_names = { 1066 "fsgsbase", "tsc-adjust", "sgx", "bmi1", 1067 "hle", "avx2", "fdp-excptn-only", "smep", 1068 "bmi2", "erms", "invpcid", "rtm", 1069 NULL, "zero-fcs-fds", "mpx", NULL, 1070 "avx512f", "avx512dq", "rdseed", "adx", 1071 "smap", "avx512ifma", "pcommit", "clflushopt", 1072 "clwb", "intel-pt", "avx512pf", "avx512er", 1073 "avx512cd", "sha-ni", "avx512bw", "avx512vl", 1074 }, 1075 .cpuid = { 1076 .eax = 7, 1077 .needs_ecx = true, .ecx = 0, 1078 .reg = R_EBX, 1079 }, 1080 .tcg_features = TCG_7_0_EBX_FEATURES, 1081 }, 1082 [FEAT_7_0_ECX] = { 1083 .type = CPUID_FEATURE_WORD, 1084 .feat_names = { 1085 NULL, "avx512vbmi", "umip", "pku", 1086 NULL /* ospke */, "waitpkg", "avx512vbmi2", NULL, 1087 "gfni", "vaes", "vpclmulqdq", "avx512vnni", 1088 "avx512bitalg", NULL, "avx512-vpopcntdq", NULL, 1089 "la57", NULL, NULL, NULL, 1090 NULL, NULL, "rdpid", NULL, 1091 "bus-lock-detect", "cldemote", NULL, "movdiri", 1092 "movdir64b", NULL, "sgxlc", "pks", 1093 }, 1094 .cpuid = { 1095 .eax = 7, 1096 .needs_ecx = true, .ecx = 0, 1097 .reg = R_ECX, 1098 }, 1099 .tcg_features = TCG_7_0_ECX_FEATURES, 1100 }, 1101 [FEAT_7_0_EDX] = { 1102 .type = CPUID_FEATURE_WORD, 1103 .feat_names = { 1104 NULL, NULL, "avx512-4vnniw", "avx512-4fmaps", 1105 "fsrm", NULL, NULL, NULL, 1106 "avx512-vp2intersect", NULL, "md-clear", NULL, 1107 NULL, NULL, "serialize", NULL, 1108 "tsx-ldtrk", NULL, NULL /* pconfig */, "arch-lbr", 1109 NULL, NULL, "amx-bf16", "avx512-fp16", 1110 "amx-tile", "amx-int8", "spec-ctrl", "stibp", 1111 "flush-l1d", "arch-capabilities", "core-capability", "ssbd", 1112 }, 1113 .cpuid = { 1114 .eax = 7, 1115 .needs_ecx = true, .ecx = 0, 1116 .reg = R_EDX, 1117 }, 1118 .tcg_features = TCG_7_0_EDX_FEATURES, 1119 }, 1120 [FEAT_7_1_EAX] = { 1121 .type = CPUID_FEATURE_WORD, 1122 .feat_names = { 1123 "sha512", "sm3", "sm4", NULL, 1124 "avx-vnni", "avx512-bf16", NULL, "cmpccxadd", 1125 NULL, NULL, "fzrm", "fsrs", 1126 "fsrc", NULL, NULL, NULL, 1127 NULL, "fred", "lkgs", "wrmsrns", 1128 NULL, "amx-fp16", NULL, "avx-ifma", 1129 NULL, NULL, "lam", NULL, 1130 NULL, NULL, NULL, NULL, 1131 }, 1132 .cpuid = { 1133 .eax = 7, 1134 .needs_ecx = true, .ecx = 1, 1135 .reg = R_EAX, 1136 }, 1137 .tcg_features = TCG_7_1_EAX_FEATURES, 1138 }, 1139 [FEAT_7_1_EDX] = { 1140 .type = CPUID_FEATURE_WORD, 1141 .feat_names = { 1142 NULL, NULL, NULL, NULL, 1143 "avx-vnni-int8", "avx-ne-convert", NULL, NULL, 1144 "amx-complex", NULL, "avx-vnni-int16", NULL, 1145 NULL, NULL, "prefetchiti", NULL, 1146 NULL, NULL, NULL, "avx10", 1147 NULL, NULL, NULL, NULL, 1148 NULL, NULL, NULL, NULL, 1149 NULL, NULL, NULL, NULL, 1150 }, 1151 .cpuid = { 1152 .eax = 7, 1153 .needs_ecx = true, .ecx = 1, 1154 .reg = R_EDX, 1155 }, 1156 .tcg_features = TCG_7_1_EDX_FEATURES, 1157 }, 1158 [FEAT_7_2_EDX] = { 1159 .type = CPUID_FEATURE_WORD, 1160 .feat_names = { 1161 "intel-psfd", "ipred-ctrl", "rrsba-ctrl", "ddpd-u", 1162 "bhi-ctrl", "mcdt-no", NULL, NULL, 1163 NULL, NULL, NULL, NULL, 1164 NULL, NULL, NULL, NULL, 1165 NULL, NULL, NULL, NULL, 1166 NULL, NULL, NULL, NULL, 1167 NULL, NULL, NULL, NULL, 1168 NULL, NULL, NULL, NULL, 1169 }, 1170 .cpuid = { 1171 .eax = 7, 1172 .needs_ecx = true, .ecx = 2, 1173 .reg = R_EDX, 1174 }, 1175 .tcg_features = TCG_7_2_EDX_FEATURES, 1176 }, 1177 [FEAT_24_0_EBX] = { 1178 .type = CPUID_FEATURE_WORD, 1179 .feat_names = { 1180 [16] = "avx10-128", 1181 [17] = "avx10-256", 1182 [18] = "avx10-512", 1183 }, 1184 .cpuid = { 1185 .eax = 0x24, 1186 .needs_ecx = true, .ecx = 0, 1187 .reg = R_EBX, 1188 }, 1189 .tcg_features = TCG_24_0_EBX_FEATURES, 1190 }, 1191 [FEAT_8000_0007_EDX] = { 1192 .type = CPUID_FEATURE_WORD, 1193 .feat_names = { 1194 NULL, NULL, NULL, NULL, 1195 NULL, NULL, NULL, NULL, 1196 "invtsc", NULL, NULL, NULL, 1197 NULL, NULL, NULL, NULL, 1198 NULL, NULL, NULL, NULL, 1199 NULL, NULL, NULL, NULL, 1200 NULL, NULL, NULL, NULL, 1201 NULL, NULL, NULL, NULL, 1202 }, 1203 .cpuid = { .eax = 0x80000007, .reg = R_EDX, }, 1204 .tcg_features = TCG_APM_FEATURES, 1205 .unmigratable_flags = CPUID_APM_INVTSC, 1206 }, 1207 [FEAT_8000_0007_EBX] = { 1208 .type = CPUID_FEATURE_WORD, 1209 .feat_names = { 1210 "overflow-recov", "succor", NULL, NULL, 1211 NULL, NULL, NULL, NULL, 1212 NULL, NULL, NULL, NULL, 1213 NULL, NULL, NULL, NULL, 1214 NULL, NULL, NULL, NULL, 1215 NULL, NULL, NULL, NULL, 1216 NULL, NULL, NULL, NULL, 1217 NULL, NULL, NULL, NULL, 1218 }, 1219 .cpuid = { .eax = 0x80000007, .reg = R_EBX, }, 1220 .tcg_features = 0, 1221 .unmigratable_flags = 0, 1222 }, 1223 [FEAT_8000_0008_EBX] = { 1224 .type = CPUID_FEATURE_WORD, 1225 .feat_names = { 1226 "clzero", NULL, "xsaveerptr", NULL, 1227 NULL, NULL, NULL, NULL, 1228 NULL, "wbnoinvd", NULL, NULL, 1229 "ibpb", NULL, "ibrs", "amd-stibp", 1230 NULL, "stibp-always-on", NULL, NULL, 1231 NULL, NULL, NULL, NULL, 1232 "amd-ssbd", "virt-ssbd", "amd-no-ssb", NULL, 1233 "amd-psfd", NULL, NULL, NULL, 1234 }, 1235 .cpuid = { .eax = 0x80000008, .reg = R_EBX, }, 1236 .tcg_features = TCG_8000_0008_EBX, 1237 .unmigratable_flags = 0, 1238 }, 1239 [FEAT_8000_0021_EAX] = { 1240 .type = CPUID_FEATURE_WORD, 1241 .feat_names = { 1242 "no-nested-data-bp", NULL, "lfence-always-serializing", NULL, 1243 NULL, NULL, "null-sel-clr-base", NULL, 1244 "auto-ibrs", NULL, NULL, NULL, 1245 NULL, NULL, NULL, NULL, 1246 NULL, NULL, NULL, NULL, 1247 NULL, NULL, NULL, NULL, 1248 "eraps", NULL, NULL, "sbpb", 1249 "ibpb-brtype", "srso-no", "srso-user-kernel-no", NULL, 1250 }, 1251 .cpuid = { .eax = 0x80000021, .reg = R_EAX, }, 1252 .tcg_features = 0, 1253 .unmigratable_flags = 0, 1254 }, 1255 [FEAT_8000_0021_EBX] = { 1256 .type = CPUID_FEATURE_WORD, 1257 .cpuid = { .eax = 0x80000021, .reg = R_EBX, }, 1258 .tcg_features = 0, 1259 .unmigratable_flags = 0, 1260 }, 1261 [FEAT_8000_0022_EAX] = { 1262 .type = CPUID_FEATURE_WORD, 1263 .feat_names = { 1264 "perfmon-v2", NULL, NULL, NULL, 1265 NULL, NULL, NULL, NULL, 1266 NULL, NULL, NULL, NULL, 1267 NULL, NULL, NULL, NULL, 1268 NULL, NULL, NULL, NULL, 1269 NULL, NULL, NULL, NULL, 1270 NULL, NULL, NULL, NULL, 1271 NULL, NULL, NULL, NULL, 1272 }, 1273 .cpuid = { .eax = 0x80000022, .reg = R_EAX, }, 1274 .tcg_features = 0, 1275 .unmigratable_flags = 0, 1276 }, 1277 [FEAT_XSAVE] = { 1278 .type = CPUID_FEATURE_WORD, 1279 .feat_names = { 1280 "xsaveopt", "xsavec", "xgetbv1", "xsaves", 1281 "xfd", NULL, NULL, NULL, 1282 NULL, NULL, NULL, NULL, 1283 NULL, NULL, NULL, NULL, 1284 NULL, NULL, NULL, NULL, 1285 NULL, NULL, NULL, NULL, 1286 NULL, NULL, NULL, NULL, 1287 NULL, NULL, NULL, NULL, 1288 }, 1289 .cpuid = { 1290 .eax = 0xd, 1291 .needs_ecx = true, .ecx = 1, 1292 .reg = R_EAX, 1293 }, 1294 .tcg_features = TCG_XSAVE_FEATURES, 1295 }, 1296 [FEAT_XSAVE_XSS_LO] = { 1297 .type = CPUID_FEATURE_WORD, 1298 .feat_names = { 1299 NULL, NULL, NULL, NULL, 1300 NULL, NULL, NULL, NULL, 1301 NULL, NULL, NULL, NULL, 1302 NULL, NULL, NULL, NULL, 1303 NULL, NULL, NULL, NULL, 1304 NULL, NULL, NULL, NULL, 1305 NULL, NULL, NULL, NULL, 1306 NULL, NULL, NULL, NULL, 1307 }, 1308 .cpuid = { 1309 .eax = 0xD, 1310 .needs_ecx = true, 1311 .ecx = 1, 1312 .reg = R_ECX, 1313 }, 1314 }, 1315 [FEAT_XSAVE_XSS_HI] = { 1316 .type = CPUID_FEATURE_WORD, 1317 .cpuid = { 1318 .eax = 0xD, 1319 .needs_ecx = true, 1320 .ecx = 1, 1321 .reg = R_EDX 1322 }, 1323 }, 1324 [FEAT_6_EAX] = { 1325 .type = CPUID_FEATURE_WORD, 1326 .feat_names = { 1327 NULL, NULL, "arat", NULL, 1328 NULL, NULL, NULL, NULL, 1329 NULL, NULL, NULL, NULL, 1330 NULL, NULL, NULL, NULL, 1331 NULL, NULL, NULL, NULL, 1332 NULL, NULL, NULL, NULL, 1333 NULL, NULL, NULL, NULL, 1334 NULL, NULL, NULL, NULL, 1335 }, 1336 .cpuid = { .eax = 6, .reg = R_EAX, }, 1337 .tcg_features = TCG_6_EAX_FEATURES, 1338 }, 1339 [FEAT_XSAVE_XCR0_LO] = { 1340 .type = CPUID_FEATURE_WORD, 1341 .cpuid = { 1342 .eax = 0xD, 1343 .needs_ecx = true, .ecx = 0, 1344 .reg = R_EAX, 1345 }, 1346 .tcg_features = XSTATE_FP_MASK | XSTATE_SSE_MASK | 1347 XSTATE_YMM_MASK | XSTATE_BNDREGS_MASK | XSTATE_BNDCSR_MASK | 1348 XSTATE_PKRU_MASK, 1349 .migratable_flags = XSTATE_FP_MASK | XSTATE_SSE_MASK | 1350 XSTATE_YMM_MASK | XSTATE_BNDREGS_MASK | XSTATE_BNDCSR_MASK | 1351 XSTATE_OPMASK_MASK | XSTATE_ZMM_Hi256_MASK | XSTATE_Hi16_ZMM_MASK | 1352 XSTATE_PKRU_MASK, 1353 }, 1354 [FEAT_XSAVE_XCR0_HI] = { 1355 .type = CPUID_FEATURE_WORD, 1356 .cpuid = { 1357 .eax = 0xD, 1358 .needs_ecx = true, .ecx = 0, 1359 .reg = R_EDX, 1360 }, 1361 .tcg_features = 0U, 1362 }, 1363 /*Below are MSR exposed features*/ 1364 [FEAT_ARCH_CAPABILITIES] = { 1365 .type = MSR_FEATURE_WORD, 1366 .feat_names = { 1367 "rdctl-no", "ibrs-all", "rsba", "skip-l1dfl-vmentry", 1368 "ssb-no", "mds-no", "pschange-mc-no", "tsx-ctrl", 1369 "taa-no", NULL, NULL, NULL, 1370 NULL, "sbdr-ssdp-no", "fbsdp-no", "psdp-no", 1371 NULL, "fb-clear", NULL, NULL, 1372 "bhi-no", NULL, NULL, NULL, 1373 "pbrsb-no", NULL, "gds-no", "rfds-no", 1374 "rfds-clear", NULL, NULL, NULL, 1375 }, 1376 .msr = { 1377 .index = MSR_IA32_ARCH_CAPABILITIES, 1378 }, 1379 /* 1380 * FEAT_ARCH_CAPABILITIES only affects a read-only MSR, which 1381 * cannot be read from user mode. Therefore, it has no impact 1382 > on any user-mode operation, and warnings about unsupported 1383 * features do not matter. 1384 */ 1385 .tcg_features = ~0U, 1386 }, 1387 [FEAT_CORE_CAPABILITY] = { 1388 .type = MSR_FEATURE_WORD, 1389 .feat_names = { 1390 NULL, NULL, NULL, NULL, 1391 NULL, "split-lock-detect", NULL, NULL, 1392 NULL, NULL, NULL, NULL, 1393 NULL, NULL, NULL, NULL, 1394 NULL, NULL, NULL, NULL, 1395 NULL, NULL, NULL, NULL, 1396 NULL, NULL, NULL, NULL, 1397 NULL, NULL, NULL, NULL, 1398 }, 1399 .msr = { 1400 .index = MSR_IA32_CORE_CAPABILITY, 1401 }, 1402 }, 1403 [FEAT_PERF_CAPABILITIES] = { 1404 .type = MSR_FEATURE_WORD, 1405 .feat_names = { 1406 NULL, NULL, NULL, NULL, 1407 NULL, NULL, NULL, NULL, 1408 NULL, NULL, NULL, NULL, 1409 NULL, "full-width-write", NULL, NULL, 1410 NULL, NULL, NULL, NULL, 1411 NULL, NULL, NULL, NULL, 1412 NULL, NULL, NULL, NULL, 1413 NULL, NULL, NULL, NULL, 1414 }, 1415 .msr = { 1416 .index = MSR_IA32_PERF_CAPABILITIES, 1417 }, 1418 }, 1419 1420 [FEAT_VMX_PROCBASED_CTLS] = { 1421 .type = MSR_FEATURE_WORD, 1422 .feat_names = { 1423 NULL, NULL, "vmx-vintr-pending", "vmx-tsc-offset", 1424 NULL, NULL, NULL, "vmx-hlt-exit", 1425 NULL, "vmx-invlpg-exit", "vmx-mwait-exit", "vmx-rdpmc-exit", 1426 "vmx-rdtsc-exit", NULL, NULL, "vmx-cr3-load-noexit", 1427 "vmx-cr3-store-noexit", NULL, NULL, "vmx-cr8-load-exit", 1428 "vmx-cr8-store-exit", "vmx-flexpriority", "vmx-vnmi-pending", "vmx-movdr-exit", 1429 "vmx-io-exit", "vmx-io-bitmap", NULL, "vmx-mtf", 1430 "vmx-msr-bitmap", "vmx-monitor-exit", "vmx-pause-exit", "vmx-secondary-ctls", 1431 }, 1432 .msr = { 1433 .index = MSR_IA32_VMX_TRUE_PROCBASED_CTLS, 1434 } 1435 }, 1436 1437 [FEAT_VMX_SECONDARY_CTLS] = { 1438 .type = MSR_FEATURE_WORD, 1439 .feat_names = { 1440 "vmx-apicv-xapic", "vmx-ept", "vmx-desc-exit", "vmx-rdtscp-exit", 1441 "vmx-apicv-x2apic", "vmx-vpid", "vmx-wbinvd-exit", "vmx-unrestricted-guest", 1442 "vmx-apicv-register", "vmx-apicv-vid", "vmx-ple", "vmx-rdrand-exit", 1443 "vmx-invpcid-exit", "vmx-vmfunc", "vmx-shadow-vmcs", "vmx-encls-exit", 1444 "vmx-rdseed-exit", "vmx-pml", NULL, NULL, 1445 "vmx-xsaves", NULL, NULL, NULL, 1446 NULL, "vmx-tsc-scaling", "vmx-enable-user-wait-pause", NULL, 1447 NULL, NULL, NULL, NULL, 1448 }, 1449 .msr = { 1450 .index = MSR_IA32_VMX_PROCBASED_CTLS2, 1451 } 1452 }, 1453 1454 [FEAT_VMX_PINBASED_CTLS] = { 1455 .type = MSR_FEATURE_WORD, 1456 .feat_names = { 1457 "vmx-intr-exit", NULL, NULL, "vmx-nmi-exit", 1458 NULL, "vmx-vnmi", "vmx-preemption-timer", "vmx-posted-intr", 1459 NULL, NULL, NULL, NULL, 1460 NULL, NULL, NULL, NULL, 1461 NULL, NULL, NULL, NULL, 1462 NULL, NULL, NULL, NULL, 1463 NULL, NULL, NULL, NULL, 1464 NULL, NULL, NULL, NULL, 1465 }, 1466 .msr = { 1467 .index = MSR_IA32_VMX_TRUE_PINBASED_CTLS, 1468 } 1469 }, 1470 1471 [FEAT_VMX_EXIT_CTLS] = { 1472 .type = MSR_FEATURE_WORD, 1473 /* 1474 * VMX_VM_EXIT_HOST_ADDR_SPACE_SIZE is copied from 1475 * the LM CPUID bit. 1476 */ 1477 .feat_names = { 1478 NULL, NULL, "vmx-exit-nosave-debugctl", NULL, 1479 NULL, NULL, NULL, NULL, 1480 NULL, NULL /* vmx-exit-host-addr-space-size */, NULL, NULL, 1481 "vmx-exit-load-perf-global-ctrl", NULL, NULL, "vmx-exit-ack-intr", 1482 NULL, NULL, "vmx-exit-save-pat", "vmx-exit-load-pat", 1483 "vmx-exit-save-efer", "vmx-exit-load-efer", 1484 "vmx-exit-save-preemption-timer", "vmx-exit-clear-bndcfgs", 1485 NULL, "vmx-exit-clear-rtit-ctl", NULL, NULL, 1486 NULL, "vmx-exit-load-pkrs", NULL, "vmx-exit-secondary-ctls", 1487 }, 1488 .msr = { 1489 .index = MSR_IA32_VMX_TRUE_EXIT_CTLS, 1490 } 1491 }, 1492 1493 [FEAT_VMX_ENTRY_CTLS] = { 1494 .type = MSR_FEATURE_WORD, 1495 .feat_names = { 1496 NULL, NULL, "vmx-entry-noload-debugctl", NULL, 1497 NULL, NULL, NULL, NULL, 1498 NULL, "vmx-entry-ia32e-mode", NULL, NULL, 1499 NULL, "vmx-entry-load-perf-global-ctrl", "vmx-entry-load-pat", "vmx-entry-load-efer", 1500 "vmx-entry-load-bndcfgs", NULL, "vmx-entry-load-rtit-ctl", NULL, 1501 NULL, NULL, "vmx-entry-load-pkrs", "vmx-entry-load-fred", 1502 NULL, NULL, NULL, NULL, 1503 NULL, NULL, NULL, NULL, 1504 }, 1505 .msr = { 1506 .index = MSR_IA32_VMX_TRUE_ENTRY_CTLS, 1507 } 1508 }, 1509 1510 [FEAT_VMX_MISC] = { 1511 .type = MSR_FEATURE_WORD, 1512 .feat_names = { 1513 NULL, NULL, NULL, NULL, 1514 NULL, "vmx-store-lma", "vmx-activity-hlt", "vmx-activity-shutdown", 1515 "vmx-activity-wait-sipi", NULL, NULL, NULL, 1516 NULL, NULL, NULL, NULL, 1517 NULL, NULL, NULL, NULL, 1518 NULL, NULL, NULL, NULL, 1519 NULL, NULL, NULL, NULL, 1520 NULL, "vmx-vmwrite-vmexit-fields", "vmx-zero-len-inject", NULL, 1521 }, 1522 .msr = { 1523 .index = MSR_IA32_VMX_MISC, 1524 } 1525 }, 1526 1527 [FEAT_VMX_EPT_VPID_CAPS] = { 1528 .type = MSR_FEATURE_WORD, 1529 .feat_names = { 1530 "vmx-ept-execonly", NULL, NULL, NULL, 1531 NULL, NULL, "vmx-page-walk-4", "vmx-page-walk-5", 1532 NULL, NULL, NULL, NULL, 1533 NULL, NULL, NULL, NULL, 1534 "vmx-ept-2mb", "vmx-ept-1gb", NULL, NULL, 1535 "vmx-invept", "vmx-eptad", "vmx-ept-advanced-exitinfo", NULL, 1536 NULL, "vmx-invept-single-context", "vmx-invept-all-context", NULL, 1537 NULL, NULL, NULL, NULL, 1538 "vmx-invvpid", NULL, NULL, NULL, 1539 NULL, NULL, NULL, NULL, 1540 "vmx-invvpid-single-addr", "vmx-invept-single-context", 1541 "vmx-invvpid-all-context", "vmx-invept-single-context-noglobals", 1542 NULL, NULL, NULL, NULL, 1543 NULL, NULL, NULL, NULL, 1544 NULL, NULL, NULL, NULL, 1545 NULL, NULL, NULL, NULL, 1546 NULL, NULL, NULL, NULL, 1547 }, 1548 .msr = { 1549 .index = MSR_IA32_VMX_EPT_VPID_CAP, 1550 } 1551 }, 1552 1553 [FEAT_VMX_BASIC] = { 1554 .type = MSR_FEATURE_WORD, 1555 .feat_names = { 1556 [54] = "vmx-ins-outs", 1557 [55] = "vmx-true-ctls", 1558 [56] = "vmx-any-errcode", 1559 [58] = "vmx-nested-exception", 1560 }, 1561 .msr = { 1562 .index = MSR_IA32_VMX_BASIC, 1563 }, 1564 /* Just to be safe - we don't support setting the MSEG version field. */ 1565 .no_autoenable_flags = MSR_VMX_BASIC_DUAL_MONITOR, 1566 }, 1567 1568 [FEAT_VMX_VMFUNC] = { 1569 .type = MSR_FEATURE_WORD, 1570 .feat_names = { 1571 [0] = "vmx-eptp-switching", 1572 }, 1573 .msr = { 1574 .index = MSR_IA32_VMX_VMFUNC, 1575 } 1576 }, 1577 1578 [FEAT_14_0_ECX] = { 1579 .type = CPUID_FEATURE_WORD, 1580 .feat_names = { 1581 NULL, NULL, NULL, NULL, 1582 NULL, NULL, NULL, NULL, 1583 NULL, NULL, NULL, NULL, 1584 NULL, NULL, NULL, NULL, 1585 NULL, NULL, NULL, NULL, 1586 NULL, NULL, NULL, NULL, 1587 NULL, NULL, NULL, NULL, 1588 NULL, NULL, NULL, "intel-pt-lip", 1589 }, 1590 .cpuid = { 1591 .eax = 0x14, 1592 .needs_ecx = true, .ecx = 0, 1593 .reg = R_ECX, 1594 }, 1595 .tcg_features = TCG_14_0_ECX_FEATURES, 1596 }, 1597 1598 [FEAT_SGX_12_0_EAX] = { 1599 .type = CPUID_FEATURE_WORD, 1600 .feat_names = { 1601 "sgx1", "sgx2", NULL, NULL, 1602 NULL, NULL, NULL, NULL, 1603 NULL, NULL, NULL, "sgx-edeccssa", 1604 NULL, NULL, NULL, NULL, 1605 NULL, NULL, NULL, NULL, 1606 NULL, NULL, NULL, NULL, 1607 NULL, NULL, NULL, NULL, 1608 NULL, NULL, NULL, NULL, 1609 }, 1610 .cpuid = { 1611 .eax = 0x12, 1612 .needs_ecx = true, .ecx = 0, 1613 .reg = R_EAX, 1614 }, 1615 .tcg_features = TCG_SGX_12_0_EAX_FEATURES, 1616 }, 1617 1618 [FEAT_SGX_12_0_EBX] = { 1619 .type = CPUID_FEATURE_WORD, 1620 .feat_names = { 1621 "sgx-exinfo" , NULL, NULL, NULL, 1622 NULL, NULL, NULL, NULL, 1623 NULL, NULL, NULL, NULL, 1624 NULL, NULL, NULL, NULL, 1625 NULL, NULL, NULL, NULL, 1626 NULL, NULL, NULL, NULL, 1627 NULL, NULL, NULL, NULL, 1628 NULL, NULL, NULL, NULL, 1629 }, 1630 .cpuid = { 1631 .eax = 0x12, 1632 .needs_ecx = true, .ecx = 0, 1633 .reg = R_EBX, 1634 }, 1635 .tcg_features = TCG_SGX_12_0_EBX_FEATURES, 1636 }, 1637 1638 [FEAT_SGX_12_1_EAX] = { 1639 .type = CPUID_FEATURE_WORD, 1640 .feat_names = { 1641 NULL, "sgx-debug", "sgx-mode64", NULL, 1642 "sgx-provisionkey", "sgx-tokenkey", NULL, "sgx-kss", 1643 NULL, NULL, "sgx-aex-notify", NULL, 1644 NULL, NULL, NULL, NULL, 1645 NULL, NULL, NULL, NULL, 1646 NULL, NULL, NULL, NULL, 1647 NULL, NULL, NULL, NULL, 1648 NULL, NULL, NULL, NULL, 1649 }, 1650 .cpuid = { 1651 .eax = 0x12, 1652 .needs_ecx = true, .ecx = 1, 1653 .reg = R_EAX, 1654 }, 1655 .tcg_features = TCG_SGX_12_1_EAX_FEATURES, 1656 }, 1657 }; 1658 1659 typedef struct FeatureMask { 1660 FeatureWord index; 1661 uint64_t mask; 1662 } FeatureMask; 1663 1664 typedef struct FeatureDep { 1665 FeatureMask from, to; 1666 } FeatureDep; 1667 1668 static FeatureDep feature_dependencies[] = { 1669 { 1670 .from = { FEAT_7_0_EDX, CPUID_7_0_EDX_ARCH_CAPABILITIES }, 1671 .to = { FEAT_ARCH_CAPABILITIES, ~0ull }, 1672 }, 1673 { 1674 .from = { FEAT_7_0_EDX, CPUID_7_0_EDX_CORE_CAPABILITY }, 1675 .to = { FEAT_CORE_CAPABILITY, ~0ull }, 1676 }, 1677 { 1678 .from = { FEAT_1_ECX, CPUID_EXT_PDCM }, 1679 .to = { FEAT_PERF_CAPABILITIES, ~0ull }, 1680 }, 1681 { 1682 .from = { FEAT_1_ECX, CPUID_EXT_VMX }, 1683 .to = { FEAT_VMX_PROCBASED_CTLS, ~0ull }, 1684 }, 1685 { 1686 .from = { FEAT_1_ECX, CPUID_EXT_VMX }, 1687 .to = { FEAT_VMX_PINBASED_CTLS, ~0ull }, 1688 }, 1689 { 1690 .from = { FEAT_1_ECX, CPUID_EXT_VMX }, 1691 .to = { FEAT_VMX_EXIT_CTLS, ~0ull }, 1692 }, 1693 { 1694 .from = { FEAT_1_ECX, CPUID_EXT_VMX }, 1695 .to = { FEAT_VMX_ENTRY_CTLS, ~0ull }, 1696 }, 1697 { 1698 .from = { FEAT_1_ECX, CPUID_EXT_VMX }, 1699 .to = { FEAT_VMX_MISC, ~0ull }, 1700 }, 1701 { 1702 .from = { FEAT_1_ECX, CPUID_EXT_VMX }, 1703 .to = { FEAT_VMX_BASIC, ~0ull }, 1704 }, 1705 { 1706 .from = { FEAT_8000_0001_EDX, CPUID_EXT2_LM }, 1707 .to = { FEAT_VMX_ENTRY_CTLS, VMX_VM_ENTRY_IA32E_MODE }, 1708 }, 1709 { 1710 .from = { FEAT_VMX_PROCBASED_CTLS, VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS }, 1711 .to = { FEAT_VMX_SECONDARY_CTLS, ~0ull }, 1712 }, 1713 { 1714 .from = { FEAT_XSAVE, CPUID_XSAVE_XSAVES }, 1715 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_XSAVES }, 1716 }, 1717 { 1718 .from = { FEAT_1_ECX, CPUID_EXT_RDRAND }, 1719 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDRAND_EXITING }, 1720 }, 1721 { 1722 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_INVPCID }, 1723 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_INVPCID }, 1724 }, 1725 { 1726 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_MPX }, 1727 .to = { FEAT_VMX_EXIT_CTLS, VMX_VM_EXIT_CLEAR_BNDCFGS }, 1728 }, 1729 { 1730 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_MPX }, 1731 .to = { FEAT_VMX_ENTRY_CTLS, VMX_VM_ENTRY_LOAD_BNDCFGS }, 1732 }, 1733 { 1734 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_RDSEED }, 1735 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDSEED_EXITING }, 1736 }, 1737 { 1738 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_INTEL_PT }, 1739 .to = { FEAT_14_0_ECX, ~0ull }, 1740 }, 1741 { 1742 .from = { FEAT_8000_0001_EDX, CPUID_EXT2_RDTSCP }, 1743 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_RDTSCP }, 1744 }, 1745 { 1746 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_EPT }, 1747 .to = { FEAT_VMX_EPT_VPID_CAPS, 0xffffffffull }, 1748 }, 1749 { 1750 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_EPT }, 1751 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST }, 1752 }, 1753 { 1754 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_VPID }, 1755 .to = { FEAT_VMX_EPT_VPID_CAPS, 0xffffffffull << 32 }, 1756 }, 1757 { 1758 .from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_VMFUNC }, 1759 .to = { FEAT_VMX_VMFUNC, ~0ull }, 1760 }, 1761 { 1762 .from = { FEAT_8000_0001_ECX, CPUID_EXT3_SVM }, 1763 .to = { FEAT_SVM, ~0ull }, 1764 }, 1765 { 1766 .from = { FEAT_7_0_ECX, CPUID_7_0_ECX_WAITPKG }, 1767 .to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_USER_WAIT_PAUSE }, 1768 }, 1769 { 1770 .from = { FEAT_8000_0001_EDX, CPUID_EXT2_LM }, 1771 .to = { FEAT_7_1_EAX, CPUID_7_1_EAX_FRED }, 1772 }, 1773 { 1774 .from = { FEAT_7_1_EAX, CPUID_7_1_EAX_LKGS }, 1775 .to = { FEAT_7_1_EAX, CPUID_7_1_EAX_FRED }, 1776 }, 1777 { 1778 .from = { FEAT_7_1_EAX, CPUID_7_1_EAX_WRMSRNS }, 1779 .to = { FEAT_7_1_EAX, CPUID_7_1_EAX_FRED }, 1780 }, 1781 { 1782 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_SGX }, 1783 .to = { FEAT_7_0_ECX, CPUID_7_0_ECX_SGX_LC }, 1784 }, 1785 { 1786 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_SGX }, 1787 .to = { FEAT_SGX_12_0_EAX, ~0ull }, 1788 }, 1789 { 1790 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_SGX }, 1791 .to = { FEAT_SGX_12_0_EBX, ~0ull }, 1792 }, 1793 { 1794 .from = { FEAT_7_0_EBX, CPUID_7_0_EBX_SGX }, 1795 .to = { FEAT_SGX_12_1_EAX, ~0ull }, 1796 }, 1797 { 1798 .from = { FEAT_24_0_EBX, CPUID_24_0_EBX_AVX10_128 }, 1799 .to = { FEAT_24_0_EBX, CPUID_24_0_EBX_AVX10_256 }, 1800 }, 1801 { 1802 .from = { FEAT_24_0_EBX, CPUID_24_0_EBX_AVX10_256 }, 1803 .to = { FEAT_24_0_EBX, CPUID_24_0_EBX_AVX10_512 }, 1804 }, 1805 { 1806 .from = { FEAT_24_0_EBX, CPUID_24_0_EBX_AVX10_VL_MASK }, 1807 .to = { FEAT_7_1_EDX, CPUID_7_1_EDX_AVX10 }, 1808 }, 1809 { 1810 .from = { FEAT_7_1_EDX, CPUID_7_1_EDX_AVX10 }, 1811 .to = { FEAT_24_0_EBX, ~0ull }, 1812 }, 1813 }; 1814 1815 typedef struct X86RegisterInfo32 { 1816 /* Name of register */ 1817 const char *name; 1818 /* QAPI enum value register */ 1819 X86CPURegister32 qapi_enum; 1820 } X86RegisterInfo32; 1821 1822 #define REGISTER(reg) \ 1823 [R_##reg] = { .name = #reg, .qapi_enum = X86_CPU_REGISTER32_##reg } 1824 static const X86RegisterInfo32 x86_reg_info_32[CPU_NB_REGS32] = { 1825 REGISTER(EAX), 1826 REGISTER(ECX), 1827 REGISTER(EDX), 1828 REGISTER(EBX), 1829 REGISTER(ESP), 1830 REGISTER(EBP), 1831 REGISTER(ESI), 1832 REGISTER(EDI), 1833 }; 1834 #undef REGISTER 1835 1836 /* CPUID feature bits available in XSS */ 1837 #define CPUID_XSTATE_XSS_MASK (XSTATE_ARCH_LBR_MASK) 1838 1839 ExtSaveArea x86_ext_save_areas[XSAVE_STATE_AREA_COUNT] = { 1840 [XSTATE_FP_BIT] = { 1841 /* x87 FP state component is always enabled if XSAVE is supported */ 1842 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE, 1843 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader), 1844 }, 1845 [XSTATE_SSE_BIT] = { 1846 /* SSE state component is always enabled if XSAVE is supported */ 1847 .feature = FEAT_1_ECX, .bits = CPUID_EXT_XSAVE, 1848 .size = sizeof(X86LegacyXSaveArea) + sizeof(X86XSaveHeader), 1849 }, 1850 [XSTATE_YMM_BIT] = 1851 { .feature = FEAT_1_ECX, .bits = CPUID_EXT_AVX, 1852 .size = sizeof(XSaveAVX) }, 1853 [XSTATE_BNDREGS_BIT] = 1854 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX, 1855 .size = sizeof(XSaveBNDREG) }, 1856 [XSTATE_BNDCSR_BIT] = 1857 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_MPX, 1858 .size = sizeof(XSaveBNDCSR) }, 1859 [XSTATE_OPMASK_BIT] = 1860 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F, 1861 .size = sizeof(XSaveOpmask) }, 1862 [XSTATE_ZMM_Hi256_BIT] = 1863 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F, 1864 .size = sizeof(XSaveZMM_Hi256) }, 1865 [XSTATE_Hi16_ZMM_BIT] = 1866 { .feature = FEAT_7_0_EBX, .bits = CPUID_7_0_EBX_AVX512F, 1867 .size = sizeof(XSaveHi16_ZMM) }, 1868 [XSTATE_PKRU_BIT] = 1869 { .feature = FEAT_7_0_ECX, .bits = CPUID_7_0_ECX_PKU, 1870 .size = sizeof(XSavePKRU) }, 1871 [XSTATE_ARCH_LBR_BIT] = { 1872 .feature = FEAT_7_0_EDX, .bits = CPUID_7_0_EDX_ARCH_LBR, 1873 .offset = 0 /*supervisor mode component, offset = 0 */, 1874 .size = sizeof(XSavesArchLBR) }, 1875 [XSTATE_XTILE_CFG_BIT] = { 1876 .feature = FEAT_7_0_EDX, .bits = CPUID_7_0_EDX_AMX_TILE, 1877 .size = sizeof(XSaveXTILECFG), 1878 }, 1879 [XSTATE_XTILE_DATA_BIT] = { 1880 .feature = FEAT_7_0_EDX, .bits = CPUID_7_0_EDX_AMX_TILE, 1881 .size = sizeof(XSaveXTILEDATA) 1882 }, 1883 }; 1884 1885 uint32_t xsave_area_size(uint64_t mask, bool compacted) 1886 { 1887 uint64_t ret = x86_ext_save_areas[0].size; 1888 const ExtSaveArea *esa; 1889 uint32_t offset = 0; 1890 int i; 1891 1892 for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) { 1893 esa = &x86_ext_save_areas[i]; 1894 if ((mask >> i) & 1) { 1895 offset = compacted ? ret : esa->offset; 1896 ret = MAX(ret, offset + esa->size); 1897 } 1898 } 1899 return ret; 1900 } 1901 1902 static inline bool accel_uses_host_cpuid(void) 1903 { 1904 return kvm_enabled() || hvf_enabled(); 1905 } 1906 1907 static inline uint64_t x86_cpu_xsave_xcr0_components(X86CPU *cpu) 1908 { 1909 return ((uint64_t)cpu->env.features[FEAT_XSAVE_XCR0_HI]) << 32 | 1910 cpu->env.features[FEAT_XSAVE_XCR0_LO]; 1911 } 1912 1913 /* Return name of 32-bit register, from a R_* constant */ 1914 static const char *get_register_name_32(unsigned int reg) 1915 { 1916 if (reg >= CPU_NB_REGS32) { 1917 return NULL; 1918 } 1919 return x86_reg_info_32[reg].name; 1920 } 1921 1922 static inline uint64_t x86_cpu_xsave_xss_components(X86CPU *cpu) 1923 { 1924 return ((uint64_t)cpu->env.features[FEAT_XSAVE_XSS_HI]) << 32 | 1925 cpu->env.features[FEAT_XSAVE_XSS_LO]; 1926 } 1927 1928 /* 1929 * Returns the set of feature flags that are supported and migratable by 1930 * QEMU, for a given FeatureWord. 1931 */ 1932 static uint64_t x86_cpu_get_migratable_flags(X86CPU *cpu, FeatureWord w) 1933 { 1934 FeatureWordInfo *wi = &feature_word_info[w]; 1935 CPUX86State *env = &cpu->env; 1936 uint64_t r = 0; 1937 int i; 1938 1939 for (i = 0; i < 64; i++) { 1940 uint64_t f = 1ULL << i; 1941 1942 /* If the feature name is known, it is implicitly considered migratable, 1943 * unless it is explicitly set in unmigratable_flags */ 1944 if ((wi->migratable_flags & f) || 1945 (wi->feat_names[i] && !(wi->unmigratable_flags & f))) { 1946 r |= f; 1947 } 1948 } 1949 1950 /* when tsc-khz is set explicitly, invtsc is migratable */ 1951 if ((w == FEAT_8000_0007_EDX) && env->user_tsc_khz) { 1952 r |= CPUID_APM_INVTSC; 1953 } 1954 1955 return r; 1956 } 1957 1958 void host_cpuid(uint32_t function, uint32_t count, 1959 uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) 1960 { 1961 uint32_t vec[4]; 1962 1963 #ifdef __x86_64__ 1964 asm volatile("cpuid" 1965 : "=a"(vec[0]), "=b"(vec[1]), 1966 "=c"(vec[2]), "=d"(vec[3]) 1967 : "0"(function), "c"(count) : "cc"); 1968 #elif defined(__i386__) 1969 asm volatile("pusha \n\t" 1970 "cpuid \n\t" 1971 "mov %%eax, 0(%2) \n\t" 1972 "mov %%ebx, 4(%2) \n\t" 1973 "mov %%ecx, 8(%2) \n\t" 1974 "mov %%edx, 12(%2) \n\t" 1975 "popa" 1976 : : "a"(function), "c"(count), "S"(vec) 1977 : "memory", "cc"); 1978 #else 1979 abort(); 1980 #endif 1981 1982 if (eax) 1983 *eax = vec[0]; 1984 if (ebx) 1985 *ebx = vec[1]; 1986 if (ecx) 1987 *ecx = vec[2]; 1988 if (edx) 1989 *edx = vec[3]; 1990 } 1991 1992 /* CPU class name definitions: */ 1993 1994 /* Return type name for a given CPU model name 1995 * Caller is responsible for freeing the returned string. 1996 */ 1997 static char *x86_cpu_type_name(const char *model_name) 1998 { 1999 return g_strdup_printf(X86_CPU_TYPE_NAME("%s"), model_name); 2000 } 2001 2002 static ObjectClass *x86_cpu_class_by_name(const char *cpu_model) 2003 { 2004 g_autofree char *typename = x86_cpu_type_name(cpu_model); 2005 return object_class_by_name(typename); 2006 } 2007 2008 static char *x86_cpu_class_get_model_name(X86CPUClass *cc) 2009 { 2010 const char *class_name = object_class_get_name(OBJECT_CLASS(cc)); 2011 assert(g_str_has_suffix(class_name, X86_CPU_TYPE_SUFFIX)); 2012 return cpu_model_from_type(class_name); 2013 } 2014 2015 typedef struct X86CPUVersionDefinition { 2016 X86CPUVersion version; 2017 const char *alias; 2018 const char *note; 2019 PropValue *props; 2020 const CPUCaches *const cache_info; 2021 } X86CPUVersionDefinition; 2022 2023 /* Base definition for a CPU model */ 2024 typedef struct X86CPUDefinition { 2025 const char *name; 2026 uint32_t level; 2027 uint32_t xlevel; 2028 /* vendor is zero-terminated, 12 character ASCII string */ 2029 char vendor[CPUID_VENDOR_SZ + 1]; 2030 int family; 2031 int model; 2032 int stepping; 2033 uint8_t avx10_version; 2034 FeatureWordArray features; 2035 const char *model_id; 2036 const CPUCaches *const cache_info; 2037 /* 2038 * Definitions for alternative versions of CPU model. 2039 * List is terminated by item with version == 0. 2040 * If NULL, version 1 will be registered automatically. 2041 */ 2042 const X86CPUVersionDefinition *versions; 2043 const char *deprecation_note; 2044 } X86CPUDefinition; 2045 2046 /* Reference to a specific CPU model version */ 2047 struct X86CPUModel { 2048 /* Base CPU definition */ 2049 const X86CPUDefinition *cpudef; 2050 /* CPU model version */ 2051 X86CPUVersion version; 2052 const char *note; 2053 /* 2054 * If true, this is an alias CPU model. 2055 * This matters only for "-cpu help" and query-cpu-definitions 2056 */ 2057 bool is_alias; 2058 }; 2059 2060 /* Get full model name for CPU version */ 2061 static char *x86_cpu_versioned_model_name(const X86CPUDefinition *cpudef, 2062 X86CPUVersion version) 2063 { 2064 assert(version > 0); 2065 return g_strdup_printf("%s-v%d", cpudef->name, (int)version); 2066 } 2067 2068 static const X86CPUVersionDefinition * 2069 x86_cpu_def_get_versions(const X86CPUDefinition *def) 2070 { 2071 /* When X86CPUDefinition::versions is NULL, we register only v1 */ 2072 static const X86CPUVersionDefinition default_version_list[] = { 2073 { 1 }, 2074 { /* end of list */ } 2075 }; 2076 2077 return def->versions ?: default_version_list; 2078 } 2079 2080 static const CPUCaches epyc_cache_info = { 2081 .l1d_cache = &(CPUCacheInfo) { 2082 .type = DATA_CACHE, 2083 .level = 1, 2084 .size = 32 * KiB, 2085 .line_size = 64, 2086 .associativity = 8, 2087 .partitions = 1, 2088 .sets = 64, 2089 .lines_per_tag = 1, 2090 .self_init = 1, 2091 .no_invd_sharing = true, 2092 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2093 }, 2094 .l1i_cache = &(CPUCacheInfo) { 2095 .type = INSTRUCTION_CACHE, 2096 .level = 1, 2097 .size = 64 * KiB, 2098 .line_size = 64, 2099 .associativity = 4, 2100 .partitions = 1, 2101 .sets = 256, 2102 .lines_per_tag = 1, 2103 .self_init = 1, 2104 .no_invd_sharing = true, 2105 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2106 }, 2107 .l2_cache = &(CPUCacheInfo) { 2108 .type = UNIFIED_CACHE, 2109 .level = 2, 2110 .size = 512 * KiB, 2111 .line_size = 64, 2112 .associativity = 8, 2113 .partitions = 1, 2114 .sets = 1024, 2115 .lines_per_tag = 1, 2116 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2117 }, 2118 .l3_cache = &(CPUCacheInfo) { 2119 .type = UNIFIED_CACHE, 2120 .level = 3, 2121 .size = 8 * MiB, 2122 .line_size = 64, 2123 .associativity = 16, 2124 .partitions = 1, 2125 .sets = 8192, 2126 .lines_per_tag = 1, 2127 .self_init = true, 2128 .inclusive = true, 2129 .complex_indexing = true, 2130 .share_level = CPU_TOPOLOGY_LEVEL_DIE, 2131 }, 2132 }; 2133 2134 static CPUCaches epyc_v4_cache_info = { 2135 .l1d_cache = &(CPUCacheInfo) { 2136 .type = DATA_CACHE, 2137 .level = 1, 2138 .size = 32 * KiB, 2139 .line_size = 64, 2140 .associativity = 8, 2141 .partitions = 1, 2142 .sets = 64, 2143 .lines_per_tag = 1, 2144 .self_init = 1, 2145 .no_invd_sharing = true, 2146 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2147 }, 2148 .l1i_cache = &(CPUCacheInfo) { 2149 .type = INSTRUCTION_CACHE, 2150 .level = 1, 2151 .size = 64 * KiB, 2152 .line_size = 64, 2153 .associativity = 4, 2154 .partitions = 1, 2155 .sets = 256, 2156 .lines_per_tag = 1, 2157 .self_init = 1, 2158 .no_invd_sharing = true, 2159 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2160 }, 2161 .l2_cache = &(CPUCacheInfo) { 2162 .type = UNIFIED_CACHE, 2163 .level = 2, 2164 .size = 512 * KiB, 2165 .line_size = 64, 2166 .associativity = 8, 2167 .partitions = 1, 2168 .sets = 1024, 2169 .lines_per_tag = 1, 2170 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2171 }, 2172 .l3_cache = &(CPUCacheInfo) { 2173 .type = UNIFIED_CACHE, 2174 .level = 3, 2175 .size = 8 * MiB, 2176 .line_size = 64, 2177 .associativity = 16, 2178 .partitions = 1, 2179 .sets = 8192, 2180 .lines_per_tag = 1, 2181 .self_init = true, 2182 .inclusive = true, 2183 .complex_indexing = false, 2184 .share_level = CPU_TOPOLOGY_LEVEL_DIE, 2185 }, 2186 }; 2187 2188 static const CPUCaches epyc_rome_cache_info = { 2189 .l1d_cache = &(CPUCacheInfo) { 2190 .type = DATA_CACHE, 2191 .level = 1, 2192 .size = 32 * KiB, 2193 .line_size = 64, 2194 .associativity = 8, 2195 .partitions = 1, 2196 .sets = 64, 2197 .lines_per_tag = 1, 2198 .self_init = 1, 2199 .no_invd_sharing = true, 2200 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2201 }, 2202 .l1i_cache = &(CPUCacheInfo) { 2203 .type = INSTRUCTION_CACHE, 2204 .level = 1, 2205 .size = 32 * KiB, 2206 .line_size = 64, 2207 .associativity = 8, 2208 .partitions = 1, 2209 .sets = 64, 2210 .lines_per_tag = 1, 2211 .self_init = 1, 2212 .no_invd_sharing = true, 2213 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2214 }, 2215 .l2_cache = &(CPUCacheInfo) { 2216 .type = UNIFIED_CACHE, 2217 .level = 2, 2218 .size = 512 * KiB, 2219 .line_size = 64, 2220 .associativity = 8, 2221 .partitions = 1, 2222 .sets = 1024, 2223 .lines_per_tag = 1, 2224 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2225 }, 2226 .l3_cache = &(CPUCacheInfo) { 2227 .type = UNIFIED_CACHE, 2228 .level = 3, 2229 .size = 16 * MiB, 2230 .line_size = 64, 2231 .associativity = 16, 2232 .partitions = 1, 2233 .sets = 16384, 2234 .lines_per_tag = 1, 2235 .self_init = true, 2236 .inclusive = true, 2237 .complex_indexing = true, 2238 .share_level = CPU_TOPOLOGY_LEVEL_DIE, 2239 }, 2240 }; 2241 2242 static const CPUCaches epyc_rome_v3_cache_info = { 2243 .l1d_cache = &(CPUCacheInfo) { 2244 .type = DATA_CACHE, 2245 .level = 1, 2246 .size = 32 * KiB, 2247 .line_size = 64, 2248 .associativity = 8, 2249 .partitions = 1, 2250 .sets = 64, 2251 .lines_per_tag = 1, 2252 .self_init = 1, 2253 .no_invd_sharing = true, 2254 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2255 }, 2256 .l1i_cache = &(CPUCacheInfo) { 2257 .type = INSTRUCTION_CACHE, 2258 .level = 1, 2259 .size = 32 * KiB, 2260 .line_size = 64, 2261 .associativity = 8, 2262 .partitions = 1, 2263 .sets = 64, 2264 .lines_per_tag = 1, 2265 .self_init = 1, 2266 .no_invd_sharing = true, 2267 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2268 }, 2269 .l2_cache = &(CPUCacheInfo) { 2270 .type = UNIFIED_CACHE, 2271 .level = 2, 2272 .size = 512 * KiB, 2273 .line_size = 64, 2274 .associativity = 8, 2275 .partitions = 1, 2276 .sets = 1024, 2277 .lines_per_tag = 1, 2278 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2279 }, 2280 .l3_cache = &(CPUCacheInfo) { 2281 .type = UNIFIED_CACHE, 2282 .level = 3, 2283 .size = 16 * MiB, 2284 .line_size = 64, 2285 .associativity = 16, 2286 .partitions = 1, 2287 .sets = 16384, 2288 .lines_per_tag = 1, 2289 .self_init = true, 2290 .inclusive = true, 2291 .complex_indexing = false, 2292 .share_level = CPU_TOPOLOGY_LEVEL_DIE, 2293 }, 2294 }; 2295 2296 static const CPUCaches epyc_milan_cache_info = { 2297 .l1d_cache = &(CPUCacheInfo) { 2298 .type = DATA_CACHE, 2299 .level = 1, 2300 .size = 32 * KiB, 2301 .line_size = 64, 2302 .associativity = 8, 2303 .partitions = 1, 2304 .sets = 64, 2305 .lines_per_tag = 1, 2306 .self_init = 1, 2307 .no_invd_sharing = true, 2308 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2309 }, 2310 .l1i_cache = &(CPUCacheInfo) { 2311 .type = INSTRUCTION_CACHE, 2312 .level = 1, 2313 .size = 32 * KiB, 2314 .line_size = 64, 2315 .associativity = 8, 2316 .partitions = 1, 2317 .sets = 64, 2318 .lines_per_tag = 1, 2319 .self_init = 1, 2320 .no_invd_sharing = true, 2321 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2322 }, 2323 .l2_cache = &(CPUCacheInfo) { 2324 .type = UNIFIED_CACHE, 2325 .level = 2, 2326 .size = 512 * KiB, 2327 .line_size = 64, 2328 .associativity = 8, 2329 .partitions = 1, 2330 .sets = 1024, 2331 .lines_per_tag = 1, 2332 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2333 }, 2334 .l3_cache = &(CPUCacheInfo) { 2335 .type = UNIFIED_CACHE, 2336 .level = 3, 2337 .size = 32 * MiB, 2338 .line_size = 64, 2339 .associativity = 16, 2340 .partitions = 1, 2341 .sets = 32768, 2342 .lines_per_tag = 1, 2343 .self_init = true, 2344 .inclusive = true, 2345 .complex_indexing = true, 2346 .share_level = CPU_TOPOLOGY_LEVEL_DIE, 2347 }, 2348 }; 2349 2350 static const CPUCaches epyc_milan_v2_cache_info = { 2351 .l1d_cache = &(CPUCacheInfo) { 2352 .type = DATA_CACHE, 2353 .level = 1, 2354 .size = 32 * KiB, 2355 .line_size = 64, 2356 .associativity = 8, 2357 .partitions = 1, 2358 .sets = 64, 2359 .lines_per_tag = 1, 2360 .self_init = 1, 2361 .no_invd_sharing = true, 2362 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2363 }, 2364 .l1i_cache = &(CPUCacheInfo) { 2365 .type = INSTRUCTION_CACHE, 2366 .level = 1, 2367 .size = 32 * KiB, 2368 .line_size = 64, 2369 .associativity = 8, 2370 .partitions = 1, 2371 .sets = 64, 2372 .lines_per_tag = 1, 2373 .self_init = 1, 2374 .no_invd_sharing = true, 2375 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2376 }, 2377 .l2_cache = &(CPUCacheInfo) { 2378 .type = UNIFIED_CACHE, 2379 .level = 2, 2380 .size = 512 * KiB, 2381 .line_size = 64, 2382 .associativity = 8, 2383 .partitions = 1, 2384 .sets = 1024, 2385 .lines_per_tag = 1, 2386 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2387 }, 2388 .l3_cache = &(CPUCacheInfo) { 2389 .type = UNIFIED_CACHE, 2390 .level = 3, 2391 .size = 32 * MiB, 2392 .line_size = 64, 2393 .associativity = 16, 2394 .partitions = 1, 2395 .sets = 32768, 2396 .lines_per_tag = 1, 2397 .self_init = true, 2398 .inclusive = true, 2399 .complex_indexing = false, 2400 .share_level = CPU_TOPOLOGY_LEVEL_DIE, 2401 }, 2402 }; 2403 2404 static const CPUCaches epyc_genoa_cache_info = { 2405 .l1d_cache = &(CPUCacheInfo) { 2406 .type = DATA_CACHE, 2407 .level = 1, 2408 .size = 32 * KiB, 2409 .line_size = 64, 2410 .associativity = 8, 2411 .partitions = 1, 2412 .sets = 64, 2413 .lines_per_tag = 1, 2414 .self_init = 1, 2415 .no_invd_sharing = true, 2416 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2417 }, 2418 .l1i_cache = &(CPUCacheInfo) { 2419 .type = INSTRUCTION_CACHE, 2420 .level = 1, 2421 .size = 32 * KiB, 2422 .line_size = 64, 2423 .associativity = 8, 2424 .partitions = 1, 2425 .sets = 64, 2426 .lines_per_tag = 1, 2427 .self_init = 1, 2428 .no_invd_sharing = true, 2429 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2430 }, 2431 .l2_cache = &(CPUCacheInfo) { 2432 .type = UNIFIED_CACHE, 2433 .level = 2, 2434 .size = 1 * MiB, 2435 .line_size = 64, 2436 .associativity = 8, 2437 .partitions = 1, 2438 .sets = 2048, 2439 .lines_per_tag = 1, 2440 .share_level = CPU_TOPOLOGY_LEVEL_CORE, 2441 }, 2442 .l3_cache = &(CPUCacheInfo) { 2443 .type = UNIFIED_CACHE, 2444 .level = 3, 2445 .size = 32 * MiB, 2446 .line_size = 64, 2447 .associativity = 16, 2448 .partitions = 1, 2449 .sets = 32768, 2450 .lines_per_tag = 1, 2451 .self_init = true, 2452 .inclusive = true, 2453 .complex_indexing = false, 2454 .share_level = CPU_TOPOLOGY_LEVEL_DIE, 2455 }, 2456 }; 2457 2458 /* The following VMX features are not supported by KVM and are left out in the 2459 * CPU definitions: 2460 * 2461 * Dual-monitor support (all processors) 2462 * Entry to SMM 2463 * Deactivate dual-monitor treatment 2464 * Number of CR3-target values 2465 * Shutdown activity state 2466 * Wait-for-SIPI activity state 2467 * PAUSE-loop exiting (Westmere and newer) 2468 * EPT-violation #VE (Broadwell and newer) 2469 * Inject event with insn length=0 (Skylake and newer) 2470 * Conceal non-root operation from PT 2471 * Conceal VM exits from PT 2472 * Conceal VM entries from PT 2473 * Enable ENCLS exiting 2474 * Mode-based execute control (XS/XU) 2475 * TSC scaling (Skylake Server and newer) 2476 * GPA translation for PT (IceLake and newer) 2477 * User wait and pause 2478 * ENCLV exiting 2479 * Load IA32_RTIT_CTL 2480 * Clear IA32_RTIT_CTL 2481 * Advanced VM-exit information for EPT violations 2482 * Sub-page write permissions 2483 * PT in VMX operation 2484 */ 2485 2486 static const X86CPUDefinition builtin_x86_defs[] = { 2487 { 2488 .name = "qemu64", 2489 .level = 0xd, 2490 .vendor = CPUID_VENDOR_AMD, 2491 .family = 15, 2492 .model = 107, 2493 .stepping = 1, 2494 .features[FEAT_1_EDX] = 2495 PPRO_FEATURES | 2496 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | 2497 CPUID_PSE36, 2498 .features[FEAT_1_ECX] = 2499 CPUID_EXT_SSE3 | CPUID_EXT_CX16, 2500 .features[FEAT_8000_0001_EDX] = 2501 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, 2502 .features[FEAT_8000_0001_ECX] = 2503 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM, 2504 .xlevel = 0x8000000A, 2505 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION, 2506 }, 2507 { 2508 .name = "phenom", 2509 .level = 5, 2510 .vendor = CPUID_VENDOR_AMD, 2511 .family = 16, 2512 .model = 2, 2513 .stepping = 3, 2514 /* Missing: CPUID_HT */ 2515 .features[FEAT_1_EDX] = 2516 PPRO_FEATURES | 2517 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | 2518 CPUID_PSE36 | CPUID_VME, 2519 .features[FEAT_1_ECX] = 2520 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_CX16 | 2521 CPUID_EXT_POPCNT, 2522 .features[FEAT_8000_0001_EDX] = 2523 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | 2524 CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_MMXEXT | 2525 CPUID_EXT2_FFXSR | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP, 2526 /* Missing: CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC, 2527 CPUID_EXT3_CR8LEG, 2528 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH, 2529 CPUID_EXT3_OSVW, CPUID_EXT3_IBS */ 2530 .features[FEAT_8000_0001_ECX] = 2531 CPUID_EXT3_LAHF_LM | CPUID_EXT3_SVM | 2532 CPUID_EXT3_ABM | CPUID_EXT3_SSE4A, 2533 /* Missing: CPUID_SVM_LBRV */ 2534 .features[FEAT_SVM] = 2535 CPUID_SVM_NPT, 2536 .xlevel = 0x8000001A, 2537 .model_id = "AMD Phenom(tm) 9550 Quad-Core Processor" 2538 }, 2539 { 2540 .name = "core2duo", 2541 .level = 10, 2542 .vendor = CPUID_VENDOR_INTEL, 2543 .family = 6, 2544 .model = 15, 2545 .stepping = 11, 2546 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */ 2547 .features[FEAT_1_EDX] = 2548 PPRO_FEATURES | 2549 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | 2550 CPUID_PSE36 | CPUID_VME | CPUID_ACPI | CPUID_SS, 2551 /* Missing: CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_EST, 2552 * CPUID_EXT_TM2, CPUID_EXT_XTPR, CPUID_EXT_PDCM, CPUID_EXT_VMX */ 2553 .features[FEAT_1_ECX] = 2554 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | 2555 CPUID_EXT_CX16, 2556 .features[FEAT_8000_0001_EDX] = 2557 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, 2558 .features[FEAT_8000_0001_ECX] = 2559 CPUID_EXT3_LAHF_LM, 2560 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS, 2561 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE, 2562 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT, 2563 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT, 2564 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 2565 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS, 2566 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 2567 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 2568 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 2569 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 2570 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 2571 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING | 2572 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 2573 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING | 2574 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS | 2575 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 2576 .features[FEAT_VMX_SECONDARY_CTLS] = 2577 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES, 2578 .xlevel = 0x80000008, 2579 .model_id = "Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz", 2580 }, 2581 { 2582 .name = "kvm64", 2583 .level = 0xd, 2584 .vendor = CPUID_VENDOR_INTEL, 2585 .family = 15, 2586 .model = 6, 2587 .stepping = 1, 2588 /* Missing: CPUID_HT */ 2589 .features[FEAT_1_EDX] = 2590 PPRO_FEATURES | CPUID_VME | 2591 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | 2592 CPUID_PSE36, 2593 /* Missing: CPUID_EXT_POPCNT, CPUID_EXT_MONITOR */ 2594 .features[FEAT_1_ECX] = 2595 CPUID_EXT_SSE3 | CPUID_EXT_CX16, 2596 /* Missing: CPUID_EXT2_PDPE1GB, CPUID_EXT2_RDTSCP */ 2597 .features[FEAT_8000_0001_EDX] = 2598 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, 2599 /* Missing: CPUID_EXT3_LAHF_LM, CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC, 2600 CPUID_EXT3_CR8LEG, CPUID_EXT3_ABM, CPUID_EXT3_SSE4A, 2601 CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH, 2602 CPUID_EXT3_OSVW, CPUID_EXT3_IBS, CPUID_EXT3_SVM */ 2603 .features[FEAT_8000_0001_ECX] = 2604 0, 2605 /* VMX features from Cedar Mill/Prescott */ 2606 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE, 2607 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT, 2608 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT, 2609 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 2610 VMX_PIN_BASED_NMI_EXITING, 2611 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 2612 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 2613 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 2614 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 2615 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 2616 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING | 2617 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 2618 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING, 2619 .xlevel = 0x80000008, 2620 .model_id = "Common KVM processor" 2621 }, 2622 { 2623 .name = "qemu32", 2624 .level = 4, 2625 .vendor = CPUID_VENDOR_INTEL, 2626 .family = 6, 2627 .model = 6, 2628 .stepping = 3, 2629 .features[FEAT_1_EDX] = 2630 PPRO_FEATURES, 2631 .features[FEAT_1_ECX] = 2632 CPUID_EXT_SSE3, 2633 .xlevel = 0x80000004, 2634 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION, 2635 }, 2636 { 2637 .name = "kvm32", 2638 .level = 5, 2639 .vendor = CPUID_VENDOR_INTEL, 2640 .family = 15, 2641 .model = 6, 2642 .stepping = 1, 2643 .features[FEAT_1_EDX] = 2644 PPRO_FEATURES | CPUID_VME | 2645 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_PSE36, 2646 .features[FEAT_1_ECX] = 2647 CPUID_EXT_SSE3, 2648 .features[FEAT_8000_0001_ECX] = 2649 0, 2650 /* VMX features from Yonah */ 2651 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE, 2652 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT, 2653 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT, 2654 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 2655 VMX_PIN_BASED_NMI_EXITING, 2656 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 2657 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 2658 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 2659 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 2660 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING | 2661 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING | 2662 VMX_CPU_BASED_PAUSE_EXITING | VMX_CPU_BASED_USE_MSR_BITMAPS, 2663 .xlevel = 0x80000008, 2664 .model_id = "Common 32-bit KVM processor" 2665 }, 2666 { 2667 .name = "coreduo", 2668 .level = 10, 2669 .vendor = CPUID_VENDOR_INTEL, 2670 .family = 6, 2671 .model = 14, 2672 .stepping = 8, 2673 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */ 2674 .features[FEAT_1_EDX] = 2675 PPRO_FEATURES | CPUID_VME | 2676 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_ACPI | 2677 CPUID_SS, 2678 /* Missing: CPUID_EXT_EST, CPUID_EXT_TM2 , CPUID_EXT_XTPR, 2679 * CPUID_EXT_PDCM, CPUID_EXT_VMX */ 2680 .features[FEAT_1_ECX] = 2681 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR, 2682 .features[FEAT_8000_0001_EDX] = 2683 CPUID_EXT2_NX, 2684 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE, 2685 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT, 2686 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT, 2687 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 2688 VMX_PIN_BASED_NMI_EXITING, 2689 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 2690 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 2691 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 2692 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 2693 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING | 2694 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING | 2695 VMX_CPU_BASED_PAUSE_EXITING | VMX_CPU_BASED_USE_MSR_BITMAPS, 2696 .xlevel = 0x80000008, 2697 .model_id = "Genuine Intel(R) CPU T2600 @ 2.16GHz", 2698 }, 2699 { 2700 .name = "486", 2701 .level = 1, 2702 .vendor = CPUID_VENDOR_INTEL, 2703 .family = 4, 2704 .model = 8, 2705 .stepping = 0, 2706 .features[FEAT_1_EDX] = 2707 I486_FEATURES, 2708 .xlevel = 0, 2709 .model_id = "", 2710 }, 2711 { 2712 .name = "pentium", 2713 .level = 1, 2714 .vendor = CPUID_VENDOR_INTEL, 2715 .family = 5, 2716 .model = 4, 2717 .stepping = 3, 2718 .features[FEAT_1_EDX] = 2719 PENTIUM_FEATURES, 2720 .xlevel = 0, 2721 .model_id = "", 2722 }, 2723 { 2724 .name = "pentium2", 2725 .level = 2, 2726 .vendor = CPUID_VENDOR_INTEL, 2727 .family = 6, 2728 .model = 5, 2729 .stepping = 2, 2730 .features[FEAT_1_EDX] = 2731 PENTIUM2_FEATURES, 2732 .xlevel = 0, 2733 .model_id = "", 2734 }, 2735 { 2736 .name = "pentium3", 2737 .level = 3, 2738 .vendor = CPUID_VENDOR_INTEL, 2739 .family = 6, 2740 .model = 7, 2741 .stepping = 3, 2742 .features[FEAT_1_EDX] = 2743 PENTIUM3_FEATURES, 2744 .xlevel = 0, 2745 .model_id = "", 2746 }, 2747 { 2748 .name = "athlon", 2749 .level = 2, 2750 .vendor = CPUID_VENDOR_AMD, 2751 .family = 6, 2752 .model = 2, 2753 .stepping = 3, 2754 .features[FEAT_1_EDX] = 2755 PPRO_FEATURES | CPUID_PSE36 | CPUID_VME | CPUID_MTRR | 2756 CPUID_MCA, 2757 .features[FEAT_8000_0001_EDX] = 2758 CPUID_EXT2_MMXEXT | CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT, 2759 .xlevel = 0x80000008, 2760 .model_id = "QEMU Virtual CPU version " QEMU_HW_VERSION, 2761 }, 2762 { 2763 .name = "n270", 2764 .level = 10, 2765 .vendor = CPUID_VENDOR_INTEL, 2766 .family = 6, 2767 .model = 28, 2768 .stepping = 2, 2769 /* Missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */ 2770 .features[FEAT_1_EDX] = 2771 PPRO_FEATURES | 2772 CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_VME | 2773 CPUID_ACPI | CPUID_SS, 2774 /* Some CPUs got no CPUID_SEP */ 2775 /* Missing: CPUID_EXT_DSCPL, CPUID_EXT_EST, CPUID_EXT_TM2, 2776 * CPUID_EXT_XTPR */ 2777 .features[FEAT_1_ECX] = 2778 CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3 | 2779 CPUID_EXT_MOVBE, 2780 .features[FEAT_8000_0001_EDX] = 2781 CPUID_EXT2_NX, 2782 .features[FEAT_8000_0001_ECX] = 2783 CPUID_EXT3_LAHF_LM, 2784 .xlevel = 0x80000008, 2785 .model_id = "Intel(R) Atom(TM) CPU N270 @ 1.60GHz", 2786 }, 2787 { 2788 .name = "Conroe", 2789 .level = 10, 2790 .vendor = CPUID_VENDOR_INTEL, 2791 .family = 6, 2792 .model = 15, 2793 .stepping = 3, 2794 .features[FEAT_1_EDX] = 2795 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2796 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2797 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2798 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2799 CPUID_DE | CPUID_FP87, 2800 .features[FEAT_1_ECX] = 2801 CPUID_EXT_SSSE3 | CPUID_EXT_SSE3, 2802 .features[FEAT_8000_0001_EDX] = 2803 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 2804 .features[FEAT_8000_0001_ECX] = 2805 CPUID_EXT3_LAHF_LM, 2806 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS, 2807 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE, 2808 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT, 2809 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT, 2810 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 2811 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS, 2812 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 2813 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 2814 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 2815 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 2816 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 2817 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING | 2818 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 2819 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING | 2820 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS | 2821 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 2822 .features[FEAT_VMX_SECONDARY_CTLS] = 2823 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES, 2824 .xlevel = 0x80000008, 2825 .model_id = "Intel Celeron_4x0 (Conroe/Merom Class Core 2)", 2826 }, 2827 { 2828 .name = "Penryn", 2829 .level = 10, 2830 .vendor = CPUID_VENDOR_INTEL, 2831 .family = 6, 2832 .model = 23, 2833 .stepping = 3, 2834 .features[FEAT_1_EDX] = 2835 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2836 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2837 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2838 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2839 CPUID_DE | CPUID_FP87, 2840 .features[FEAT_1_ECX] = 2841 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2842 CPUID_EXT_SSE3, 2843 .features[FEAT_8000_0001_EDX] = 2844 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 2845 .features[FEAT_8000_0001_ECX] = 2846 CPUID_EXT3_LAHF_LM, 2847 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS, 2848 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE | 2849 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL, 2850 .features[FEAT_VMX_EXIT_CTLS] = VMX_VM_EXIT_ACK_INTR_ON_EXIT | 2851 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL, 2852 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT, 2853 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 2854 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS, 2855 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 2856 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 2857 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 2858 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 2859 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 2860 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING | 2861 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 2862 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING | 2863 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS | 2864 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 2865 .features[FEAT_VMX_SECONDARY_CTLS] = 2866 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 2867 VMX_SECONDARY_EXEC_WBINVD_EXITING, 2868 .xlevel = 0x80000008, 2869 .model_id = "Intel Core 2 Duo P9xxx (Penryn Class Core 2)", 2870 }, 2871 { 2872 .name = "Nehalem", 2873 .level = 11, 2874 .vendor = CPUID_VENDOR_INTEL, 2875 .family = 6, 2876 .model = 26, 2877 .stepping = 3, 2878 .features[FEAT_1_EDX] = 2879 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2880 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2881 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2882 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2883 CPUID_DE | CPUID_FP87, 2884 .features[FEAT_1_ECX] = 2885 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 2886 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_SSE3, 2887 .features[FEAT_8000_0001_EDX] = 2888 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, 2889 .features[FEAT_8000_0001_ECX] = 2890 CPUID_EXT3_LAHF_LM, 2891 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS | 2892 MSR_VMX_BASIC_TRUE_CTLS, 2893 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE | 2894 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT | 2895 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER, 2896 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY | 2897 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | 2898 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT | 2899 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 2900 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 2901 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT | 2902 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS, 2903 .features[FEAT_VMX_EXIT_CTLS] = 2904 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | 2905 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 2906 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER | 2907 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 2908 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 2909 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT, 2910 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 2911 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS | 2912 VMX_PIN_BASED_VMX_PREEMPTION_TIMER, 2913 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 2914 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 2915 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 2916 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 2917 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 2918 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING | 2919 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 2920 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING | 2921 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS | 2922 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING | 2923 VMX_CPU_BASED_MONITOR_TRAP_FLAG | 2924 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 2925 .features[FEAT_VMX_SECONDARY_CTLS] = 2926 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 2927 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT | 2928 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP | 2929 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 2930 VMX_SECONDARY_EXEC_ENABLE_VPID, 2931 .xlevel = 0x80000008, 2932 .model_id = "Intel Core i7 9xx (Nehalem Class Core i7)", 2933 .versions = (X86CPUVersionDefinition[]) { 2934 { .version = 1 }, 2935 { 2936 .version = 2, 2937 .alias = "Nehalem-IBRS", 2938 .props = (PropValue[]) { 2939 { "spec-ctrl", "on" }, 2940 { "model-id", 2941 "Intel Core i7 9xx (Nehalem Core i7, IBRS update)" }, 2942 { /* end of list */ } 2943 } 2944 }, 2945 { /* end of list */ } 2946 } 2947 }, 2948 { 2949 .name = "Westmere", 2950 .level = 11, 2951 .vendor = CPUID_VENDOR_INTEL, 2952 .family = 6, 2953 .model = 44, 2954 .stepping = 1, 2955 .features[FEAT_1_EDX] = 2956 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 2957 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 2958 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 2959 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 2960 CPUID_DE | CPUID_FP87, 2961 .features[FEAT_1_ECX] = 2962 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | 2963 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 2964 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3, 2965 .features[FEAT_8000_0001_EDX] = 2966 CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX, 2967 .features[FEAT_8000_0001_ECX] = 2968 CPUID_EXT3_LAHF_LM, 2969 .features[FEAT_6_EAX] = 2970 CPUID_6_EAX_ARAT, 2971 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS | 2972 MSR_VMX_BASIC_TRUE_CTLS, 2973 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE | 2974 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT | 2975 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER, 2976 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY | 2977 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | 2978 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT | 2979 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 2980 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 2981 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT | 2982 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS, 2983 .features[FEAT_VMX_EXIT_CTLS] = 2984 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | 2985 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 2986 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER | 2987 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 2988 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 2989 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT | 2990 MSR_VMX_MISC_STORE_LMA, 2991 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 2992 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS | 2993 VMX_PIN_BASED_VMX_PREEMPTION_TIMER, 2994 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 2995 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 2996 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 2997 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 2998 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 2999 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING | 3000 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 3001 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING | 3002 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS | 3003 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING | 3004 VMX_CPU_BASED_MONITOR_TRAP_FLAG | 3005 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 3006 .features[FEAT_VMX_SECONDARY_CTLS] = 3007 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 3008 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT | 3009 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP | 3010 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 3011 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST, 3012 .xlevel = 0x80000008, 3013 .model_id = "Westmere E56xx/L56xx/X56xx (Nehalem-C)", 3014 .versions = (X86CPUVersionDefinition[]) { 3015 { .version = 1 }, 3016 { 3017 .version = 2, 3018 .alias = "Westmere-IBRS", 3019 .props = (PropValue[]) { 3020 { "spec-ctrl", "on" }, 3021 { "model-id", 3022 "Westmere E56xx/L56xx/X56xx (IBRS update)" }, 3023 { /* end of list */ } 3024 } 3025 }, 3026 { /* end of list */ } 3027 } 3028 }, 3029 { 3030 .name = "SandyBridge", 3031 .level = 0xd, 3032 .vendor = CPUID_VENDOR_INTEL, 3033 .family = 6, 3034 .model = 42, 3035 .stepping = 1, 3036 .features[FEAT_1_EDX] = 3037 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 3038 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 3039 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 3040 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 3041 CPUID_DE | CPUID_FP87, 3042 .features[FEAT_1_ECX] = 3043 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 3044 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT | 3045 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 3046 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | 3047 CPUID_EXT_SSE3, 3048 .features[FEAT_8000_0001_EDX] = 3049 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 3050 CPUID_EXT2_SYSCALL, 3051 .features[FEAT_8000_0001_ECX] = 3052 CPUID_EXT3_LAHF_LM, 3053 .features[FEAT_XSAVE] = 3054 CPUID_XSAVE_XSAVEOPT, 3055 .features[FEAT_6_EAX] = 3056 CPUID_6_EAX_ARAT, 3057 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS | 3058 MSR_VMX_BASIC_TRUE_CTLS, 3059 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE | 3060 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT | 3061 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER, 3062 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY | 3063 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | 3064 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT | 3065 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 3066 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 3067 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT | 3068 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS, 3069 .features[FEAT_VMX_EXIT_CTLS] = 3070 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | 3071 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 3072 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER | 3073 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 3074 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 3075 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT | 3076 MSR_VMX_MISC_STORE_LMA, 3077 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 3078 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS | 3079 VMX_PIN_BASED_VMX_PREEMPTION_TIMER, 3080 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 3081 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 3082 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 3083 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 3084 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 3085 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING | 3086 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 3087 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING | 3088 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS | 3089 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING | 3090 VMX_CPU_BASED_MONITOR_TRAP_FLAG | 3091 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 3092 .features[FEAT_VMX_SECONDARY_CTLS] = 3093 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 3094 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT | 3095 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP | 3096 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 3097 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST, 3098 .xlevel = 0x80000008, 3099 .model_id = "Intel Xeon E312xx (Sandy Bridge)", 3100 .versions = (X86CPUVersionDefinition[]) { 3101 { .version = 1 }, 3102 { 3103 .version = 2, 3104 .alias = "SandyBridge-IBRS", 3105 .props = (PropValue[]) { 3106 { "spec-ctrl", "on" }, 3107 { "model-id", 3108 "Intel Xeon E312xx (Sandy Bridge, IBRS update)" }, 3109 { /* end of list */ } 3110 } 3111 }, 3112 { /* end of list */ } 3113 } 3114 }, 3115 { 3116 .name = "IvyBridge", 3117 .level = 0xd, 3118 .vendor = CPUID_VENDOR_INTEL, 3119 .family = 6, 3120 .model = 58, 3121 .stepping = 9, 3122 .features[FEAT_1_EDX] = 3123 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 3124 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 3125 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 3126 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 3127 CPUID_DE | CPUID_FP87, 3128 .features[FEAT_1_ECX] = 3129 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 3130 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_POPCNT | 3131 CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 3132 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | 3133 CPUID_EXT_SSE3 | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 3134 .features[FEAT_7_0_EBX] = 3135 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP | 3136 CPUID_7_0_EBX_ERMS, 3137 .features[FEAT_8000_0001_EDX] = 3138 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 3139 CPUID_EXT2_SYSCALL, 3140 .features[FEAT_8000_0001_ECX] = 3141 CPUID_EXT3_LAHF_LM, 3142 .features[FEAT_XSAVE] = 3143 CPUID_XSAVE_XSAVEOPT, 3144 .features[FEAT_6_EAX] = 3145 CPUID_6_EAX_ARAT, 3146 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS | 3147 MSR_VMX_BASIC_TRUE_CTLS, 3148 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE | 3149 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT | 3150 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER, 3151 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY | 3152 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | 3153 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT | 3154 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 3155 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 3156 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT | 3157 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS, 3158 .features[FEAT_VMX_EXIT_CTLS] = 3159 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | 3160 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 3161 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER | 3162 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 3163 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 3164 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT | 3165 MSR_VMX_MISC_STORE_LMA, 3166 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 3167 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS | 3168 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR, 3169 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 3170 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 3171 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 3172 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 3173 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 3174 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING | 3175 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 3176 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING | 3177 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS | 3178 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING | 3179 VMX_CPU_BASED_MONITOR_TRAP_FLAG | 3180 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 3181 .features[FEAT_VMX_SECONDARY_CTLS] = 3182 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 3183 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT | 3184 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP | 3185 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 3186 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST | 3187 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT | 3188 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY | 3189 VMX_SECONDARY_EXEC_RDRAND_EXITING, 3190 .xlevel = 0x80000008, 3191 .model_id = "Intel Xeon E3-12xx v2 (Ivy Bridge)", 3192 .versions = (X86CPUVersionDefinition[]) { 3193 { .version = 1 }, 3194 { 3195 .version = 2, 3196 .alias = "IvyBridge-IBRS", 3197 .props = (PropValue[]) { 3198 { "spec-ctrl", "on" }, 3199 { "model-id", 3200 "Intel Xeon E3-12xx v2 (Ivy Bridge, IBRS)" }, 3201 { /* end of list */ } 3202 } 3203 }, 3204 { /* end of list */ } 3205 } 3206 }, 3207 { 3208 .name = "Haswell", 3209 .level = 0xd, 3210 .vendor = CPUID_VENDOR_INTEL, 3211 .family = 6, 3212 .model = 60, 3213 .stepping = 4, 3214 .features[FEAT_1_EDX] = 3215 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 3216 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 3217 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 3218 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 3219 CPUID_DE | CPUID_FP87, 3220 .features[FEAT_1_ECX] = 3221 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 3222 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 3223 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 3224 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 3225 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 3226 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 3227 .features[FEAT_8000_0001_EDX] = 3228 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 3229 CPUID_EXT2_SYSCALL, 3230 .features[FEAT_8000_0001_ECX] = 3231 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM, 3232 .features[FEAT_7_0_EBX] = 3233 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 3234 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 3235 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 3236 CPUID_7_0_EBX_RTM, 3237 .features[FEAT_XSAVE] = 3238 CPUID_XSAVE_XSAVEOPT, 3239 .features[FEAT_6_EAX] = 3240 CPUID_6_EAX_ARAT, 3241 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS | 3242 MSR_VMX_BASIC_TRUE_CTLS, 3243 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE | 3244 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT | 3245 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER, 3246 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY | 3247 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | 3248 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT | 3249 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 3250 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 3251 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT | 3252 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS, 3253 .features[FEAT_VMX_EXIT_CTLS] = 3254 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | 3255 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 3256 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER | 3257 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 3258 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 3259 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT | 3260 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT, 3261 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 3262 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS | 3263 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR, 3264 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 3265 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 3266 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 3267 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 3268 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 3269 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING | 3270 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 3271 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING | 3272 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS | 3273 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING | 3274 VMX_CPU_BASED_MONITOR_TRAP_FLAG | 3275 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 3276 .features[FEAT_VMX_SECONDARY_CTLS] = 3277 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 3278 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT | 3279 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP | 3280 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 3281 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST | 3282 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT | 3283 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY | 3284 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID | 3285 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS, 3286 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING, 3287 .xlevel = 0x80000008, 3288 .model_id = "Intel Core Processor (Haswell)", 3289 .versions = (X86CPUVersionDefinition[]) { 3290 { .version = 1 }, 3291 { 3292 .version = 2, 3293 .alias = "Haswell-noTSX", 3294 .props = (PropValue[]) { 3295 { "hle", "off" }, 3296 { "rtm", "off" }, 3297 { "stepping", "1" }, 3298 { "model-id", "Intel Core Processor (Haswell, no TSX)", }, 3299 { /* end of list */ } 3300 }, 3301 }, 3302 { 3303 .version = 3, 3304 .alias = "Haswell-IBRS", 3305 .props = (PropValue[]) { 3306 /* Restore TSX features removed by -v2 above */ 3307 { "hle", "on" }, 3308 { "rtm", "on" }, 3309 /* 3310 * Haswell and Haswell-IBRS had stepping=4 in 3311 * QEMU 4.0 and older 3312 */ 3313 { "stepping", "4" }, 3314 { "spec-ctrl", "on" }, 3315 { "model-id", 3316 "Intel Core Processor (Haswell, IBRS)" }, 3317 { /* end of list */ } 3318 } 3319 }, 3320 { 3321 .version = 4, 3322 .alias = "Haswell-noTSX-IBRS", 3323 .props = (PropValue[]) { 3324 { "hle", "off" }, 3325 { "rtm", "off" }, 3326 /* spec-ctrl was already enabled by -v3 above */ 3327 { "stepping", "1" }, 3328 { "model-id", 3329 "Intel Core Processor (Haswell, no TSX, IBRS)" }, 3330 { /* end of list */ } 3331 } 3332 }, 3333 { /* end of list */ } 3334 } 3335 }, 3336 { 3337 .name = "Broadwell", 3338 .level = 0xd, 3339 .vendor = CPUID_VENDOR_INTEL, 3340 .family = 6, 3341 .model = 61, 3342 .stepping = 2, 3343 .features[FEAT_1_EDX] = 3344 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 3345 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 3346 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 3347 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 3348 CPUID_DE | CPUID_FP87, 3349 .features[FEAT_1_ECX] = 3350 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 3351 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 3352 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 3353 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 3354 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 3355 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 3356 .features[FEAT_8000_0001_EDX] = 3357 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 3358 CPUID_EXT2_SYSCALL, 3359 .features[FEAT_8000_0001_ECX] = 3360 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 3361 .features[FEAT_7_0_EBX] = 3362 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 3363 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 3364 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 3365 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 3366 CPUID_7_0_EBX_SMAP, 3367 .features[FEAT_XSAVE] = 3368 CPUID_XSAVE_XSAVEOPT, 3369 .features[FEAT_6_EAX] = 3370 CPUID_6_EAX_ARAT, 3371 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS | 3372 MSR_VMX_BASIC_TRUE_CTLS, 3373 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE | 3374 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT | 3375 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER, 3376 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY | 3377 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | 3378 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT | 3379 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 3380 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 3381 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT | 3382 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS, 3383 .features[FEAT_VMX_EXIT_CTLS] = 3384 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | 3385 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 3386 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER | 3387 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 3388 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 3389 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT | 3390 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT, 3391 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 3392 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS | 3393 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR, 3394 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 3395 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 3396 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 3397 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 3398 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 3399 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING | 3400 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 3401 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING | 3402 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS | 3403 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING | 3404 VMX_CPU_BASED_MONITOR_TRAP_FLAG | 3405 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 3406 .features[FEAT_VMX_SECONDARY_CTLS] = 3407 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 3408 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT | 3409 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP | 3410 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 3411 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST | 3412 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT | 3413 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY | 3414 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID | 3415 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS | 3416 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML, 3417 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING, 3418 .xlevel = 0x80000008, 3419 .model_id = "Intel Core Processor (Broadwell)", 3420 .versions = (X86CPUVersionDefinition[]) { 3421 { .version = 1 }, 3422 { 3423 .version = 2, 3424 .alias = "Broadwell-noTSX", 3425 .props = (PropValue[]) { 3426 { "hle", "off" }, 3427 { "rtm", "off" }, 3428 { "model-id", "Intel Core Processor (Broadwell, no TSX)", }, 3429 { /* end of list */ } 3430 }, 3431 }, 3432 { 3433 .version = 3, 3434 .alias = "Broadwell-IBRS", 3435 .props = (PropValue[]) { 3436 /* Restore TSX features removed by -v2 above */ 3437 { "hle", "on" }, 3438 { "rtm", "on" }, 3439 { "spec-ctrl", "on" }, 3440 { "model-id", 3441 "Intel Core Processor (Broadwell, IBRS)" }, 3442 { /* end of list */ } 3443 } 3444 }, 3445 { 3446 .version = 4, 3447 .alias = "Broadwell-noTSX-IBRS", 3448 .props = (PropValue[]) { 3449 { "hle", "off" }, 3450 { "rtm", "off" }, 3451 /* spec-ctrl was already enabled by -v3 above */ 3452 { "model-id", 3453 "Intel Core Processor (Broadwell, no TSX, IBRS)" }, 3454 { /* end of list */ } 3455 } 3456 }, 3457 { /* end of list */ } 3458 } 3459 }, 3460 { 3461 .name = "Skylake-Client", 3462 .level = 0xd, 3463 .vendor = CPUID_VENDOR_INTEL, 3464 .family = 6, 3465 .model = 94, 3466 .stepping = 3, 3467 .features[FEAT_1_EDX] = 3468 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 3469 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 3470 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 3471 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 3472 CPUID_DE | CPUID_FP87, 3473 .features[FEAT_1_ECX] = 3474 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 3475 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 3476 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 3477 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 3478 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 3479 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 3480 .features[FEAT_8000_0001_EDX] = 3481 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_NX | 3482 CPUID_EXT2_SYSCALL, 3483 .features[FEAT_8000_0001_ECX] = 3484 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 3485 .features[FEAT_7_0_EBX] = 3486 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 3487 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 3488 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 3489 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 3490 CPUID_7_0_EBX_SMAP, 3491 /* XSAVES is added in version 4 */ 3492 .features[FEAT_XSAVE] = 3493 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 3494 CPUID_XSAVE_XGETBV1, 3495 .features[FEAT_6_EAX] = 3496 CPUID_6_EAX_ARAT, 3497 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */ 3498 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS | 3499 MSR_VMX_BASIC_TRUE_CTLS, 3500 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE | 3501 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT | 3502 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER, 3503 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY | 3504 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | 3505 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT | 3506 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 3507 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 3508 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT | 3509 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS, 3510 .features[FEAT_VMX_EXIT_CTLS] = 3511 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | 3512 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 3513 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER | 3514 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 3515 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 3516 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT | 3517 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT, 3518 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 3519 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS | 3520 VMX_PIN_BASED_VMX_PREEMPTION_TIMER, 3521 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 3522 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 3523 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 3524 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 3525 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 3526 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING | 3527 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 3528 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING | 3529 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS | 3530 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING | 3531 VMX_CPU_BASED_MONITOR_TRAP_FLAG | 3532 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 3533 .features[FEAT_VMX_SECONDARY_CTLS] = 3534 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 3535 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT | 3536 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP | 3537 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST | 3538 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID | 3539 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS | 3540 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML, 3541 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING, 3542 .xlevel = 0x80000008, 3543 .model_id = "Intel Core Processor (Skylake)", 3544 .versions = (X86CPUVersionDefinition[]) { 3545 { .version = 1 }, 3546 { 3547 .version = 2, 3548 .alias = "Skylake-Client-IBRS", 3549 .props = (PropValue[]) { 3550 { "spec-ctrl", "on" }, 3551 { "model-id", 3552 "Intel Core Processor (Skylake, IBRS)" }, 3553 { /* end of list */ } 3554 } 3555 }, 3556 { 3557 .version = 3, 3558 .alias = "Skylake-Client-noTSX-IBRS", 3559 .props = (PropValue[]) { 3560 { "hle", "off" }, 3561 { "rtm", "off" }, 3562 { "model-id", 3563 "Intel Core Processor (Skylake, IBRS, no TSX)" }, 3564 { /* end of list */ } 3565 } 3566 }, 3567 { 3568 .version = 4, 3569 .note = "IBRS, XSAVES, no TSX", 3570 .props = (PropValue[]) { 3571 { "xsaves", "on" }, 3572 { "vmx-xsaves", "on" }, 3573 { /* end of list */ } 3574 } 3575 }, 3576 { /* end of list */ } 3577 } 3578 }, 3579 { 3580 .name = "Skylake-Server", 3581 .level = 0xd, 3582 .vendor = CPUID_VENDOR_INTEL, 3583 .family = 6, 3584 .model = 85, 3585 .stepping = 4, 3586 .features[FEAT_1_EDX] = 3587 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 3588 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 3589 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 3590 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 3591 CPUID_DE | CPUID_FP87, 3592 .features[FEAT_1_ECX] = 3593 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 3594 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 3595 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 3596 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 3597 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 3598 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 3599 .features[FEAT_8000_0001_EDX] = 3600 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP | 3601 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 3602 .features[FEAT_8000_0001_ECX] = 3603 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 3604 .features[FEAT_7_0_EBX] = 3605 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 3606 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 3607 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 3608 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 3609 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB | 3610 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ | 3611 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD | 3612 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT, 3613 .features[FEAT_7_0_ECX] = 3614 CPUID_7_0_ECX_PKU, 3615 /* XSAVES is added in version 5 */ 3616 .features[FEAT_XSAVE] = 3617 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 3618 CPUID_XSAVE_XGETBV1, 3619 .features[FEAT_6_EAX] = 3620 CPUID_6_EAX_ARAT, 3621 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */ 3622 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS | 3623 MSR_VMX_BASIC_TRUE_CTLS, 3624 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE | 3625 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT | 3626 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER, 3627 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY | 3628 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | 3629 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT | 3630 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 3631 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 3632 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT | 3633 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS, 3634 .features[FEAT_VMX_EXIT_CTLS] = 3635 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | 3636 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 3637 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER | 3638 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 3639 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 3640 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT | 3641 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT, 3642 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 3643 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS | 3644 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR, 3645 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 3646 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 3647 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 3648 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 3649 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 3650 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING | 3651 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 3652 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING | 3653 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS | 3654 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING | 3655 VMX_CPU_BASED_MONITOR_TRAP_FLAG | 3656 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 3657 .features[FEAT_VMX_SECONDARY_CTLS] = 3658 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 3659 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT | 3660 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP | 3661 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 3662 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST | 3663 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT | 3664 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY | 3665 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID | 3666 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS | 3667 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML, 3668 .xlevel = 0x80000008, 3669 .model_id = "Intel Xeon Processor (Skylake)", 3670 .versions = (X86CPUVersionDefinition[]) { 3671 { .version = 1 }, 3672 { 3673 .version = 2, 3674 .alias = "Skylake-Server-IBRS", 3675 .props = (PropValue[]) { 3676 /* clflushopt was not added to Skylake-Server-IBRS */ 3677 /* TODO: add -v3 including clflushopt */ 3678 { "clflushopt", "off" }, 3679 { "spec-ctrl", "on" }, 3680 { "model-id", 3681 "Intel Xeon Processor (Skylake, IBRS)" }, 3682 { /* end of list */ } 3683 } 3684 }, 3685 { 3686 .version = 3, 3687 .alias = "Skylake-Server-noTSX-IBRS", 3688 .props = (PropValue[]) { 3689 { "hle", "off" }, 3690 { "rtm", "off" }, 3691 { "model-id", 3692 "Intel Xeon Processor (Skylake, IBRS, no TSX)" }, 3693 { /* end of list */ } 3694 } 3695 }, 3696 { 3697 .version = 4, 3698 .note = "IBRS, EPT switching, no TSX", 3699 .props = (PropValue[]) { 3700 { "vmx-eptp-switching", "on" }, 3701 { /* end of list */ } 3702 } 3703 }, 3704 { 3705 .version = 5, 3706 .note = "IBRS, XSAVES, EPT switching, no TSX", 3707 .props = (PropValue[]) { 3708 { "xsaves", "on" }, 3709 { "vmx-xsaves", "on" }, 3710 { /* end of list */ } 3711 } 3712 }, 3713 { /* end of list */ } 3714 } 3715 }, 3716 { 3717 .name = "Cascadelake-Server", 3718 .level = 0xd, 3719 .vendor = CPUID_VENDOR_INTEL, 3720 .family = 6, 3721 .model = 85, 3722 .stepping = 6, 3723 .features[FEAT_1_EDX] = 3724 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 3725 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 3726 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 3727 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 3728 CPUID_DE | CPUID_FP87, 3729 .features[FEAT_1_ECX] = 3730 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 3731 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 3732 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 3733 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 3734 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 3735 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 3736 .features[FEAT_8000_0001_EDX] = 3737 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP | 3738 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 3739 .features[FEAT_8000_0001_ECX] = 3740 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 3741 .features[FEAT_7_0_EBX] = 3742 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 3743 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 3744 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 3745 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 3746 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB | 3747 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ | 3748 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD | 3749 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT, 3750 .features[FEAT_7_0_ECX] = 3751 CPUID_7_0_ECX_PKU | 3752 CPUID_7_0_ECX_AVX512VNNI, 3753 .features[FEAT_7_0_EDX] = 3754 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD, 3755 /* XSAVES is added in version 5 */ 3756 .features[FEAT_XSAVE] = 3757 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 3758 CPUID_XSAVE_XGETBV1, 3759 .features[FEAT_6_EAX] = 3760 CPUID_6_EAX_ARAT, 3761 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */ 3762 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS | 3763 MSR_VMX_BASIC_TRUE_CTLS, 3764 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE | 3765 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT | 3766 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER, 3767 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY | 3768 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | 3769 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT | 3770 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 3771 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 3772 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT | 3773 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS, 3774 .features[FEAT_VMX_EXIT_CTLS] = 3775 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | 3776 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 3777 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER | 3778 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 3779 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 3780 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT | 3781 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT, 3782 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 3783 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS | 3784 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR, 3785 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 3786 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 3787 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 3788 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 3789 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 3790 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING | 3791 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 3792 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING | 3793 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS | 3794 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING | 3795 VMX_CPU_BASED_MONITOR_TRAP_FLAG | 3796 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 3797 .features[FEAT_VMX_SECONDARY_CTLS] = 3798 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 3799 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT | 3800 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP | 3801 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 3802 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST | 3803 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT | 3804 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY | 3805 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID | 3806 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS | 3807 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML, 3808 .xlevel = 0x80000008, 3809 .model_id = "Intel Xeon Processor (Cascadelake)", 3810 .versions = (X86CPUVersionDefinition[]) { 3811 { .version = 1 }, 3812 { .version = 2, 3813 .note = "ARCH_CAPABILITIES", 3814 .props = (PropValue[]) { 3815 { "arch-capabilities", "on" }, 3816 { "rdctl-no", "on" }, 3817 { "ibrs-all", "on" }, 3818 { "skip-l1dfl-vmentry", "on" }, 3819 { "mds-no", "on" }, 3820 { /* end of list */ } 3821 }, 3822 }, 3823 { .version = 3, 3824 .alias = "Cascadelake-Server-noTSX", 3825 .note = "ARCH_CAPABILITIES, no TSX", 3826 .props = (PropValue[]) { 3827 { "hle", "off" }, 3828 { "rtm", "off" }, 3829 { /* end of list */ } 3830 }, 3831 }, 3832 { .version = 4, 3833 .note = "ARCH_CAPABILITIES, EPT switching, no TSX", 3834 .props = (PropValue[]) { 3835 { "vmx-eptp-switching", "on" }, 3836 { /* end of list */ } 3837 }, 3838 }, 3839 { .version = 5, 3840 .note = "ARCH_CAPABILITIES, EPT switching, XSAVES, no TSX", 3841 .props = (PropValue[]) { 3842 { "xsaves", "on" }, 3843 { "vmx-xsaves", "on" }, 3844 { /* end of list */ } 3845 }, 3846 }, 3847 { /* end of list */ } 3848 } 3849 }, 3850 { 3851 .name = "Cooperlake", 3852 .level = 0xd, 3853 .vendor = CPUID_VENDOR_INTEL, 3854 .family = 6, 3855 .model = 85, 3856 .stepping = 10, 3857 .features[FEAT_1_EDX] = 3858 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 3859 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 3860 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 3861 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 3862 CPUID_DE | CPUID_FP87, 3863 .features[FEAT_1_ECX] = 3864 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 3865 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 3866 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 3867 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 3868 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 3869 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 3870 .features[FEAT_8000_0001_EDX] = 3871 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP | 3872 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 3873 .features[FEAT_8000_0001_ECX] = 3874 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 3875 .features[FEAT_7_0_EBX] = 3876 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 3877 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 3878 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 3879 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 3880 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB | 3881 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ | 3882 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD | 3883 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT, 3884 .features[FEAT_7_0_ECX] = 3885 CPUID_7_0_ECX_PKU | 3886 CPUID_7_0_ECX_AVX512VNNI, 3887 .features[FEAT_7_0_EDX] = 3888 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_STIBP | 3889 CPUID_7_0_EDX_SPEC_CTRL_SSBD | CPUID_7_0_EDX_ARCH_CAPABILITIES, 3890 .features[FEAT_ARCH_CAPABILITIES] = 3891 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL | 3892 MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO | 3893 MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO, 3894 .features[FEAT_7_1_EAX] = 3895 CPUID_7_1_EAX_AVX512_BF16, 3896 /* XSAVES is added in version 2 */ 3897 .features[FEAT_XSAVE] = 3898 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 3899 CPUID_XSAVE_XGETBV1, 3900 .features[FEAT_6_EAX] = 3901 CPUID_6_EAX_ARAT, 3902 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */ 3903 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS | 3904 MSR_VMX_BASIC_TRUE_CTLS, 3905 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE | 3906 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT | 3907 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER, 3908 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY | 3909 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | 3910 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT | 3911 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 3912 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 3913 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT | 3914 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS, 3915 .features[FEAT_VMX_EXIT_CTLS] = 3916 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | 3917 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 3918 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER | 3919 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 3920 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 3921 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT | 3922 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT, 3923 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 3924 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS | 3925 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR, 3926 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 3927 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 3928 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 3929 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 3930 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 3931 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING | 3932 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 3933 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING | 3934 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS | 3935 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING | 3936 VMX_CPU_BASED_MONITOR_TRAP_FLAG | 3937 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 3938 .features[FEAT_VMX_SECONDARY_CTLS] = 3939 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 3940 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT | 3941 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP | 3942 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 3943 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST | 3944 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT | 3945 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY | 3946 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID | 3947 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS | 3948 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML, 3949 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING, 3950 .xlevel = 0x80000008, 3951 .model_id = "Intel Xeon Processor (Cooperlake)", 3952 .versions = (X86CPUVersionDefinition[]) { 3953 { .version = 1 }, 3954 { .version = 2, 3955 .note = "XSAVES", 3956 .props = (PropValue[]) { 3957 { "xsaves", "on" }, 3958 { "vmx-xsaves", "on" }, 3959 { /* end of list */ } 3960 }, 3961 }, 3962 { /* end of list */ } 3963 } 3964 }, 3965 { 3966 .name = "Icelake-Server", 3967 .level = 0xd, 3968 .vendor = CPUID_VENDOR_INTEL, 3969 .family = 6, 3970 .model = 134, 3971 .stepping = 0, 3972 .features[FEAT_1_EDX] = 3973 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 3974 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 3975 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 3976 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 3977 CPUID_DE | CPUID_FP87, 3978 .features[FEAT_1_ECX] = 3979 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 3980 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 3981 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 3982 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 3983 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 3984 CPUID_EXT_PCID | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 3985 .features[FEAT_8000_0001_EDX] = 3986 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP | 3987 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 3988 .features[FEAT_8000_0001_ECX] = 3989 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 3990 .features[FEAT_8000_0008_EBX] = 3991 CPUID_8000_0008_EBX_WBNOINVD, 3992 .features[FEAT_7_0_EBX] = 3993 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | 3994 CPUID_7_0_EBX_HLE | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 3995 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 3996 CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 3997 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLWB | 3998 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ | 3999 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512CD | 4000 CPUID_7_0_EBX_AVX512VL | CPUID_7_0_EBX_CLFLUSHOPT, 4001 .features[FEAT_7_0_ECX] = 4002 CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | 4003 CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI | 4004 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ | 4005 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG | 4006 CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57, 4007 .features[FEAT_7_0_EDX] = 4008 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_SPEC_CTRL_SSBD, 4009 /* XSAVES is added in version 5 */ 4010 .features[FEAT_XSAVE] = 4011 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 4012 CPUID_XSAVE_XGETBV1, 4013 .features[FEAT_6_EAX] = 4014 CPUID_6_EAX_ARAT, 4015 /* Missing: Mode-based execute control (XS/XU), processor tracing, TSC scaling */ 4016 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS | 4017 MSR_VMX_BASIC_TRUE_CTLS, 4018 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE | 4019 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT | 4020 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER, 4021 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY | 4022 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | 4023 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT | 4024 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 4025 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 4026 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT | 4027 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS, 4028 .features[FEAT_VMX_EXIT_CTLS] = 4029 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | 4030 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 4031 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER | 4032 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 4033 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 4034 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT | 4035 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT, 4036 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 4037 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS | 4038 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR, 4039 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 4040 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 4041 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 4042 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 4043 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 4044 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING | 4045 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 4046 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING | 4047 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS | 4048 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING | 4049 VMX_CPU_BASED_MONITOR_TRAP_FLAG | 4050 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 4051 .features[FEAT_VMX_SECONDARY_CTLS] = 4052 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 4053 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT | 4054 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP | 4055 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 4056 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST | 4057 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT | 4058 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY | 4059 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID | 4060 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS, 4061 .xlevel = 0x80000008, 4062 .model_id = "Intel Xeon Processor (Icelake)", 4063 .versions = (X86CPUVersionDefinition[]) { 4064 { .version = 1 }, 4065 { 4066 .version = 2, 4067 .note = "no TSX", 4068 .alias = "Icelake-Server-noTSX", 4069 .props = (PropValue[]) { 4070 { "hle", "off" }, 4071 { "rtm", "off" }, 4072 { /* end of list */ } 4073 }, 4074 }, 4075 { 4076 .version = 3, 4077 .props = (PropValue[]) { 4078 { "arch-capabilities", "on" }, 4079 { "rdctl-no", "on" }, 4080 { "ibrs-all", "on" }, 4081 { "skip-l1dfl-vmentry", "on" }, 4082 { "mds-no", "on" }, 4083 { "pschange-mc-no", "on" }, 4084 { "taa-no", "on" }, 4085 { /* end of list */ } 4086 }, 4087 }, 4088 { 4089 .version = 4, 4090 .props = (PropValue[]) { 4091 { "sha-ni", "on" }, 4092 { "avx512ifma", "on" }, 4093 { "rdpid", "on" }, 4094 { "fsrm", "on" }, 4095 { "vmx-rdseed-exit", "on" }, 4096 { "vmx-pml", "on" }, 4097 { "vmx-eptp-switching", "on" }, 4098 { "model", "106" }, 4099 { /* end of list */ } 4100 }, 4101 }, 4102 { 4103 .version = 5, 4104 .note = "XSAVES", 4105 .props = (PropValue[]) { 4106 { "xsaves", "on" }, 4107 { "vmx-xsaves", "on" }, 4108 { /* end of list */ } 4109 }, 4110 }, 4111 { 4112 .version = 6, 4113 .note = "5-level EPT", 4114 .props = (PropValue[]) { 4115 { "vmx-page-walk-5", "on" }, 4116 { /* end of list */ } 4117 }, 4118 }, 4119 { 4120 .version = 7, 4121 .note = "TSX, taa-no", 4122 .props = (PropValue[]) { 4123 /* Restore TSX features removed by -v2 above */ 4124 { "hle", "on" }, 4125 { "rtm", "on" }, 4126 { /* end of list */ } 4127 }, 4128 }, 4129 { /* end of list */ } 4130 } 4131 }, 4132 { 4133 .name = "SapphireRapids", 4134 .level = 0x20, 4135 .vendor = CPUID_VENDOR_INTEL, 4136 .family = 6, 4137 .model = 143, 4138 .stepping = 4, 4139 /* 4140 * please keep the ascending order so that we can have a clear view of 4141 * bit position of each feature. 4142 */ 4143 .features[FEAT_1_EDX] = 4144 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC | 4145 CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | 4146 CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | 4147 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR | 4148 CPUID_SSE | CPUID_SSE2, 4149 .features[FEAT_1_ECX] = 4150 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 | 4151 CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 | 4152 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE | 4153 CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES | 4154 CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 4155 .features[FEAT_8000_0001_EDX] = 4156 CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB | 4157 CPUID_EXT2_RDTSCP | CPUID_EXT2_LM, 4158 .features[FEAT_8000_0001_ECX] = 4159 CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH, 4160 .features[FEAT_8000_0008_EBX] = 4161 CPUID_8000_0008_EBX_WBNOINVD, 4162 .features[FEAT_7_0_EBX] = 4163 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_HLE | 4164 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | 4165 CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_RTM | 4166 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ | 4167 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | 4168 CPUID_7_0_EBX_AVX512IFMA | CPUID_7_0_EBX_CLFLUSHOPT | 4169 CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_SHA_NI | 4170 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512VL, 4171 .features[FEAT_7_0_ECX] = 4172 CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | 4173 CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI | 4174 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ | 4175 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG | 4176 CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57 | 4177 CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT, 4178 .features[FEAT_7_0_EDX] = 4179 CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE | 4180 CPUID_7_0_EDX_TSX_LDTRK | CPUID_7_0_EDX_AMX_BF16 | 4181 CPUID_7_0_EDX_AVX512_FP16 | CPUID_7_0_EDX_AMX_TILE | 4182 CPUID_7_0_EDX_AMX_INT8 | CPUID_7_0_EDX_SPEC_CTRL | 4183 CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD, 4184 .features[FEAT_ARCH_CAPABILITIES] = 4185 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL | 4186 MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO | 4187 MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO, 4188 .features[FEAT_XSAVE] = 4189 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 4190 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES | CPUID_D_1_EAX_XFD, 4191 .features[FEAT_6_EAX] = 4192 CPUID_6_EAX_ARAT, 4193 .features[FEAT_7_1_EAX] = 4194 CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_AVX512_BF16 | 4195 CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_FSRC, 4196 .features[FEAT_VMX_BASIC] = 4197 MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS, 4198 .features[FEAT_VMX_ENTRY_CTLS] = 4199 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE | 4200 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | 4201 VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER, 4202 .features[FEAT_VMX_EPT_VPID_CAPS] = 4203 MSR_VMX_EPT_EXECONLY | 4204 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_PAGE_WALK_LENGTH_5 | 4205 MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB | 4206 MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS | 4207 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 4208 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 4209 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | 4210 MSR_VMX_EPT_INVVPID_ALL_CONTEXT | 4211 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS, 4212 .features[FEAT_VMX_EXIT_CTLS] = 4213 VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | 4214 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 4215 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT | 4216 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 4217 VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 4218 .features[FEAT_VMX_MISC] = 4219 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT | 4220 MSR_VMX_MISC_VMWRITE_VMEXIT, 4221 .features[FEAT_VMX_PINBASED_CTLS] = 4222 VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING | 4223 VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER | 4224 VMX_PIN_BASED_POSTED_INTR, 4225 .features[FEAT_VMX_PROCBASED_CTLS] = 4226 VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 4227 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 4228 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 4229 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 4230 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING | 4231 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 4232 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING | 4233 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING | 4234 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG | 4235 VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING | 4236 VMX_CPU_BASED_PAUSE_EXITING | 4237 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 4238 .features[FEAT_VMX_SECONDARY_CTLS] = 4239 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 4240 VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC | 4241 VMX_SECONDARY_EXEC_RDTSCP | 4242 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 4243 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING | 4244 VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST | 4245 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT | 4246 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY | 4247 VMX_SECONDARY_EXEC_RDRAND_EXITING | 4248 VMX_SECONDARY_EXEC_ENABLE_INVPCID | 4249 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS | 4250 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML | 4251 VMX_SECONDARY_EXEC_XSAVES, 4252 .features[FEAT_VMX_VMFUNC] = 4253 MSR_VMX_VMFUNC_EPT_SWITCHING, 4254 .xlevel = 0x80000008, 4255 .model_id = "Intel Xeon Processor (SapphireRapids)", 4256 .versions = (X86CPUVersionDefinition[]) { 4257 { .version = 1 }, 4258 { 4259 .version = 2, 4260 .props = (PropValue[]) { 4261 { "sbdr-ssdp-no", "on" }, 4262 { "fbsdp-no", "on" }, 4263 { "psdp-no", "on" }, 4264 { /* end of list */ } 4265 } 4266 }, 4267 { 4268 .version = 3, 4269 .props = (PropValue[]) { 4270 { "ss", "on" }, 4271 { "tsc-adjust", "on" }, 4272 { "cldemote", "on" }, 4273 { "movdiri", "on" }, 4274 { "movdir64b", "on" }, 4275 { /* end of list */ } 4276 } 4277 }, 4278 { /* end of list */ } 4279 } 4280 }, 4281 { 4282 .name = "GraniteRapids", 4283 .level = 0x20, 4284 .vendor = CPUID_VENDOR_INTEL, 4285 .family = 6, 4286 .model = 173, 4287 .stepping = 0, 4288 /* 4289 * please keep the ascending order so that we can have a clear view of 4290 * bit position of each feature. 4291 */ 4292 .features[FEAT_1_EDX] = 4293 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC | 4294 CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | 4295 CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | 4296 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR | 4297 CPUID_SSE | CPUID_SSE2, 4298 .features[FEAT_1_ECX] = 4299 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 | 4300 CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 | 4301 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE | 4302 CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES | 4303 CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 4304 .features[FEAT_8000_0001_EDX] = 4305 CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB | 4306 CPUID_EXT2_RDTSCP | CPUID_EXT2_LM, 4307 .features[FEAT_8000_0001_ECX] = 4308 CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH, 4309 .features[FEAT_8000_0008_EBX] = 4310 CPUID_8000_0008_EBX_WBNOINVD, 4311 .features[FEAT_7_0_EBX] = 4312 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_HLE | 4313 CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | 4314 CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_RTM | 4315 CPUID_7_0_EBX_AVX512F | CPUID_7_0_EBX_AVX512DQ | 4316 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | 4317 CPUID_7_0_EBX_AVX512IFMA | CPUID_7_0_EBX_CLFLUSHOPT | 4318 CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_SHA_NI | 4319 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512VL, 4320 .features[FEAT_7_0_ECX] = 4321 CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | 4322 CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI | 4323 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ | 4324 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG | 4325 CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57 | 4326 CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT, 4327 .features[FEAT_7_0_EDX] = 4328 CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE | 4329 CPUID_7_0_EDX_TSX_LDTRK | CPUID_7_0_EDX_AMX_BF16 | 4330 CPUID_7_0_EDX_AVX512_FP16 | CPUID_7_0_EDX_AMX_TILE | 4331 CPUID_7_0_EDX_AMX_INT8 | CPUID_7_0_EDX_SPEC_CTRL | 4332 CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD, 4333 .features[FEAT_ARCH_CAPABILITIES] = 4334 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL | 4335 MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO | 4336 MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_TAA_NO | 4337 MSR_ARCH_CAP_SBDR_SSDP_NO | MSR_ARCH_CAP_FBSDP_NO | 4338 MSR_ARCH_CAP_PSDP_NO | MSR_ARCH_CAP_PBRSB_NO, 4339 .features[FEAT_XSAVE] = 4340 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 4341 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES | CPUID_D_1_EAX_XFD, 4342 .features[FEAT_6_EAX] = 4343 CPUID_6_EAX_ARAT, 4344 .features[FEAT_7_1_EAX] = 4345 CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_AVX512_BF16 | 4346 CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_FSRC | 4347 CPUID_7_1_EAX_AMX_FP16, 4348 .features[FEAT_7_1_EDX] = 4349 CPUID_7_1_EDX_PREFETCHITI, 4350 .features[FEAT_7_2_EDX] = 4351 CPUID_7_2_EDX_MCDT_NO, 4352 .features[FEAT_VMX_BASIC] = 4353 MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS, 4354 .features[FEAT_VMX_ENTRY_CTLS] = 4355 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE | 4356 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | 4357 VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER, 4358 .features[FEAT_VMX_EPT_VPID_CAPS] = 4359 MSR_VMX_EPT_EXECONLY | 4360 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_PAGE_WALK_LENGTH_5 | 4361 MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB | 4362 MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS | 4363 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 4364 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 4365 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | 4366 MSR_VMX_EPT_INVVPID_ALL_CONTEXT | 4367 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS, 4368 .features[FEAT_VMX_EXIT_CTLS] = 4369 VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | 4370 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 4371 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT | 4372 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 4373 VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 4374 .features[FEAT_VMX_MISC] = 4375 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT | 4376 MSR_VMX_MISC_VMWRITE_VMEXIT, 4377 .features[FEAT_VMX_PINBASED_CTLS] = 4378 VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING | 4379 VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER | 4380 VMX_PIN_BASED_POSTED_INTR, 4381 .features[FEAT_VMX_PROCBASED_CTLS] = 4382 VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 4383 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 4384 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 4385 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 4386 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING | 4387 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 4388 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING | 4389 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING | 4390 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG | 4391 VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING | 4392 VMX_CPU_BASED_PAUSE_EXITING | 4393 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 4394 .features[FEAT_VMX_SECONDARY_CTLS] = 4395 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 4396 VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC | 4397 VMX_SECONDARY_EXEC_RDTSCP | 4398 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 4399 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING | 4400 VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST | 4401 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT | 4402 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY | 4403 VMX_SECONDARY_EXEC_RDRAND_EXITING | 4404 VMX_SECONDARY_EXEC_ENABLE_INVPCID | 4405 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS | 4406 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML | 4407 VMX_SECONDARY_EXEC_XSAVES, 4408 .features[FEAT_VMX_VMFUNC] = 4409 MSR_VMX_VMFUNC_EPT_SWITCHING, 4410 .xlevel = 0x80000008, 4411 .model_id = "Intel Xeon Processor (GraniteRapids)", 4412 .versions = (X86CPUVersionDefinition[]) { 4413 { .version = 1 }, 4414 { 4415 .version = 2, 4416 .props = (PropValue[]) { 4417 { "ss", "on" }, 4418 { "tsc-adjust", "on" }, 4419 { "cldemote", "on" }, 4420 { "movdiri", "on" }, 4421 { "movdir64b", "on" }, 4422 { "avx10", "on" }, 4423 { "avx10-128", "on" }, 4424 { "avx10-256", "on" }, 4425 { "avx10-512", "on" }, 4426 { "avx10-version", "1" }, 4427 { "stepping", "1" }, 4428 { /* end of list */ } 4429 } 4430 }, 4431 { /* end of list */ }, 4432 }, 4433 }, 4434 { 4435 .name = "SierraForest", 4436 .level = 0x23, 4437 .vendor = CPUID_VENDOR_INTEL, 4438 .family = 6, 4439 .model = 175, 4440 .stepping = 0, 4441 /* 4442 * please keep the ascending order so that we can have a clear view of 4443 * bit position of each feature. 4444 */ 4445 .features[FEAT_1_EDX] = 4446 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC | 4447 CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | 4448 CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | 4449 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR | 4450 CPUID_SSE | CPUID_SSE2, 4451 .features[FEAT_1_ECX] = 4452 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 | 4453 CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 | 4454 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE | 4455 CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES | 4456 CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 4457 .features[FEAT_8000_0001_EDX] = 4458 CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB | 4459 CPUID_EXT2_RDTSCP | CPUID_EXT2_LM, 4460 .features[FEAT_8000_0001_ECX] = 4461 CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH, 4462 .features[FEAT_8000_0008_EBX] = 4463 CPUID_8000_0008_EBX_WBNOINVD, 4464 .features[FEAT_7_0_EBX] = 4465 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 | 4466 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | 4467 CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 4468 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_CLWB | 4469 CPUID_7_0_EBX_SHA_NI, 4470 .features[FEAT_7_0_ECX] = 4471 CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | CPUID_7_0_ECX_GFNI | 4472 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ | 4473 CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT, 4474 .features[FEAT_7_0_EDX] = 4475 CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE | 4476 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_ARCH_CAPABILITIES | 4477 CPUID_7_0_EDX_SPEC_CTRL_SSBD, 4478 .features[FEAT_ARCH_CAPABILITIES] = 4479 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL | 4480 MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO | 4481 MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_SBDR_SSDP_NO | 4482 MSR_ARCH_CAP_FBSDP_NO | MSR_ARCH_CAP_PSDP_NO | 4483 MSR_ARCH_CAP_PBRSB_NO, 4484 .features[FEAT_XSAVE] = 4485 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 4486 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES, 4487 .features[FEAT_6_EAX] = 4488 CPUID_6_EAX_ARAT, 4489 .features[FEAT_7_1_EAX] = 4490 CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_CMPCCXADD | 4491 CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_AVX_IFMA, 4492 .features[FEAT_7_1_EDX] = 4493 CPUID_7_1_EDX_AVX_VNNI_INT8 | CPUID_7_1_EDX_AVX_NE_CONVERT, 4494 .features[FEAT_7_2_EDX] = 4495 CPUID_7_2_EDX_MCDT_NO, 4496 .features[FEAT_VMX_BASIC] = 4497 MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS, 4498 .features[FEAT_VMX_ENTRY_CTLS] = 4499 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE | 4500 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | 4501 VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER, 4502 .features[FEAT_VMX_EPT_VPID_CAPS] = 4503 MSR_VMX_EPT_EXECONLY | MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | 4504 MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB | 4505 MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS | 4506 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 4507 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 4508 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | 4509 MSR_VMX_EPT_INVVPID_ALL_CONTEXT | 4510 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS, 4511 .features[FEAT_VMX_EXIT_CTLS] = 4512 VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | 4513 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 4514 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT | 4515 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 4516 VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 4517 .features[FEAT_VMX_MISC] = 4518 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT | 4519 MSR_VMX_MISC_VMWRITE_VMEXIT, 4520 .features[FEAT_VMX_PINBASED_CTLS] = 4521 VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING | 4522 VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER | 4523 VMX_PIN_BASED_POSTED_INTR, 4524 .features[FEAT_VMX_PROCBASED_CTLS] = 4525 VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 4526 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 4527 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 4528 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 4529 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING | 4530 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 4531 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING | 4532 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING | 4533 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG | 4534 VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING | 4535 VMX_CPU_BASED_PAUSE_EXITING | 4536 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 4537 .features[FEAT_VMX_SECONDARY_CTLS] = 4538 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 4539 VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC | 4540 VMX_SECONDARY_EXEC_RDTSCP | 4541 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 4542 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING | 4543 VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST | 4544 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT | 4545 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY | 4546 VMX_SECONDARY_EXEC_RDRAND_EXITING | 4547 VMX_SECONDARY_EXEC_ENABLE_INVPCID | 4548 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS | 4549 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML | 4550 VMX_SECONDARY_EXEC_XSAVES, 4551 .features[FEAT_VMX_VMFUNC] = 4552 MSR_VMX_VMFUNC_EPT_SWITCHING, 4553 .xlevel = 0x80000008, 4554 .model_id = "Intel Xeon Processor (SierraForest)", 4555 .versions = (X86CPUVersionDefinition[]) { 4556 { .version = 1 }, 4557 { 4558 .version = 2, 4559 .props = (PropValue[]) { 4560 { "ss", "on" }, 4561 { "tsc-adjust", "on" }, 4562 { "cldemote", "on" }, 4563 { "movdiri", "on" }, 4564 { "movdir64b", "on" }, 4565 { "gds-no", "on" }, 4566 { "rfds-no", "on" }, 4567 { "lam", "on" }, 4568 { "intel-psfd", "on"}, 4569 { "ipred-ctrl", "on"}, 4570 { "rrsba-ctrl", "on"}, 4571 { "bhi-ctrl", "on"}, 4572 { "stepping", "3" }, 4573 { /* end of list */ } 4574 } 4575 }, 4576 { /* end of list */ }, 4577 }, 4578 }, 4579 { 4580 .name = "ClearwaterForest", 4581 .level = 0x23, 4582 .xlevel = 0x80000008, 4583 .vendor = CPUID_VENDOR_INTEL, 4584 .family = 6, 4585 .model = 221, 4586 .stepping = 0, 4587 /* 4588 * please keep the ascending order so that we can have a clear view of 4589 * bit position of each feature. 4590 */ 4591 .features[FEAT_1_EDX] = 4592 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC | 4593 CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | 4594 CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | 4595 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR | 4596 CPUID_SSE | CPUID_SSE2 | CPUID_SS, 4597 .features[FEAT_1_ECX] = 4598 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSSE3 | 4599 CPUID_EXT_FMA | CPUID_EXT_CX16 | CPUID_EXT_PCID | CPUID_EXT_SSE41 | 4600 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE | 4601 CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES | 4602 CPUID_EXT_XSAVE | CPUID_EXT_AVX | CPUID_EXT_F16C | CPUID_EXT_RDRAND, 4603 .features[FEAT_8000_0001_EDX] = 4604 CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB | 4605 CPUID_EXT2_RDTSCP | CPUID_EXT2_LM, 4606 .features[FEAT_8000_0001_ECX] = 4607 CPUID_EXT3_LAHF_LM | CPUID_EXT3_ABM | CPUID_EXT3_3DNOWPREFETCH, 4608 .features[FEAT_8000_0008_EBX] = 4609 CPUID_8000_0008_EBX_WBNOINVD, 4610 .features[FEAT_7_0_EBX] = 4611 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_TSC_ADJUST | 4612 CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_SMEP | 4613 CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_INVPCID | 4614 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | 4615 CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_CLWB | 4616 CPUID_7_0_EBX_SHA_NI, 4617 .features[FEAT_7_0_ECX] = 4618 CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | CPUID_7_0_ECX_GFNI | 4619 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ | 4620 CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_BUS_LOCK_DETECT | 4621 CPUID_7_0_ECX_CLDEMOTE | CPUID_7_0_ECX_MOVDIRI | 4622 CPUID_7_0_ECX_MOVDIR64B, 4623 .features[FEAT_7_0_EDX] = 4624 CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_SERIALIZE | 4625 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_ARCH_CAPABILITIES | 4626 CPUID_7_0_EDX_SPEC_CTRL_SSBD, 4627 .features[FEAT_ARCH_CAPABILITIES] = 4628 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_IBRS_ALL | 4629 MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | MSR_ARCH_CAP_MDS_NO | 4630 MSR_ARCH_CAP_PSCHANGE_MC_NO | MSR_ARCH_CAP_SBDR_SSDP_NO | 4631 MSR_ARCH_CAP_FBSDP_NO | MSR_ARCH_CAP_PSDP_NO | 4632 MSR_ARCH_CAP_BHI_NO | MSR_ARCH_CAP_PBRSB_NO | 4633 MSR_ARCH_CAP_GDS_NO | MSR_ARCH_CAP_RFDS_NO, 4634 .features[FEAT_XSAVE] = 4635 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 4636 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES, 4637 .features[FEAT_6_EAX] = 4638 CPUID_6_EAX_ARAT, 4639 .features[FEAT_7_1_EAX] = 4640 CPUID_7_1_EAX_SHA512 | CPUID_7_1_EAX_SM3 | CPUID_7_1_EAX_SM4 | 4641 CPUID_7_1_EAX_AVX_VNNI | CPUID_7_1_EAX_CMPCCXADD | 4642 CPUID_7_1_EAX_FSRS | CPUID_7_1_EAX_AVX_IFMA | 4643 CPUID_7_1_EAX_LAM, 4644 .features[FEAT_7_1_EDX] = 4645 CPUID_7_1_EDX_AVX_VNNI_INT8 | CPUID_7_1_EDX_AVX_NE_CONVERT | 4646 CPUID_7_1_EDX_AVX_VNNI_INT16 | CPUID_7_1_EDX_PREFETCHITI, 4647 .features[FEAT_7_2_EDX] = 4648 CPUID_7_2_EDX_PSFD | CPUID_7_2_EDX_IPRED_CTRL | 4649 CPUID_7_2_EDX_RRSBA_CTRL | CPUID_7_2_EDX_DDPD_U | 4650 CPUID_7_2_EDX_BHI_CTRL | CPUID_7_2_EDX_MCDT_NO, 4651 .features[FEAT_VMX_BASIC] = 4652 MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS, 4653 .features[FEAT_VMX_ENTRY_CTLS] = 4654 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE | 4655 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | 4656 VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER, 4657 .features[FEAT_VMX_EPT_VPID_CAPS] = 4658 MSR_VMX_EPT_EXECONLY | MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | 4659 MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB | 4660 MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS | 4661 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 4662 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 4663 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | 4664 MSR_VMX_EPT_INVVPID_ALL_CONTEXT | 4665 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS, 4666 .features[FEAT_VMX_EXIT_CTLS] = 4667 VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | 4668 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 4669 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT | 4670 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 4671 VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 4672 .features[FEAT_VMX_MISC] = 4673 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT | 4674 MSR_VMX_MISC_VMWRITE_VMEXIT, 4675 .features[FEAT_VMX_PINBASED_CTLS] = 4676 VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING | 4677 VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER | 4678 VMX_PIN_BASED_POSTED_INTR, 4679 .features[FEAT_VMX_PROCBASED_CTLS] = 4680 VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 4681 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 4682 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 4683 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 4684 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING | 4685 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 4686 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_VIRTUAL_NMI_PENDING | 4687 VMX_CPU_BASED_MOV_DR_EXITING | VMX_CPU_BASED_UNCOND_IO_EXITING | 4688 VMX_CPU_BASED_USE_IO_BITMAPS | VMX_CPU_BASED_MONITOR_TRAP_FLAG | 4689 VMX_CPU_BASED_USE_MSR_BITMAPS | VMX_CPU_BASED_MONITOR_EXITING | 4690 VMX_CPU_BASED_PAUSE_EXITING | 4691 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 4692 .features[FEAT_VMX_SECONDARY_CTLS] = 4693 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 4694 VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC | 4695 VMX_SECONDARY_EXEC_RDTSCP | 4696 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 4697 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_WBINVD_EXITING | 4698 VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST | 4699 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT | 4700 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY | 4701 VMX_SECONDARY_EXEC_RDRAND_EXITING | 4702 VMX_SECONDARY_EXEC_ENABLE_INVPCID | 4703 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS | 4704 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML | 4705 VMX_SECONDARY_EXEC_XSAVES, 4706 .features[FEAT_VMX_VMFUNC] = 4707 MSR_VMX_VMFUNC_EPT_SWITCHING, 4708 .model_id = "Intel Xeon Processor (ClearwaterForest)", 4709 .versions = (X86CPUVersionDefinition[]) { 4710 { .version = 1 }, 4711 { /* end of list */ }, 4712 }, 4713 }, 4714 { 4715 .name = "Denverton", 4716 .level = 21, 4717 .vendor = CPUID_VENDOR_INTEL, 4718 .family = 6, 4719 .model = 95, 4720 .stepping = 1, 4721 .features[FEAT_1_EDX] = 4722 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | CPUID_TSC | 4723 CPUID_MSR | CPUID_PAE | CPUID_MCE | CPUID_CX8 | CPUID_APIC | 4724 CPUID_SEP | CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | 4725 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | CPUID_MMX | CPUID_FXSR | 4726 CPUID_SSE | CPUID_SSE2, 4727 .features[FEAT_1_ECX] = 4728 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR | 4729 CPUID_EXT_SSSE3 | CPUID_EXT_CX16 | CPUID_EXT_SSE41 | 4730 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE | 4731 CPUID_EXT_POPCNT | CPUID_EXT_TSC_DEADLINE_TIMER | 4732 CPUID_EXT_AES | CPUID_EXT_XSAVE | CPUID_EXT_RDRAND, 4733 .features[FEAT_8000_0001_EDX] = 4734 CPUID_EXT2_SYSCALL | CPUID_EXT2_NX | CPUID_EXT2_PDPE1GB | 4735 CPUID_EXT2_RDTSCP | CPUID_EXT2_LM, 4736 .features[FEAT_8000_0001_ECX] = 4737 CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 4738 .features[FEAT_7_0_EBX] = 4739 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_ERMS | 4740 CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_SMAP | 4741 CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_SHA_NI, 4742 .features[FEAT_7_0_EDX] = 4743 CPUID_7_0_EDX_SPEC_CTRL | CPUID_7_0_EDX_ARCH_CAPABILITIES | 4744 CPUID_7_0_EDX_SPEC_CTRL_SSBD, 4745 /* XSAVES is added in version 3 */ 4746 .features[FEAT_XSAVE] = 4747 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | CPUID_XSAVE_XGETBV1, 4748 .features[FEAT_6_EAX] = 4749 CPUID_6_EAX_ARAT, 4750 .features[FEAT_ARCH_CAPABILITIES] = 4751 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY, 4752 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS | 4753 MSR_VMX_BASIC_TRUE_CTLS, 4754 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE | 4755 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT | 4756 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER, 4757 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY | 4758 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | 4759 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT | 4760 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 4761 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 4762 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT | 4763 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS, 4764 .features[FEAT_VMX_EXIT_CTLS] = 4765 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | 4766 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 4767 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER | 4768 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 4769 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 4770 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT | 4771 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT, 4772 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 4773 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS | 4774 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR, 4775 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 4776 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 4777 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 4778 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 4779 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 4780 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING | 4781 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 4782 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING | 4783 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS | 4784 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING | 4785 VMX_CPU_BASED_MONITOR_TRAP_FLAG | 4786 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 4787 .features[FEAT_VMX_SECONDARY_CTLS] = 4788 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 4789 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT | 4790 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP | 4791 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 4792 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST | 4793 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT | 4794 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY | 4795 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID | 4796 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS | 4797 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML, 4798 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING, 4799 .xlevel = 0x80000008, 4800 .model_id = "Intel Atom Processor (Denverton)", 4801 .versions = (X86CPUVersionDefinition[]) { 4802 { .version = 1 }, 4803 { 4804 .version = 2, 4805 .note = "no MPX, no MONITOR", 4806 .props = (PropValue[]) { 4807 { "monitor", "off" }, 4808 { "mpx", "off" }, 4809 { /* end of list */ }, 4810 }, 4811 }, 4812 { 4813 .version = 3, 4814 .note = "XSAVES, no MPX, no MONITOR", 4815 .props = (PropValue[]) { 4816 { "xsaves", "on" }, 4817 { "vmx-xsaves", "on" }, 4818 { /* end of list */ }, 4819 }, 4820 }, 4821 { /* end of list */ }, 4822 }, 4823 }, 4824 { 4825 .name = "Snowridge", 4826 .level = 27, 4827 .vendor = CPUID_VENDOR_INTEL, 4828 .family = 6, 4829 .model = 134, 4830 .stepping = 1, 4831 .features[FEAT_1_EDX] = 4832 /* missing: CPUID_PN CPUID_IA64 */ 4833 /* missing: CPUID_DTS, CPUID_HT, CPUID_TM, CPUID_PBE */ 4834 CPUID_FP87 | CPUID_VME | CPUID_DE | CPUID_PSE | 4835 CPUID_TSC | CPUID_MSR | CPUID_PAE | CPUID_MCE | 4836 CPUID_CX8 | CPUID_APIC | CPUID_SEP | 4837 CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | 4838 CPUID_PAT | CPUID_PSE36 | CPUID_CLFLUSH | 4839 CPUID_MMX | 4840 CPUID_FXSR | CPUID_SSE | CPUID_SSE2, 4841 .features[FEAT_1_ECX] = 4842 CPUID_EXT_SSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_MONITOR | 4843 CPUID_EXT_SSSE3 | 4844 CPUID_EXT_CX16 | 4845 CPUID_EXT_SSE41 | 4846 CPUID_EXT_SSE42 | CPUID_EXT_X2APIC | CPUID_EXT_MOVBE | 4847 CPUID_EXT_POPCNT | 4848 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_AES | CPUID_EXT_XSAVE | 4849 CPUID_EXT_RDRAND, 4850 .features[FEAT_8000_0001_EDX] = 4851 CPUID_EXT2_SYSCALL | 4852 CPUID_EXT2_NX | 4853 CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP | 4854 CPUID_EXT2_LM, 4855 .features[FEAT_8000_0001_ECX] = 4856 CPUID_EXT3_LAHF_LM | 4857 CPUID_EXT3_3DNOWPREFETCH, 4858 .features[FEAT_7_0_EBX] = 4859 CPUID_7_0_EBX_FSGSBASE | 4860 CPUID_7_0_EBX_SMEP | 4861 CPUID_7_0_EBX_ERMS | 4862 CPUID_7_0_EBX_MPX | /* missing bits 13, 15 */ 4863 CPUID_7_0_EBX_RDSEED | 4864 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT | 4865 CPUID_7_0_EBX_CLWB | 4866 CPUID_7_0_EBX_SHA_NI, 4867 .features[FEAT_7_0_ECX] = 4868 CPUID_7_0_ECX_UMIP | 4869 /* missing bit 5 */ 4870 CPUID_7_0_ECX_GFNI | 4871 CPUID_7_0_ECX_MOVDIRI | CPUID_7_0_ECX_CLDEMOTE | 4872 CPUID_7_0_ECX_MOVDIR64B, 4873 .features[FEAT_7_0_EDX] = 4874 CPUID_7_0_EDX_SPEC_CTRL | 4875 CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL_SSBD | 4876 CPUID_7_0_EDX_CORE_CAPABILITY, 4877 .features[FEAT_CORE_CAPABILITY] = 4878 MSR_CORE_CAP_SPLIT_LOCK_DETECT, 4879 /* XSAVES is added in version 3 */ 4880 .features[FEAT_XSAVE] = 4881 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 4882 CPUID_XSAVE_XGETBV1, 4883 .features[FEAT_6_EAX] = 4884 CPUID_6_EAX_ARAT, 4885 .features[FEAT_VMX_BASIC] = MSR_VMX_BASIC_INS_OUTS | 4886 MSR_VMX_BASIC_TRUE_CTLS, 4887 .features[FEAT_VMX_ENTRY_CTLS] = VMX_VM_ENTRY_IA32E_MODE | 4888 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | VMX_VM_ENTRY_LOAD_IA32_PAT | 4889 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_LOAD_IA32_EFER, 4890 .features[FEAT_VMX_EPT_VPID_CAPS] = MSR_VMX_EPT_EXECONLY | 4891 MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | 4892 MSR_VMX_EPT_1GB | MSR_VMX_EPT_INVEPT | 4893 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 4894 MSR_VMX_EPT_INVVPID | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 4895 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID_ALL_CONTEXT | 4896 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS | MSR_VMX_EPT_AD_BITS, 4897 .features[FEAT_VMX_EXIT_CTLS] = 4898 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | 4899 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 4900 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_LOAD_IA32_EFER | 4901 VMX_VM_EXIT_SAVE_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 4902 VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 4903 .features[FEAT_VMX_MISC] = MSR_VMX_MISC_ACTIVITY_HLT | 4904 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_VMWRITE_VMEXIT, 4905 .features[FEAT_VMX_PINBASED_CTLS] = VMX_PIN_BASED_EXT_INTR_MASK | 4906 VMX_PIN_BASED_NMI_EXITING | VMX_PIN_BASED_VIRTUAL_NMIS | 4907 VMX_PIN_BASED_VMX_PREEMPTION_TIMER | VMX_PIN_BASED_POSTED_INTR, 4908 .features[FEAT_VMX_PROCBASED_CTLS] = VMX_CPU_BASED_VIRTUAL_INTR_PENDING | 4909 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_HLT_EXITING | 4910 VMX_CPU_BASED_INVLPG_EXITING | VMX_CPU_BASED_MWAIT_EXITING | 4911 VMX_CPU_BASED_RDPMC_EXITING | VMX_CPU_BASED_RDTSC_EXITING | 4912 VMX_CPU_BASED_CR8_LOAD_EXITING | VMX_CPU_BASED_CR8_STORE_EXITING | 4913 VMX_CPU_BASED_TPR_SHADOW | VMX_CPU_BASED_MOV_DR_EXITING | 4914 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 4915 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING | 4916 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_USE_MSR_BITMAPS | 4917 VMX_CPU_BASED_CR3_LOAD_EXITING | VMX_CPU_BASED_CR3_STORE_EXITING | 4918 VMX_CPU_BASED_MONITOR_TRAP_FLAG | 4919 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 4920 .features[FEAT_VMX_SECONDARY_CTLS] = 4921 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 4922 VMX_SECONDARY_EXEC_WBINVD_EXITING | VMX_SECONDARY_EXEC_ENABLE_EPT | 4923 VMX_SECONDARY_EXEC_DESC | VMX_SECONDARY_EXEC_RDTSCP | 4924 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 4925 VMX_SECONDARY_EXEC_ENABLE_VPID | VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST | 4926 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT | 4927 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY | 4928 VMX_SECONDARY_EXEC_RDRAND_EXITING | VMX_SECONDARY_EXEC_ENABLE_INVPCID | 4929 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | VMX_SECONDARY_EXEC_SHADOW_VMCS | 4930 VMX_SECONDARY_EXEC_RDSEED_EXITING | VMX_SECONDARY_EXEC_ENABLE_PML, 4931 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING, 4932 .xlevel = 0x80000008, 4933 .model_id = "Intel Atom Processor (SnowRidge)", 4934 .versions = (X86CPUVersionDefinition[]) { 4935 { .version = 1 }, 4936 { 4937 .version = 2, 4938 .props = (PropValue[]) { 4939 { "mpx", "off" }, 4940 { "model-id", "Intel Atom Processor (Snowridge, no MPX)" }, 4941 { /* end of list */ }, 4942 }, 4943 }, 4944 { 4945 .version = 3, 4946 .note = "XSAVES, no MPX", 4947 .props = (PropValue[]) { 4948 { "xsaves", "on" }, 4949 { "vmx-xsaves", "on" }, 4950 { /* end of list */ }, 4951 }, 4952 }, 4953 { 4954 .version = 4, 4955 .note = "no split lock detect, no core-capability", 4956 .props = (PropValue[]) { 4957 { "split-lock-detect", "off" }, 4958 { "core-capability", "off" }, 4959 { /* end of list */ }, 4960 }, 4961 }, 4962 { /* end of list */ }, 4963 }, 4964 }, 4965 { 4966 .name = "KnightsMill", 4967 .level = 0xd, 4968 .vendor = CPUID_VENDOR_INTEL, 4969 .family = 6, 4970 .model = 133, 4971 .stepping = 0, 4972 .features[FEAT_1_EDX] = 4973 CPUID_VME | CPUID_SS | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | 4974 CPUID_MMX | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | 4975 CPUID_MCA | CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | 4976 CPUID_CX8 | CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | 4977 CPUID_PSE | CPUID_DE | CPUID_FP87, 4978 .features[FEAT_1_ECX] = 4979 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 4980 CPUID_EXT_POPCNT | CPUID_EXT_X2APIC | CPUID_EXT_SSE42 | 4981 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | 4982 CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 4983 CPUID_EXT_TSC_DEADLINE_TIMER | CPUID_EXT_FMA | CPUID_EXT_MOVBE | 4984 CPUID_EXT_F16C | CPUID_EXT_RDRAND, 4985 .features[FEAT_8000_0001_EDX] = 4986 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_RDTSCP | 4987 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 4988 .features[FEAT_8000_0001_ECX] = 4989 CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM | CPUID_EXT3_3DNOWPREFETCH, 4990 .features[FEAT_7_0_EBX] = 4991 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 | 4992 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | 4993 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_AVX512F | 4994 CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_AVX512PF | 4995 CPUID_7_0_EBX_AVX512ER, 4996 .features[FEAT_7_0_ECX] = 4997 CPUID_7_0_ECX_AVX512_VPOPCNTDQ, 4998 .features[FEAT_7_0_EDX] = 4999 CPUID_7_0_EDX_AVX512_4VNNIW | CPUID_7_0_EDX_AVX512_4FMAPS, 5000 .features[FEAT_XSAVE] = 5001 CPUID_XSAVE_XSAVEOPT, 5002 .features[FEAT_6_EAX] = 5003 CPUID_6_EAX_ARAT, 5004 .xlevel = 0x80000008, 5005 .model_id = "Intel Xeon Phi Processor (Knights Mill)", 5006 }, 5007 { 5008 .name = "Opteron_G1", 5009 .level = 5, 5010 .vendor = CPUID_VENDOR_AMD, 5011 .family = 15, 5012 .model = 6, 5013 .stepping = 1, 5014 .features[FEAT_1_EDX] = 5015 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 5016 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 5017 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 5018 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 5019 CPUID_DE | CPUID_FP87, 5020 .features[FEAT_1_ECX] = 5021 CPUID_EXT_SSE3, 5022 .features[FEAT_8000_0001_EDX] = 5023 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 5024 .xlevel = 0x80000008, 5025 .model_id = "AMD Opteron 240 (Gen 1 Class Opteron)", 5026 }, 5027 { 5028 .name = "Opteron_G2", 5029 .level = 5, 5030 .vendor = CPUID_VENDOR_AMD, 5031 .family = 15, 5032 .model = 6, 5033 .stepping = 1, 5034 .features[FEAT_1_EDX] = 5035 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 5036 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 5037 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 5038 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 5039 CPUID_DE | CPUID_FP87, 5040 .features[FEAT_1_ECX] = 5041 CPUID_EXT_CX16 | CPUID_EXT_SSE3, 5042 .features[FEAT_8000_0001_EDX] = 5043 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 5044 .features[FEAT_8000_0001_ECX] = 5045 CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM, 5046 .xlevel = 0x80000008, 5047 .model_id = "AMD Opteron 22xx (Gen 2 Class Opteron)", 5048 }, 5049 { 5050 .name = "Opteron_G3", 5051 .level = 5, 5052 .vendor = CPUID_VENDOR_AMD, 5053 .family = 16, 5054 .model = 2, 5055 .stepping = 3, 5056 .features[FEAT_1_EDX] = 5057 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 5058 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 5059 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 5060 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 5061 CPUID_DE | CPUID_FP87, 5062 .features[FEAT_1_ECX] = 5063 CPUID_EXT_POPCNT | CPUID_EXT_CX16 | CPUID_EXT_MONITOR | 5064 CPUID_EXT_SSE3, 5065 .features[FEAT_8000_0001_EDX] = 5066 CPUID_EXT2_LM | CPUID_EXT2_NX | CPUID_EXT2_SYSCALL | 5067 CPUID_EXT2_RDTSCP, 5068 .features[FEAT_8000_0001_ECX] = 5069 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | 5070 CPUID_EXT3_ABM | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM, 5071 .xlevel = 0x80000008, 5072 .model_id = "AMD Opteron 23xx (Gen 3 Class Opteron)", 5073 }, 5074 { 5075 .name = "Opteron_G4", 5076 .level = 0xd, 5077 .vendor = CPUID_VENDOR_AMD, 5078 .family = 21, 5079 .model = 1, 5080 .stepping = 2, 5081 .features[FEAT_1_EDX] = 5082 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 5083 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 5084 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 5085 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 5086 CPUID_DE | CPUID_FP87, 5087 .features[FEAT_1_ECX] = 5088 CPUID_EXT_AVX | CPUID_EXT_XSAVE | CPUID_EXT_AES | 5089 CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 5090 CPUID_EXT_CX16 | CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | 5091 CPUID_EXT_SSE3, 5092 .features[FEAT_8000_0001_EDX] = 5093 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX | 5094 CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP, 5095 .features[FEAT_8000_0001_ECX] = 5096 CPUID_EXT3_FMA4 | CPUID_EXT3_XOP | 5097 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE | 5098 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM | 5099 CPUID_EXT3_LAHF_LM, 5100 .features[FEAT_SVM] = 5101 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE, 5102 /* no xsaveopt! */ 5103 .xlevel = 0x8000001A, 5104 .model_id = "AMD Opteron 62xx class CPU", 5105 }, 5106 { 5107 .name = "Opteron_G5", 5108 .level = 0xd, 5109 .vendor = CPUID_VENDOR_AMD, 5110 .family = 21, 5111 .model = 2, 5112 .stepping = 0, 5113 .features[FEAT_1_EDX] = 5114 CPUID_VME | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 5115 CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | 5116 CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | 5117 CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | 5118 CPUID_DE | CPUID_FP87, 5119 .features[FEAT_1_ECX] = 5120 CPUID_EXT_F16C | CPUID_EXT_AVX | CPUID_EXT_XSAVE | 5121 CPUID_EXT_AES | CPUID_EXT_POPCNT | CPUID_EXT_SSE42 | 5122 CPUID_EXT_SSE41 | CPUID_EXT_CX16 | CPUID_EXT_FMA | 5123 CPUID_EXT_SSSE3 | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3, 5124 .features[FEAT_8000_0001_EDX] = 5125 CPUID_EXT2_LM | CPUID_EXT2_PDPE1GB | CPUID_EXT2_NX | 5126 CPUID_EXT2_SYSCALL | CPUID_EXT2_RDTSCP, 5127 .features[FEAT_8000_0001_ECX] = 5128 CPUID_EXT3_TBM | CPUID_EXT3_FMA4 | CPUID_EXT3_XOP | 5129 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_MISALIGNSSE | 5130 CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | CPUID_EXT3_SVM | 5131 CPUID_EXT3_LAHF_LM, 5132 .features[FEAT_SVM] = 5133 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE, 5134 /* no xsaveopt! */ 5135 .xlevel = 0x8000001A, 5136 .model_id = "AMD Opteron 63xx class CPU", 5137 }, 5138 { 5139 .name = "EPYC", 5140 .level = 0xd, 5141 .vendor = CPUID_VENDOR_AMD, 5142 .family = 23, 5143 .model = 1, 5144 .stepping = 2, 5145 .features[FEAT_1_EDX] = 5146 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH | 5147 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE | 5148 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE | 5149 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE | 5150 CPUID_VME | CPUID_FP87, 5151 .features[FEAT_1_ECX] = 5152 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX | 5153 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT | 5154 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 5155 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 | 5156 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3, 5157 .features[FEAT_8000_0001_EDX] = 5158 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB | 5159 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX | 5160 CPUID_EXT2_SYSCALL, 5161 .features[FEAT_8000_0001_ECX] = 5162 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH | 5163 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | 5164 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM | 5165 CPUID_EXT3_TOPOEXT, 5166 .features[FEAT_7_0_EBX] = 5167 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 | 5168 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED | 5169 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT | 5170 CPUID_7_0_EBX_SHA_NI, 5171 .features[FEAT_XSAVE] = 5172 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 5173 CPUID_XSAVE_XGETBV1, 5174 .features[FEAT_6_EAX] = 5175 CPUID_6_EAX_ARAT, 5176 .features[FEAT_SVM] = 5177 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE, 5178 .xlevel = 0x8000001E, 5179 .model_id = "AMD EPYC Processor", 5180 .cache_info = &epyc_cache_info, 5181 .versions = (X86CPUVersionDefinition[]) { 5182 { .version = 1 }, 5183 { 5184 .version = 2, 5185 .alias = "EPYC-IBPB", 5186 .props = (PropValue[]) { 5187 { "ibpb", "on" }, 5188 { "model-id", 5189 "AMD EPYC Processor (with IBPB)" }, 5190 { /* end of list */ } 5191 } 5192 }, 5193 { 5194 .version = 3, 5195 .props = (PropValue[]) { 5196 { "ibpb", "on" }, 5197 { "perfctr-core", "on" }, 5198 { "clzero", "on" }, 5199 { "xsaveerptr", "on" }, 5200 { "xsaves", "on" }, 5201 { "model-id", 5202 "AMD EPYC Processor" }, 5203 { /* end of list */ } 5204 } 5205 }, 5206 { 5207 .version = 4, 5208 .props = (PropValue[]) { 5209 { "model-id", 5210 "AMD EPYC-v4 Processor" }, 5211 { /* end of list */ } 5212 }, 5213 .cache_info = &epyc_v4_cache_info 5214 }, 5215 { /* end of list */ } 5216 } 5217 }, 5218 { 5219 .name = "Dhyana", 5220 .level = 0xd, 5221 .vendor = CPUID_VENDOR_HYGON, 5222 .family = 24, 5223 .model = 0, 5224 .stepping = 1, 5225 .features[FEAT_1_EDX] = 5226 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH | 5227 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE | 5228 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE | 5229 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE | 5230 CPUID_VME | CPUID_FP87, 5231 .features[FEAT_1_ECX] = 5232 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX | 5233 CPUID_EXT_XSAVE | CPUID_EXT_POPCNT | 5234 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 5235 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 | 5236 CPUID_EXT_MONITOR | CPUID_EXT_SSE3, 5237 .features[FEAT_8000_0001_EDX] = 5238 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB | 5239 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX | 5240 CPUID_EXT2_SYSCALL, 5241 .features[FEAT_8000_0001_ECX] = 5242 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH | 5243 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | 5244 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM | 5245 CPUID_EXT3_TOPOEXT, 5246 .features[FEAT_8000_0008_EBX] = 5247 CPUID_8000_0008_EBX_IBPB, 5248 .features[FEAT_7_0_EBX] = 5249 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 | 5250 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED | 5251 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT, 5252 /* XSAVES is added in version 2 */ 5253 .features[FEAT_XSAVE] = 5254 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 5255 CPUID_XSAVE_XGETBV1, 5256 .features[FEAT_6_EAX] = 5257 CPUID_6_EAX_ARAT, 5258 .features[FEAT_SVM] = 5259 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE, 5260 .xlevel = 0x8000001E, 5261 .model_id = "Hygon Dhyana Processor", 5262 .cache_info = &epyc_cache_info, 5263 .versions = (X86CPUVersionDefinition[]) { 5264 { .version = 1 }, 5265 { .version = 2, 5266 .note = "XSAVES", 5267 .props = (PropValue[]) { 5268 { "xsaves", "on" }, 5269 { /* end of list */ } 5270 }, 5271 }, 5272 { /* end of list */ } 5273 } 5274 }, 5275 { 5276 .name = "EPYC-Rome", 5277 .level = 0xd, 5278 .vendor = CPUID_VENDOR_AMD, 5279 .family = 23, 5280 .model = 49, 5281 .stepping = 0, 5282 .features[FEAT_1_EDX] = 5283 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH | 5284 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE | 5285 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE | 5286 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE | 5287 CPUID_VME | CPUID_FP87, 5288 .features[FEAT_1_ECX] = 5289 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX | 5290 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT | 5291 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 5292 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 | 5293 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3, 5294 .features[FEAT_8000_0001_EDX] = 5295 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB | 5296 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX | 5297 CPUID_EXT2_SYSCALL, 5298 .features[FEAT_8000_0001_ECX] = 5299 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH | 5300 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | 5301 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM | 5302 CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE, 5303 .features[FEAT_8000_0008_EBX] = 5304 CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR | 5305 CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB | 5306 CPUID_8000_0008_EBX_STIBP, 5307 .features[FEAT_7_0_EBX] = 5308 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 | 5309 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED | 5310 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT | 5311 CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_CLWB, 5312 .features[FEAT_7_0_ECX] = 5313 CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_RDPID, 5314 .features[FEAT_XSAVE] = 5315 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 5316 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES, 5317 .features[FEAT_6_EAX] = 5318 CPUID_6_EAX_ARAT, 5319 .features[FEAT_SVM] = 5320 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE, 5321 .xlevel = 0x8000001E, 5322 .model_id = "AMD EPYC-Rome Processor", 5323 .cache_info = &epyc_rome_cache_info, 5324 .versions = (X86CPUVersionDefinition[]) { 5325 { .version = 1 }, 5326 { 5327 .version = 2, 5328 .props = (PropValue[]) { 5329 { "ibrs", "on" }, 5330 { "amd-ssbd", "on" }, 5331 { /* end of list */ } 5332 } 5333 }, 5334 { 5335 .version = 3, 5336 .props = (PropValue[]) { 5337 { "model-id", 5338 "AMD EPYC-Rome-v3 Processor" }, 5339 { /* end of list */ } 5340 }, 5341 .cache_info = &epyc_rome_v3_cache_info 5342 }, 5343 { 5344 .version = 4, 5345 .props = (PropValue[]) { 5346 /* Erratum 1386 */ 5347 { "model-id", 5348 "AMD EPYC-Rome-v4 Processor (no XSAVES)" }, 5349 { "xsaves", "off" }, 5350 { /* end of list */ } 5351 }, 5352 }, 5353 { /* end of list */ } 5354 } 5355 }, 5356 { 5357 .name = "EPYC-Milan", 5358 .level = 0xd, 5359 .vendor = CPUID_VENDOR_AMD, 5360 .family = 25, 5361 .model = 1, 5362 .stepping = 1, 5363 .features[FEAT_1_EDX] = 5364 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH | 5365 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE | 5366 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE | 5367 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE | 5368 CPUID_VME | CPUID_FP87, 5369 .features[FEAT_1_ECX] = 5370 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX | 5371 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT | 5372 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 5373 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 | 5374 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3 | 5375 CPUID_EXT_PCID, 5376 .features[FEAT_8000_0001_EDX] = 5377 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB | 5378 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX | 5379 CPUID_EXT2_SYSCALL, 5380 .features[FEAT_8000_0001_ECX] = 5381 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH | 5382 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | 5383 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM | 5384 CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE, 5385 .features[FEAT_8000_0008_EBX] = 5386 CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR | 5387 CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB | 5388 CPUID_8000_0008_EBX_IBRS | CPUID_8000_0008_EBX_STIBP | 5389 CPUID_8000_0008_EBX_AMD_SSBD, 5390 .features[FEAT_7_0_EBX] = 5391 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 | 5392 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_RDSEED | 5393 CPUID_7_0_EBX_ADX | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_CLFLUSHOPT | 5394 CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_ERMS | 5395 CPUID_7_0_EBX_INVPCID, 5396 .features[FEAT_7_0_ECX] = 5397 CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_PKU, 5398 .features[FEAT_7_0_EDX] = 5399 CPUID_7_0_EDX_FSRM, 5400 .features[FEAT_XSAVE] = 5401 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 5402 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES, 5403 .features[FEAT_6_EAX] = 5404 CPUID_6_EAX_ARAT, 5405 .features[FEAT_SVM] = 5406 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE | CPUID_SVM_SVME_ADDR_CHK, 5407 .xlevel = 0x8000001E, 5408 .model_id = "AMD EPYC-Milan Processor", 5409 .cache_info = &epyc_milan_cache_info, 5410 .versions = (X86CPUVersionDefinition[]) { 5411 { .version = 1 }, 5412 { 5413 .version = 2, 5414 .props = (PropValue[]) { 5415 { "model-id", 5416 "AMD EPYC-Milan-v2 Processor" }, 5417 { "vaes", "on" }, 5418 { "vpclmulqdq", "on" }, 5419 { "stibp-always-on", "on" }, 5420 { "amd-psfd", "on" }, 5421 { "no-nested-data-bp", "on" }, 5422 { "lfence-always-serializing", "on" }, 5423 { "null-sel-clr-base", "on" }, 5424 { /* end of list */ } 5425 }, 5426 .cache_info = &epyc_milan_v2_cache_info 5427 }, 5428 { /* end of list */ } 5429 } 5430 }, 5431 { 5432 .name = "EPYC-Genoa", 5433 .level = 0xd, 5434 .vendor = CPUID_VENDOR_AMD, 5435 .family = 25, 5436 .model = 17, 5437 .stepping = 0, 5438 .features[FEAT_1_EDX] = 5439 CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | CPUID_CLFLUSH | 5440 CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | CPUID_MCA | CPUID_PGE | 5441 CPUID_MTRR | CPUID_SEP | CPUID_APIC | CPUID_CX8 | CPUID_MCE | 5442 CPUID_PAE | CPUID_MSR | CPUID_TSC | CPUID_PSE | CPUID_DE | 5443 CPUID_VME | CPUID_FP87, 5444 .features[FEAT_1_ECX] = 5445 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX | 5446 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_POPCNT | 5447 CPUID_EXT_MOVBE | CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | 5448 CPUID_EXT_PCID | CPUID_EXT_CX16 | CPUID_EXT_FMA | 5449 CPUID_EXT_SSSE3 | CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | 5450 CPUID_EXT_SSE3, 5451 .features[FEAT_8000_0001_EDX] = 5452 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB | 5453 CPUID_EXT2_FFXSR | CPUID_EXT2_MMXEXT | CPUID_EXT2_NX | 5454 CPUID_EXT2_SYSCALL, 5455 .features[FEAT_8000_0001_ECX] = 5456 CPUID_EXT3_OSVW | CPUID_EXT3_3DNOWPREFETCH | 5457 CPUID_EXT3_MISALIGNSSE | CPUID_EXT3_SSE4A | CPUID_EXT3_ABM | 5458 CPUID_EXT3_CR8LEG | CPUID_EXT3_SVM | CPUID_EXT3_LAHF_LM | 5459 CPUID_EXT3_TOPOEXT | CPUID_EXT3_PERFCORE, 5460 .features[FEAT_8000_0008_EBX] = 5461 CPUID_8000_0008_EBX_CLZERO | CPUID_8000_0008_EBX_XSAVEERPTR | 5462 CPUID_8000_0008_EBX_WBNOINVD | CPUID_8000_0008_EBX_IBPB | 5463 CPUID_8000_0008_EBX_IBRS | CPUID_8000_0008_EBX_STIBP | 5464 CPUID_8000_0008_EBX_STIBP_ALWAYS_ON | 5465 CPUID_8000_0008_EBX_AMD_SSBD | CPUID_8000_0008_EBX_AMD_PSFD, 5466 .features[FEAT_8000_0021_EAX] = 5467 CPUID_8000_0021_EAX_NO_NESTED_DATA_BP | 5468 CPUID_8000_0021_EAX_LFENCE_ALWAYS_SERIALIZING | 5469 CPUID_8000_0021_EAX_NULL_SEL_CLR_BASE | 5470 CPUID_8000_0021_EAX_AUTO_IBRS, 5471 .features[FEAT_7_0_EBX] = 5472 CPUID_7_0_EBX_FSGSBASE | CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_AVX2 | 5473 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ERMS | 5474 CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_AVX512F | 5475 CPUID_7_0_EBX_AVX512DQ | CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_ADX | 5476 CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_AVX512IFMA | 5477 CPUID_7_0_EBX_CLFLUSHOPT | CPUID_7_0_EBX_CLWB | 5478 CPUID_7_0_EBX_AVX512CD | CPUID_7_0_EBX_SHA_NI | 5479 CPUID_7_0_EBX_AVX512BW | CPUID_7_0_EBX_AVX512VL, 5480 .features[FEAT_7_0_ECX] = 5481 CPUID_7_0_ECX_AVX512_VBMI | CPUID_7_0_ECX_UMIP | CPUID_7_0_ECX_PKU | 5482 CPUID_7_0_ECX_AVX512_VBMI2 | CPUID_7_0_ECX_GFNI | 5483 CPUID_7_0_ECX_VAES | CPUID_7_0_ECX_VPCLMULQDQ | 5484 CPUID_7_0_ECX_AVX512VNNI | CPUID_7_0_ECX_AVX512BITALG | 5485 CPUID_7_0_ECX_AVX512_VPOPCNTDQ | CPUID_7_0_ECX_LA57 | 5486 CPUID_7_0_ECX_RDPID, 5487 .features[FEAT_7_0_EDX] = 5488 CPUID_7_0_EDX_FSRM, 5489 .features[FEAT_7_1_EAX] = 5490 CPUID_7_1_EAX_AVX512_BF16, 5491 .features[FEAT_XSAVE] = 5492 CPUID_XSAVE_XSAVEOPT | CPUID_XSAVE_XSAVEC | 5493 CPUID_XSAVE_XGETBV1 | CPUID_XSAVE_XSAVES, 5494 .features[FEAT_6_EAX] = 5495 CPUID_6_EAX_ARAT, 5496 .features[FEAT_SVM] = 5497 CPUID_SVM_NPT | CPUID_SVM_NRIPSAVE | CPUID_SVM_VNMI | 5498 CPUID_SVM_SVME_ADDR_CHK, 5499 .xlevel = 0x80000022, 5500 .model_id = "AMD EPYC-Genoa Processor", 5501 .cache_info = &epyc_genoa_cache_info, 5502 }, 5503 { 5504 .name = "YongFeng", 5505 .level = 0x1F, 5506 .vendor = CPUID_VENDOR_ZHAOXIN1, 5507 .family = 7, 5508 .model = 11, 5509 .stepping = 3, 5510 /* missing: CPUID_HT, CPUID_TM, CPUID_PBE */ 5511 .features[FEAT_1_EDX] = 5512 CPUID_SS | CPUID_SSE2 | CPUID_SSE | CPUID_FXSR | CPUID_MMX | 5513 CPUID_ACPI | CPUID_CLFLUSH | CPUID_PSE36 | CPUID_PAT | CPUID_CMOV | 5514 CPUID_MCA | CPUID_PGE | CPUID_MTRR | CPUID_SEP | CPUID_APIC | 5515 CPUID_CX8 | CPUID_MCE | CPUID_PAE | CPUID_MSR | CPUID_TSC | 5516 CPUID_PSE | CPUID_DE | CPUID_VME | CPUID_FP87, 5517 /* 5518 * missing: CPUID_EXT_OSXSAVE, CPUID_EXT_XTPR, CPUID_EXT_TM2, 5519 * CPUID_EXT_EST, CPUID_EXT_SMX, CPUID_EXT_VMX 5520 */ 5521 .features[FEAT_1_ECX] = 5522 CPUID_EXT_RDRAND | CPUID_EXT_F16C | CPUID_EXT_AVX | 5523 CPUID_EXT_XSAVE | CPUID_EXT_AES | CPUID_EXT_TSC_DEADLINE_TIMER | 5524 CPUID_EXT_POPCNT | CPUID_EXT_MOVBE | CPUID_EXT_X2APIC | 5525 CPUID_EXT_SSE42 | CPUID_EXT_SSE41 | CPUID_EXT_PCID | 5526 CPUID_EXT_CX16 | CPUID_EXT_FMA | CPUID_EXT_SSSE3 | 5527 CPUID_EXT_MONITOR | CPUID_EXT_PCLMULQDQ | CPUID_EXT_SSE3, 5528 .features[FEAT_7_0_EBX] = 5529 CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_SMAP | CPUID_7_0_EBX_ADX | 5530 CPUID_7_0_EBX_RDSEED | CPUID_7_0_EBX_INVPCID | CPUID_7_0_EBX_BMI2 | 5531 CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_BMI1 | 5532 CPUID_7_0_EBX_FSGSBASE, 5533 /* missing: CPUID_7_0_ECX_OSPKE */ 5534 .features[FEAT_7_0_ECX] = 5535 CPUID_7_0_ECX_RDPID | CPUID_7_0_ECX_PKU | CPUID_7_0_ECX_UMIP, 5536 .features[FEAT_7_0_EDX] = 5537 CPUID_7_0_EDX_ARCH_CAPABILITIES | CPUID_7_0_EDX_SPEC_CTRL, 5538 .features[FEAT_8000_0001_EDX] = 5539 CPUID_EXT2_LM | CPUID_EXT2_RDTSCP | CPUID_EXT2_PDPE1GB | 5540 CPUID_EXT2_NX | CPUID_EXT2_SYSCALL, 5541 .features[FEAT_8000_0001_ECX] = 5542 CPUID_EXT3_3DNOWPREFETCH | CPUID_EXT3_ABM | CPUID_EXT3_LAHF_LM, 5543 .features[FEAT_8000_0007_EDX] = CPUID_APM_INVTSC, 5544 /* 5545 * TODO: When the Linux kernel introduces other existing definitions 5546 * for this leaf, remember to update the definitions here. 5547 */ 5548 .features[FEAT_C000_0001_EDX] = 5549 CPUID_C000_0001_EDX_PMM_EN | CPUID_C000_0001_EDX_PMM | 5550 CPUID_C000_0001_EDX_PHE_EN | CPUID_C000_0001_EDX_PHE | 5551 CPUID_C000_0001_EDX_ACE2 | 5552 CPUID_C000_0001_EDX_XCRYPT_EN | CPUID_C000_0001_EDX_XCRYPT | 5553 CPUID_C000_0001_EDX_XSTORE_EN | CPUID_C000_0001_EDX_XSTORE, 5554 .features[FEAT_XSAVE] = 5555 CPUID_XSAVE_XSAVEOPT, 5556 .features[FEAT_ARCH_CAPABILITIES] = 5557 MSR_ARCH_CAP_RDCL_NO | MSR_ARCH_CAP_SKIP_L1DFL_VMENTRY | 5558 MSR_ARCH_CAP_MDS_NO | MSR_ARCH_CAP_PSCHANGE_MC_NO | 5559 MSR_ARCH_CAP_SSB_NO, 5560 .features[FEAT_VMX_PROCBASED_CTLS] = 5561 VMX_CPU_BASED_VIRTUAL_INTR_PENDING | VMX_CPU_BASED_HLT_EXITING | 5562 VMX_CPU_BASED_USE_TSC_OFFSETING | VMX_CPU_BASED_INVLPG_EXITING | 5563 VMX_CPU_BASED_MWAIT_EXITING | VMX_CPU_BASED_RDPMC_EXITING | 5564 VMX_CPU_BASED_RDTSC_EXITING | VMX_CPU_BASED_CR3_LOAD_EXITING | 5565 VMX_CPU_BASED_CR3_STORE_EXITING | VMX_CPU_BASED_CR8_LOAD_EXITING | 5566 VMX_CPU_BASED_CR8_STORE_EXITING | VMX_CPU_BASED_TPR_SHADOW | 5567 VMX_CPU_BASED_VIRTUAL_NMI_PENDING | VMX_CPU_BASED_MOV_DR_EXITING | 5568 VMX_CPU_BASED_UNCOND_IO_EXITING | VMX_CPU_BASED_USE_IO_BITMAPS | 5569 VMX_CPU_BASED_MONITOR_TRAP_FLAG | VMX_CPU_BASED_USE_MSR_BITMAPS | 5570 VMX_CPU_BASED_MONITOR_EXITING | VMX_CPU_BASED_PAUSE_EXITING | 5571 VMX_CPU_BASED_ACTIVATE_SECONDARY_CONTROLS, 5572 /* 5573 * missing: VMX_SECONDARY_EXEC_PAUSE_LOOP_EXITING, 5574 * VMX_SECONDARY_EXEC_TSC_SCALING 5575 */ 5576 .features[FEAT_VMX_SECONDARY_CTLS] = 5577 VMX_SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 5578 VMX_SECONDARY_EXEC_ENABLE_EPT | VMX_SECONDARY_EXEC_DESC | 5579 VMX_SECONDARY_EXEC_RDTSCP | VMX_SECONDARY_EXEC_ENABLE_VPID | 5580 VMX_SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE | 5581 VMX_SECONDARY_EXEC_WBINVD_EXITING | 5582 VMX_SECONDARY_EXEC_UNRESTRICTED_GUEST | 5583 VMX_SECONDARY_EXEC_APIC_REGISTER_VIRT | 5584 VMX_SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY | 5585 VMX_SECONDARY_EXEC_RDRAND_EXITING | 5586 VMX_SECONDARY_EXEC_ENABLE_INVPCID | 5587 VMX_SECONDARY_EXEC_ENABLE_VMFUNC | 5588 VMX_SECONDARY_EXEC_SHADOW_VMCS | 5589 VMX_SECONDARY_EXEC_ENABLE_PML, 5590 .features[FEAT_VMX_PINBASED_CTLS] = 5591 VMX_PIN_BASED_EXT_INTR_MASK | VMX_PIN_BASED_NMI_EXITING | 5592 VMX_PIN_BASED_VIRTUAL_NMIS | VMX_PIN_BASED_VMX_PREEMPTION_TIMER | 5593 VMX_PIN_BASED_POSTED_INTR, 5594 .features[FEAT_VMX_EXIT_CTLS] = 5595 VMX_VM_EXIT_SAVE_DEBUG_CONTROLS | VMX_VM_EXIT_HOST_ADDR_SPACE_SIZE | 5596 VMX_VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | 5597 VMX_VM_EXIT_ACK_INTR_ON_EXIT | VMX_VM_EXIT_SAVE_IA32_PAT | 5598 VMX_VM_EXIT_LOAD_IA32_PAT | VMX_VM_EXIT_SAVE_IA32_EFER | 5599 VMX_VM_EXIT_LOAD_IA32_EFER | VMX_VM_EXIT_SAVE_VMX_PREEMPTION_TIMER, 5600 /* missing: VMX_VM_ENTRY_SMM, VMX_VM_ENTRY_DEACT_DUAL_MONITOR */ 5601 .features[FEAT_VMX_ENTRY_CTLS] = 5602 VMX_VM_ENTRY_LOAD_DEBUG_CONTROLS | VMX_VM_ENTRY_IA32E_MODE | 5603 VMX_VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL | 5604 VMX_VM_ENTRY_LOAD_IA32_PAT | VMX_VM_ENTRY_LOAD_IA32_EFER, 5605 /* 5606 * missing: MSR_VMX_MISC_ACTIVITY_SHUTDOWN, 5607 * MSR_VMX_MISC_ACTIVITY_WAIT_SIPI 5608 */ 5609 .features[FEAT_VMX_MISC] = 5610 MSR_VMX_MISC_STORE_LMA | MSR_VMX_MISC_ACTIVITY_HLT | 5611 MSR_VMX_MISC_VMWRITE_VMEXIT, 5612 /* missing: MSR_VMX_EPT_UC */ 5613 .features[FEAT_VMX_EPT_VPID_CAPS] = 5614 MSR_VMX_EPT_EXECONLY | MSR_VMX_EPT_PAGE_WALK_LENGTH_4 | 5615 MSR_VMX_EPT_WB | MSR_VMX_EPT_2MB | MSR_VMX_EPT_1GB | 5616 MSR_VMX_EPT_INVEPT | MSR_VMX_EPT_AD_BITS | 5617 MSR_VMX_EPT_INVEPT_SINGLE_CONTEXT | MSR_VMX_EPT_INVEPT_ALL_CONTEXT | 5618 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT | MSR_VMX_EPT_INVVPID | 5619 MSR_VMX_EPT_INVVPID_ALL_CONTEXT | MSR_VMX_EPT_INVVPID_SINGLE_ADDR | 5620 MSR_VMX_EPT_INVVPID_SINGLE_CONTEXT_NOGLOBALS, 5621 .features[FEAT_VMX_BASIC] = 5622 MSR_VMX_BASIC_INS_OUTS | MSR_VMX_BASIC_TRUE_CTLS, 5623 .features[FEAT_VMX_VMFUNC] = MSR_VMX_VMFUNC_EPT_SWITCHING, 5624 .xlevel = 0x80000008, 5625 .model_id = "Zhaoxin YongFeng Processor", 5626 .versions = (X86CPUVersionDefinition[]) { 5627 { .version = 1 }, 5628 { 5629 .version = 2, 5630 .note = "with the correct model number", 5631 .props = (PropValue[]) { 5632 { "model", "0x5b" }, 5633 { /* end of list */ } 5634 } 5635 }, 5636 { /* end of list */ } 5637 } 5638 }, 5639 }; 5640 5641 /* 5642 * We resolve CPU model aliases using -v1 when using "-machine 5643 * none", but this is just for compatibility while libvirt isn't 5644 * adapted to resolve CPU model versions before creating VMs. 5645 * See "Runnability guarantee of CPU models" at 5646 * docs/about/deprecated.rst. 5647 */ 5648 X86CPUVersion default_cpu_version = 1; 5649 5650 void x86_cpu_set_default_version(X86CPUVersion version) 5651 { 5652 /* Translating CPU_VERSION_AUTO to CPU_VERSION_AUTO doesn't make sense */ 5653 assert(version != CPU_VERSION_AUTO); 5654 default_cpu_version = version; 5655 } 5656 5657 static X86CPUVersion x86_cpu_model_last_version(const X86CPUModel *model) 5658 { 5659 int v = 0; 5660 const X86CPUVersionDefinition *vdef = 5661 x86_cpu_def_get_versions(model->cpudef); 5662 while (vdef->version) { 5663 v = vdef->version; 5664 vdef++; 5665 } 5666 return v; 5667 } 5668 5669 /* Return the actual version being used for a specific CPU model */ 5670 static X86CPUVersion x86_cpu_model_resolve_version(const X86CPUModel *model) 5671 { 5672 X86CPUVersion v = model->version; 5673 if (v == CPU_VERSION_AUTO) { 5674 v = default_cpu_version; 5675 } 5676 if (v == CPU_VERSION_LATEST) { 5677 return x86_cpu_model_last_version(model); 5678 } 5679 return v; 5680 } 5681 5682 static const Property max_x86_cpu_properties[] = { 5683 DEFINE_PROP_BOOL("migratable", X86CPU, migratable, true), 5684 DEFINE_PROP_BOOL("host-cache-info", X86CPU, cache_info_passthrough, false), 5685 }; 5686 5687 static void max_x86_cpu_realize(DeviceState *dev, Error **errp) 5688 { 5689 Object *obj = OBJECT(dev); 5690 5691 if (!object_property_get_int(obj, "family", &error_abort)) { 5692 if (X86_CPU(obj)->env.features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) { 5693 object_property_set_int(obj, "family", 15, &error_abort); 5694 object_property_set_int(obj, "model", 107, &error_abort); 5695 object_property_set_int(obj, "stepping", 1, &error_abort); 5696 } else { 5697 object_property_set_int(obj, "family", 6, &error_abort); 5698 object_property_set_int(obj, "model", 6, &error_abort); 5699 object_property_set_int(obj, "stepping", 3, &error_abort); 5700 } 5701 } 5702 5703 x86_cpu_realizefn(dev, errp); 5704 } 5705 5706 static void max_x86_cpu_class_init(ObjectClass *oc, void *data) 5707 { 5708 DeviceClass *dc = DEVICE_CLASS(oc); 5709 X86CPUClass *xcc = X86_CPU_CLASS(oc); 5710 5711 xcc->ordering = 9; 5712 5713 xcc->model_description = 5714 "Enables all features supported by the accelerator in the current host"; 5715 5716 device_class_set_props(dc, max_x86_cpu_properties); 5717 dc->realize = max_x86_cpu_realize; 5718 } 5719 5720 static void max_x86_cpu_initfn(Object *obj) 5721 { 5722 X86CPU *cpu = X86_CPU(obj); 5723 5724 /* We can't fill the features array here because we don't know yet if 5725 * "migratable" is true or false. 5726 */ 5727 cpu->max_features = true; 5728 object_property_set_bool(OBJECT(cpu), "pmu", true, &error_abort); 5729 5730 /* 5731 * these defaults are used for TCG and all other accelerators 5732 * besides KVM and HVF, which overwrite these values 5733 */ 5734 object_property_set_str(OBJECT(cpu), "vendor", CPUID_VENDOR_AMD, 5735 &error_abort); 5736 object_property_set_str(OBJECT(cpu), "model-id", 5737 "QEMU TCG CPU version " QEMU_HW_VERSION, 5738 &error_abort); 5739 } 5740 5741 static const TypeInfo max_x86_cpu_type_info = { 5742 .name = X86_CPU_TYPE_NAME("max"), 5743 .parent = TYPE_X86_CPU, 5744 .instance_init = max_x86_cpu_initfn, 5745 .class_init = max_x86_cpu_class_init, 5746 }; 5747 5748 static char *feature_word_description(FeatureWordInfo *f, uint32_t bit) 5749 { 5750 assert(f->type == CPUID_FEATURE_WORD || f->type == MSR_FEATURE_WORD); 5751 5752 switch (f->type) { 5753 case CPUID_FEATURE_WORD: 5754 { 5755 const char *reg = get_register_name_32(f->cpuid.reg); 5756 assert(reg); 5757 return g_strdup_printf("CPUID.%02XH:%s", 5758 f->cpuid.eax, reg); 5759 } 5760 case MSR_FEATURE_WORD: 5761 return g_strdup_printf("MSR(%02XH)", 5762 f->msr.index); 5763 } 5764 5765 return NULL; 5766 } 5767 5768 static bool x86_cpu_have_filtered_features(X86CPU *cpu) 5769 { 5770 FeatureWord w; 5771 5772 for (w = 0; w < FEATURE_WORDS; w++) { 5773 if (cpu->filtered_features[w]) { 5774 return true; 5775 } 5776 } 5777 5778 return false; 5779 } 5780 5781 static void mark_unavailable_features(X86CPU *cpu, FeatureWord w, uint64_t mask, 5782 const char *verbose_prefix) 5783 { 5784 CPUX86State *env = &cpu->env; 5785 FeatureWordInfo *f = &feature_word_info[w]; 5786 int i; 5787 5788 if (!cpu->force_features) { 5789 env->features[w] &= ~mask; 5790 } 5791 cpu->filtered_features[w] |= mask; 5792 5793 if (!verbose_prefix) { 5794 return; 5795 } 5796 5797 for (i = 0; i < 64; ++i) { 5798 if ((1ULL << i) & mask) { 5799 g_autofree char *feat_word_str = feature_word_description(f, i); 5800 warn_report("%s: %s%s%s [bit %d]", 5801 verbose_prefix, 5802 feat_word_str, 5803 f->feat_names[i] ? "." : "", 5804 f->feat_names[i] ? f->feat_names[i] : "", i); 5805 } 5806 } 5807 } 5808 5809 static void x86_cpuid_version_get_family(Object *obj, Visitor *v, 5810 const char *name, void *opaque, 5811 Error **errp) 5812 { 5813 X86CPU *cpu = X86_CPU(obj); 5814 CPUX86State *env = &cpu->env; 5815 uint64_t value; 5816 5817 value = (env->cpuid_version >> 8) & 0xf; 5818 if (value == 0xf) { 5819 value += (env->cpuid_version >> 20) & 0xff; 5820 } 5821 visit_type_uint64(v, name, &value, errp); 5822 } 5823 5824 static void x86_cpuid_version_set_family(Object *obj, Visitor *v, 5825 const char *name, void *opaque, 5826 Error **errp) 5827 { 5828 X86CPU *cpu = X86_CPU(obj); 5829 CPUX86State *env = &cpu->env; 5830 const uint64_t max = 0xff + 0xf; 5831 uint64_t value; 5832 5833 if (!visit_type_uint64(v, name, &value, errp)) { 5834 return; 5835 } 5836 if (value > max) { 5837 error_setg(errp, "parameter '%s' can be at most %" PRIu64, 5838 name ? name : "null", max); 5839 return; 5840 } 5841 5842 env->cpuid_version &= ~0xff00f00; 5843 if (value > 0x0f) { 5844 env->cpuid_version |= 0xf00 | ((value - 0x0f) << 20); 5845 } else { 5846 env->cpuid_version |= value << 8; 5847 } 5848 } 5849 5850 static void x86_cpuid_version_get_model(Object *obj, Visitor *v, 5851 const char *name, void *opaque, 5852 Error **errp) 5853 { 5854 X86CPU *cpu = X86_CPU(obj); 5855 CPUX86State *env = &cpu->env; 5856 uint64_t value; 5857 5858 value = (env->cpuid_version >> 4) & 0xf; 5859 value |= ((env->cpuid_version >> 16) & 0xf) << 4; 5860 visit_type_uint64(v, name, &value, errp); 5861 } 5862 5863 static void x86_cpuid_version_set_model(Object *obj, Visitor *v, 5864 const char *name, void *opaque, 5865 Error **errp) 5866 { 5867 X86CPU *cpu = X86_CPU(obj); 5868 CPUX86State *env = &cpu->env; 5869 const uint64_t max = 0xff; 5870 uint64_t value; 5871 5872 if (!visit_type_uint64(v, name, &value, errp)) { 5873 return; 5874 } 5875 if (value > max) { 5876 error_setg(errp, "parameter '%s' can be at most %" PRIu64, 5877 name ? name : "null", max); 5878 return; 5879 } 5880 5881 env->cpuid_version &= ~0xf00f0; 5882 env->cpuid_version |= ((value & 0xf) << 4) | ((value >> 4) << 16); 5883 } 5884 5885 static void x86_cpuid_version_get_stepping(Object *obj, Visitor *v, 5886 const char *name, void *opaque, 5887 Error **errp) 5888 { 5889 X86CPU *cpu = X86_CPU(obj); 5890 CPUX86State *env = &cpu->env; 5891 uint64_t value; 5892 5893 value = env->cpuid_version & 0xf; 5894 visit_type_uint64(v, name, &value, errp); 5895 } 5896 5897 static void x86_cpuid_version_set_stepping(Object *obj, Visitor *v, 5898 const char *name, void *opaque, 5899 Error **errp) 5900 { 5901 X86CPU *cpu = X86_CPU(obj); 5902 CPUX86State *env = &cpu->env; 5903 const uint64_t max = 0xf; 5904 uint64_t value; 5905 5906 if (!visit_type_uint64(v, name, &value, errp)) { 5907 return; 5908 } 5909 if (value > max) { 5910 error_setg(errp, "parameter '%s' can be at most %" PRIu64, 5911 name ? name : "null", max); 5912 return; 5913 } 5914 5915 env->cpuid_version &= ~0xf; 5916 env->cpuid_version |= value & 0xf; 5917 } 5918 5919 static char *x86_cpuid_get_vendor(Object *obj, Error **errp) 5920 { 5921 X86CPU *cpu = X86_CPU(obj); 5922 CPUX86State *env = &cpu->env; 5923 char *value; 5924 5925 value = g_malloc(CPUID_VENDOR_SZ + 1); 5926 x86_cpu_vendor_words2str(value, env->cpuid_vendor1, env->cpuid_vendor2, 5927 env->cpuid_vendor3); 5928 return value; 5929 } 5930 5931 static void x86_cpuid_set_vendor(Object *obj, const char *value, 5932 Error **errp) 5933 { 5934 X86CPU *cpu = X86_CPU(obj); 5935 CPUX86State *env = &cpu->env; 5936 int i; 5937 5938 if (strlen(value) != CPUID_VENDOR_SZ) { 5939 error_setg(errp, "value of property 'vendor' must consist of" 5940 " exactly " stringify(CPUID_VENDOR_SZ) " characters"); 5941 return; 5942 } 5943 5944 env->cpuid_vendor1 = 0; 5945 env->cpuid_vendor2 = 0; 5946 env->cpuid_vendor3 = 0; 5947 for (i = 0; i < 4; i++) { 5948 env->cpuid_vendor1 |= ((uint8_t)value[i ]) << (8 * i); 5949 env->cpuid_vendor2 |= ((uint8_t)value[i + 4]) << (8 * i); 5950 env->cpuid_vendor3 |= ((uint8_t)value[i + 8]) << (8 * i); 5951 } 5952 } 5953 5954 static char *x86_cpuid_get_model_id(Object *obj, Error **errp) 5955 { 5956 X86CPU *cpu = X86_CPU(obj); 5957 CPUX86State *env = &cpu->env; 5958 char *value; 5959 int i; 5960 5961 value = g_malloc(48 + 1); 5962 for (i = 0; i < 48; i++) { 5963 value[i] = env->cpuid_model[i >> 2] >> (8 * (i & 3)); 5964 } 5965 value[48] = '\0'; 5966 return value; 5967 } 5968 5969 static void x86_cpuid_set_model_id(Object *obj, const char *model_id, 5970 Error **errp) 5971 { 5972 X86CPU *cpu = X86_CPU(obj); 5973 CPUX86State *env = &cpu->env; 5974 int c, len, i; 5975 5976 if (model_id == NULL) { 5977 model_id = ""; 5978 } 5979 len = strlen(model_id); 5980 memset(env->cpuid_model, 0, 48); 5981 for (i = 0; i < 48; i++) { 5982 if (i >= len) { 5983 c = '\0'; 5984 } else { 5985 c = (uint8_t)model_id[i]; 5986 } 5987 env->cpuid_model[i >> 2] |= c << (8 * (i & 3)); 5988 } 5989 } 5990 5991 static void x86_cpuid_get_tsc_freq(Object *obj, Visitor *v, const char *name, 5992 void *opaque, Error **errp) 5993 { 5994 X86CPU *cpu = X86_CPU(obj); 5995 int64_t value; 5996 5997 value = cpu->env.tsc_khz * 1000; 5998 visit_type_int(v, name, &value, errp); 5999 } 6000 6001 static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, const char *name, 6002 void *opaque, Error **errp) 6003 { 6004 X86CPU *cpu = X86_CPU(obj); 6005 const int64_t max = INT64_MAX; 6006 int64_t value; 6007 6008 if (!visit_type_int(v, name, &value, errp)) { 6009 return; 6010 } 6011 if (value < 0 || value > max) { 6012 error_setg(errp, "parameter '%s' can be at most %" PRId64, 6013 name ? name : "null", max); 6014 return; 6015 } 6016 6017 cpu->env.tsc_khz = cpu->env.user_tsc_khz = value / 1000; 6018 } 6019 6020 /* Generic getter for "feature-words" and "filtered-features" properties */ 6021 static void x86_cpu_get_feature_words(Object *obj, Visitor *v, 6022 const char *name, void *opaque, 6023 Error **errp) 6024 { 6025 uint64_t *array = (uint64_t *)opaque; 6026 FeatureWord w; 6027 X86CPUFeatureWordInfo word_infos[FEATURE_WORDS] = { }; 6028 X86CPUFeatureWordInfoList list_entries[FEATURE_WORDS] = { }; 6029 X86CPUFeatureWordInfoList *list = NULL; 6030 6031 for (w = 0; w < FEATURE_WORDS; w++) { 6032 FeatureWordInfo *wi = &feature_word_info[w]; 6033 /* 6034 * We didn't have MSR features when "feature-words" was 6035 * introduced. Therefore skipped other type entries. 6036 */ 6037 if (wi->type != CPUID_FEATURE_WORD) { 6038 continue; 6039 } 6040 X86CPUFeatureWordInfo *qwi = &word_infos[w]; 6041 qwi->cpuid_input_eax = wi->cpuid.eax; 6042 qwi->has_cpuid_input_ecx = wi->cpuid.needs_ecx; 6043 qwi->cpuid_input_ecx = wi->cpuid.ecx; 6044 qwi->cpuid_register = x86_reg_info_32[wi->cpuid.reg].qapi_enum; 6045 qwi->features = array[w]; 6046 6047 /* List will be in reverse order, but order shouldn't matter */ 6048 list_entries[w].next = list; 6049 list_entries[w].value = &word_infos[w]; 6050 list = &list_entries[w]; 6051 } 6052 6053 visit_type_X86CPUFeatureWordInfoList(v, "feature-words", &list, errp); 6054 } 6055 6056 /* Convert all '_' in a feature string option name to '-', to make feature 6057 * name conform to QOM property naming rule, which uses '-' instead of '_'. 6058 */ 6059 static inline void feat2prop(char *s) 6060 { 6061 while ((s = strchr(s, '_'))) { 6062 *s = '-'; 6063 } 6064 } 6065 6066 /* Return the feature property name for a feature flag bit */ 6067 static const char *x86_cpu_feature_name(FeatureWord w, int bitnr) 6068 { 6069 const char *name; 6070 /* XSAVE components are automatically enabled by other features, 6071 * so return the original feature name instead 6072 */ 6073 if (w == FEAT_XSAVE_XCR0_LO || w == FEAT_XSAVE_XCR0_HI) { 6074 int comp = (w == FEAT_XSAVE_XCR0_HI) ? bitnr + 32 : bitnr; 6075 6076 if (comp < ARRAY_SIZE(x86_ext_save_areas) && 6077 x86_ext_save_areas[comp].bits) { 6078 w = x86_ext_save_areas[comp].feature; 6079 bitnr = ctz32(x86_ext_save_areas[comp].bits); 6080 } 6081 } 6082 6083 assert(bitnr < 64); 6084 assert(w < FEATURE_WORDS); 6085 name = feature_word_info[w].feat_names[bitnr]; 6086 assert(bitnr < 32 || !(name && feature_word_info[w].type == CPUID_FEATURE_WORD)); 6087 return name; 6088 } 6089 6090 /* Compatibility hack to maintain legacy +-feat semantic, 6091 * where +-feat overwrites any feature set by 6092 * feat=on|feat even if the later is parsed after +-feat 6093 * (i.e. "-x2apic,x2apic=on" will result in x2apic disabled) 6094 */ 6095 static GList *plus_features, *minus_features; 6096 6097 static gint compare_string(gconstpointer a, gconstpointer b) 6098 { 6099 return g_strcmp0(a, b); 6100 } 6101 6102 /* Parse "+feature,-feature,feature=foo" CPU feature string 6103 */ 6104 static void x86_cpu_parse_featurestr(const char *typename, char *features, 6105 Error **errp) 6106 { 6107 char *featurestr; /* Single 'key=value" string being parsed */ 6108 static bool cpu_globals_initialized; 6109 bool ambiguous = false; 6110 6111 if (cpu_globals_initialized) { 6112 return; 6113 } 6114 cpu_globals_initialized = true; 6115 6116 if (!features) { 6117 return; 6118 } 6119 6120 for (featurestr = strtok(features, ","); 6121 featurestr; 6122 featurestr = strtok(NULL, ",")) { 6123 const char *name; 6124 const char *val = NULL; 6125 char *eq = NULL; 6126 char num[32]; 6127 GlobalProperty *prop; 6128 6129 /* Compatibility syntax: */ 6130 if (featurestr[0] == '+') { 6131 plus_features = g_list_append(plus_features, 6132 g_strdup(featurestr + 1)); 6133 continue; 6134 } else if (featurestr[0] == '-') { 6135 minus_features = g_list_append(minus_features, 6136 g_strdup(featurestr + 1)); 6137 continue; 6138 } 6139 6140 eq = strchr(featurestr, '='); 6141 if (eq) { 6142 *eq++ = 0; 6143 val = eq; 6144 } else { 6145 val = "on"; 6146 } 6147 6148 feat2prop(featurestr); 6149 name = featurestr; 6150 6151 if (g_list_find_custom(plus_features, name, compare_string)) { 6152 warn_report("Ambiguous CPU model string. " 6153 "Don't mix both \"+%s\" and \"%s=%s\"", 6154 name, name, val); 6155 ambiguous = true; 6156 } 6157 if (g_list_find_custom(minus_features, name, compare_string)) { 6158 warn_report("Ambiguous CPU model string. " 6159 "Don't mix both \"-%s\" and \"%s=%s\"", 6160 name, name, val); 6161 ambiguous = true; 6162 } 6163 6164 /* Special case: */ 6165 if (!strcmp(name, "tsc-freq")) { 6166 int ret; 6167 uint64_t tsc_freq; 6168 6169 ret = qemu_strtosz_metric(val, NULL, &tsc_freq); 6170 if (ret < 0 || tsc_freq > INT64_MAX) { 6171 error_setg(errp, "bad numerical value %s", val); 6172 return; 6173 } 6174 snprintf(num, sizeof(num), "%" PRId64, tsc_freq); 6175 val = num; 6176 name = "tsc-frequency"; 6177 } 6178 6179 prop = g_new0(typeof(*prop), 1); 6180 prop->driver = typename; 6181 prop->property = g_strdup(name); 6182 prop->value = g_strdup(val); 6183 qdev_prop_register_global(prop); 6184 } 6185 6186 if (ambiguous) { 6187 warn_report("Compatibility of ambiguous CPU model " 6188 "strings won't be kept on future QEMU versions"); 6189 } 6190 } 6191 6192 static bool x86_cpu_filter_features(X86CPU *cpu, bool verbose); 6193 6194 /* Build a list with the name of all features on a feature word array */ 6195 static void x86_cpu_list_feature_names(FeatureWordArray features, 6196 strList **list) 6197 { 6198 strList **tail = list; 6199 FeatureWord w; 6200 6201 for (w = 0; w < FEATURE_WORDS; w++) { 6202 uint64_t filtered = features[w]; 6203 int i; 6204 for (i = 0; i < 64; i++) { 6205 if (filtered & (1ULL << i)) { 6206 QAPI_LIST_APPEND(tail, g_strdup(x86_cpu_feature_name(w, i))); 6207 } 6208 } 6209 } 6210 } 6211 6212 static void x86_cpu_get_unavailable_features(Object *obj, Visitor *v, 6213 const char *name, void *opaque, 6214 Error **errp) 6215 { 6216 X86CPU *xc = X86_CPU(obj); 6217 strList *result = NULL; 6218 6219 x86_cpu_list_feature_names(xc->filtered_features, &result); 6220 visit_type_strList(v, "unavailable-features", &result, errp); 6221 } 6222 6223 /* Print all cpuid feature names in featureset 6224 */ 6225 static void listflags(GList *features) 6226 { 6227 size_t len = 0; 6228 GList *tmp; 6229 6230 for (tmp = features; tmp; tmp = tmp->next) { 6231 const char *name = tmp->data; 6232 if ((len + strlen(name) + 1) >= 75) { 6233 qemu_printf("\n"); 6234 len = 0; 6235 } 6236 qemu_printf("%s%s", len == 0 ? " " : " ", name); 6237 len += strlen(name) + 1; 6238 } 6239 qemu_printf("\n"); 6240 } 6241 6242 /* Sort alphabetically by type name, respecting X86CPUClass::ordering. */ 6243 static gint x86_cpu_list_compare(gconstpointer a, gconstpointer b) 6244 { 6245 ObjectClass *class_a = (ObjectClass *)a; 6246 ObjectClass *class_b = (ObjectClass *)b; 6247 X86CPUClass *cc_a = X86_CPU_CLASS(class_a); 6248 X86CPUClass *cc_b = X86_CPU_CLASS(class_b); 6249 int ret; 6250 6251 if (cc_a->ordering != cc_b->ordering) { 6252 ret = cc_a->ordering - cc_b->ordering; 6253 } else { 6254 g_autofree char *name_a = x86_cpu_class_get_model_name(cc_a); 6255 g_autofree char *name_b = x86_cpu_class_get_model_name(cc_b); 6256 ret = strcmp(name_a, name_b); 6257 } 6258 return ret; 6259 } 6260 6261 static GSList *get_sorted_cpu_model_list(void) 6262 { 6263 GSList *list = object_class_get_list(TYPE_X86_CPU, false); 6264 list = g_slist_sort(list, x86_cpu_list_compare); 6265 return list; 6266 } 6267 6268 static char *x86_cpu_class_get_model_id(X86CPUClass *xc) 6269 { 6270 Object *obj = object_new_with_class(OBJECT_CLASS(xc)); 6271 char *r = object_property_get_str(obj, "model-id", &error_abort); 6272 object_unref(obj); 6273 return r; 6274 } 6275 6276 static char *x86_cpu_class_get_alias_of(X86CPUClass *cc) 6277 { 6278 X86CPUVersion version; 6279 6280 if (!cc->model || !cc->model->is_alias) { 6281 return NULL; 6282 } 6283 version = x86_cpu_model_resolve_version(cc->model); 6284 if (version <= 0) { 6285 return NULL; 6286 } 6287 return x86_cpu_versioned_model_name(cc->model->cpudef, version); 6288 } 6289 6290 static void x86_cpu_list_entry(gpointer data, gpointer user_data) 6291 { 6292 ObjectClass *oc = data; 6293 X86CPUClass *cc = X86_CPU_CLASS(oc); 6294 g_autofree char *name = x86_cpu_class_get_model_name(cc); 6295 g_autofree char *desc = g_strdup(cc->model_description); 6296 g_autofree char *alias_of = x86_cpu_class_get_alias_of(cc); 6297 g_autofree char *model_id = x86_cpu_class_get_model_id(cc); 6298 6299 if (!desc && alias_of) { 6300 if (cc->model && cc->model->version == CPU_VERSION_AUTO) { 6301 desc = g_strdup("(alias configured by machine type)"); 6302 } else { 6303 desc = g_strdup_printf("(alias of %s)", alias_of); 6304 } 6305 } 6306 if (!desc && cc->model && cc->model->note) { 6307 desc = g_strdup_printf("%s [%s]", model_id, cc->model->note); 6308 } 6309 if (!desc) { 6310 desc = g_strdup(model_id); 6311 } 6312 6313 if (cc->model && cc->model->cpudef->deprecation_note) { 6314 g_autofree char *olddesc = desc; 6315 desc = g_strdup_printf("%s (deprecated)", olddesc); 6316 } 6317 6318 qemu_printf(" %-20s %s\n", name, desc); 6319 } 6320 6321 /* list available CPU models and flags */ 6322 static void x86_cpu_list(void) 6323 { 6324 int i, j; 6325 GSList *list; 6326 GList *names = NULL; 6327 6328 qemu_printf("Available CPUs:\n"); 6329 list = get_sorted_cpu_model_list(); 6330 g_slist_foreach(list, x86_cpu_list_entry, NULL); 6331 g_slist_free(list); 6332 6333 names = NULL; 6334 for (i = 0; i < ARRAY_SIZE(feature_word_info); i++) { 6335 FeatureWordInfo *fw = &feature_word_info[i]; 6336 for (j = 0; j < 64; j++) { 6337 if (fw->feat_names[j]) { 6338 names = g_list_append(names, (gpointer)fw->feat_names[j]); 6339 } 6340 } 6341 } 6342 6343 names = g_list_sort(names, (GCompareFunc)strcmp); 6344 6345 qemu_printf("\nRecognized CPUID flags:\n"); 6346 listflags(names); 6347 qemu_printf("\n"); 6348 g_list_free(names); 6349 } 6350 6351 #ifndef CONFIG_USER_ONLY 6352 6353 /* Check for missing features that may prevent the CPU class from 6354 * running using the current machine and accelerator. 6355 */ 6356 static void x86_cpu_class_check_missing_features(X86CPUClass *xcc, 6357 strList **list) 6358 { 6359 strList **tail = list; 6360 X86CPU *xc; 6361 Error *err = NULL; 6362 6363 if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) { 6364 QAPI_LIST_APPEND(tail, g_strdup("kvm")); 6365 return; 6366 } 6367 6368 xc = X86_CPU(object_new_with_class(OBJECT_CLASS(xcc))); 6369 6370 x86_cpu_expand_features(xc, &err); 6371 if (err) { 6372 /* Errors at x86_cpu_expand_features should never happen, 6373 * but in case it does, just report the model as not 6374 * runnable at all using the "type" property. 6375 */ 6376 QAPI_LIST_APPEND(tail, g_strdup("type")); 6377 error_free(err); 6378 } 6379 6380 x86_cpu_filter_features(xc, false); 6381 6382 x86_cpu_list_feature_names(xc->filtered_features, tail); 6383 6384 object_unref(OBJECT(xc)); 6385 } 6386 6387 static void x86_cpu_definition_entry(gpointer data, gpointer user_data) 6388 { 6389 ObjectClass *oc = data; 6390 X86CPUClass *cc = X86_CPU_CLASS(oc); 6391 CpuDefinitionInfoList **cpu_list = user_data; 6392 CpuDefinitionInfo *info; 6393 6394 info = g_malloc0(sizeof(*info)); 6395 info->name = x86_cpu_class_get_model_name(cc); 6396 x86_cpu_class_check_missing_features(cc, &info->unavailable_features); 6397 info->has_unavailable_features = true; 6398 info->q_typename = g_strdup(object_class_get_name(oc)); 6399 info->migration_safe = cc->migration_safe; 6400 info->has_migration_safe = true; 6401 info->q_static = cc->static_model; 6402 if (cc->model && cc->model->cpudef->deprecation_note) { 6403 info->deprecated = true; 6404 } else { 6405 info->deprecated = false; 6406 } 6407 /* 6408 * Old machine types won't report aliases, so that alias translation 6409 * doesn't break compatibility with previous QEMU versions. 6410 */ 6411 if (default_cpu_version != CPU_VERSION_LEGACY) { 6412 info->alias_of = x86_cpu_class_get_alias_of(cc); 6413 } 6414 6415 QAPI_LIST_PREPEND(*cpu_list, info); 6416 } 6417 6418 CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp) 6419 { 6420 CpuDefinitionInfoList *cpu_list = NULL; 6421 GSList *list = get_sorted_cpu_model_list(); 6422 g_slist_foreach(list, x86_cpu_definition_entry, &cpu_list); 6423 g_slist_free(list); 6424 return cpu_list; 6425 } 6426 6427 #endif /* !CONFIG_USER_ONLY */ 6428 6429 uint64_t x86_cpu_get_supported_feature_word(X86CPU *cpu, FeatureWord w) 6430 { 6431 FeatureWordInfo *wi = &feature_word_info[w]; 6432 uint64_t r = 0; 6433 uint64_t unavail = 0; 6434 6435 if (kvm_enabled()) { 6436 switch (wi->type) { 6437 case CPUID_FEATURE_WORD: 6438 r = kvm_arch_get_supported_cpuid(kvm_state, wi->cpuid.eax, 6439 wi->cpuid.ecx, 6440 wi->cpuid.reg); 6441 break; 6442 case MSR_FEATURE_WORD: 6443 r = kvm_arch_get_supported_msr_feature(kvm_state, 6444 wi->msr.index); 6445 break; 6446 } 6447 } else if (hvf_enabled()) { 6448 if (wi->type != CPUID_FEATURE_WORD) { 6449 return 0; 6450 } 6451 r = hvf_get_supported_cpuid(wi->cpuid.eax, 6452 wi->cpuid.ecx, 6453 wi->cpuid.reg); 6454 } else if (tcg_enabled()) { 6455 r = wi->tcg_features; 6456 } else { 6457 return ~0; 6458 } 6459 6460 switch (w) { 6461 #ifndef TARGET_X86_64 6462 case FEAT_8000_0001_EDX: 6463 /* 6464 * 32-bit TCG can emulate 64-bit compatibility mode. If there is no 6465 * way for userspace to get out of its 32-bit jail, we can leave 6466 * the LM bit set. 6467 */ 6468 unavail = tcg_enabled() 6469 ? CPUID_EXT2_LM & ~CPUID_EXT2_KERNEL_FEATURES 6470 : CPUID_EXT2_LM; 6471 break; 6472 #endif 6473 6474 case FEAT_8000_0007_EBX: 6475 if (cpu && !IS_AMD_CPU(&cpu->env)) { 6476 /* Disable AMD machine check architecture for Intel CPU. */ 6477 unavail = ~0; 6478 } 6479 break; 6480 6481 case FEAT_7_0_EBX: 6482 #ifndef CONFIG_USER_ONLY 6483 if (!check_sgx_support()) { 6484 unavail = CPUID_7_0_EBX_SGX; 6485 } 6486 #endif 6487 break; 6488 case FEAT_7_0_ECX: 6489 #ifndef CONFIG_USER_ONLY 6490 if (!check_sgx_support()) { 6491 unavail = CPUID_7_0_ECX_SGX_LC; 6492 } 6493 #endif 6494 break; 6495 6496 default: 6497 break; 6498 } 6499 6500 r &= ~unavail; 6501 if (cpu && cpu->migratable) { 6502 r &= x86_cpu_get_migratable_flags(cpu, w); 6503 } 6504 return r; 6505 } 6506 6507 static void x86_cpu_get_supported_cpuid(uint32_t func, uint32_t index, 6508 uint32_t *eax, uint32_t *ebx, 6509 uint32_t *ecx, uint32_t *edx) 6510 { 6511 if (kvm_enabled()) { 6512 *eax = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EAX); 6513 *ebx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EBX); 6514 *ecx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_ECX); 6515 *edx = kvm_arch_get_supported_cpuid(kvm_state, func, index, R_EDX); 6516 } else if (hvf_enabled()) { 6517 *eax = hvf_get_supported_cpuid(func, index, R_EAX); 6518 *ebx = hvf_get_supported_cpuid(func, index, R_EBX); 6519 *ecx = hvf_get_supported_cpuid(func, index, R_ECX); 6520 *edx = hvf_get_supported_cpuid(func, index, R_EDX); 6521 } else { 6522 *eax = 0; 6523 *ebx = 0; 6524 *ecx = 0; 6525 *edx = 0; 6526 } 6527 } 6528 6529 static void x86_cpu_get_cache_cpuid(uint32_t func, uint32_t index, 6530 uint32_t *eax, uint32_t *ebx, 6531 uint32_t *ecx, uint32_t *edx) 6532 { 6533 uint32_t level, unused; 6534 6535 /* Only return valid host leaves. */ 6536 switch (func) { 6537 case 2: 6538 case 4: 6539 host_cpuid(0, 0, &level, &unused, &unused, &unused); 6540 break; 6541 case 0x80000005: 6542 case 0x80000006: 6543 case 0x8000001d: 6544 host_cpuid(0x80000000, 0, &level, &unused, &unused, &unused); 6545 break; 6546 default: 6547 return; 6548 } 6549 6550 if (func > level) { 6551 *eax = 0; 6552 *ebx = 0; 6553 *ecx = 0; 6554 *edx = 0; 6555 } else { 6556 host_cpuid(func, index, eax, ebx, ecx, edx); 6557 } 6558 } 6559 6560 /* 6561 * Only for builtin_x86_defs models initialized with x86_register_cpudef_types. 6562 */ 6563 void x86_cpu_apply_props(X86CPU *cpu, PropValue *props) 6564 { 6565 PropValue *pv; 6566 for (pv = props; pv->prop; pv++) { 6567 if (!pv->value) { 6568 continue; 6569 } 6570 object_property_parse(OBJECT(cpu), pv->prop, pv->value, 6571 &error_abort); 6572 } 6573 } 6574 6575 /* 6576 * Apply properties for the CPU model version specified in model. 6577 * Only for builtin_x86_defs models initialized with x86_register_cpudef_types. 6578 */ 6579 6580 static void x86_cpu_apply_version_props(X86CPU *cpu, const X86CPUModel *model) 6581 { 6582 const X86CPUVersionDefinition *vdef; 6583 X86CPUVersion version = x86_cpu_model_resolve_version(model); 6584 6585 if (version == CPU_VERSION_LEGACY) { 6586 return; 6587 } 6588 6589 for (vdef = x86_cpu_def_get_versions(model->cpudef); vdef->version; vdef++) { 6590 PropValue *p; 6591 6592 for (p = vdef->props; p && p->prop; p++) { 6593 object_property_parse(OBJECT(cpu), p->prop, p->value, 6594 &error_abort); 6595 } 6596 6597 if (vdef->version == version) { 6598 break; 6599 } 6600 } 6601 6602 /* 6603 * If we reached the end of the list, version number was invalid 6604 */ 6605 assert(vdef->version == version); 6606 } 6607 6608 static const CPUCaches *x86_cpu_get_versioned_cache_info(X86CPU *cpu, 6609 const X86CPUModel *model) 6610 { 6611 const X86CPUVersionDefinition *vdef; 6612 X86CPUVersion version = x86_cpu_model_resolve_version(model); 6613 const CPUCaches *cache_info = model->cpudef->cache_info; 6614 6615 if (version == CPU_VERSION_LEGACY) { 6616 return cache_info; 6617 } 6618 6619 for (vdef = x86_cpu_def_get_versions(model->cpudef); vdef->version; vdef++) { 6620 if (vdef->cache_info) { 6621 cache_info = vdef->cache_info; 6622 } 6623 6624 if (vdef->version == version) { 6625 break; 6626 } 6627 } 6628 6629 assert(vdef->version == version); 6630 return cache_info; 6631 } 6632 6633 /* 6634 * Load data from X86CPUDefinition into a X86CPU object. 6635 * Only for builtin_x86_defs models initialized with x86_register_cpudef_types. 6636 */ 6637 static void x86_cpu_load_model(X86CPU *cpu, const X86CPUModel *model) 6638 { 6639 const X86CPUDefinition *def = model->cpudef; 6640 CPUX86State *env = &cpu->env; 6641 FeatureWord w; 6642 6643 /*NOTE: any property set by this function should be returned by 6644 * x86_cpu_static_props(), so static expansion of 6645 * query-cpu-model-expansion is always complete. 6646 */ 6647 6648 /* CPU models only set _minimum_ values for level/xlevel: */ 6649 object_property_set_uint(OBJECT(cpu), "min-level", def->level, 6650 &error_abort); 6651 object_property_set_uint(OBJECT(cpu), "min-xlevel", def->xlevel, 6652 &error_abort); 6653 6654 object_property_set_int(OBJECT(cpu), "family", def->family, &error_abort); 6655 object_property_set_int(OBJECT(cpu), "model", def->model, &error_abort); 6656 object_property_set_int(OBJECT(cpu), "stepping", def->stepping, 6657 &error_abort); 6658 object_property_set_str(OBJECT(cpu), "model-id", def->model_id, 6659 &error_abort); 6660 for (w = 0; w < FEATURE_WORDS; w++) { 6661 env->features[w] = def->features[w]; 6662 } 6663 6664 /* legacy-cache defaults to 'off' if CPU model provides cache info */ 6665 cpu->legacy_cache = !x86_cpu_get_versioned_cache_info(cpu, model); 6666 6667 env->features[FEAT_1_ECX] |= CPUID_EXT_HYPERVISOR; 6668 6669 /* sysenter isn't supported in compatibility mode on AMD, 6670 * syscall isn't supported in compatibility mode on Intel. 6671 * Normally we advertise the actual CPU vendor, but you can 6672 * override this using the 'vendor' property if you want to use 6673 * KVM's sysenter/syscall emulation in compatibility mode and 6674 * when doing cross vendor migration 6675 */ 6676 6677 /* 6678 * vendor property is set here but then overloaded with the 6679 * host cpu vendor for KVM and HVF. 6680 */ 6681 object_property_set_str(OBJECT(cpu), "vendor", def->vendor, &error_abort); 6682 6683 object_property_set_uint(OBJECT(cpu), "avx10-version", def->avx10_version, 6684 &error_abort); 6685 6686 x86_cpu_apply_version_props(cpu, model); 6687 6688 /* 6689 * Properties in versioned CPU model are not user specified features. 6690 * We can simply clear env->user_features here since it will be filled later 6691 * in x86_cpu_expand_features() based on plus_features and minus_features. 6692 */ 6693 memset(&env->user_features, 0, sizeof(env->user_features)); 6694 } 6695 6696 static const gchar *x86_gdb_arch_name(CPUState *cs) 6697 { 6698 #ifdef TARGET_X86_64 6699 return "i386:x86-64"; 6700 #else 6701 return "i386"; 6702 #endif 6703 } 6704 6705 static void x86_cpu_cpudef_class_init(ObjectClass *oc, void *data) 6706 { 6707 const X86CPUModel *model = data; 6708 X86CPUClass *xcc = X86_CPU_CLASS(oc); 6709 CPUClass *cc = CPU_CLASS(oc); 6710 6711 xcc->model = model; 6712 xcc->migration_safe = true; 6713 cc->deprecation_note = model->cpudef->deprecation_note; 6714 } 6715 6716 static void x86_register_cpu_model_type(const char *name, X86CPUModel *model) 6717 { 6718 g_autofree char *typename = x86_cpu_type_name(name); 6719 TypeInfo ti = { 6720 .name = typename, 6721 .parent = TYPE_X86_CPU, 6722 .class_init = x86_cpu_cpudef_class_init, 6723 .class_data = model, 6724 }; 6725 6726 type_register_static(&ti); 6727 } 6728 6729 6730 /* 6731 * register builtin_x86_defs; 6732 * "max", "base" and subclasses ("host") are not registered here. 6733 * See x86_cpu_register_types for all model registrations. 6734 */ 6735 static void x86_register_cpudef_types(const X86CPUDefinition *def) 6736 { 6737 X86CPUModel *m; 6738 const X86CPUVersionDefinition *vdef; 6739 6740 /* AMD aliases are handled at runtime based on CPUID vendor, so 6741 * they shouldn't be set on the CPU model table. 6742 */ 6743 assert(!(def->features[FEAT_8000_0001_EDX] & CPUID_EXT2_AMD_ALIASES)); 6744 /* catch mistakes instead of silently truncating model_id when too long */ 6745 assert(def->model_id && strlen(def->model_id) <= 48); 6746 6747 /* Unversioned model: */ 6748 m = g_new0(X86CPUModel, 1); 6749 m->cpudef = def; 6750 m->version = CPU_VERSION_AUTO; 6751 m->is_alias = true; 6752 x86_register_cpu_model_type(def->name, m); 6753 6754 /* Versioned models: */ 6755 6756 for (vdef = x86_cpu_def_get_versions(def); vdef->version; vdef++) { 6757 g_autofree char *name = 6758 x86_cpu_versioned_model_name(def, vdef->version); 6759 6760 m = g_new0(X86CPUModel, 1); 6761 m->cpudef = def; 6762 m->version = vdef->version; 6763 m->note = vdef->note; 6764 x86_register_cpu_model_type(name, m); 6765 6766 if (vdef->alias) { 6767 X86CPUModel *am = g_new0(X86CPUModel, 1); 6768 am->cpudef = def; 6769 am->version = vdef->version; 6770 am->is_alias = true; 6771 x86_register_cpu_model_type(vdef->alias, am); 6772 } 6773 } 6774 6775 } 6776 6777 uint32_t cpu_x86_virtual_addr_width(CPUX86State *env) 6778 { 6779 if (env->features[FEAT_7_0_ECX] & CPUID_7_0_ECX_LA57) { 6780 return 57; /* 57 bits virtual */ 6781 } else { 6782 return 48; /* 48 bits virtual */ 6783 } 6784 } 6785 6786 void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, 6787 uint32_t *eax, uint32_t *ebx, 6788 uint32_t *ecx, uint32_t *edx) 6789 { 6790 X86CPU *cpu = env_archcpu(env); 6791 CPUState *cs = env_cpu(env); 6792 uint32_t limit; 6793 uint32_t signature[3]; 6794 X86CPUTopoInfo *topo_info = &env->topo_info; 6795 uint32_t threads_per_pkg; 6796 6797 threads_per_pkg = x86_threads_per_pkg(topo_info); 6798 6799 /* Calculate & apply limits for different index ranges */ 6800 if (index >= 0xC0000000) { 6801 limit = env->cpuid_xlevel2; 6802 } else if (index >= 0x80000000) { 6803 limit = env->cpuid_xlevel; 6804 } else if (index >= 0x40000000) { 6805 limit = 0x40000001; 6806 } else { 6807 limit = env->cpuid_level; 6808 } 6809 6810 if (index > limit) { 6811 /* Intel documentation states that invalid EAX input will 6812 * return the same information as EAX=cpuid_level 6813 * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID) 6814 */ 6815 index = env->cpuid_level; 6816 } 6817 6818 switch(index) { 6819 case 0: 6820 *eax = env->cpuid_level; 6821 *ebx = env->cpuid_vendor1; 6822 *edx = env->cpuid_vendor2; 6823 *ecx = env->cpuid_vendor3; 6824 break; 6825 case 1: 6826 *eax = env->cpuid_version; 6827 *ebx = (cpu->apic_id << 24) | 6828 8 << 8; /* CLFLUSH size in quad words, Linux wants it. */ 6829 *ecx = env->features[FEAT_1_ECX]; 6830 if ((*ecx & CPUID_EXT_XSAVE) && (env->cr[4] & CR4_OSXSAVE_MASK)) { 6831 *ecx |= CPUID_EXT_OSXSAVE; 6832 } 6833 *edx = env->features[FEAT_1_EDX]; 6834 if (threads_per_pkg > 1) { 6835 *ebx |= threads_per_pkg << 16; 6836 } 6837 if (!cpu->enable_pmu) { 6838 *ecx &= ~CPUID_EXT_PDCM; 6839 } 6840 break; 6841 case 2: 6842 /* cache info: needed for Pentium Pro compatibility */ 6843 if (cpu->cache_info_passthrough) { 6844 x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx); 6845 break; 6846 } else if (cpu->vendor_cpuid_only && IS_AMD_CPU(env)) { 6847 *eax = *ebx = *ecx = *edx = 0; 6848 break; 6849 } 6850 *eax = 1; /* Number of CPUID[EAX=2] calls required */ 6851 *ebx = 0; 6852 if (!cpu->enable_l3_cache) { 6853 *ecx = 0; 6854 } else { 6855 *ecx = cpuid2_cache_descriptor(env->cache_info_cpuid2.l3_cache); 6856 } 6857 *edx = (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1d_cache) << 16) | 6858 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l1i_cache) << 8) | 6859 (cpuid2_cache_descriptor(env->cache_info_cpuid2.l2_cache)); 6860 break; 6861 case 4: 6862 /* cache info: needed for Core compatibility */ 6863 if (cpu->cache_info_passthrough) { 6864 x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx); 6865 /* 6866 * QEMU has its own number of cores/logical cpus, 6867 * set 24..14, 31..26 bit to configured values 6868 */ 6869 if (*eax & 31) { 6870 int host_vcpus_per_cache = 1 + ((*eax & 0x3FFC000) >> 14); 6871 6872 *eax &= ~0xFC000000; 6873 *eax |= max_core_ids_in_package(topo_info) << 26; 6874 if (host_vcpus_per_cache > threads_per_pkg) { 6875 *eax &= ~0x3FFC000; 6876 6877 /* Share the cache at package level. */ 6878 *eax |= max_thread_ids_for_cache(topo_info, 6879 CPU_TOPOLOGY_LEVEL_SOCKET) << 14; 6880 } 6881 } 6882 } else if (cpu->vendor_cpuid_only && IS_AMD_CPU(env)) { 6883 *eax = *ebx = *ecx = *edx = 0; 6884 } else { 6885 *eax = 0; 6886 6887 switch (count) { 6888 case 0: /* L1 dcache info */ 6889 encode_cache_cpuid4(env->cache_info_cpuid4.l1d_cache, 6890 topo_info, 6891 eax, ebx, ecx, edx); 6892 if (!cpu->l1_cache_per_core) { 6893 *eax &= ~MAKE_64BIT_MASK(14, 12); 6894 } 6895 break; 6896 case 1: /* L1 icache info */ 6897 encode_cache_cpuid4(env->cache_info_cpuid4.l1i_cache, 6898 topo_info, 6899 eax, ebx, ecx, edx); 6900 if (!cpu->l1_cache_per_core) { 6901 *eax &= ~MAKE_64BIT_MASK(14, 12); 6902 } 6903 break; 6904 case 2: /* L2 cache info */ 6905 encode_cache_cpuid4(env->cache_info_cpuid4.l2_cache, 6906 topo_info, 6907 eax, ebx, ecx, edx); 6908 break; 6909 case 3: /* L3 cache info */ 6910 if (cpu->enable_l3_cache) { 6911 encode_cache_cpuid4(env->cache_info_cpuid4.l3_cache, 6912 topo_info, 6913 eax, ebx, ecx, edx); 6914 break; 6915 } 6916 /* fall through */ 6917 default: /* end of info */ 6918 *eax = *ebx = *ecx = *edx = 0; 6919 break; 6920 } 6921 } 6922 break; 6923 case 5: 6924 /* MONITOR/MWAIT Leaf */ 6925 *eax = cpu->mwait.eax; /* Smallest monitor-line size in bytes */ 6926 *ebx = cpu->mwait.ebx; /* Largest monitor-line size in bytes */ 6927 *ecx = cpu->mwait.ecx; /* flags */ 6928 *edx = cpu->mwait.edx; /* mwait substates */ 6929 break; 6930 case 6: 6931 /* Thermal and Power Leaf */ 6932 *eax = env->features[FEAT_6_EAX]; 6933 *ebx = 0; 6934 *ecx = 0; 6935 *edx = 0; 6936 break; 6937 case 7: 6938 /* Structured Extended Feature Flags Enumeration Leaf */ 6939 if (count == 0) { 6940 /* Maximum ECX value for sub-leaves */ 6941 *eax = env->cpuid_level_func7; 6942 *ebx = env->features[FEAT_7_0_EBX]; /* Feature flags */ 6943 *ecx = env->features[FEAT_7_0_ECX]; /* Feature flags */ 6944 if ((*ecx & CPUID_7_0_ECX_PKU) && env->cr[4] & CR4_PKE_MASK) { 6945 *ecx |= CPUID_7_0_ECX_OSPKE; 6946 } 6947 *edx = env->features[FEAT_7_0_EDX]; /* Feature flags */ 6948 } else if (count == 1) { 6949 *eax = env->features[FEAT_7_1_EAX]; 6950 *edx = env->features[FEAT_7_1_EDX]; 6951 *ebx = 0; 6952 *ecx = 0; 6953 } else if (count == 2) { 6954 *edx = env->features[FEAT_7_2_EDX]; 6955 *eax = 0; 6956 *ebx = 0; 6957 *ecx = 0; 6958 } else { 6959 *eax = 0; 6960 *ebx = 0; 6961 *ecx = 0; 6962 *edx = 0; 6963 } 6964 break; 6965 case 9: 6966 /* Direct Cache Access Information Leaf */ 6967 *eax = 0; /* Bits 0-31 in DCA_CAP MSR */ 6968 *ebx = 0; 6969 *ecx = 0; 6970 *edx = 0; 6971 break; 6972 case 0xA: 6973 /* Architectural Performance Monitoring Leaf */ 6974 if (cpu->enable_pmu) { 6975 x86_cpu_get_supported_cpuid(0xA, count, eax, ebx, ecx, edx); 6976 } else { 6977 *eax = 0; 6978 *ebx = 0; 6979 *ecx = 0; 6980 *edx = 0; 6981 } 6982 break; 6983 case 0xB: 6984 /* Extended Topology Enumeration Leaf */ 6985 if (!cpu->enable_cpuid_0xb) { 6986 *eax = *ebx = *ecx = *edx = 0; 6987 break; 6988 } 6989 6990 *ecx = count & 0xff; 6991 *edx = cpu->apic_id; 6992 6993 switch (count) { 6994 case 0: 6995 *eax = apicid_core_offset(topo_info); 6996 *ebx = topo_info->threads_per_core; 6997 *ecx |= CPUID_B_ECX_TOPO_LEVEL_SMT << 8; 6998 break; 6999 case 1: 7000 *eax = apicid_pkg_offset(topo_info); 7001 *ebx = threads_per_pkg; 7002 *ecx |= CPUID_B_ECX_TOPO_LEVEL_CORE << 8; 7003 break; 7004 default: 7005 *eax = 0; 7006 *ebx = 0; 7007 *ecx |= CPUID_B_ECX_TOPO_LEVEL_INVALID << 8; 7008 } 7009 7010 assert(!(*eax & ~0x1f)); 7011 *ebx &= 0xffff; /* The count doesn't need to be reliable. */ 7012 break; 7013 case 0x1C: 7014 if (cpu->enable_pmu && (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR)) { 7015 x86_cpu_get_supported_cpuid(0x1C, 0, eax, ebx, ecx, edx); 7016 *edx = 0; 7017 } 7018 break; 7019 case 0x1F: 7020 /* V2 Extended Topology Enumeration Leaf */ 7021 if (!x86_has_extended_topo(env->avail_cpu_topo)) { 7022 *eax = *ebx = *ecx = *edx = 0; 7023 break; 7024 } 7025 7026 encode_topo_cpuid1f(env, count, topo_info, eax, ebx, ecx, edx); 7027 break; 7028 case 0xD: { 7029 /* Processor Extended State */ 7030 *eax = 0; 7031 *ebx = 0; 7032 *ecx = 0; 7033 *edx = 0; 7034 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) { 7035 break; 7036 } 7037 7038 if (count == 0) { 7039 *ecx = xsave_area_size(x86_cpu_xsave_xcr0_components(cpu), false); 7040 *eax = env->features[FEAT_XSAVE_XCR0_LO]; 7041 *edx = env->features[FEAT_XSAVE_XCR0_HI]; 7042 /* 7043 * The initial value of xcr0 and ebx == 0, On host without kvm 7044 * commit 412a3c41(e.g., CentOS 6), the ebx's value always == 0 7045 * even through guest update xcr0, this will crash some legacy guest 7046 * (e.g., CentOS 6), So set ebx == ecx to workaround it. 7047 */ 7048 *ebx = kvm_enabled() ? *ecx : xsave_area_size(env->xcr0, false); 7049 } else if (count == 1) { 7050 uint64_t xstate = x86_cpu_xsave_xcr0_components(cpu) | 7051 x86_cpu_xsave_xss_components(cpu); 7052 7053 *eax = env->features[FEAT_XSAVE]; 7054 *ebx = xsave_area_size(xstate, true); 7055 *ecx = env->features[FEAT_XSAVE_XSS_LO]; 7056 *edx = env->features[FEAT_XSAVE_XSS_HI]; 7057 if (kvm_enabled() && cpu->enable_pmu && 7058 (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR) && 7059 (*eax & CPUID_XSAVE_XSAVES)) { 7060 *ecx |= XSTATE_ARCH_LBR_MASK; 7061 } else { 7062 *ecx &= ~XSTATE_ARCH_LBR_MASK; 7063 } 7064 } else if (count == 0xf && cpu->enable_pmu 7065 && (env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR)) { 7066 x86_cpu_get_supported_cpuid(0xD, count, eax, ebx, ecx, edx); 7067 } else if (count < ARRAY_SIZE(x86_ext_save_areas)) { 7068 const ExtSaveArea *esa = &x86_ext_save_areas[count]; 7069 7070 if (x86_cpu_xsave_xcr0_components(cpu) & (1ULL << count)) { 7071 *eax = esa->size; 7072 *ebx = esa->offset; 7073 *ecx = esa->ecx & 7074 (ESA_FEATURE_ALIGN64_MASK | ESA_FEATURE_XFD_MASK); 7075 } else if (x86_cpu_xsave_xss_components(cpu) & (1ULL << count)) { 7076 *eax = esa->size; 7077 *ebx = 0; 7078 *ecx = 1; 7079 } 7080 } 7081 break; 7082 } 7083 case 0x12: 7084 #ifndef CONFIG_USER_ONLY 7085 if (!kvm_enabled() || 7086 !(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_SGX)) { 7087 *eax = *ebx = *ecx = *edx = 0; 7088 break; 7089 } 7090 7091 /* 7092 * SGX sub-leafs CPUID.0x12.{0x2..N} enumerate EPC sections. Retrieve 7093 * the EPC properties, e.g. confidentiality and integrity, from the 7094 * host's first EPC section, i.e. assume there is one EPC section or 7095 * that all EPC sections have the same security properties. 7096 */ 7097 if (count > 1) { 7098 uint64_t epc_addr, epc_size; 7099 7100 if (sgx_epc_get_section(count - 2, &epc_addr, &epc_size)) { 7101 *eax = *ebx = *ecx = *edx = 0; 7102 break; 7103 } 7104 host_cpuid(index, 2, eax, ebx, ecx, edx); 7105 *eax = (uint32_t)(epc_addr & 0xfffff000) | 0x1; 7106 *ebx = (uint32_t)(epc_addr >> 32); 7107 *ecx = (uint32_t)(epc_size & 0xfffff000) | (*ecx & 0xf); 7108 *edx = (uint32_t)(epc_size >> 32); 7109 break; 7110 } 7111 7112 /* 7113 * SGX sub-leafs CPUID.0x12.{0x0,0x1} are heavily dependent on hardware 7114 * and KVM, i.e. QEMU cannot emulate features to override what KVM 7115 * supports. Features can be further restricted by userspace, but not 7116 * made more permissive. 7117 */ 7118 x86_cpu_get_supported_cpuid(0x12, count, eax, ebx, ecx, edx); 7119 7120 if (count == 0) { 7121 *eax &= env->features[FEAT_SGX_12_0_EAX]; 7122 *ebx &= env->features[FEAT_SGX_12_0_EBX]; 7123 } else { 7124 *eax &= env->features[FEAT_SGX_12_1_EAX]; 7125 *ebx &= 0; /* ebx reserve */ 7126 *ecx &= env->features[FEAT_XSAVE_XCR0_LO]; 7127 *edx &= env->features[FEAT_XSAVE_XCR0_HI]; 7128 7129 /* FP and SSE are always allowed regardless of XSAVE/XCR0. */ 7130 *ecx |= XSTATE_FP_MASK | XSTATE_SSE_MASK; 7131 7132 /* Access to PROVISIONKEY requires additional credentials. */ 7133 if ((*eax & (1U << 4)) && 7134 !kvm_enable_sgx_provisioning(cs->kvm_state)) { 7135 *eax &= ~(1U << 4); 7136 } 7137 } 7138 #endif 7139 break; 7140 case 0x14: { 7141 /* Intel Processor Trace Enumeration */ 7142 *eax = 0; 7143 *ebx = 0; 7144 *ecx = 0; 7145 *edx = 0; 7146 if (!(env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) || 7147 !kvm_enabled()) { 7148 break; 7149 } 7150 7151 /* 7152 * If these are changed, they should stay in sync with 7153 * x86_cpu_filter_features(). 7154 */ 7155 if (count == 0) { 7156 *eax = INTEL_PT_MAX_SUBLEAF; 7157 *ebx = INTEL_PT_MINIMAL_EBX; 7158 *ecx = INTEL_PT_MINIMAL_ECX; 7159 if (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP) { 7160 *ecx |= CPUID_14_0_ECX_LIP; 7161 } 7162 } else if (count == 1) { 7163 *eax = INTEL_PT_MTC_BITMAP | INTEL_PT_ADDR_RANGES_NUM; 7164 *ebx = INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP; 7165 } 7166 break; 7167 } 7168 case 0x1D: { 7169 /* AMX TILE, for now hardcoded for Sapphire Rapids*/ 7170 *eax = 0; 7171 *ebx = 0; 7172 *ecx = 0; 7173 *edx = 0; 7174 if (!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE)) { 7175 break; 7176 } 7177 7178 if (count == 0) { 7179 /* Highest numbered palette subleaf */ 7180 *eax = INTEL_AMX_TILE_MAX_SUBLEAF; 7181 } else if (count == 1) { 7182 *eax = INTEL_AMX_TOTAL_TILE_BYTES | 7183 (INTEL_AMX_BYTES_PER_TILE << 16); 7184 *ebx = INTEL_AMX_BYTES_PER_ROW | (INTEL_AMX_TILE_MAX_NAMES << 16); 7185 *ecx = INTEL_AMX_TILE_MAX_ROWS; 7186 } 7187 break; 7188 } 7189 case 0x1E: { 7190 /* AMX TMUL, for now hardcoded for Sapphire Rapids */ 7191 *eax = 0; 7192 *ebx = 0; 7193 *ecx = 0; 7194 *edx = 0; 7195 if (!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE)) { 7196 break; 7197 } 7198 7199 if (count == 0) { 7200 /* Highest numbered palette subleaf */ 7201 *ebx = INTEL_AMX_TMUL_MAX_K | (INTEL_AMX_TMUL_MAX_N << 8); 7202 } 7203 break; 7204 } 7205 case 0x24: { 7206 *eax = 0; 7207 *ebx = 0; 7208 *ecx = 0; 7209 *edx = 0; 7210 if ((env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10) && count == 0) { 7211 *ebx = env->features[FEAT_24_0_EBX] | env->avx10_version; 7212 } 7213 break; 7214 } 7215 case 0x40000000: 7216 /* 7217 * CPUID code in kvm_arch_init_vcpu() ignores stuff 7218 * set here, but we restrict to TCG none the less. 7219 */ 7220 if (tcg_enabled() && cpu->expose_tcg) { 7221 memcpy(signature, "TCGTCGTCGTCG", 12); 7222 *eax = 0x40000001; 7223 *ebx = signature[0]; 7224 *ecx = signature[1]; 7225 *edx = signature[2]; 7226 } else { 7227 *eax = 0; 7228 *ebx = 0; 7229 *ecx = 0; 7230 *edx = 0; 7231 } 7232 break; 7233 case 0x40000001: 7234 *eax = 0; 7235 *ebx = 0; 7236 *ecx = 0; 7237 *edx = 0; 7238 break; 7239 case 0x80000000: 7240 *eax = env->cpuid_xlevel; 7241 *ebx = env->cpuid_vendor1; 7242 *edx = env->cpuid_vendor2; 7243 *ecx = env->cpuid_vendor3; 7244 break; 7245 case 0x80000001: 7246 *eax = env->cpuid_version; 7247 *ebx = 0; 7248 *ecx = env->features[FEAT_8000_0001_ECX]; 7249 *edx = env->features[FEAT_8000_0001_EDX]; 7250 7251 if (tcg_enabled() && env->cpuid_vendor1 == CPUID_VENDOR_INTEL_1 && 7252 !(env->hflags & HF_LMA_MASK)) { 7253 *edx &= ~CPUID_EXT2_SYSCALL; 7254 } 7255 break; 7256 case 0x80000002: 7257 case 0x80000003: 7258 case 0x80000004: 7259 *eax = env->cpuid_model[(index - 0x80000002) * 4 + 0]; 7260 *ebx = env->cpuid_model[(index - 0x80000002) * 4 + 1]; 7261 *ecx = env->cpuid_model[(index - 0x80000002) * 4 + 2]; 7262 *edx = env->cpuid_model[(index - 0x80000002) * 4 + 3]; 7263 break; 7264 case 0x80000005: 7265 /* cache info (L1 cache) */ 7266 if (cpu->cache_info_passthrough) { 7267 x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx); 7268 break; 7269 } 7270 *eax = (L1_DTLB_2M_ASSOC << 24) | (L1_DTLB_2M_ENTRIES << 16) | 7271 (L1_ITLB_2M_ASSOC << 8) | (L1_ITLB_2M_ENTRIES); 7272 *ebx = (L1_DTLB_4K_ASSOC << 24) | (L1_DTLB_4K_ENTRIES << 16) | 7273 (L1_ITLB_4K_ASSOC << 8) | (L1_ITLB_4K_ENTRIES); 7274 *ecx = encode_cache_cpuid80000005(env->cache_info_amd.l1d_cache); 7275 *edx = encode_cache_cpuid80000005(env->cache_info_amd.l1i_cache); 7276 break; 7277 case 0x80000006: 7278 /* cache info (L2 cache) */ 7279 if (cpu->cache_info_passthrough) { 7280 x86_cpu_get_cache_cpuid(index, 0, eax, ebx, ecx, edx); 7281 break; 7282 } 7283 *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC) << 28) | 7284 (L2_DTLB_2M_ENTRIES << 16) | 7285 (AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC) << 12) | 7286 (L2_ITLB_2M_ENTRIES); 7287 *ebx = (AMD_ENC_ASSOC(L2_DTLB_4K_ASSOC) << 28) | 7288 (L2_DTLB_4K_ENTRIES << 16) | 7289 (AMD_ENC_ASSOC(L2_ITLB_4K_ASSOC) << 12) | 7290 (L2_ITLB_4K_ENTRIES); 7291 encode_cache_cpuid80000006(env->cache_info_amd.l2_cache, 7292 cpu->enable_l3_cache ? 7293 env->cache_info_amd.l3_cache : NULL, 7294 ecx, edx); 7295 break; 7296 case 0x80000007: 7297 *eax = 0; 7298 *ebx = env->features[FEAT_8000_0007_EBX]; 7299 *ecx = 0; 7300 *edx = env->features[FEAT_8000_0007_EDX]; 7301 break; 7302 case 0x80000008: 7303 /* virtual & phys address size in low 2 bytes. */ 7304 *eax = cpu->phys_bits; 7305 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) { 7306 /* 64 bit processor */ 7307 *eax |= (cpu_x86_virtual_addr_width(env) << 8); 7308 *eax |= (cpu->guest_phys_bits << 16); 7309 } 7310 *ebx = env->features[FEAT_8000_0008_EBX]; 7311 if (threads_per_pkg > 1) { 7312 /* 7313 * Bits 15:12 is "The number of bits in the initial 7314 * Core::X86::Apic::ApicId[ApicId] value that indicate 7315 * thread ID within a package". 7316 * Bits 7:0 is "The number of threads in the package is NC+1" 7317 */ 7318 *ecx = (apicid_pkg_offset(topo_info) << 12) | 7319 (threads_per_pkg - 1); 7320 } else { 7321 *ecx = 0; 7322 } 7323 *edx = 0; 7324 break; 7325 case 0x8000000A: 7326 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) { 7327 *eax = 0x00000001; /* SVM Revision */ 7328 *ebx = 0x00000010; /* nr of ASIDs */ 7329 *ecx = 0; 7330 *edx = env->features[FEAT_SVM]; /* optional features */ 7331 } else { 7332 *eax = 0; 7333 *ebx = 0; 7334 *ecx = 0; 7335 *edx = 0; 7336 } 7337 break; 7338 case 0x8000001D: 7339 *eax = 0; 7340 if (cpu->cache_info_passthrough) { 7341 x86_cpu_get_cache_cpuid(index, count, eax, ebx, ecx, edx); 7342 break; 7343 } 7344 switch (count) { 7345 case 0: /* L1 dcache info */ 7346 encode_cache_cpuid8000001d(env->cache_info_amd.l1d_cache, 7347 topo_info, eax, ebx, ecx, edx); 7348 break; 7349 case 1: /* L1 icache info */ 7350 encode_cache_cpuid8000001d(env->cache_info_amd.l1i_cache, 7351 topo_info, eax, ebx, ecx, edx); 7352 break; 7353 case 2: /* L2 cache info */ 7354 encode_cache_cpuid8000001d(env->cache_info_amd.l2_cache, 7355 topo_info, eax, ebx, ecx, edx); 7356 break; 7357 case 3: /* L3 cache info */ 7358 encode_cache_cpuid8000001d(env->cache_info_amd.l3_cache, 7359 topo_info, eax, ebx, ecx, edx); 7360 break; 7361 default: /* end of info */ 7362 *eax = *ebx = *ecx = *edx = 0; 7363 break; 7364 } 7365 if (cpu->amd_topoext_features_only) { 7366 *edx &= CACHE_NO_INVD_SHARING | CACHE_INCLUSIVE; 7367 } 7368 break; 7369 case 0x8000001E: 7370 if (cpu->core_id <= 255) { 7371 encode_topo_cpuid8000001e(cpu, topo_info, eax, ebx, ecx, edx); 7372 } else { 7373 *eax = 0; 7374 *ebx = 0; 7375 *ecx = 0; 7376 *edx = 0; 7377 } 7378 break; 7379 case 0x80000022: 7380 *eax = *ebx = *ecx = *edx = 0; 7381 /* AMD Extended Performance Monitoring and Debug */ 7382 if (kvm_enabled() && cpu->enable_pmu && 7383 (env->features[FEAT_8000_0022_EAX] & CPUID_8000_0022_EAX_PERFMON_V2)) { 7384 *eax |= CPUID_8000_0022_EAX_PERFMON_V2; 7385 *ebx |= kvm_arch_get_supported_cpuid(cs->kvm_state, index, count, 7386 R_EBX) & 0xf; 7387 } 7388 break; 7389 case 0xC0000000: 7390 *eax = env->cpuid_xlevel2; 7391 *ebx = 0; 7392 *ecx = 0; 7393 *edx = 0; 7394 break; 7395 case 0xC0000001: 7396 /* Support for VIA CPU's CPUID instruction */ 7397 *eax = env->cpuid_version; 7398 *ebx = 0; 7399 *ecx = 0; 7400 *edx = env->features[FEAT_C000_0001_EDX]; 7401 break; 7402 case 0xC0000002: 7403 case 0xC0000003: 7404 case 0xC0000004: 7405 /* Reserved for the future, and now filled with zero */ 7406 *eax = 0; 7407 *ebx = 0; 7408 *ecx = 0; 7409 *edx = 0; 7410 break; 7411 case 0x8000001F: 7412 *eax = *ebx = *ecx = *edx = 0; 7413 if (sev_enabled()) { 7414 *eax = 0x2; 7415 *eax |= sev_es_enabled() ? 0x8 : 0; 7416 *eax |= sev_snp_enabled() ? 0x10 : 0; 7417 *ebx = sev_get_cbit_position() & 0x3f; /* EBX[5:0] */ 7418 *ebx |= (sev_get_reduced_phys_bits() & 0x3f) << 6; /* EBX[11:6] */ 7419 } 7420 break; 7421 case 0x80000021: 7422 *eax = *ebx = *ecx = *edx = 0; 7423 *eax = env->features[FEAT_8000_0021_EAX]; 7424 *ebx = env->features[FEAT_8000_0021_EBX]; 7425 break; 7426 default: 7427 /* reserved values: zero */ 7428 *eax = 0; 7429 *ebx = 0; 7430 *ecx = 0; 7431 *edx = 0; 7432 break; 7433 } 7434 } 7435 7436 static void x86_cpu_set_sgxlepubkeyhash(CPUX86State *env) 7437 { 7438 #ifndef CONFIG_USER_ONLY 7439 /* Those default values are defined in Skylake HW */ 7440 env->msr_ia32_sgxlepubkeyhash[0] = 0xa6053e051270b7acULL; 7441 env->msr_ia32_sgxlepubkeyhash[1] = 0x6cfbe8ba8b3b413dULL; 7442 env->msr_ia32_sgxlepubkeyhash[2] = 0xc4916d99f2b3735dULL; 7443 env->msr_ia32_sgxlepubkeyhash[3] = 0xd4f8c05909f9bb3bULL; 7444 #endif 7445 } 7446 7447 static bool cpuid_has_xsave_feature(CPUX86State *env, const ExtSaveArea *esa) 7448 { 7449 if (!esa->size) { 7450 return false; 7451 } 7452 7453 if (env->features[esa->feature] & esa->bits) { 7454 return true; 7455 } 7456 if (esa->feature == FEAT_7_0_EBX && esa->bits == CPUID_7_0_EBX_AVX512F 7457 && (env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10)) { 7458 return true; 7459 } 7460 7461 return false; 7462 } 7463 7464 static void x86_cpu_reset_hold(Object *obj, ResetType type) 7465 { 7466 CPUState *cs = CPU(obj); 7467 X86CPU *cpu = X86_CPU(cs); 7468 X86CPUClass *xcc = X86_CPU_GET_CLASS(obj); 7469 CPUX86State *env = &cpu->env; 7470 target_ulong cr4; 7471 uint64_t xcr0; 7472 int i; 7473 7474 if (xcc->parent_phases.hold) { 7475 xcc->parent_phases.hold(obj, type); 7476 } 7477 7478 memset(env, 0, offsetof(CPUX86State, end_reset_fields)); 7479 7480 if (tcg_enabled()) { 7481 cpu_init_fp_statuses(env); 7482 } 7483 7484 env->old_exception = -1; 7485 7486 /* init to reset state */ 7487 env->int_ctl = 0; 7488 env->hflags2 |= HF2_GIF_MASK; 7489 env->hflags2 |= HF2_VGIF_MASK; 7490 env->hflags &= ~HF_GUEST_MASK; 7491 7492 cpu_x86_update_cr0(env, 0x60000010); 7493 env->a20_mask = ~0x0; 7494 env->smbase = 0x30000; 7495 env->msr_smi_count = 0; 7496 7497 env->idt.limit = 0xffff; 7498 env->gdt.limit = 0xffff; 7499 env->ldt.limit = 0xffff; 7500 env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT); 7501 env->tr.limit = 0xffff; 7502 env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT); 7503 7504 cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff, 7505 DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK | 7506 DESC_R_MASK | DESC_A_MASK); 7507 cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff, 7508 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | 7509 DESC_A_MASK); 7510 cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff, 7511 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | 7512 DESC_A_MASK); 7513 cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff, 7514 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | 7515 DESC_A_MASK); 7516 cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff, 7517 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | 7518 DESC_A_MASK); 7519 cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff, 7520 DESC_P_MASK | DESC_S_MASK | DESC_W_MASK | 7521 DESC_A_MASK); 7522 7523 env->eip = 0xfff0; 7524 env->regs[R_EDX] = env->cpuid_version; 7525 7526 env->eflags = 0x2; 7527 7528 /* FPU init */ 7529 for (i = 0; i < 8; i++) { 7530 env->fptags[i] = 1; 7531 } 7532 cpu_set_fpuc(env, 0x37f); 7533 7534 env->mxcsr = 0x1f80; 7535 /* All units are in INIT state. */ 7536 env->xstate_bv = 0; 7537 7538 env->pat = 0x0007040600070406ULL; 7539 7540 if (kvm_enabled()) { 7541 /* 7542 * KVM handles TSC = 0 specially and thinks we are hot-plugging 7543 * a new CPU, use 1 instead to force a reset. 7544 */ 7545 if (env->tsc != 0) { 7546 env->tsc = 1; 7547 } 7548 } else { 7549 env->tsc = 0; 7550 } 7551 7552 env->msr_ia32_misc_enable = MSR_IA32_MISC_ENABLE_DEFAULT; 7553 if (env->features[FEAT_1_ECX] & CPUID_EXT_MONITOR) { 7554 env->msr_ia32_misc_enable |= MSR_IA32_MISC_ENABLE_MWAIT; 7555 } 7556 7557 memset(env->dr, 0, sizeof(env->dr)); 7558 env->dr[6] = DR6_FIXED_1; 7559 env->dr[7] = DR7_FIXED_1; 7560 cpu_breakpoint_remove_all(cs, BP_CPU); 7561 cpu_watchpoint_remove_all(cs, BP_CPU); 7562 7563 cr4 = 0; 7564 xcr0 = XSTATE_FP_MASK; 7565 7566 #ifdef CONFIG_USER_ONLY 7567 /* Enable all the features for user-mode. */ 7568 if (env->features[FEAT_1_EDX] & CPUID_SSE) { 7569 xcr0 |= XSTATE_SSE_MASK; 7570 } 7571 for (i = 2; i < ARRAY_SIZE(x86_ext_save_areas); i++) { 7572 const ExtSaveArea *esa = &x86_ext_save_areas[i]; 7573 if (!((1 << i) & CPUID_XSTATE_XCR0_MASK)) { 7574 continue; 7575 } 7576 if (cpuid_has_xsave_feature(env, esa)) { 7577 xcr0 |= 1ull << i; 7578 } 7579 } 7580 7581 if (env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE) { 7582 cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK; 7583 } 7584 if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_FSGSBASE) { 7585 cr4 |= CR4_FSGSBASE_MASK; 7586 } 7587 #endif 7588 7589 env->xcr0 = xcr0; 7590 cpu_x86_update_cr4(env, cr4); 7591 7592 /* 7593 * SDM 11.11.5 requires: 7594 * - IA32_MTRR_DEF_TYPE MSR.E = 0 7595 * - IA32_MTRR_PHYSMASKn.V = 0 7596 * All other bits are undefined. For simplification, zero it all. 7597 */ 7598 env->mtrr_deftype = 0; 7599 memset(env->mtrr_var, 0, sizeof(env->mtrr_var)); 7600 memset(env->mtrr_fixed, 0, sizeof(env->mtrr_fixed)); 7601 7602 env->interrupt_injected = -1; 7603 env->exception_nr = -1; 7604 env->exception_pending = 0; 7605 env->exception_injected = 0; 7606 env->exception_has_payload = false; 7607 env->exception_payload = 0; 7608 env->nmi_injected = false; 7609 env->triple_fault_pending = false; 7610 #if !defined(CONFIG_USER_ONLY) 7611 /* We hard-wire the BSP to the first CPU. */ 7612 apic_designate_bsp(cpu->apic_state, cs->cpu_index == 0); 7613 7614 cs->halted = !cpu_is_bsp(cpu); 7615 7616 if (kvm_enabled()) { 7617 kvm_arch_reset_vcpu(cpu); 7618 } 7619 7620 x86_cpu_set_sgxlepubkeyhash(env); 7621 7622 env->amd_tsc_scale_msr = MSR_AMD64_TSC_RATIO_DEFAULT; 7623 7624 #endif 7625 } 7626 7627 void x86_cpu_after_reset(X86CPU *cpu) 7628 { 7629 #ifndef CONFIG_USER_ONLY 7630 if (kvm_enabled()) { 7631 kvm_arch_after_reset_vcpu(cpu); 7632 } 7633 7634 if (cpu->apic_state) { 7635 device_cold_reset(cpu->apic_state); 7636 } 7637 #endif 7638 } 7639 7640 static void mce_init(X86CPU *cpu) 7641 { 7642 CPUX86State *cenv = &cpu->env; 7643 unsigned int bank; 7644 7645 if (((cenv->cpuid_version >> 8) & 0xf) >= 6 7646 && (cenv->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) == 7647 (CPUID_MCE | CPUID_MCA)) { 7648 cenv->mcg_cap = MCE_CAP_DEF | MCE_BANKS_DEF | 7649 (cpu->enable_lmce ? MCG_LMCE_P : 0); 7650 cenv->mcg_ctl = ~(uint64_t)0; 7651 for (bank = 0; bank < MCE_BANKS_DEF; bank++) { 7652 cenv->mce_banks[bank * 4] = ~(uint64_t)0; 7653 } 7654 } 7655 } 7656 7657 static void x86_cpu_adjust_level(X86CPU *cpu, uint32_t *min, uint32_t value) 7658 { 7659 if (*min < value) { 7660 *min = value; 7661 } 7662 } 7663 7664 /* Increase cpuid_min_{level,xlevel,xlevel2} automatically, if appropriate */ 7665 static void x86_cpu_adjust_feat_level(X86CPU *cpu, FeatureWord w) 7666 { 7667 CPUX86State *env = &cpu->env; 7668 FeatureWordInfo *fi = &feature_word_info[w]; 7669 uint32_t eax = fi->cpuid.eax; 7670 uint32_t region = eax & 0xF0000000; 7671 7672 assert(feature_word_info[w].type == CPUID_FEATURE_WORD); 7673 if (!env->features[w]) { 7674 return; 7675 } 7676 7677 switch (region) { 7678 case 0x00000000: 7679 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, eax); 7680 break; 7681 case 0x80000000: 7682 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, eax); 7683 break; 7684 case 0xC0000000: 7685 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel2, eax); 7686 break; 7687 } 7688 7689 if (eax == 7) { 7690 x86_cpu_adjust_level(cpu, &env->cpuid_min_level_func7, 7691 fi->cpuid.ecx); 7692 } 7693 } 7694 7695 /* Calculate XSAVE components based on the configured CPU feature flags */ 7696 static void x86_cpu_enable_xsave_components(X86CPU *cpu) 7697 { 7698 CPUX86State *env = &cpu->env; 7699 int i; 7700 uint64_t mask; 7701 static bool request_perm; 7702 7703 if (!(env->features[FEAT_1_ECX] & CPUID_EXT_XSAVE)) { 7704 env->features[FEAT_XSAVE_XCR0_LO] = 0; 7705 env->features[FEAT_XSAVE_XCR0_HI] = 0; 7706 env->features[FEAT_XSAVE_XSS_LO] = 0; 7707 env->features[FEAT_XSAVE_XSS_HI] = 0; 7708 return; 7709 } 7710 7711 mask = 0; 7712 for (i = 0; i < ARRAY_SIZE(x86_ext_save_areas); i++) { 7713 const ExtSaveArea *esa = &x86_ext_save_areas[i]; 7714 if (cpuid_has_xsave_feature(env, esa)) { 7715 mask |= (1ULL << i); 7716 } 7717 } 7718 7719 /* Only request permission for first vcpu */ 7720 if (kvm_enabled() && !request_perm) { 7721 kvm_request_xsave_components(cpu, mask); 7722 request_perm = true; 7723 } 7724 7725 env->features[FEAT_XSAVE_XCR0_LO] = mask & CPUID_XSTATE_XCR0_MASK; 7726 env->features[FEAT_XSAVE_XCR0_HI] = (mask & CPUID_XSTATE_XCR0_MASK) >> 32; 7727 env->features[FEAT_XSAVE_XSS_LO] = mask & CPUID_XSTATE_XSS_MASK; 7728 env->features[FEAT_XSAVE_XSS_HI] = (mask & CPUID_XSTATE_XSS_MASK) >> 32; 7729 } 7730 7731 /***** Steps involved on loading and filtering CPUID data 7732 * 7733 * When initializing and realizing a CPU object, the steps 7734 * involved in setting up CPUID data are: 7735 * 7736 * 1) Loading CPU model definition (X86CPUDefinition). This is 7737 * implemented by x86_cpu_load_model() and should be completely 7738 * transparent, as it is done automatically by instance_init. 7739 * No code should need to look at X86CPUDefinition structs 7740 * outside instance_init. 7741 * 7742 * 2) CPU expansion. This is done by realize before CPUID 7743 * filtering, and will make sure host/accelerator data is 7744 * loaded for CPU models that depend on host capabilities 7745 * (e.g. "host"). Done by x86_cpu_expand_features(). 7746 * 7747 * 3) CPUID filtering. This initializes extra data related to 7748 * CPUID, and checks if the host supports all capabilities 7749 * required by the CPU. Runnability of a CPU model is 7750 * determined at this step. Done by x86_cpu_filter_features(). 7751 * 7752 * Some operations don't require all steps to be performed. 7753 * More precisely: 7754 * 7755 * - CPU instance creation (instance_init) will run only CPU 7756 * model loading. CPU expansion can't run at instance_init-time 7757 * because host/accelerator data may be not available yet. 7758 * - CPU realization will perform both CPU model expansion and CPUID 7759 * filtering, and return an error in case one of them fails. 7760 * - query-cpu-definitions needs to run all 3 steps. It needs 7761 * to run CPUID filtering, as the 'unavailable-features' 7762 * field is set based on the filtering results. 7763 * - The query-cpu-model-expansion QMP command only needs to run 7764 * CPU model loading and CPU expansion. It should not filter 7765 * any CPUID data based on host capabilities. 7766 */ 7767 7768 /* Expand CPU configuration data, based on configured features 7769 * and host/accelerator capabilities when appropriate. 7770 */ 7771 void x86_cpu_expand_features(X86CPU *cpu, Error **errp) 7772 { 7773 CPUX86State *env = &cpu->env; 7774 FeatureWord w; 7775 int i; 7776 GList *l; 7777 7778 for (l = plus_features; l; l = l->next) { 7779 const char *prop = l->data; 7780 if (!object_property_set_bool(OBJECT(cpu), prop, true, errp)) { 7781 return; 7782 } 7783 } 7784 7785 for (l = minus_features; l; l = l->next) { 7786 const char *prop = l->data; 7787 if (!object_property_set_bool(OBJECT(cpu), prop, false, errp)) { 7788 return; 7789 } 7790 } 7791 7792 /*TODO: Now cpu->max_features doesn't overwrite features 7793 * set using QOM properties, and we can convert 7794 * plus_features & minus_features to global properties 7795 * inside x86_cpu_parse_featurestr() too. 7796 */ 7797 if (cpu->max_features) { 7798 for (w = 0; w < FEATURE_WORDS; w++) { 7799 /* Override only features that weren't set explicitly 7800 * by the user. 7801 */ 7802 env->features[w] |= 7803 x86_cpu_get_supported_feature_word(cpu, w) & 7804 ~env->user_features[w] & 7805 ~feature_word_info[w].no_autoenable_flags; 7806 } 7807 7808 if ((env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10) && !env->avx10_version) { 7809 uint32_t eax, ebx, ecx, edx; 7810 x86_cpu_get_supported_cpuid(0x24, 0, &eax, &ebx, &ecx, &edx); 7811 env->avx10_version = ebx & 0xff; 7812 } 7813 } 7814 7815 if (x86_threads_per_pkg(&env->topo_info) > 1) { 7816 env->features[FEAT_1_EDX] |= CPUID_HT; 7817 7818 /* 7819 * The Linux kernel checks for the CMPLegacy bit and 7820 * discards multiple thread information if it is set. 7821 * So don't set it here for Intel (and other processors 7822 * following Intel's behavior) to make Linux guests happy. 7823 */ 7824 if (!IS_INTEL_CPU(env) && !IS_ZHAOXIN_CPU(env)) { 7825 env->features[FEAT_8000_0001_ECX] |= CPUID_EXT3_CMP_LEG; 7826 } 7827 } 7828 7829 for (i = 0; i < ARRAY_SIZE(feature_dependencies); i++) { 7830 FeatureDep *d = &feature_dependencies[i]; 7831 if (!(env->features[d->from.index] & d->from.mask)) { 7832 uint64_t unavailable_features = env->features[d->to.index] & d->to.mask; 7833 7834 /* Not an error unless the dependent feature was added explicitly. */ 7835 mark_unavailable_features(cpu, d->to.index, 7836 unavailable_features & env->user_features[d->to.index], 7837 "This feature depends on other features that were not requested"); 7838 7839 env->features[d->to.index] &= ~unavailable_features; 7840 } 7841 } 7842 7843 if (!kvm_enabled() || !cpu->expose_kvm) { 7844 env->features[FEAT_KVM] = 0; 7845 } 7846 7847 x86_cpu_enable_xsave_components(cpu); 7848 7849 /* CPUID[EAX=7,ECX=0].EBX always increased level automatically: */ 7850 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_EBX); 7851 if (cpu->full_cpuid_auto_level) { 7852 x86_cpu_adjust_feat_level(cpu, FEAT_1_EDX); 7853 x86_cpu_adjust_feat_level(cpu, FEAT_1_ECX); 7854 x86_cpu_adjust_feat_level(cpu, FEAT_6_EAX); 7855 x86_cpu_adjust_feat_level(cpu, FEAT_7_0_ECX); 7856 x86_cpu_adjust_feat_level(cpu, FEAT_7_1_EAX); 7857 x86_cpu_adjust_feat_level(cpu, FEAT_7_1_EDX); 7858 x86_cpu_adjust_feat_level(cpu, FEAT_7_2_EDX); 7859 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_EDX); 7860 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0001_ECX); 7861 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0007_EDX); 7862 x86_cpu_adjust_feat_level(cpu, FEAT_8000_0008_EBX); 7863 x86_cpu_adjust_feat_level(cpu, FEAT_C000_0001_EDX); 7864 x86_cpu_adjust_feat_level(cpu, FEAT_SVM); 7865 x86_cpu_adjust_feat_level(cpu, FEAT_XSAVE); 7866 7867 /* Intel Processor Trace requires CPUID[0x14] */ 7868 if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT)) { 7869 if (cpu->intel_pt_auto_level) { 7870 x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14); 7871 } else if (cpu->env.cpuid_min_level < 0x14) { 7872 mark_unavailable_features(cpu, FEAT_7_0_EBX, 7873 CPUID_7_0_EBX_INTEL_PT, 7874 "Intel PT need CPUID leaf 0x14, please set by \"-cpu ...,intel-pt=on,min-level=0x14\""); 7875 } 7876 } 7877 7878 /* 7879 * Intel CPU topology with multi-dies support requires CPUID[0x1F]. 7880 * For AMD Rome/Milan, cpuid level is 0x10, and guest OS should detect 7881 * extended toplogy by leaf 0xB. Only adjust it for Intel CPU, unless 7882 * cpu->vendor_cpuid_only has been unset for compatibility with older 7883 * machine types. 7884 */ 7885 if (x86_has_extended_topo(env->avail_cpu_topo) && 7886 (IS_INTEL_CPU(env) || !cpu->vendor_cpuid_only)) { 7887 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x1F); 7888 } 7889 7890 /* Advanced Vector Extensions 10 (AVX10) requires CPUID[0x24] */ 7891 if (env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10) { 7892 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x24); 7893 } 7894 7895 /* SVM requires CPUID[0x8000000A] */ 7896 if (env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_SVM) { 7897 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000000A); 7898 } 7899 7900 /* SEV requires CPUID[0x8000001F] */ 7901 if (sev_enabled()) { 7902 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x8000001F); 7903 } 7904 7905 if (env->features[FEAT_8000_0021_EAX]) { 7906 x86_cpu_adjust_level(cpu, &env->cpuid_min_xlevel, 0x80000021); 7907 } 7908 7909 /* SGX requires CPUID[0x12] for EPC enumeration */ 7910 if (env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_SGX) { 7911 x86_cpu_adjust_level(cpu, &env->cpuid_min_level, 0x12); 7912 } 7913 } 7914 7915 /* Set cpuid_*level* based on cpuid_min_*level, if not explicitly set */ 7916 if (env->cpuid_level_func7 == UINT32_MAX) { 7917 env->cpuid_level_func7 = env->cpuid_min_level_func7; 7918 } 7919 if (env->cpuid_level == UINT32_MAX) { 7920 env->cpuid_level = env->cpuid_min_level; 7921 } 7922 if (env->cpuid_xlevel == UINT32_MAX) { 7923 env->cpuid_xlevel = env->cpuid_min_xlevel; 7924 } 7925 if (env->cpuid_xlevel2 == UINT32_MAX) { 7926 env->cpuid_xlevel2 = env->cpuid_min_xlevel2; 7927 } 7928 7929 if (kvm_enabled() && !kvm_hyperv_expand_features(cpu, errp)) { 7930 return; 7931 } 7932 } 7933 7934 /* 7935 * Finishes initialization of CPUID data, filters CPU feature 7936 * words based on host availability of each feature. 7937 * 7938 * Returns: true if any flag is not supported by the host, false otherwise. 7939 */ 7940 static bool x86_cpu_filter_features(X86CPU *cpu, bool verbose) 7941 { 7942 CPUX86State *env = &cpu->env; 7943 FeatureWord w; 7944 const char *prefix = NULL; 7945 bool have_filtered_features; 7946 7947 uint32_t eax_0, ebx_0, ecx_0, edx_0; 7948 uint32_t eax_1, ebx_1, ecx_1, edx_1; 7949 7950 if (verbose) { 7951 prefix = accel_uses_host_cpuid() 7952 ? "host doesn't support requested feature" 7953 : "TCG doesn't support requested feature"; 7954 } 7955 7956 for (w = 0; w < FEATURE_WORDS; w++) { 7957 uint64_t host_feat = 7958 x86_cpu_get_supported_feature_word(NULL, w); 7959 uint64_t requested_features = env->features[w]; 7960 uint64_t unavailable_features = requested_features & ~host_feat; 7961 mark_unavailable_features(cpu, w, unavailable_features, prefix); 7962 } 7963 7964 /* 7965 * Check that KVM actually allows the processor tracing features that 7966 * are advertised by cpu_x86_cpuid(). Keep these two in sync. 7967 */ 7968 if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) && 7969 kvm_enabled()) { 7970 x86_cpu_get_supported_cpuid(0x14, 0, 7971 &eax_0, &ebx_0, &ecx_0, &edx_0); 7972 x86_cpu_get_supported_cpuid(0x14, 1, 7973 &eax_1, &ebx_1, &ecx_1, &edx_1); 7974 7975 if (!eax_0 || 7976 ((ebx_0 & INTEL_PT_MINIMAL_EBX) != INTEL_PT_MINIMAL_EBX) || 7977 ((ecx_0 & INTEL_PT_MINIMAL_ECX) != INTEL_PT_MINIMAL_ECX) || 7978 ((eax_1 & INTEL_PT_MTC_BITMAP) != INTEL_PT_MTC_BITMAP) || 7979 ((eax_1 & INTEL_PT_ADDR_RANGES_NUM_MASK) < 7980 INTEL_PT_ADDR_RANGES_NUM) || 7981 ((ebx_1 & (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) != 7982 (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) || 7983 ((ecx_0 & CPUID_14_0_ECX_LIP) != 7984 (env->features[FEAT_14_0_ECX] & CPUID_14_0_ECX_LIP))) { 7985 /* 7986 * Processor Trace capabilities aren't configurable, so if the 7987 * host can't emulate the capabilities we report on 7988 * cpu_x86_cpuid(), intel-pt can't be enabled on the current host. 7989 */ 7990 mark_unavailable_features(cpu, FEAT_7_0_EBX, CPUID_7_0_EBX_INTEL_PT, prefix); 7991 } 7992 } 7993 7994 have_filtered_features = x86_cpu_have_filtered_features(cpu); 7995 7996 if (env->features[FEAT_7_1_EDX] & CPUID_7_1_EDX_AVX10) { 7997 x86_cpu_get_supported_cpuid(0x24, 0, 7998 &eax_0, &ebx_0, &ecx_0, &edx_0); 7999 uint8_t version = ebx_0 & 0xff; 8000 8001 if (version < env->avx10_version) { 8002 if (prefix) { 8003 warn_report("%s: avx10.%d. Adjust to avx10.%d", 8004 prefix, env->avx10_version, version); 8005 } 8006 env->avx10_version = version; 8007 have_filtered_features = true; 8008 } 8009 } else if (env->avx10_version) { 8010 if (prefix) { 8011 warn_report("%s: avx10.%d.", prefix, env->avx10_version); 8012 } 8013 have_filtered_features = true; 8014 } 8015 8016 return have_filtered_features; 8017 } 8018 8019 static void x86_cpu_hyperv_realize(X86CPU *cpu) 8020 { 8021 size_t len; 8022 8023 /* Hyper-V vendor id */ 8024 if (!cpu->hyperv_vendor) { 8025 object_property_set_str(OBJECT(cpu), "hv-vendor-id", "Microsoft Hv", 8026 &error_abort); 8027 } 8028 len = strlen(cpu->hyperv_vendor); 8029 if (len > 12) { 8030 warn_report("hv-vendor-id truncated to 12 characters"); 8031 len = 12; 8032 } 8033 memset(cpu->hyperv_vendor_id, 0, 12); 8034 memcpy(cpu->hyperv_vendor_id, cpu->hyperv_vendor, len); 8035 8036 /* 'Hv#1' interface identification*/ 8037 cpu->hyperv_interface_id[0] = 0x31237648; 8038 cpu->hyperv_interface_id[1] = 0; 8039 cpu->hyperv_interface_id[2] = 0; 8040 cpu->hyperv_interface_id[3] = 0; 8041 8042 /* Hypervisor implementation limits */ 8043 cpu->hyperv_limits[0] = 64; 8044 cpu->hyperv_limits[1] = 0; 8045 cpu->hyperv_limits[2] = 0; 8046 } 8047 8048 #ifndef CONFIG_USER_ONLY 8049 static bool x86_cpu_update_smp_cache_topo(MachineState *ms, X86CPU *cpu, 8050 Error **errp) 8051 { 8052 CPUX86State *env = &cpu->env; 8053 CpuTopologyLevel level; 8054 8055 level = machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1D); 8056 if (level != CPU_TOPOLOGY_LEVEL_DEFAULT) { 8057 env->cache_info_cpuid4.l1d_cache->share_level = level; 8058 env->cache_info_amd.l1d_cache->share_level = level; 8059 } else { 8060 machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1D, 8061 env->cache_info_cpuid4.l1d_cache->share_level); 8062 machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1D, 8063 env->cache_info_amd.l1d_cache->share_level); 8064 } 8065 8066 level = machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1I); 8067 if (level != CPU_TOPOLOGY_LEVEL_DEFAULT) { 8068 env->cache_info_cpuid4.l1i_cache->share_level = level; 8069 env->cache_info_amd.l1i_cache->share_level = level; 8070 } else { 8071 machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1I, 8072 env->cache_info_cpuid4.l1i_cache->share_level); 8073 machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L1I, 8074 env->cache_info_amd.l1i_cache->share_level); 8075 } 8076 8077 level = machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L2); 8078 if (level != CPU_TOPOLOGY_LEVEL_DEFAULT) { 8079 env->cache_info_cpuid4.l2_cache->share_level = level; 8080 env->cache_info_amd.l2_cache->share_level = level; 8081 } else { 8082 machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L2, 8083 env->cache_info_cpuid4.l2_cache->share_level); 8084 machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L2, 8085 env->cache_info_amd.l2_cache->share_level); 8086 } 8087 8088 level = machine_get_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L3); 8089 if (level != CPU_TOPOLOGY_LEVEL_DEFAULT) { 8090 env->cache_info_cpuid4.l3_cache->share_level = level; 8091 env->cache_info_amd.l3_cache->share_level = level; 8092 } else { 8093 machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L3, 8094 env->cache_info_cpuid4.l3_cache->share_level); 8095 machine_set_cache_topo_level(ms, CACHE_LEVEL_AND_TYPE_L3, 8096 env->cache_info_amd.l3_cache->share_level); 8097 } 8098 8099 if (!machine_check_smp_cache(ms, errp)) { 8100 return false; 8101 } 8102 return true; 8103 } 8104 #endif 8105 8106 static void x86_cpu_realizefn(DeviceState *dev, Error **errp) 8107 { 8108 CPUState *cs = CPU(dev); 8109 X86CPU *cpu = X86_CPU(dev); 8110 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev); 8111 CPUX86State *env = &cpu->env; 8112 Error *local_err = NULL; 8113 unsigned requested_lbr_fmt; 8114 8115 #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY) 8116 /* Use pc-relative instructions in system-mode */ 8117 tcg_cflags_set(cs, CF_PCREL); 8118 #endif 8119 8120 if (cpu->apic_id == UNASSIGNED_APIC_ID) { 8121 error_setg(errp, "apic-id property was not initialized properly"); 8122 return; 8123 } 8124 8125 /* 8126 * Process Hyper-V enlightenments. 8127 * Note: this currently has to happen before the expansion of CPU features. 8128 */ 8129 x86_cpu_hyperv_realize(cpu); 8130 8131 x86_cpu_expand_features(cpu, &local_err); 8132 if (local_err) { 8133 goto out; 8134 } 8135 8136 /* 8137 * Override env->features[FEAT_PERF_CAPABILITIES].LBR_FMT 8138 * with user-provided setting. 8139 */ 8140 if (cpu->lbr_fmt != ~PERF_CAP_LBR_FMT) { 8141 if ((cpu->lbr_fmt & PERF_CAP_LBR_FMT) != cpu->lbr_fmt) { 8142 error_setg(errp, "invalid lbr-fmt"); 8143 return; 8144 } 8145 env->features[FEAT_PERF_CAPABILITIES] &= ~PERF_CAP_LBR_FMT; 8146 env->features[FEAT_PERF_CAPABILITIES] |= cpu->lbr_fmt; 8147 } 8148 8149 /* 8150 * vPMU LBR is supported when 1) KVM is enabled 2) Option pmu=on and 8151 * 3)vPMU LBR format matches that of host setting. 8152 */ 8153 requested_lbr_fmt = 8154 env->features[FEAT_PERF_CAPABILITIES] & PERF_CAP_LBR_FMT; 8155 if (requested_lbr_fmt && kvm_enabled()) { 8156 uint64_t host_perf_cap = 8157 x86_cpu_get_supported_feature_word(NULL, FEAT_PERF_CAPABILITIES); 8158 unsigned host_lbr_fmt = host_perf_cap & PERF_CAP_LBR_FMT; 8159 8160 if (!cpu->enable_pmu) { 8161 error_setg(errp, "vPMU: LBR is unsupported without pmu=on"); 8162 return; 8163 } 8164 if (requested_lbr_fmt != host_lbr_fmt) { 8165 error_setg(errp, "vPMU: the lbr-fmt value (0x%x) does not match " 8166 "the host value (0x%x).", 8167 requested_lbr_fmt, host_lbr_fmt); 8168 return; 8169 } 8170 } 8171 8172 if (x86_cpu_filter_features(cpu, cpu->check_cpuid || cpu->enforce_cpuid)) { 8173 if (cpu->enforce_cpuid) { 8174 error_setg(&local_err, 8175 accel_uses_host_cpuid() ? 8176 "Host doesn't support requested features" : 8177 "TCG doesn't support requested features"); 8178 goto out; 8179 } 8180 } 8181 8182 /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on 8183 * CPUID[1].EDX. 8184 */ 8185 if (IS_AMD_CPU(env)) { 8186 env->features[FEAT_8000_0001_EDX] &= ~CPUID_EXT2_AMD_ALIASES; 8187 env->features[FEAT_8000_0001_EDX] |= (env->features[FEAT_1_EDX] 8188 & CPUID_EXT2_AMD_ALIASES); 8189 } 8190 8191 x86_cpu_set_sgxlepubkeyhash(env); 8192 8193 /* 8194 * note: the call to the framework needs to happen after feature expansion, 8195 * but before the checks/modifications to ucode_rev, mwait, phys_bits. 8196 * These may be set by the accel-specific code, 8197 * and the results are subsequently checked / assumed in this function. 8198 */ 8199 cpu_exec_realizefn(cs, &local_err); 8200 if (local_err != NULL) { 8201 error_propagate(errp, local_err); 8202 return; 8203 } 8204 8205 if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) { 8206 g_autofree char *name = x86_cpu_class_get_model_name(xcc); 8207 error_setg(&local_err, "CPU model '%s' requires KVM or HVF", name); 8208 goto out; 8209 } 8210 8211 if (cpu->guest_phys_bits == -1) { 8212 /* 8213 * If it was not set by the user, or by the accelerator via 8214 * cpu_exec_realizefn, clear. 8215 */ 8216 cpu->guest_phys_bits = 0; 8217 } 8218 8219 if (cpu->ucode_rev == 0) { 8220 /* 8221 * The default is the same as KVM's. Note that this check 8222 * needs to happen after the evenual setting of ucode_rev in 8223 * accel-specific code in cpu_exec_realizefn. 8224 */ 8225 if (IS_AMD_CPU(env)) { 8226 cpu->ucode_rev = 0x01000065; 8227 } else { 8228 cpu->ucode_rev = 0x100000000ULL; 8229 } 8230 } 8231 8232 /* 8233 * mwait extended info: needed for Core compatibility 8234 * We always wake on interrupt even if host does not have the capability. 8235 * 8236 * requires the accel-specific code in cpu_exec_realizefn to 8237 * have already acquired the CPUID data into cpu->mwait. 8238 */ 8239 cpu->mwait.ecx |= CPUID_MWAIT_EMX | CPUID_MWAIT_IBE; 8240 8241 /* 8242 * Most Intel and certain AMD CPUs support hyperthreading. Even though QEMU 8243 * fixes this issue by adjusting CPUID_0000_0001_EBX and CPUID_8000_0008_ECX 8244 * based on inputs (sockets,cores,threads), it is still better to give 8245 * users a warning. 8246 */ 8247 if (IS_AMD_CPU(env) && 8248 !(env->features[FEAT_8000_0001_ECX] & CPUID_EXT3_TOPOEXT) && 8249 env->topo_info.threads_per_core > 1) { 8250 warn_report_once("This family of AMD CPU doesn't support " 8251 "hyperthreading(%d). Please configure -smp " 8252 "options properly or try enabling topoext " 8253 "feature.", env->topo_info.threads_per_core); 8254 } 8255 8256 /* For 64bit systems think about the number of physical bits to present. 8257 * ideally this should be the same as the host; anything other than matching 8258 * the host can cause incorrect guest behaviour. 8259 * QEMU used to pick the magic value of 40 bits that corresponds to 8260 * consumer AMD devices but nothing else. 8261 * 8262 * Note that this code assumes features expansion has already been done 8263 * (as it checks for CPUID_EXT2_LM), and also assumes that potential 8264 * phys_bits adjustments to match the host have been already done in 8265 * accel-specific code in cpu_exec_realizefn. 8266 */ 8267 if (env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_LM) { 8268 if (cpu->phys_bits && 8269 (cpu->phys_bits > TARGET_PHYS_ADDR_SPACE_BITS || 8270 cpu->phys_bits < 32)) { 8271 error_setg(errp, "phys-bits should be between 32 and %u " 8272 " (but is %u)", 8273 TARGET_PHYS_ADDR_SPACE_BITS, cpu->phys_bits); 8274 return; 8275 } 8276 /* 8277 * 0 means it was not explicitly set by the user (or by machine 8278 * compat_props or by the host code in host-cpu.c). 8279 * In this case, the default is the value used by TCG (40). 8280 */ 8281 if (cpu->phys_bits == 0) { 8282 cpu->phys_bits = TCG_PHYS_ADDR_BITS; 8283 } 8284 if (cpu->guest_phys_bits && 8285 (cpu->guest_phys_bits > cpu->phys_bits || 8286 cpu->guest_phys_bits < 32)) { 8287 error_setg(errp, "guest-phys-bits should be between 32 and %u " 8288 " (but is %u)", 8289 cpu->phys_bits, cpu->guest_phys_bits); 8290 return; 8291 } 8292 } else { 8293 /* For 32 bit systems don't use the user set value, but keep 8294 * phys_bits consistent with what we tell the guest. 8295 */ 8296 if (cpu->phys_bits != 0) { 8297 error_setg(errp, "phys-bits is not user-configurable in 32 bit"); 8298 return; 8299 } 8300 if (cpu->guest_phys_bits != 0) { 8301 error_setg(errp, "guest-phys-bits is not user-configurable in 32 bit"); 8302 return; 8303 } 8304 8305 if (env->features[FEAT_1_EDX] & (CPUID_PSE36 | CPUID_PAE)) { 8306 cpu->phys_bits = 36; 8307 } else { 8308 cpu->phys_bits = 32; 8309 } 8310 } 8311 8312 /* Cache information initialization */ 8313 if (!cpu->legacy_cache) { 8314 const CPUCaches *cache_info = 8315 x86_cpu_get_versioned_cache_info(cpu, xcc->model); 8316 8317 if (!xcc->model || !cache_info) { 8318 g_autofree char *name = x86_cpu_class_get_model_name(xcc); 8319 error_setg(errp, 8320 "CPU model '%s' doesn't support legacy-cache=off", name); 8321 return; 8322 } 8323 env->cache_info_cpuid2 = env->cache_info_cpuid4 = env->cache_info_amd = 8324 *cache_info; 8325 } else { 8326 /* Build legacy cache information */ 8327 env->cache_info_cpuid2.l1d_cache = &legacy_l1d_cache; 8328 env->cache_info_cpuid2.l1i_cache = &legacy_l1i_cache; 8329 env->cache_info_cpuid2.l2_cache = &legacy_l2_cache_cpuid2; 8330 env->cache_info_cpuid2.l3_cache = &legacy_l3_cache; 8331 8332 env->cache_info_cpuid4.l1d_cache = &legacy_l1d_cache; 8333 env->cache_info_cpuid4.l1i_cache = &legacy_l1i_cache; 8334 env->cache_info_cpuid4.l2_cache = &legacy_l2_cache; 8335 env->cache_info_cpuid4.l3_cache = &legacy_l3_cache; 8336 8337 env->cache_info_amd.l1d_cache = &legacy_l1d_cache_amd; 8338 env->cache_info_amd.l1i_cache = &legacy_l1i_cache_amd; 8339 env->cache_info_amd.l2_cache = &legacy_l2_cache_amd; 8340 env->cache_info_amd.l3_cache = &legacy_l3_cache; 8341 } 8342 8343 #ifndef CONFIG_USER_ONLY 8344 MachineState *ms = MACHINE(qdev_get_machine()); 8345 MachineClass *mc = MACHINE_GET_CLASS(ms); 8346 8347 if (mc->smp_props.has_caches) { 8348 if (!x86_cpu_update_smp_cache_topo(ms, cpu, errp)) { 8349 return; 8350 } 8351 } 8352 8353 qemu_register_reset(x86_cpu_machine_reset_cb, cpu); 8354 8355 if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || ms->smp.cpus > 1) { 8356 x86_cpu_apic_create(cpu, &local_err); 8357 if (local_err != NULL) { 8358 goto out; 8359 } 8360 } 8361 #endif 8362 8363 mce_init(cpu); 8364 8365 x86_cpu_gdb_init(cs); 8366 qemu_init_vcpu(cs); 8367 8368 #ifndef CONFIG_USER_ONLY 8369 x86_cpu_apic_realize(cpu, &local_err); 8370 if (local_err != NULL) { 8371 goto out; 8372 } 8373 #endif /* !CONFIG_USER_ONLY */ 8374 cpu_reset(cs); 8375 8376 xcc->parent_realize(dev, &local_err); 8377 8378 out: 8379 if (local_err != NULL) { 8380 error_propagate(errp, local_err); 8381 return; 8382 } 8383 } 8384 8385 static void x86_cpu_unrealizefn(DeviceState *dev) 8386 { 8387 X86CPU *cpu = X86_CPU(dev); 8388 X86CPUClass *xcc = X86_CPU_GET_CLASS(dev); 8389 8390 #ifndef CONFIG_USER_ONLY 8391 cpu_remove_sync(CPU(dev)); 8392 qemu_unregister_reset(x86_cpu_machine_reset_cb, dev); 8393 #endif 8394 8395 if (cpu->apic_state) { 8396 object_unparent(OBJECT(cpu->apic_state)); 8397 cpu->apic_state = NULL; 8398 } 8399 8400 xcc->parent_unrealize(dev); 8401 } 8402 8403 typedef struct BitProperty { 8404 FeatureWord w; 8405 uint64_t mask; 8406 } BitProperty; 8407 8408 static void x86_cpu_get_bit_prop(Object *obj, Visitor *v, const char *name, 8409 void *opaque, Error **errp) 8410 { 8411 X86CPU *cpu = X86_CPU(obj); 8412 BitProperty *fp = opaque; 8413 uint64_t f = cpu->env.features[fp->w]; 8414 bool value = (f & fp->mask) == fp->mask; 8415 visit_type_bool(v, name, &value, errp); 8416 } 8417 8418 static void x86_cpu_set_bit_prop(Object *obj, Visitor *v, const char *name, 8419 void *opaque, Error **errp) 8420 { 8421 DeviceState *dev = DEVICE(obj); 8422 X86CPU *cpu = X86_CPU(obj); 8423 BitProperty *fp = opaque; 8424 bool value; 8425 8426 if (dev->realized) { 8427 qdev_prop_set_after_realize(dev, name, errp); 8428 return; 8429 } 8430 8431 if (!visit_type_bool(v, name, &value, errp)) { 8432 return; 8433 } 8434 8435 if (value) { 8436 cpu->env.features[fp->w] |= fp->mask; 8437 } else { 8438 cpu->env.features[fp->w] &= ~fp->mask; 8439 } 8440 cpu->env.user_features[fp->w] |= fp->mask; 8441 } 8442 8443 /* Register a boolean property to get/set a single bit in a uint32_t field. 8444 * 8445 * The same property name can be registered multiple times to make it affect 8446 * multiple bits in the same FeatureWord. In that case, the getter will return 8447 * true only if all bits are set. 8448 */ 8449 static void x86_cpu_register_bit_prop(X86CPUClass *xcc, 8450 const char *prop_name, 8451 FeatureWord w, 8452 int bitnr) 8453 { 8454 ObjectClass *oc = OBJECT_CLASS(xcc); 8455 BitProperty *fp; 8456 ObjectProperty *op; 8457 uint64_t mask = (1ULL << bitnr); 8458 8459 op = object_class_property_find(oc, prop_name); 8460 if (op) { 8461 fp = op->opaque; 8462 assert(fp->w == w); 8463 fp->mask |= mask; 8464 } else { 8465 fp = g_new0(BitProperty, 1); 8466 fp->w = w; 8467 fp->mask = mask; 8468 object_class_property_add(oc, prop_name, "bool", 8469 x86_cpu_get_bit_prop, 8470 x86_cpu_set_bit_prop, 8471 NULL, fp); 8472 } 8473 } 8474 8475 static void x86_cpu_register_feature_bit_props(X86CPUClass *xcc, 8476 FeatureWord w, 8477 int bitnr) 8478 { 8479 FeatureWordInfo *fi = &feature_word_info[w]; 8480 const char *name = fi->feat_names[bitnr]; 8481 8482 if (!name) { 8483 return; 8484 } 8485 8486 /* Property names should use "-" instead of "_". 8487 * Old names containing underscores are registered as aliases 8488 * using object_property_add_alias() 8489 */ 8490 assert(!strchr(name, '_')); 8491 /* aliases don't use "|" delimiters anymore, they are registered 8492 * manually using object_property_add_alias() */ 8493 assert(!strchr(name, '|')); 8494 x86_cpu_register_bit_prop(xcc, name, w, bitnr); 8495 } 8496 8497 static void x86_cpu_post_initfn(Object *obj) 8498 { 8499 static bool first = true; 8500 uint64_t supported_xcr0; 8501 int i; 8502 8503 if (first) { 8504 first = false; 8505 8506 supported_xcr0 = 8507 ((uint64_t) x86_cpu_get_supported_feature_word(NULL, FEAT_XSAVE_XCR0_HI) << 32) | 8508 x86_cpu_get_supported_feature_word(NULL, FEAT_XSAVE_XCR0_LO); 8509 8510 for (i = XSTATE_SSE_BIT + 1; i < XSAVE_STATE_AREA_COUNT; i++) { 8511 ExtSaveArea *esa = &x86_ext_save_areas[i]; 8512 8513 if (!(supported_xcr0 & (1 << i))) { 8514 esa->size = 0; 8515 } 8516 } 8517 } 8518 8519 accel_cpu_instance_init(CPU(obj)); 8520 } 8521 8522 static void x86_cpu_init_default_topo(X86CPU *cpu) 8523 { 8524 CPUX86State *env = &cpu->env; 8525 8526 env->topo_info = (X86CPUTopoInfo) {1, 1, 1, 1}; 8527 8528 /* thread, core and socket levels are set by default. */ 8529 set_bit(CPU_TOPOLOGY_LEVEL_THREAD, env->avail_cpu_topo); 8530 set_bit(CPU_TOPOLOGY_LEVEL_CORE, env->avail_cpu_topo); 8531 set_bit(CPU_TOPOLOGY_LEVEL_SOCKET, env->avail_cpu_topo); 8532 } 8533 8534 static void x86_cpu_initfn(Object *obj) 8535 { 8536 X86CPU *cpu = X86_CPU(obj); 8537 X86CPUClass *xcc = X86_CPU_GET_CLASS(obj); 8538 CPUX86State *env = &cpu->env; 8539 8540 x86_cpu_init_default_topo(cpu); 8541 8542 object_property_add(obj, "feature-words", "X86CPUFeatureWordInfo", 8543 x86_cpu_get_feature_words, 8544 NULL, NULL, (void *)env->features); 8545 object_property_add(obj, "filtered-features", "X86CPUFeatureWordInfo", 8546 x86_cpu_get_feature_words, 8547 NULL, NULL, (void *)cpu->filtered_features); 8548 8549 object_property_add_alias(obj, "sse3", obj, "pni"); 8550 object_property_add_alias(obj, "pclmuldq", obj, "pclmulqdq"); 8551 object_property_add_alias(obj, "sse4-1", obj, "sse4.1"); 8552 object_property_add_alias(obj, "sse4-2", obj, "sse4.2"); 8553 object_property_add_alias(obj, "xd", obj, "nx"); 8554 object_property_add_alias(obj, "ffxsr", obj, "fxsr-opt"); 8555 object_property_add_alias(obj, "i64", obj, "lm"); 8556 8557 object_property_add_alias(obj, "ds_cpl", obj, "ds-cpl"); 8558 object_property_add_alias(obj, "tsc_adjust", obj, "tsc-adjust"); 8559 object_property_add_alias(obj, "fxsr_opt", obj, "fxsr-opt"); 8560 object_property_add_alias(obj, "lahf_lm", obj, "lahf-lm"); 8561 object_property_add_alias(obj, "cmp_legacy", obj, "cmp-legacy"); 8562 object_property_add_alias(obj, "nodeid_msr", obj, "nodeid-msr"); 8563 object_property_add_alias(obj, "perfctr_core", obj, "perfctr-core"); 8564 object_property_add_alias(obj, "perfctr_nb", obj, "perfctr-nb"); 8565 object_property_add_alias(obj, "kvm_nopiodelay", obj, "kvm-nopiodelay"); 8566 object_property_add_alias(obj, "kvm_mmu", obj, "kvm-mmu"); 8567 object_property_add_alias(obj, "kvm_asyncpf", obj, "kvm-asyncpf"); 8568 object_property_add_alias(obj, "kvm_asyncpf_int", obj, "kvm-asyncpf-int"); 8569 object_property_add_alias(obj, "kvm_steal_time", obj, "kvm-steal-time"); 8570 object_property_add_alias(obj, "kvm_pv_eoi", obj, "kvm-pv-eoi"); 8571 object_property_add_alias(obj, "kvm_pv_unhalt", obj, "kvm-pv-unhalt"); 8572 object_property_add_alias(obj, "kvm_poll_control", obj, "kvm-poll-control"); 8573 object_property_add_alias(obj, "svm_lock", obj, "svm-lock"); 8574 object_property_add_alias(obj, "nrip_save", obj, "nrip-save"); 8575 object_property_add_alias(obj, "tsc_scale", obj, "tsc-scale"); 8576 object_property_add_alias(obj, "vmcb_clean", obj, "vmcb-clean"); 8577 object_property_add_alias(obj, "pause_filter", obj, "pause-filter"); 8578 object_property_add_alias(obj, "sse4_1", obj, "sse4.1"); 8579 object_property_add_alias(obj, "sse4_2", obj, "sse4.2"); 8580 8581 object_property_add_alias(obj, "hv-apicv", obj, "hv-avic"); 8582 cpu->lbr_fmt = ~PERF_CAP_LBR_FMT; 8583 object_property_add_alias(obj, "lbr_fmt", obj, "lbr-fmt"); 8584 8585 if (xcc->model) { 8586 x86_cpu_load_model(cpu, xcc->model); 8587 } 8588 } 8589 8590 static int64_t x86_cpu_get_arch_id(CPUState *cs) 8591 { 8592 X86CPU *cpu = X86_CPU(cs); 8593 8594 return cpu->apic_id; 8595 } 8596 8597 #if !defined(CONFIG_USER_ONLY) 8598 static bool x86_cpu_get_paging_enabled(const CPUState *cs) 8599 { 8600 X86CPU *cpu = X86_CPU(cs); 8601 8602 return cpu->env.cr[0] & CR0_PG_MASK; 8603 } 8604 #endif /* !CONFIG_USER_ONLY */ 8605 8606 static void x86_cpu_set_pc(CPUState *cs, vaddr value) 8607 { 8608 X86CPU *cpu = X86_CPU(cs); 8609 8610 cpu->env.eip = value; 8611 } 8612 8613 static vaddr x86_cpu_get_pc(CPUState *cs) 8614 { 8615 X86CPU *cpu = X86_CPU(cs); 8616 8617 /* Match cpu_get_tb_cpu_state. */ 8618 return cpu->env.eip + cpu->env.segs[R_CS].base; 8619 } 8620 8621 #if !defined(CONFIG_USER_ONLY) 8622 int x86_cpu_pending_interrupt(CPUState *cs, int interrupt_request) 8623 { 8624 X86CPU *cpu = X86_CPU(cs); 8625 CPUX86State *env = &cpu->env; 8626 8627 if (interrupt_request & CPU_INTERRUPT_POLL) { 8628 return CPU_INTERRUPT_POLL; 8629 } 8630 if (interrupt_request & CPU_INTERRUPT_SIPI) { 8631 return CPU_INTERRUPT_SIPI; 8632 } 8633 8634 if (env->hflags2 & HF2_GIF_MASK) { 8635 if ((interrupt_request & CPU_INTERRUPT_SMI) && 8636 !(env->hflags & HF_SMM_MASK)) { 8637 return CPU_INTERRUPT_SMI; 8638 } else if ((interrupt_request & CPU_INTERRUPT_NMI) && 8639 !(env->hflags2 & HF2_NMI_MASK)) { 8640 return CPU_INTERRUPT_NMI; 8641 } else if (interrupt_request & CPU_INTERRUPT_MCE) { 8642 return CPU_INTERRUPT_MCE; 8643 } else if ((interrupt_request & CPU_INTERRUPT_HARD) && 8644 (((env->hflags2 & HF2_VINTR_MASK) && 8645 (env->hflags2 & HF2_HIF_MASK)) || 8646 (!(env->hflags2 & HF2_VINTR_MASK) && 8647 (env->eflags & IF_MASK && 8648 !(env->hflags & HF_INHIBIT_IRQ_MASK))))) { 8649 return CPU_INTERRUPT_HARD; 8650 } else if (env->hflags2 & HF2_VGIF_MASK) { 8651 if((interrupt_request & CPU_INTERRUPT_VIRQ) && 8652 (env->eflags & IF_MASK) && 8653 !(env->hflags & HF_INHIBIT_IRQ_MASK)) { 8654 return CPU_INTERRUPT_VIRQ; 8655 } 8656 } 8657 } 8658 8659 return 0; 8660 } 8661 8662 static bool x86_cpu_has_work(CPUState *cs) 8663 { 8664 return x86_cpu_pending_interrupt(cs, cs->interrupt_request) != 0; 8665 } 8666 #endif /* !CONFIG_USER_ONLY */ 8667 8668 static void x86_disas_set_info(CPUState *cs, disassemble_info *info) 8669 { 8670 X86CPU *cpu = X86_CPU(cs); 8671 CPUX86State *env = &cpu->env; 8672 8673 info->endian = BFD_ENDIAN_LITTLE; 8674 info->mach = (env->hflags & HF_CS64_MASK ? bfd_mach_x86_64 8675 : env->hflags & HF_CS32_MASK ? bfd_mach_i386_i386 8676 : bfd_mach_i386_i8086); 8677 8678 info->cap_arch = CS_ARCH_X86; 8679 info->cap_mode = (env->hflags & HF_CS64_MASK ? CS_MODE_64 8680 : env->hflags & HF_CS32_MASK ? CS_MODE_32 8681 : CS_MODE_16); 8682 info->cap_insn_unit = 1; 8683 info->cap_insn_split = 8; 8684 } 8685 8686 void x86_update_hflags(CPUX86State *env) 8687 { 8688 uint32_t hflags; 8689 #define HFLAG_COPY_MASK \ 8690 ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \ 8691 HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \ 8692 HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \ 8693 HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK) 8694 8695 hflags = env->hflags & HFLAG_COPY_MASK; 8696 hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK; 8697 hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT); 8698 hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) & 8699 (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK); 8700 hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK)); 8701 8702 if (env->cr[4] & CR4_OSFXSR_MASK) { 8703 hflags |= HF_OSFXSR_MASK; 8704 } 8705 8706 if (env->efer & MSR_EFER_LMA) { 8707 hflags |= HF_LMA_MASK; 8708 } 8709 8710 if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) { 8711 hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK; 8712 } else { 8713 hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >> 8714 (DESC_B_SHIFT - HF_CS32_SHIFT); 8715 hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >> 8716 (DESC_B_SHIFT - HF_SS32_SHIFT); 8717 if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) || 8718 !(hflags & HF_CS32_MASK)) { 8719 hflags |= HF_ADDSEG_MASK; 8720 } else { 8721 hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base | 8722 env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT; 8723 } 8724 } 8725 env->hflags = hflags; 8726 } 8727 8728 static const Property x86_cpu_properties[] = { 8729 #ifdef CONFIG_USER_ONLY 8730 /* apic_id = 0 by default for *-user, see commit 9886e834 */ 8731 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, 0), 8732 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, 0), 8733 DEFINE_PROP_INT32("core-id", X86CPU, core_id, 0), 8734 DEFINE_PROP_INT32("module-id", X86CPU, module_id, 0), 8735 DEFINE_PROP_INT32("die-id", X86CPU, die_id, 0), 8736 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, 0), 8737 #else 8738 DEFINE_PROP_UINT32("apic-id", X86CPU, apic_id, UNASSIGNED_APIC_ID), 8739 DEFINE_PROP_INT32("thread-id", X86CPU, thread_id, -1), 8740 DEFINE_PROP_INT32("core-id", X86CPU, core_id, -1), 8741 DEFINE_PROP_INT32("module-id", X86CPU, module_id, -1), 8742 DEFINE_PROP_INT32("die-id", X86CPU, die_id, -1), 8743 DEFINE_PROP_INT32("socket-id", X86CPU, socket_id, -1), 8744 #endif 8745 DEFINE_PROP_INT32("node-id", X86CPU, node_id, CPU_UNSET_NUMA_NODE_ID), 8746 DEFINE_PROP_BOOL("pmu", X86CPU, enable_pmu, false), 8747 DEFINE_PROP_UINT64_CHECKMASK("lbr-fmt", X86CPU, lbr_fmt, PERF_CAP_LBR_FMT), 8748 8749 DEFINE_PROP_UINT32("hv-spinlocks", X86CPU, hyperv_spinlock_attempts, 8750 HYPERV_SPINLOCK_NEVER_NOTIFY), 8751 DEFINE_PROP_BIT64("hv-relaxed", X86CPU, hyperv_features, 8752 HYPERV_FEAT_RELAXED, 0), 8753 DEFINE_PROP_BIT64("hv-vapic", X86CPU, hyperv_features, 8754 HYPERV_FEAT_VAPIC, 0), 8755 DEFINE_PROP_BIT64("hv-time", X86CPU, hyperv_features, 8756 HYPERV_FEAT_TIME, 0), 8757 DEFINE_PROP_BIT64("hv-crash", X86CPU, hyperv_features, 8758 HYPERV_FEAT_CRASH, 0), 8759 DEFINE_PROP_BIT64("hv-reset", X86CPU, hyperv_features, 8760 HYPERV_FEAT_RESET, 0), 8761 DEFINE_PROP_BIT64("hv-vpindex", X86CPU, hyperv_features, 8762 HYPERV_FEAT_VPINDEX, 0), 8763 DEFINE_PROP_BIT64("hv-runtime", X86CPU, hyperv_features, 8764 HYPERV_FEAT_RUNTIME, 0), 8765 DEFINE_PROP_BIT64("hv-synic", X86CPU, hyperv_features, 8766 HYPERV_FEAT_SYNIC, 0), 8767 DEFINE_PROP_BIT64("hv-stimer", X86CPU, hyperv_features, 8768 HYPERV_FEAT_STIMER, 0), 8769 DEFINE_PROP_BIT64("hv-frequencies", X86CPU, hyperv_features, 8770 HYPERV_FEAT_FREQUENCIES, 0), 8771 DEFINE_PROP_BIT64("hv-reenlightenment", X86CPU, hyperv_features, 8772 HYPERV_FEAT_REENLIGHTENMENT, 0), 8773 DEFINE_PROP_BIT64("hv-tlbflush", X86CPU, hyperv_features, 8774 HYPERV_FEAT_TLBFLUSH, 0), 8775 DEFINE_PROP_BIT64("hv-evmcs", X86CPU, hyperv_features, 8776 HYPERV_FEAT_EVMCS, 0), 8777 DEFINE_PROP_BIT64("hv-ipi", X86CPU, hyperv_features, 8778 HYPERV_FEAT_IPI, 0), 8779 DEFINE_PROP_BIT64("hv-stimer-direct", X86CPU, hyperv_features, 8780 HYPERV_FEAT_STIMER_DIRECT, 0), 8781 DEFINE_PROP_BIT64("hv-avic", X86CPU, hyperv_features, 8782 HYPERV_FEAT_AVIC, 0), 8783 DEFINE_PROP_BIT64("hv-emsr-bitmap", X86CPU, hyperv_features, 8784 HYPERV_FEAT_MSR_BITMAP, 0), 8785 DEFINE_PROP_BIT64("hv-xmm-input", X86CPU, hyperv_features, 8786 HYPERV_FEAT_XMM_INPUT, 0), 8787 DEFINE_PROP_BIT64("hv-tlbflush-ext", X86CPU, hyperv_features, 8788 HYPERV_FEAT_TLBFLUSH_EXT, 0), 8789 DEFINE_PROP_BIT64("hv-tlbflush-direct", X86CPU, hyperv_features, 8790 HYPERV_FEAT_TLBFLUSH_DIRECT, 0), 8791 DEFINE_PROP_ON_OFF_AUTO("hv-no-nonarch-coresharing", X86CPU, 8792 hyperv_no_nonarch_cs, ON_OFF_AUTO_OFF), 8793 #ifdef CONFIG_SYNDBG 8794 DEFINE_PROP_BIT64("hv-syndbg", X86CPU, hyperv_features, 8795 HYPERV_FEAT_SYNDBG, 0), 8796 #endif 8797 DEFINE_PROP_BOOL("hv-passthrough", X86CPU, hyperv_passthrough, false), 8798 DEFINE_PROP_BOOL("hv-enforce-cpuid", X86CPU, hyperv_enforce_cpuid, false), 8799 8800 /* WS2008R2 identify by default */ 8801 DEFINE_PROP_UINT32("hv-version-id-build", X86CPU, hyperv_ver_id_build, 8802 0x3839), 8803 DEFINE_PROP_UINT16("hv-version-id-major", X86CPU, hyperv_ver_id_major, 8804 0x000A), 8805 DEFINE_PROP_UINT16("hv-version-id-minor", X86CPU, hyperv_ver_id_minor, 8806 0x0000), 8807 DEFINE_PROP_UINT32("hv-version-id-spack", X86CPU, hyperv_ver_id_sp, 0), 8808 DEFINE_PROP_UINT8("hv-version-id-sbranch", X86CPU, hyperv_ver_id_sb, 0), 8809 DEFINE_PROP_UINT32("hv-version-id-snumber", X86CPU, hyperv_ver_id_sn, 0), 8810 8811 DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, true), 8812 DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false), 8813 DEFINE_PROP_BOOL("x-force-features", X86CPU, force_features, false), 8814 DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true), 8815 DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 0), 8816 DEFINE_PROP_UINT32("guest-phys-bits", X86CPU, guest_phys_bits, -1), 8817 DEFINE_PROP_BOOL("host-phys-bits", X86CPU, host_phys_bits, false), 8818 DEFINE_PROP_UINT8("host-phys-bits-limit", X86CPU, host_phys_bits_limit, 0), 8819 DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true), 8820 DEFINE_PROP_UINT32("level-func7", X86CPU, env.cpuid_level_func7, 8821 UINT32_MAX), 8822 DEFINE_PROP_UINT32("level", X86CPU, env.cpuid_level, UINT32_MAX), 8823 DEFINE_PROP_UINT32("xlevel", X86CPU, env.cpuid_xlevel, UINT32_MAX), 8824 DEFINE_PROP_UINT32("xlevel2", X86CPU, env.cpuid_xlevel2, UINT32_MAX), 8825 DEFINE_PROP_UINT32("min-level", X86CPU, env.cpuid_min_level, 0), 8826 DEFINE_PROP_UINT32("min-xlevel", X86CPU, env.cpuid_min_xlevel, 0), 8827 DEFINE_PROP_UINT32("min-xlevel2", X86CPU, env.cpuid_min_xlevel2, 0), 8828 DEFINE_PROP_UINT8("avx10-version", X86CPU, env.avx10_version, 0), 8829 DEFINE_PROP_UINT64("ucode-rev", X86CPU, ucode_rev, 0), 8830 DEFINE_PROP_BOOL("full-cpuid-auto-level", X86CPU, full_cpuid_auto_level, true), 8831 DEFINE_PROP_STRING("hv-vendor-id", X86CPU, hyperv_vendor), 8832 DEFINE_PROP_BOOL("cpuid-0xb", X86CPU, enable_cpuid_0xb, true), 8833 DEFINE_PROP_BOOL("x-vendor-cpuid-only", X86CPU, vendor_cpuid_only, true), 8834 DEFINE_PROP_BOOL("x-amd-topoext-features-only", X86CPU, amd_topoext_features_only, true), 8835 DEFINE_PROP_BOOL("lmce", X86CPU, enable_lmce, false), 8836 DEFINE_PROP_BOOL("l3-cache", X86CPU, enable_l3_cache, true), 8837 DEFINE_PROP_BOOL("kvm-pv-enforce-cpuid", X86CPU, kvm_pv_enforce_cpuid, 8838 false), 8839 DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true), 8840 DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true), 8841 DEFINE_PROP_BOOL("x-migrate-smi-count", X86CPU, migrate_smi_count, 8842 true), 8843 /* 8844 * lecacy_cache defaults to true unless the CPU model provides its 8845 * own cache information (see x86_cpu_load_def()). 8846 */ 8847 DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, true), 8848 DEFINE_PROP_BOOL("legacy-multi-node", X86CPU, legacy_multi_node, false), 8849 DEFINE_PROP_BOOL("xen-vapic", X86CPU, xen_vapic, false), 8850 8851 /* 8852 * From "Requirements for Implementing the Microsoft 8853 * Hypervisor Interface": 8854 * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs 8855 * 8856 * "Starting with Windows Server 2012 and Windows 8, if 8857 * CPUID.40000005.EAX contains a value of -1, Windows assumes that 8858 * the hypervisor imposes no specific limit to the number of VPs. 8859 * In this case, Windows Server 2012 guest VMs may use more than 8860 * 64 VPs, up to the maximum supported number of processors applicable 8861 * to the specific Windows version being used." 8862 */ 8863 DEFINE_PROP_INT32("x-hv-max-vps", X86CPU, hv_max_vps, -1), 8864 DEFINE_PROP_BOOL("x-hv-synic-kvm-only", X86CPU, hyperv_synic_kvm_only, 8865 false), 8866 DEFINE_PROP_BOOL("x-intel-pt-auto-level", X86CPU, intel_pt_auto_level, 8867 true), 8868 DEFINE_PROP_BOOL("x-l1-cache-per-thread", X86CPU, l1_cache_per_core, true), 8869 }; 8870 8871 #ifndef CONFIG_USER_ONLY 8872 #include "hw/core/sysemu-cpu-ops.h" 8873 8874 static const struct SysemuCPUOps i386_sysemu_ops = { 8875 .has_work = x86_cpu_has_work, 8876 .get_memory_mapping = x86_cpu_get_memory_mapping, 8877 .get_paging_enabled = x86_cpu_get_paging_enabled, 8878 .get_phys_page_attrs_debug = x86_cpu_get_phys_page_attrs_debug, 8879 .asidx_from_attrs = x86_asidx_from_attrs, 8880 .get_crash_info = x86_cpu_get_crash_info, 8881 .write_elf32_note = x86_cpu_write_elf32_note, 8882 .write_elf64_note = x86_cpu_write_elf64_note, 8883 .write_elf32_qemunote = x86_cpu_write_elf32_qemunote, 8884 .write_elf64_qemunote = x86_cpu_write_elf64_qemunote, 8885 .legacy_vmsd = &vmstate_x86_cpu, 8886 }; 8887 #endif 8888 8889 static void x86_cpu_common_class_init(ObjectClass *oc, void *data) 8890 { 8891 X86CPUClass *xcc = X86_CPU_CLASS(oc); 8892 CPUClass *cc = CPU_CLASS(oc); 8893 DeviceClass *dc = DEVICE_CLASS(oc); 8894 ResettableClass *rc = RESETTABLE_CLASS(oc); 8895 FeatureWord w; 8896 8897 device_class_set_parent_realize(dc, x86_cpu_realizefn, 8898 &xcc->parent_realize); 8899 device_class_set_parent_unrealize(dc, x86_cpu_unrealizefn, 8900 &xcc->parent_unrealize); 8901 device_class_set_props(dc, x86_cpu_properties); 8902 8903 resettable_class_set_parent_phases(rc, NULL, x86_cpu_reset_hold, NULL, 8904 &xcc->parent_phases); 8905 cc->reset_dump_flags = CPU_DUMP_FPU | CPU_DUMP_CCOP; 8906 8907 cc->class_by_name = x86_cpu_class_by_name; 8908 cc->list_cpus = x86_cpu_list; 8909 cc->parse_features = x86_cpu_parse_featurestr; 8910 cc->dump_state = x86_cpu_dump_state; 8911 cc->set_pc = x86_cpu_set_pc; 8912 cc->get_pc = x86_cpu_get_pc; 8913 cc->gdb_read_register = x86_cpu_gdb_read_register; 8914 cc->gdb_write_register = x86_cpu_gdb_write_register; 8915 cc->get_arch_id = x86_cpu_get_arch_id; 8916 8917 #ifndef CONFIG_USER_ONLY 8918 cc->sysemu_ops = &i386_sysemu_ops; 8919 #endif /* !CONFIG_USER_ONLY */ 8920 #ifdef CONFIG_TCG 8921 cc->tcg_ops = &x86_tcg_ops; 8922 #endif /* CONFIG_TCG */ 8923 8924 cc->gdb_arch_name = x86_gdb_arch_name; 8925 #ifdef TARGET_X86_64 8926 cc->gdb_core_xml_file = "i386-64bit.xml"; 8927 #else 8928 cc->gdb_core_xml_file = "i386-32bit.xml"; 8929 #endif 8930 cc->disas_set_info = x86_disas_set_info; 8931 8932 dc->user_creatable = true; 8933 8934 object_class_property_add(oc, "family", "int", 8935 x86_cpuid_version_get_family, 8936 x86_cpuid_version_set_family, NULL, NULL); 8937 object_class_property_add(oc, "model", "int", 8938 x86_cpuid_version_get_model, 8939 x86_cpuid_version_set_model, NULL, NULL); 8940 object_class_property_add(oc, "stepping", "int", 8941 x86_cpuid_version_get_stepping, 8942 x86_cpuid_version_set_stepping, NULL, NULL); 8943 object_class_property_add_str(oc, "vendor", 8944 x86_cpuid_get_vendor, 8945 x86_cpuid_set_vendor); 8946 object_class_property_add_str(oc, "model-id", 8947 x86_cpuid_get_model_id, 8948 x86_cpuid_set_model_id); 8949 object_class_property_add(oc, "tsc-frequency", "int", 8950 x86_cpuid_get_tsc_freq, 8951 x86_cpuid_set_tsc_freq, NULL, NULL); 8952 /* 8953 * The "unavailable-features" property has the same semantics as 8954 * CpuDefinitionInfo.unavailable-features on the "query-cpu-definitions" 8955 * QMP command: they list the features that would have prevented the 8956 * CPU from running if the "enforce" flag was set. 8957 */ 8958 object_class_property_add(oc, "unavailable-features", "strList", 8959 x86_cpu_get_unavailable_features, 8960 NULL, NULL, NULL); 8961 8962 #if !defined(CONFIG_USER_ONLY) 8963 object_class_property_add(oc, "crash-information", "GuestPanicInformation", 8964 x86_cpu_get_crash_info_qom, NULL, NULL, NULL); 8965 #endif 8966 8967 for (w = 0; w < FEATURE_WORDS; w++) { 8968 int bitnr; 8969 for (bitnr = 0; bitnr < 64; bitnr++) { 8970 x86_cpu_register_feature_bit_props(xcc, w, bitnr); 8971 } 8972 } 8973 } 8974 8975 static const TypeInfo x86_cpu_type_info = { 8976 .name = TYPE_X86_CPU, 8977 .parent = TYPE_CPU, 8978 .instance_size = sizeof(X86CPU), 8979 .instance_align = __alignof(X86CPU), 8980 .instance_init = x86_cpu_initfn, 8981 .instance_post_init = x86_cpu_post_initfn, 8982 8983 .abstract = true, 8984 .class_size = sizeof(X86CPUClass), 8985 .class_init = x86_cpu_common_class_init, 8986 }; 8987 8988 /* "base" CPU model, used by query-cpu-model-expansion */ 8989 static void x86_cpu_base_class_init(ObjectClass *oc, void *data) 8990 { 8991 X86CPUClass *xcc = X86_CPU_CLASS(oc); 8992 8993 xcc->static_model = true; 8994 xcc->migration_safe = true; 8995 xcc->model_description = "base CPU model type with no features enabled"; 8996 xcc->ordering = 8; 8997 } 8998 8999 static const TypeInfo x86_base_cpu_type_info = { 9000 .name = X86_CPU_TYPE_NAME("base"), 9001 .parent = TYPE_X86_CPU, 9002 .class_init = x86_cpu_base_class_init, 9003 }; 9004 9005 static void x86_cpu_register_types(void) 9006 { 9007 int i; 9008 9009 type_register_static(&x86_cpu_type_info); 9010 for (i = 0; i < ARRAY_SIZE(builtin_x86_defs); i++) { 9011 x86_register_cpudef_types(&builtin_x86_defs[i]); 9012 } 9013 type_register_static(&max_x86_cpu_type_info); 9014 type_register_static(&x86_base_cpu_type_info); 9015 } 9016 9017 type_init(x86_cpu_register_types) 9018