Certain BMIPS platforms need to move the exception vectors and/or intercept NMI events. Add hooks to make this possible. Signed-off-by: Kevin Cernekee <cernekee@xxxxxxxxx> --- arch/mips/include/asm/traps.h | 2 ++ arch/mips/kernel/traps.c | 6 ++++++ 2 files changed, 8 insertions(+), 0 deletions(-) diff --git a/arch/mips/include/asm/traps.h b/arch/mips/include/asm/traps.h index 90ff2f4..2954bd9 100644 --- a/arch/mips/include/asm/traps.h +++ b/arch/mips/include/asm/traps.h @@ -22,7 +22,9 @@ extern void (*board_be_init)(void); extern int (*board_be_handler)(struct pt_regs *regs, int is_fixup); extern void (*board_nmi_handler_setup)(void); +extern void (*board_nmi_handler)(struct pt_regs *regs); extern void (*board_ejtag_handler_setup)(void); extern void (*board_bind_eic_interrupt)(int irq, int regset); +extern void (*board_ebase_setup)(void); #endif /* _ASM_TRAPS_H */ diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index cbea618..f98349c 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c @@ -90,8 +90,10 @@ extern int fpu_emulator_cop1Handler(struct pt_regs *xcp, void (*board_be_init)(void); int (*board_be_handler)(struct pt_regs *regs, int is_fixup); void (*board_nmi_handler_setup)(void); +void (*board_nmi_handler)(struct pt_regs *regs); void (*board_ejtag_handler_setup)(void); void (*board_bind_eic_interrupt)(int irq, int regset); +void (*board_ebase_setup)(void); static void show_raw_backtrace(unsigned long reg29) @@ -1343,6 +1345,8 @@ void ejtag_exception_handler(struct pt_regs *regs) */ NORET_TYPE void ATTRIB_NORET nmi_exception_handler(struct pt_regs *regs) { + if (board_nmi_handler) + board_nmi_handler(regs); bust_spinlocks(1); printk("NMI taken!!!!\n"); die("NMI", regs); @@ -1682,6 +1686,8 @@ void __init trap_init(void) ebase += (read_c0_ebase() & 0x3ffff000); } + if (board_ebase_setup) + board_ebase_setup(); per_cpu_trap_init(); /* -- 1.7.6.3