diff options
author | Srinivasa Ds <srinivasa@in.ibm.com> | 2008-09-23 05:53:52 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-09-23 07:26:52 -0400 |
commit | da654b74bda14c45a7d98c731bf3c1a43b6b74e2 (patch) | |
tree | e3cc6f1a1f7300c07e59c9091cd2ede0c5da8d4d /include | |
parent | 101d5b713700b902b1c200cdd1925c3cb7d34567 (diff) |
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')
-rw-r--r-- | include/asm-generic/siginfo.h | 2 | ||||
-rw-r--r-- | include/asm-parisc/siginfo.h | 5 | ||||
-rw-r--r-- | include/asm-x86/ptrace.h | 2 | ||||
-rw-r--r-- | include/asm-x86/traps.h | 10 |
4 files changed, 13 insertions, 6 deletions
diff --git a/include/asm-generic/siginfo.h b/include/asm-generic/siginfo.h index 8786e01e0db8..969570167e9e 100644 --- a/include/asm-generic/siginfo.h +++ b/include/asm-generic/siginfo.h | |||
@@ -199,6 +199,8 @@ typedef struct siginfo { | |||
199 | */ | 199 | */ |
200 | #define TRAP_BRKPT (__SI_FAULT|1) /* process breakpoint */ | 200 | #define TRAP_BRKPT (__SI_FAULT|1) /* process breakpoint */ |
201 | #define TRAP_TRACE (__SI_FAULT|2) /* process trace trap */ | 201 | #define TRAP_TRACE (__SI_FAULT|2) /* process trace trap */ |
202 | #define TRAP_BRANCH (__SI_FAULT|3) /* process taken branch trap */ | ||
203 | #define TRAP_HWBKPT (__SI_FAULT|4) /* hardware breakpoint/watchpoint */ | ||
202 | #define NSIGTRAP 2 | 204 | #define NSIGTRAP 2 |
203 | 205 | ||
204 | /* | 206 | /* |
diff --git a/include/asm-parisc/siginfo.h b/include/asm-parisc/siginfo.h index d4909f55fe35..d7034728f377 100644 --- a/include/asm-parisc/siginfo.h +++ b/include/asm-parisc/siginfo.h | |||
@@ -3,11 +3,6 @@ | |||
3 | 3 | ||
4 | #include <asm-generic/siginfo.h> | 4 | #include <asm-generic/siginfo.h> |
5 | 5 | ||
6 | /* | ||
7 | * SIGTRAP si_codes | ||
8 | */ | ||
9 | #define TRAP_BRANCH (__SI_FAULT|3) /* process taken branch trap */ | ||
10 | #define TRAP_HWBKPT (__SI_FAULT|4) /* hardware breakpoint or watchpoint */ | ||
11 | #undef NSIGTRAP | 6 | #undef NSIGTRAP |
12 | #define NSIGTRAP 4 | 7 | #define NSIGTRAP 4 |
13 | 8 | ||
diff --git a/include/asm-x86/ptrace.h b/include/asm-x86/ptrace.h index fad807769910..c2f368273079 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); | |||
143 | 143 | ||
144 | #ifdef CONFIG_X86_32 | 144 | #ifdef CONFIG_X86_32 |
145 | extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, | 145 | extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, |
146 | int error_code); | 146 | int error_code, int si_code); |
147 | #endif | 147 | #endif |
148 | 148 | ||
149 | void signal_fault(struct pt_regs *regs, void __user *frame, char *where); | 149 | 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 2ccebc6fb0b0..4b1e90409251 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); | |||
36 | void do_general_protection(struct pt_regs *, long); | 36 | void do_general_protection(struct pt_regs *, long); |
37 | void do_nmi(struct pt_regs *, long); | 37 | void do_nmi(struct pt_regs *, long); |
38 | 38 | ||
39 | static inline int get_si_code(unsigned long condition) | ||
40 | { | ||
41 | if (condition & DR_STEP) | ||
42 | return TRAP_TRACE; | ||
43 | else if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3)) | ||
44 | return TRAP_HWBKPT; | ||
45 | else | ||
46 | return TRAP_BRKPT; | ||
47 | } | ||
48 | |||
39 | extern int panic_on_unrecovered_nmi; | 49 | extern int panic_on_unrecovered_nmi; |
40 | extern int kstack_depth_to_print; | 50 | extern int kstack_depth_to_print; |
41 | 51 | ||