diff options
author | Srihari Venkatesan <Srihari.Venkatesan@Sun.COM> | 2009-11-09 15:08:34 -0800 |
---|---|---|
committer | Srihari Venkatesan <Srihari.Venkatesan@Sun.COM> | 2009-11-09 15:08:34 -0800 |
commit | 1fbe4a4f9f2a67dc41ceb4553d9bcb182461f88e (patch) | |
tree | 859c377b7bb6bab7c032e890bef71a37fa88ad43 /usr/src | |
parent | 2eed61c310f9f7268ca7840628372d01749a4435 (diff) | |
download | illumos-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.c | 2 | ||||
-rw-r--r-- | usr/src/uts/i86pc/os/cpuid.c | 22 |
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 { |