diff options
Diffstat (limited to 'arch/x86/kernel/apic/apic.c')
| -rw-r--r-- | arch/x86/kernel/apic/apic.c | 34 | 
1 files changed, 20 insertions, 14 deletions
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index 11544d8f1e9..edc24480469 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c @@ -1637,9 +1637,11 @@ static int __init apic_verify(void)  	mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;  	/* The BIOS may have set up the APIC at some other address */ -	rdmsr(MSR_IA32_APICBASE, l, h); -	if (l & MSR_IA32_APICBASE_ENABLE) -		mp_lapic_addr = l & MSR_IA32_APICBASE_BASE; +	if (boot_cpu_data.x86 >= 6) { +		rdmsr(MSR_IA32_APICBASE, l, h); +		if (l & MSR_IA32_APICBASE_ENABLE) +			mp_lapic_addr = l & MSR_IA32_APICBASE_BASE; +	}  	pr_info("Found and enabled local APIC!\n");  	return 0; @@ -1657,13 +1659,15 @@ int __init apic_force_enable(unsigned long addr)  	 * MSR. This can only be done in software for Intel P6 or later  	 * and AMD K7 (Model > 1) or later.  	 */ -	rdmsr(MSR_IA32_APICBASE, l, h); -	if (!(l & MSR_IA32_APICBASE_ENABLE)) { -		pr_info("Local APIC disabled by BIOS -- reenabling.\n"); -		l &= ~MSR_IA32_APICBASE_BASE; -		l |= MSR_IA32_APICBASE_ENABLE | addr; -		wrmsr(MSR_IA32_APICBASE, l, h); -		enabled_via_apicbase = 1; +	if (boot_cpu_data.x86 >= 6) { +		rdmsr(MSR_IA32_APICBASE, l, h); +		if (!(l & MSR_IA32_APICBASE_ENABLE)) { +			pr_info("Local APIC disabled by BIOS -- reenabling.\n"); +			l &= ~MSR_IA32_APICBASE_BASE; +			l |= MSR_IA32_APICBASE_ENABLE | addr; +			wrmsr(MSR_IA32_APICBASE, l, h); +			enabled_via_apicbase = 1; +		}  	}  	return apic_verify();  } @@ -2209,10 +2213,12 @@ static void lapic_resume(void)  		 * FIXME! This will be wrong if we ever support suspend on  		 * SMP! We'll need to do this as part of the CPU restore!  		 */ -		rdmsr(MSR_IA32_APICBASE, l, h); -		l &= ~MSR_IA32_APICBASE_BASE; -		l |= MSR_IA32_APICBASE_ENABLE | mp_lapic_addr; -		wrmsr(MSR_IA32_APICBASE, l, h); +		if (boot_cpu_data.x86 >= 6) { +			rdmsr(MSR_IA32_APICBASE, l, h); +			l &= ~MSR_IA32_APICBASE_BASE; +			l |= MSR_IA32_APICBASE_ENABLE | mp_lapic_addr; +			wrmsr(MSR_IA32_APICBASE, l, h); +		}  	}  	maxlvt = lapic_get_maxlvt();  |