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