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