usr/src/uts/i86pc/os/cpuid.c
author sherrym
Mon, 02 Jul 2007 14:05:35 -0700
changeset 4581 b6104e41b06c
parent 4481 2bb321aaf3c3
child 4606 ffcd05844ec5
permissions -rw-r--r--
PSARC/2007/349 Intel Microcode Update Support 6558456 Need to support microcode update on Intel platforms
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1582
eb879d43ab47 6323525 Mutual exclusion primitives don't work as expected on Opteron systems
kchow
parents: 1414
diff changeset
     5
 * Common Development and Distribution License (the "License").
eb879d43ab47 6323525 Mutual exclusion primitives don't work as expected on Opteron systems
kchow
parents: 1414
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
3434
5142e1d7d0bc 6461311 multi-level CMT scheduling optimizations
esaxe
parents: 2869
diff changeset
    22
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
 * Various routines to handle identification
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 * and classification of x86 processors.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/archsystm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <sys/x86_archext.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <sys/kmem.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/systm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/cmn_err.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <sys/sunddi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/sunndi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <sys/cpuvar.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <sys/processor.h>
3434
5142e1d7d0bc 6461311 multi-level CMT scheduling optimizations
esaxe
parents: 2869
diff changeset
    43
#include <sys/pg.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <sys/fp.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <sys/controlregs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include <sys/auxv_386.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include <sys/bitmap.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include <sys/memnode.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
 * Pass 0 of cpuid feature analysis happens in locore. It contains special code
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 * to recognize Cyrix processors that are not cpuid-compliant, and to deal with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 * them accordingly. For most modern processors, feature detection occurs here
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
 * in pass 1.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
 * Pass 1 of cpuid feature analysis happens just at the beginning of mlsetup()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
 * for the boot CPU and does the basic analysis that the early kernel needs.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
 * x86_feature is set based on the return value of cpuid_pass1() of the boot
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
 * CPU.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
 * Pass 1 includes:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
 *	o Determining vendor/model/family/stepping and setting x86_type and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
 *	  x86_vendor accordingly.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
 *	o Processing the feature flags returned by the cpuid instruction while
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
 *	  applying any workarounds or tricks for the specific processor.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
 *	o Mapping the feature flags into Solaris feature bits (X86_*).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
 *	o Processing extended feature flags if supported by the processor,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
 *	  again while applying specific processor knowledge.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
 *	o Determining the CMT characteristics of the system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
 * Pass 1 is done on non-boot CPUs during their initialization and the results
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
 * are used only as a meager attempt at ensuring that all processors within the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
 * system support the same features.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
 * Pass 2 of cpuid feature analysis happens just at the beginning
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
 * of startup().  It just copies in and corrects the remainder
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
 * of the cpuid data we depend on: standard cpuid functions that we didn't
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
 * need for pass1 feature analysis, and extended cpuid functions beyond the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
 * simple feature processing done in pass1.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
 * Pass 3 of cpuid analysis is invoked after basic kernel services; in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
 * particular kernel memory allocation has been made available. It creates a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
 * readable brand string based on the data collected in the first two passes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
 * Pass 4 of cpuid analysis is invoked after post_startup() when all
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
 * the support infrastructure for various hardware features has been
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
 * initialized. It determines which processor features will be reported
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
 * to userland via the aux vector.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
 * All passes are executed on all CPUs, but only the boot CPU determines what
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
 * features the kernel will use.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
 * Much of the worst junk in this file is for the support of processors
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
 * that didn't really implement the cpuid instruction properly.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
 * NOTE: The accessor functions (cpuid_get*) are aware of, and ASSERT upon,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
 * the pass numbers.  Accordingly, changes to the pass code may require changes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
 * to the accessor code.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
uint_t x86_feature = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
uint_t x86_vendor = X86_VENDOR_IntelClone;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
uint_t x86_type = X86_TYPE_OTHER;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
uint_t pentiumpro_bug4046376;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
uint_t pentiumpro_bug4064495;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
uint_t enable486;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
 * This set of strings are for processors rumored to support the cpuid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
 * instruction, and is used by locore.s to figure out how to set x86_vendor
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
const char CyrixInstead[] = "CyrixInstead";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
/*
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   118
 * monitor/mwait info.
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   119
 */
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   120
struct mwait_info {
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   121
	size_t		mon_min;	/* min size to avoid missed wakeups */
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   122
	size_t		mon_max;	/* size to avoid false wakeups */
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   123
	uint32_t	support;	/* processor support of monitor/mwait */
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   124
};
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   125
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   126
/*
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
 * These constants determine how many of the elements of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
 * cpuid we cache in the cpuid_info data structure; the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
 * remaining elements are accessible via the cpuid instruction.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
#define	NMAX_CPI_STD	6		/* eax = 0 .. 5 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
#define	NMAX_CPI_EXTD	9		/* eax = 0x80000000 .. 0x80000008 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
struct cpuid_info {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	uint_t cpi_pass;		/* last pass completed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	 * standard function information
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	uint_t cpi_maxeax;		/* fn 0: %eax */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	char cpi_vendorstr[13];		/* fn 0: %ebx:%ecx:%edx */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	uint_t cpi_vendor;		/* enum of cpi_vendorstr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	uint_t cpi_family;		/* fn 1: extended family */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	uint_t cpi_model;		/* fn 1: extended model */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	uint_t cpi_step;		/* fn 1: stepping */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	chipid_t cpi_chipid;		/* fn 1: %ebx: chip # on ht cpus */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	uint_t cpi_brandid;		/* fn 1: %ebx: brand ID */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	int cpi_clogid;			/* fn 1: %ebx: thread # */
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   150
	uint_t cpi_ncpu_per_chip;	/* fn 1: %ebx: logical cpu count */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	uint8_t cpi_cacheinfo[16];	/* fn 2: intel-style cache desc */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	uint_t cpi_ncache;		/* fn 2: number of elements */
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   153
	struct cpuid_regs cpi_std[NMAX_CPI_STD];	/* 0 .. 5 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	 * extended function information
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
	uint_t cpi_xmaxeax;		/* fn 0x80000000: %eax */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	char cpi_brandstr[49];		/* fn 0x8000000[234] */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
	uint8_t cpi_pabits;		/* fn 0x80000006: %eax */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	uint8_t cpi_vabits;		/* fn 0x80000006: %eax */
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   161
	struct cpuid_regs cpi_extd[NMAX_CPI_EXTD]; /* 0x8000000[0-8] */
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   162
	id_t cpi_coreid;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   163
	uint_t cpi_ncore_per_chip;	/* AMD: fn 0x80000008: %ecx[7-0] */
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   164
					/* Intel: fn 4: %eax[31-26] */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	 * supported feature information
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	 */
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   168
	uint32_t cpi_support[5];
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
#define	STD_EDX_FEATURES	0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
#define	AMD_EDX_FEATURES	1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
#define	TM_EDX_FEATURES		2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
#define	STD_ECX_FEATURES	3
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   173
#define	AMD_ECX_FEATURES	4
2869
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   174
	/*
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   175
	 * Synthesized information, where known.
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   176
	 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   177
	uint32_t cpi_chiprev;		/* See X86_CHIPREV_* in x86_archext.h */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   178
	const char *cpi_chiprevstr;	/* May be NULL if chiprev unknown */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   179
	uint32_t cpi_socket;		/* Chip package/socket type */
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   180
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   181
	struct mwait_info cpi_mwait;	/* fn 5: monitor/mwait info */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
static struct cpuid_info cpuid_info0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
 * These bit fields are defined by the Intel Application Note AP-485
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
 * "Intel Processor Identification and the CPUID Instruction"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
