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