--- linux-2.4.0-test8/arch/i386/kernel/Makefile Sat Aug 26 00:01:34 2000 +++ linux/arch/i386/kernel/Makefile Thu Sep 14 20:17:09 2000 @@ -18,7 +18,7 @@ obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o vm86.o \ ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_i386.o \ - pci-dma.o i386_ksyms.o i387.o + pci-dma.o i386_ksyms.o i387.o bluesmoke.o ifdef CONFIG_PCI --- linux-2.4.0-test8/arch/i386/kernel/bluesmoke.c Thu Sep 14 20:27:41 2000 +++ linux/arch/i386/kernel/bluesmoke.c Thu Sep 14 20:13:11 2000 @@ -0,0 +1,110 @@ +/* + * Machine Check Handler For PII/PIII + */ + +#include +#include +#include +#include +#include +#include + +static int banks = 0; + +void mcheck_fault(void) +{ + int recover=1; + u32 alow, ahigh, high, low; + u32 mcgstl, mcgsth; + int i; + + rdmsr(0x17a, mcgstl, mcgsth); + if(mcgstl&(1<<0)) /* Recoverable ? */ + recover=0; + + printk(KERN_EMERG "CPU %d: Machine Check Exception: %08x%08x\n", smp_processor_id(), mcgsth, mcgstl); + + for(i=0;ix86_vendor!=X86_VENDOR_INTEL) + return; + + if(!(c->x86_capability&X86_FEATURE_MCE)) + return; + + if(!(c->x86_capability&X86_FEATURE_MCA)) + return; + + /* Ok machine check is available */ + + if(done==0) + printk(KERN_INFO "Intel machine check architecture supported.\n"); + rdmsr(0x179, l, h); + if(l&(1<<8)) + wrmsr(0x17b, 0xffffffff, 0xffffffff); + banks = l&0xff; + for(i=1;iloops_per_sec = loops_per_sec; c->x86_cache_size = -1; @@ -1475,9 +1476,10 @@ return; case X86_VENDOR_INTEL: - + squash_the_stupid_serial_number(c); - + mcheck_init(); + if (c->cpuid_level > 1) { /* supports eax=2 call */ int edx, dummy;