1 /* 2 * mce.c - x86 Machine Check Exception Reporting 3 * (c) 2002 Alan Cox <alan@lxorguk.ukuu.org.uk>, Dave Jones <davej@redhat.com> 4 */ 5 6 #include <linux/init.h> 7 #include <linux/types.h> 8 #include <linux/kernel.h> 9 #include <linux/module.h> 10 #include <linux/smp.h> 11 #include <linux/thread_info.h> 12 13 #include <asm/processor.h> 14 #include <asm/system.h> 15 #include <asm/mce.h> 16 17 #include "mce.h" 18 19 int mce_disabled; 20 int nr_mce_banks; 21 22 EXPORT_SYMBOL_GPL(nr_mce_banks); /* non-fatal.o */ 23 24 /* Handle unconfigured int18 (should never happen) */ unexpected_machine_check(struct pt_regs * regs,long error_code)25static void unexpected_machine_check(struct pt_regs *regs, long error_code) 26 { 27 printk(KERN_ERR "CPU#%d: Unexpected int18 (Machine Check).\n", smp_processor_id()); 28 } 29 30 /* Call the installed machine check handler for this CPU setup. */ 31 void (*machine_check_vector)(struct pt_regs *, long error_code) = unexpected_machine_check; 32 33 /* This has to be run for each processor */ mcheck_init(struct cpuinfo_x86 * c)34void mcheck_init(struct cpuinfo_x86 *c) 35 { 36 if (mce_disabled == 1) 37 return; 38 39 switch (c->x86_vendor) { 40 case X86_VENDOR_AMD: 41 amd_mcheck_init(c); 42 break; 43 44 case X86_VENDOR_INTEL: 45 if (c->x86 == 5) 46 intel_p5_mcheck_init(c); 47 if (c->x86 == 6) 48 intel_p6_mcheck_init(c); 49 if (c->x86 == 15) 50 intel_p4_mcheck_init(c); 51 break; 52 53 case X86_VENDOR_CENTAUR: 54 if (c->x86 == 5) 55 winchip_mcheck_init(c); 56 break; 57 58 default: 59 break; 60 } 61 } 62 63 static unsigned long old_cr4 __initdata; 64 stop_mce(void)65void __init stop_mce(void) 66 { 67 old_cr4 = read_cr4(); 68 clear_in_cr4(X86_CR4_MCE); 69 } 70 restart_mce(void)71void __init restart_mce(void) 72 { 73 if (old_cr4 & X86_CR4_MCE) 74 set_in_cr4(X86_CR4_MCE); 75 } 76 mcheck_disable(char * str)77static int __init mcheck_disable(char *str) 78 { 79 mce_disabled = 1; 80 return 1; 81 } 82 mcheck_enable(char * str)83static int __init mcheck_enable(char *str) 84 { 85 mce_disabled = -1; 86 return 1; 87 } 88 89 __setup("nomce", mcheck_disable); 90 __setup("mce", mcheck_enable); 91