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