Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756136AbYJHTZl (ORCPT ); Wed, 8 Oct 2008 15:25:41 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754862AbYJHTZ0 (ORCPT ); Wed, 8 Oct 2008 15:25:26 -0400 Received: from e28smtp03.in.ibm.com ([59.145.155.3]:34230 "EHLO e28esmtp03.in.ibm.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754876AbYJHTZY (ORCPT ); Wed, 8 Oct 2008 15:25:24 -0400 Date: Thu, 9 Oct 2008 00:55:12 +0530 From: "K.Prasad" To: Linux Kernel Mailing List Cc: Alan Stern , Roland McGrath , akpm@linux-foundation.org, mingo@elte.hu, jason.wessel@windriver.com, avi@qumranet.com, richardj_moore@uk.ibm.com Subject: [RFC Patch 5/9] Use wrapper routines around debug registers in processor related functions Message-ID: <20081008192512.GE4989@in.ibm.com> Reply-To: prasad@linux.vnet.ibm.com References: <20081008192044.GA4510@in.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20081008192044.GA4510@in.ibm.com> User-Agent: Mutt/1.5.18 (2008-05-17) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6333 Lines: 191 This patch enables the use of wrapper routines to access the debug/breakpoint registers. Signed-off-by: K.Prasad Signed-off-by: Alan Stern --- arch/x86/kernel/smpboot.c | 3 +++ arch/x86/power/cpu_32.c | 16 +++------------- arch/x86/power/cpu_64.c | 15 +++------------ include/asm-x86/debugreg.h | 29 +++++++++++++++++++++++++++++ include/asm-x86/processor.h | 10 +++------- 5 files changed, 41 insertions(+), 32 deletions(-) Index: linux-bkpt-lkml-27-rc9/arch/x86/power/cpu_32.c =================================================================== --- linux-bkpt-lkml-27-rc9.orig/arch/x86/power/cpu_32.c +++ linux-bkpt-lkml-27-rc9/arch/x86/power/cpu_32.c @@ -11,6 +11,7 @@ #include #include #include +#include static struct saved_context saved_context; @@ -46,6 +47,7 @@ static void __save_processor_state(struc ctxt->cr2 = read_cr2(); ctxt->cr3 = read_cr3(); ctxt->cr4 = read_cr4_safe(); + disable_debug_registers(); } /* Needed by apm.c */ @@ -78,19 +80,7 @@ static void fix_processor_context(void) load_TR_desc(); /* This does ltr */ load_LDT(¤t->active_mm->context); /* This does lldt */ - /* - * Now maybe reload the debug registers - */ - if (current->thread.debugreg7) { - set_debugreg(current->thread.debugreg0, 0); - set_debugreg(current->thread.debugreg1, 1); - set_debugreg(current->thread.debugreg2, 2); - set_debugreg(current->thread.debugreg3, 3); - /* no 4 and 5 */ - set_debugreg(current->thread.debugreg6, 6); - set_debugreg(current->thread.debugreg7, 7); - } - + load_debug_registers(); } static void __restore_processor_state(struct saved_context *ctxt) Index: linux-bkpt-lkml-27-rc9/arch/x86/power/cpu_64.c =================================================================== --- linux-bkpt-lkml-27-rc9.orig/arch/x86/power/cpu_64.c +++ linux-bkpt-lkml-27-rc9/arch/x86/power/cpu_64.c @@ -14,6 +14,7 @@ #include #include #include +#include static void fix_processor_context(void); @@ -69,6 +70,7 @@ static void __save_processor_state(struc ctxt->cr3 = read_cr3(); ctxt->cr4 = read_cr4(); ctxt->cr8 = read_cr8(); + disable_debug_registers(); } void save_processor_state(void) @@ -151,16 +153,5 @@ static void fix_processor_context(void) load_TR_desc(); /* This does ltr */ load_LDT(¤t->active_mm->context); /* This does lldt */ - /* - * Now maybe reload the debug registers - */ - if (current->thread.debugreg7){ - loaddebug(¤t->thread, 0); - loaddebug(¤t->thread, 1); - loaddebug(¤t->thread, 2); - loaddebug(¤t->thread, 3); - /* no 4 and 5 */ - loaddebug(¤t->thread, 6); - loaddebug(¤t->thread, 7); - } + load_debug_registers(); } Index: linux-bkpt-lkml-27-rc9/arch/x86/kernel/smpboot.c =================================================================== --- linux-bkpt-lkml-27-rc9.orig/arch/x86/kernel/smpboot.c +++ linux-bkpt-lkml-27-rc9/arch/x86/kernel/smpboot.c @@ -61,6 +61,7 @@ #include #include #include +#include #include #include @@ -342,6 +343,7 @@ static void __cpuinit start_secondary(vo setup_secondary_clock(); wmb(); + load_debug_registers(); cpu_idle(); } @@ -1382,6 +1384,7 @@ int __cpu_disable(void) remove_cpu_from_maps(cpu); unlock_vector_lock(); fixup_irqs(cpu_online_map); + disable_debug_registers(); return 0; } Index: linux-bkpt-lkml-27-rc9/include/asm-x86/debugreg.h =================================================================== --- linux-bkpt-lkml-27-rc9.orig/include/asm-x86/debugreg.h +++ linux-bkpt-lkml-27-rc9/include/asm-x86/debugreg.h @@ -49,6 +49,8 @@ #define DR_LOCAL_ENABLE_SHIFT 0 /* Extra shift to the local enable bit */ #define DR_GLOBAL_ENABLE_SHIFT 1 /* Extra shift to the global enable bit */ +#define DR_LOCAL_ENABLE (0x1) /* Local enable for reg 0 */ +#define DR_GLOBAL_ENABLE (0x2) /* Global enable for reg 0 */ #define DR_ENABLE_SIZE 2 /* 2 enable bits per register */ #define DR_LOCAL_ENABLE_MASK (0x55) /* Set local bits for all 4 regs */ @@ -67,4 +69,31 @@ #define DR_LOCAL_SLOWDOWN (0x100) /* Local slow the pipeline */ #define DR_GLOBAL_SLOWDOWN (0x200) /* Global slow the pipeline */ +/* + * HW breakpoint additions + */ +#ifdef __KERNEL__ + +#define HB_NUM 4 /* Number of hardware breakpoints */ + +/* For process management */ +void flush_thread_hw_breakpoint(struct task_struct *tsk); +int copy_thread_hw_breakpoint(struct task_struct *tsk, + struct task_struct *child, unsigned long clone_flags); +void dump_thread_hw_breakpoint(struct task_struct *tsk, int u_debugreg[8]); +void switch_to_thread_hw_breakpoint(struct task_struct *tsk); + +/* For CPU management */ +void load_debug_registers(void); +static inline void disable_debug_registers(void) +{ + set_debugreg(0UL, 7); +} + +/* For use by ptrace */ +unsigned long thread_get_debugreg(struct task_struct *tsk, int n); +int thread_set_debugreg(struct task_struct *tsk, int n, unsigned long val); + +#endif /* __KERNEL__ */ + #endif Index: linux-bkpt-lkml-27-rc9/include/asm-x86/processor.h =================================================================== --- linux-bkpt-lkml-27-rc9.orig/include/asm-x86/processor.h +++ linux-bkpt-lkml-27-rc9/include/asm-x86/processor.h @@ -381,13 +381,9 @@ struct thread_struct { unsigned long ip; unsigned long fs; unsigned long gs; - /* Hardware debugging registers: */ - unsigned long debugreg0; - unsigned long debugreg1; - unsigned long debugreg2; - unsigned long debugreg3; - unsigned long debugreg6; - unsigned long debugreg7; +/* Hardware breakpoint info */ + unsigned long vdr6; + struct thread_hw_breakpoint *hw_breakpoint_info; /* Fault info: */ unsigned long cr2; unsigned long trap_no; -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/