On Fri, May 03, 2002 at 04:41:56PM -0700, Jun Sun wrote: > It appears earlier version of kernel does not have this problem. I have not > fully figured out why. We didn't handle exceptions in branch delay slots. Try this patch and tell me if it helps. Ralf Index: arch/mips/mm/fault.c =================================================================== RCS file: /home/pub/cvs/linux/arch/mips/mm/fault.c,v retrieving revision 1.25.2.2 diff -u -r1.25.2.2 fault.c --- arch/mips/mm/fault.c 16 Jan 2002 03:49:24 -0000 1.25.2.2 +++ arch/mips/mm/fault.c 4 May 2002 01:28:34 -0000 @@ -19,6 +19,7 @@ #include <linux/smp_lock.h> #include <linux/version.h> +#include <asm/branch.h> #include <asm/hardirq.h> #include <asm/pgalloc.h> #include <asm/mmu_context.h> @@ -77,7 +78,7 @@ struct vm_area_struct * vma; struct task_struct *tsk = current; struct mm_struct *mm = tsk->mm; - unsigned long fixup; + unsigned long epc, fixup; siginfo_t info; /* @@ -181,7 +182,8 @@ no_context: /* Are we prepared to handle this kernel fault? */ - fixup = search_exception_table(regs->cp0_epc); + epc = regs->cp0_epc + delay_slot(regs) ? 4 : 0; + fixup = search_exception_table(epc); if (fixup) { long new_epc; Index: arch/mips64/mm/fault.c =================================================================== RCS file: /home/pub/cvs/linux/arch/mips64/mm/fault.c,v retrieving revision 1.26.2.6 diff -u -r1.26.2.6 fault.c --- arch/mips64/mm/fault.c 23 Feb 2002 02:16:42 -0000 1.26.2.6 +++ arch/mips64/mm/fault.c 4 May 2002 01:28:34 -0000 @@ -21,6 +21,7 @@ #include <linux/smp_lock.h> #include <linux/version.h> +#include <asm/branch.h> #include <asm/hardirq.h> #include <asm/pgalloc.h> #include <asm/mmu_context.h> @@ -103,7 +104,7 @@ struct vm_area_struct * vma; struct task_struct *tsk = current; struct mm_struct *mm = tsk->mm; - unsigned long fixup; + unsigned long epc, fixup; siginfo_t info; #if 0 @@ -208,7 +209,8 @@ no_context: /* Are we prepared to handle this kernel fault? */ - fixup = search_exception_table(regs->cp0_epc); + epc = regs->cp0_epc + delay_slot(regs) ? 4 : 0; + fixup = search_exception_table(epc); if (fixup) { long new_epc;