diff options
Diffstat (limited to 'arch/x86/kernel/cpu/intel.c')
| -rw-r--r-- | arch/x86/kernel/cpu/intel.c | 21 | 
1 files changed, 21 insertions, 0 deletions
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index 7e1cca13af3..1366c7cfd48 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c @@ -47,6 +47,27 @@ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c)  		(c->x86 == 0x6 && c->x86_model >= 0x0e))  		set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); +	/* +	 * Atom erratum AAE44/AAF40/AAG38/AAH41: +	 * +	 * A race condition between speculative fetches and invalidating +	 * a large page.  This is worked around in microcode, but we +	 * need the microcode to have already been loaded... so if it is +	 * not, recommend a BIOS update and disable large pages. +	 */ +	if (c->x86 == 6 && c->x86_model == 0x1c && c->x86_mask <= 2) { +		u32 ucode, junk; + +		wrmsr(MSR_IA32_UCODE_REV, 0, 0); +		sync_core(); +		rdmsr(MSR_IA32_UCODE_REV, junk, ucode); + +		if (ucode < 0x20e) { +			printk(KERN_WARNING "Atom PSE erratum detected, BIOS microcode update recommended\n"); +			clear_cpu_cap(c, X86_FEATURE_PSE); +		} +	} +  #ifdef CONFIG_X86_64  	set_cpu_cap(c, X86_FEATURE_SYSENTER32);  #else  |