diff options
author | Srinivasa Ds <srinivasa@in.ibm.com> | 2008-09-23 15:23:52 +0530 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-09-23 13:26:52 +0200 |
commit | da654b74bda14c45a7d98c731bf3c1a43b6b74e2 (patch) | |
tree | e3cc6f1a1f7300c07e59c9091cd2ede0c5da8d4d /include/asm-x86 | |
parent | 101d5b713700b902b1c200cdd1925c3cb7d34567 (diff) | |
download | op-kernel-dev-da654b74bda14c45a7d98c731bf3c1a43b6b74e2.zip op-kernel-dev-da654b74bda14c45a7d98c731bf3c1a43b6b74e2.tar.gz |
signals: demultiplexing SIGTRAP signal
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>
Cc: Roland McGrath <roland@redhat.com>
Cc: akpm@linux-foundation.org
Cc: paulus@samba.org
Cc: linuxppc-dev@ozlabs.org
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include/asm-x86')
-rw-r--r-- | include/asm-x86/ptrace.h | 2 | ||||
-rw-r--r-- | include/asm-x86/traps.h | 10 |
2 files changed, 11 insertions, 1 deletions
diff --git a/include/asm-x86/ptrace.h b/include/asm-x86/ptrace.h index fad8077..c2f3682 100644 --- a/include/asm-x86/ptrace.h +++ b/include/asm-x86/ptrace.h @@ -143,7 +143,7 @@ convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs); #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); #endif void signal_fault(struct pt_regs *regs, void __user *frame, char *where); diff --git a/include/asm-x86/traps.h b/include/asm-x86/traps.h index 2ccebc6..4b1e904 100644 --- a/include/asm-x86/traps.h +++ b/include/asm-x86/traps.h @@ -36,6 +36,16 @@ void do_invalid_op(struct pt_regs *, long); 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; |