]> rtime.felk.cvut.cz Git - linux-imx.git/commitdiff
x86: unmask CPUID levels on Intel CPUs, fix
authorIngo Molnar <mingo@elte.hu>
Mon, 26 Jan 2009 03:30:41 +0000 (04:30 +0100)
committerIngo Molnar <mingo@elte.hu>
Mon, 26 Jan 2009 11:36:24 +0000 (12:36 +0100)
Impact: fix boot hang on pre-model-15 Intel CPUs

rdmsrl_safe() does not work in very early bootup code yet, because we
dont have the pagefault handler installed yet so exception section
does not get parsed. rdmsr_safe() will just crash and hang the bootup.

So limit the MSR_IA32_MISC_ENABLE MSR read to those CPU types that
support it.

Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/cpu/intel.c

index 43c1dcf0bec7a6ead00d7e62fd4e3fce50b6f1b7..549f2ada55f584bd045e13fb1e0c65a029f317e1 100644 (file)
 
 static void __cpuinit early_init_intel(struct cpuinfo_x86 *c)
 {
-       u64 misc_enable;
-
-       /* Unmask CPUID levels if masked */
-       if (!rdmsrl_safe(MSR_IA32_MISC_ENABLE, &misc_enable) &&
-           (misc_enable & MSR_IA32_MISC_ENABLE_LIMIT_CPUID)) {
-               misc_enable &= ~MSR_IA32_MISC_ENABLE_LIMIT_CPUID;
-               wrmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
-               c->cpuid_level = cpuid_eax(0);
+       /* Unmask CPUID levels if masked: */
+       if (c->x86 == 6 && c->x86_model >= 15) {
+               u64 misc_enable;
+
+               rdmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
+
+               if (misc_enable & MSR_IA32_MISC_ENABLE_LIMIT_CPUID) {
+                       misc_enable &= ~MSR_IA32_MISC_ENABLE_LIMIT_CPUID;
+                       wrmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
+                       c->cpuid_level = cpuid_eax(0);
+               }
        }
 
        if ((c->x86 == 0xf && c->x86_model >= 0x03) ||