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