lkml.org 
[lkml]   [2008]   [Sep]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    SubjectRe: [RFC][PATCH] Demultiplexing SIGTRAP signal
    Date
    On Monday 22 September 2008 20:24:04 Ingo Molnar wrote:
    > * Srinivasa Ds <srinivasa@in.ibm.com> wrote:
    > > --- linux-2.6.27-rc7.orig/arch/ia64/include/asm/siginfo.h
    > > +++ linux-2.6.27-rc7/arch/ia64/include/asm/siginfo.h
    >
    > please do not send patches that modify include/asm/ files, the
    > include/asm-x86/ file should be modified instead.
    >
    > (this problem will go away in v2.6.28 when we'll move include/asm-x86/
    > to arch/x86/include/)
    >

    Ingo, Sorry if I have confused you. Arch specific header files of ia64 and powerpc are
    already moved to arch/ia64/include and arch/powerpc/include dirs.
    So I have developed patch against these files. So Resending patch again.

    Currently a SIGTRAP can denote any one of below reasons.
    - Breakpoint hit
    - H/W debug register hit
    - Single step
    - Signal sent through kill() or rasie()

    Architectures like powerpc/parisc provides infrastructure to demultiplex
    SIGTRAP signal by passing down the information for receiving SIGTRAP through
    si_code of siginfot_t structure. Here is an attempt is generalise this
    infrastructure by extending it to x86 and x86_64 archs.

    Signed-off-by: Srinivasa DS <srinivasa@in.ibm.com>


    ---
    arch/ia64/include/asm/siginfo.h | 5 -----
    arch/powerpc/include/asm/siginfo.h | 5 -----
    arch/x86/kernel/ptrace.c | 7 ++++---
    arch/x86/kernel/traps_32.c | 4 +++-
    arch/x86/kernel/traps_64.c | 2 +-
    include/asm-generic/siginfo.h | 2 ++
    include/asm-parisc/siginfo.h | 5 -----
    include/asm-x86/ptrace.h | 2 +-
    include/asm-x86/traps.h | 10 ++++++++++
    9 files changed, 21 insertions(+), 21 deletions(-)

    Index: linux-2.6.27-rc7/arch/ia64/include/asm/siginfo.h
    ===================================================================
    --- linux-2.6.27-rc7.orig/arch/ia64/include/asm/siginfo.h
    +++ linux-2.6.27-rc7/arch/ia64/include/asm/siginfo.h
    @@ -113,11 +113,6 @@ typedef struct siginfo {
    #undef NSIGSEGV
    #define NSIGSEGV 3

    -/*
    - * SIGTRAP si_codes
    - */
    -#define TRAP_BRANCH (__SI_FAULT|3) /* process taken branch trap */
    -#define TRAP_HWBKPT (__SI_FAULT|4) /* hardware breakpoint or watchpoint */
    #undef NSIGTRAP
    #define NSIGTRAP 4

    Index: linux-2.6.27-rc7/arch/powerpc/include/asm/siginfo.h
    ===================================================================
    --- linux-2.6.27-rc7.orig/arch/powerpc/include/asm/siginfo.h
    +++ linux-2.6.27-rc7/arch/powerpc/include/asm/siginfo.h
    @@ -15,11 +15,6 @@

    #include <asm-generic/siginfo.h>

    -/*
    - * SIGTRAP si_codes
    - */
    -#define TRAP_BRANCH (__SI_FAULT|3) /* process taken branch trap */
    -#define TRAP_HWBKPT (__SI_FAULT|4) /* hardware breakpoint or watchpoint */
    #undef NSIGTRAP
    #define NSIGTRAP 4

    Index: linux-2.6.27-rc7/arch/x86/kernel/traps_32.c
    ===================================================================
    --- linux-2.6.27-rc7.orig/arch/x86/kernel/traps_32.c
    +++ linux-2.6.27-rc7/arch/x86/kernel/traps_32.c
    @@ -891,6 +891,7 @@ void __kprobes do_debug(struct pt_regs *
    {
    struct task_struct *tsk = current;
    unsigned int condition;
    + int si_code;

    trace_hardirqs_fixup();

    @@ -935,8 +936,9 @@ void __kprobes do_debug(struct pt_regs *
    goto clear_TF_reenable;
    }

    + si_code = get_si_code((unsigned long)condition);
    /* Ok, finally something we can handle */
    - send_sigtrap(tsk, regs, error_code);
    + send_sigtrap(tsk, regs, error_code, si_code);

    /*
    * Disable additional traps. They'll be re-enabled when
    Index: linux-2.6.27-rc7/arch/x86/kernel/traps_64.c
    ===================================================================
    --- linux-2.6.27-rc7.orig/arch/x86/kernel/traps_64.c
    +++ linux-2.6.27-rc7/arch/x86/kernel/traps_64.c
    @@ -936,7 +936,7 @@ asmlinkage void __kprobes do_debug(struc
    tsk->thread.error_code = error_code;
    info.si_signo = SIGTRAP;
    info.si_errno = 0;
    - info.si_code = TRAP_BRKPT;
    + info.si_code = get_si_code(condition);
    info.si_addr = user_mode(regs) ? (void __user *)regs->ip : NULL;
    force_sig_info(SIGTRAP, &info, tsk);

    Index: linux-2.6.27-rc7/include/asm-generic/siginfo.h
    ===================================================================
    --- linux-2.6.27-rc7.orig/include/asm-generic/siginfo.h
    +++ linux-2.6.27-rc7/include/asm-generic/siginfo.h
    @@ -199,6 +199,8 @@ typedef struct siginfo {
    */
    #define TRAP_BRKPT (__SI_FAULT|1) /* process breakpoint */
    #define TRAP_TRACE (__SI_FAULT|2) /* process trace trap */
    +#define TRAP_BRANCH (__SI_FAULT|3) /* process taken branch trap */
    +#define TRAP_HWBKPT (__SI_FAULT|4) /* hardware breakpoint/watchpoint */
    #define NSIGTRAP 2

    /*
    Index: linux-2.6.27-rc7/include/asm-parisc/siginfo.h
    ===================================================================
    --- linux-2.6.27-rc7.orig/include/asm-parisc/siginfo.h
    +++ linux-2.6.27-rc7/include/asm-parisc/siginfo.h
    @@ -3,11 +3,6 @@

    #include <asm-generic/siginfo.h>

    -/*
    - * SIGTRAP si_codes
    - */
    -#define TRAP_BRANCH (__SI_FAULT|3) /* process taken branch trap */
    -#define TRAP_HWBKPT (__SI_FAULT|4) /* hardware breakpoint or watchpoint */
    #undef NSIGTRAP
    #define NSIGTRAP 4

    Index: linux-2.6.27-rc7/arch/x86/kernel/ptrace.c
    ===================================================================
    --- linux-2.6.27-rc7.orig/arch/x86/kernel/ptrace.c
    +++ linux-2.6.27-rc7/arch/x86/kernel/ptrace.c
    @@ -1357,7 +1357,8 @@ const struct user_regset_view *task_user
    #endif
    }

    -void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int error_code)
    +void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
    + int error_code, int si_code)
    {
    struct siginfo info;

    @@ -1366,7 +1367,7 @@ void send_sigtrap(struct task_struct *ts

    memset(&info, 0, sizeof(info));
    info.si_signo = SIGTRAP;
    - info.si_code = TRAP_BRKPT;
    + info.si_code = si_code;

    /* User-mode ip? */
    info.si_addr = user_mode_vm(regs) ? (void __user *) regs->ip : NULL;
    @@ -1476,5 +1477,5 @@ asmregparm void syscall_trace_leave(stru
    */
    if (test_thread_flag(TIF_SINGLESTEP) &&
    (current->ptrace & PT_PTRACED))
    - send_sigtrap(current, regs, 0);
    + send_sigtrap(current, regs, 0, TRAP_BRKPT);
    }
    Index: linux-2.6.27-rc7/include/asm-x86/traps.h
    ===================================================================
    --- linux-2.6.27-rc7.orig/include/asm-x86/traps.h
    +++ linux-2.6.27-rc7/include/asm-x86/traps.h
    @@ -36,6 +36,16 @@ void do_invalid_op(struct pt_regs *, lon
    void do_general_protection(struct pt_regs *, long);
    void do_nmi(struct pt_regs *, long);

    +static inline int get_si_code(unsigned long condition)
    +{
    + if (condition & DR_STEP)
    + return TRAP_TRACE;
    + else if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3))
    + return TRAP_HWBKPT;
    + else
    + return TRAP_BRKPT;
    +}
    +
    extern int panic_on_unrecovered_nmi;
    extern int kstack_depth_to_print;

    Index: linux-2.6.27-rc7/include/asm-x86/ptrace.h
    ===================================================================
    --- linux-2.6.27-rc7.orig/include/asm-x86/ptrace.h
    +++ linux-2.6.27-rc7/include/asm-x86/ptrace.h
    @@ -143,7 +143,7 @@ convert_ip_to_linear(struct task_struct

    #ifdef CONFIG_X86_32
    extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
    - int error_code);
    + int error_code, int si_code);
    #else
    void signal_fault(struct pt_regs *regs, void __user *frame, char *where);
    #endif

    \
     
     \ /
      Last update: 2008-09-23 11:57    [W:0.032 / U:23.160 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site