x86/smp: Dont access non-existing CPUID leaf
[linux-2.6-block.git] / arch / x86 / kernel / process.c
index 05924bc4b3af21ac7c346037008169e63689c658..ff9b80a0e3e3bc7f86f02b3c459d96e133f815e7 100644 (file)
@@ -763,6 +763,7 @@ struct cpumask cpus_stop_mask;
 
 void __noreturn stop_this_cpu(void *dummy)
 {
+       struct cpuinfo_x86 *c = this_cpu_ptr(&cpu_info);
        unsigned int cpu = smp_processor_id();
 
        local_irq_disable();
@@ -777,7 +778,7 @@ void __noreturn stop_this_cpu(void *dummy)
         */
        set_cpu_online(cpu, false);
        disable_local_APIC();
-       mcheck_cpu_clear(this_cpu_ptr(&cpu_info));
+       mcheck_cpu_clear(c);
 
        /*
         * Use wbinvd on processors that support SME. This provides support
@@ -791,7 +792,7 @@ void __noreturn stop_this_cpu(void *dummy)
         * Test the CPUID bit directly because the machine might've cleared
         * X86_FEATURE_SME due to cmdline options.
         */
-       if (cpuid_eax(0x8000001f) & BIT(0))
+       if (c->extended_cpuid_level >= 0x8000001f && (cpuid_eax(0x8000001f) & BIT(0)))
                native_wbinvd();
 
        /*