Messages in this thread Patch in this message | | | Date | Mon, 21 Apr 2008 17:21:50 -0700 | From | David Daney <> | Subject | [Patch 4/6] Watch trap handling for HARDWARE_WATCHPOINTS. |
| |
In this portion of the patch we hook up the watch trap handler. When the trap occurs, we copy the register contents into the thread_struct and send SIGTRAP. If the current thread was not expecting the trap, the watch register values must have been left over from a different context and we just clear the registers and return.
Also I turn off the message the prints on each trap, as these traps are now expected.
Signed-off-by: David Daney <ddaney@avtrex.com> --- arch/mips/kernel/genex.S | 4 ++++ arch/mips/kernel/traps.c | 13 +++++++++++++ 2 files changed, 17 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 984c0d0..6a5f3f0 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c @@ -887,6 +887,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; @@ -899,6 +911,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
| |