The FPU exceptions come in as TLB exceptions -- see if this is one of them, and act accordingly. Signed-off-by: Tomaso Paoletti <tpaoletti@xxxxxxxxxxxxxxxxxx> Signed-off-by: Paul Gortmaker <Paul.Gortmaker@xxxxxxxxxxxxx> Signed-off-by: David Daney <ddaney@xxxxxxxxxxxxxxxxxx> --- arch/mips/mm/fault.c | 16 ++++++++++++++++ 1 files changed, 16 insertions(+), 0 deletions(-) diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c index fa636fc..c8a3fb5 100644 --- a/arch/mips/mm/fault.c +++ b/arch/mips/mm/fault.c @@ -25,6 +25,7 @@ #include <asm/uaccess.h> #include <asm/ptrace.h> #include <asm/highmem.h> /* For VMALLOC_END */ +#include <asm/fpu_emulator.h> /* * This routine handles page faults. It determines the address, @@ -47,6 +48,21 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write, field, regs->cp0_epc); #endif +#ifdef CONFIG_CAVIUM_OCTEON_HW_FIX_UNALIGNED + /* + * Normally the FPU emulator uses a load word from address one + * to retake control of the CPU after executing the + * instruction in the delay slot of an emulated branch. The + * Octeon hardware unaligned access fix changes this from an + * address exception into a TLB exception. This code checks to + * see if this page fault was caused by an FPU emulation. + * + * Terminate if exception was recognized as a delay slot return. + */ + if (do_dsemulret(regs)) + return; +#endif + info.si_code = SEGV_MAPERR; /* -- 1.5.6.5