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