summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorSrihari Venkatesan <Srihari.Venkatesan@Sun.COM>2009-11-09 15:08:34 -0800
committerSrihari Venkatesan <Srihari.Venkatesan@Sun.COM>2009-11-09 15:08:34 -0800
commit1fbe4a4f9f2a67dc41ceb4553d9bcb182461f88e (patch)
tree859c377b7bb6bab7c032e890bef71a37fa88ad43 /usr/src
parent2eed61c310f9f7268ca7840628372d01749a4435 (diff)
downloadillumos-gate-1fbe4a4f9f2a67dc41ceb4553d9bcb182461f88e.tar.gz
6899212 cmi_hdl_impl structure is not exactly duplicated in the generic_cpu mdb module
6899220 chip_id is not correctly derived on Barcelona, leading to panics and/or wrong CPU topology
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/mdb/intel/modules/generic_cpu/gcpu.c2
-rw-r--r--usr/src/uts/i86pc/os/cpuid.c22
2 files changed, 14 insertions, 10 deletions
diff --git a/usr/src/cmd/mdb/intel/modules/generic_cpu/gcpu.c b/usr/src/cmd/mdb/intel/modules/generic_cpu/gcpu.c
index 4a41e4f140..f9b2cc676b 100644
--- a/usr/src/cmd/mdb/intel/modules/generic_cpu/gcpu.c
+++ b/usr/src/cmd/mdb/intel/modules/generic_cpu/gcpu.c
@@ -36,8 +36,8 @@ typedef struct cmi_hdl_impl {
uint_t cmih_procnodeid; /* Nodeid of cpu resource */
uint_t cmih_coreid; /* Core within die */
uint_t cmih_strandid; /* Thread within core */
- boolean_t cmih_mstrand; /* cores are multithreaded */
uint_t cmih_procnodes_per_pkg; /* Nodes in a processor */
+ boolean_t cmih_mstrand; /* cores are multithreaded */
volatile uint32_t *cmih_refcntp; /* Reference count pointer */
uint64_t cmih_msrsrc; /* MSR data source flags */
void *cmih_hdlpriv; /* cmi_hw.c private data */
diff --git a/usr/src/uts/i86pc/os/cpuid.c b/usr/src/uts/i86pc/os/cpuid.c
index fbe3064189..8e532685c7 100644
--- a/usr/src/uts/i86pc/os/cpuid.c
+++ b/usr/src/uts/i86pc/os/cpuid.c
@@ -591,7 +591,7 @@ cpuid_intel_getids(cpu_t *cpu, uint_t feature)
static void
cpuid_amd_getids(cpu_t *cpu)
{
- int first_half, mnc, coreidsz;
+ int i, first_half, coreidsz;
uint32_t nb_caps_reg;
uint_t node2_1;
struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi;
@@ -626,22 +626,25 @@ cpuid_amd_getids(cpu_t *cpu)
*/
cpi->cpi_ncore_per_chip =
BITX((cpi)->cpi_extd[8].cp_ecx, 7, 0) + 1;
- if (coreidsz == 0)
+ if (coreidsz == 0) {
/* Use legacy method */
- mnc = cpi->cpi_ncore_per_chip;
- else
- mnc = (1 << coreidsz);
+ for (i = 1; i < cpi->cpi_ncore_per_chip; i <<= 1)
+ coreidsz++;
+ if (coreidsz == 0)
+ coreidsz = 1;
+ }
} else {
/* Assume single-core part */
- cpi->cpi_ncore_per_chip = mnc = 1;
+ cpi->cpi_ncore_per_chip = 1;
}
- cpi->cpi_clogid = cpi->cpi_pkgcoreid = cpi->cpi_apicid & (mnc - 1);
+ cpi->cpi_clogid = cpi->cpi_pkgcoreid =
+ cpi->cpi_apicid & ((1<<coreidsz) - 1);
cpi->cpi_ncpu_per_chip = cpi->cpi_ncore_per_chip;
/* Get nodeID */
if (cpi->cpi_family == 0xf) {
- cpi->cpi_procnodeid = BITX(cpi->cpi_apicid, 3, mnc-1);
+ cpi->cpi_procnodeid = (cpi->cpi_apicid >> coreidsz) & 7;
cpi->cpi_chipid = cpi->cpi_procnodeid;
} else if (cpi->cpi_family == 0x10) {
/*
@@ -651,7 +654,8 @@ cpuid_amd_getids(cpu_t *cpu)
nb_caps_reg = pci_getl_func(0, 24, 3, 0xe8);
if ((cpi->cpi_model < 8) || BITX(nb_caps_reg, 29, 29) == 0) {
/* Single-node */
- cpi->cpi_procnodeid = BITX(cpi->cpi_apicid, 5, 3);
+ cpi->cpi_procnodeid = BITX(cpi->cpi_apicid, 5,
+ coreidsz);
cpi->cpi_chipid = cpi->cpi_procnodeid;
} else {