Watch exception handling for HARDWARE_WATCHPOINTS. Here we hook up the watch exception handler so that it sends SIGTRAP when the hardware watch registers are triggered. Signed-off-by: David Daney <ddaney@xxxxxxxxxx> --- arch/mips/kernel/genex.S | 4 ++++ arch/mips/kernel/traps.c | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 0 deletions(-) diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S index c6ada98..15a9bde 100644 --- a/arch/mips/kernel/genex.S +++ b/arch/mips/kernel/genex.S @@ -416,7 +416,11 @@ NESTED(nmi_handler, PT_SIZE, sp) BUILD_HANDLER tr tr sti silent /* #13 */ BUILD_HANDLER fpe fpe fpe silent /* #15 */ BUILD_HANDLER mdmx mdmx sti silent /* #22 */ +#ifdef CONFIG_HARDWARE_WATCHPOINTS + BUILD_HANDLER watch watch sti silent /* #23 */ +#else BUILD_HANDLER watch watch sti verbose /* #23 */ +#endif BUILD_HANDLER mcheck mcheck cli verbose /* #24 */ BUILD_HANDLER mt mt sti silent /* #25 */ BUILD_HANDLER dsp dsp sti silent /* #26 */ diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 824b187..22bb053 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c @@ -39,6 +39,7 @@ #include <asm/tlbdebug.h> #include <asm/traps.h> #include <asm/uaccess.h> +#include <asm/watch.h> #include <asm/mmu_context.h> #include <asm/types.h> #include <asm/stacktrace.h> @@ -871,6 +872,18 @@ asmlinkage void do_mdmx(struct pt_regs *regs) asmlinkage void do_watch(struct pt_regs *regs) { +#ifdef CONFIG_HARDWARE_WATCHPOINTS + /* + * If the current thread has the watch registers loaded, save + * their values and send SIGTRAP. Otherwise another thread + * left the registers set, clear them and continue. + */ + if (test_tsk_thread_flag(current, TIF_LOAD_WATCH)) { + mips_read_watch_registers(); + force_sig(SIGTRAP, current); + } else + mips_clear_watch_registers(); +#else if (board_watchpoint_handler) { (*board_watchpoint_handler)(regs); return; @@ -883,6 +896,7 @@ asmlinkage void do_watch(struct pt_regs *regs) dump_tlb_all(); show_regs(regs); panic("Caught WATCH exception - probably caused by stack overflow."); +#endif } asmlinkage void do_mcheck(struct pt_regs *regs) -- 1.5.5