From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755711AbYD2Bhm (ORCPT ); Mon, 28 Apr 2008 21:37:42 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751526AbYD2Bhe (ORCPT ); Mon, 28 Apr 2008 21:37:34 -0400 Received: from smtp1.dnsmadeeasy.com ([205.234.170.144]:49707 "EHLO smtp1.dnsmadeeasy.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751242AbYD2Bhd (ORCPT ); Mon, 28 Apr 2008 21:37:33 -0400 X-Authenticated-Name: js.dnsmadeeasy X-Transit-System: In case of SPAM please contact abuse@dnsmadeeasy.com Message-ID: <48167BDB.4080501@avtrex.com> Date: Mon, 28 Apr 2008 18:37:31 -0700 From: David Daney User-Agent: Thunderbird 2.0.0.12 (X11/20080226) MIME-Version: 1.0 To: linux-mips@linux-mips.org Cc: Linux kernel Subject: [PATCH 4/6] Watch exception handling for HARDWARE_WATCHPOINTS. References: <48167832.3090103@avtrex.com> In-Reply-To: <48167832.3090103@avtrex.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 29 Apr 2008 01:37:31.0869 (UTC) FILETIME=[979B58D0:01C8A999] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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 #include #include +#include #include #include #include @@ -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