On Monday 22 September 2008 20:24:04 Ingo Molnar wrote: > * Srinivasa Ds <srinivasa@xxxxxxxxxx> 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@xxxxxxxxxx> --- 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 -- To unsubscribe from this list: send the line "unsubscribe linux-parisc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html