lkml.org 
[lkml]   [2009]   [Feb]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[Patch 4/10] Introduce virtual debug register in thread_struct and wrapper-routines around process related functions

    Introduce virtual debug register in thread_struct and wrapper-routines around
    process related functions

    From: Alan Stern <stern@rowland.harvard.edu>

    This patch introduces virtual debug registers to used by the per-thread
    structure ad wrapper routines to manage debug registers by process-related
    functions.

    [K.Prasad: Split-out from the bigger patch and minor changes following
    re-basing]

    Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
    Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
    ---
    arch/x86/include/asm/debugreg.h | 27 +++++++++++++++++++++++++++
    arch/x86/include/asm/processor.h | 10 +++-------
    2 files changed, 30 insertions(+), 7 deletions(-)

    Index: linux-2.6-tip.hbkpt/arch/x86/include/asm/debugreg.h
    ===================================================================
    --- linux-2.6-tip.hbkpt.orig/arch/x86/include/asm/debugreg.h
    +++ linux-2.6-tip.hbkpt/arch/x86/include/asm/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,29 @@
    #define DR_LOCAL_SLOWDOWN (0x100) /* Local slow the pipeline */
    #define DR_GLOBAL_SLOWDOWN (0x200) /* Global slow the pipeline */

    +/*
    + * HW breakpoint additions
    + */
    +#ifdef __KERNEL__
    +
    +/* 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 /* _ASM_X86_DEBUGREG_H */
    Index: linux-2.6-tip.hbkpt/arch/x86/include/asm/processor.h
    ===================================================================
    --- linux-2.6-tip.hbkpt.orig/arch/x86/include/asm/processor.h
    +++ linux-2.6-tip.hbkpt/arch/x86/include/asm/processor.h
    @@ -427,13 +427,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;

    \
     
     \ /
      Last update: 2009-02-13 17:31    [W:4.638 / U:0.204 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site