#define	CPI_FAMILY_XTD(cpi)	BITX((cpi)->cpi_std[1].cp_eax, 27, 20)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
#define	CPI_MODEL_XTD(cpi)	BITX((cpi)->cpi_std[1].cp_eax, 19, 16)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
#define	CPI_TYPE(cpi)		BITX((cpi)->cpi_std[1].cp_eax, 13, 12)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
#define	CPI_FAMILY(cpi)		BITX((cpi)->cpi_std[1].cp_eax, 11, 8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
#define	CPI_STEP(cpi)		BITX((cpi)->cpi_std[1].cp_eax, 3, 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
#define	CPI_MODEL(cpi)		BITX((cpi)->cpi_std[1].cp_eax, 7, 4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
#define	CPI_FEATURES_EDX(cpi)		((cpi)->cpi_std[1].cp_edx)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
#define	CPI_FEATURES_ECX(cpi)		((cpi)->cpi_std[1].cp_ecx)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
#define	CPI_FEATURES_XTD_EDX(cpi)	((cpi)->cpi_extd[1].cp_edx)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
#define	CPI_FEATURES_XTD_ECX(cpi)	((cpi)->cpi_extd[1].cp_ecx)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
#define	CPI_BRANDID(cpi)	BITX((cpi)->cpi_std[1].cp_ebx, 7, 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
#define	CPI_CHUNKS(cpi)		BITX((cpi)->cpi_std[1].cp_ebx, 15, 7)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
#define	CPI_CPU_COUNT(cpi)	BITX((cpi)->cpi_std[1].cp_ebx, 23, 16)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
#define	CPI_APIC_ID(cpi)	BITX((cpi)->cpi_std[1].cp_ebx, 31, 24)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
#define	CPI_MAXEAX_MAX		0x100		/* sanity control */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
#define	CPI_XMAXEAX_MAX		0x80000100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
/*
1975
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   212
 * A couple of shorthand macros to identify "later" P6-family chips
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   213
 * like the Pentium M and Core.  First, the "older" P6-based stuff
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   214
 * (loosely defined as "pre-Pentium-4"):
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   215
 * P6, PII, Mobile PII, PII Xeon, PIII, Mobile PIII, PIII Xeon
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   216
 */
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   217
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   218
#define	IS_LEGACY_P6(cpi) (			\
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   219
	cpi->cpi_family == 6 && 		\
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   220
		(cpi->cpi_model == 1 ||		\
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   221
		cpi->cpi_model == 3 ||		\
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   222
		cpi->cpi_model == 5 ||		\
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   223
		cpi->cpi_model == 6 ||		\
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   224
		cpi->cpi_model == 7 ||		\
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   225
		cpi->cpi_model == 8 ||		\
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   226
		cpi->cpi_model == 0xA ||	\
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   227
		cpi->cpi_model == 0xB)		\
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   228
)
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   229
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   230
/* A "new F6" is everything with family 6 that's not the above */
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   231
#define	IS_NEW_F6(cpi) ((cpi->cpi_family == 6) && !IS_LEGACY_P6(cpi))
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   232
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   233
/*
2869
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   234
 * AMD family 0xf socket types.
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   235
 * First index is 0 for revs B thru E, 1 for F and G.
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   236
 * Second index by (model & 0x3)
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   237
 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   238
static uint32_t amd_skts[2][4] = {
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   239
	{
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   240
		X86_SOCKET_754,		/* 0b00 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   241
		X86_SOCKET_940,		/* 0b01 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   242
		X86_SOCKET_754,		/* 0b10 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   243
		X86_SOCKET_939		/* 0b11 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   244
	},
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   245
	{
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   246
		X86_SOCKET_S1g1,	/* 0b00 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   247
		X86_SOCKET_F1207,	/* 0b01 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   248
		X86_SOCKET_UNKNOWN,	/* 0b10 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   249
		X86_SOCKET_AM2		/* 0b11 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   250
	}
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   251
};
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   252
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   253
/*
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   254
 * Table for mapping AMD Family 0xf model/stepping combination to
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   255
 * chip "revision" and socket type.  Only rm_family 0xf is used at the
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   256
 * moment, but AMD family 0x10 will extend the exsiting revision names
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   257
 * so will likely also use this table.
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   258
 *
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   259
 * The first member of this array that matches a given family, extended model
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   260
 * plus model range, and stepping range will be considered a match.
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   261
 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   262
static const struct amd_rev_mapent {
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   263
	uint_t rm_family;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   264
	uint_t rm_modello;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   265
	uint_t rm_modelhi;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   266
	uint_t rm_steplo;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   267
	uint_t rm_stephi;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   268
	uint32_t rm_chiprev;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   269
	const char *rm_chiprevstr;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   270
	int rm_sktidx;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   271
} amd_revmap[] = {
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   272
	/*
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   273
	 * Rev B includes model 0x4 stepping 0 and model 0x5 stepping 0 and 1.
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   274
	 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   275
	{ 0xf, 0x04, 0x04, 0x0, 0x0, X86_CHIPREV_AMD_F_REV_B, "B", 0 },
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   276
	{ 0xf, 0x05, 0x05, 0x0, 0x1, X86_CHIPREV_AMD_F_REV_B, "B", 0 },
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   277
	/*
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   278
	 * Rev C0 includes model 0x4 stepping 8 and model 0x5 stepping 8
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   279
	 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   280
	{ 0xf, 0x04, 0x05, 0x8, 0x8, X86_CHIPREV_AMD_F_REV_C0, "C0", 0 },
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   281
	/*
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   282
	 * Rev CG is the rest of extended model 0x0 - i.e., everything
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   283
	 * but the rev B and C0 combinations covered above.
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   284
	 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   285
	{ 0xf, 0x00, 0x0f, 0x0, 0xf, X86_CHIPREV_AMD_F_REV_CG, "CG", 0 },
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   286
	/*
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   287
	 * Rev D has extended model 0x1.
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   288
	 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   289
	{ 0xf, 0x10, 0x1f, 0x0, 0xf, X86_CHIPREV_AMD_F_REV_D, "D", 0 },
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   290
	/*
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   291
	 * Rev E has extended model 0x2.
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   292
	 * Extended model 0x3 is unused but available to grow into.
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   293
	 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   294
	{ 0xf, 0x20, 0x3f, 0x0, 0xf, X86_CHIPREV_AMD_F_REV_E, "E", 0 },
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   295
	/*
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   296
	 * Rev F has extended models 0x4 and 0x5.
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   297
	 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   298
	{ 0xf, 0x40, 0x5f, 0x0, 0xf, X86_CHIPREV_AMD_F_REV_F, "F", 1 },
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   299
	/*
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   300
	 * Rev G has extended model 0x6.
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   301
	 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   302
	{ 0xf, 0x60, 0x6f, 0x0, 0xf, X86_CHIPREV_AMD_F_REV_G, "G", 1 },
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   303
};
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   304
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   305
/*
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   306
 * Info for monitor/mwait idle loop.
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   307
 *
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   308
 * See cpuid section of "Intel 64 and IA-32 Architectures Software Developer's
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   309
 * Manual Volume 2A: Instruction Set Reference, A-M" #25366-022US, November
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   310
 * 2006.
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   311
 * See MONITOR/MWAIT section of "AMD64 Architecture Programmer's Manual
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   312
 * Documentation Updates" #33633, Rev 2.05, December 2006.
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   313
 */
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   314
#define	MWAIT_SUPPORT		(0x00000001)	/* mwait supported */
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   315
#define	MWAIT_EXTENSIONS	(0x00000002)	/* extenstion supported */
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   316
#define	MWAIT_ECX_INT_ENABLE	(0x00000004)	/* ecx 1 extension supported */
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   317
#define	MWAIT_SUPPORTED(cpi)	((cpi)->cpi_std[1].cp_ecx & CPUID_INTC_ECX_MON)
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   318
#define	MWAIT_INT_ENABLE(cpi)	((cpi)->cpi_std[5].cp_ecx & 0x2)
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   319
#define	MWAIT_EXTENSION(cpi)	((cpi)->cpi_std[5].cp_ecx & 0x1)
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   320
#define	MWAIT_SIZE_MIN(cpi)	BITX((cpi)->cpi_std[5].cp_eax, 15, 0)
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   321
#define	MWAIT_SIZE_MAX(cpi)	BITX((cpi)->cpi_std[5].cp_ebx, 15, 0)
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   322
/*
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   323
 * Number of sub-cstates for a given c-state.
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   324
 */
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   325
#define	MWAIT_NUM_SUBC_STATES(cpi, c_state)			\
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   326
	BITX((cpi)->cpi_std[5].cp_edx, c_state + 3, c_state)
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   327
2869
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   328
static void
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   329
synth_amd_info(struct cpuid_info *cpi)
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   330
{
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   331
	const struct amd_rev_mapent *rmp;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   332
	uint_t family, model, step;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   333
	int i;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   334
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   335
	/*
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   336
	 * Currently only AMD family 0xf uses these fields.
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   337
	 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   338
	if (cpi->cpi_family != 0xf)
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   339
		return;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   340
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   341
	family = cpi->cpi_family;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   342
	model = cpi->cpi_model;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   343
	step = cpi->cpi_step;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   344
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   345
	for (i = 0, rmp = amd_revmap; i < sizeof (amd_revmap) / sizeof (*rmp);
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   346
	    i++, rmp++) {
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   347
		if (family == rmp->rm_family &&
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   348
		    model >= rmp->rm_modello && model <= rmp->rm_modelhi &&
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   349
		    step >= rmp->rm_steplo && step <= rmp->rm_stephi) {
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   350
			cpi->cpi_chiprev = rmp->rm_chiprev;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   351
			cpi->cpi_chiprevstr = rmp->rm_chiprevstr;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   352
			cpi->cpi_socket = amd_skts[rmp->rm_sktidx][model & 0x3];
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   353
			return;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   354
		}
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   355
	}
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   356
}
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   357
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   358
static void
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   359
synth_info(struct cpuid_info *cpi)
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   360
{
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   361
	cpi->cpi_chiprev = X86_CHIPREV_UNKNOWN;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   362
	cpi->cpi_chiprevstr = "Unknown";
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   363
	cpi->cpi_socket = X86_SOCKET_UNKNOWN;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   364
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   365
	switch (cpi->cpi_vendor) {
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   366
	case X86_VENDOR_AMD:
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   367
		synth_amd_info(cpi);
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   368
		break;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   369
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   370
	default:
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   371
		break;
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   372
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   373
	}
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   374
}
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   375
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
   376
/*
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   377
 * Apply up various platform-dependent restrictions where the
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   378
 * underlying platform restrictions mean the CPU can be marked
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   379
 * as less capable than its cpuid instruction would imply.
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   380
 */
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   381
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   382
#define	platform_cpuid_mangle(vendor, eax, cp)	/* nothing */
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   383
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   384
/*
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
 *  Some undocumented ways of patching the results of the cpuid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
 *  instruction to permit running Solaris 10 on future cpus that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
 *  we don't currently support.  Could be set to non-zero values
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
 *  via settings in eeprom.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
uint32_t cpuid_feature_ecx_include;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
uint32_t cpuid_feature_ecx_exclude;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
uint32_t cpuid_feature_edx_include;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
uint32_t cpuid_feature_edx_exclude;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   396
void
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   397
cpuid_alloc_space(cpu_t *cpu)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   398
{
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   399
	/*
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   400
	 * By convention, cpu0 is the boot cpu, which is set up
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   401
	 * before memory allocation is available.  All other cpus get
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   402
	 * their cpuid_info struct allocated here.
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   403
	 */
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   404
	ASSERT(cpu->cpu_id != 0);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   405
	cpu->cpu_m.mcpu_cpi =
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   406
	    kmem_zalloc(sizeof (*cpu->cpu_m.mcpu_cpi), KM_SLEEP);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   407
}
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   408
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   409
void
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   410
cpuid_free_space(cpu_t *cpu)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   411
{
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   412
	ASSERT(cpu->cpu_id != 0);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   413
	kmem_free(cpu->cpu_m.mcpu_cpi, sizeof (*cpu->cpu_m.mcpu_cpi));
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   414
}
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   415
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
uint_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
cpuid_pass1(cpu_t *cpu)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	uint32_t mask_ecx, mask_edx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
	uint_t feature = X86_CPUID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
	struct cpuid_info *cpi;
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   422
	struct cpuid_regs *cp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
	int xcpuid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   425
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
	/*
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   427
	 * Space statically allocated for cpu0, ensure pointer is set
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
	if (cpu->cpu_id == 0)
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   430
		cpu->cpu_m.mcpu_cpi = &cpuid_info0;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   431
	cpi = cpu->cpu_m.mcpu_cpi;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   432
	ASSERT(cpi != NULL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
	cp = &cpi->cpi_std[0];
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   434
	cp->cp_eax = 0;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   435
	cpi->cpi_maxeax = __cpuid_insn(cp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
		uint32_t *iptr = (uint32_t *)cpi->cpi_vendorstr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
		*iptr++ = cp->cp_ebx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
		*iptr++ = cp->cp_edx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
		*iptr++ = cp->cp_ecx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
		*(char *)&cpi->cpi_vendorstr[12] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
	 * Map the vendor string to a type code
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
	if (strcmp(cpi->cpi_vendorstr, "GenuineIntel") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
		cpi->cpi_vendor = X86_VENDOR_Intel;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
	else if (strcmp(cpi->cpi_vendorstr, "AuthenticAMD") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
		cpi->cpi_vendor = X86_VENDOR_AMD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
	else if (strcmp(cpi->cpi_vendorstr, "GenuineTMx86") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
		cpi->cpi_vendor = X86_VENDOR_TM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
	else if (strcmp(cpi->cpi_vendorstr, CyrixInstead) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
		 * CyrixInstead is a variable used by the Cyrix detection code
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
		 * in locore.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
		cpi->cpi_vendor = X86_VENDOR_Cyrix;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
	else if (strcmp(cpi->cpi_vendorstr, "UMC UMC UMC ") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
		cpi->cpi_vendor = X86_VENDOR_UMC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
	else if (strcmp(cpi->cpi_vendorstr, "NexGenDriven") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
		cpi->cpi_vendor = X86_VENDOR_NexGen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	else if (strcmp(cpi->cpi_vendorstr, "CentaurHauls") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
		cpi->cpi_vendor = X86_VENDOR_Centaur;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	else if (strcmp(cpi->cpi_vendorstr, "RiseRiseRise") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
		cpi->cpi_vendor = X86_VENDOR_Rise;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	else if (strcmp(cpi->cpi_vendorstr, "SiS SiS SiS ") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
		cpi->cpi_vendor = X86_VENDOR_SiS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
	else if (strcmp(cpi->cpi_vendorstr, "Geode by NSC") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
		cpi->cpi_vendor = X86_VENDOR_NSC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
		cpi->cpi_vendor = X86_VENDOR_IntelClone;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	x86_vendor = cpi->cpi_vendor; /* for compatibility */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
	 * Limit the range in case of weird hardware
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
	if (cpi->cpi_maxeax > CPI_MAXEAX_MAX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
		cpi->cpi_maxeax = CPI_MAXEAX_MAX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
	if (cpi->cpi_maxeax < 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
		goto pass1_done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
	cp = &cpi->cpi_std[1];
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   485
	cp->cp_eax = 1;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   486
	(void) __cpuid_insn(cp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
	 * Extract identifying constants for easy access.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
	cpi->cpi_model = CPI_MODEL(cpi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
	cpi->cpi_family = CPI_FAMILY(cpi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
1975
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   494
	if (cpi->cpi_family == 0xf)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
		cpi->cpi_family += CPI_FAMILY_XTD(cpi);
1975
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   496
2001
427a702b03e2 6427092 extended-model CPUID information is different between AMD and Intel
dmick
parents: 1975
diff changeset
   497
	/*
4265
6be078c4d3b4 6555108 workarounds being applied for errata not present in greyhound processors
kchow
parents: 3779
diff changeset
   498
	 * Beware: AMD uses "extended model" iff base *FAMILY* == 0xf.
2001
427a702b03e2 6427092 extended-model CPUID information is different between AMD and Intel
dmick
parents: 1975
diff changeset
   499
	 * Intel, and presumably everyone else, uses model == 0xf, as
427a702b03e2 6427092 extended-model CPUID information is different between AMD and Intel
dmick
parents: 1975
diff changeset
   500
	 * one would expect (max value means possible overflow).  Sigh.
427a702b03e2 6427092 extended-model CPUID information is different between AMD and Intel
dmick
parents: 1975
diff changeset
   501
	 */
427a702b03e2 6427092 extended-model CPUID information is different between AMD and Intel
dmick
parents: 1975
diff changeset
   502
427a702b03e2 6427092 extended-model CPUID information is different between AMD and Intel
dmick
parents: 1975
diff changeset
   503
	switch (cpi->cpi_vendor) {
427a702b03e2 6427092 extended-model CPUID information is different between AMD and Intel
dmick
parents: 1975
diff changeset
   504
	case X86_VENDOR_AMD:
4265
6be078c4d3b4 6555108 workarounds being applied for errata not present in greyhound processors
kchow
parents: 3779
diff changeset
   505
		if (CPI_FAMILY(cpi) == 0xf)
2001
427a702b03e2 6427092 extended-model CPUID information is different between AMD and Intel
dmick
parents: 1975
diff changeset
   506
			cpi->cpi_model += CPI_MODEL_XTD(cpi) << 4;
427a702b03e2 6427092 extended-model CPUID information is different between AMD and Intel
dmick
parents: 1975
diff changeset
   507
		break;
427a702b03e2 6427092 extended-model CPUID information is different between AMD and Intel
dmick
parents: 1975
diff changeset
   508
	default:
427a702b03e2 6427092 extended-model CPUID information is different between AMD and Intel
dmick
parents: 1975
diff changeset
   509
		if (cpi->cpi_model == 0xf)
427a702b03e2 6427092 extended-model CPUID information is different between AMD and Intel
dmick
parents: 1975
diff changeset
   510
			cpi->cpi_model += CPI_MODEL_XTD(cpi) << 4;
427a702b03e2 6427092 extended-model CPUID information is different between AMD and Intel
dmick
parents: 1975
diff changeset
   511
		break;
427a702b03e2 6427092 extended-model CPUID information is different between AMD and Intel
dmick
parents: 1975
diff changeset
   512
	}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
	cpi->cpi_step = CPI_STEP(cpi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
	cpi->cpi_brandid = CPI_BRANDID(cpi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
	 * *default* assumptions:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
	 * - believe %edx feature word
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
	 * - ignore %ecx feature word
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
	 * - 32-bit virtual and physical addressing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
	mask_edx = 0xffffffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
	mask_ecx = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
	cpi->cpi_pabits = cpi->cpi_vabits = 32;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
	switch (cpi->cpi_vendor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
	case X86_VENDOR_Intel:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
		if (cpi->cpi_family == 5)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
			x86_type = X86_TYPE_P5;
1975
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   532
		else if (IS_LEGACY_P6(cpi)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
			x86_type = X86_TYPE_P6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
			pentiumpro_bug4046376 = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
			pentiumpro_bug4064495 = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
			 * Clear the SEP bit when it was set erroneously
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
			if (cpi->cpi_model < 3 && cpi->cpi_step < 3)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
				cp->cp_edx &= ~CPUID_INTC_EDX_SEP;
1975
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   541
		} else if (IS_NEW_F6(cpi) || cpi->cpi_family == 0xf) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
			x86_type = X86_TYPE_P4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
			 * We don't currently depend on any of the %ecx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
			 * features until Prescott, so we'll only check
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
			 * this from P4 onwards.  We might want to revisit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
			 * that idea later.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
			mask_ecx = 0xffffffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
		} else if (cpi->cpi_family > 0xf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
			mask_ecx = 0xffffffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
	case X86_VENDOR_IntelClone:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	case X86_VENDOR_AMD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
#if defined(OPTERON_ERRATUM_108)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
		if (cpi->cpi_family == 0xf && cpi->cpi_model == 0xe) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
			cp->cp_eax = (0xf0f & cp->cp_eax) | 0xc0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
			cpi->cpi_model = 0xc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
		} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
		if (cpi->cpi_family == 5) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
			 * AMD K5 and K6
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
			 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
			 * These CPUs have an incomplete implementation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
			 * of MCA/MCE which we mask away.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
			 */
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   570
			mask_edx &= ~(CPUID_INTC_EDX_MCE | CPUID_INTC_EDX_MCA);
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   571
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   572
			/*
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   573
			 * Model 0 uses the wrong (APIC) bit
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   574
			 * to indicate PGE.  Fix it here.
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   575
			 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
			if (cpi->cpi_model == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
				if (cp->cp_edx & 0x200) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
					cp->cp_edx &= ~0x200;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
					cp->cp_edx |= CPUID_INTC_EDX_PGE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
				}
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   581
			}
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   582
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   583
			/*
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   584
			 * Early models had problems w/ MMX; disable.
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   585
			 */
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   586
			if (cpi->cpi_model < 6)
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   587
				mask_edx &= ~CPUID_INTC_EDX_MMX;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   588
		}
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   589
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   590
		/*
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   591
		 * For newer families, SSE3 and CX16, at least, are valid;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   592
		 * enable all
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   593
		 */
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   594
		if (cpi->cpi_family >= 0xf)
771
1c25a2120ec0 6327969 cpuid sse3 feature bit not noted on any AMD processor
dmick
parents: 359
diff changeset
   595
			mask_ecx = 0xffffffff;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
	case X86_VENDOR_TM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
		 * workaround the NT workaround in CMS 4.1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
		if (cpi->cpi_family == 5 && cpi->cpi_model == 4 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
		    (cpi->cpi_step == 2 || cpi->cpi_step == 3))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
			cp->cp_edx |= CPUID_INTC_EDX_CX8;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
	case X86_VENDOR_Centaur:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
		 * workaround the NT workarounds again
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
		if (cpi->cpi_family == 6)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
			cp->cp_edx |= CPUID_INTC_EDX_CX8;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
	case X86_VENDOR_Cyrix:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
		 * We rely heavily on the probing in locore
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
		 * to actually figure out what parts, if any,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
		 * of the Cyrix cpuid instruction to believe.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
		switch (x86_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
		case X86_TYPE_CYRIX_486:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
			mask_edx = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
		case X86_TYPE_CYRIX_6x86:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
			mask_edx = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
		case X86_TYPE_CYRIX_6x86L:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
			mask_edx =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
			    CPUID_INTC_EDX_DE |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
			    CPUID_INTC_EDX_CX8;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
		case X86_TYPE_CYRIX_6x86MX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
			mask_edx =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
			    CPUID_INTC_EDX_DE |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
			    CPUID_INTC_EDX_MSR |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
			    CPUID_INTC_EDX_CX8 |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
			    CPUID_INTC_EDX_PGE |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
			    CPUID_INTC_EDX_CMOV |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
			    CPUID_INTC_EDX_MMX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
		case X86_TYPE_CYRIX_GXm:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
			mask_edx =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
			    CPUID_INTC_EDX_MSR |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
			    CPUID_INTC_EDX_CX8 |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
			    CPUID_INTC_EDX_CMOV |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
			    CPUID_INTC_EDX_MMX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
		case X86_TYPE_CYRIX_MediaGX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
		case X86_TYPE_CYRIX_MII:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
		case X86_TYPE_VIA_CYRIX_III:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
			mask_edx =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
			    CPUID_INTC_EDX_DE |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
			    CPUID_INTC_EDX_TSC |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
			    CPUID_INTC_EDX_MSR |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
			    CPUID_INTC_EDX_CX8 |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
			    CPUID_INTC_EDX_PGE |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
			    CPUID_INTC_EDX_CMOV |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
			    CPUID_INTC_EDX_MMX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
	 * Now we've figured out the masks that determine
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
	 * which bits we choose to believe, apply the masks
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
	 * to the feature words, then map the kernel's view
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
	 * of these feature words into its feature word.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
	cp->cp_edx &= mask_edx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
	cp->cp_ecx &= mask_ecx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
	/*
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   675
	 * apply any platform restrictions (we don't call this
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   676
	 * immediately after __cpuid_insn here, because we need the
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   677
	 * workarounds applied above first)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
	 */
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   679
	platform_cpuid_mangle(cpi->cpi_vendor, 1, cp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   681
	/*
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   682
	 * fold in overrides from the "eeprom" mechanism
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   683
	 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
	cp->cp_edx |= cpuid_feature_edx_include;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
	cp->cp_edx &= ~cpuid_feature_edx_exclude;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
	cp->cp_ecx |= cpuid_feature_ecx_include;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
	cp->cp_ecx &= ~cpuid_feature_ecx_exclude;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
	if (cp->cp_edx & CPUID_INTC_EDX_PSE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
		feature |= X86_LARGEPAGE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
	if (cp->cp_edx & CPUID_INTC_EDX_TSC)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
		feature |= X86_TSC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
	if (cp->cp_edx & CPUID_INTC_EDX_MSR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
		feature |= X86_MSR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
	if (cp->cp_edx & CPUID_INTC_EDX_MTRR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
		feature |= X86_MTRR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
	if (cp->cp_edx & CPUID_INTC_EDX_PGE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
		feature |= X86_PGE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
	if (cp->cp_edx & CPUID_INTC_EDX_CMOV)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
		feature |= X86_CMOV;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
	if (cp->cp_edx & CPUID_INTC_EDX_MMX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
		feature |= X86_MMX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
	if ((cp->cp_edx & CPUID_INTC_EDX_MCE) != 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
	    (cp->cp_edx & CPUID_INTC_EDX_MCA) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
		feature |= X86_MCA;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
	if (cp->cp_edx & CPUID_INTC_EDX_PAE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
		feature |= X86_PAE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
	if (cp->cp_edx & CPUID_INTC_EDX_CX8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
		feature |= X86_CX8;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
	if (cp->cp_ecx & CPUID_INTC_ECX_CX16)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
		feature |= X86_CX16;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
	if (cp->cp_edx & CPUID_INTC_EDX_PAT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
		feature |= X86_PAT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
	if (cp->cp_edx & CPUID_INTC_EDX_SEP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
		feature |= X86_SEP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
	if (cp->cp_edx & CPUID_INTC_EDX_FXSR) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
		 * In our implementation, fxsave/fxrstor
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
		 * are prerequisites before we'll even
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
		 * try and do SSE things.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
		if (cp->cp_edx & CPUID_INTC_EDX_SSE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
			feature |= X86_SSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
		if (cp->cp_edx & CPUID_INTC_EDX_SSE2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
			feature |= X86_SSE2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
		if (cp->cp_ecx & CPUID_INTC_ECX_SSE3)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
			feature |= X86_SSE3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
	if (cp->cp_edx & CPUID_INTC_EDX_DE)
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   731
		feature |= X86_DE;
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   732
	if (cp->cp_ecx & CPUID_INTC_ECX_MON) {
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   733
		cpi->cpi_mwait.support |= MWAIT_SUPPORT;
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   734
		feature |= X86_MWAIT;
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
   735
	}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
	if (feature & X86_PAE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
		cpi->cpi_pabits = 36;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
	 * Hyperthreading configuration is slightly tricky on Intel
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
	 * and pure clones, and even trickier on AMD.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
	 * (AMD chose to set the HTT bit on their CMP processors,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
	 * even though they're not actually hyperthreaded.  Thus it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
	 * takes a bit more work to figure out what's really going
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   747
	 * on ... see the handling of the CMP_LGCY bit below)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
	if (cp->cp_edx & CPUID_INTC_EDX_HTT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
		cpi->cpi_ncpu_per_chip = CPI_CPU_COUNT(cpi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
		if (cpi->cpi_ncpu_per_chip > 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
			feature |= X86_HTT;
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   753
	} else {
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   754
		cpi->cpi_ncpu_per_chip = 1;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
	 * Work on the "extended" feature information, doing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
	 * some basic initialization for cpuid_pass2()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
	xcpuid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
	switch (cpi->cpi_vendor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
	case X86_VENDOR_Intel:
1975
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
   764
		if (IS_NEW_F6(cpi) || cpi->cpi_family >= 0xf)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
			xcpuid++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
	case X86_VENDOR_AMD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
		if (cpi->cpi_family > 5 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
		    (cpi->cpi_family == 5 && cpi->cpi_model >= 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
			xcpuid++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
	case X86_VENDOR_Cyrix:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
		 * Only these Cyrix CPUs are -known- to support
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
		 * extended cpuid operations.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
		if (x86_type == X86_TYPE_VIA_CYRIX_III ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
		    x86_type == X86_TYPE_CYRIX_GXm)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
			xcpuid++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
	case X86_VENDOR_Centaur:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
	case X86_VENDOR_TM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
		xcpuid++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
	if (xcpuid) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
		cp = &cpi->cpi_extd[0];
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   790
		cp->cp_eax = 0x80000000;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   791
		cpi->cpi_xmaxeax = __cpuid_insn(cp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
	if (cpi->cpi_xmaxeax & 0x80000000) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
		if (cpi->cpi_xmaxeax > CPI_XMAXEAX_MAX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
			cpi->cpi_xmaxeax = CPI_XMAXEAX_MAX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
		switch (cpi->cpi_vendor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
		case X86_VENDOR_Intel:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
		case X86_VENDOR_AMD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
			if (cpi->cpi_xmaxeax < 0x80000001)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
			cp = &cpi->cpi_extd[1];
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   805
			cp->cp_eax = 0x80000001;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   806
			(void) __cpuid_insn(cp);
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   807
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
			if (cpi->cpi_vendor == X86_VENDOR_AMD &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
			    cpi->cpi_family == 5 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
			    cpi->cpi_model == 6 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
			    cpi->cpi_step == 6) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
				 * K6 model 6 uses bit 10 to indicate SYSC
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
				 * Later models use bit 11. Fix it here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
				if (cp->cp_edx & 0x400) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
					cp->cp_edx &= ~0x400;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
					cp->cp_edx |= CPUID_AMD_EDX_SYSC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   822
			platform_cpuid_mangle(cpi->cpi_vendor, 0x80000001, cp);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   823
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
			 * Compute the additions to the kernel's feature word.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
			if (cp->cp_edx & CPUID_AMD_EDX_NX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
				feature |= X86_NX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
			/*
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   831
			 * If both the HTT and CMP_LGCY bits are set,
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   832
			 * then we're not actually HyperThreaded.  Read
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   833
			 * "AMD CPUID Specification" for more details.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
			if (cpi->cpi_vendor == X86_VENDOR_AMD &&
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   836
			    (feature & X86_HTT) &&
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   837
			    (cp->cp_ecx & CPUID_AMD_ECX_CMP_LGCY)) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
				feature &= ~X86_HTT;
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   839
				feature |= X86_CMP;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   840
			}
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   841
#if defined(__amd64)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
			 * It's really tricky to support syscall/sysret in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
			 * the i386 kernel; we rely on sysenter/sysexit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
			 * instead.  In the amd64 kernel, things are -way-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
			 * better.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
			if (cp->cp_edx & CPUID_AMD_EDX_SYSC)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
				feature |= X86_ASYSC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
			 * While we're thinking about system calls, note
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
			 * that AMD processors don't support sysenter
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
			 * in long mode at all, so don't try to program them.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
			if (x86_vendor == X86_VENDOR_AMD)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
				feature &= ~X86_SEP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
#endif
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   859
			if (cp->cp_edx & CPUID_AMD_EDX_TSCP)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   860
				feature |= X86_TSCP;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   866
		/*
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   867
		 * Get CPUID data about processor cores and hyperthreads.
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   868
		 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
		switch (cpi->cpi_vendor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
		case X86_VENDOR_Intel:
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   871
			if (cpi->cpi_maxeax >= 4) {
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   872
				cp = &cpi->cpi_std[4];
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   873
				cp->cp_eax = 4;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   874
				cp->cp_ecx = 0;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   875
				(void) __cpuid_insn(cp);
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   876
				platform_cpuid_mangle(cpi->cpi_vendor, 4, cp);
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   877
			}
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   878
			/*FALLTHROUGH*/
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
		case X86_VENDOR_AMD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
			if (cpi->cpi_xmaxeax < 0x80000008)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
			cp = &cpi->cpi_extd[8];
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   883
			cp->cp_eax = 0x80000008;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   884
			(void) __cpuid_insn(cp);
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   885
			platform_cpuid_mangle(cpi->cpi_vendor, 0x80000008, cp);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   886
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
			 * Virtual and physical address limits from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
			 * cpuid override previously guessed values.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
			cpi->cpi_pabits = BITX(cp->cp_eax, 7, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
			cpi->cpi_vabits = BITX(cp->cp_eax, 15, 8);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
		}
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   897
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   898
		switch (cpi->cpi_vendor) {
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   899
		case X86_VENDOR_Intel:
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   900
			if (cpi->cpi_maxeax < 4) {
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   901
				cpi->cpi_ncore_per_chip = 1;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   902
				break;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   903
			} else {
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   904
				cpi->cpi_ncore_per_chip =
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   905
				    BITX((cpi)->cpi_std[4].cp_eax, 31, 26) + 1;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   906
			}
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   907
			break;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   908
		case X86_VENDOR_AMD:
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   909
			if (cpi->cpi_xmaxeax < 0x80000008) {
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   910
				cpi->cpi_ncore_per_chip = 1;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   911
				break;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   912
			} else {
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   913
				cpi->cpi_ncore_per_chip =
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   914
				    BITX((cpi)->cpi_extd[8].cp_ecx, 7, 0) + 1;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   915
			}
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   916
			break;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   917
		default:
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   918
			cpi->cpi_ncore_per_chip = 1;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   919
			break;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   920
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   923
	/*
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   924
	 * If more than one core, then this processor is CMP.
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   925
	 */
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   926
	if (cpi->cpi_ncore_per_chip > 1)
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   927
		feature |= X86_CMP;
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
   928
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   929
	/*
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   930
	 * If the number of cores is the same as the number
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   931
	 * of CPUs, then we cannot have HyperThreading.
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   932
	 */
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   933
	if (cpi->cpi_ncpu_per_chip == cpi->cpi_ncore_per_chip)
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   934
		feature &= ~X86_HTT;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   935
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
	if ((feature & (X86_HTT | X86_CMP)) == 0) {
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   937
		/*
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   938
		 * Single-core single-threaded processors.
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   939
		 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
		cpi->cpi_chipid = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
		cpi->cpi_clogid = 0;
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   942
		cpi->cpi_coreid = cpu->cpu_id;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
	} else if (cpi->cpi_ncpu_per_chip > 1) {
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   944
		uint_t i;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   945
		uint_t chipid_shift = 0;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   946
		uint_t coreid_shift = 0;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   947
		uint_t apic_id = CPI_APIC_ID(cpi);
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   948
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   949
		for (i = 1; i < cpi->cpi_ncpu_per_chip; i <<= 1)
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   950
			chipid_shift++;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   951
		cpi->cpi_chipid = apic_id >> chipid_shift;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   952
		cpi->cpi_clogid = apic_id & ((1 << chipid_shift) - 1);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   954
		if (cpi->cpi_vendor == X86_VENDOR_Intel) {
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   955
			if (feature & X86_CMP) {
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   956
				/*
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   957
				 * Multi-core (and possibly multi-threaded)
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   958
				 * processors.
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   959
				 */
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   960
				uint_t ncpu_per_core;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   961
				if (cpi->cpi_ncore_per_chip == 1)
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   962
					ncpu_per_core = cpi->cpi_ncpu_per_chip;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   963
				else if (cpi->cpi_ncore_per_chip > 1)
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   964
					ncpu_per_core = cpi->cpi_ncpu_per_chip /
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   965
					    cpi->cpi_ncore_per_chip;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   966
				/*
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   967
				 * 8bit APIC IDs on dual core Pentiums
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   968
				 * look like this:
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   969
				 *
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   970
				 * +-----------------------+------+------+
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   971
				 * | Physical Package ID   |  MC  |  HT  |
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   972
				 * +-----------------------+------+------+
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   973
				 * <------- chipid -------->
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   974
				 * <------- coreid --------------->
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   975
				 *			   <--- clogid -->
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   976
				 *
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   977
				 * Where the number of bits necessary to
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   978
				 * represent MC and HT fields together equals
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   979
				 * to the minimum number of bits necessary to
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   980
				 * store the value of cpi->cpi_ncpu_per_chip.
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   981
				 * Of those bits, the MC part uses the number
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   982
				 * of bits necessary to store the value of
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   983
				 * cpi->cpi_ncore_per_chip.
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   984
				 */
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   985
				for (i = 1; i < ncpu_per_core; i <<= 1)
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   986
					coreid_shift++;
1727
592b097f02d0 6406224 CPU core detection is broken on multi-core Pentium D
andrei
parents: 1582
diff changeset
   987
				cpi->cpi_coreid = apic_id >> coreid_shift;
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   988
			} else if (feature & X86_HTT) {
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   989
				/*
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   990
				 * Single-core multi-threaded processors.
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   991
				 */
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   992
				cpi->cpi_coreid = cpi->cpi_chipid;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   993
			}
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   994
		} else if (cpi->cpi_vendor == X86_VENDOR_AMD) {
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   995
			/*
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   996
			 * AMD currently only has dual-core processors with
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   997
			 * single-threaded cores.  If they ever release
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   998
			 * multi-threaded processors, then this code
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
   999
			 * will have to be updated.
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1000
			 */
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1001
			cpi->cpi_coreid = cpu->cpu_id;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1002
		} else {
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1003
			/*
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1004
			 * All other processors are currently
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1005
			 * assumed to have single cores.
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1006
			 */
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1007
			cpi->cpi_coreid = cpi->cpi_chipid;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1008
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1009
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1010
2869
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  1011
	/*
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  1012
	 * Synthesize chip "revision" and socket type
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  1013
	 */
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  1014
	synth_info(cpi);
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  1015
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
pass1_done:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
	cpi->cpi_pass = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
	return (feature);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
 * Make copies of the cpuid table entries we depend on, in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
 * part for ease of parsing now, in part so that we have only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
 * one place to correct any of it, in part for ease of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
 * later export to userland, and in part so we can look at
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
 * this stuff in a crash dump.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
cpuid_pass2(cpu_t *cpu)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
	uint_t n, nmax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
	int i;
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1035
	struct cpuid_regs *cp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
	uint8_t *dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
	uint32_t *iptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
	struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
	ASSERT(cpi->cpi_pass == 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
	if (cpi->cpi_maxeax < 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
		goto pass2_done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
	if ((nmax = cpi->cpi_maxeax + 1) > NMAX_CPI_STD)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
		nmax = NMAX_CPI_STD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
	 * (We already handled n == 0 and n == 1 in pass 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
	for (n = 2, cp = &cpi->cpi_std[2]; n < nmax; n++, cp++) {
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1051
		cp->cp_eax = n;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1052
		(void) __cpuid_insn(cp);
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1053
		platform_cpuid_mangle(cpi->cpi_vendor, n, cp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
		switch (n) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
		case 2:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
			 * "the lower 8 bits of the %eax register
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
			 * contain a value that identifies the number
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
			 * of times the cpuid [instruction] has to be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
			 * executed to obtain a complete image of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
			 * processor's caching systems."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
			 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
			 * How *do* they make this stuff up?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
			cpi->cpi_ncache = sizeof (*cp) *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
			    BITX(cp->cp_eax, 7, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
			if (cpi->cpi_ncache == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
			cpi->cpi_ncache--;	/* skip count byte */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
			 * Well, for now, rather than attempt to implement
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
			 * this slightly dubious algorithm, we just look
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
			 * at the first 15 ..
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
			if (cpi->cpi_ncache > (sizeof (*cp) - 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
				cpi->cpi_ncache = sizeof (*cp) - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
			dp = cpi->cpi_cacheinfo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
			if (BITX(cp->cp_eax, 31, 31) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
				uint8_t *p = (void *)&cp->cp_eax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
				for (i = 1; i < 3; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
					if (p[i] != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
						*dp++ = p[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
			if (BITX(cp->cp_ebx, 31, 31) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
				uint8_t *p = (void *)&cp->cp_ebx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
				for (i = 0; i < 4; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
					if (p[i] != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
						*dp++ = p[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
			if (BITX(cp->cp_ecx, 31, 31) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
				uint8_t *p = (void *)&cp->cp_ecx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
				for (i = 0; i < 4; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
					if (p[i] != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
						*dp++ = p[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
			if (BITX(cp->cp_edx, 31, 31) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
				uint8_t *p = (void *)&cp->cp_edx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
				for (i = 0; i < 4; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
					if (p[i] != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
						*dp++ = p[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
			break;
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1105
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
		case 3:	/* Processor serial number, if PSN supported */
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1107
			break;
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1108
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
		case 4:	/* Deterministic cache parameters */
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1110
			break;
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1111
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
		case 5:	/* Monitor/Mwait parameters */
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1113
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1114
			/*
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1115
			 * check cpi_mwait.support which was set in cpuid_pass1
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1116
			 */
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1117
			if (!(cpi->cpi_mwait.support & MWAIT_SUPPORT))
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1118
				break;
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1119
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1120
			cpi->cpi_mwait.mon_min = (size_t)MWAIT_SIZE_MIN(cpi);
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1121
			cpi->cpi_mwait.mon_max = (size_t)MWAIT_SIZE_MAX(cpi);
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1122
			if (MWAIT_EXTENSION(cpi)) {
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1123
				cpi->cpi_mwait.support |= MWAIT_EXTENSIONS;
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1124
				if (MWAIT_INT_ENABLE(cpi))
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1125
					cpi->cpi_mwait.support |=
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1126
					    MWAIT_ECX_INT_ENABLE;
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1127
			}
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1128
			break;
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  1129
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
	if ((cpi->cpi_xmaxeax & 0x80000000) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
		goto pass2_done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
	if ((nmax = cpi->cpi_xmaxeax - 0x80000000 + 1) > NMAX_CPI_EXTD)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
		nmax = NMAX_CPI_EXTD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
	 * Copy the extended properties, fixing them as we go.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
	 * (We already handled n == 0 and n == 1 in pass 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
	iptr = (void *)cpi->cpi_brandstr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
	for (n = 2, cp = &cpi->cpi_extd[2]; n < nmax; cp++, n++) {
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1146
		cp->cp_eax = 0x80000000 + n;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1147
		(void) __cpuid_insn(cp);
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1148
		platform_cpuid_mangle(cpi->cpi_vendor, 0x80000000 + n, cp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
		switch (n) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
		case 2:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
		case 3:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
		case 4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
			 * Extract the brand string
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
			*iptr++ = cp->cp_eax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
			*iptr++ = cp->cp_ebx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
			*iptr++ = cp->cp_ecx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
			*iptr++ = cp->cp_edx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
		case 5:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
			switch (cpi->cpi_vendor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
			case X86_VENDOR_AMD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
				 * The Athlon and Duron were the first
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
				 * parts to report the sizes of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
				 * TLB for large pages. Before then,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
				 * we don't trust the data.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
				if (cpi->cpi_family < 6 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
				    (cpi->cpi_family == 6 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
				    cpi->cpi_model < 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
					cp->cp_eax = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
			default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
		case 6:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
			switch (cpi->cpi_vendor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
			case X86_VENDOR_AMD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
				 * The Athlon and Duron were the first
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
				 * AMD parts with L2 TLB's.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
				 * Before then, don't trust the data.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
				if (cpi->cpi_family < 6 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
				    cpi->cpi_family == 6 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
				    cpi->cpi_model < 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
					cp->cp_eax = cp->cp_ebx = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
				 * AMD Duron rev A0 reports L2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
				 * cache size incorrectly as 1K
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
				 * when it is really 64K
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1196
				if (cpi->cpi_family == 6 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1197
				    cpi->cpi_model == 3 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1198
				    cpi->cpi_step == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1199
					cp->cp_ecx &= 0xffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
					cp->cp_ecx |= 0x400000;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
			case X86_VENDOR_Cyrix:	/* VIA C3 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
				 * VIA C3 processors are a bit messed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
				 * up w.r.t. encoding cache sizes in %ecx
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1207
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
				if (cpi->cpi_family != 6)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
				 * model 7 and 8 were incorrectly encoded
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
				 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
				 * xxx is model 8 really broken?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
				if (cpi->cpi_model == 7 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
				    cpi->cpi_model == 8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
					cp->cp_ecx =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
					    BITX(cp->cp_ecx, 31, 24) << 16 |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
					    BITX(cp->cp_ecx, 23, 16) << 12 |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1220
					    BITX(cp->cp_ecx, 15, 8) << 8 |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
					    BITX(cp->cp_ecx, 7, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
				 * model 9 stepping 1 has wrong associativity
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
				if (cpi->cpi_model == 9 && cpi->cpi_step == 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
					cp->cp_ecx |= 8 << 12;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
			case X86_VENDOR_Intel:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
				 * Extended L2 Cache features function.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
				 * First appeared on Prescott.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
			default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1234
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1235
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1241
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1242
pass2_done:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
	cpi->cpi_pass = 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1244
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1245
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1246
static const char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1247
intel_cpubrand(const struct cpuid_info *cpi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1248
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
	if ((x86_feature & X86_CPUID) == 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
	    cpi->cpi_maxeax < 1 || cpi->cpi_family < 5)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
		return ("i486");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
	switch (cpi->cpi_family) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
	case 5:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
		return ("Intel Pentium(r)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
	case 6:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
		switch (cpi->cpi_model) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1260
			uint_t celeron, xeon;
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1261
			const struct cpuid_regs *cp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1262
		case 0:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1263
		case 1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
		case 2:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1265
			return ("Intel Pentium(r) Pro");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1266
		case 3:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1267
		case 4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1268
			return ("Intel Pentium(r) II");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1269
		case 6:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
			return ("Intel Celeron(r)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
		case 5:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
		case 7:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
			celeron = xeon = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
			cp = &cpi->cpi_std[2];	/* cache info */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
			for (i = 1; i < 3; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
				uint_t tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
				tmp = (cp->cp_eax >> (8 * i)) & 0xff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
				if (tmp == 0x40)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
					celeron++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
				if (tmp >= 0x44 && tmp <= 0x45)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
					xeon++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
			for (i = 0; i < 2; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
				uint_t tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
				tmp = (cp->cp_ebx >> (8 * i)) & 0xff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
				if (tmp == 0x40)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
					celeron++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
				else if (tmp >= 0x44 && tmp <= 0x45)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
					xeon++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
			for (i = 0; i < 4; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
				uint_t tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
				tmp = (cp->cp_ecx >> (8 * i)) & 0xff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1300
				if (tmp == 0x40)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
					celeron++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
				else if (tmp >= 0x44 && tmp <= 0x45)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
					xeon++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
			for (i = 0; i < 4; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
				uint_t tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
				tmp = (cp->cp_edx >> (8 * i)) & 0xff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
				if (tmp == 0x40)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
					celeron++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
				else if (tmp >= 0x44 && tmp <= 0x45)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
					xeon++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
			if (celeron)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
				return ("Intel Celeron(r)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
			if (xeon)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
				return (cpi->cpi_model == 5 ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
				    "Intel Pentium(r) II Xeon(tm)" :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
				    "Intel Pentium(r) III Xeon(tm)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
			return (cpi->cpi_model == 5 ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
			    "Intel Pentium(r) II or Pentium(r) II Xeon(tm)" :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1324
			    "Intel Pentium(r) III or Pentium(r) III Xeon(tm)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1325
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1326
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1327
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
1975
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  1332
	/* BrandID is present if the field is nonzero */
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  1333
	if (cpi->cpi_brandid != 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
		static const struct {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
			uint_t bt_bid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
			const char *bt_str;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1337
		} brand_tbl[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1338
			{ 0x1,	"Intel(r) Celeron(r)" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1339
			{ 0x2,	"Intel(r) Pentium(r) III" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1340
			{ 0x3,	"Intel(r) Pentium(r) III Xeon(tm)" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1341
			{ 0x4,	"Intel(r) Pentium(r) III" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
			{ 0x6,	"Mobile Intel(r) Pentium(r) III" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1343
			{ 0x7,	"Mobile Intel(r) Celeron(r)" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1344
			{ 0x8,	"Intel(r) Pentium(r) 4" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
			{ 0x9,	"Intel(r) Pentium(r) 4" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346
			{ 0xa,	"Intel(r) Celeron(r)" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
			{ 0xb,	"Intel(r) Xeon(tm)" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
			{ 0xc,	"Intel(r) Xeon(tm) MP" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
			{ 0xe,	"Mobile Intel(r) Pentium(r) 4" },
1975
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  1350
			{ 0xf,	"Mobile Intel(r) Celeron(r)" },
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  1351
			{ 0x11, "Mobile Genuine Intel(r)" },
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  1352
			{ 0x12, "Intel(r) Celeron(r) M" },
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  1353
			{ 0x13, "Mobile Intel(r) Celeron(r)" },
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  1354
			{ 0x14, "Intel(r) Celeron(r)" },
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  1355
			{ 0x15, "Mobile Genuine Intel(r)" },
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  1356
			{ 0x16,	"Intel(r) Pentium(r) M" },
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  1357
			{ 0x17, "Mobile Intel(r) Celeron(r)" }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
		};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
		uint_t btblmax = sizeof (brand_tbl) / sizeof (brand_tbl[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
		uint_t sgn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
		sgn = (cpi->cpi_family << 8) |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1363
		    (cpi->cpi_model << 4) | cpi->cpi_step;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1364
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
		for (i = 0; i < btblmax; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1366
			if (brand_tbl[i].bt_bid == cpi->cpi_brandid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1368
		if (i < btblmax) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1369
			if (sgn == 0x6b1 && cpi->cpi_brandid == 3)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
				return ("Intel(r) Celeron(r)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
			if (sgn < 0xf13 && cpi->cpi_brandid == 0xb)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
				return ("Intel(r) Xeon(tm) MP");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
			if (sgn < 0xf13 && cpi->cpi_brandid == 0xe)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1374
				return ("Intel(r) Xeon(tm)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1375
			return (brand_tbl[i].bt_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1376
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1377
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1378
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1379
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
static const char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
amd_cpubrand(const struct cpuid_info *cpi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1385
	if ((x86_feature & X86_CPUID) == 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1386
	    cpi->cpi_maxeax < 1 || cpi->cpi_family < 5)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1387
		return ("i486 compatible");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1388
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1389
	switch (cpi->cpi_family) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1390
	case 5:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1391
		switch (cpi->cpi_model) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1392
		case 0:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
		case 1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
		case 2:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1395
		case 3:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1396
		case 4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1397
		case 5:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1398
			return ("AMD-K5(r)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
		case 6:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
		case 7:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
			return ("AMD-K6(r)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
		case 8:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1403
			return ("AMD-K6(r)-2");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
		case 9:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1405
			return ("AMD-K6(r)-III");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
			return ("AMD (family 5)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1408
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1409
	case 6:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1410
		switch (cpi->cpi_model) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1411
		case 1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1412
			return ("AMD-K7(tm)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1413
		case 0:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1414
		case 2:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1415
		case 4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1416
			return ("AMD Athlon(tm)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1417
		case 3:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1418
		case 7:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1419
			return ("AMD Duron(tm)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1420
		case 6:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1421
		case 8:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1422
		case 10:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1423
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1424
			 * Use the L2 cache size to distinguish
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1425
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1426
			return ((cpi->cpi_extd[6].cp_ecx >> 16) >= 256 ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1427
			    "AMD Athlon(tm)" : "AMD Duron(tm)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1428
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1429
			return ("AMD (family 6)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1430
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1431
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1432
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1433
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1434
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1435
	if (cpi->cpi_family == 0xf && cpi->cpi_model == 5 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1436
	    cpi->cpi_brandid != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1437
		switch (BITX(cpi->cpi_brandid, 7, 5)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1438
		case 3:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1439
			return ("AMD Opteron(tm) UP 1xx");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1440
		case 4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1441
			return ("AMD Opteron(tm) DP 2xx");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1442
		case 5:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1443
			return ("AMD Opteron(tm) MP 8xx");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1444
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1445
			return ("AMD Opteron(tm)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1446
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1447
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1448
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1449
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1450
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1451
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1452
static const char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1453
cyrix_cpubrand(struct cpuid_info *cpi, uint_t type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1454
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1455
	if ((x86_feature & X86_CPUID) == 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1456
	    cpi->cpi_maxeax < 1 || cpi->cpi_family < 5 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1457
	    type == X86_TYPE_CYRIX_486)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1458
		return ("i486 compatible");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1459
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1460
	switch (type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1461
	case X86_TYPE_CYRIX_6x86:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1462
		return ("Cyrix 6x86");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1463
	case X86_TYPE_CYRIX_6x86L:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1464
		return ("Cyrix 6x86L");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1465
	case X86_TYPE_CYRIX_6x86MX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1466
		return ("Cyrix 6x86MX");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1467
	case X86_TYPE_CYRIX_GXm:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1468
		return ("Cyrix GXm");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1469
	case X86_TYPE_CYRIX_MediaGX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1470
		return ("Cyrix MediaGX");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1471
	case X86_TYPE_CYRIX_MII:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1472
		return ("Cyrix M2");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1473
	case X86_TYPE_VIA_CYRIX_III:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1474
		return ("VIA Cyrix M3");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1475
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1476
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1477
		 * Have another wild guess ..
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1478
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1479
		if (cpi->cpi_family == 4 && cpi->cpi_model == 9)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1480
			return ("Cyrix 5x86");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1481
		else if (cpi->cpi_family == 5) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1482
			switch (cpi->cpi_model) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1483
			case 2:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1484
				return ("Cyrix 6x86");	/* Cyrix M1 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1485
			case 4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1486
				return ("Cyrix MediaGX");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1487
			default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1488
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1489
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1490
		} else if (cpi->cpi_family == 6) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1491
			switch (cpi->cpi_model) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1492
			case 0:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1493
				return ("Cyrix 6x86MX"); /* Cyrix M2? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1494
			case 5:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1495
			case 6:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1496
			case 7:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1497
			case 8:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1498
			case 9:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1499
				return ("VIA C3");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1500
			default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1501
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1502
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1503
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1504
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1505
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1506
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1507
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1509
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1510
 * This only gets called in the case that the CPU extended
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1511
 * feature brand string (0x80000002, 0x80000003, 0x80000004)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1512
 * aren't available, or contain null bytes for some reason.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1513
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1514
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1515
fabricate_brandstr(struct cpuid_info *cpi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1516
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1517
	const char *brand = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1518
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1519
	switch (cpi->cpi_vendor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1520
	case X86_VENDOR_Intel:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1521
		brand = intel_cpubrand(cpi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1522
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1523
	case X86_VENDOR_AMD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1524
		brand = amd_cpubrand(cpi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1525
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1526
	case X86_VENDOR_Cyrix:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1527
		brand = cyrix_cpubrand(cpi, x86_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1528
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1529
	case X86_VENDOR_NexGen:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1530
		if (cpi->cpi_family == 5 && cpi->cpi_model == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1531
			brand = "NexGen Nx586";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1532
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1533
	case X86_VENDOR_Centaur:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1534
		if (cpi->cpi_family == 5)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1535
			switch (cpi->cpi_model) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1536
			case 4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1537
				brand = "Centaur C6";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1538
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1539
			case 8:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1540
				brand = "Centaur C2";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1541
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1542
			case 9:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1543
				brand = "Centaur C3";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1544
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1545
			default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1546
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1547
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1548
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1549
	case X86_VENDOR_Rise:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1550
		if (cpi->cpi_family == 5 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1551
		    (cpi->cpi_model == 0 || cpi->cpi_model == 2))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1552
			brand = "Rise mP6";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1553
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1554
	case X86_VENDOR_SiS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1555
		if (cpi->cpi_family == 5 && cpi->cpi_model == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1556
			brand = "SiS 55x";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1557
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1558
	case X86_VENDOR_TM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1559
		if (cpi->cpi_family == 5 && cpi->cpi_model == 4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1560
			brand = "Transmeta Crusoe TM3x00 or TM5x00";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1561
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1562
	case X86_VENDOR_NSC:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1563
	case X86_VENDOR_UMC:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1564
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1565
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1566
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1567
	if (brand) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1568
		(void) strcpy((char *)cpi->cpi_brandstr, brand);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1569
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1570
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1571
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1572
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1573
	 * If all else fails ...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1574
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1575
	(void) snprintf(cpi->cpi_brandstr, sizeof (cpi->cpi_brandstr),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1576
	    "%s %d.%d.%d", cpi->cpi_vendorstr, cpi->cpi_family,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1577
	    cpi->cpi_model, cpi->cpi_step);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1578
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1579
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1580
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1581
 * This routine is called just after kernel memory allocation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1582
 * becomes available on cpu0, and as part of mp_startup() on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1583
 * the other cpus.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1584
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1585
 * Fixup the brand string.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1586
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1587
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1588
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1589
cpuid_pass3(cpu_t *cpu)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1590
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1591
	struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1592
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1593
	ASSERT(cpi->cpi_pass == 2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1594
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1595
	if ((cpi->cpi_xmaxeax & 0x80000000) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1596
		fabricate_brandstr(cpi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1597
		goto pass3_done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1598
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1599
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1600
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1601
	 * If we successfully extracted a brand string from the cpuid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1602
	 * instruction, clean it up by removing leading spaces and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1603
	 * similar junk.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1604
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1605
	if (cpi->cpi_brandstr[0]) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1606
		size_t maxlen = sizeof (cpi->cpi_brandstr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1607
		char *src, *dst;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1608
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1609
		dst = src = (char *)cpi->cpi_brandstr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1610
		src[maxlen - 1] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1611
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1612
		 * strip leading spaces
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1613
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1614
		while (*src == ' ')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1615
			src++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1616
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1617
		 * Remove any 'Genuine' or "Authentic" prefixes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1618
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1619
		if (strncmp(src, "Genuine ", 8) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1620
			src += 8;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1621
		if (strncmp(src, "Authentic ", 10) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1622
			src += 10;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1623
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1624
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1625
		 * Now do an in-place copy.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1626
		 * Map (R) to (r) and (TM) to (tm).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1627
		 * The era of teletypes is long gone, and there's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1628
		 * -really- no need to shout.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1629
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1630
		while (*src != '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1631
			if (src[0] == '(') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1632
				if (strncmp(src + 1, "R)", 2) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1633
					(void) strncpy(dst, "(r)", 3);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1634
					src += 3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1635
					dst += 3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1636
					continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1637
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1638
				if (strncmp(src + 1, "TM)", 3) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1639
					(void) strncpy(dst, "(tm)", 4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1640
					src += 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1641
					dst += 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1642
					continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1643
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1644
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1645
			*dst++ = *src++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1646
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1647
		*dst = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1648
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1649
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1650
		 * Finally, remove any trailing spaces
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1651
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1652
		while (--dst > cpi->cpi_brandstr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1653
			if (*dst == ' ')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1654
				*dst = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1655
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1656
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1657
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1658
		fabricate_brandstr(cpi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1659
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1660
pass3_done:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1661
	cpi->cpi_pass = 3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1662
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1663
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1664
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1665
 * This routine is called out of bind_hwcap() much later in the life
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1666
 * of the kernel (post_startup()).  The job of this routine is to resolve
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1667
 * the hardware feature support and kernel support for those features into
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1668
 * what we're actually going to tell applications via the aux vector.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1669
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1670
uint_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1671
cpuid_pass4(cpu_t *cpu)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1672
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1673
	struct cpuid_info *cpi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1674
	uint_t hwcap_flags = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1675
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1676
	if (cpu == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1677
		cpu = CPU;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1678
	cpi = cpu->cpu_m.mcpu_cpi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1679
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1680
	ASSERT(cpi->cpi_pass == 3);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1681
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1682
	if (cpi->cpi_maxeax >= 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1683
		uint32_t *edx = &cpi->cpi_support[STD_EDX_FEATURES];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1684
		uint32_t *ecx = &cpi->cpi_support[STD_ECX_FEATURES];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1685
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1686
		*edx = CPI_FEATURES_EDX(cpi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1687
		*ecx = CPI_FEATURES_ECX(cpi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1688
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1689
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1690
		 * [these require explicit kernel support]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1691
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1692
		if ((x86_feature & X86_SEP) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1693
			*edx &= ~CPUID_INTC_EDX_SEP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1694
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1695
		if ((x86_feature & X86_SSE) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1696
			*edx &= ~(CPUID_INTC_EDX_FXSR|CPUID_INTC_EDX_SSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1697
		if ((x86_feature & X86_SSE2) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1698
			*edx &= ~CPUID_INTC_EDX_SSE2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1699
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1700
		if ((x86_feature & X86_HTT) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1701
			*edx &= ~CPUID_INTC_EDX_HTT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1702
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1703
		if ((x86_feature & X86_SSE3) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1704
			*ecx &= ~CPUID_INTC_ECX_SSE3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1705
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1706
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1707
		 * [no explicit support required beyond x87 fp context]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1708
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1709
		if (!fpu_exists)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1710
			*edx &= ~(CPUID_INTC_EDX_FPU | CPUID_INTC_EDX_MMX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1711
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1712
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1713
		 * Now map the supported feature vector to things that we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1714
		 * think userland will care about.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1715
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1716
		if (*edx & CPUID_INTC_EDX_SEP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1717
			hwcap_flags |= AV_386_SEP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1718
		if (*edx & CPUID_INTC_EDX_SSE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1719
			hwcap_flags |= AV_386_FXSR | AV_386_SSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1720
		if (*edx & CPUID_INTC_EDX_SSE2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1721
			hwcap_flags |= AV_386_SSE2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1722
		if (*ecx & CPUID_INTC_ECX_SSE3)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1723
			hwcap_flags |= AV_386_SSE3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1724
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1725
		if (*edx & CPUID_INTC_EDX_FPU)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1726
			hwcap_flags |= AV_386_FPU;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1727
		if (*edx & CPUID_INTC_EDX_MMX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1728
			hwcap_flags |= AV_386_MMX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1729
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1730
		if (*edx & CPUID_INTC_EDX_TSC)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1731
			hwcap_flags |= AV_386_TSC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1732
		if (*edx & CPUID_INTC_EDX_CX8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1733
			hwcap_flags |= AV_386_CX8;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1734
		if (*edx & CPUID_INTC_EDX_CMOV)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1735
			hwcap_flags |= AV_386_CMOV;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1736
		if (*ecx & CPUID_INTC_ECX_MON)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1737
			hwcap_flags |= AV_386_MON;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1738
		if (*ecx & CPUID_INTC_ECX_CX16)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1739
			hwcap_flags |= AV_386_CX16;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1740
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1741
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1742
	if (x86_feature & X86_HTT)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1743
		hwcap_flags |= AV_386_PAUSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1744
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1745
	if (cpi->cpi_xmaxeax < 0x80000001)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1746
		goto pass4_done;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1747
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1748
	switch (cpi->cpi_vendor) {
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1749
		struct cpuid_regs cp;
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1750
		uint32_t *edx, *ecx;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1751
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1752
	case X86_VENDOR_Intel:
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1753
		/*
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1754
		 * Seems like Intel duplicated what we necessary
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1755
		 * here to make the initial crop of 64-bit OS's work.
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1756
		 * Hopefully, those are the only "extended" bits
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1757
		 * they'll add.
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1758
		 */
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1759
		/*FALLTHROUGH*/
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1760
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1761
	case X86_VENDOR_AMD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1762
		edx = &cpi->cpi_support[AMD_EDX_FEATURES];
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1763
		ecx = &cpi->cpi_support[AMD_ECX_FEATURES];
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1764
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1765
		*edx = CPI_FEATURES_XTD_EDX(cpi);
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1766
		*ecx = CPI_FEATURES_XTD_ECX(cpi);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1767
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1768
		/*
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1769
		 * [these features require explicit kernel support]
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1770
		 */
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1771
		switch (cpi->cpi_vendor) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1772
		case X86_VENDOR_Intel:
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1773
			break;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1774
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1775
		case X86_VENDOR_AMD:
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1776
			if ((x86_feature & X86_TSCP) == 0)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1777
				*edx &= ~CPUID_AMD_EDX_TSCP;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1778
			break;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1779
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1780
		default:
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1781
			break;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1782
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1783
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1784
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1785
		 * [no explicit support required beyond
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1786
		 * x87 fp context and exception handlers]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1787
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1788
		if (!fpu_exists)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1789
			*edx &= ~(CPUID_AMD_EDX_MMXamd |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1790
			    CPUID_AMD_EDX_3DNow | CPUID_AMD_EDX_3DNowx);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1791
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1792
		if ((x86_feature & X86_NX) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1793
			*edx &= ~CPUID_AMD_EDX_NX;
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1794
#if !defined(__amd64)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1795
		*edx &= ~CPUID_AMD_EDX_LM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1796
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1797
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1798
		 * Now map the supported feature vector to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1799
		 * things that we think userland will care about.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1800
		 */
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1801
#if defined(__amd64)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1802
		if (*edx & CPUID_AMD_EDX_SYSC)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1803
			hwcap_flags |= AV_386_AMD_SYSC;
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1804
#endif
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1805
		if (*edx & CPUID_AMD_EDX_MMXamd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1806
			hwcap_flags |= AV_386_AMD_MMX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1807
		if (*edx & CPUID_AMD_EDX_3DNow)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1808
			hwcap_flags |= AV_386_AMD_3DNow;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1809
		if (*edx & CPUID_AMD_EDX_3DNowx)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1810
			hwcap_flags |= AV_386_AMD_3DNowx;
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1811
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1812
		switch (cpi->cpi_vendor) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1813
		case X86_VENDOR_AMD:
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1814
			if (*edx & CPUID_AMD_EDX_TSCP)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1815
				hwcap_flags |= AV_386_TSCP;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1816
			if (*ecx & CPUID_AMD_ECX_AHF64)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1817
				hwcap_flags |= AV_386_AHF;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1818
			break;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1819
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1820
		case X86_VENDOR_Intel:
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1821
			/*
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1822
			 * Aarrgh.
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1823
			 * Intel uses a different bit in the same word.
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1824
			 */
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1825
			if (*ecx & CPUID_INTC_ECX_AHF64)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1826
				hwcap_flags |= AV_386_AHF;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1827
			break;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1828
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1829
		default:
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1830
			break;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1831
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1832
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1833
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1834
	case X86_VENDOR_TM:
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1835
		cp.cp_eax = 0x80860001;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1836
		(void) __cpuid_insn(&cp);
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1837
		cpi->cpi_support[TM_EDX_FEATURES] = cp.cp_edx;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1838
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1839
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1840
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1841
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1842
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1843
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1844
pass4_done:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1845
	cpi->cpi_pass = 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1846
	return (hwcap_flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1847
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1848
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1849
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1850
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1851
 * Simulate the cpuid instruction using the data we previously
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1852
 * captured about this CPU.  We try our best to return the truth
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1853
 * about the hardware, independently of kernel support.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1854
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1855
uint32_t
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1856
cpuid_insn(cpu_t *cpu, struct cpuid_regs *cp)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1857
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1858
	struct cpuid_info *cpi;
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1859
	struct cpuid_regs *xcp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1860
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1861
	if (cpu == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1862
		cpu = CPU;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1863
	cpi = cpu->cpu_m.mcpu_cpi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1864
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1865
	ASSERT(cpuid_checkpass(cpu, 3));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1866
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1867
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1868
	 * CPUID data is cached in two separate places: cpi_std for standard
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1869
	 * CPUID functions, and cpi_extd for extended CPUID functions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1870
	 */
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1871
	if (cp->cp_eax <= cpi->cpi_maxeax && cp->cp_eax < NMAX_CPI_STD)
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1872
		xcp = &cpi->cpi_std[cp->cp_eax];
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1873
	else if (cp->cp_eax >= 0x80000000 && cp->cp_eax <= cpi->cpi_xmaxeax &&
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1874
	    cp->cp_eax < 0x80000000 + NMAX_CPI_EXTD)
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1875
		xcp = &cpi->cpi_extd[cp->cp_eax - 0x80000000];
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1876
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1877
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1878
		 * The caller is asking for data from an input parameter which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1879
		 * the kernel has not cached.  In this case we go fetch from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1880
		 * the hardware and return the data directly to the user.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1881
		 */
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1882
		return (__cpuid_insn(cp));
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1883
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1884
	cp->cp_eax = xcp->cp_eax;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1885
	cp->cp_ebx = xcp->cp_ebx;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1886
	cp->cp_ecx = xcp->cp_ecx;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1887
	cp->cp_edx = xcp->cp_edx;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1888
	return (cp->cp_eax);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1889
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1890
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1891
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1892
cpuid_checkpass(cpu_t *cpu, int pass)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1893
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1894
	return (cpu != NULL && cpu->cpu_m.mcpu_cpi != NULL &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1895
	    cpu->cpu_m.mcpu_cpi->cpi_pass >= pass);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1896
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1897
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1898
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1899
cpuid_getbrandstr(cpu_t *cpu, char *s, size_t n)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1900
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1901
	ASSERT(cpuid_checkpass(cpu, 3));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1902
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1903
	return (snprintf(s, n, "%s", cpu->cpu_m.mcpu_cpi->cpi_brandstr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1904
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1905
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1906
int
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1907
cpuid_is_cmt(cpu_t *cpu)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1908
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1909
	if (cpu == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1910
		cpu = CPU;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1911
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1912
	ASSERT(cpuid_checkpass(cpu, 1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1913
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1914
	return (cpu->cpu_m.mcpu_cpi->cpi_chipid >= 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1915
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1916
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1917
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1918
 * AMD and Intel both implement the 64-bit variant of the syscall
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1919
 * instruction (syscallq), so if there's -any- support for syscall,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1920
 * cpuid currently says "yes, we support this".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1921
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1922
 * However, Intel decided to -not- implement the 32-bit variant of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1923
 * syscall instruction, so we provide a predicate to allow our caller
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1924
 * to test that subtlety here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1925
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1926
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1927
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1928
cpuid_syscall32_insn(cpu_t *cpu)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1929
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1930
	ASSERT(cpuid_checkpass((cpu == NULL ? CPU : cpu), 1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1931
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1932
	if (cpu == NULL)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1933
		cpu = CPU;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1934
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1935
	/*CSTYLED*/
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1936
	{
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1937
		struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1938
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1939
		if (cpi->cpi_vendor == X86_VENDOR_AMD &&
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1940
		    cpi->cpi_xmaxeax >= 0x80000001 &&
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1941
		    (CPI_FEATURES_XTD_EDX(cpi) & CPUID_AMD_EDX_SYSC))
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1942
			return (1);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  1943
	}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1944
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1945
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1946
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1947
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1948
cpuid_getidstr(cpu_t *cpu, char *s, size_t n)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1949
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1950
	struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1951
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1952
	static const char fmt[] =
3779
f34a44686f8b 6532527 psrinfo output should show "EAX Page 1" hex value to identify processors
dmick
parents: 3446
diff changeset
  1953
	    "x86 (%s %X family %d model %d step %d clock %d MHz)";
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1954
	static const char fmt_ht[] =
3779
f34a44686f8b 6532527 psrinfo output should show "EAX Page 1" hex value to identify processors
dmick
parents: 3446
diff changeset
  1955
	    "x86 (chipid 0x%x %s %X family %d model %d step %d clock %d MHz)";
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1956
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1957
	ASSERT(cpuid_checkpass(cpu, 1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1958
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  1959
	if (cpuid_is_cmt(cpu))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1960
		return (snprintf(s, n, fmt_ht, cpi->cpi_chipid,
3779
f34a44686f8b 6532527 psrinfo output should show "EAX Page 1" hex value to identify processors
dmick
parents: 3446
diff changeset
  1961
		    cpi->cpi_vendorstr, cpi->cpi_std[1].cp_eax,
f34a44686f8b 6532527 psrinfo output should show "EAX Page 1" hex value to identify processors
dmick
parents: 3446
diff changeset
  1962
		    cpi->cpi_family, cpi->cpi_model,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1963
		    cpi->cpi_step, cpu->cpu_type_info.pi_clock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1964
	return (snprintf(s, n, fmt,
3779
f34a44686f8b 6532527 psrinfo output should show "EAX Page 1" hex value to identify processors
dmick
parents: 3446
diff changeset
  1965
	    cpi->cpi_vendorstr, cpi->cpi_std[1].cp_eax,
f34a44686f8b 6532527 psrinfo output should show "EAX Page 1" hex value to identify processors
dmick
parents: 3446
diff changeset
  1966
	    cpi->cpi_family, cpi->cpi_model,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1967
	    cpi->cpi_step, cpu->cpu_type_info.pi_clock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1968
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1969
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1970
const char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1971
cpuid_getvendorstr(cpu_t *cpu)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1972
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1973
	ASSERT(cpuid_checkpass(cpu, 1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1974
	return ((const char *)cpu->cpu_m.mcpu_cpi->cpi_vendorstr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1975
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1976
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1977
uint_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1978
cpuid_getvendor(cpu_t *cpu)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1979
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1980
	ASSERT(cpuid_checkpass(cpu, 1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1981
	return (cpu->cpu_m.mcpu_cpi->cpi_vendor);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1982
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1983
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1984
uint_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1985
cpuid_getfamily(cpu_t *cpu)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1986
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1987
	ASSERT(cpuid_checkpass(cpu, 1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1988
	return (cpu->cpu_m.mcpu_cpi->cpi_family);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1989
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1990
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1991
uint_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1992
cpuid_getmodel(cpu_t *cpu)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1993
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1994
	ASSERT(cpuid_checkpass(cpu, 1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1995
	return (cpu->cpu_m.mcpu_cpi->cpi_model);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1996
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1997
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1998
uint_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1999
cpuid_get_ncpu_per_chip(cpu_t *cpu)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2000
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2001
	ASSERT(cpuid_checkpass(cpu, 1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2002
	return (cpu->cpu_m.mcpu_cpi->cpi_ncpu_per_chip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2003
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2004
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2005
uint_t
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2006
cpuid_get_ncore_per_chip(cpu_t *cpu)
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2007
{
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2008
	ASSERT(cpuid_checkpass(cpu, 1));
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2009
	return (cpu->cpu_m.mcpu_cpi->cpi_ncore_per_chip);
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2010
}
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2011
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2012
uint_t
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2013
cpuid_getstep(cpu_t *cpu)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2014
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2015
	ASSERT(cpuid_checkpass(cpu, 1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2016
	return (cpu->cpu_m.mcpu_cpi->cpi_step);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2017
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2018
4581
b6104e41b06c PSARC/2007/349 Intel Microcode Update Support
sherrym
parents: 4481
diff changeset
  2019
uint_t
b6104e41b06c PSARC/2007/349 Intel Microcode Update Support
sherrym
parents: 4481
diff changeset
  2020
cpuid_getsig(struct cpu *cpu)
b6104e41b06c PSARC/2007/349 Intel Microcode Update Support
sherrym
parents: 4481
diff changeset
  2021
{
b6104e41b06c PSARC/2007/349 Intel Microcode Update Support
sherrym
parents: 4481
diff changeset
  2022
	ASSERT(cpuid_checkpass(cpu, 1));
b6104e41b06c PSARC/2007/349 Intel Microcode Update Support
sherrym
parents: 4481
diff changeset
  2023
	return (cpu->cpu_m.mcpu_cpi->cpi_std[1].cp_eax);
b6104e41b06c PSARC/2007/349 Intel Microcode Update Support
sherrym
parents: 4481
diff changeset
  2024
}
b6104e41b06c PSARC/2007/349 Intel Microcode Update Support
sherrym
parents: 4481
diff changeset
  2025
2869
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2026
uint32_t
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2027
cpuid_getchiprev(struct cpu *cpu)
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2028
{
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2029
	ASSERT(cpuid_checkpass(cpu, 1));
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2030
	return (cpu->cpu_m.mcpu_cpi->cpi_chiprev);
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2031
}
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2032
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2033
const char *
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2034
cpuid_getchiprevstr(struct cpu *cpu)
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2035
{
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2036
	ASSERT(cpuid_checkpass(cpu, 1));
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2037
	return (cpu->cpu_m.mcpu_cpi->cpi_chiprevstr);
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2038
}
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2039
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2040
uint32_t
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2041
cpuid_getsockettype(struct cpu *cpu)
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2042
{
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2043
	ASSERT(cpuid_checkpass(cpu, 1));
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2044
	return (cpu->cpu_m.mcpu_cpi->cpi_socket);
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2045
}
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2046
3434
5142e1d7d0bc 6461311 multi-level CMT scheduling optimizations
esaxe
parents: 2869
diff changeset
  2047
int
5142e1d7d0bc 6461311 multi-level CMT scheduling optimizations
esaxe
parents: 2869
diff changeset
  2048
cpuid_get_chipid(cpu_t *cpu)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2049
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2050
	ASSERT(cpuid_checkpass(cpu, 1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2051
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2052
	if (cpuid_is_cmt(cpu))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2053
		return (cpu->cpu_m.mcpu_cpi->cpi_chipid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2054
	return (cpu->cpu_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2055
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2056
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2057
id_t
3434
5142e1d7d0bc 6461311 multi-level CMT scheduling optimizations
esaxe
parents: 2869
diff changeset
  2058
cpuid_get_coreid(cpu_t *cpu)
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2059
{
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2060
	ASSERT(cpuid_checkpass(cpu, 1));
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2061
	return (cpu->cpu_m.mcpu_cpi->cpi_coreid);
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2062
}
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2063
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2064
int
3434
5142e1d7d0bc 6461311 multi-level CMT scheduling optimizations
esaxe
parents: 2869
diff changeset
  2065
cpuid_get_clogid(cpu_t *cpu)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2066
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2067
	ASSERT(cpuid_checkpass(cpu, 1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2068
	return (cpu->cpu_m.mcpu_cpi->cpi_clogid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2069
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2070
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2071
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2072
cpuid_get_addrsize(cpu_t *cpu, uint_t *pabits, uint_t *vabits)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2073
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2074
	struct cpuid_info *cpi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2075
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2076
	if (cpu == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2077
		cpu = CPU;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2078
	cpi = cpu->cpu_m.mcpu_cpi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2079
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2080
	ASSERT(cpuid_checkpass(cpu, 1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2081
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2082
	if (pabits)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2083
		*pabits = cpi->cpi_pabits;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2084
	if (vabits)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2085
		*vabits = cpi->cpi_vabits;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2086
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2087
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2088
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2089
 * Returns the number of data TLB entries for a corresponding
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2090
 * pagesize.  If it can't be computed, or isn't known, the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2091
 * routine returns zero.  If you ask about an architecturally
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2092
 * impossible pagesize, the routine will panic (so that the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2093
 * hat implementor knows that things are inconsistent.)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2094
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2095
uint_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2096
cpuid_get_dtlb_nent(cpu_t *cpu, size_t pagesize)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2097
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2098
	struct cpuid_info *cpi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2099
	uint_t dtlb_nent = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2101
	if (cpu == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2102
		cpu = CPU;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2103
	cpi = cpu->cpu_m.mcpu_cpi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2105
	ASSERT(cpuid_checkpass(cpu, 1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2107
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2108
	 * Check the L2 TLB info
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2109
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2110
	if (cpi->cpi_xmaxeax >= 0x80000006) {
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2111
		struct cpuid_regs *cp = &cpi->cpi_extd[6];
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2112
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2113
		switch (pagesize) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2115
		case 4 * 1024:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2116
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2117
			 * All zero in the top 16 bits of the register
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2118
			 * indicates a unified TLB. Size is in low 16 bits.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2119
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2120
			if ((cp->cp_ebx & 0xffff0000) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2121
				dtlb_nent = cp->cp_ebx & 0x0000ffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2122
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2123
				dtlb_nent = BITX(cp->cp_ebx, 27, 16);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2124
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2125
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2126
		case 2 * 1024 * 1024:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2127
			if ((cp->cp_eax & 0xffff0000) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2128
				dtlb_nent = cp->cp_eax & 0x0000ffff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2129
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2130
				dtlb_nent = BITX(cp->cp_eax, 27, 16);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2131
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2132
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2133
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2134
			panic("unknown L2 pagesize");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2135
			/*NOTREACHED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2136
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2137
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2139
	if (dtlb_nent != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2140
		return (dtlb_nent);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2142
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2143
	 * No L2 TLB support for this size, try L1.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2144
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2145
	if (cpi->cpi_xmaxeax >= 0x80000005) {
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2146
		struct cpuid_regs *cp = &cpi->cpi_extd[5];
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2147
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2148
		switch (pagesize) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2149
		case 4 * 1024:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2150
			dtlb_nent = BITX(cp->cp_ebx, 23, 16);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2151
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2152
		case 2 * 1024 * 1024:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2153
			dtlb_nent = BITX(cp->cp_eax, 23, 16);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2154
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2155
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2156
			panic("unknown L1 d-TLB pagesize");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2157
			/*NOTREACHED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2158
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2159
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2161
	return (dtlb_nent);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2162
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2164
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2165
 * Return 0 if the erratum is not present or not applicable, positive
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2166
 * if it is, and negative if the status of the erratum is unknown.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2167
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2168
 * See "Revision Guide for AMD Athlon(tm) 64 and AMD Opteron(tm)
359
a88cb999e7ec 6288246 amd64 kernel needs to detect AMD Opteron erratum 131
kucharsk
parents: 0
diff changeset
  2169
 * Processors" #25759, Rev 3.57, August 2005
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2170
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2171
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2172
cpuid_opteron_erratum(cpu_t *cpu, uint_t erratum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2173
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2174
	struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi;
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2175
	uint_t eax;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2176
2584
c8f937287646 6462189 cpuid_opteron_erratum does not bail out on non-AMD64 AMD CPUs
sethg
parents: 2519
diff changeset
  2177
	/*
c8f937287646 6462189 cpuid_opteron_erratum does not bail out on non-AMD64 AMD CPUs
sethg
parents: 2519
diff changeset
  2178
	 * Bail out if this CPU isn't an AMD CPU, or if it's
c8f937287646 6462189 cpuid_opteron_erratum does not bail out on non-AMD64 AMD CPUs
sethg
parents: 2519
diff changeset
  2179
	 * a legacy (32-bit) AMD CPU.
c8f937287646 6462189 cpuid_opteron_erratum does not bail out on non-AMD64 AMD CPUs
sethg
parents: 2519
diff changeset
  2180
	 */
c8f937287646 6462189 cpuid_opteron_erratum does not bail out on non-AMD64 AMD CPUs
sethg
parents: 2519
diff changeset
  2181
	if (cpi->cpi_vendor != X86_VENDOR_AMD ||
4265
6be078c4d3b4 6555108 workarounds being applied for errata not present in greyhound processors
kchow
parents: 3779
diff changeset
  2182
	    cpi->cpi_family == 4 || cpi->cpi_family == 5 ||
6be078c4d3b4 6555108 workarounds being applied for errata not present in greyhound processors
kchow
parents: 3779
diff changeset
  2183
	    cpi->cpi_family == 6)
2869
324151eecd58 PSARC 2006/564 FMA for Athlon 64 and Opteron Rev F/G Processors
gavinm
parents: 2584
diff changeset
  2184
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2185
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2186
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2187
	eax = cpi->cpi_std[1].cp_eax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2188
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2189
#define	SH_B0(eax)	(eax == 0xf40 || eax == 0xf50)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2190
#define	SH_B3(eax) 	(eax == 0xf51)
1582
eb879d43ab47 6323525 Mutual exclusion primitives don't work as expected on Opteron systems
kchow
parents: 1414
diff changeset
  2191
#define	B(eax)		(SH_B0(eax) || SH_B3(eax))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2192
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2193
#define	SH_C0(eax)	(eax == 0xf48 || eax == 0xf58)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2194
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2195
#define	SH_CG(eax)	(eax == 0xf4a || eax == 0xf5a || eax == 0xf7a)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2196
#define	DH_CG(eax)	(eax == 0xfc0 || eax == 0xfe0 || eax == 0xff0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2197
#define	CH_CG(eax)	(eax == 0xf82 || eax == 0xfb2)
1582
eb879d43ab47 6323525 Mutual exclusion primitives don't work as expected on Opteron systems
kchow
parents: 1414
diff changeset
  2198
#define	CG(eax)		(SH_CG(eax) || DH_CG(eax) || CH_CG(eax))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2200
#define	SH_D0(eax)	(eax == 0x10f40 || eax == 0x10f50 || eax == 0x10f70)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2201
#define	DH_D0(eax)	(eax == 0x10fc0 || eax == 0x10ff0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2202
#define	CH_D0(eax)	(eax == 0x10f80 || eax == 0x10fb0)
1582
eb879d43ab47 6323525 Mutual exclusion primitives don't work as expected on Opteron systems
kchow
parents: 1414
diff changeset
  2203
#define	D0(eax)		(SH_D0(eax) || DH_D0(eax) || CH_D0(eax))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2204
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2205
#define	SH_E0(eax)	(eax == 0x20f50 || eax == 0x20f40 || eax == 0x20f70)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2206
#define	JH_E1(eax)	(eax == 0x20f10)	/* JH8_E0 had 0x20f30 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2207
#define	DH_E3(eax)	(eax == 0x20fc0 || eax == 0x20ff0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2208
#define	SH_E4(eax)	(eax == 0x20f51 || eax == 0x20f71)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2209
#define	BH_E4(eax)	(eax == 0x20fb1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2210
#define	SH_E5(eax)	(eax == 0x20f42)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2211
#define	DH_E6(eax)	(eax == 0x20ff2 || eax == 0x20fc2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2212
#define	JH_E6(eax)	(eax == 0x20f12 || eax == 0x20f32)
1582
eb879d43ab47 6323525 Mutual exclusion primitives don't work as expected on Opteron systems
kchow
parents: 1414
diff changeset
  2213
#define	EX(eax)		(SH_E0(eax) || JH_E1(eax) || DH_E3(eax) || \
eb879d43ab47 6323525 Mutual exclusion primitives don't work as expected on Opteron systems
kchow
parents: 1414
diff changeset
  2214
			    SH_E4(eax) || BH_E4(eax) || SH_E5(eax) || \
eb879d43ab47 6323525 Mutual exclusion primitives don't work as expected on Opteron systems
kchow
parents: 1414
diff changeset
  2215
			    DH_E6(eax) || JH_E6(eax))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2216
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2217
	switch (erratum) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2218
	case 1:
4265
6be078c4d3b4 6555108 workarounds being applied for errata not present in greyhound processors
kchow
parents: 3779
diff changeset
  2219
		return (cpi->cpi_family < 0x10);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2220
	case 51:	/* what does the asterisk mean? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2221
		return (B(eax) || SH_C0(eax) || CG(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2222
	case 52:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2223
		return (B(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2224
	case 57:
4265
6be078c4d3b4 6555108 workarounds being applied for errata not present in greyhound processors
kchow
parents: 3779
diff changeset
  2225
		return (cpi->cpi_family <= 0x10);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2226
	case 58:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2227
		return (B(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2228
	case 60:
4265
6be078c4d3b4 6555108 workarounds being applied for errata not present in greyhound processors
kchow
parents: 3779
diff changeset
  2229
		return (cpi->cpi_family <= 0x10);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2230
	case 61:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2231
	case 62:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2232
	case 63:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2233
	case 64:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2234
	case 65:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2235
	case 66:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2236
	case 68:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2237
	case 69:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2238
	case 70:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2239
	case 71:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2240
		return (B(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2241
	case 72:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2242
		return (SH_B0(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2243
	case 74:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2244
		return (B(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2245
	case 75:
4265
6be078c4d3b4 6555108 workarounds being applied for errata not present in greyhound processors
kchow
parents: 3779
diff changeset
  2246
		return (cpi->cpi_family < 0x10);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2247
	case 76:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2248
		return (B(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2249
	case 77:
4265
6be078c4d3b4 6555108 workarounds being applied for errata not present in greyhound processors
kchow
parents: 3779
diff changeset
  2250
		return (cpi->cpi_family <= 0x10);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2251
	case 78:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2252
		return (B(eax) || SH_C0(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2253
	case 79:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2254
		return (B(eax) || SH_C0(eax) || CG(eax) || D0(eax) || EX(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2255
	case 80:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2256
	case 81:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2257
	case 82:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2258
		return (B(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2259
	case 83:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2260
		return (B(eax) || SH_C0(eax) || CG(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2261
	case 85:
4265
6be078c4d3b4 6555108 workarounds being applied for errata not present in greyhound processors
kchow
parents: 3779
diff changeset
  2262
		return (cpi->cpi_family < 0x10);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2263
	case 86:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2264
		return (SH_C0(eax) || CG(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2265
	case 88:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2266
#if !defined(__amd64)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2267
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2268
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2269
		return (B(eax) || SH_C0(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2270
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2271
	case 89:
4265
6be078c4d3b4 6555108 workarounds being applied for errata not present in greyhound processors
kchow
parents: 3779
diff changeset
  2272
		return (cpi->cpi_family < 0x10);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2273
	case 90:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2274
		return (B(eax) || SH_C0(eax) || CG(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2275
	case 91:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2276
	case 92:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2277
		return (B(eax) || SH_C0(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2278
	case 93:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2279
		return (SH_C0(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2280
	case 94:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2281
		return (B(eax) || SH_C0(eax) || CG(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2282
	case 95:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2283
#if !defined(__amd64)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2284
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2285
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2286
		return (B(eax) || SH_C0(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2287
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2288
	case 96:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2289
		return (B(eax) || SH_C0(eax) || CG(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2290
	case 97:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2291
	case 98:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2292
		return (SH_C0(eax) || CG(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2293
	case 99:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2294
		return (B(eax) || SH_C0(eax) || CG(eax) || D0(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2295
	case 100:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2296
		return (B(eax) || SH_C0(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2297
	case 101:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2298
	case 103:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2299
		return (B(eax) || SH_C0(eax) || CG(eax) || D0(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2300
	case 104:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2301
		return (SH_C0(eax) || CG(eax) || D0(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2302
	case 105:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2303
	case 106:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2304
	case 107:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2305
		return (B(eax) || SH_C0(eax) || CG(eax) || D0(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2306
	case 108:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2307
		return (DH_CG(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2308
	case 109:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2309
		return (SH_C0(eax) || CG(eax) || D0(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2310
	case 110:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2311
		return (D0(eax) || EX(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2312
	case 111:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2313
		return (CG(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2314
	case 112:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2315
		return (B(eax) || SH_C0(eax) || CG(eax) || D0(eax) || EX(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2316
	case 113:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2317
		return (eax == 0x20fc0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2318
	case 114:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2319
		return (SH_E0(eax) || JH_E1(eax) || DH_E3(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2320
	case 115:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2321
		return (SH_E0(eax) || JH_E1(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2322
	case 116:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2323
		return (SH_E0(eax) || JH_E1(eax) || DH_E3(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2324
	case 117:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2325
		return (B(eax) || SH_C0(eax) || CG(eax) || D0(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2326
	case 118:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2327
		return (SH_E0(eax) || JH_E1(eax) || SH_E4(eax) || BH_E4(eax) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2328
		    JH_E6(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2329
	case 121:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2330
		return (B(eax) || SH_C0(eax) || CG(eax) || D0(eax) || EX(eax));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2331
	case 122:
4265
6be078c4d3b4 6555108 workarounds being applied for errata not present in greyhound processors
kchow
parents: 3779
diff changeset
  2332
		return (cpi->cpi_family < 0x10);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2333
	case 123:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2334
		return (JH_E1(eax) || BH_E4(eax) || JH_E6(eax));
359
a88cb999e7ec 6288246 amd64 kernel needs to detect AMD Opteron erratum 131
kucharsk
parents: 0
diff changeset
  2335
	case 131:
4265
6be078c4d3b4 6555108 workarounds being applied for errata not present in greyhound processors
kchow
parents: 3779
diff changeset
  2336
		return (cpi->cpi_family < 0x10);
938
2d438f28c673 6336786 time doesn't fly when CPUs are not having fun
esaxe
parents: 789
diff changeset
  2337
	case 6336786:
2d438f28c673 6336786 time doesn't fly when CPUs are not having fun
esaxe
parents: 789
diff changeset
  2338
		/*
2d438f28c673 6336786 time doesn't fly when CPUs are not having fun
esaxe
parents: 789
diff changeset
  2339
		 * Test for AdvPowerMgmtInfo.TscPStateInvariant
4265
6be078c4d3b4 6555108 workarounds being applied for errata not present in greyhound processors
kchow
parents: 3779
diff changeset
  2340
		 * if this is a K8 family or newer processor
938
2d438f28c673 6336786 time doesn't fly when CPUs are not having fun
esaxe
parents: 789
diff changeset
  2341
		 */
2d438f28c673 6336786 time doesn't fly when CPUs are not having fun
esaxe
parents: 789
diff changeset
  2342
		if (CPI_FAMILY(cpi) == 0xf) {
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2343
			struct cpuid_regs regs;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2344
			regs.cp_eax = 0x80000007;
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2345
			(void) __cpuid_insn(&regs);
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2346
			return (!(regs.cp_edx & 0x100));
938
2d438f28c673 6336786 time doesn't fly when CPUs are not having fun
esaxe
parents: 789
diff changeset
  2347
		}
2d438f28c673 6336786 time doesn't fly when CPUs are not having fun
esaxe
parents: 789
diff changeset
  2348
		return (0);
1582
eb879d43ab47 6323525 Mutual exclusion primitives don't work as expected on Opteron systems
kchow
parents: 1414
diff changeset
  2349
	case 6323525:
eb879d43ab47 6323525 Mutual exclusion primitives don't work as expected on Opteron systems
kchow
parents: 1414
diff changeset
  2350
		return (((((eax >> 12) & 0xff00) + (eax & 0xf00)) |
eb879d43ab47 6323525 Mutual exclusion primitives don't work as expected on Opteron systems
kchow
parents: 1414
diff changeset
  2351
		    (((eax >> 4) & 0xf) | ((eax >> 12) & 0xf0))) < 0xf40);
eb879d43ab47 6323525 Mutual exclusion primitives don't work as expected on Opteron systems
kchow
parents: 1414
diff changeset
  2352
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2353
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2354
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2355
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2356
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2357
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2358
static const char assoc_str[] = "associativity";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2359
static const char line_str[] = "line-size";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2360
static const char size_str[] = "size";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2361
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2362
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2363
add_cache_prop(dev_info_t *devi, const char *label, const char *type,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2364
    uint32_t val)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2365
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2366
	char buf[128];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2367
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2368
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2369
	 * ndi_prop_update_int() is used because it is desirable for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2370
	 * DDI_PROP_HW_DEF and DDI_PROP_DONTSLEEP to be set.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2371
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2372
	if (snprintf(buf, sizeof (buf), "%s-%s", label, type) < sizeof (buf))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2373
		(void) ndi_prop_update_int(DDI_DEV_T_NONE, devi, buf, val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2374
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2375
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2376
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2377
 * Intel-style cache/tlb description
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2378
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2379
 * Standard cpuid level 2 gives a randomly ordered
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2380
 * selection of tags that index into a table that describes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2381
 * cache and tlb properties.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2382
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2383
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2384
static const char l1_icache_str[] = "l1-icache";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2385
static const char l1_dcache_str[] = "l1-dcache";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2386
static const char l2_cache_str[] = "l2-cache";
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  2387
static const char l3_cache_str[] = "l3-cache";
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2388
static const char itlb4k_str[] = "itlb-4K";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2389
static const char dtlb4k_str[] = "dtlb-4K";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2390
static const char itlb4M_str[] = "itlb-4M";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2391
static const char dtlb4M_str[] = "dtlb-4M";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2392
static const char itlb424_str[] = "itlb-4K-2M-4M";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2393
static const char dtlb44_str[] = "dtlb-4K-4M";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2394
static const char sl1_dcache_str[] = "sectored-l1-dcache";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2395
static const char sl2_cache_str[] = "sectored-l2-cache";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2396
static const char itrace_str[] = "itrace-cache";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2397
static const char sl3_cache_str[] = "sectored-l3-cache";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2398
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2399
static const struct cachetab {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2400
	uint8_t 	ct_code;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2401
	uint8_t		ct_assoc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2402
	uint16_t 	ct_line_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2403
	size_t		ct_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2404
	const char	*ct_label;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2405
} intel_ctab[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2406
	/* maintain descending order! */
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  2407
	{ 0xb4, 4, 0, 256, dtlb4k_str },
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2408
	{ 0xb3, 4, 0, 128, dtlb4k_str },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2409
	{ 0xb0, 4, 0, 128, itlb4k_str },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2410
	{ 0x87, 8, 64, 1024*1024, l2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2411
	{ 0x86, 4, 64, 512*1024, l2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2412
	{ 0x85, 8, 32, 2*1024*1024, l2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2413
	{ 0x84, 8, 32, 1024*1024, l2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2414
	{ 0x83, 8, 32, 512*1024, l2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2415
	{ 0x82, 8, 32, 256*1024, l2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2416
	{ 0x7f, 2, 64, 512*1024, l2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2417
	{ 0x7d, 8, 64, 2*1024*1024, sl2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2418
	{ 0x7c, 8, 64, 1024*1024, sl2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2419
	{ 0x7b, 8, 64, 512*1024, sl2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2420
	{ 0x7a, 8, 64, 256*1024, sl2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2421
	{ 0x79, 8, 64, 128*1024, sl2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2422
	{ 0x78, 8, 64, 1024*1024, l2_cache_str},
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  2423
	{ 0x73, 8, 0, 64*1024, itrace_str},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2424
	{ 0x72, 8, 0, 32*1024, itrace_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2425
	{ 0x71, 8, 0, 16*1024, itrace_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2426
	{ 0x70, 8, 0, 12*1024, itrace_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2427
	{ 0x68, 4, 64, 32*1024, sl1_dcache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2428
	{ 0x67, 4, 64, 16*1024, sl1_dcache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2429
	{ 0x66, 4, 64, 8*1024, sl1_dcache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2430
	{ 0x60, 8, 64, 16*1024, sl1_dcache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2431
	{ 0x5d, 0, 0, 256, dtlb44_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2432
	{ 0x5c, 0, 0, 128, dtlb44_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2433
	{ 0x5b, 0, 0, 64, dtlb44_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2434
	{ 0x52, 0, 0, 256, itlb424_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2435
	{ 0x51, 0, 0, 128, itlb424_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2436
	{ 0x50, 0, 0, 64, itlb424_str},
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  2437
	{ 0x4d, 16, 64, 16*1024*1024, l3_cache_str},
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  2438
	{ 0x4c, 12, 64, 12*1024*1024, l3_cache_str},
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  2439
	{ 0x4b, 16, 64, 8*1024*1024, l3_cache_str},
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  2440
	{ 0x4a, 12, 64, 6*1024*1024, l3_cache_str},
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  2441
	{ 0x49, 16, 64, 4*1024*1024, l3_cache_str},
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  2442
	{ 0x47, 8, 64, 8*1024*1024, l3_cache_str},
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  2443
	{ 0x46, 4, 64, 4*1024*1024, l3_cache_str},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2444
	{ 0x45, 4, 32, 2*1024*1024, l2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2445
	{ 0x44, 4, 32, 1024*1024, l2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2446
	{ 0x43, 4, 32, 512*1024, l2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2447
	{ 0x42, 4, 32, 256*1024, l2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2448
	{ 0x41, 4, 32, 128*1024, l2_cache_str},
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  2449
	{ 0x3e, 4, 64, 512*1024, sl2_cache_str},
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  2450
	{ 0x3d, 6, 64, 384*1024, sl2_cache_str},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2451
	{ 0x3c, 4, 64, 256*1024, sl2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2452
	{ 0x3b, 2, 64, 128*1024, sl2_cache_str},
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  2453
	{ 0x3a, 6, 64, 192*1024, sl2_cache_str},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2454
	{ 0x39, 4, 64, 128*1024, sl2_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2455
	{ 0x30, 8, 64, 32*1024, l1_icache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2456
	{ 0x2c, 8, 64, 32*1024, l1_dcache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2457
	{ 0x29, 8, 64, 4096*1024, sl3_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2458
	{ 0x25, 8, 64, 2048*1024, sl3_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2459
	{ 0x23, 8, 64, 1024*1024, sl3_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2460
	{ 0x22, 4, 64, 512*1024, sl3_cache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2461
	{ 0x0c, 4, 32, 16*1024, l1_dcache_str},
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3434
diff changeset
  2462
	{ 0x0b, 4, 0, 4, itlb4M_str},
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2463
	{ 0x0a, 2, 32, 8*1024, l1_dcache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2464
	{ 0x08, 4, 32, 16*1024, l1_icache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2465
	{ 0x06, 4, 32, 8*1024, l1_icache_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2466
	{ 0x04, 4, 0, 8, dtlb4M_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2467
	{ 0x03, 4, 0, 64, dtlb4k_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2468
	{ 0x02, 4, 0, 2, itlb4M_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2469
	{ 0x01, 4, 0, 32, itlb4k_str},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2470
	{ 0 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2471
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2472
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2473
static const struct cachetab cyrix_ctab[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2474
	{ 0x70, 4, 0, 32, "tlb-4K" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2475
	{ 0x80, 4, 16, 16*1024, "l1-cache" },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2476
	{ 0 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2477
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2478
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2479
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2480
 * Search a cache table for a matching entry
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2481
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2482
static const struct cachetab *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2483
find_cacheent(const struct cachetab *ct, uint_t code)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2484
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2485
	if (code != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2486
		for (; ct->ct_code != 0; ct++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2487
			if (ct->ct_code <= code)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2488
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2489
		if (ct->ct_code == code)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2490
			return (ct);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2491
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2492
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2493
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2494
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2495
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2496
 * Walk the cacheinfo descriptor, applying 'func' to every valid element
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2497
 * The walk is terminated if the walker returns non-zero.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2498
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2499
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2500
intel_walk_cacheinfo(struct cpuid_info *cpi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2501
    void *arg, int (*func)(void *, const struct cachetab *))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2502
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2503
	const struct cachetab *ct;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2504
	uint8_t *dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2505
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2507
	if ((dp = cpi->cpi_cacheinfo) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2508
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2509
	for (i = 0; i < cpi->cpi_ncache; i++, dp++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2510
		if ((ct = find_cacheent(intel_ctab, *dp)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2511
			if (func(arg, ct) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2512
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2513
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2514
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2515
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2516
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2517
 * (Like the Intel one, except for Cyrix CPUs)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2518
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2519
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2520
cyrix_walk_cacheinfo(struct cpuid_info *cpi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2521
    void *arg, int (*func)(void *, const struct cachetab *))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2522
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2523
	const struct cachetab *ct;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2524
	uint8_t *dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2525
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2526
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2527
	if ((dp = cpi->cpi_cacheinfo) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2528
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2529
	for (i = 0; i < cpi->cpi_ncache; i++, dp++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2530
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2531
		 * Search Cyrix-specific descriptor table first ..
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2532
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2533
		if ((ct = find_cacheent(cyrix_ctab, *dp)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2534
			if (func(arg, ct) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2535
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2536
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2537
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2538
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2539
		 * .. else fall back to the Intel one
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2540
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2541
		if ((ct = find_cacheent(intel_ctab, *dp)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2542
			if (func(arg, ct) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2543
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2544
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2545
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2546
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2547
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2548
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2549
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2550
 * A cacheinfo walker that adds associativity, line-size, and size properties
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2551
 * to the devinfo node it is passed as an argument.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2552
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2553
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2554
add_cacheent_props(void *arg, const struct cachetab *ct)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2555
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2556
	dev_info_t *devi = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2557
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2558
	add_cache_prop(devi, ct->ct_label, assoc_str, ct->ct_assoc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2559
	if (ct->ct_line_size != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2560
		add_cache_prop(devi, ct->ct_label, line_str,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2561
		    ct->ct_line_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2562
	add_cache_prop(devi, ct->ct_label, size_str, ct->ct_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2563
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2564
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2565
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2566
static const char fully_assoc[] = "fully-associative?";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2568
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2569
 * AMD style cache/tlb description
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2570
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2571
 * Extended functions 5 and 6 directly describe properties of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2572
 * tlbs and various cache levels.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2573
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2574
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2575
add_amd_assoc(dev_info_t *devi, const char *label, uint_t assoc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2576
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2577
	switch (assoc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2578
	case 0:	/* reserved; ignore */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2579
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2580
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2581
		add_cache_prop(devi, label, assoc_str, assoc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2582
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2583
	case 0xff:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2584
		add_cache_prop(devi, label, fully_assoc, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2585
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2586
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2587
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2588
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2589
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2590
add_amd_tlb(dev_info_t *devi, const char *label, uint_t assoc, uint_t size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2591
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2592
	if (size == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2593
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2594
	add_cache_prop(devi, label, size_str, size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2595
	add_amd_assoc(devi, label, assoc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2596
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2597
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2598
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2599
add_amd_cache(dev_info_t *devi, const char *label,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2600
    uint_t size, uint_t assoc, uint_t lines_per_tag, uint_t line_size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2601
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2602
	if (size == 0 || line_size == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2603
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2604
	add_amd_assoc(devi, label, assoc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2605
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2606
	 * Most AMD parts have a sectored cache. Multiple cache lines are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2607
	 * associated with each tag. A sector consists of all cache lines
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2608
	 * associated with a tag. For example, the AMD K6-III has a sector
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2609
	 * size of 2 cache lines per tag.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2610
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2611
	if (lines_per_tag != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2612
		add_cache_prop(devi, label, "lines-per-tag", lines_per_tag);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2613
	add_cache_prop(devi, label, line_str, line_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2614
	add_cache_prop(devi, label, size_str, size * 1024);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2615
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2616
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2617
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2618
add_amd_l2_assoc(dev_info_t *devi, const char *label, uint_t assoc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2619
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2620
	switch (assoc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2621
	case 0:	/* off */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2622
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2623
	case 1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2624
	case 2:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2625
	case 4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2626
		add_cache_prop(devi, label, assoc_str, assoc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2627
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2628
	case 6:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2629
		add_cache_prop(devi, label, assoc_str, 8);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2630
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2631
	case 8:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2632
		add_cache_prop(devi, label, assoc_str, 16);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2633
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2634
	case 0xf:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2635
		add_cache_prop(devi, label, fully_assoc, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2636
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2637
	default: /* reserved; ignore */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2638
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2639
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2640
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2641
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2642
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2643
add_amd_l2_tlb(dev_info_t *devi, const char *label, uint_t assoc, uint_t size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2644
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2645
	if (size == 0 || assoc == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2646
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2647
	add_amd_l2_assoc(devi, label, assoc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2648
	add_cache_prop(devi, label, size_str, size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2649
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2650
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2651
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2652
add_amd_l2_cache(dev_info_t *devi, const char *label,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2653
    uint_t size, uint_t assoc, uint_t lines_per_tag, uint_t line_size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2654
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2655
	if (size == 0 || assoc == 0 || line_size == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2656
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2657
	add_amd_l2_assoc(devi, label, assoc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2658
	if (lines_per_tag != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2659
		add_cache_prop(devi, label, "lines-per-tag", lines_per_tag);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2660
	add_cache_prop(devi, label, line_str, line_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2661
	add_cache_prop(devi, label, size_str, size * 1024);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2662
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2663
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2664
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2665
amd_cache_info(struct cpuid_info *cpi, dev_info_t *devi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2666
{
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  2667
	struct cpuid_regs *cp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2668
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2669
	if (cpi->cpi_xmaxeax < 0x80000005)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2670
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2671
	cp = &cpi->cpi_extd[5];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2672
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2673
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2674
	 * 4M/2M L1 TLB configuration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2675
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2676
	 * We report the size for 2M pages because AMD uses two
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2677
	 * TLB entries for one 4M page.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2678
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2679
	add_amd_tlb(devi, "dtlb-2M",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2680
	    BITX(cp->cp_eax, 31, 24), BITX(cp->cp_eax, 23, 16));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2681
	add_amd_tlb(devi, "itlb-2M",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2682
	    BITX(cp->cp_eax, 15, 8), BITX(cp->cp_eax, 7, 0));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2683
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2684
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2685
	 * 4K L1 TLB configuration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2686
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2687
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2688
	switch (cpi->cpi_vendor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2689
		uint_t nentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2690
	case X86_VENDOR_TM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2691
		if (cpi->cpi_family >= 5) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2692
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2693
			 * Crusoe processors have 256 TLB entries, but
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2694
			 * cpuid data format constrains them to only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2695
			 * reporting 255 of them.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2696
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2697
			if ((nentries = BITX(cp->cp_ebx, 23, 16)) == 255)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2698
				nentries = 256;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2699
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2700
			 * Crusoe processors also have a unified TLB
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2701
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2702
			add_amd_tlb(devi, "tlb-4K", BITX(cp->cp_ebx, 31, 24),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2703
			    nentries);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2704
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2705
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2706
		/*FALLTHROUGH*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2707
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2708
		add_amd_tlb(devi, itlb4k_str,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2709
		    BITX(cp->cp_ebx, 31, 24), BITX(cp->cp_ebx, 23, 16));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2710
		add_amd_tlb(devi, dtlb4k_str,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2711
		    BITX(cp->cp_ebx, 15, 8), BITX(cp->cp_ebx, 7, 0));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2712
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2713
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2714
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2715
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2716
	 * data L1 cache configuration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2717
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2718
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2719
	add_amd_cache(devi, l1_dcache_str,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2720
	    BITX(cp->cp_ecx, 31, 24), BITX(cp->cp_ecx, 23, 16),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2721
	    BITX(cp->cp_ecx, 15, 8), BITX(cp->cp_ecx, 7, 0));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2722
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2723
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2724
	 * code L1 cache configuration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2725
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2726
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2727
	add_amd_cache(devi, l1_icache_str,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2728
	    BITX(cp->cp_edx, 31, 24), BITX(cp->cp_edx, 23, 16),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2729
	    BITX(cp->cp_edx, 15, 8), BITX(cp->cp_edx, 7, 0));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2730
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2731
	if (cpi->cpi_xmaxeax < 0x80000006)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2732
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2733
	cp = &cpi->cpi_extd[6];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2734
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2735
	/* Check for a unified L2 TLB for large pages */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2736
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2737
	if (BITX(cp->cp_eax, 31, 16) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2738
		add_amd_l2_tlb(devi, "l2-tlb-2M",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2739
		    BITX(cp->cp_eax, 15, 12), BITX(cp->cp_eax, 11, 0));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2740
	else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2741
		add_amd_l2_tlb(devi, "l2-dtlb-2M",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2742
		    BITX(cp->cp_eax, 31, 28), BITX(cp->cp_eax, 27, 16));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2743
		add_amd_l2_tlb(devi, "l2-itlb-2M",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2744
		    BITX(cp->cp_eax, 15, 12), BITX(cp->cp_eax, 11, 0));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2745
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2746
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2747
	/* Check for a unified L2 TLB for 4K pages */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2748
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2749
	if (BITX(cp->cp_ebx, 31, 16) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2750
		add_amd_l2_tlb(devi, "l2-tlb-4K",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2751
		    BITX(cp->cp_eax, 15, 12), BITX(cp->cp_eax, 11, 0));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2752
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2753
		add_amd_l2_tlb(devi, "l2-dtlb-4K",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2754
		    BITX(cp->cp_eax, 31, 28), BITX(cp->cp_eax, 27, 16));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2755
		add_amd_l2_tlb(devi, "l2-itlb-4K",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2756
		    BITX(cp->cp_eax, 15, 12), BITX(cp->cp_eax, 11, 0));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2757
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2758
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2759
	add_amd_l2_cache(devi, l2_cache_str,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2760
	    BITX(cp->cp_ecx, 31, 16), BITX(cp->cp_ecx, 15, 12),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2761
	    BITX(cp->cp_ecx, 11, 8), BITX(cp->cp_ecx, 7, 0));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2762
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2763
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2764
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2765
 * There are two basic ways that the x86 world describes it cache
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2766
 * and tlb architecture - Intel's way and AMD's way.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2767
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2768
 * Return which flavor of cache architecture we should use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2769
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2770
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2771
x86_which_cacheinfo(struct cpuid_info *cpi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2772
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2773
	switch (cpi->cpi_vendor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2774
	case X86_VENDOR_Intel:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2775
		if (cpi->cpi_maxeax >= 2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2776
			return (X86_VENDOR_Intel);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2777
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2778
	case X86_VENDOR_AMD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2779
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2780
		 * The K5 model 1 was the first part from AMD that reported
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2781
		 * cache sizes via extended cpuid functions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2782
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2783
		if (cpi->cpi_family > 5 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2784
		    (cpi->cpi_family == 5 && cpi->cpi_model >= 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2785
			return (X86_VENDOR_AMD);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2786
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2787
	case X86_VENDOR_TM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2788
		if (cpi->cpi_family >= 5)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2789
			return (X86_VENDOR_AMD);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2790
		/*FALLTHROUGH*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2791
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2792
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2793
		 * If they have extended CPU data for 0x80000005
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2794
		 * then we assume they have AMD-format cache
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2795
		 * information.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2796
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2797
		 * If not, and the vendor happens to be Cyrix,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2798
		 * then try our-Cyrix specific handler.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2799
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2800
		 * If we're not Cyrix, then assume we're using Intel's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2801
		 * table-driven format instead.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2802
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2803
		if (cpi->cpi_xmaxeax >= 0x80000005)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2804
			return (X86_VENDOR_AMD);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2805
		else if (cpi->cpi_vendor == X86_VENDOR_Cyrix)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2806
			return (X86_VENDOR_Cyrix);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2807
		else if (cpi->cpi_maxeax >= 2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2808
			return (X86_VENDOR_Intel);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2809
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2810
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2811
	return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2812
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2813
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2814
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2815
 * create a node for the given cpu under the prom root node.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2816
 * Also, create a cpu node in the device tree.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2817
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2818
static dev_info_t *cpu_nex_devi = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2819
static kmutex_t cpu_node_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2820
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2821
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2822
 * Called from post_startup() and mp_startup()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2823
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2824
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2825
add_cpunode2devtree(processorid_t cpu_id, struct cpuid_info *cpi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2826
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2827
	dev_info_t *cpu_devi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2828
	int create;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2829
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2830
	mutex_enter(&cpu_node_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2831
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2832
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2833
	 * create a nexus node for all cpus identified as 'cpu_id' under
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2834
	 * the root node.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2835
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2836
	if (cpu_nex_devi == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2837
		if (ndi_devi_alloc(ddi_root_node(), "cpus",
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 771
diff changeset
  2838
		    (pnode_t)DEVI_SID_NODEID, &cpu_nex_devi) != NDI_SUCCESS) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2839
			mutex_exit(&cpu_node_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2840
			return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2841
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2842
		(void) ndi_devi_online(cpu_nex_devi, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2843
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2844
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2845
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2846
	 * create a child node for cpu identified as 'cpu_id'
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2847
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2848
	cpu_devi = ddi_add_child(cpu_nex_devi, "cpu", DEVI_SID_NODEID,
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  2849
	    cpu_id);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2850
	if (cpu_devi == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2851
		mutex_exit(&cpu_node_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2852
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2853
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2854
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2855
	/* device_type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2856
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2857
	(void) ndi_prop_update_string(DDI_DEV_T_NONE, cpu_devi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2858
	    "device_type", "cpu");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2859
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2860
	/* reg */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2861
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2862
	(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2863
	    "reg", cpu_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2864
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2865
	/* cpu-mhz, and clock-frequency */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2866
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2867
	if (cpu_freq > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2868
		long long mul;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2869
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2870
		(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2871
		    "cpu-mhz", cpu_freq);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2872
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2873
		if ((mul = cpu_freq * 1000000LL) <= INT_MAX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2874
			(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2875
			    "clock-frequency", (int)mul);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2876
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2877
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2878
	(void) ndi_devi_online(cpu_devi, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2879
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2880
	if ((x86_feature & X86_CPUID) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2881
		mutex_exit(&cpu_node_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2882
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2883
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2884
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2885
	/* vendor-id */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2886
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2887
	(void) ndi_prop_update_string(DDI_DEV_T_NONE, cpu_devi,
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  2888
	    "vendor-id", cpi->cpi_vendorstr);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2889
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2890
	if (cpi->cpi_maxeax == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2891
		mutex_exit(&cpu_node_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2892
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2893
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2894
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2895
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2896
	 * family, model, and step
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2897
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2898
	(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  2899
	    "family", CPI_FAMILY(cpi));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2900
	(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  2901
	    "cpu-model", CPI_MODEL(cpi));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2902
	(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  2903
	    "stepping-id", CPI_STEP(cpi));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2904
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2905
	/* type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2906
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2907
	switch (cpi->cpi_vendor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2908
	case X86_VENDOR_Intel:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2909
		create = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2910
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2911
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2912
		create = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2913
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2914
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2915
	if (create)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2916
		(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  2917
		    "type", CPI_TYPE(cpi));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2918
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2919
	/* ext-family */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2920
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2921
	switch (cpi->cpi_vendor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2922
	case X86_VENDOR_Intel:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2923
	case X86_VENDOR_AMD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2924
		create = cpi->cpi_family >= 0xf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2925
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2926
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2927
		create = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2928
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2929
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2930
	if (create)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2931
		(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2932
		    "ext-family", CPI_FAMILY_XTD(cpi));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2933
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2934
	/* ext-model */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2935
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2936
	switch (cpi->cpi_vendor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2937
	case X86_VENDOR_Intel:
2001
427a702b03e2 6427092 extended-model CPUID information is different between AMD and Intel
dmick
parents: 1975
diff changeset
  2938
		create = CPI_MODEL(cpi) == 0xf;
427a702b03e2 6427092 extended-model CPUID information is different between AMD and Intel
dmick
parents: 1975
diff changeset
  2939
		break;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2940
	case X86_VENDOR_AMD:
1582
eb879d43ab47 6323525 Mutual exclusion primitives don't work as expected on Opteron systems
kchow
parents: 1414
diff changeset
  2941
		create = CPI_FAMILY(cpi) == 0xf;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2942
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2943
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2944
		create = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2945
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2946
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2947
	if (create)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2948
		(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  2949
		    "ext-model", CPI_MODEL_XTD(cpi));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2950
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2951
	/* generation */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2952
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2953
	switch (cpi->cpi_vendor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2954
	case X86_VENDOR_AMD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2955
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2956
		 * AMD K5 model 1 was the first part to support this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2957
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2958
		create = cpi->cpi_xmaxeax >= 0x80000001;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2959
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2960
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2961
		create = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2962
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2963
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2964
	if (create)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2965
		(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2966
		    "generation", BITX((cpi)->cpi_extd[1].cp_eax, 11, 8));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2967
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2968
	/* brand-id */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2969
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2970
	switch (cpi->cpi_vendor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2971
	case X86_VENDOR_Intel:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2972
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2973
		 * brand id first appeared on Pentium III Xeon model 8,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2974
		 * and Celeron model 8 processors and Opteron
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2975
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2976
		create = cpi->cpi_family > 6 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2977
		    (cpi->cpi_family == 6 && cpi->cpi_model >= 8);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2978
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2979
	case X86_VENDOR_AMD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2980
		create = cpi->cpi_family >= 0xf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2981
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2982
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2983
		create = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2984
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2985
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2986
	if (create && cpi->cpi_brandid != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2987
		(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2988
		    "brand-id", cpi->cpi_brandid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2989
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2990
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2991
	/* chunks, and apic-id */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2992
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2993
	switch (cpi->cpi_vendor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2994
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2995
		 * first available on Pentium IV and Opteron (K8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2996
		 */
1975
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  2997
	case X86_VENDOR_Intel:
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  2998
		create = IS_NEW_F6(cpi) || cpi->cpi_family >= 0xf;
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  2999
		break;
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  3000
	case X86_VENDOR_AMD:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3001
		create = cpi->cpi_family >= 0xf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3002
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3003
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3004
		create = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3005
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3006
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3007
	if (create) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3008
		(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  3009
		    "chunks", CPI_CHUNKS(cpi));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3010
		(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  3011
		    "apic-id", CPI_APIC_ID(cpi));
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents: 1228
diff changeset
  3012
		if (cpi->cpi_chipid >= 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3013
			(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3014
			    "chip#", cpi->cpi_chipid);
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents: 1228
diff changeset
  3015
			(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents: 1228
diff changeset
  3016
			    "clog#", cpi->cpi_clogid);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents: 1228
diff changeset
  3017
		}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3018
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3019
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3020
	/* cpuid-features */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3021
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3022
	(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3023
	    "cpuid-features", CPI_FEATURES_EDX(cpi));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3024
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3025
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3026
	/* cpuid-features-ecx */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3027
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3028
	switch (cpi->cpi_vendor) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3029
	case X86_VENDOR_Intel:
1975
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  3030
		create = IS_NEW_F6(cpi) || cpi->cpi_family >= 0xf;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3031
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3032
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3033
		create = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3034
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3035
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3036
	if (create)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3037
		(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3038
		    "cpuid-features-ecx", CPI_FEATURES_ECX(cpi));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3039
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3040
	/* ext-cpuid-features */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3041
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3042
	switch (cpi->cpi_vendor) {
1975
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  3043
	case X86_VENDOR_Intel:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3044
	case X86_VENDOR_AMD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3045
	case X86_VENDOR_Cyrix:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3046
	case X86_VENDOR_TM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3047
	case X86_VENDOR_Centaur:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3048
		create = cpi->cpi_xmaxeax >= 0x80000001;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3049
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3050
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3051
		create = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3052
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3053
	}
1975
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  3054
	if (create) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3055
		(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  3056
		    "ext-cpuid-features", CPI_FEATURES_XTD_EDX(cpi));
1975
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  3057
		(void) ndi_prop_update_int(DDI_DEV_T_NONE, cpu_devi,
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  3058
		    "ext-cpuid-features-ecx", CPI_FEATURES_XTD_ECX(cpi));
1975
7490b056500b 6183891 Missing brand ID strings for several common x86 CPUs
dmick
parents: 1727
diff changeset
  3059
	}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3060
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3061
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3062
	 * Brand String first appeared in Intel Pentium IV, AMD K5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3063
	 * model 1, and Cyrix GXm.  On earlier models we try and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3064
	 * simulate something similar .. so this string should always
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3065
	 * same -something- about the processor, however lame.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3066
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3067
	(void) ndi_prop_update_string(DDI_DEV_T_NONE, cpu_devi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3068
	    "brand-string", cpi->cpi_brandstr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3069
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3070
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3071
	 * Finally, cache and tlb information
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3072
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3073
	switch (x86_which_cacheinfo(cpi)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3074
	case X86_VENDOR_Intel:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3075
		intel_walk_cacheinfo(cpi, cpu_devi, add_cacheent_props);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3076
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3077
	case X86_VENDOR_Cyrix:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3078
		cyrix_walk_cacheinfo(cpi, cpu_devi, add_cacheent_props);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3079
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3080
	case X86_VENDOR_AMD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3081
		amd_cache_info(cpi, cpu_devi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3082
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3083
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3084
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3085
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3086
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3087
	mutex_exit(&cpu_node_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3088
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3089
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3090
struct l2info {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3091
	int *l2i_csz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3092
	int *l2i_lsz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3093
	int *l2i_assoc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3094
	int l2i_ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3095
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3096
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3097
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3098
 * A cacheinfo walker that fetches the size, line-size and associativity
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3099
 * of the L2 cache
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3100
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3101
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3102
intel_l2cinfo(void *arg, const struct cachetab *ct)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3103
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3104
	struct l2info *l2i = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3105
	int *ip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3107
	if (ct->ct_label != l2_cache_str &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3108
	    ct->ct_label != sl2_cache_str)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3109
		return (0);	/* not an L2 -- keep walking */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3111
	if ((ip = l2i->l2i_csz) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3112
		*ip = ct->ct_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3113
	if ((ip = l2i->l2i_lsz) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3114
		*ip = ct->ct_line_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3115
	if ((ip = l2i->l2i_assoc) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3116
		*ip = ct->ct_assoc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3117
	l2i->l2i_ret = ct->ct_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3118
	return (1);		/* was an L2 -- terminate walk */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3119
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3121
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3122
amd_l2cacheinfo(struct cpuid_info *cpi, struct l2info *l2i)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3123
{
1228
9e051e1a3f68 6282049 CMT update needed for x86 CPU detection
andrei
parents: 938
diff changeset
  3124
	struct cpuid_regs *cp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3125
	uint_t size, assoc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3126
	int *ip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3128
	if (cpi->cpi_xmaxeax < 0x80000006)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3129
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3130
	cp = &cpi->cpi_extd[6];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3132
	if ((assoc = BITX(cp->cp_ecx, 15, 12)) != 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3133
	    (size = BITX(cp->cp_ecx, 31, 16)) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3134
		uint_t cachesz = size * 1024;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3136
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3137
		if ((ip = l2i->l2i_csz) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3138
			*ip = cachesz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3139
		if ((ip = l2i->l2i_lsz) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3140
			*ip = BITX(cp->cp_ecx, 7, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3141
		if ((ip = l2i->l2i_assoc) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3142
			*ip = assoc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3143
		l2i->l2i_ret = cachesz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3144
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3145
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3147
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3148
getl2cacheinfo(cpu_t *cpu, int *csz, int *lsz, int *assoc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3149
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3150
	struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3151
	struct l2info __l2info, *l2i = &__l2info;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3152
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3153
	l2i->l2i_csz = csz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3154
	l2i->l2i_lsz = lsz;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3155
	l2i->l2i_assoc = assoc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3156
	l2i->l2i_ret = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3157
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3158
	switch (x86_which_cacheinfo(cpi)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3159
	case X86_VENDOR_Intel:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3160
		intel_walk_cacheinfo(cpi, l2i, intel_l2cinfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3161
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3162
	case X86_VENDOR_Cyrix:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3163
		cyrix_walk_cacheinfo(cpi, l2i, intel_l2cinfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3164
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3165
	case X86_VENDOR_AMD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3166
		amd_l2cacheinfo(cpi, l2i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3167
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3168
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3169
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3170
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3171
	return (l2i->l2i_ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3172
}
4481
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  3173
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  3174
size_t
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  3175
cpuid_get_mwait_size(cpu_t *cpu)
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  3176
{
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  3177
	ASSERT(cpuid_checkpass(cpu, 2));
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  3178
	return (cpu->cpu_m.mcpu_cpi->cpi_mwait.mon_max);
2bb321aaf3c3 6495392 use monitor/mwait for halting idle CPUs where supported
bholler
parents: 4265
diff changeset
  3179
}