summaryrefslogtreecommitdiffstats
path: root/sys/i386
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2009-05-04 18:05:27 +0000
committerjkim <jkim@FreeBSD.org>2009-05-04 18:05:27 +0000
commit3b0819d0afb64bc978363bcb108d66e47adb5af7 (patch)
treedfbbbc604e7bff5d5298c1ed21ea8133553ae877 /sys/i386
parent5a4e3bbf097e207785aa8560452ceef9b4bea804 (diff)
downloadFreeBSD-src-3b0819d0afb64bc978363bcb108d66e47adb5af7.zip
FreeBSD-src-3b0819d0afb64bc978363bcb108d66e47adb5af7.tar.gz
Unlock the largest standard CPUID on Intel CPUs for both amd64 and i386 and
fix SMP topology detection. On i386, we extend it to cover Core, Core 2, and Core i7 processors, not just Pentium 4 family, and move it to better place. On amd64, all supported Intel CPUs should have this MSR.
Diffstat (limited to 'sys/i386')
-rw-r--r--sys/i386/i386/identcpu.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/sys/i386/i386/identcpu.c b/sys/i386/i386/identcpu.c
index 60907a5..af0da5b 100644
--- a/sys/i386/i386/identcpu.c
+++ b/sys/i386/i386/identcpu.c
@@ -209,7 +209,6 @@ printcpuinfo(void)
if (cpu_vendor_id == CPU_VENDOR_INTEL) {
if ((cpu_id & 0xf00) > 0x300) {
u_int brand_index;
- u_int model;
cpu_model[0] = '\0';
@@ -322,16 +321,6 @@ printcpuinfo(void)
case 0xf00:
strcat(cpu_model, "Pentium 4");
cpu = CPU_P4;
- model = (cpu_id & 0x0f0) >> 4;
- if (model == 3 || model == 4 || model == 6) {
- uint64_t tmp;
-
- tmp = rdmsr(MSR_IA32_MISC_ENABLE);
- wrmsr(MSR_IA32_MISC_ENABLE,
- tmp & ~(1LL << 22));
- do_cpuid(0, regs);
- cpu_high = regs[0];
- }
break;
default:
strcat(cpu_model, "unknown");
@@ -1110,6 +1099,24 @@ finishidentcpu(void)
cpu_vendor_id = find_cpu_vendor_id();
+ /*
+ * Clear "Limit CPUID Maxval" bit and get the largest standard CPUID
+ * function number again if it is set from BIOS. It is necessary
+ * for probing correct CPU topology later.
+ * XXX This is only done on the BSP package.
+ */
+ if (cpu_vendor_id == CPU_VENDOR_INTEL && cpu_high > 0 && cpu_high < 4 &&
+ ((I386_CPU_FAMILY(cpu_id) == 0xf && I386_CPU_MODEL(cpu_id) >= 0x3) ||
+ (I386_CPU_FAMILY(cpu_id) == 0x6 && I386_CPU_MODEL(cpu_id) >= 0xe))) {
+ uint64_t msr;
+ msr = rdmsr(MSR_IA32_MISC_ENABLE);
+ if ((msr & 0x400000ULL) != 0) {
+ wrmsr(MSR_IA32_MISC_ENABLE, msr & ~0x400000ULL);
+ do_cpuid(0, regs);
+ cpu_high = regs[0];
+ }
+ }
+
/* Detect AMD features (PTE no-execute bit, 3dnow, 64 bit mode etc) */
if (cpu_vendor_id == CPU_VENDOR_INTEL ||
cpu_vendor_id == CPU_VENDOR_AMD) {
OpenPOWER on IntegriCloud