1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. 23 */ 24 /* 25 * Copyright (c) 2009, Intel Corporation. 26 * All rights reserved. 27 */ 28 /* 29 * Portions Copyright 2009 Advanced Micro Devices, Inc. 30 */ 31 32 /* 33 * Various routines to handle identification 34 * and classification of x86 processors. 35 */ 36 37 #include <sys/types.h> 38 #include <sys/archsystm.h> 39 #include <sys/x86_archext.h> 40 #include <sys/kmem.h> 41 #include <sys/systm.h> 42 #include <sys/cmn_err.h> 43 #include <sys/sunddi.h> 44 #include <sys/sunndi.h> 45 #include <sys/cpuvar.h> 46 #include <sys/processor.h> 47 #include <sys/sysmacros.h> 48 #include <sys/pg.h> 49 #include <sys/fp.h> 50 #include <sys/controlregs.h> 51 #include <sys/auxv_386.h> 52 #include <sys/bitmap.h> 53 #include <sys/memnode.h> 54 #include <sys/pci_cfgspace.h> 55 56 #ifdef __xpv 57 #include <sys/hypervisor.h> 58 #else 59 #include <sys/ontrap.h> 60 #endif 61 62 /* 63 * Pass 0 of cpuid feature analysis happens in locore. It contains special code 64 * to recognize Cyrix processors that are not cpuid-compliant, and to deal with 65 * them accordingly. For most modern processors, feature detection occurs here 66 * in pass 1. 67 * 68 * Pass 1 of cpuid feature analysis happens just at the beginning of mlsetup() 69 * for the boot CPU and does the basic analysis that the early kernel needs. 70 * x86_featureset is set based on the return value of cpuid_pass1() of the boot 71 * CPU. 72 * 73 * Pass 1 includes: 74 * 75 * o Determining vendor/model/family/stepping and setting x86_type and 76 * x86_vendor accordingly. 77 * o Processing the feature flags returned by the cpuid instruction while 78 * applying any workarounds or tricks for the specific processor. 79 * o Mapping the feature flags into Solaris feature bits (X86_*). 80 * o Processing extended feature flags if supported by the processor, 81 * again while applying specific processor knowledge. 82 * o Determining the CMT characteristics of the system. 83 * 84 * Pass 1 is done on non-boot CPUs during their initialization and the results 85 * are used only as a meager attempt at ensuring that all processors within the 86 * system support the same features. 87 * 88 * Pass 2 of cpuid feature analysis happens just at the beginning 89 * of startup(). It just copies in and corrects the remainder 90 * of the cpuid data we depend on: standard cpuid functions that we didn't 91 * need for pass1 feature analysis, and extended cpuid functions beyond the 92 * simple feature processing done in pass1. 93 * 94 * Pass 3 of cpuid analysis is invoked after basic kernel services; in 95 * particular kernel memory allocation has been made available. It creates a 96 * readable brand string based on the data collected in the first two passes. 97 * 98 * Pass 4 of cpuid analysis is invoked after post_startup() when all 99 * the support infrastructure for various hardware features has been 100 * initialized. It determines which processor features will be reported 101 * to userland via the aux vector. 102 * 103 * All passes are executed on all CPUs, but only the boot CPU determines what 104 * features the kernel will use. 105 * 106 * Much of the worst junk in this file is for the support of processors 107 * that didn't really implement the cpuid instruction properly. 108 * 109 * NOTE: The accessor functions (cpuid_get*) are aware of, and ASSERT upon, 110 * the pass numbers. Accordingly, changes to the pass code may require changes 111 * to the accessor code. 112 */ 113 114 uint_t x86_vendor = X86_VENDOR_IntelClone; 115 uint_t x86_type = X86_TYPE_OTHER; 116 uint_t x86_clflush_size = 0; 117 118 uint_t pentiumpro_bug4046376; 119 uint_t pentiumpro_bug4064495; 120 121 #define NUM_X86_FEATURES 33 122 void *x86_featureset; 123 ulong_t x86_featureset0[BT_SIZEOFMAP(NUM_X86_FEATURES)]; 124 125 char *x86_feature_names[NUM_X86_FEATURES] = { 126 "lgpg", 127 "tsc", 128 "msr", 129 "mtrr", 130 "pge", 131 "de", 132 "cmov", 133 "mmx", 134 "mca", 135 "pae", 136 "cv8", 137 "pat", 138 "sep", 139 "sse", 140 "sse2", 141 "htt", 142 "asysc", 143 "nx", 144 "sse3", 145 "cx16", 146 "cmp", 147 "tscp", 148 "mwait", 149 "sse4a", 150 "cpuid", 151 "ssse3", 152 "sse4_1", 153 "sse4_2", 154 "1gpg", 155 "clfsh", 156 "64", 157 "aes", 158 "pclmulqdq" }; 159 160 static void * 161 init_x86_featureset(void) 162 { 163 return (kmem_zalloc(BT_SIZEOFMAP(NUM_X86_FEATURES), KM_SLEEP)); 164 } 165 166 void 167 free_x86_featureset(void *featureset) 168 { 169 kmem_free(featureset, BT_SIZEOFMAP(NUM_X86_FEATURES)); 170 } 171 172 boolean_t 173 is_x86_feature(void *featureset, uint_t feature) 174 { 175 ASSERT(feature < NUM_X86_FEATURES); 176 return (BT_TEST((ulong_t *)featureset, feature)); 177 } 178 179 void 180 add_x86_feature(void *featureset, uint_t feature) 181 { 182 ASSERT(feature < NUM_X86_FEATURES); 183 BT_SET((ulong_t *)featureset, feature); 184 } 185 186 void 187 remove_x86_feature(void *featureset, uint_t feature) 188 { 189 ASSERT(feature < NUM_X86_FEATURES); 190 BT_CLEAR((ulong_t *)featureset, feature); 191 } 192 193 boolean_t 194 compare_x86_featureset(void *setA, void *setB) 195 { 196 /* 197 * We assume that the unused bits of the bitmap are always zero. 198 */ 199 if (memcmp(setA, setB, BT_SIZEOFMAP(NUM_X86_FEATURES)) == 0) { 200 return (B_TRUE); 201 } else { 202 return (B_FALSE); 203 } 204 } 205 206 void 207 print_x86_featureset(void *featureset) 208 { 209 uint_t i; 210 211 for (i = 0; i < NUM_X86_FEATURES; i++) { 212 if (is_x86_feature(featureset, i)) { 213 cmn_err(CE_CONT, "?x86_feature: %s\n", 214 x86_feature_names[i]); 215 } 216 } 217 } 218 219 uint_t enable486; 220 /* 221 * This is set to platform type Solaris is running on. 222 */ 223 static int platform_type = -1; 224 225 #if !defined(__xpv) 226 /* 227 * Variable to patch if hypervisor platform detection needs to be 228 * disabled (e.g. platform_type will always be HW_NATIVE if this is 0). 229 */ 230 int enable_platform_detection = 1; 231 #endif 232 233 /* 234 * monitor/mwait info. 235 * 236 * size_actual and buf_actual are the real address and size allocated to get 237 * proper mwait_buf alignement. buf_actual and size_actual should be passed 238 * to kmem_free(). Currently kmem_alloc() and mwait happen to both use 239 * processor cache-line alignment, but this is not guarantied in the furture. 240 */ 241 struct mwait_info { 242 size_t mon_min; /* min size to avoid missed wakeups */ 243 size_t mon_max; /* size to avoid false wakeups */ 244 size_t size_actual; /* size actually allocated */ 245 void *buf_actual; /* memory actually allocated */ 246 uint32_t support; /* processor support of monitor/mwait */ 247 }; 248 249 /* 250 * These constants determine how many of the elements of the 251 * cpuid we cache in the cpuid_info data structure; the 252 * remaining elements are accessible via the cpuid instruction. 253 */ 254 255 #define NMAX_CPI_STD 6 /* eax = 0 .. 5 */ 256 #define NMAX_CPI_EXTD 0x1c /* eax = 0x80000000 .. 0x8000001b */ 257 258 /* 259 * Some terminology needs to be explained: 260 * - Socket: Something that can be plugged into a motherboard. 261 * - Package: Same as socket 262 * - Chip: Same as socket. Note that AMD's documentation uses term "chip" 263 * differently: there, chip is the same as processor node (below) 264 * - Processor node: Some AMD processors have more than one 265 * "subprocessor" embedded in a package. These subprocessors (nodes) 266 * are fully-functional processors themselves with cores, caches, 267 * memory controllers, PCI configuration spaces. They are connected 268 * inside the package with Hypertransport links. On single-node 269 * processors, processor node is equivalent to chip/socket/package. 270 */ 271 272 struct cpuid_info { 273 uint_t cpi_pass; /* last pass completed */ 274 /* 275 * standard function information 276 */ 277 uint_t cpi_maxeax; /* fn 0: %eax */ 278 char cpi_vendorstr[13]; /* fn 0: %ebx:%ecx:%edx */ 279 uint_t cpi_vendor; /* enum of cpi_vendorstr */ 280 281 uint_t cpi_family; /* fn 1: extended family */ 282 uint_t cpi_model; /* fn 1: extended model */ 283 uint_t cpi_step; /* fn 1: stepping */ 284 chipid_t cpi_chipid; /* fn 1: %ebx: Intel: chip # */ 285 /* AMD: package/socket # */ 286 uint_t cpi_brandid; /* fn 1: %ebx: brand ID */ 287 int cpi_clogid; /* fn 1: %ebx: thread # */ 288 uint_t cpi_ncpu_per_chip; /* fn 1: %ebx: logical cpu count */ 289 uint8_t cpi_cacheinfo[16]; /* fn 2: intel-style cache desc */ 290 uint_t cpi_ncache; /* fn 2: number of elements */ 291 uint_t cpi_ncpu_shr_last_cache; /* fn 4: %eax: ncpus sharing cache */ 292 id_t cpi_last_lvl_cacheid; /* fn 4: %eax: derived cache id */ 293 uint_t cpi_std_4_size; /* fn 4: number of fn 4 elements */ 294 struct cpuid_regs **cpi_std_4; /* fn 4: %ecx == 0 .. fn4_size */ 295 struct cpuid_regs cpi_std[NMAX_CPI_STD]; /* 0 .. 5 */ 296 /* 297 * extended function information 298 */ 299 uint_t cpi_xmaxeax; /* fn 0x80000000: %eax */ 300 char cpi_brandstr[49]; /* fn 0x8000000[234] */ 301 uint8_t cpi_pabits; /* fn 0x80000006: %eax */ 302 uint8_t cpi_vabits; /* fn 0x80000006: %eax */ 303 struct cpuid_regs cpi_extd[NMAX_CPI_EXTD]; /* 0x800000XX */ 304 305 id_t cpi_coreid; /* same coreid => strands share core */ 306 int cpi_pkgcoreid; /* core number within single package */ 307 uint_t cpi_ncore_per_chip; /* AMD: fn 0x80000008: %ecx[7-0] */ 308 /* Intel: fn 4: %eax[31-26] */ 309 /* 310 * supported feature information 311 */ 312 uint32_t cpi_support[5]; 313 #define STD_EDX_FEATURES 0 314 #define AMD_EDX_FEATURES 1 315 #define TM_EDX_FEATURES 2 316 #define STD_ECX_FEATURES 3 317 #define AMD_ECX_FEATURES 4 318 /* 319 * Synthesized information, where known. 320 */ 321 uint32_t cpi_chiprev; /* See X86_CHIPREV_* in x86_archext.h */ 322 const char *cpi_chiprevstr; /* May be NULL if chiprev unknown */ 323 uint32_t cpi_socket; /* Chip package/socket type */ 324 325 struct mwait_info cpi_mwait; /* fn 5: monitor/mwait info */ 326 uint32_t cpi_apicid; 327 uint_t cpi_procnodeid; /* AMD: nodeID on HT, Intel: chipid */ 328 uint_t cpi_procnodes_per_pkg; /* AMD: # of nodes in the package */ 329 /* Intel: 1 */ 330 }; 331 332 333 static struct cpuid_info cpuid_info0; 334 335 /* 336 * These bit fields are defined by the Intel Application Note AP-485 337 * "Intel Processor Identification and the CPUID Instruction" 338 */ 339 #define CPI_FAMILY_XTD(cpi) BITX((cpi)->cpi_std[1].cp_eax, 27, 20) 340 #define CPI_MODEL_XTD(cpi) BITX((cpi)->cpi_std[1].cp_eax, 19, 16) 341 #define CPI_TYPE(cpi) BITX((cpi)->cpi_std[1].cp_eax, 13, 12) 342 #define CPI_FAMILY(cpi) BITX((cpi)->cpi_std[1].cp_eax, 11, 8) 343 #define CPI_STEP(cpi) BITX((cpi)->cpi_std[1].cp_eax, 3, 0) 344 #define CPI_MODEL(cpi) BITX((cpi)->cpi_std[1].cp_eax, 7, 4) 345 346 #define CPI_FEATURES_EDX(cpi) ((cpi)->cpi_std[1].cp_edx) 347 #define CPI_FEATURES_ECX(cpi) ((cpi)->cpi_std[1].cp_ecx) 348 #define CPI_FEATURES_XTD_EDX(cpi) ((cpi)->cpi_extd[1].cp_edx) 349 #define CPI_FEATURES_XTD_ECX(cpi) ((cpi)->cpi_extd[1].cp_ecx) 350 351 #define CPI_BRANDID(cpi) BITX((cpi)->cpi_std[1].cp_ebx, 7, 0) 352 #define CPI_CHUNKS(cpi) BITX((cpi)->cpi_std[1].cp_ebx, 15, 7) 353 #define CPI_CPU_COUNT(cpi) BITX((cpi)->cpi_std[1].cp_ebx, 23, 16) 354 #define CPI_APIC_ID(cpi) BITX((cpi)->cpi_std[1].cp_ebx, 31, 24) 355 356 #define CPI_MAXEAX_MAX 0x100 /* sanity control */ 357 #define CPI_XMAXEAX_MAX 0x80000100 358 #define CPI_FN4_ECX_MAX 0x20 /* sanity: max fn 4 levels */ 359 #define CPI_FNB_ECX_MAX 0x20 /* sanity: max fn B levels */ 360 361 /* 362 * Function 4 (Deterministic Cache Parameters) macros 363 * Defined by Intel Application Note AP-485 364 */ 365 #define CPI_NUM_CORES(regs) BITX((regs)->cp_eax, 31, 26) 366 #define CPI_NTHR_SHR_CACHE(regs) BITX((regs)->cp_eax, 25, 14) 367 #define CPI_FULL_ASSOC_CACHE(regs) BITX((regs)->cp_eax, 9, 9) 368 #define CPI_SELF_INIT_CACHE(regs) BITX((regs)->cp_eax, 8, 8) 369 #define CPI_CACHE_LVL(regs) BITX((regs)->cp_eax, 7, 5) 370 #define CPI_CACHE_TYPE(regs) BITX((regs)->cp_eax, 4, 0) 371 #define CPI_CPU_LEVEL_TYPE(regs) BITX((regs)->cp_ecx, 15, 8) 372 373 #define CPI_CACHE_WAYS(regs) BITX((regs)->cp_ebx, 31, 22) 374 #define CPI_CACHE_PARTS(regs) BITX((regs)->cp_ebx, 21, 12) 375 #define CPI_CACHE_COH_LN_SZ(regs) BITX((regs)->cp_ebx, 11, 0) 376 377 #define CPI_CACHE_SETS(regs) BITX((regs)->cp_ecx, 31, 0) 378 379 #define CPI_PREFCH_STRIDE(regs) BITX((regs)->cp_edx, 9, 0) 380 381 382 /* 383 * A couple of shorthand macros to identify "later" P6-family chips 384 * like the Pentium M and Core. First, the "older" P6-based stuff 385 * (loosely defined as "pre-Pentium-4"): 386 * P6, PII, Mobile PII, PII Xeon, PIII, Mobile PIII, PIII Xeon 387 */ 388 389 #define IS_LEGACY_P6(cpi) ( \ 390 cpi->cpi_family == 6 && \ 391 (cpi->cpi_model == 1 || \ 392 cpi->cpi_model == 3 || \ 393 cpi->cpi_model == 5 || \ 394 cpi->cpi_model == 6 || \ 395 cpi->cpi_model == 7 || \ 396 cpi->cpi_model == 8 || \ 397 cpi->cpi_model == 0xA || \ 398 cpi->cpi_model == 0xB) \ 399 ) 400 401 /* A "new F6" is everything with family 6 that's not the above */ 402 #define IS_NEW_F6(cpi) ((cpi->cpi_family == 6) && !IS_LEGACY_P6(cpi)) 403 404 /* Extended family/model support */ 405 #define IS_EXTENDED_MODEL_INTEL(cpi) (cpi->cpi_family == 0x6 || \ 406 cpi->cpi_family >= 0xf) 407 408 /* 409 * Info for monitor/mwait idle loop. 410 * 411 * See cpuid section of "Intel 64 and IA-32 Architectures Software Developer's 412 * Manual Volume 2A: Instruction Set Reference, A-M" #25366-022US, November 413 * 2006. 414 * See MONITOR/MWAIT section of "AMD64 Architecture Programmer's Manual 415 * Documentation Updates" #33633, Rev 2.05, December 2006. 416 */ 417 #define MWAIT_SUPPORT (0x00000001) /* mwait supported */ 418 #define MWAIT_EXTENSIONS (0x00000002) /* extenstion supported */ 419 #define MWAIT_ECX_INT_ENABLE (0x00000004) /* ecx 1 extension supported */ 420 #define MWAIT_SUPPORTED(cpi) ((cpi)->cpi_std[1].cp_ecx & CPUID_INTC_ECX_MON) 421 #define MWAIT_INT_ENABLE(cpi) ((cpi)->cpi_std[5].cp_ecx & 0x2) 422 #define MWAIT_EXTENSION(cpi) ((cpi)->cpi_std[5].cp_ecx & 0x1) 423 #define MWAIT_SIZE_MIN(cpi) BITX((cpi)->cpi_std[5].cp_eax, 15, 0) 424 #define MWAIT_SIZE_MAX(cpi) BITX((cpi)->cpi_std[5].cp_ebx, 15, 0) 425 /* 426 * Number of sub-cstates for a given c-state. 427 */ 428 #define MWAIT_NUM_SUBC_STATES(cpi, c_state) \ 429 BITX((cpi)->cpi_std[5].cp_edx, c_state + 3, c_state) 430 431 /* 432 * Functions we consune from cpuid_subr.c; don't publish these in a header 433 * file to try and keep people using the expected cpuid_* interfaces. 434 */ 435 extern uint32_t _cpuid_skt(uint_t, uint_t, uint_t, uint_t); 436 extern const char *_cpuid_sktstr(uint_t, uint_t, uint_t, uint_t); 437 extern uint32_t _cpuid_chiprev(uint_t, uint_t, uint_t, uint_t); 438 extern const char *_cpuid_chiprevstr(uint_t, uint_t, uint_t, uint_t); 439 extern uint_t _cpuid_vendorstr_to_vendorcode(char *); 440 441 /* 442 * Apply up various platform-dependent restrictions where the 443 * underlying platform restrictions mean the CPU can be marked 444 * as less capable than its cpuid instruction would imply. 445 */ 446 #if defined(__xpv) 447 static void 448 platform_cpuid_mangle(uint_t vendor, uint32_t eax, struct cpuid_regs *cp) 449 { 450 switch (eax) { 451 case 1: { 452 uint32_t mcamask = DOMAIN_IS_INITDOMAIN(xen_info) ? 453 0 : CPUID_INTC_EDX_MCA; 454 cp->cp_edx &= 455 ~(mcamask | 456 CPUID_INTC_EDX_PSE | 457 CPUID_INTC_EDX_VME | CPUID_INTC_EDX_DE | 458 CPUID_INTC_EDX_SEP | CPUID_INTC_EDX_MTRR | 459 CPUID_INTC_EDX_PGE | CPUID_INTC_EDX_PAT | 460 CPUID_AMD_EDX_SYSC | CPUID_INTC_EDX_SEP | 461 CPUID_INTC_EDX_PSE36 | CPUID_INTC_EDX_HTT); 462 break; 463 } 464 465 case 0x80000001: 466 cp->cp_edx &= 467 ~(CPUID_AMD_EDX_PSE | 468 CPUID_INTC_EDX_VME | CPUID_INTC_EDX_DE | 469 CPUID_AMD_EDX_MTRR | CPUID_AMD_EDX_PGE | 470 CPUID_AMD_EDX_PAT | CPUID_AMD_EDX_PSE36 | 471 CPUID_AMD_EDX_SYSC | CPUID_INTC_EDX_SEP | 472 CPUID_AMD_EDX_TSCP); 473 cp->cp_ecx &= ~CPUID_AMD_ECX_CMP_LGCY; 474 break; 475 default: 476 break; 477 } 478 479 switch (vendor) { 480 case X86_VENDOR_Intel: 481 switch (eax) { 482 case 4: 483 /* 484 * Zero out the (ncores-per-chip - 1) field 485 */ 486 cp->cp_eax &= 0x03fffffff; 487 break; 488 default: 489 break; 490 } 491 break; 492 case X86_VENDOR_AMD: 493 switch (eax) { 494 495 case 0x80000001: 496 cp->cp_ecx &= ~CPUID_AMD_ECX_CR8D; 497 break; 498 499 case 0x80000008: 500 /* 501 * Zero out the (ncores-per-chip - 1) field 502 */ 503 cp->cp_ecx &= 0xffffff00; 504 break; 505 default: 506 break; 507 } 508 break; 509 default: 510 break; 511 } 512 } 513 #else 514 #define platform_cpuid_mangle(vendor, eax, cp) /* nothing */ 515 #endif 516 517 /* 518 * Some undocumented ways of patching the results of the cpuid 519 * instruction to permit running Solaris 10 on future cpus that 520 * we don't currently support. Could be set to non-zero values 521 * via settings in eeprom. 522 */ 523 524 uint32_t cpuid_feature_ecx_include; 525 uint32_t cpuid_feature_ecx_exclude; 526 uint32_t cpuid_feature_edx_include; 527 uint32_t cpuid_feature_edx_exclude; 528 529 /* 530 * Allocate space for mcpu_cpi in the machcpu structure for all non-boot CPUs. 531 */ 532 void 533 cpuid_alloc_space(cpu_t *cpu) 534 { 535 /* 536 * By convention, cpu0 is the boot cpu, which is set up 537 * before memory allocation is available. All other cpus get 538 * their cpuid_info struct allocated here. 539 */ 540 ASSERT(cpu->cpu_id != 0); 541 ASSERT(cpu->cpu_m.mcpu_cpi == NULL); 542 cpu->cpu_m.mcpu_cpi = 543 kmem_zalloc(sizeof (*cpu->cpu_m.mcpu_cpi), KM_SLEEP); 544 } 545 546 void 547 cpuid_free_space(cpu_t *cpu) 548 { 549 struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi; 550 int i; 551 552 ASSERT(cpi != NULL); 553 ASSERT(cpi != &cpuid_info0); 554 555 /* 556 * Free up any function 4 related dynamic storage 557 */ 558 for (i = 1; i < cpi->cpi_std_4_size; i++) 559 kmem_free(cpi->cpi_std_4[i], sizeof (struct cpuid_regs)); 560 if (cpi->cpi_std_4_size > 0) 561 kmem_free(cpi->cpi_std_4, 562 cpi->cpi_std_4_size * sizeof (struct cpuid_regs *)); 563 564 kmem_free(cpi, sizeof (*cpi)); 565 cpu->cpu_m.mcpu_cpi = NULL; 566 } 567 568 #if !defined(__xpv) 569 570 static void 571 determine_platform() 572 { 573 struct cpuid_regs cp; 574 char *xen_str; 575 uint32_t xen_signature[4], base; 576 577 platform_type = HW_NATIVE; 578 579 if (!enable_platform_detection) 580 return; 581 582 /* 583 * In a fully virtualized domain, Xen's pseudo-cpuid function 584 * returns a string representing the Xen signature in %ebx, %ecx, 585 * and %edx. %eax contains the maximum supported cpuid function. 586 * We need at least a (base + 2) leaf value to do what we want 587 * to do. Try different base values, since the hypervisor might 588 * use a different one depending on whether hyper-v emulation 589 * is switched on by default or not. 590 */ 591 for (base = 0x40000000; base < 0x40010000; base += 0x100) { 592 cp.cp_eax = base; 593 (void) __cpuid_insn(&cp); 594 xen_signature[0] = cp.cp_ebx; 595 xen_signature[1] = cp.cp_ecx; 596 xen_signature[2] = cp.cp_edx; 597 xen_signature[3] = 0; 598 xen_str = (char *)xen_signature; 599 if (strcmp("XenVMMXenVMM", xen_str) == 0 && 600 cp.cp_eax >= (base + 2)) { 601 platform_type = HW_XEN_HVM; 602 return; 603 } 604 } 605 606 if (vmware_platform()) /* running under vmware hypervisor? */ 607 platform_type = HW_VMWARE; 608 } 609 610 int 611 get_hwenv(void) 612 { 613 if (platform_type == -1) 614 determine_platform(); 615 616 return (platform_type); 617 } 618 619 int 620 is_controldom(void) 621 { 622 return (0); 623 } 624 625 #else 626 627 int 628 get_hwenv(void) 629 { 630 return (HW_XEN_PV); 631 } 632 633 int 634 is_controldom(void) 635 { 636 return (DOMAIN_IS_INITDOMAIN(xen_info)); 637 } 638 639 #endif /* __xpv */ 640 641 static void 642 cpuid_intel_getids(cpu_t *cpu, void *feature) 643 { 644 uint_t i; 645 uint_t chipid_shift = 0; 646 uint_t coreid_shift = 0; 647 struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi; 648 649 for (i = 1; i < cpi->cpi_ncpu_per_chip; i <<= 1) 650 chipid_shift++; 651 652 cpi->cpi_chipid = cpi->cpi_apicid >> chipid_shift; 653 cpi->cpi_clogid = cpi->cpi_apicid & ((1 << chipid_shift) - 1); 654 655 if (is_x86_feature(feature, X86FSET_CMP)) { 656 /* 657 * Multi-core (and possibly multi-threaded) 658 * processors. 659 */ 660 uint_t ncpu_per_core; 661 if (cpi->cpi_ncore_per_chip == 1) 662 ncpu_per_core = cpi->cpi_ncpu_per_chip; 663 else if (cpi->cpi_ncore_per_chip > 1) 664 ncpu_per_core = cpi->cpi_ncpu_per_chip / 665 cpi->cpi_ncore_per_chip; 666 /* 667 * 8bit APIC IDs on dual core Pentiums 668 * look like this: 669 * 670 * +-----------------------+------+------+ 671 * | Physical Package ID | MC | HT | 672 * +-----------------------+------+------+ 673 * <------- chipid --------> 674 * <------- coreid ---------------> 675 * <--- clogid --> 676 * <------> 677 * pkgcoreid 678 * 679 * Where the number of bits necessary to 680 * represent MC and HT fields together equals 681 * to the minimum number of bits necessary to 682 * store the value of cpi->cpi_ncpu_per_chip. 683 * Of those bits, the MC part uses the number 684 * of bits necessary to store the value of 685 * cpi->cpi_ncore_per_chip. 686 */ 687 for (i = 1; i < ncpu_per_core; i <<= 1) 688 coreid_shift++; 689 cpi->cpi_coreid = cpi->cpi_apicid >> coreid_shift; 690 cpi->cpi_pkgcoreid = cpi->cpi_clogid >> coreid_shift; 691 } else if (is_x86_feature(feature, X86FSET_HTT)) { 692 /* 693 * Single-core multi-threaded processors. 694 */ 695 cpi->cpi_coreid = cpi->cpi_chipid; 696 cpi->cpi_pkgcoreid = 0; 697 } 698 cpi->cpi_procnodeid = cpi->cpi_chipid; 699 } 700 701 static void 702 cpuid_amd_getids(cpu_t *cpu) 703 { 704 int i, first_half, coreidsz; 705 uint32_t nb_caps_reg; 706 uint_t node2_1; 707 struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi; 708 709 /* 710 * AMD CMP chips currently have a single thread per core. 711 * 712 * Since no two cpus share a core we must assign a distinct coreid 713 * per cpu, and we do this by using the cpu_id. This scheme does not, 714 * however, guarantee that sibling cores of a chip will have sequential 715 * coreids starting at a multiple of the number of cores per chip - 716 * that is usually the case, but if the ACPI MADT table is presented 717 * in a different order then we need to perform a few more gymnastics 718 * for the pkgcoreid. 719 * 720 * All processors in the system have the same number of enabled 721 * cores. Cores within a processor are always numbered sequentially 722 * from 0 regardless of how many or which are disabled, and there 723 * is no way for operating system to discover the real core id when some 724 * are disabled. 725 */ 726 727 cpi->cpi_coreid = cpu->cpu_id; 728 729 if (cpi->cpi_xmaxeax >= 0x80000008) { 730 731 coreidsz = BITX((cpi)->cpi_extd[8].cp_ecx, 15, 12); 732 733 /* 734 * In AMD parlance chip is really a node while Solaris 735 * sees chip as equivalent to socket/package. 736 */ 737 cpi->cpi_ncore_per_chip = 738 BITX((cpi)->cpi_extd[8].cp_ecx, 7, 0) + 1; 739 if (coreidsz == 0) { 740 /* Use legacy method */ 741 for (i = 1; i < cpi->cpi_ncore_per_chip; i <<= 1) 742 coreidsz++; 743 if (coreidsz == 0) 744 coreidsz = 1; 745 } 746 } else { 747 /* Assume single-core part */ 748 cpi->cpi_ncore_per_chip = 1; 749 coreidsz = 1; 750 } 751 752 cpi->cpi_clogid = cpi->cpi_pkgcoreid = 753 cpi->cpi_apicid & ((1<<coreidsz) - 1); 754 cpi->cpi_ncpu_per_chip = cpi->cpi_ncore_per_chip; 755 756 /* Get nodeID */ 757 if (cpi->cpi_family == 0xf) { 758 cpi->cpi_procnodeid = (cpi->cpi_apicid >> coreidsz) & 7; 759 cpi->cpi_chipid = cpi->cpi_procnodeid; 760 } else if (cpi->cpi_family == 0x10) { 761 /* 762 * See if we are a multi-node processor. 763 * All processors in the system have the same number of nodes 764 */ 765 nb_caps_reg = pci_getl_func(0, 24, 3, 0xe8); 766 if ((cpi->cpi_model < 8) || BITX(nb_caps_reg, 29, 29) == 0) { 767 /* Single-node */ 768 cpi->cpi_procnodeid = BITX(cpi->cpi_apicid, 5, 769 coreidsz); 770 cpi->cpi_chipid = cpi->cpi_procnodeid; 771 } else { 772 773 /* 774 * Multi-node revision D (2 nodes per package 775 * are supported) 776 */ 777 cpi->cpi_procnodes_per_pkg = 2; 778 779 first_half = (cpi->cpi_pkgcoreid <= 780 (cpi->cpi_ncore_per_chip/2 - 1)); 781 782 if (cpi->cpi_apicid == cpi->cpi_pkgcoreid) { 783 /* We are BSP */ 784 cpi->cpi_procnodeid = (first_half ? 0 : 1); 785 cpi->cpi_chipid = cpi->cpi_procnodeid >> 1; 786 } else { 787 788 /* We are AP */ 789 /* NodeId[2:1] bits to use for reading F3xe8 */ 790 node2_1 = BITX(cpi->cpi_apicid, 5, 4) << 1; 791 792 nb_caps_reg = 793 pci_getl_func(0, 24 + node2_1, 3, 0xe8); 794 795 /* 796 * Check IntNodeNum bit (31:30, but bit 31 is 797 * always 0 on dual-node processors) 798 */ 799 if (BITX(nb_caps_reg, 30, 30) == 0) 800 cpi->cpi_procnodeid = node2_1 + 801 !first_half; 802 else 803 cpi->cpi_procnodeid = node2_1 + 804 first_half; 805 806 cpi->cpi_chipid = cpi->cpi_procnodeid >> 1; 807 } 808 } 809 } else if (cpi->cpi_family >= 0x11) { 810 cpi->cpi_procnodeid = (cpi->cpi_apicid >> coreidsz) & 7; 811 cpi->cpi_chipid = cpi->cpi_procnodeid; 812 } else { 813 cpi->cpi_procnodeid = 0; 814 cpi->cpi_chipid = cpi->cpi_procnodeid; 815 } 816 } 817 818 void * 819 cpuid_pass1(cpu_t *cpu) 820 { 821 uint32_t mask_ecx, mask_edx; 822 void *featureset; 823 struct cpuid_info *cpi; 824 struct cpuid_regs *cp; 825 int xcpuid; 826 #if !defined(__xpv) 827 extern int idle_cpu_prefer_mwait; 828 #endif 829 830 831 #if !defined(__xpv) 832 determine_platform(); 833 #endif 834 /* 835 * Space statically allocated for BSP, ensure pointer is set 836 */ 837 if (cpu->cpu_id == 0) { 838 if (cpu->cpu_m.mcpu_cpi == NULL) 839 cpu->cpu_m.mcpu_cpi = &cpuid_info0; 840 featureset = x86_featureset0; 841 } else { 842 featureset = init_x86_featureset(); 843 } 844 845 add_x86_feature(featureset, X86FSET_CPUID); 846 847 cpi = cpu->cpu_m.mcpu_cpi; 848 ASSERT(cpi != NULL); 849 cp = &cpi->cpi_std[0]; 850 cp->cp_eax = 0; 851 cpi->cpi_maxeax = __cpuid_insn(cp); 852 { 853 uint32_t *iptr = (uint32_t *)cpi->cpi_vendorstr; 854 *iptr++ = cp->cp_ebx; 855 *iptr++ = cp->cp_edx; 856 *iptr++ = cp->cp_ecx; 857 *(char *)&cpi->cpi_vendorstr[12] = '\0'; 858 } 859 860 cpi->cpi_vendor = _cpuid_vendorstr_to_vendorcode(cpi->cpi_vendorstr); 861 x86_vendor = cpi->cpi_vendor; /* for compatibility */ 862 863 /* 864 * Limit the range in case of weird hardware 865 */ 866 if (cpi->cpi_maxeax > CPI_MAXEAX_MAX) 867 cpi->cpi_maxeax = CPI_MAXEAX_MAX; 868 if (cpi->cpi_maxeax < 1) 869 goto pass1_done; 870 871 cp = &cpi->cpi_std[1]; 872 cp->cp_eax = 1; 873 (void) __cpuid_insn(cp); 874 875 /* 876 * Extract identifying constants for easy access. 877 */ 878 cpi->cpi_model = CPI_MODEL(cpi); 879 cpi->cpi_family = CPI_FAMILY(cpi); 880 881 if (cpi->cpi_family == 0xf) 882 cpi->cpi_family += CPI_FAMILY_XTD(cpi); 883 884 /* 885 * Beware: AMD uses "extended model" iff base *FAMILY* == 0xf. 886 * Intel, and presumably everyone else, uses model == 0xf, as 887 * one would expect (max value means possible overflow). Sigh. 888 */ 889 890 switch (cpi->cpi_vendor) { 891 case X86_VENDOR_Intel: 892 if (IS_EXTENDED_MODEL_INTEL(cpi)) 893 cpi->cpi_model += CPI_MODEL_XTD(cpi) << 4; 894 break; 895 case X86_VENDOR_AMD: 896 if (CPI_FAMILY(cpi) == 0xf) 897 cpi->cpi_model += CPI_MODEL_XTD(cpi) << 4; 898 break; 899 default: 900 if (cpi->cpi_model == 0xf) 901 cpi->cpi_model += CPI_MODEL_XTD(cpi) << 4; 902 break; 903 } 904 905 cpi->cpi_step = CPI_STEP(cpi); 906 cpi->cpi_brandid = CPI_BRANDID(cpi); 907 908 /* 909 * *default* assumptions: 910 * - believe %edx feature word 911 * - ignore %ecx feature word 912 * - 32-bit virtual and physical addressing 913 */ 914 mask_edx = 0xffffffff; 915 mask_ecx = 0; 916 917 cpi->cpi_pabits = cpi->cpi_vabits = 32; 918 919 switch (cpi->cpi_vendor) { 920 case X86_VENDOR_Intel: 921 if (cpi->cpi_family == 5) 922 x86_type = X86_TYPE_P5; 923 else if (IS_LEGACY_P6(cpi)) { 924 x86_type = X86_TYPE_P6; 925 pentiumpro_bug4046376 = 1; 926 pentiumpro_bug4064495 = 1; 927 /* 928 * Clear the SEP bit when it was set erroneously 929 */ 930 if (cpi->cpi_model < 3 && cpi->cpi_step < 3) 931 cp->cp_edx &= ~CPUID_INTC_EDX_SEP; 932 } else if (IS_NEW_F6(cpi) || cpi->cpi_family == 0xf) { 933 x86_type = X86_TYPE_P4; 934 /* 935 * We don't currently depend on any of the %ecx 936 * features until Prescott, so we'll only check 937 * this from P4 onwards. We might want to revisit 938 * that idea later. 939 */ 940 mask_ecx = 0xffffffff; 941 } else if (cpi->cpi_family > 0xf) 942 mask_ecx = 0xffffffff; 943 /* 944 * We don't support MONITOR/MWAIT if leaf 5 is not available 945 * to obtain the monitor linesize. 946 */ 947 if (cpi->cpi_maxeax < 5) 948 mask_ecx &= ~CPUID_INTC_ECX_MON; 949 break; 950 case X86_VENDOR_IntelClone: 951 default: 952 break; 953 case X86_VENDOR_AMD: 954 #if defined(OPTERON_ERRATUM_108) 955 if (cpi->cpi_family == 0xf && cpi->cpi_model == 0xe) { 956 cp->cp_eax = (0xf0f & cp->cp_eax) | 0xc0; 957 cpi->cpi_model = 0xc; 958 } else 959 #endif 960 if (cpi->cpi_family == 5) { 961 /* 962 * AMD K5 and K6 963 * 964 * These CPUs have an incomplete implementation 965 * of MCA/MCE which we mask away. 966 */ 967 mask_edx &= ~(CPUID_INTC_EDX_MCE | CPUID_INTC_EDX_MCA); 968 969 /* 970 * Model 0 uses the wrong (APIC) bit 971 * to indicate PGE. Fix it here. 972 */ 973 if (cpi->cpi_model == 0) { 974 if (cp->cp_edx & 0x200) { 975 cp->cp_edx &= ~0x200; 976 cp->cp_edx |= CPUID_INTC_EDX_PGE; 977 } 978 } 979 980 /* 981 * Early models had problems w/ MMX; disable. 982 */ 983 if (cpi->cpi_model < 6) 984 mask_edx &= ~CPUID_INTC_EDX_MMX; 985 } 986 987 /* 988 * For newer families, SSE3 and CX16, at least, are valid; 989 * enable all 990 */ 991 if (cpi->cpi_family >= 0xf) 992 mask_ecx = 0xffffffff; 993 /* 994 * We don't support MONITOR/MWAIT if leaf 5 is not available 995 * to obtain the monitor linesize. 996 */ 997 if (cpi->cpi_maxeax < 5) 998 mask_ecx &= ~CPUID_INTC_ECX_MON; 999 1000 #if !defined(__xpv) 1001 /* 1002 * Do not use MONITOR/MWAIT to halt in the idle loop on any AMD 1003 * processors. AMD does not intend MWAIT to be used in the cpu 1004 * idle loop on current and future processors. 10h and future 1005 * AMD processors use more power in MWAIT than HLT. 1006 * Pre-family-10h Opterons do not have the MWAIT instruction. 1007 */ 1008 idle_cpu_prefer_mwait = 0; 1009 #endif 1010 1011 break; 1012 case X86_VENDOR_TM: 1013 /* 1014 * workaround the NT workaround in CMS 4.1 1015 */ 1016 if (cpi->cpi_family == 5 && cpi->cpi_model == 4 && 1017 (cpi->cpi_step == 2 || cpi->cpi_step == 3)) 1018 cp->cp_edx |= CPUID_INTC_EDX_CX8; 1019 break; 1020 case X86_VENDOR_Centaur: 1021 /* 1022 * workaround the NT workarounds again 1023 */ 1024 if (cpi->cpi_family == 6) 1025 cp->cp_edx |= CPUID_INTC_EDX_CX8; 1026 break; 1027 case X86_VENDOR_Cyrix: 1028 /* 1029 * We rely heavily on the probing in locore 1030 * to actually figure out what parts, if any, 1031 * of the Cyrix cpuid instruction to believe. 1032 */ 1033 switch (x86_type) { 1034 case X86_TYPE_CYRIX_486: 1035 mask_edx = 0; 1036 break; 1037 case X86_TYPE_CYRIX_6x86: 1038 mask_edx = 0; 1039 break; 1040 case X86_TYPE_CYRIX_6x86L: 1041 mask_edx = 1042 CPUID_INTC_EDX_DE | 1043 CPUID_INTC_EDX_CX8; 1044 break; 1045 case X86_TYPE_CYRIX_6x86MX: 1046 mask_edx = 1047 CPUID_INTC_EDX_DE | 1048 CPUID_INTC_EDX_MSR | 1049 CPUID_INTC_EDX_CX8 | 1050 CPUID_INTC_EDX_PGE | 1051 CPUID_INTC_EDX_CMOV | 1052 CPUID_INTC_EDX_MMX; 1053 break; 1054 case X86_TYPE_CYRIX_GXm: 1055 mask_edx = 1056 CPUID_INTC_EDX_MSR | 1057 CPUID_INTC_EDX_CX8 | 1058 CPUID_INTC_EDX_CMOV | 1059 CPUID_INTC_EDX_MMX; 1060 break; 1061 case X86_TYPE_CYRIX_MediaGX: 1062 break; 1063 case X86_TYPE_CYRIX_MII: 1064 case X86_TYPE_VIA_CYRIX_III: 1065 mask_edx = 1066 CPUID_INTC_EDX_DE | 1067 CPUID_INTC_EDX_TSC | 1068 CPUID_INTC_EDX_MSR | 1069 CPUID_INTC_EDX_CX8 | 1070 CPUID_INTC_EDX_PGE | 1071 CPUID_INTC_EDX_CMOV | 1072 CPUID_INTC_EDX_MMX; 1073 break; 1074 default: 1075 break; 1076 } 1077 break; 1078 } 1079 1080 #if defined(__xpv) 1081 /* 1082 * Do not support MONITOR/MWAIT under a hypervisor 1083 */ 1084 mask_ecx &= ~CPUID_INTC_ECX_MON; 1085 #endif /* __xpv */ 1086 1087 /* 1088 * Now we've figured out the masks that determine 1089 * which bits we choose to believe, apply the masks 1090 * to the feature words, then map the kernel's view 1091 * of these feature words into its feature word. 1092 */ 1093 cp->cp_edx &= mask_edx; 1094 cp->cp_ecx &= mask_ecx; 1095 1096 /* 1097 * apply any platform restrictions (we don't call this 1098 * immediately after __cpuid_insn here, because we need the 1099 * workarounds applied above first) 1100 */ 1101 platform_cpuid_mangle(cpi->cpi_vendor, 1, cp); 1102 1103 /* 1104 * fold in overrides from the "eeprom" mechanism 1105 */ 1106 cp->cp_edx |= cpuid_feature_edx_include; 1107 cp->cp_edx &= ~cpuid_feature_edx_exclude; 1108 1109 cp->cp_ecx |= cpuid_feature_ecx_include; 1110 cp->cp_ecx &= ~cpuid_feature_ecx_exclude; 1111 1112 if (cp->cp_edx & CPUID_INTC_EDX_PSE) { 1113 add_x86_feature(featureset, X86FSET_LARGEPAGE); 1114 } 1115 if (cp->cp_edx & CPUID_INTC_EDX_TSC) { 1116 add_x86_feature(featureset, X86FSET_TSC); 1117 } 1118 if (cp->cp_edx & CPUID_INTC_EDX_MSR) { 1119 add_x86_feature(featureset, X86FSET_MSR); 1120 } 1121 if (cp->cp_edx & CPUID_INTC_EDX_MTRR) { 1122 add_x86_feature(featureset, X86FSET_MTRR); 1123 } 1124 if (cp->cp_edx & CPUID_INTC_EDX_PGE) { 1125 add_x86_feature(featureset, X86FSET_PGE); 1126 } 1127 if (cp->cp_edx & CPUID_INTC_EDX_CMOV) { 1128 add_x86_feature(featureset, X86FSET_CMOV); 1129 } 1130 if (cp->cp_edx & CPUID_INTC_EDX_MMX) { 1131 add_x86_feature(featureset, X86FSET_MMX); 1132 } 1133 if ((cp->cp_edx & CPUID_INTC_EDX_MCE) != 0 && 1134 (cp->cp_edx & CPUID_INTC_EDX_MCA) != 0) { 1135 add_x86_feature(featureset, X86FSET_MCA); 1136 } 1137 if (cp->cp_edx & CPUID_INTC_EDX_PAE) { 1138 add_x86_feature(featureset, X86FSET_PAE); 1139 } 1140 if (cp->cp_edx & CPUID_INTC_EDX_CX8) { 1141 add_x86_feature(featureset, X86FSET_CX8); 1142 } 1143 if (cp->cp_ecx & CPUID_INTC_ECX_CX16) { 1144 add_x86_feature(featureset, X86FSET_CX16); 1145 } 1146 if (cp->cp_edx & CPUID_INTC_EDX_PAT) { 1147 add_x86_feature(featureset, X86FSET_PAT); 1148 } 1149 if (cp->cp_edx & CPUID_INTC_EDX_SEP) { 1150 add_x86_feature(featureset, X86FSET_SEP); 1151 } 1152 if (cp->cp_edx & CPUID_INTC_EDX_FXSR) { 1153 /* 1154 * In our implementation, fxsave/fxrstor 1155 * are prerequisites before we'll even 1156 * try and do SSE things. 1157 */ 1158 if (cp->cp_edx & CPUID_INTC_EDX_SSE) { 1159 add_x86_feature(featureset, X86FSET_SSE); 1160 } 1161 if (cp->cp_edx & CPUID_INTC_EDX_SSE2) { 1162 add_x86_feature(featureset, X86FSET_SSE2); 1163 } 1164 if (cp->cp_ecx & CPUID_INTC_ECX_SSE3) { 1165 add_x86_feature(featureset, X86FSET_SSE3); 1166 } 1167 if (cpi->cpi_vendor == X86_VENDOR_Intel) { 1168 if (cp->cp_ecx & CPUID_INTC_ECX_SSSE3) { 1169 add_x86_feature(featureset, X86FSET_SSSE3); 1170 } 1171 if (cp->cp_ecx & CPUID_INTC_ECX_SSE4_1) { 1172 add_x86_feature(featureset, X86FSET_SSE4_1); 1173 } 1174 if (cp->cp_ecx & CPUID_INTC_ECX_SSE4_2) { 1175 add_x86_feature(featureset, X86FSET_SSE4_2); 1176 } 1177 if (cp->cp_ecx & CPUID_INTC_ECX_AES) { 1178 add_x86_feature(featureset, X86FSET_AES); 1179 } 1180 if (cp->cp_ecx & CPUID_INTC_ECX_PCLMULQDQ) { 1181 add_x86_feature(featureset, X86FSET_PCLMULQDQ); 1182 } 1183 } 1184 } 1185 if (cp->cp_edx & CPUID_INTC_EDX_DE) { 1186 add_x86_feature(featureset, X86FSET_DE); 1187 } 1188 #if !defined(__xpv) 1189 if (cp->cp_ecx & CPUID_INTC_ECX_MON) { 1190 1191 /* 1192 * We require the CLFLUSH instruction for erratum workaround 1193 * to use MONITOR/MWAIT. 1194 */ 1195 if (cp->cp_edx & CPUID_INTC_EDX_CLFSH) { 1196 cpi->cpi_mwait.support |= MWAIT_SUPPORT; 1197 add_x86_feature(featureset, X86FSET_MWAIT); 1198 } else { 1199 extern int idle_cpu_assert_cflush_monitor; 1200 1201 /* 1202 * All processors we are aware of which have 1203 * MONITOR/MWAIT also have CLFLUSH. 1204 */ 1205 if (idle_cpu_assert_cflush_monitor) { 1206 ASSERT((cp->cp_ecx & CPUID_INTC_ECX_MON) && 1207 (cp->cp_edx & CPUID_INTC_EDX_CLFSH)); 1208 } 1209 } 1210 } 1211 #endif /* __xpv */ 1212 1213 /* 1214 * Only need it first time, rest of the cpus would follow suite. 1215 * we only capture this for the bootcpu. 1216 */ 1217 if (cp->cp_edx & CPUID_INTC_EDX_CLFSH) { 1218 add_x86_feature(featureset, X86FSET_CLFSH); 1219 x86_clflush_size = (BITX(cp->cp_ebx, 15, 8) * 8); 1220 } 1221 if (is_x86_feature(featureset, X86FSET_PAE)) 1222 cpi->cpi_pabits = 36; 1223 1224 /* 1225 * Hyperthreading configuration is slightly tricky on Intel 1226 * and pure clones, and even trickier on AMD. 1227 * 1228 * (AMD chose to set the HTT bit on their CMP processors, 1229 * even though they're not actually hyperthreaded. Thus it 1230 * takes a bit more work to figure out what's really going 1231 * on ... see the handling of the CMP_LGCY bit below) 1232 */ 1233 if (cp->cp_edx & CPUID_INTC_EDX_HTT) { 1234 cpi->cpi_ncpu_per_chip = CPI_CPU_COUNT(cpi); 1235 if (cpi->cpi_ncpu_per_chip > 1) 1236 add_x86_feature(featureset, X86FSET_HTT); 1237 } else { 1238 cpi->cpi_ncpu_per_chip = 1; 1239 } 1240 1241 /* 1242 * Work on the "extended" feature information, doing 1243 * some basic initialization for cpuid_pass2() 1244 */ 1245 xcpuid = 0; 1246 switch (cpi->cpi_vendor) { 1247 case X86_VENDOR_Intel: 1248 if (IS_NEW_F6(cpi) || cpi->cpi_family >= 0xf) 1249 xcpuid++; 1250 break; 1251 case X86_VENDOR_AMD: 1252 if (cpi->cpi_family > 5 || 1253 (cpi->cpi_family == 5 && cpi->cpi_model >= 1)) 1254 xcpuid++; 1255 break; 1256 case X86_VENDOR_Cyrix: 1257 /* 1258 * Only these Cyrix CPUs are -known- to support 1259 * extended cpuid operations. 1260 */ 1261 if (x86_type == X86_TYPE_VIA_CYRIX_III || 1262 x86_type == X86_TYPE_CYRIX_GXm) 1263 xcpuid++; 1264 break; 1265 case X86_VENDOR_Centaur: 1266 case X86_VENDOR_TM: 1267 default: 1268 xcpuid++; 1269 break; 1270 } 1271 1272 if (xcpuid) { 1273 cp = &cpi->cpi_extd[0]; 1274 cp->cp_eax = 0x80000000; 1275 cpi->cpi_xmaxeax = __cpuid_insn(cp); 1276 } 1277 1278 if (cpi->cpi_xmaxeax & 0x80000000) { 1279 1280 if (cpi->cpi_xmaxeax > CPI_XMAXEAX_MAX) 1281 cpi->cpi_xmaxeax = CPI_XMAXEAX_MAX; 1282 1283 switch (cpi->cpi_vendor) { 1284 case X86_VENDOR_Intel: 1285 case X86_VENDOR_AMD: 1286 if (cpi->cpi_xmaxeax < 0x80000001) 1287 break; 1288 cp = &cpi->cpi_extd[1]; 1289 cp->cp_eax = 0x80000001; 1290 (void) __cpuid_insn(cp); 1291 1292 if (cpi->cpi_vendor == X86_VENDOR_AMD && 1293 cpi->cpi_family == 5 && 1294 cpi->cpi_model == 6 && 1295 cpi->cpi_step == 6) { 1296 /* 1297 * K6 model 6 uses bit 10 to indicate SYSC 1298 * Later models use bit 11. Fix it here. 1299 */ 1300 if (cp->cp_edx & 0x400) { 1301 cp->cp_edx &= ~0x400; 1302 cp->cp_edx |= CPUID_AMD_EDX_SYSC; 1303 } 1304 } 1305 1306 platform_cpuid_mangle(cpi->cpi_vendor, 0x80000001, cp); 1307 1308 /* 1309 * Compute the additions to the kernel's feature word. 1310 */ 1311 if (cp->cp_edx & CPUID_AMD_EDX_NX) { 1312 add_x86_feature(featureset, X86FSET_NX); 1313 } 1314 1315 /* 1316 * Regardless whether or not we boot 64-bit, 1317 * we should have a way to identify whether 1318 * the CPU is capable of running 64-bit. 1319 */ 1320 if (cp->cp_edx & CPUID_AMD_EDX_LM) { 1321 add_x86_feature(featureset, X86FSET_64); 1322 } 1323 1324 #if defined(__amd64) 1325 /* 1 GB large page - enable only for 64 bit kernel */ 1326 if (cp->cp_edx & CPUID_AMD_EDX_1GPG) { 1327 add_x86_feature(featureset, X86FSET_1GPG); 1328 } 1329 #endif 1330 1331 if ((cpi->cpi_vendor == X86_VENDOR_AMD) && 1332 (cpi->cpi_std[1].cp_edx & CPUID_INTC_EDX_FXSR) && 1333 (cp->cp_ecx & CPUID_AMD_ECX_SSE4A)) { 1334 add_x86_feature(featureset, X86FSET_SSE4A); 1335 } 1336 1337 /* 1338 * If both the HTT and CMP_LGCY bits are set, 1339 * then we're not actually HyperThreaded. Read 1340 * "AMD CPUID Specification" for more details. 1341 */ 1342 if (cpi->cpi_vendor == X86_VENDOR_AMD && 1343 is_x86_feature(featureset, X86FSET_HTT) && 1344 (cp->cp_ecx & CPUID_AMD_ECX_CMP_LGCY)) { 1345 remove_x86_feature(featureset, X86FSET_HTT); 1346 add_x86_feature(featureset, X86FSET_CMP); 1347 } 1348 #if defined(__amd64) 1349 /* 1350 * It's really tricky to support syscall/sysret in 1351 * the i386 kernel; we rely on sysenter/sysexit 1352 * instead. In the amd64 kernel, things are -way- 1353 * better. 1354 */ 1355 if (cp->cp_edx & CPUID_AMD_EDX_SYSC) { 1356 add_x86_feature(featureset, X86FSET_ASYSC); 1357 } 1358 1359 /* 1360 * While we're thinking about system calls, note 1361 * that AMD processors don't support sysenter 1362 * in long mode at all, so don't try to program them. 1363 */ 1364 if (x86_vendor == X86_VENDOR_AMD) { 1365 remove_x86_feature(featureset, X86FSET_SEP); 1366 } 1367 #endif 1368 if (cp->cp_edx & CPUID_AMD_EDX_TSCP) { 1369 add_x86_feature(featureset, X86FSET_TSCP); 1370 } 1371 break; 1372 default: 1373 break; 1374 } 1375 1376 /* 1377 * Get CPUID data about processor cores and hyperthreads. 1378 */ 1379 switch (cpi->cpi_vendor) { 1380 case X86_VENDOR_Intel: 1381 if (cpi->cpi_maxeax >= 4) { 1382 cp = &cpi->cpi_std[4]; 1383 cp->cp_eax = 4; 1384 cp->cp_ecx = 0; 1385 (void) __cpuid_insn(cp); 1386 platform_cpuid_mangle(cpi->cpi_vendor, 4, cp); 1387 } 1388 /*FALLTHROUGH*/ 1389 case X86_VENDOR_AMD: 1390 if (cpi->cpi_xmaxeax < 0x80000008) 1391 break; 1392 cp = &cpi->cpi_extd[8]; 1393 cp->cp_eax = 0x80000008; 1394 (void) __cpuid_insn(cp); 1395 platform_cpuid_mangle(cpi->cpi_vendor, 0x80000008, cp); 1396 1397 /* 1398 * Virtual and physical address limits from 1399 * cpuid override previously guessed values. 1400 */ 1401 cpi->cpi_pabits = BITX(cp->cp_eax, 7, 0); 1402 cpi->cpi_vabits = BITX(cp->cp_eax, 15, 8); 1403 break; 1404 default: 1405 break; 1406 } 1407 1408 /* 1409 * Derive the number of cores per chip 1410 */ 1411 switch (cpi->cpi_vendor) { 1412 case X86_VENDOR_Intel: 1413 if (cpi->cpi_maxeax < 4) { 1414 cpi->cpi_ncore_per_chip = 1; 1415 break; 1416 } else { 1417 cpi->cpi_ncore_per_chip = 1418 BITX((cpi)->cpi_std[4].cp_eax, 31, 26) + 1; 1419 } 1420 break; 1421 case X86_VENDOR_AMD: 1422 if (cpi->cpi_xmaxeax < 0x80000008) { 1423 cpi->cpi_ncore_per_chip = 1; 1424 break; 1425 } else { 1426 /* 1427 * On family 0xf cpuid fn 2 ECX[7:0] "NC" is 1428 * 1 less than the number of physical cores on 1429 * the chip. In family 0x10 this value can 1430 * be affected by "downcoring" - it reflects 1431 * 1 less than the number of cores actually 1432 * enabled on this node. 1433 */ 1434 cpi->cpi_ncore_per_chip = 1435 BITX((cpi)->cpi_extd[8].cp_ecx, 7, 0) + 1; 1436 } 1437 break; 1438 default: 1439 cpi->cpi_ncore_per_chip = 1; 1440 break; 1441 } 1442 1443 /* 1444 * Get CPUID data about TSC Invariance in Deep C-State. 1445 */ 1446 switch (cpi->cpi_vendor) { 1447 case X86_VENDOR_Intel: 1448 if (cpi->cpi_maxeax >= 7) { 1449 cp = &cpi->cpi_extd[7]; 1450 cp->cp_eax = 0x80000007; 1451 cp->cp_ecx = 0; 1452 (void) __cpuid_insn(cp); 1453 } 1454 break; 1455 default: 1456 break; 1457 } 1458 } else { 1459 cpi->cpi_ncore_per_chip = 1; 1460 } 1461 1462 /* 1463 * If more than one core, then this processor is CMP. 1464 */ 1465 if (cpi->cpi_ncore_per_chip > 1) { 1466 add_x86_feature(featureset, X86FSET_CMP); 1467 } 1468 1469 /* 1470 * If the number of cores is the same as the number 1471 * of CPUs, then we cannot have HyperThreading. 1472 */ 1473 if (cpi->cpi_ncpu_per_chip == cpi->cpi_ncore_per_chip) { 1474 remove_x86_feature(featureset, X86FSET_HTT); 1475 } 1476 1477 cpi->cpi_apicid = CPI_APIC_ID(cpi); 1478 cpi->cpi_procnodes_per_pkg = 1; 1479 if (is_x86_feature(featureset, X86FSET_HTT) == B_FALSE && 1480 is_x86_feature(featureset, X86FSET_CMP) == B_FALSE) { 1481 /* 1482 * Single-core single-threaded processors. 1483 */ 1484 cpi->cpi_chipid = -1; 1485 cpi->cpi_clogid = 0; 1486 cpi->cpi_coreid = cpu->cpu_id; 1487 cpi->cpi_pkgcoreid = 0; 1488 if (cpi->cpi_vendor == X86_VENDOR_AMD) 1489 cpi->cpi_procnodeid = BITX(cpi->cpi_apicid, 3, 0); 1490 else 1491 cpi->cpi_procnodeid = cpi->cpi_chipid; 1492 } else if (cpi->cpi_ncpu_per_chip > 1) { 1493 if (cpi->cpi_vendor == X86_VENDOR_Intel) 1494 cpuid_intel_getids(cpu, featureset); 1495 else if (cpi->cpi_vendor == X86_VENDOR_AMD) 1496 cpuid_amd_getids(cpu); 1497 else { 1498 /* 1499 * All other processors are currently 1500 * assumed to have single cores. 1501 */ 1502 cpi->cpi_coreid = cpi->cpi_chipid; 1503 cpi->cpi_pkgcoreid = 0; 1504 cpi->cpi_procnodeid = cpi->cpi_chipid; 1505 } 1506 } 1507 1508 /* 1509 * Synthesize chip "revision" and socket type 1510 */ 1511 cpi->cpi_chiprev = _cpuid_chiprev(cpi->cpi_vendor, cpi->cpi_family, 1512 cpi->cpi_model, cpi->cpi_step); 1513 cpi->cpi_chiprevstr = _cpuid_chiprevstr(cpi->cpi_vendor, 1514 cpi->cpi_family, cpi->cpi_model, cpi->cpi_step); 1515 cpi->cpi_socket = _cpuid_skt(cpi->cpi_vendor, cpi->cpi_family, 1516 cpi->cpi_model, cpi->cpi_step); 1517 1518 pass1_done: 1519 cpi->cpi_pass = 1; 1520 return (featureset); 1521 } 1522 1523 /* 1524 * Make copies of the cpuid table entries we depend on, in 1525 * part for ease of parsing now, in part so that we have only 1526 * one place to correct any of it, in part for ease of 1527 * later export to userland, and in part so we can look at 1528 * this stuff in a crash dump. 1529 */ 1530 1531 /*ARGSUSED*/ 1532 void 1533 cpuid_pass2(cpu_t *cpu) 1534 { 1535 uint_t n, nmax; 1536 int i; 1537 struct cpuid_regs *cp; 1538 uint8_t *dp; 1539 uint32_t *iptr; 1540 struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi; 1541 1542 ASSERT(cpi->cpi_pass == 1); 1543 1544 if (cpi->cpi_maxeax < 1) 1545 goto pass2_done; 1546 1547 if ((nmax = cpi->cpi_maxeax + 1) > NMAX_CPI_STD) 1548 nmax = NMAX_CPI_STD; 1549 /* 1550 * (We already handled n == 0 and n == 1 in pass 1) 1551 */ 1552 for (n = 2, cp = &cpi->cpi_std[2]; n < nmax; n++, cp++) { 1553 cp->cp_eax = n; 1554 1555 /* 1556 * CPUID function 4 expects %ecx to be initialized 1557 * with an index which indicates which cache to return 1558 * information about. The OS is expected to call function 4 1559 * with %ecx set to 0, 1, 2, ... until it returns with 1560 * EAX[4:0] set to 0, which indicates there are no more 1561 * caches. 1562 * 1563 * Here, populate cpi_std[4] with the information returned by 1564 * function 4 when %ecx == 0, and do the rest in cpuid_pass3() 1565 * when dynamic memory allocation becomes available. 1566 * 1567 * Note: we need to explicitly initialize %ecx here, since 1568 * function 4 may have been previously invoked. 1569 */ 1570 if (n == 4) 1571 cp->cp_ecx = 0; 1572 1573 (void) __cpuid_insn(cp); 1574 platform_cpuid_mangle(cpi->cpi_vendor, n, cp); 1575 switch (n) { 1576 case 2: 1577 /* 1578 * "the lower 8 bits of the %eax register 1579 * contain a value that identifies the number 1580 * of times the cpuid [instruction] has to be 1581 * executed to obtain a complete image of the 1582 * processor's caching systems." 1583 * 1584 * How *do* they make this stuff up? 1585 */ 1586 cpi->cpi_ncache = sizeof (*cp) * 1587 BITX(cp->cp_eax, 7, 0); 1588 if (cpi->cpi_ncache == 0) 1589 break; 1590 cpi->cpi_ncache--; /* skip count byte */ 1591 1592 /* 1593 * Well, for now, rather than attempt to implement 1594 * this slightly dubious algorithm, we just look 1595 * at the first 15 .. 1596 */ 1597 if (cpi->cpi_ncache > (sizeof (*cp) - 1)) 1598 cpi->cpi_ncache = sizeof (*cp) - 1; 1599 1600 dp = cpi->cpi_cacheinfo; 1601 if (BITX(cp->cp_eax, 31, 31) == 0) { 1602 uint8_t *p = (void *)&cp->cp_eax; 1603 for (i = 1; i < 4; i++) 1604 if (p[i] != 0) 1605 *dp++ = p[i]; 1606 } 1607 if (BITX(cp->cp_ebx, 31, 31) == 0) { 1608 uint8_t *p = (void *)&cp->cp_ebx; 1609 for (i = 0; i < 4; i++) 1610 if (p[i] != 0) 1611 *dp++ = p[i]; 1612 } 1613 if (BITX(cp->cp_ecx, 31, 31) == 0) { 1614 uint8_t *p = (void *)&cp->cp_ecx; 1615 for (i = 0; i < 4; i++) 1616 if (p[i] != 0) 1617 *dp++ = p[i]; 1618 } 1619 if (BITX(cp->cp_edx, 31, 31) == 0) { 1620 uint8_t *p = (void *)&cp->cp_edx; 1621 for (i = 0; i < 4; i++) 1622 if (p[i] != 0) 1623 *dp++ = p[i]; 1624 } 1625 break; 1626 1627 case 3: /* Processor serial number, if PSN supported */ 1628 break; 1629 1630 case 4: /* Deterministic cache parameters */ 1631 break; 1632 1633 case 5: /* Monitor/Mwait parameters */ 1634 { 1635 size_t mwait_size; 1636 1637 /* 1638 * check cpi_mwait.support which was set in cpuid_pass1 1639 */ 1640 if (!(cpi->cpi_mwait.support & MWAIT_SUPPORT)) 1641 break; 1642 1643 /* 1644 * Protect ourself from insane mwait line size. 1645 * Workaround for incomplete hardware emulator(s). 1646 */ 1647 mwait_size = (size_t)MWAIT_SIZE_MAX(cpi); 1648 if (mwait_size < sizeof (uint32_t) || 1649 !ISP2(mwait_size)) { 1650 #if DEBUG 1651 cmn_err(CE_NOTE, "Cannot handle cpu %d mwait " 1652 "size %ld", cpu->cpu_id, (long)mwait_size); 1653 #endif 1654 break; 1655 } 1656 1657 cpi->cpi_mwait.mon_min = (size_t)MWAIT_SIZE_MIN(cpi); 1658 cpi->cpi_mwait.mon_max = mwait_size; 1659 if (MWAIT_EXTENSION(cpi)) { 1660 cpi->cpi_mwait.support |= MWAIT_EXTENSIONS; 1661 if (MWAIT_INT_ENABLE(cpi)) 1662 cpi->cpi_mwait.support |= 1663 MWAIT_ECX_INT_ENABLE; 1664 } 1665 break; 1666 } 1667 default: 1668 break; 1669 } 1670 } 1671 1672 if (cpi->cpi_maxeax >= 0xB && cpi->cpi_vendor == X86_VENDOR_Intel) { 1673 struct cpuid_regs regs; 1674 1675 cp = ®s; 1676 cp->cp_eax = 0xB; 1677 cp->cp_edx = cp->cp_ebx = cp->cp_ecx = 0; 1678 1679 (void) __cpuid_insn(cp); 1680 1681 /* 1682 * Check CPUID.EAX=0BH, ECX=0H:EBX is non-zero, which 1683 * indicates that the extended topology enumeration leaf is 1684 * available. 1685 */ 1686 if (cp->cp_ebx) { 1687 uint32_t x2apic_id; 1688 uint_t coreid_shift = 0; 1689 uint_t ncpu_per_core = 1; 1690 uint_t chipid_shift = 0; 1691 uint_t ncpu_per_chip = 1; 1692 uint_t i; 1693 uint_t level; 1694 1695 for (i = 0; i < CPI_FNB_ECX_MAX; i++) { 1696 cp->cp_eax = 0xB; 1697 cp->cp_ecx = i; 1698 1699 (void) __cpuid_insn(cp); 1700 level = CPI_CPU_LEVEL_TYPE(cp); 1701 1702 if (level == 1) { 1703 x2apic_id = cp->cp_edx; 1704 coreid_shift = BITX(cp->cp_eax, 4, 0); 1705 ncpu_per_core = BITX(cp->cp_ebx, 15, 0); 1706 } else if (level == 2) { 1707 x2apic_id = cp->cp_edx; 1708 chipid_shift = BITX(cp->cp_eax, 4, 0); 1709 ncpu_per_chip = BITX(cp->cp_ebx, 15, 0); 1710 } 1711 } 1712 1713 cpi->cpi_apicid = x2apic_id; 1714 cpi->cpi_ncpu_per_chip = ncpu_per_chip; 1715 cpi->cpi_ncore_per_chip = ncpu_per_chip / 1716 ncpu_per_core; 1717 cpi->cpi_chipid = x2apic_id >> chipid_shift; 1718 cpi->cpi_clogid = x2apic_id & ((1 << chipid_shift) - 1); 1719 cpi->cpi_coreid = x2apic_id >> coreid_shift; 1720 cpi->cpi_pkgcoreid = cpi->cpi_clogid >> coreid_shift; 1721 } 1722 1723 /* Make cp NULL so that we don't stumble on others */ 1724 cp = NULL; 1725 } 1726 1727 if ((cpi->cpi_xmaxeax & 0x80000000) == 0) 1728 goto pass2_done; 1729 1730 if ((nmax = cpi->cpi_xmaxeax - 0x80000000 + 1) > NMAX_CPI_EXTD) 1731 nmax = NMAX_CPI_EXTD; 1732 /* 1733 * Copy the extended properties, fixing them as we go. 1734 * (We already handled n == 0 and n == 1 in pass 1) 1735 */ 1736 iptr = (void *)cpi->cpi_brandstr; 1737 for (n = 2, cp = &cpi->cpi_extd[2]; n < nmax; cp++, n++) { 1738 cp->cp_eax = 0x80000000 + n; 1739 (void) __cpuid_insn(cp); 1740 platform_cpuid_mangle(cpi->cpi_vendor, 0x80000000 + n, cp); 1741 switch (n) { 1742 case 2: 1743 case 3: 1744 case 4: 1745 /* 1746 * Extract the brand string 1747 */ 1748 *iptr++ = cp->cp_eax; 1749 *iptr++ = cp->cp_ebx; 1750 *iptr++ = cp->cp_ecx; 1751 *iptr++ = cp->cp_edx; 1752 break; 1753 case 5: 1754 switch (cpi->cpi_vendor) { 1755 case X86_VENDOR_AMD: 1756 /* 1757 * The Athlon and Duron were the first 1758 * parts to report the sizes of the 1759 * TLB for large pages. Before then, 1760 * we don't trust the data. 1761 */ 1762 if (cpi->cpi_family < 6 || 1763 (cpi->cpi_family == 6 && 1764 cpi->cpi_model < 1)) 1765 cp->cp_eax = 0; 1766 break; 1767 default: 1768 break; 1769 } 1770 break; 1771 case 6: 1772 switch (cpi->cpi_vendor) { 1773 case X86_VENDOR_AMD: 1774 /* 1775 * The Athlon and Duron were the first 1776 * AMD parts with L2 TLB's. 1777 * Before then, don't trust the data. 1778 */ 1779 if (cpi->cpi_family < 6 || 1780 cpi->cpi_family == 6 && 1781 cpi->cpi_model < 1) 1782 cp->cp_eax = cp->cp_ebx = 0; 1783 /* 1784 * AMD Duron rev A0 reports L2 1785 * cache size incorrectly as 1K 1786 * when it is really 64K 1787 */ 1788 if (cpi->cpi_family == 6 && 1789 cpi->cpi_model == 3 && 1790 cpi->cpi_step == 0) { 1791 cp->cp_ecx &= 0xffff; 1792 cp->cp_ecx |= 0x400000; 1793 } 1794 break; 1795 case X86_VENDOR_Cyrix: /* VIA C3 */ 1796 /* 1797 * VIA C3 processors are a bit messed 1798 * up w.r.t. encoding cache sizes in %ecx 1799 */ 1800 if (cpi->cpi_family != 6) 1801 break; 1802 /* 1803 * model 7 and 8 were incorrectly encoded 1804 * 1805 * xxx is model 8 really broken? 1806 */ 1807 if (cpi->cpi_model == 7 || 1808 cpi->cpi_model == 8) 1809 cp->cp_ecx = 1810 BITX(cp->cp_ecx, 31, 24) << 16 | 1811 BITX(cp->cp_ecx, 23, 16) << 12 | 1812 BITX(cp->cp_ecx, 15, 8) << 8 | 1813 BITX(cp->cp_ecx, 7, 0); 1814 /* 1815 * model 9 stepping 1 has wrong associativity 1816 */ 1817 if (cpi->cpi_model == 9 && cpi->cpi_step == 1) 1818 cp->cp_ecx |= 8 << 12; 1819 break; 1820 case X86_VENDOR_Intel: 1821 /* 1822 * Extended L2 Cache features function. 1823 * First appeared on Prescott. 1824 */ 1825 default: 1826 break; 1827 } 1828 break; 1829 default: 1830 break; 1831 } 1832 } 1833 1834 pass2_done: 1835 cpi->cpi_pass = 2; 1836 } 1837 1838 static const char * 1839 intel_cpubrand(const struct cpuid_info *cpi) 1840 { 1841 int i; 1842 1843 if (!is_x86_feature(x86_featureset, X86FSET_CPUID) || 1844 cpi->cpi_maxeax < 1 || cpi->cpi_family < 5) 1845 return ("i486"); 1846 1847 switch (cpi->cpi_family) { 1848 case 5: 1849 return ("Intel Pentium(r)"); 1850 case 6: 1851 switch (cpi->cpi_model) { 1852 uint_t celeron, xeon; 1853 const struct cpuid_regs *cp; 1854 case 0: 1855 case 1: 1856 case 2: 1857 return ("Intel Pentium(r) Pro"); 1858 case 3: 1859 case 4: 1860 return ("Intel Pentium(r) II"); 1861 case 6: 1862 return ("Intel Celeron(r)"); 1863 case 5: 1864 case 7: 1865 celeron = xeon = 0; 1866 cp = &cpi->cpi_std[2]; /* cache info */ 1867 1868 for (i = 1; i < 4; i++) { 1869 uint_t tmp; 1870 1871 tmp = (cp->cp_eax >> (8 * i)) & 0xff; 1872 if (tmp == 0x40) 1873 celeron++; 1874 if (tmp >= 0x44 && tmp <= 0x45) 1875 xeon++; 1876 } 1877 1878 for (i = 0; i < 2; i++) { 1879 uint_t tmp; 1880 1881 tmp = (cp->cp_ebx >> (8 * i)) & 0xff; 1882 if (tmp == 0x40) 1883 celeron++; 1884 else if (tmp >= 0x44 && tmp <= 0x45) 1885 xeon++; 1886 } 1887 1888 for (i = 0; i < 4; i++) { 1889 uint_t tmp; 1890 1891 tmp = (cp->cp_ecx >> (8 * i)) & 0xff; 1892 if (tmp == 0x40) 1893 celeron++; 1894 else if (tmp >= 0x44 && tmp <= 0x45) 1895 xeon++; 1896 } 1897 1898 for (i = 0; i < 4; i++) { 1899 uint_t tmp; 1900 1901 tmp = (cp->cp_edx >> (8 * i)) & 0xff; 1902 if (tmp == 0x40) 1903 celeron++; 1904 else if (tmp >= 0x44 && tmp <= 0x45) 1905 xeon++; 1906 } 1907 1908 if (celeron) 1909 return ("Intel Celeron(r)"); 1910 if (xeon) 1911 return (cpi->cpi_model == 5 ? 1912 "Intel Pentium(r) II Xeon(tm)" : 1913 "Intel Pentium(r) III Xeon(tm)"); 1914 return (cpi->cpi_model == 5 ? 1915 "Intel Pentium(r) II or Pentium(r) II Xeon(tm)" : 1916 "Intel Pentium(r) III or Pentium(r) III Xeon(tm)"); 1917 default: 1918 break; 1919 } 1920 default: 1921 break; 1922 } 1923 1924 /* BrandID is present if the field is nonzero */ 1925 if (cpi->cpi_brandid != 0) { 1926 static const struct { 1927 uint_t bt_bid; 1928 const char *bt_str; 1929 } brand_tbl[] = { 1930 { 0x1, "Intel(r) Celeron(r)" }, 1931 { 0x2, "Intel(r) Pentium(r) III" }, 1932 { 0x3, "Intel(r) Pentium(r) III Xeon(tm)" }, 1933 { 0x4, "Intel(r) Pentium(r) III" }, 1934 { 0x6, "Mobile Intel(r) Pentium(r) III" }, 1935 { 0x7, "Mobile Intel(r) Celeron(r)" }, 1936 { 0x8, "Intel(r) Pentium(r) 4" }, 1937 { 0x9, "Intel(r) Pentium(r) 4" }, 1938 { 0xa, "Intel(r) Celeron(r)" }, 1939 { 0xb, "Intel(r) Xeon(tm)" }, 1940 { 0xc, "Intel(r) Xeon(tm) MP" }, 1941 { 0xe, "Mobile Intel(r) Pentium(r) 4" }, 1942 { 0xf, "Mobile Intel(r) Celeron(r)" }, 1943 { 0x11, "Mobile Genuine Intel(r)" }, 1944 { 0x12, "Intel(r) Celeron(r) M" }, 1945 { 0x13, "Mobile Intel(r) Celeron(r)" }, 1946 { 0x14, "Intel(r) Celeron(r)" }, 1947 { 0x15, "Mobile Genuine Intel(r)" }, 1948 { 0x16, "Intel(r) Pentium(r) M" }, 1949 { 0x17, "Mobile Intel(r) Celeron(r)" } 1950 }; 1951 uint_t btblmax = sizeof (brand_tbl) / sizeof (brand_tbl[0]); 1952 uint_t sgn; 1953 1954 sgn = (cpi->cpi_family << 8) | 1955 (cpi->cpi_model << 4) | cpi->cpi_step; 1956 1957 for (i = 0; i < btblmax; i++) 1958 if (brand_tbl[i].bt_bid == cpi->cpi_brandid) 1959 break; 1960 if (i < btblmax) { 1961 if (sgn == 0x6b1 && cpi->cpi_brandid == 3) 1962 return ("Intel(r) Celeron(r)"); 1963 if (sgn < 0xf13 && cpi->cpi_brandid == 0xb) 1964 return ("Intel(r) Xeon(tm) MP"); 1965 if (sgn < 0xf13 && cpi->cpi_brandid == 0xe) 1966 return ("Intel(r) Xeon(tm)"); 1967 return (brand_tbl[i].bt_str); 1968 } 1969 } 1970 1971 return (NULL); 1972 } 1973 1974 static const char * 1975 amd_cpubrand(const struct cpuid_info *cpi) 1976 { 1977 if (!is_x86_feature(x86_featureset, X86FSET_CPUID) || 1978 cpi->cpi_maxeax < 1 || cpi->cpi_family < 5) 1979 return ("i486 compatible"); 1980 1981 switch (cpi->cpi_family) { 1982 case 5: 1983 switch (cpi->cpi_model) { 1984 case 0: 1985 case 1: 1986 case 2: 1987 case 3: 1988 case 4: 1989 case 5: 1990 return ("AMD-K5(r)"); 1991 case 6: 1992 case 7: 1993 return ("AMD-K6(r)"); 1994 case 8: 1995 return ("AMD-K6(r)-2"); 1996 case 9: 1997 return ("AMD-K6(r)-III"); 1998 default: 1999 return ("AMD (family 5)"); 2000 } 2001 case 6: 2002 switch (cpi->cpi_model) { 2003 case 1: 2004 return ("AMD-K7(tm)"); 2005 case 0: 2006 case 2: 2007 case 4: 2008 return ("AMD Athlon(tm)"); 2009 case 3: 2010 case 7: 2011 return ("AMD Duron(tm)"); 2012 case 6: 2013 case 8: 2014 case 10: 2015 /* 2016 * Use the L2 cache size to distinguish 2017 */ 2018 return ((cpi->cpi_extd[6].cp_ecx >> 16) >= 256 ? 2019 "AMD Athlon(tm)" : "AMD Duron(tm)"); 2020 default: 2021 return ("AMD (family 6)"); 2022 } 2023 default: 2024 break; 2025 } 2026 2027 if (cpi->cpi_family == 0xf && cpi->cpi_model == 5 && 2028 cpi->cpi_brandid != 0) { 2029 switch (BITX(cpi->cpi_brandid, 7, 5)) { 2030 case 3: 2031 return ("AMD Opteron(tm) UP 1xx"); 2032 case 4: 2033 return ("AMD Opteron(tm) DP 2xx"); 2034 case 5: 2035 return ("AMD Opteron(tm) MP 8xx"); 2036 default: 2037 return ("AMD Opteron(tm)"); 2038 } 2039 } 2040 2041 return (NULL); 2042 } 2043 2044 static const char * 2045 cyrix_cpubrand(struct cpuid_info *cpi, uint_t type) 2046 { 2047 if (!is_x86_feature(x86_featureset, X86FSET_CPUID) || 2048 cpi->cpi_maxeax < 1 || cpi->cpi_family < 5 || 2049 type == X86_TYPE_CYRIX_486) 2050 return ("i486 compatible"); 2051 2052 switch (type) { 2053 case X86_TYPE_CYRIX_6x86: 2054 return ("Cyrix 6x86"); 2055 case X86_TYPE_CYRIX_6x86L: 2056 return ("Cyrix 6x86L"); 2057 case X86_TYPE_CYRIX_6x86MX: 2058 return ("Cyrix 6x86MX"); 2059 case X86_TYPE_CYRIX_GXm: 2060 return ("Cyrix GXm"); 2061 case X86_TYPE_CYRIX_MediaGX: 2062 return ("Cyrix MediaGX"); 2063 case X86_TYPE_CYRIX_MII: 2064 return ("Cyrix M2"); 2065 case X86_TYPE_VIA_CYRIX_III: 2066 return ("VIA Cyrix M3"); 2067 default: 2068 /* 2069 * Have another wild guess .. 2070 */ 2071 if (cpi->cpi_family == 4 && cpi->cpi_model == 9) 2072 return ("Cyrix 5x86"); 2073 else if (cpi->cpi_family == 5) { 2074 switch (cpi->cpi_model) { 2075 case 2: 2076 return ("Cyrix 6x86"); /* Cyrix M1 */ 2077 case 4: 2078 return ("Cyrix MediaGX"); 2079 default: 2080 break; 2081 } 2082 } else if (cpi->cpi_family == 6) { 2083 switch (cpi->cpi_model) { 2084 case 0: 2085 return ("Cyrix 6x86MX"); /* Cyrix M2? */ 2086 case 5: 2087 case 6: 2088 case 7: 2089 case 8: 2090 case 9: 2091 return ("VIA C3"); 2092 default: 2093 break; 2094 } 2095 } 2096 break; 2097 } 2098 return (NULL); 2099 } 2100 2101 /* 2102 * This only gets called in the case that the CPU extended 2103 * feature brand string (0x80000002, 0x80000003, 0x80000004) 2104 * aren't available, or contain null bytes for some reason. 2105 */ 2106 static void 2107 fabricate_brandstr(struct cpuid_info *cpi) 2108 { 2109 const char *brand = NULL; 2110 2111 switch (cpi->cpi_vendor) { 2112 case X86_VENDOR_Intel: 2113 brand = intel_cpubrand(cpi); 2114 break; 2115 case X86_VENDOR_AMD: 2116 brand = amd_cpubrand(cpi); 2117 break; 2118 case X86_VENDOR_Cyrix: 2119 brand = cyrix_cpubrand(cpi, x86_type); 2120 break; 2121 case X86_VENDOR_NexGen: 2122 if (cpi->cpi_family == 5 && cpi->cpi_model == 0) 2123 brand = "NexGen Nx586"; 2124 break; 2125 case X86_VENDOR_Centaur: 2126 if (cpi->cpi_family == 5) 2127 switch (cpi->cpi_model) { 2128 case 4: 2129 brand = "Centaur C6"; 2130 break; 2131 case 8: 2132 brand = "Centaur C2"; 2133 break; 2134 case 9: 2135 brand = "Centaur C3"; 2136 break; 2137 default: 2138 break; 2139 } 2140 break; 2141 case X86_VENDOR_Rise: 2142 if (cpi->cpi_family == 5 && 2143 (cpi->cpi_model == 0 || cpi->cpi_model == 2)) 2144 brand = "Rise mP6"; 2145 break; 2146 case X86_VENDOR_SiS: 2147 if (cpi->cpi_family == 5 && cpi->cpi_model == 0) 2148 brand = "SiS 55x"; 2149 break; 2150 case X86_VENDOR_TM: 2151 if (cpi->cpi_family == 5 && cpi->cpi_model == 4) 2152 brand = "Transmeta Crusoe TM3x00 or TM5x00"; 2153 break; 2154 case X86_VENDOR_NSC: 2155 case X86_VENDOR_UMC: 2156 default: 2157 break; 2158 } 2159 if (brand) { 2160 (void) strcpy((char *)cpi->cpi_brandstr, brand); 2161 return; 2162 } 2163 2164 /* 2165 * If all else fails ... 2166 */ 2167 (void) snprintf(cpi->cpi_brandstr, sizeof (cpi->cpi_brandstr), 2168 "%s %d.%d.%d", cpi->cpi_vendorstr, cpi->cpi_family, 2169 cpi->cpi_model, cpi->cpi_step); 2170 } 2171 2172 /* 2173 * This routine is called just after kernel memory allocation 2174 * becomes available on cpu0, and as part of mp_startup() on 2175 * the other cpus. 2176 * 2177 * Fixup the brand string, and collect any information from cpuid 2178 * that requires dynamicically allocated storage to represent. 2179 */ 2180 /*ARGSUSED*/ 2181 void 2182 cpuid_pass3(cpu_t *cpu) 2183 { 2184 int i, max, shft, level, size; 2185 struct cpuid_regs regs; 2186 struct cpuid_regs *cp; 2187 struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi; 2188 2189 ASSERT(cpi->cpi_pass == 2); 2190 2191 /* 2192 * Function 4: Deterministic cache parameters 2193 * 2194 * Take this opportunity to detect the number of threads 2195 * sharing the last level cache, and construct a corresponding 2196 * cache id. The respective cpuid_info members are initialized 2197 * to the default case of "no last level cache sharing". 2198 */ 2199 cpi->cpi_ncpu_shr_last_cache = 1; 2200 cpi->cpi_last_lvl_cacheid = cpu->cpu_id; 2201 2202 if (cpi->cpi_maxeax >= 4 && cpi->cpi_vendor == X86_VENDOR_Intel) { 2203 2204 /* 2205 * Find the # of elements (size) returned by fn 4, and along 2206 * the way detect last level cache sharing details. 2207 */ 2208 bzero(®s, sizeof (regs)); 2209 cp = ®s; 2210 for (i = 0, max = 0; i < CPI_FN4_ECX_MAX; i++) { 2211 cp->cp_eax = 4; 2212 cp->cp_ecx = i; 2213 2214 (void) __cpuid_insn(cp); 2215 2216 if (CPI_CACHE_TYPE(cp) == 0) 2217 break; 2218 level = CPI_CACHE_LVL(cp); 2219 if (level > max) { 2220 max = level; 2221 cpi->cpi_ncpu_shr_last_cache = 2222 CPI_NTHR_SHR_CACHE(cp) + 1; 2223 } 2224 } 2225 cpi->cpi_std_4_size = size = i; 2226 2227 /* 2228 * Allocate the cpi_std_4 array. The first element 2229 * references the regs for fn 4, %ecx == 0, which 2230 * cpuid_pass2() stashed in cpi->cpi_std[4]. 2231 */ 2232 if (size > 0) { 2233 cpi->cpi_std_4 = 2234 kmem_alloc(size * sizeof (cp), KM_SLEEP); 2235 cpi->cpi_std_4[0] = &cpi->cpi_std[4]; 2236 2237 /* 2238 * Allocate storage to hold the additional regs 2239 * for function 4, %ecx == 1 .. cpi_std_4_size. 2240 * 2241 * The regs for fn 4, %ecx == 0 has already 2242 * been allocated as indicated above. 2243 */ 2244 for (i = 1; i < size; i++) { 2245 cp = cpi->cpi_std_4[i] = 2246 kmem_zalloc(sizeof (regs), KM_SLEEP); 2247 cp->cp_eax = 4; 2248 cp->cp_ecx = i; 2249 2250 (void) __cpuid_insn(cp); 2251 } 2252 } 2253 /* 2254 * Determine the number of bits needed to represent 2255 * the number of CPUs sharing the last level cache. 2256 * 2257 * Shift off that number of bits from the APIC id to 2258 * derive the cache id. 2259 */ 2260 shft = 0; 2261 for (i = 1; i < cpi->cpi_ncpu_shr_last_cache; i <<= 1) 2262 shft++; 2263 cpi->cpi_last_lvl_cacheid = cpi->cpi_apicid >> shft; 2264 } 2265 2266 /* 2267 * Now fixup the brand string 2268 */ 2269 if ((cpi->cpi_xmaxeax & 0x80000000) == 0) { 2270 fabricate_brandstr(cpi); 2271 } else { 2272 2273 /* 2274 * If we successfully extracted a brand string from the cpuid 2275 * instruction, clean it up by removing leading spaces and 2276 * similar junk. 2277 */ 2278 if (cpi->cpi_brandstr[0]) { 2279 size_t maxlen = sizeof (cpi->cpi_brandstr); 2280 char *src, *dst; 2281 2282 dst = src = (char *)cpi->cpi_brandstr; 2283 src[maxlen - 1] = '\0'; 2284 /* 2285 * strip leading spaces 2286 */ 2287 while (*src == ' ') 2288 src++; 2289 /* 2290 * Remove any 'Genuine' or "Authentic" prefixes 2291 */ 2292 if (strncmp(src, "Genuine ", 8) == 0) 2293 src += 8; 2294 if (strncmp(src, "Authentic ", 10) == 0) 2295 src += 10; 2296 2297 /* 2298 * Now do an in-place copy. 2299 * Map (R) to (r) and (TM) to (tm). 2300 * The era of teletypes is long gone, and there's 2301 * -really- no need to shout. 2302 */ 2303 while (*src != '\0') { 2304 if (src[0] == '(') { 2305 if (strncmp(src + 1, "R)", 2) == 0) { 2306 (void) strncpy(dst, "(r)", 3); 2307 src += 3; 2308 dst += 3; 2309 continue; 2310 } 2311 if (strncmp(src + 1, "TM)", 3) == 0) { 2312 (void) strncpy(dst, "(tm)", 4); 2313 src += 4; 2314 dst += 4; 2315 continue; 2316 } 2317 } 2318 *dst++ = *src++; 2319 } 2320 *dst = '\0'; 2321 2322 /* 2323 * Finally, remove any trailing spaces 2324 */ 2325 while (--dst > cpi->cpi_brandstr) 2326 if (*dst == ' ') 2327 *dst = '\0'; 2328 else 2329 break; 2330 } else 2331 fabricate_brandstr(cpi); 2332 } 2333 cpi->cpi_pass = 3; 2334 } 2335 2336 /* 2337 * This routine is called out of bind_hwcap() much later in the life 2338 * of the kernel (post_startup()). The job of this routine is to resolve 2339 * the hardware feature support and kernel support for those features into 2340 * what we're actually going to tell applications via the aux vector. 2341 */ 2342 uint_t 2343 cpuid_pass4(cpu_t *cpu) 2344 { 2345 struct cpuid_info *cpi; 2346 uint_t hwcap_flags = 0; 2347 2348 if (cpu == NULL) 2349 cpu = CPU; 2350 cpi = cpu->cpu_m.mcpu_cpi; 2351 2352 ASSERT(cpi->cpi_pass == 3); 2353 2354 if (cpi->cpi_maxeax >= 1) { 2355 uint32_t *edx = &cpi->cpi_support[STD_EDX_FEATURES]; 2356 uint32_t *ecx = &cpi->cpi_support[STD_ECX_FEATURES]; 2357 2358 *edx = CPI_FEATURES_EDX(cpi); 2359 *ecx = CPI_FEATURES_ECX(cpi); 2360 2361 /* 2362 * [these require explicit kernel support] 2363 */ 2364 if (!is_x86_feature(x86_featureset, X86FSET_SEP)) 2365 *edx &= ~CPUID_INTC_EDX_SEP; 2366 2367 if (!is_x86_feature(x86_featureset, X86FSET_SSE)) 2368 *edx &= ~(CPUID_INTC_EDX_FXSR|CPUID_INTC_EDX_SSE); 2369 if (!is_x86_feature(x86_featureset, X86FSET_SSE2)) 2370 *edx &= ~CPUID_INTC_EDX_SSE2; 2371 2372 if (!is_x86_feature(x86_featureset, X86FSET_HTT)) 2373 *edx &= ~CPUID_INTC_EDX_HTT; 2374 2375 if (!is_x86_feature(x86_featureset, X86FSET_SSE3)) 2376 *ecx &= ~CPUID_INTC_ECX_SSE3; 2377 2378 if (cpi->cpi_vendor == X86_VENDOR_Intel) { 2379 if (!is_x86_feature(x86_featureset, X86FSET_SSSE3)) 2380 *ecx &= ~CPUID_INTC_ECX_SSSE3; 2381 if (!is_x86_feature(x86_featureset, X86FSET_SSE4_1)) 2382 *ecx &= ~CPUID_INTC_ECX_SSE4_1; 2383 if (!is_x86_feature(x86_featureset, X86FSET_SSE4_2)) 2384 *ecx &= ~CPUID_INTC_ECX_SSE4_2; 2385 if (!is_x86_feature(x86_featureset, X86FSET_AES)) 2386 *ecx &= ~CPUID_INTC_ECX_AES; 2387 if (!is_x86_feature(x86_featureset, X86FSET_PCLMULQDQ)) 2388 *ecx &= ~CPUID_INTC_ECX_PCLMULQDQ; 2389 } 2390 2391 /* 2392 * [no explicit support required beyond x87 fp context] 2393 */ 2394 if (!fpu_exists) 2395 *edx &= ~(CPUID_INTC_EDX_FPU | CPUID_INTC_EDX_MMX); 2396 2397 /* 2398 * Now map the supported feature vector to things that we 2399 * think userland will care about. 2400 */ 2401 if (*edx & CPUID_INTC_EDX_SEP) 2402 hwcap_flags |= AV_386_SEP; 2403 if (*edx & CPUID_INTC_EDX_SSE) 2404 hwcap_flags |= AV_386_FXSR | AV_386_SSE; 2405 if (*edx & CPUID_INTC_EDX_SSE2) 2406 hwcap_flags |= AV_386_SSE2; 2407 if (*ecx & CPUID_INTC_ECX_SSE3) 2408 hwcap_flags |= AV_386_SSE3; 2409 if (cpi->cpi_vendor == X86_VENDOR_Intel) { 2410 if (*ecx & CPUID_INTC_ECX_SSSE3) 2411 hwcap_flags |= AV_386_SSSE3; 2412 if (*ecx & CPUID_INTC_ECX_SSE4_1) 2413 hwcap_flags |= AV_386_SSE4_1; 2414 if (*ecx & CPUID_INTC_ECX_SSE4_2) 2415 hwcap_flags |= AV_386_SSE4_2; 2416 if (*ecx & CPUID_INTC_ECX_MOVBE) 2417 hwcap_flags |= AV_386_MOVBE; 2418 if (*ecx & CPUID_INTC_ECX_AES) 2419 hwcap_flags |= AV_386_AES; 2420 if (*ecx & CPUID_INTC_ECX_PCLMULQDQ) 2421 hwcap_flags |= AV_386_PCLMULQDQ; 2422 } 2423 if (*ecx & CPUID_INTC_ECX_POPCNT) 2424 hwcap_flags |= AV_386_POPCNT; 2425 if (*edx & CPUID_INTC_EDX_FPU) 2426 hwcap_flags |= AV_386_FPU; 2427 if (*edx & CPUID_INTC_EDX_MMX) 2428 hwcap_flags |= AV_386_MMX; 2429 2430 if (*edx & CPUID_INTC_EDX_TSC) 2431 hwcap_flags |= AV_386_TSC; 2432 if (*edx & CPUID_INTC_EDX_CX8) 2433 hwcap_flags |= AV_386_CX8; 2434 if (*edx & CPUID_INTC_EDX_CMOV) 2435 hwcap_flags |= AV_386_CMOV; 2436 if (*ecx & CPUID_INTC_ECX_CX16) 2437 hwcap_flags |= AV_386_CX16; 2438 } 2439 2440 if (cpi->cpi_xmaxeax < 0x80000001) 2441 goto pass4_done; 2442 2443 switch (cpi->cpi_vendor) { 2444 struct cpuid_regs cp; 2445 uint32_t *edx, *ecx; 2446 2447 case X86_VENDOR_Intel: 2448 /* 2449 * Seems like Intel duplicated what we necessary 2450 * here to make the initial crop of 64-bit OS's work. 2451 * Hopefully, those are the only "extended" bits 2452 * they'll add. 2453 */ 2454 /*FALLTHROUGH*/ 2455 2456 case X86_VENDOR_AMD: 2457 edx = &cpi->cpi_support[AMD_EDX_FEATURES]; 2458 ecx = &cpi->cpi_support[AMD_ECX_FEATURES]; 2459 2460 *edx = CPI_FEATURES_XTD_EDX(cpi); 2461 *ecx = CPI_FEATURES_XTD_ECX(cpi); 2462 2463 /* 2464 * [these features require explicit kernel support] 2465 */ 2466 switch (cpi->cpi_vendor) { 2467 case X86_VENDOR_Intel: 2468 if (!is_x86_feature(x86_featureset, X86FSET_TSCP)) 2469 *edx &= ~CPUID_AMD_EDX_TSCP; 2470 break; 2471 2472 case X86_VENDOR_AMD: 2473 if (!is_x86_feature(x86_featureset, X86FSET_TSCP)) 2474 *edx &= ~CPUID_AMD_EDX_TSCP; 2475 if (!is_x86_feature(x86_featureset, X86FSET_SSE4A)) 2476 *ecx &= ~CPUID_AMD_ECX_SSE4A; 2477 break; 2478 2479 default: 2480 break; 2481 } 2482 2483 /* 2484 * [no explicit support required beyond 2485 * x87 fp context and exception handlers] 2486 */ 2487 if (!fpu_exists) 2488 *edx &= ~(CPUID_AMD_EDX_MMXamd | 2489 CPUID_AMD_EDX_3DNow | CPUID_AMD_EDX_3DNowx); 2490 2491 if (!is_x86_feature(x86_featureset, X86FSET_NX)) 2492 *edx &= ~CPUID_AMD_EDX_NX; 2493 #if !defined(__amd64) 2494 *edx &= ~CPUID_AMD_EDX_LM; 2495 #endif 2496 /* 2497 * Now map the supported feature vector to 2498 * things that we think userland will care about. 2499 */ 2500 #if defined(__amd64) 2501 if (*edx & CPUID_AMD_EDX_SYSC) 2502 hwcap_flags |= AV_386_AMD_SYSC; 2503 #endif 2504 if (*edx & CPUID_AMD_EDX_MMXamd) 2505 hwcap_flags |= AV_386_AMD_MMX; 2506 if (*edx & CPUID_AMD_EDX_3DNow) 2507 hwcap_flags |= AV_386_AMD_3DNow; 2508 if (*edx & CPUID_AMD_EDX_3DNowx) 2509 hwcap_flags |= AV_386_AMD_3DNowx; 2510 2511 switch (cpi->cpi_vendor) { 2512 case X86_VENDOR_AMD: 2513 if (*edx & CPUID_AMD_EDX_TSCP) 2514 hwcap_flags |= AV_386_TSCP; 2515 if (*ecx & CPUID_AMD_ECX_AHF64) 2516 hwcap_flags |= AV_386_AHF; 2517 if (*ecx & CPUID_AMD_ECX_SSE4A) 2518 hwcap_flags |= AV_386_AMD_SSE4A; 2519 if (*ecx & CPUID_AMD_ECX_LZCNT) 2520 hwcap_flags |= AV_386_AMD_LZCNT; 2521 break; 2522 2523 case X86_VENDOR_Intel: 2524 if (*edx & CPUID_AMD_EDX_TSCP) 2525 hwcap_flags |= AV_386_TSCP; 2526 /* 2527 * Aarrgh. 2528 * Intel uses a different bit in the same word. 2529 */ 2530 if (*ecx & CPUID_INTC_ECX_AHF64) 2531 hwcap_flags |= AV_386_AHF; 2532 break; 2533 2534 default: 2535 break; 2536 } 2537 break; 2538 2539 case X86_VENDOR_TM: 2540 cp.cp_eax = 0x80860001; 2541 (void) __cpuid_insn(&cp); 2542 cpi->cpi_support[TM_EDX_FEATURES] = cp.cp_edx; 2543 break; 2544 2545 default: 2546 break; 2547 } 2548 2549 pass4_done: 2550 cpi->cpi_pass = 4; 2551 return (hwcap_flags); 2552 } 2553 2554 2555 /* 2556 * Simulate the cpuid instruction using the data we previously 2557 * captured about this CPU. We try our best to return the truth 2558 * about the hardware, independently of kernel support. 2559 */ 2560 uint32_t 2561 cpuid_insn(cpu_t *cpu, struct cpuid_regs *cp) 2562 { 2563 struct cpuid_info *cpi; 2564 struct cpuid_regs *xcp; 2565 2566 if (cpu == NULL) 2567 cpu = CPU; 2568 cpi = cpu->cpu_m.mcpu_cpi; 2569 2570 ASSERT(cpuid_checkpass(cpu, 3)); 2571 2572 /* 2573 * CPUID data is cached in two separate places: cpi_std for standard 2574 * CPUID functions, and cpi_extd for extended CPUID functions. 2575 */ 2576 if (cp->cp_eax <= cpi->cpi_maxeax && cp->cp_eax < NMAX_CPI_STD) 2577 xcp = &cpi->cpi_std[cp->cp_eax]; 2578 else if (cp->cp_eax >= 0x80000000 && cp->cp_eax <= cpi->cpi_xmaxeax && 2579 cp->cp_eax < 0x80000000 + NMAX_CPI_EXTD) 2580 xcp = &cpi->cpi_extd[cp->cp_eax - 0x80000000]; 2581 else 2582 /* 2583 * The caller is asking for data from an input parameter which 2584 * the kernel has not cached. In this case we go fetch from 2585 * the hardware and return the data directly to the user. 2586 */ 2587 return (__cpuid_insn(cp)); 2588 2589 cp->cp_eax = xcp->cp_eax; 2590 cp->cp_ebx = xcp->cp_ebx; 2591 cp->cp_ecx = xcp->cp_ecx; 2592 cp->cp_edx = xcp->cp_edx; 2593 return (cp->cp_eax); 2594 } 2595 2596 int 2597 cpuid_checkpass(cpu_t *cpu, int pass) 2598 { 2599 return (cpu != NULL && cpu->cpu_m.mcpu_cpi != NULL && 2600 cpu->cpu_m.mcpu_cpi->cpi_pass >= pass); 2601 } 2602 2603 int 2604 cpuid_getbrandstr(cpu_t *cpu, char *s, size_t n) 2605 { 2606 ASSERT(cpuid_checkpass(cpu, 3)); 2607 2608 return (snprintf(s, n, "%s", cpu->cpu_m.mcpu_cpi->cpi_brandstr)); 2609 } 2610 2611 int 2612 cpuid_is_cmt(cpu_t *cpu) 2613 { 2614 if (cpu == NULL) 2615 cpu = CPU; 2616 2617 ASSERT(cpuid_checkpass(cpu, 1)); 2618 2619 return (cpu->cpu_m.mcpu_cpi->cpi_chipid >= 0); 2620 } 2621 2622 /* 2623 * AMD and Intel both implement the 64-bit variant of the syscall 2624 * instruction (syscallq), so if there's -any- support for syscall, 2625 * cpuid currently says "yes, we support this". 2626 * 2627 * However, Intel decided to -not- implement the 32-bit variant of the 2628 * syscall instruction, so we provide a predicate to allow our caller 2629 * to test that subtlety here. 2630 * 2631 * XXPV Currently, 32-bit syscall instructions don't work via the hypervisor, 2632 * even in the case where the hardware would in fact support it. 2633 */ 2634 /*ARGSUSED*/ 2635 int 2636 cpuid_syscall32_insn(cpu_t *cpu) 2637 { 2638 ASSERT(cpuid_checkpass((cpu == NULL ? CPU : cpu), 1)); 2639 2640 #if !defined(__xpv) 2641 if (cpu == NULL) 2642 cpu = CPU; 2643 2644 /*CSTYLED*/ 2645 { 2646 struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi; 2647 2648 if (cpi->cpi_vendor == X86_VENDOR_AMD && 2649 cpi->cpi_xmaxeax >= 0x80000001 && 2650 (CPI_FEATURES_XTD_EDX(cpi) & CPUID_AMD_EDX_SYSC)) 2651 return (1); 2652 } 2653 #endif 2654 return (0); 2655 } 2656 2657 int 2658 cpuid_getidstr(cpu_t *cpu, char *s, size_t n) 2659 { 2660 struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi; 2661 2662 static const char fmt[] = 2663 "x86 (%s %X family %d model %d step %d clock %d MHz)"; 2664 static const char fmt_ht[] = 2665 "x86 (chipid 0x%x %s %X family %d model %d step %d clock %d MHz)"; 2666 2667 ASSERT(cpuid_checkpass(cpu, 1)); 2668 2669 if (cpuid_is_cmt(cpu)) 2670 return (snprintf(s, n, fmt_ht, cpi->cpi_chipid, 2671 cpi->cpi_vendorstr, cpi->cpi_std[1].cp_eax, 2672 cpi->cpi_family, cpi->cpi_model, 2673 cpi->cpi_step, cpu->cpu_type_info.pi_clock)); 2674 return (snprintf(s, n, fmt, 2675 cpi->cpi_vendorstr, cpi->cpi_std[1].cp_eax, 2676 cpi->cpi_family, cpi->cpi_model, 2677 cpi->cpi_step, cpu->cpu_type_info.pi_clock)); 2678 } 2679 2680 const char * 2681 cpuid_getvendorstr(cpu_t *cpu) 2682 { 2683 ASSERT(cpuid_checkpass(cpu, 1)); 2684 return ((const char *)cpu->cpu_m.mcpu_cpi->cpi_vendorstr); 2685 } 2686 2687 uint_t 2688 cpuid_getvendor(cpu_t *cpu) 2689 { 2690 ASSERT(cpuid_checkpass(cpu, 1)); 2691 return (cpu->cpu_m.mcpu_cpi->cpi_vendor); 2692 } 2693 2694 uint_t 2695 cpuid_getfamily(cpu_t *cpu) 2696 { 2697 ASSERT(cpuid_checkpass(cpu, 1)); 2698 return (cpu->cpu_m.mcpu_cpi->cpi_family); 2699 } 2700 2701 uint_t 2702 cpuid_getmodel(cpu_t *cpu) 2703 { 2704 ASSERT(cpuid_checkpass(cpu, 1)); 2705 return (cpu->cpu_m.mcpu_cpi->cpi_model); 2706 } 2707 2708 uint_t 2709 cpuid_get_ncpu_per_chip(cpu_t *cpu) 2710 { 2711 ASSERT(cpuid_checkpass(cpu, 1)); 2712 return (cpu->cpu_m.mcpu_cpi->cpi_ncpu_per_chip); 2713 } 2714 2715 uint_t 2716 cpuid_get_ncore_per_chip(cpu_t *cpu) 2717 { 2718 ASSERT(cpuid_checkpass(cpu, 1)); 2719 return (cpu->cpu_m.mcpu_cpi->cpi_ncore_per_chip); 2720 } 2721 2722 uint_t 2723 cpuid_get_ncpu_sharing_last_cache(cpu_t *cpu) 2724 { 2725 ASSERT(cpuid_checkpass(cpu, 2)); 2726 return (cpu->cpu_m.mcpu_cpi->cpi_ncpu_shr_last_cache); 2727 } 2728 2729 id_t 2730 cpuid_get_last_lvl_cacheid(cpu_t *cpu) 2731 { 2732 ASSERT(cpuid_checkpass(cpu, 2)); 2733 return (cpu->cpu_m.mcpu_cpi->cpi_last_lvl_cacheid); 2734 } 2735 2736 uint_t 2737 cpuid_getstep(cpu_t *cpu) 2738 { 2739 ASSERT(cpuid_checkpass(cpu, 1)); 2740 return (cpu->cpu_m.mcpu_cpi->cpi_step); 2741 } 2742 2743 uint_t 2744 cpuid_getsig(struct cpu *cpu) 2745 { 2746 ASSERT(cpuid_checkpass(cpu, 1)); 2747 return (cpu->cpu_m.mcpu_cpi->cpi_std[1].cp_eax); 2748 } 2749 2750 uint32_t 2751 cpuid_getchiprev(struct cpu *cpu) 2752 { 2753 ASSERT(cpuid_checkpass(cpu, 1)); 2754 return (cpu->cpu_m.mcpu_cpi->cpi_chiprev); 2755 } 2756 2757 const char * 2758 cpuid_getchiprevstr(struct cpu *cpu) 2759 { 2760 ASSERT(cpuid_checkpass(cpu, 1)); 2761 return (cpu->cpu_m.mcpu_cpi->cpi_chiprevstr); 2762 } 2763 2764 uint32_t 2765 cpuid_getsockettype(struct cpu *cpu) 2766 { 2767 ASSERT(cpuid_checkpass(cpu, 1)); 2768 return (cpu->cpu_m.mcpu_cpi->cpi_socket); 2769 } 2770 2771 const char * 2772 cpuid_getsocketstr(cpu_t *cpu) 2773 { 2774 static const char *socketstr = NULL; 2775 struct cpuid_info *cpi; 2776 2777 ASSERT(cpuid_checkpass(cpu, 1)); 2778 cpi = cpu->cpu_m.mcpu_cpi; 2779 2780 /* Assume that socket types are the same across the system */ 2781 if (socketstr == NULL) 2782 socketstr = _cpuid_sktstr(cpi->cpi_vendor, cpi->cpi_family, 2783 cpi->cpi_model, cpi->cpi_step); 2784 2785 2786 return (socketstr); 2787 } 2788 2789 int 2790 cpuid_get_chipid(cpu_t *cpu) 2791 { 2792 ASSERT(cpuid_checkpass(cpu, 1)); 2793 2794 if (cpuid_is_cmt(cpu)) 2795 return (cpu->cpu_m.mcpu_cpi->cpi_chipid); 2796 return (cpu->cpu_id); 2797 } 2798 2799 id_t 2800 cpuid_get_coreid(cpu_t *cpu) 2801 { 2802 ASSERT(cpuid_checkpass(cpu, 1)); 2803 return (cpu->cpu_m.mcpu_cpi->cpi_coreid); 2804 } 2805 2806 int 2807 cpuid_get_pkgcoreid(cpu_t *cpu) 2808 { 2809 ASSERT(cpuid_checkpass(cpu, 1)); 2810 return (cpu->cpu_m.mcpu_cpi->cpi_pkgcoreid); 2811 } 2812 2813 int 2814 cpuid_get_clogid(cpu_t *cpu) 2815 { 2816 ASSERT(cpuid_checkpass(cpu, 1)); 2817 return (cpu->cpu_m.mcpu_cpi->cpi_clogid); 2818 } 2819 2820 int 2821 cpuid_get_cacheid(cpu_t *cpu) 2822 { 2823 ASSERT(cpuid_checkpass(cpu, 1)); 2824 return (cpu->cpu_m.mcpu_cpi->cpi_last_lvl_cacheid); 2825 } 2826 2827 uint_t 2828 cpuid_get_procnodeid(cpu_t *cpu) 2829 { 2830 ASSERT(cpuid_checkpass(cpu, 1)); 2831 return (cpu->cpu_m.mcpu_cpi->cpi_procnodeid); 2832 } 2833 2834 uint_t 2835 cpuid_get_procnodes_per_pkg(cpu_t *cpu) 2836 { 2837 ASSERT(cpuid_checkpass(cpu, 1)); 2838 return (cpu->cpu_m.mcpu_cpi->cpi_procnodes_per_pkg); 2839 } 2840 2841 /*ARGSUSED*/ 2842 int 2843 cpuid_have_cr8access(cpu_t *cpu) 2844 { 2845 #if defined(__amd64) 2846 return (1); 2847 #else 2848 struct cpuid_info *cpi; 2849 2850 ASSERT(cpu != NULL); 2851 cpi = cpu->cpu_m.mcpu_cpi; 2852 if (cpi->cpi_vendor == X86_VENDOR_AMD && cpi->cpi_maxeax >= 1 && 2853 (CPI_FEATURES_XTD_ECX(cpi) & CPUID_AMD_ECX_CR8D) != 0) 2854 return (1); 2855 return (0); 2856 #endif 2857 } 2858 2859 uint32_t 2860 cpuid_get_apicid(cpu_t *cpu) 2861 { 2862 ASSERT(cpuid_checkpass(cpu, 1)); 2863 if (cpu->cpu_m.mcpu_cpi->cpi_maxeax < 1) { 2864 return (UINT32_MAX); 2865 } else { 2866 return (cpu->cpu_m.mcpu_cpi->cpi_apicid); 2867 } 2868 } 2869 2870 void 2871 cpuid_get_addrsize(cpu_t *cpu, uint_t *pabits, uint_t *vabits) 2872 { 2873 struct cpuid_info *cpi; 2874 2875 if (cpu == NULL) 2876 cpu = CPU; 2877 cpi = cpu->cpu_m.mcpu_cpi; 2878 2879 ASSERT(cpuid_checkpass(cpu, 1)); 2880 2881 if (pabits) 2882 *pabits = cpi->cpi_pabits; 2883 if (vabits) 2884 *vabits = cpi->cpi_vabits; 2885 } 2886 2887 /* 2888 * Returns the number of data TLB entries for a corresponding 2889 * pagesize. If it can't be computed, or isn't known, the 2890 * routine returns zero. If you ask about an architecturally 2891 * impossible pagesize, the routine will panic (so that the 2892 * hat implementor knows that things are inconsistent.) 2893 */ 2894 uint_t 2895 cpuid_get_dtlb_nent(cpu_t *cpu, size_t pagesize) 2896 { 2897 struct cpuid_info *cpi; 2898 uint_t dtlb_nent = 0; 2899 2900 if (cpu == NULL) 2901 cpu = CPU; 2902 cpi = cpu->cpu_m.mcpu_cpi; 2903 2904 ASSERT(cpuid_checkpass(cpu, 1)); 2905 2906 /* 2907 * Check the L2 TLB info 2908 */ 2909 if (cpi->cpi_xmaxeax >= 0x80000006) { 2910 struct cpuid_regs *cp = &cpi->cpi_extd[6]; 2911 2912 switch (pagesize) { 2913 2914 case 4 * 1024: 2915 /* 2916 * All zero in the top 16 bits of the register 2917 * indicates a unified TLB. Size is in low 16 bits. 2918 */ 2919 if ((cp->cp_ebx & 0xffff0000) == 0) 2920 dtlb_nent = cp->cp_ebx & 0x0000ffff; 2921 else 2922 dtlb_nent = BITX(cp->cp_ebx, 27, 16); 2923 break; 2924 2925 case 2 * 1024 * 1024: 2926 if ((cp->cp_eax & 0xffff0000) == 0) 2927 dtlb_nent = cp->cp_eax & 0x0000ffff; 2928 else 2929 dtlb_nent = BITX(cp->cp_eax, 27, 16); 2930 break; 2931 2932 default: 2933 panic("unknown L2 pagesize"); 2934 /*NOTREACHED*/ 2935 } 2936 } 2937 2938 if (dtlb_nent != 0) 2939 return (dtlb_nent); 2940 2941 /* 2942 * No L2 TLB support for this size, try L1. 2943 */ 2944 if (cpi->cpi_xmaxeax >= 0x80000005) { 2945 struct cpuid_regs *cp = &cpi->cpi_extd[5]; 2946 2947 switch (pagesize) { 2948 case 4 * 1024: 2949 dtlb_nent = BITX(cp->cp_ebx, 23, 16); 2950 break; 2951 case 2 * 1024 * 1024: 2952 dtlb_nent = BITX(cp->cp_eax, 23, 16); 2953 break; 2954 default: 2955 panic("unknown L1 d-TLB pagesize"); 2956 /*NOTREACHED*/ 2957 } 2958 } 2959 2960 return (dtlb_nent); 2961 } 2962 2963 /* 2964 * Return 0 if the erratum is not present or not applicable, positive 2965 * if it is, and negative if the status of the erratum is unknown. 2966 * 2967 * See "Revision Guide for AMD Athlon(tm) 64 and AMD Opteron(tm) 2968 * Processors" #25759, Rev 3.57, August 2005 2969 */ 2970 int 2971 cpuid_opteron_erratum(cpu_t *cpu, uint_t erratum) 2972 { 2973 struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi; 2974 uint_t eax; 2975 2976 /* 2977 * Bail out if this CPU isn't an AMD CPU, or if it's 2978 * a legacy (32-bit) AMD CPU. 2979 */ 2980 if (cpi->cpi_vendor != X86_VENDOR_AMD || 2981 cpi->cpi_family == 4 || cpi->cpi_family == 5 || 2982 cpi->cpi_family == 6) 2983 2984 return (0); 2985 2986 eax = cpi->cpi_std[1].cp_eax; 2987 2988 #define SH_B0(eax) (eax == 0xf40 || eax == 0xf50) 2989 #define SH_B3(eax) (eax == 0xf51) 2990 #define B(eax) (SH_B0(eax) || SH_B3(eax)) 2991 2992 #define SH_C0(eax) (eax == 0xf48 || eax == 0xf58) 2993 2994 #define SH_CG(eax) (eax == 0xf4a || eax == 0xf5a || eax == 0xf7a) 2995 #define DH_CG(eax) (eax == 0xfc0 || eax == 0xfe0 || eax == 0xff0) 2996 #define CH_CG(eax) (eax == 0xf82 || eax == 0xfb2) 2997 #define CG(eax) (SH_CG(eax) || DH_CG(eax) || CH_CG(eax)) 2998 2999 #define SH_D0(eax) (eax == 0x10f40 || eax == 0x10f50 || eax == 0x10f70) 3000 #define DH_D0(eax) (eax == 0x10fc0 || eax == 0x10ff0) 3001 #define CH_D0(eax) (eax == 0x10f80 || eax == 0x10fb0) 3002 #define D0(eax) (SH_D0(eax) || DH_D0(eax) || CH_D0(eax)) 3003 3004 #define SH_E0(eax) (eax == 0x20f50 || eax == 0x20f40 || eax == 0x20f70) 3005 #define JH_E1(eax) (eax == 0x20f10) /* JH8_E0 had 0x20f30 */ 3006 #define DH_E3(eax) (eax == 0x20fc0 || eax == 0x20ff0) 3007 #define SH_E4(eax) (eax == 0x20f51 || eax == 0x20f71) 3008 #define BH_E4(eax) (eax == 0x20fb1) 3009 #define SH_E5(eax) (eax == 0x20f42) 3010 #define DH_E6(eax) (eax == 0x20ff2 || eax == 0x20fc2) 3011 #define JH_E6(eax) (eax == 0x20f12 || eax == 0x20f32) 3012 #define EX(eax) (SH_E0(eax) || JH_E1(eax) || DH_E3(eax) || \ 3013 SH_E4(eax) || BH_E4(eax) || SH_E5(eax) || \ 3014 DH_E6(eax) || JH_E6(eax)) 3015 3016 #define DR_AX(eax) (eax == 0x100f00 || eax == 0x100f01 || eax == 0x100f02) 3017 #define DR_B0(eax) (eax == 0x100f20) 3018 #define DR_B1(eax) (eax == 0x100f21) 3019 #define DR_BA(eax) (eax == 0x100f2a) 3020 #define DR_B2(eax) (eax == 0x100f22) 3021 #define DR_B3(eax) (eax == 0x100f23) 3022 #define RB_C0(eax) (eax == 0x100f40) 3023 3024 switch (erratum) { 3025 case 1: 3026 return (cpi->cpi_family < 0x10); 3027 case 51: /* what does the asterisk mean? */ 3028 return (B(eax) || SH_C0(eax) || CG(eax)); 3029 case 52: 3030 return (B(eax)); 3031 case 57: 3032 return (cpi->cpi_family <= 0x11); 3033 case 58: 3034 return (B(eax)); 3035 case 60: 3036 return (cpi->cpi_family <= 0x11); 3037 case 61: 3038 case 62: 3039 case 63: 3040 case 64: 3041 case 65: 3042 case 66: 3043 case 68: 3044 case 69: 3045 case 70: 3046 case 71: 3047 return (B(eax)); 3048 case 72: 3049 return (SH_B0(eax)); 3050 case 74: 3051 return (B(eax)); 3052 case 75: 3053 return (cpi->cpi_family < 0x10); 3054 case 76: 3055 return (B(eax)); 3056 case 77: 3057 return (cpi->cpi_family <= 0x11); 3058 case 78: 3059 return (B(eax) || SH_C0(eax)); 3060 case 79: 3061 return (B(eax) || SH_C0(eax) || CG(eax) || D0(eax) || EX(eax)); 3062 case 80: 3063 case 81: 3064 case 82: 3065 return (B(eax)); 3066 case 83: 3067 return (B(eax) || SH_C0(eax) || CG(eax)); 3068 case 85: 3069 return (cpi->cpi_family < 0x10); 3070 case 86: 3071 return (SH_C0(eax) || CG(eax)); 3072 case 88: 3073 #if !defined(__amd64) 3074 return (0); 3075 #else 3076 return (B(eax) || SH_C0(eax)); 3077 #endif 3078 case 89: 3079 return (cpi->cpi_family < 0x10); 3080 case 90: 3081 return (B(eax) || SH_C0(eax) || CG(eax)); 3082 case 91: 3083 case 92: 3084 return (B(eax) || SH_C0(eax)); 3085 case 93: 3086 return (SH_C0(eax)); 3087 case 94: 3088 return (B(eax) || SH_C0(eax) || CG(eax)); 3089 case 95: 3090 #if !defined(__amd64) 3091 return (0); 3092 #else 3093 return (B(eax) || SH_C0(eax)); 3094 #endif 3095 case 96: 3096 return (B(eax) || SH_C0(eax) || CG(eax)); 3097 case 97: 3098 case 98: 3099 return (SH_C0(eax) || CG(eax)); 3100 case 99: 3101 return (B(eax) || SH_C0(eax) || CG(eax) || D0(eax)); 3102 case 100: 3103 return (B(eax) || SH_C0(eax)); 3104 case 101: 3105 case 103: 3106 return (B(eax) || SH_C0(eax) || CG(eax) || D0(eax)); 3107 case 104: 3108 return (SH_C0(eax) || CG(eax) || D0(eax)); 3109 case 105: 3110 case 106: 3111 case 107: 3112 return (B(eax) || SH_C0(eax) || CG(eax) || D0(eax)); 3113 case 108: 3114 return (DH_CG(eax)); 3115 case 109: 3116 return (SH_C0(eax) || CG(eax) || D0(eax)); 3117 case 110: 3118 return (D0(eax) || EX(eax)); 3119 case 111: 3120 return (CG(eax)); 3121 case 112: 3122 return (B(eax) || SH_C0(eax) || CG(eax) || D0(eax) || EX(eax)); 3123 case 113: 3124 return (eax == 0x20fc0); 3125 case 114: 3126 return (SH_E0(eax) || JH_E1(eax) || DH_E3(eax)); 3127 case 115: 3128 return (SH_E0(eax) || JH_E1(eax)); 3129 case 116: 3130 return (SH_E0(eax) || JH_E1(eax) || DH_E3(eax)); 3131 case 117: 3132 return (B(eax) || SH_C0(eax) || CG(eax) || D0(eax)); 3133 case 118: 3134 return (SH_E0(eax) || JH_E1(eax) || SH_E4(eax) || BH_E4(eax) || 3135 JH_E6(eax)); 3136 case 121: 3137 return (B(eax) || SH_C0(eax) || CG(eax) || D0(eax) || EX(eax)); 3138 case 122: 3139 return (cpi->cpi_family < 0x10 || cpi->cpi_family == 0x11); 3140 case 123: 3141 return (JH_E1(eax) || BH_E4(eax) || JH_E6(eax)); 3142 case 131: 3143 return (cpi->cpi_family < 0x10); 3144 case 6336786: 3145 /* 3146 * Test for AdvPowerMgmtInfo.TscPStateInvariant 3147 * if this is a K8 family or newer processor 3148 */ 3149 if (CPI_FAMILY(cpi) == 0xf) { 3150 struct cpuid_regs regs; 3151 regs.cp_eax = 0x80000007; 3152 (void) __cpuid_insn(®s); 3153 return (!(regs.cp_edx & 0x100)); 3154 } 3155 return (0); 3156 case 6323525: 3157 return (((((eax >> 12) & 0xff00) + (eax & 0xf00)) | 3158 (((eax >> 4) & 0xf) | ((eax >> 12) & 0xf0))) < 0xf40); 3159 3160 case 6671130: 3161 /* 3162 * check for processors (pre-Shanghai) that do not provide 3163 * optimal management of 1gb ptes in its tlb. 3164 */ 3165 return (cpi->cpi_family == 0x10 && cpi->cpi_model < 4); 3166 3167 case 298: 3168 return (DR_AX(eax) || DR_B0(eax) || DR_B1(eax) || DR_BA(eax) || 3169 DR_B2(eax) || RB_C0(eax)); 3170 3171 default: 3172 return (-1); 3173 3174 } 3175 } 3176 3177 /* 3178 * Determine if specified erratum is present via OSVW (OS Visible Workaround). 3179 * Return 1 if erratum is present, 0 if not present and -1 if indeterminate. 3180 */ 3181 int 3182 osvw_opteron_erratum(cpu_t *cpu, uint_t erratum) 3183 { 3184 struct cpuid_info *cpi; 3185 uint_t osvwid; 3186 static int osvwfeature = -1; 3187 uint64_t osvwlength; 3188 3189 3190 cpi = cpu->cpu_m.mcpu_cpi; 3191 3192 /* confirm OSVW supported */ 3193 if (osvwfeature == -1) { 3194 osvwfeature = cpi->cpi_extd[1].cp_ecx & CPUID_AMD_ECX_OSVW; 3195 } else { 3196 /* assert that osvw feature setting is consistent on all cpus */ 3197 ASSERT(osvwfeature == 3198 (cpi->cpi_extd[1].cp_ecx & CPUID_AMD_ECX_OSVW)); 3199 } 3200 if (!osvwfeature) 3201 return (-1); 3202 3203 osvwlength = rdmsr(MSR_AMD_OSVW_ID_LEN) & OSVW_ID_LEN_MASK; 3204 3205 switch (erratum) { 3206 case 298: /* osvwid is 0 */ 3207 osvwid = 0; 3208 if (osvwlength <= (uint64_t)osvwid) { 3209 /* osvwid 0 is unknown */ 3210 return (-1); 3211 } 3212 3213 /* 3214 * Check the OSVW STATUS MSR to determine the state 3215 * of the erratum where: 3216 * 0 - fixed by HW 3217 * 1 - BIOS has applied the workaround when BIOS 3218 * workaround is available. (Or for other errata, 3219 * OS workaround is required.) 3220 * For a value of 1, caller will confirm that the 3221 * erratum 298 workaround has indeed been applied by BIOS. 3222 * 3223 * A 1 may be set in cpus that have a HW fix 3224 * in a mixed cpu system. Regarding erratum 298: 3225 * In a multiprocessor platform, the workaround above 3226 * should be applied to all processors regardless of 3227 * silicon revision when an affected processor is 3228 * present. 3229 */ 3230 3231 return (rdmsr(MSR_AMD_OSVW_STATUS + 3232 (osvwid / OSVW_ID_CNT_PER_MSR)) & 3233 (1ULL << (osvwid % OSVW_ID_CNT_PER_MSR))); 3234 3235 default: 3236 return (-1); 3237 } 3238 } 3239 3240 static const char assoc_str[] = "associativity"; 3241 static const char line_str[] = "line-size"; 3242 static const char size_str[] = "size"; 3243 3244 static void 3245 add_cache_prop(dev_info_t *devi, const char *label, const char *type, 3246 uint32_t val) 3247 { 3248 char buf[128]; 3249 3250 /* 3251 * ndi_prop_update_int() is used because it is desirable for 3252 * DDI_PROP_HW_DEF and DDI_PROP_DONTSLEEP to be set. 3253 */ 3254 if (snprintf(buf, sizeof (buf), "%s-%s", label, type) < sizeof (buf)) 3255 (void) ndi_prop_update_int(DDI_DEV_T_NONE, devi, buf, val); 3256 } 3257 3258 /* 3259 * Intel-style cache/tlb description 3260 * 3261 * Standard cpuid level 2 gives a randomly ordered 3262 * selection of tags that index into a table that describes 3263 * cache and tlb properties. 3264 */ 3265 3266 static const char l1_icache_str[] = "l1-icache"; 3267 static const char l1_dcache_str[] = "l1-dcache"; 3268 static const char l2_cache_str[] = "l2-cache"; 3269 static const char l3_cache_str[] = "l3-cache"; 3270 static const char itlb4k_str[] = "itlb-4K"; 3271 static const char dtlb4k_str[] = "dtlb-4K"; 3272 static const char itlb2M_str[] = "itlb-2M"; 3273 static const char itlb4M_str[] = "itlb-4M"; 3274 static const char dtlb4M_str[] = "dtlb-4M"; 3275 static const char dtlb24_str[] = "dtlb0-2M-4M"; 3276 static const char itlb424_str[] = "itlb-4K-2M-4M"; 3277 static const char itlb24_str[] = "itlb-2M-4M"; 3278 static const char dtlb44_str[] = "dtlb-4K-4M"; 3279 static const char sl1_dcache_str[] = "sectored-l1-dcache"; 3280 static const char sl2_cache_str[] = "sectored-l2-cache"; 3281 static const char itrace_str[] = "itrace-cache"; 3282 static const char sl3_cache_str[] = "sectored-l3-cache"; 3283 static const char sh_l2_tlb4k_str[] = "shared-l2-tlb-4k"; 3284 3285 static const struct cachetab { 3286 uint8_t ct_code; 3287 uint8_t ct_assoc; 3288 uint16_t ct_line_size; 3289 size_t ct_size; 3290 const char *ct_label; 3291 } intel_ctab[] = { 3292 /* 3293 * maintain descending order! 3294 * 3295 * Codes ignored - Reason 3296 * ---------------------- 3297 * 40H - intel_cpuid_4_cache_info() disambiguates l2/l3 cache 3298 * f0H/f1H - Currently we do not interpret prefetch size by design 3299 */ 3300 { 0xe4, 16, 64, 8*1024*1024, l3_cache_str}, 3301 { 0xe3, 16, 64, 4*1024*1024, l3_cache_str}, 3302 { 0xe2, 16, 64, 2*1024*1024, l3_cache_str}, 3303 { 0xde, 12, 64, 6*1024*1024, l3_cache_str}, 3304 { 0xdd, 12, 64, 3*1024*1024, l3_cache_str}, 3305 { 0xdc, 12, 64, ((1*1024*1024)+(512*1024)), l3_cache_str}, 3306 { 0xd8, 8, 64, 4*1024*1024, l3_cache_str}, 3307 { 0xd7, 8, 64, 2*1024*1024, l3_cache_str}, 3308 { 0xd6, 8, 64, 1*1024*1024, l3_cache_str}, 3309 { 0xd2, 4, 64, 2*1024*1024, l3_cache_str}, 3310 { 0xd1, 4, 64, 1*1024*1024, l3_cache_str}, 3311 { 0xd0, 4, 64, 512*1024, l3_cache_str}, 3312 { 0xca, 4, 0, 512, sh_l2_tlb4k_str}, 3313 { 0xc0, 4, 0, 8, dtlb44_str }, 3314 { 0xba, 4, 0, 64, dtlb4k_str }, 3315 { 0xb4, 4, 0, 256, dtlb4k_str }, 3316 { 0xb3, 4, 0, 128, dtlb4k_str }, 3317 { 0xb2, 4, 0, 64, itlb4k_str }, 3318 { 0xb0, 4, 0, 128, itlb4k_str }, 3319 { 0x87, 8, 64, 1024*1024, l2_cache_str}, 3320 { 0x86, 4, 64, 512*1024, l2_cache_str}, 3321 { 0x85, 8, 32, 2*1024*1024, l2_cache_str}, 3322 { 0x84, 8, 32, 1024*1024, l2_cache_str}, 3323 { 0x83, 8, 32, 512*1024, l2_cache_str}, 3324 { 0x82, 8, 32, 256*1024, l2_cache_str}, 3325 { 0x80, 8, 64, 512*1024, l2_cache_str}, 3326 { 0x7f, 2, 64, 512*1024, l2_cache_str}, 3327 { 0x7d, 8, 64, 2*1024*1024, sl2_cache_str}, 3328 { 0x7c, 8, 64, 1024*1024, sl2_cache_str}, 3329 { 0x7b, 8, 64, 512*1024, sl2_cache_str}, 3330 { 0x7a, 8, 64, 256*1024, sl2_cache_str}, 3331 { 0x79, 8, 64, 128*1024, sl2_cache_str}, 3332 { 0x78, 8, 64, 1024*1024, l2_cache_str}, 3333 { 0x73, 8, 0, 64*1024, itrace_str}, 3334 { 0x72, 8, 0, 32*1024, itrace_str}, 3335 { 0x71, 8, 0, 16*1024, itrace_str}, 3336 { 0x70, 8, 0, 12*1024, itrace_str}, 3337 { 0x68, 4, 64, 32*1024, sl1_dcache_str}, 3338 { 0x67, 4, 64, 16*1024, sl1_dcache_str}, 3339 { 0x66, 4, 64, 8*1024, sl1_dcache_str}, 3340 { 0x60, 8, 64, 16*1024, sl1_dcache_str}, 3341 { 0x5d, 0, 0, 256, dtlb44_str}, 3342 { 0x5c, 0, 0, 128, dtlb44_str}, 3343 { 0x5b, 0, 0, 64, dtlb44_str}, 3344 { 0x5a, 4, 0, 32, dtlb24_str}, 3345 { 0x59, 0, 0, 16, dtlb4k_str}, 3346 { 0x57, 4, 0, 16, dtlb4k_str}, 3347 { 0x56, 4, 0, 16, dtlb4M_str}, 3348 { 0x55, 0, 0, 7, itlb24_str}, 3349 { 0x52, 0, 0, 256, itlb424_str}, 3350 { 0x51, 0, 0, 128, itlb424_str}, 3351 { 0x50, 0, 0, 64, itlb424_str}, 3352 { 0x4f, 0, 0, 32, itlb4k_str}, 3353 { 0x4e, 24, 64, 6*1024*1024, l2_cache_str}, 3354 { 0x4d, 16, 64, 16*1024*1024, l3_cache_str}, 3355 { 0x4c, 12, 64, 12*1024*1024, l3_cache_str}, 3356 { 0x4b, 16, 64, 8*1024*1024, l3_cache_str}, 3357 { 0x4a, 12, 64, 6*1024*1024, l3_cache_str}, 3358 { 0x49, 16, 64, 4*1024*1024, l3_cache_str}, 3359 { 0x48, 12, 64, 3*1024*1024, l2_cache_str}, 3360 { 0x47, 8, 64, 8*1024*1024, l3_cache_str}, 3361 { 0x46, 4, 64, 4*1024*1024, l3_cache_str}, 3362 { 0x45, 4, 32, 2*1024*1024, l2_cache_str}, 3363 { 0x44, 4, 32, 1024*1024, l2_cache_str}, 3364 { 0x43, 4, 32, 512*1024, l2_cache_str}, 3365 { 0x42, 4, 32, 256*1024, l2_cache_str}, 3366 { 0x41, 4, 32, 128*1024, l2_cache_str}, 3367 { 0x3e, 4, 64, 512*1024, sl2_cache_str}, 3368 { 0x3d, 6, 64, 384*1024, sl2_cache_str}, 3369 { 0x3c, 4, 64, 256*1024, sl2_cache_str}, 3370 { 0x3b, 2, 64, 128*1024, sl2_cache_str}, 3371 { 0x3a, 6, 64, 192*1024, sl2_cache_str}, 3372 { 0x39, 4, 64, 128*1024, sl2_cache_str}, 3373 { 0x30, 8, 64, 32*1024, l1_icache_str}, 3374 { 0x2c, 8, 64, 32*1024, l1_dcache_str}, 3375 { 0x29, 8, 64, 4096*1024, sl3_cache_str}, 3376 { 0x25, 8, 64, 2048*1024, sl3_cache_str}, 3377 { 0x23, 8, 64, 1024*1024, sl3_cache_str}, 3378 { 0x22, 4, 64, 512*1024, sl3_cache_str}, 3379 { 0x0e, 6, 64, 24*1024, l1_dcache_str}, 3380 { 0x0d, 4, 32, 16*1024, l1_dcache_str}, 3381 { 0x0c, 4, 32, 16*1024, l1_dcache_str}, 3382 { 0x0b, 4, 0, 4, itlb4M_str}, 3383 { 0x0a, 2, 32, 8*1024, l1_dcache_str}, 3384 { 0x08, 4, 32, 16*1024, l1_icache_str}, 3385 { 0x06, 4, 32, 8*1024, l1_icache_str}, 3386 { 0x05, 4, 0, 32, dtlb4M_str}, 3387 { 0x04, 4, 0, 8, dtlb4M_str}, 3388 { 0x03, 4, 0, 64, dtlb4k_str}, 3389 { 0x02, 4, 0, 2, itlb4M_str}, 3390 { 0x01, 4, 0, 32, itlb4k_str}, 3391 { 0 } 3392 }; 3393 3394 static const struct cachetab cyrix_ctab[] = { 3395 { 0x70, 4, 0, 32, "tlb-4K" }, 3396 { 0x80, 4, 16, 16*1024, "l1-cache" }, 3397 { 0 } 3398 }; 3399 3400 /* 3401 * Search a cache table for a matching entry 3402 */ 3403 static const struct cachetab * 3404 find_cacheent(const struct cachetab *ct, uint_t code) 3405 { 3406 if (code != 0) { 3407 for (; ct->ct_code != 0; ct++) 3408 if (ct->ct_code <= code) 3409 break; 3410 if (ct->ct_code == code) 3411 return (ct); 3412 } 3413 return (NULL); 3414 } 3415 3416 /* 3417 * Populate cachetab entry with L2 or L3 cache-information using 3418 * cpuid function 4. This function is called from intel_walk_cacheinfo() 3419 * when descriptor 0x49 is encountered. It returns 0 if no such cache 3420 * information is found. 3421 */ 3422 static int 3423 intel_cpuid_4_cache_info(struct cachetab *ct, struct cpuid_info *cpi) 3424 { 3425 uint32_t level, i; 3426 int ret = 0; 3427 3428 for (i = 0; i < cpi->cpi_std_4_size; i++) { 3429 level = CPI_CACHE_LVL(cpi->cpi_std_4[i]); 3430 3431 if (level == 2 || level == 3) { 3432 ct->ct_assoc = CPI_CACHE_WAYS(cpi->cpi_std_4[i]) + 1; 3433 ct->ct_line_size = 3434 CPI_CACHE_COH_LN_SZ(cpi->cpi_std_4[i]) + 1; 3435 ct->ct_size = ct->ct_assoc * 3436 (CPI_CACHE_PARTS(cpi->cpi_std_4[i]) + 1) * 3437 ct->ct_line_size * 3438 (cpi->cpi_std_4[i]->cp_ecx + 1); 3439 3440 if (level == 2) { 3441 ct->ct_label = l2_cache_str; 3442 } else if (level == 3) { 3443 ct->ct_label = l3_cache_str; 3444 } 3445 ret = 1; 3446 } 3447 } 3448 3449 return (ret); 3450 } 3451 3452 /* 3453 * Walk the cacheinfo descriptor, applying 'func' to every valid element 3454 * The walk is terminated if the walker returns non-zero. 3455 */ 3456 static void 3457 intel_walk_cacheinfo(struct cpuid_info *cpi, 3458 void *arg, int (*func)(void *, const struct cachetab *)) 3459 { 3460 const struct cachetab *ct; 3461 struct cachetab des_49_ct, des_b1_ct; 3462 uint8_t *dp; 3463 int i; 3464 3465 if ((dp = cpi->cpi_cacheinfo) == NULL) 3466 return; 3467 for (i = 0; i < cpi->cpi_ncache; i++, dp++) { 3468 /* 3469 * For overloaded descriptor 0x49 we use cpuid function 4 3470 * if supported by the current processor, to create 3471 * cache information. 3472 * For overloaded descriptor 0xb1 we use X86_PAE flag 3473 * to disambiguate the cache information. 3474 */ 3475 if (*dp == 0x49 && cpi->cpi_maxeax >= 0x4 && 3476 intel_cpuid_4_cache_info(&des_49_ct, cpi) == 1) { 3477 ct = &des_49_ct; 3478 } else if (*dp == 0xb1) { 3479 des_b1_ct.ct_code = 0xb1; 3480 des_b1_ct.ct_assoc = 4; 3481 des_b1_ct.ct_line_size = 0; 3482 if (is_x86_feature(x86_featureset, X86FSET_PAE)) { 3483 des_b1_ct.ct_size = 8; 3484 des_b1_ct.ct_label = itlb2M_str; 3485 } else { 3486 des_b1_ct.ct_size = 4; 3487 des_b1_ct.ct_label = itlb4M_str; 3488 } 3489 ct = &des_b1_ct; 3490 } else { 3491 if ((ct = find_cacheent(intel_ctab, *dp)) == NULL) { 3492 continue; 3493 } 3494 } 3495 3496 if (func(arg, ct) != 0) { 3497 break; 3498 } 3499 } 3500 } 3501 3502 /* 3503 * (Like the Intel one, except for Cyrix CPUs) 3504 */ 3505 static void 3506 cyrix_walk_cacheinfo(struct cpuid_info *cpi, 3507 void *arg, int (*func)(void *, const struct cachetab *)) 3508 { 3509 const struct cachetab *ct; 3510 uint8_t *dp; 3511 int i; 3512 3513 if ((dp = cpi->cpi_cacheinfo) == NULL) 3514 return; 3515 for (i = 0; i < cpi->cpi_ncache; i++, dp++) { 3516 /* 3517 * Search Cyrix-specific descriptor table first .. 3518 */ 3519 if ((ct = find_cacheent(cyrix_ctab, *dp)) != NULL) { 3520 if (func(arg, ct) != 0) 3521 break; 3522 continue; 3523 } 3524 /* 3525 * .. else fall back to the Intel one 3526 */ 3527 if ((ct = find_cacheent(intel_ctab, *dp)) != NULL) { 3528 if (func(arg, ct) != 0) 3529 break; 3530 continue; 3531 } 3532 } 3533 } 3534 3535 /* 3536 * A cacheinfo walker that adds associativity, line-size, and size properties 3537 * to the devinfo node it is passed as an argument. 3538 */ 3539 static int 3540 add_cacheent_props(void *arg, const struct cachetab *ct) 3541 { 3542 dev_info_t *devi = arg; 3543 3544 add_cache_prop(devi, ct->ct_label, assoc_str, ct->ct_assoc); 3545 if (ct->ct_line_size != 0) 3546 add_cache_prop(devi, ct->ct_label, line_str, 3547 ct->ct_line_size); 3548 add_cache_prop(devi, ct->ct_label, size_str, ct->ct_size); 3549 return (0); 3550 } 3551 3552 3553 static const char fully_assoc[] = "fully-associative?"; 3554 3555 /* 3556 * AMD style cache/tlb description 3557 * 3558 * Extended functions 5 and 6 directly describe properties of 3559 * tlbs and various cache levels. 3560 */ 3561 static void 3562 add_amd_assoc(dev_info_t *devi, const char *label, uint_t assoc) 3563 { 3564 switch (assoc) { 3565 case 0: /* reserved; ignore */ 3566 break; 3567 default: 3568 add_cache_prop(devi, label, assoc_str, assoc); 3569 break; 3570 case 0xff: 3571 add_cache_prop(devi, label, fully_assoc, 1); 3572 break; 3573 } 3574 } 3575 3576 static void 3577 add_amd_tlb(dev_info_t *devi, const char *label, uint_t assoc, uint_t size) 3578 { 3579 if (size == 0) 3580 return; 3581 add_cache_prop(devi, label, size_str, size); 3582 add_amd_assoc(devi, label, assoc); 3583 } 3584 3585 static void 3586 add_amd_cache(dev_info_t *devi, const char *label, 3587 uint_t size, uint_t assoc, uint_t lines_per_tag, uint_t line_size) 3588 { 3589 if (size == 0 || line_size == 0) 3590 return; 3591 add_amd_assoc(devi, label, assoc); 3592 /* 3593 * Most AMD parts have a sectored cache. Multiple cache lines are 3594 * associated with each tag. A sector consists of all cache lines 3595 * associated with a tag. For example, the AMD K6-III has a sector 3596 * size of 2 cache lines per tag. 3597 */ 3598 if (lines_per_tag != 0) 3599 add_cache_prop(devi, label, "lines-per-tag", lines_per_tag); 3600 add_cache_prop(devi, label, line_str, line_size); 3601 add_cache_prop(devi, label, size_str, size * 1024); 3602 } 3603 3604 static void 3605 add_amd_l2_assoc(dev_info_t *devi, const char *label, uint_t assoc) 3606 { 3607 switch (assoc) { 3608 case 0: /* off */ 3609 break; 3610 case 1: 3611 case 2: 3612 case 4: 3613 add_cache_prop(devi, label, assoc_str, assoc); 3614 break; 3615 case 6: 3616 add_cache_prop(devi, label, assoc_str, 8); 3617 break; 3618 case 8: 3619 add_cache_prop(devi, label, assoc_str, 16); 3620 break; 3621 case 0xf: 3622 add_cache_prop(devi, label, fully_assoc, 1); 3623 break; 3624 default: /* reserved; ignore */ 3625 break; 3626 } 3627 } 3628 3629 static void 3630 add_amd_l2_tlb(dev_info_t *devi, const char *label, uint_t assoc, uint_t size) 3631 { 3632 if (size == 0 || assoc == 0) 3633 return; 3634 add_amd_l2_assoc(devi, label, assoc); 3635 add_cache_prop(devi, label, size_str, size); 3636 } 3637 3638 static void 3639 add_amd_l2_cache(dev_info_t *devi, const char *label, 3640 uint_t size, uint_t assoc, uint_t lines_per_tag, uint_t line_size) 3641 { 3642 if (size == 0 || assoc == 0 || line_size == 0) 3643 return; 3644 add_amd_l2_assoc(devi, label, assoc); 3645 if (lines_per_tag != 0) 3646 add_cache_prop(devi, label, "lines-per-tag", lines_per_tag); 3647 add_cache_prop(devi, label, line_str, line_size); 3648 add_cache_prop(devi, label, size_str, size * 1024); 3649 } 3650 3651 static void 3652 amd_cache_info(struct cpuid_info *cpi, dev_info_t *devi) 3653 { 3654 struct cpuid_regs *cp; 3655 3656 if (cpi->cpi_xmaxeax < 0x80000005) 3657 return; 3658 cp = &cpi->cpi_extd[5]; 3659 3660 /* 3661 * 4M/2M L1 TLB configuration 3662 * 3663 * We report the size for 2M pages because AMD uses two 3664 * TLB entries for one 4M page. 3665 */ 3666 add_amd_tlb(devi, "dtlb-2M", 3667 BITX(cp->cp_eax, 31, 24), BITX(cp->cp_eax, 23, 16)); 3668 add_amd_tlb(devi, "itlb-2M", 3669 BITX(cp->cp_eax, 15, 8), BITX(cp->cp_eax, 7, 0)); 3670 3671 /* 3672 * 4K L1 TLB configuration 3673 */ 3674 3675 switch (cpi->cpi_vendor) { 3676 uint_t nentries; 3677 case X86_VENDOR_TM: 3678 if (cpi->cpi_family >= 5) { 3679 /* 3680 * Crusoe processors have 256 TLB entries, but 3681 * cpuid data format constrains them to only 3682 * reporting 255 of them. 3683 */ 3684 if ((nentries = BITX(cp->cp_ebx, 23, 16)) == 255) 3685 nentries = 256; 3686 /* 3687 * Crusoe processors also have a unified TLB 3688 */ 3689 add_amd_tlb(devi, "tlb-4K", BITX(cp->cp_ebx, 31, 24), 3690 nentries); 3691 break; 3692 } 3693 /*FALLTHROUGH*/ 3694 default: 3695 add_amd_tlb(devi, itlb4k_str, 3696 BITX(cp->cp_ebx, 31, 24), BITX(cp->cp_ebx, 23, 16)); 3697 add_amd_tlb(devi, dtlb4k_str, 3698 BITX(cp->cp_ebx, 15, 8), BITX(cp->cp_ebx, 7, 0)); 3699 break; 3700 } 3701 3702 /* 3703 * data L1 cache configuration 3704 */ 3705 3706 add_amd_cache(devi, l1_dcache_str, 3707 BITX(cp->cp_ecx, 31, 24), BITX(cp->cp_ecx, 23, 16), 3708 BITX(cp->cp_ecx, 15, 8), BITX(cp->cp_ecx, 7, 0)); 3709 3710 /* 3711 * code L1 cache configuration 3712 */ 3713 3714 add_amd_cache(devi, l1_icache_str, 3715 BITX(cp->cp_edx, 31, 24), BITX(cp->cp_edx, 23, 16), 3716 BITX(cp->cp_edx, 15, 8), BITX(cp->cp_edx, 7, 0)); 3717 3718 if (cpi->cpi_xmaxeax < 0x80000006) 3719 return; 3720 cp = &cpi->cpi_extd[6]; 3721 3722 /* Check for a unified L2 TLB for large pages */ 3723 3724 if (BITX(cp->cp_eax, 31, 16) == 0) 3725 add_amd_l2_tlb(devi, "l2-tlb-2M", 3726 BITX(cp->cp_eax, 15, 12), BITX(cp->cp_eax, 11, 0)); 3727 else { 3728 add_amd_l2_tlb(devi, "l2-dtlb-2M", 3729 BITX(cp->cp_eax, 31, 28), BITX(cp->cp_eax, 27, 16)); 3730 add_amd_l2_tlb(devi, "l2-itlb-2M", 3731 BITX(cp->cp_eax, 15, 12), BITX(cp->cp_eax, 11, 0)); 3732 } 3733 3734 /* Check for a unified L2 TLB for 4K pages */ 3735 3736 if (BITX(cp->cp_ebx, 31, 16) == 0) { 3737 add_amd_l2_tlb(devi, "l2-tlb-4K", 3738 BITX(cp->cp_eax, 15, 12), BITX(cp->cp_eax, 11, 0)); 3739 } else { 3740 add_amd_l2_tlb(devi, "l2-dtlb-4K", 3741 BITX(cp->cp_eax, 31, 28), BITX(cp->cp_eax, 27, 16)); 3742 add_amd_l2_tlb(devi, "l2-itlb-4K", 3743 BITX(cp->cp_eax, 15, 12), BITX(cp->cp_eax, 11, 0)); 3744 } 3745 3746 add_amd_l2_cache(devi, l2_cache_str, 3747 BITX(cp->cp_ecx, 31, 16), BITX(cp->cp_ecx, 15, 12), 3748 BITX(cp->cp_ecx, 11, 8), BITX(cp->cp_ecx, 7, 0)); 3749 } 3750 3751 /* 3752 * There are two basic ways that the x86 world describes it cache 3753 * and tlb architecture - Intel's way and AMD's way. 3754 * 3755 * Return which flavor of cache architecture we should use 3756 */ 3757 static int 3758 x86_which_cacheinfo(struct cpuid_info *cpi) 3759 { 3760 switch (cpi->cpi_vendor) { 3761 case X86_VENDOR_Intel: 3762 if (cpi->cpi_maxeax >= 2) 3763 return (X86_VENDOR_Intel); 3764 break; 3765 case X86_VENDOR_AMD: 3766 /* 3767 * The K5 model 1 was the first part from AMD that reported 3768 * cache sizes via extended cpuid functions. 3769 */ 3770 if (cpi->cpi_family > 5 || 3771 (cpi->cpi_family == 5 && cpi->cpi_model >= 1)) 3772 return (X86_VENDOR_AMD); 3773 break; 3774 case X86_VENDOR_TM: 3775 if (cpi->cpi_family >= 5) 3776 return (X86_VENDOR_AMD); 3777 /*FALLTHROUGH*/ 3778 default: 3779 /* 3780 * If they have extended CPU data for 0x80000005 3781 * then we assume they have AMD-format cache 3782 * information. 3783 * 3784 * If not, and the vendor happens to be Cyrix, 3785 * then try our-Cyrix specific handler. 3786 * 3787 * If we're not Cyrix, then assume we're using Intel's 3788 * table-driven format instead. 3789 */ 3790 if (cpi->cpi_xmaxeax >= 0x80000005) 3791 return (X86_VENDOR_AMD); 3792 else if (cpi->cpi_vendor == X86_VENDOR_Cyrix) 3793 return (X86_VENDOR_Cyrix); 3794 else if (cpi->cpi_maxeax >= 2) 3795 return (X86_VENDOR_Intel); 3796 break; 3797 } 3798 return (-1); 3799 } 3800 3801 void 3802 cpuid_set_cpu_properties(void *dip, processorid_t cpu_id, 3803 struct cpuid_info *cpi) 3804 { 3805 dev_info_t *cpu_devi; 3806 int create; 3807 3808 cpu_devi = (dev_info_t *)dip; 3809 3810 /* device_type */ 3811 (void) ndi_prop_update_string(DDI_DEV_T_NONE, cpu_devi, 3812 "device_type", "cpu"); 3813 3814 /* reg */ 3815 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3816 "reg", cpu_id); 3817 3818 /* cpu-mhz, and clock-frequency */ 3819 if (cpu_freq > 0) { 3820 long long mul; 3821 3822 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3823 "cpu-mhz", cpu_freq); 3824 if ((mul = cpu_freq * 1000000LL) <= INT_MAX) 3825 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3826 "clock-frequency", (int)mul); 3827 } 3828 3829 if (!is_x86_feature(x86_featureset, X86FSET_CPUID)) { 3830 return; 3831 } 3832 3833 /* vendor-id */ 3834 (void) ndi_prop_update_string(DDI_DEV_T_NONE, cpu_devi, 3835 "vendor-id", cpi->cpi_vendorstr); 3836 3837 if (cpi->cpi_maxeax == 0) { 3838 return; 3839 } 3840 3841 /* 3842 * family, model, and step 3843 */ 3844 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3845 "family", CPI_FAMILY(cpi)); 3846 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3847 "cpu-model", CPI_MODEL(cpi)); 3848 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3849 "stepping-id", CPI_STEP(cpi)); 3850 3851 /* type */ 3852 switch (cpi->cpi_vendor) { 3853 case X86_VENDOR_Intel: 3854 create = 1; 3855 break; 3856 default: 3857 create = 0; 3858 break; 3859 } 3860 if (create) 3861 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3862 "type", CPI_TYPE(cpi)); 3863 3864 /* ext-family */ 3865 switch (cpi->cpi_vendor) { 3866 case X86_VENDOR_Intel: 3867 case X86_VENDOR_AMD: 3868 create = cpi->cpi_family >= 0xf; 3869 break; 3870 default: 3871 create = 0; 3872 break; 3873 } 3874 if (create) 3875 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3876 "ext-family", CPI_FAMILY_XTD(cpi)); 3877 3878 /* ext-model */ 3879 switch (cpi->cpi_vendor) { 3880 case X86_VENDOR_Intel: 3881 create = IS_EXTENDED_MODEL_INTEL(cpi); 3882 break; 3883 case X86_VENDOR_AMD: 3884 create = CPI_FAMILY(cpi) == 0xf; 3885 break; 3886 default: 3887 create = 0; 3888 break; 3889 } 3890 if (create) 3891 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3892 "ext-model", CPI_MODEL_XTD(cpi)); 3893 3894 /* generation */ 3895 switch (cpi->cpi_vendor) { 3896 case X86_VENDOR_AMD: 3897 /* 3898 * AMD K5 model 1 was the first part to support this 3899 */ 3900 create = cpi->cpi_xmaxeax >= 0x80000001; 3901 break; 3902 default: 3903 create = 0; 3904 break; 3905 } 3906 if (create) 3907 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3908 "generation", BITX((cpi)->cpi_extd[1].cp_eax, 11, 8)); 3909 3910 /* brand-id */ 3911 switch (cpi->cpi_vendor) { 3912 case X86_VENDOR_Intel: 3913 /* 3914 * brand id first appeared on Pentium III Xeon model 8, 3915 * and Celeron model 8 processors and Opteron 3916 */ 3917 create = cpi->cpi_family > 6 || 3918 (cpi->cpi_family == 6 && cpi->cpi_model >= 8); 3919 break; 3920 case X86_VENDOR_AMD: 3921 create = cpi->cpi_family >= 0xf; 3922 break; 3923 default: 3924 create = 0; 3925 break; 3926 } 3927 if (create && cpi->cpi_brandid != 0) { 3928 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3929 "brand-id", cpi->cpi_brandid); 3930 } 3931 3932 /* chunks, and apic-id */ 3933 switch (cpi->cpi_vendor) { 3934 /* 3935 * first available on Pentium IV and Opteron (K8) 3936 */ 3937 case X86_VENDOR_Intel: 3938 create = IS_NEW_F6(cpi) || cpi->cpi_family >= 0xf; 3939 break; 3940 case X86_VENDOR_AMD: 3941 create = cpi->cpi_family >= 0xf; 3942 break; 3943 default: 3944 create = 0; 3945 break; 3946 } 3947 if (create) { 3948 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3949 "chunks", CPI_CHUNKS(cpi)); 3950 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3951 "apic-id", cpi->cpi_apicid); 3952 if (cpi->cpi_chipid >= 0) { 3953 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3954 "chip#", cpi->cpi_chipid); 3955 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3956 "clog#", cpi->cpi_clogid); 3957 } 3958 } 3959 3960 /* cpuid-features */ 3961 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3962 "cpuid-features", CPI_FEATURES_EDX(cpi)); 3963 3964 3965 /* cpuid-features-ecx */ 3966 switch (cpi->cpi_vendor) { 3967 case X86_VENDOR_Intel: 3968 create = IS_NEW_F6(cpi) || cpi->cpi_family >= 0xf; 3969 break; 3970 default: 3971 create = 0; 3972 break; 3973 } 3974 if (create) 3975 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3976 "cpuid-features-ecx", CPI_FEATURES_ECX(cpi)); 3977 3978 /* ext-cpuid-features */ 3979 switch (cpi->cpi_vendor) { 3980 case X86_VENDOR_Intel: 3981 case X86_VENDOR_AMD: 3982 case X86_VENDOR_Cyrix: 3983 case X86_VENDOR_TM: 3984 case X86_VENDOR_Centaur: 3985 create = cpi->cpi_xmaxeax >= 0x80000001; 3986 break; 3987 default: 3988 create = 0; 3989 break; 3990 } 3991 if (create) { 3992 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3993 "ext-cpuid-features", CPI_FEATURES_XTD_EDX(cpi)); 3994 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi, 3995 "ext-cpuid-features-ecx", CPI_FEATURES_XTD_ECX(cpi)); 3996 } 3997 3998 /* 3999 * Brand String first appeared in Intel Pentium IV, AMD K5 4000 * model 1, and Cyrix GXm. On earlier models we try and 4001 * simulate something similar .. so this string should always 4002 * same -something- about the processor, however lame. 4003 */ 4004 (void) ndi_prop_update_string(DDI_DEV_T_NONE, cpu_devi, 4005 "brand-string", cpi->cpi_brandstr); 4006 4007 /* 4008 * Finally, cache and tlb information 4009 */ 4010 switch (x86_which_cacheinfo(cpi)) { 4011 case X86_VENDOR_Intel: 4012 intel_walk_cacheinfo(cpi, cpu_devi, add_cacheent_props); 4013 break; 4014 case X86_VENDOR_Cyrix: 4015 cyrix_walk_cacheinfo(cpi, cpu_devi, add_cacheent_props); 4016 break; 4017 case X86_VENDOR_AMD: 4018 amd_cache_info(cpi, cpu_devi); 4019 break; 4020 default: 4021 break; 4022 } 4023 } 4024 4025 struct l2info { 4026 int *l2i_csz; 4027 int *l2i_lsz; 4028 int *l2i_assoc; 4029 int l2i_ret; 4030 }; 4031 4032 /* 4033 * A cacheinfo walker that fetches the size, line-size and associativity 4034 * of the L2 cache 4035 */ 4036 static int 4037 intel_l2cinfo(void *arg, const struct cachetab *ct) 4038 { 4039 struct l2info *l2i = arg; 4040 int *ip; 4041 4042 if (ct->ct_label != l2_cache_str && 4043 ct->ct_label != sl2_cache_str) 4044 return (0); /* not an L2 -- keep walking */ 4045 4046 if ((ip = l2i->l2i_csz) != NULL) 4047 *ip = ct->ct_size; 4048 if ((ip = l2i->l2i_lsz) != NULL) 4049 *ip = ct->ct_line_size; 4050 if ((ip = l2i->l2i_assoc) != NULL) 4051 *ip = ct->ct_assoc; 4052 l2i->l2i_ret = ct->ct_size; 4053 return (1); /* was an L2 -- terminate walk */ 4054 } 4055 4056 /* 4057 * AMD L2/L3 Cache and TLB Associativity Field Definition: 4058 * 4059 * Unlike the associativity for the L1 cache and tlb where the 8 bit 4060 * value is the associativity, the associativity for the L2 cache and 4061 * tlb is encoded in the following table. The 4 bit L2 value serves as 4062 * an index into the amd_afd[] array to determine the associativity. 4063 * -1 is undefined. 0 is fully associative. 4064 */ 4065 4066 static int amd_afd[] = 4067 {-1, 1, 2, -1, 4, -1, 8, -1, 16, -1, 32, 48, 64, 96, 128, 0}; 4068 4069 static void 4070 amd_l2cacheinfo(struct cpuid_info *cpi, struct l2info *l2i) 4071 { 4072 struct cpuid_regs *cp; 4073 uint_t size, assoc; 4074 int i; 4075 int *ip; 4076 4077 if (cpi->cpi_xmaxeax < 0x80000006) 4078 return; 4079 cp = &cpi->cpi_extd[6]; 4080 4081 if ((i = BITX(cp->cp_ecx, 15, 12)) != 0 && 4082 (size = BITX(cp->cp_ecx, 31, 16)) != 0) { 4083 uint_t cachesz = size * 1024; 4084 assoc = amd_afd[i]; 4085 4086 ASSERT(assoc != -1); 4087 4088 if ((ip = l2i->l2i_csz) != NULL) 4089 *ip = cachesz; 4090 if ((ip = l2i->l2i_lsz) != NULL) 4091 *ip = BITX(cp->cp_ecx, 7, 0); 4092 if ((ip = l2i->l2i_assoc) != NULL) 4093 *ip = assoc; 4094 l2i->l2i_ret = cachesz; 4095 } 4096 } 4097 4098 int 4099 getl2cacheinfo(cpu_t *cpu, int *csz, int *lsz, int *assoc) 4100 { 4101 struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi; 4102 struct l2info __l2info, *l2i = &__l2info; 4103 4104 l2i->l2i_csz = csz; 4105 l2i->l2i_lsz = lsz; 4106 l2i->l2i_assoc = assoc; 4107 l2i->l2i_ret = -1; 4108 4109 switch (x86_which_cacheinfo(cpi)) { 4110 case X86_VENDOR_Intel: 4111 intel_walk_cacheinfo(cpi, l2i, intel_l2cinfo); 4112 break; 4113 case X86_VENDOR_Cyrix: 4114 cyrix_walk_cacheinfo(cpi, l2i, intel_l2cinfo); 4115 break; 4116 case X86_VENDOR_AMD: 4117 amd_l2cacheinfo(cpi, l2i); 4118 break; 4119 default: 4120 break; 4121 } 4122 return (l2i->l2i_ret); 4123 } 4124 4125 #if !defined(__xpv) 4126 4127 uint32_t * 4128 cpuid_mwait_alloc(cpu_t *cpu) 4129 { 4130 uint32_t *ret; 4131 size_t mwait_size; 4132 4133 ASSERT(cpuid_checkpass(CPU, 2)); 4134 4135 mwait_size = CPU->cpu_m.mcpu_cpi->cpi_mwait.mon_max; 4136 if (mwait_size == 0) 4137 return (NULL); 4138 4139 /* 4140 * kmem_alloc() returns cache line size aligned data for mwait_size 4141 * allocations. mwait_size is currently cache line sized. Neither 4142 * of these implementation details are guarantied to be true in the 4143 * future. 4144 * 4145 * First try allocating mwait_size as kmem_alloc() currently returns 4146 * correctly aligned memory. If kmem_alloc() does not return 4147 * mwait_size aligned memory, then use mwait_size ROUNDUP. 4148 * 4149 * Set cpi_mwait.buf_actual and cpi_mwait.size_actual in case we 4150 * decide to free this memory. 4151 */ 4152 ret = kmem_zalloc(mwait_size, KM_SLEEP); 4153 if (ret == (uint32_t *)P2ROUNDUP((uintptr_t)ret, mwait_size)) { 4154 cpu->cpu_m.mcpu_cpi->cpi_mwait.buf_actual = ret; 4155 cpu->cpu_m.mcpu_cpi->cpi_mwait.size_actual = mwait_size; 4156 *ret = MWAIT_RUNNING; 4157 return (ret); 4158 } else { 4159 kmem_free(ret, mwait_size); 4160 ret = kmem_zalloc(mwait_size * 2, KM_SLEEP); 4161 cpu->cpu_m.mcpu_cpi->cpi_mwait.buf_actual = ret; 4162 cpu->cpu_m.mcpu_cpi->cpi_mwait.size_actual = mwait_size * 2; 4163 ret = (uint32_t *)P2ROUNDUP((uintptr_t)ret, mwait_size); 4164 *ret = MWAIT_RUNNING; 4165 return (ret); 4166 } 4167 } 4168 4169 void 4170 cpuid_mwait_free(cpu_t *cpu) 4171 { 4172 if (cpu->cpu_m.mcpu_cpi == NULL) { 4173 return; 4174 } 4175 4176 if (cpu->cpu_m.mcpu_cpi->cpi_mwait.buf_actual != NULL && 4177 cpu->cpu_m.mcpu_cpi->cpi_mwait.size_actual > 0) { 4178 kmem_free(cpu->cpu_m.mcpu_cpi->cpi_mwait.buf_actual, 4179 cpu->cpu_m.mcpu_cpi->cpi_mwait.size_actual); 4180 } 4181 4182 cpu->cpu_m.mcpu_cpi->cpi_mwait.buf_actual = NULL; 4183 cpu->cpu_m.mcpu_cpi->cpi_mwait.size_actual = 0; 4184 } 4185 4186 void 4187 patch_tsc_read(int flag) 4188 { 4189 size_t cnt; 4190 4191 switch (flag) { 4192 case X86_NO_TSC: 4193 cnt = &_no_rdtsc_end - &_no_rdtsc_start; 4194 (void) memcpy((void *)tsc_read, (void *)&_no_rdtsc_start, cnt); 4195 break; 4196 case X86_HAVE_TSCP: 4197 cnt = &_tscp_end - &_tscp_start; 4198 (void) memcpy((void *)tsc_read, (void *)&_tscp_start, cnt); 4199 break; 4200 case X86_TSC_MFENCE: 4201 cnt = &_tsc_mfence_end - &_tsc_mfence_start; 4202 (void) memcpy((void *)tsc_read, 4203 (void *)&_tsc_mfence_start, cnt); 4204 break; 4205 case X86_TSC_LFENCE: 4206 cnt = &_tsc_lfence_end - &_tsc_lfence_start; 4207 (void) memcpy((void *)tsc_read, 4208 (void *)&_tsc_lfence_start, cnt); 4209 break; 4210 default: 4211 break; 4212 } 4213 } 4214 4215 int 4216 cpuid_deep_cstates_supported(void) 4217 { 4218 struct cpuid_info *cpi; 4219 struct cpuid_regs regs; 4220 4221 ASSERT(cpuid_checkpass(CPU, 1)); 4222 4223 cpi = CPU->cpu_m.mcpu_cpi; 4224 4225 if (!is_x86_feature(x86_featureset, X86FSET_CPUID)) 4226 return (0); 4227 4228 switch (cpi->cpi_vendor) { 4229 case X86_VENDOR_Intel: 4230 if (cpi->cpi_xmaxeax < 0x80000007) 4231 return (0); 4232 4233 /* 4234 * TSC run at a constant rate in all ACPI C-states? 4235 */ 4236 regs.cp_eax = 0x80000007; 4237 (void) __cpuid_insn(®s); 4238 return (regs.cp_edx & CPUID_TSC_CSTATE_INVARIANCE); 4239 4240 default: 4241 return (0); 4242 } 4243 } 4244 4245 #endif /* !__xpv */ 4246 4247 void 4248 post_startup_cpu_fixups(void) 4249 { 4250 #ifndef __xpv 4251 /* 4252 * Some AMD processors support C1E state. Entering this state will 4253 * cause the local APIC timer to stop, which we can't deal with at 4254 * this time. 4255 */ 4256 if (cpuid_getvendor(CPU) == X86_VENDOR_AMD) { 4257 on_trap_data_t otd; 4258 uint64_t reg; 4259 4260 if (!on_trap(&otd, OT_DATA_ACCESS)) { 4261 reg = rdmsr(MSR_AMD_INT_PENDING_CMP_HALT); 4262 /* Disable C1E state if it is enabled by BIOS */ 4263 if ((reg >> AMD_ACTONCMPHALT_SHIFT) & 4264 AMD_ACTONCMPHALT_MASK) { 4265 reg &= ~(AMD_ACTONCMPHALT_MASK << 4266 AMD_ACTONCMPHALT_SHIFT); 4267 wrmsr(MSR_AMD_INT_PENDING_CMP_HALT, reg); 4268 } 4269 } 4270 no_trap(); 4271 } 4272 #endif /* !__xpv */ 4273 } 4274 4275 /* 4276 * Starting with the Westmere processor the local 4277 * APIC timer will continue running in all C-states, 4278 * including the deepest C-states. 4279 */ 4280 int 4281 cpuid_arat_supported(void) 4282 { 4283 struct cpuid_info *cpi; 4284 struct cpuid_regs regs; 4285 4286 ASSERT(cpuid_checkpass(CPU, 1)); 4287 ASSERT(is_x86_feature(x86_featureset, X86FSET_CPUID)); 4288 4289 cpi = CPU->cpu_m.mcpu_cpi; 4290 4291 switch (cpi->cpi_vendor) { 4292 case X86_VENDOR_Intel: 4293 /* 4294 * Always-running Local APIC Timer is 4295 * indicated by CPUID.6.EAX[2]. 4296 */ 4297 if (cpi->cpi_maxeax >= 6) { 4298 regs.cp_eax = 6; 4299 (void) cpuid_insn(NULL, ®s); 4300 return (regs.cp_eax & CPUID_CSTATE_ARAT); 4301 } else { 4302 return (0); 4303 } 4304 default: 4305 return (0); 4306 } 4307 } 4308 4309 /* 4310 * Check support for Intel ENERGY_PERF_BIAS feature 4311 */ 4312 int 4313 cpuid_iepb_supported(struct cpu *cp) 4314 { 4315 struct cpuid_info *cpi = cp->cpu_m.mcpu_cpi; 4316 struct cpuid_regs regs; 4317 4318 ASSERT(cpuid_checkpass(cp, 1)); 4319 4320 if (!(is_x86_feature(x86_featureset, X86FSET_CPUID)) || 4321 !(is_x86_feature(x86_featureset, X86FSET_MSR))) { 4322 return (0); 4323 } 4324 4325 /* 4326 * Intel ENERGY_PERF_BIAS MSR is indicated by 4327 * capability bit CPUID.6.ECX.3 4328 */ 4329 if ((cpi->cpi_vendor != X86_VENDOR_Intel) || (cpi->cpi_maxeax < 6)) 4330 return (0); 4331 4332 regs.cp_eax = 0x6; 4333 (void) cpuid_insn(NULL, ®s); 4334 return (regs.cp_ecx & CPUID_EPB_SUPPORT); 4335 } 4336 4337 #if defined(__amd64) && !defined(__xpv) 4338 /* 4339 * Patch in versions of bcopy for high performance Intel Nhm processors 4340 * and later... 4341 */ 4342 void 4343 patch_memops(uint_t vendor) 4344 { 4345 size_t cnt, i; 4346 caddr_t to, from; 4347 4348 if ((vendor == X86_VENDOR_Intel) && 4349 is_x86_feature(x86_featureset, X86FSET_SSE4_2)) { 4350 cnt = &bcopy_patch_end - &bcopy_patch_start; 4351 to = &bcopy_ck_size; 4352 from = &bcopy_patch_start; 4353 for (i = 0; i < cnt; i++) { 4354 *to++ = *from++; 4355 } 4356 } 4357 } 4358 #endif /* __amd64 && !__xpv */ 4359 4360 /* 4361 * This function finds the number of bits to represent the number of cores per 4362 * chip and the number of strands per core for the Intel platforms. 4363 * It re-uses the x2APIC cpuid code of the cpuid_pass2(). 4364 */ 4365 void 4366 cpuid_get_ext_topo(uint_t vendor, uint_t *core_nbits, uint_t *strand_nbits) 4367 { 4368 struct cpuid_regs regs; 4369 struct cpuid_regs *cp = ®s; 4370 4371 if (vendor != X86_VENDOR_Intel) { 4372 return; 4373 } 4374 4375 /* if the cpuid level is 0xB, extended topo is available. */ 4376 cp->cp_eax = 0; 4377 if (__cpuid_insn(cp) >= 0xB) { 4378 4379 cp->cp_eax = 0xB; 4380 cp->cp_edx = cp->cp_ebx = cp->cp_ecx = 0; 4381 (void) __cpuid_insn(cp); 4382 4383 /* 4384 * Check CPUID.EAX=0BH, ECX=0H:EBX is non-zero, which 4385 * indicates that the extended topology enumeration leaf is 4386 * available. 4387 */ 4388 if (cp->cp_ebx) { 4389 uint_t coreid_shift = 0; 4390 uint_t chipid_shift = 0; 4391 uint_t i; 4392 uint_t level; 4393 4394 for (i = 0; i < CPI_FNB_ECX_MAX; i++) { 4395 cp->cp_eax = 0xB; 4396 cp->cp_ecx = i; 4397 4398 (void) __cpuid_insn(cp); 4399 level = CPI_CPU_LEVEL_TYPE(cp); 4400 4401 if (level == 1) { 4402 /* 4403 * Thread level processor topology 4404 * Number of bits shift right APIC ID 4405 * to get the coreid. 4406 */ 4407 coreid_shift = BITX(cp->cp_eax, 4, 0); 4408 } else if (level == 2) { 4409 /* 4410 * Core level processor topology 4411 * Number of bits shift right APIC ID 4412 * to get the chipid. 4413 */ 4414 chipid_shift = BITX(cp->cp_eax, 4, 0); 4415 } 4416 } 4417 4418 if (coreid_shift > 0 && chipid_shift > coreid_shift) { 4419 *strand_nbits = coreid_shift; 4420 *core_nbits = chipid_shift - coreid_shift; 4421 } 4422 } 4423 } 4424 } 4425