Due to errata 5652 we might sometimes end up with duplicate SLB entries. This causes a machine check, so detect it (and print debug info), but recover instead of killing the process and/or crashing the machine. Index: 2.6.21/arch/powerpc/platforms/pasemi/setup.c =================================================================== --- 2.6.21.orig/arch/powerpc/platforms/pasemi/setup.c +++ 2.6.21/arch/powerpc/platforms/pasemi/setup.c @@ -36,6 +36,7 @@ #include #include #include +#include #include "pasemi.h" @@ -176,7 +177,7 @@ static int pas_machine_check_handler(str { int cpu = smp_processor_id(); unsigned long srr0, srr1, dsisr; - int dump_slb = 0; + int dump_slb = 0, flush_slb = 0; int dump_memsta = 0; srr0 = regs->nip; @@ -200,6 +201,7 @@ static int pas_machine_check_handler(str if (dsisr & 0x2000) { printk(KERN_ERR "MMU SLB multi-hit or invalid B field\n"); dump_slb = 1; + flush_slb = 1; } if (dsisr & 0x1000) printk(KERN_ERR "Recoverable Duptags\n"); @@ -215,6 +217,7 @@ static int pas_machine_check_handler(str if (srr1 & 0x40000) { printk(KERN_ERR "I-side SLB multiple hit\n"); dump_slb = 1; + flush_slb = 1; } if (srr1 & 0x20000) { printk(KERN_ERR "I-cache parity error hit\n"); @@ -243,6 +246,10 @@ static int pas_machine_check_handler(str } } + if (flush_slb) + /* We really can recover from this. flush, rebolt and go. */ + slb_flush_and_rebolt(); + /* SRR1[62] is from MSR[62] if recoverable, so pass that back */ return !!(srr1 & 0x2); } --