diff options
Diffstat (limited to 'arch/x86/kernel/cpu/intel.c')
| -rw-r--r-- | arch/x86/kernel/cpu/intel.c | 29 | 
1 files changed, 26 insertions, 3 deletions
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index 7437fa133c0..3260ab04499 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c @@ -86,6 +86,29 @@ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c)  	 */  	if (c->x86 == 6 && c->x86_model < 15)  		clear_cpu_cap(c, X86_FEATURE_PAT); + +#ifdef CONFIG_KMEMCHECK +	/* +	 * P4s have a "fast strings" feature which causes single- +	 * stepping REP instructions to only generate a #DB on +	 * cache-line boundaries. +	 * +	 * Ingo Molnar reported a Pentium D (model 6) and a Xeon +	 * (model 2) with the same problem. +	 */ +	if (c->x86 == 15) { +		u64 misc_enable; + +		rdmsrl(MSR_IA32_MISC_ENABLE, misc_enable); + +		if (misc_enable & MSR_IA32_MISC_ENABLE_FAST_STRING) { +			printk(KERN_INFO "kmemcheck: Disabling fast string operations\n"); + +			misc_enable &= ~MSR_IA32_MISC_ENABLE_FAST_STRING; +			wrmsrl(MSR_IA32_MISC_ENABLE, misc_enable); +		} +	} +#endif  }  #ifdef CONFIG_X86_32 @@ -229,12 +252,12 @@ static void __cpuinit intel_workarounds(struct cpuinfo_x86 *c)  }  #endif -static void __cpuinit srat_detect_node(void) +static void __cpuinit srat_detect_node(struct cpuinfo_x86 *c)  {  #if defined(CONFIG_NUMA) && defined(CONFIG_X86_64)  	unsigned node;  	int cpu = smp_processor_id(); -	int apicid = hard_smp_processor_id(); +	int apicid = cpu_has_apic ? hard_smp_processor_id() : c->apicid;  	/* Don't do the funky fallback heuristics the AMD version employs  	   for now. */ @@ -400,7 +423,7 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c)  	}  	/* Work around errata */ -	srat_detect_node(); +	srat_detect_node(c);  	if (cpu_has(c, X86_FEATURE_VMX))  		detect_vmx_virtcap(c);  |