diff options
Diffstat (limited to 'arch/powerpc/kernel/signal.c')
| -rw-r--r-- | arch/powerpc/kernel/signal.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c index 7aada783ec6a..a54405ebd7b0 100644 --- a/arch/powerpc/kernel/signal.c +++ b/arch/powerpc/kernel/signal.c | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | * this archive for more details. | 9 | * this archive for more details. |
| 10 | */ | 10 | */ |
| 11 | 11 | ||
| 12 | #include <linux/ptrace.h> | 12 | #include <linux/tracehook.h> |
| 13 | #include <linux/signal.h> | 13 | #include <linux/signal.h> |
| 14 | #include <asm/uaccess.h> | 14 | #include <asm/uaccess.h> |
| 15 | #include <asm/unistd.h> | 15 | #include <asm/unistd.h> |
| @@ -112,7 +112,7 @@ static void check_syscall_restart(struct pt_regs *regs, struct k_sigaction *ka, | |||
| 112 | } | 112 | } |
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | int do_signal(sigset_t *oldset, struct pt_regs *regs) | 115 | static int do_signal_pending(sigset_t *oldset, struct pt_regs *regs) |
| 116 | { | 116 | { |
| 117 | siginfo_t info; | 117 | siginfo_t info; |
| 118 | int signr; | 118 | int signr; |
| @@ -147,7 +147,7 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs) | |||
| 147 | */ | 147 | */ |
| 148 | if (current->thread.dabr) { | 148 | if (current->thread.dabr) { |
| 149 | set_dabr(current->thread.dabr); | 149 | set_dabr(current->thread.dabr); |
| 150 | #if defined(CONFIG_44x) || defined(CONFIG_BOOKE) | 150 | #if defined(CONFIG_BOOKE) |
| 151 | mtspr(SPRN_DBCR0, current->thread.dbcr0); | 151 | mtspr(SPRN_DBCR0, current->thread.dbcr0); |
| 152 | #endif | 152 | #endif |
| 153 | } | 153 | } |
| @@ -177,11 +177,28 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs) | |||
| 177 | * its frame, and we can clear the TLF_RESTORE_SIGMASK flag. | 177 | * its frame, and we can clear the TLF_RESTORE_SIGMASK flag. |
| 178 | */ | 178 | */ |
| 179 | current_thread_info()->local_flags &= ~_TLF_RESTORE_SIGMASK; | 179 | current_thread_info()->local_flags &= ~_TLF_RESTORE_SIGMASK; |
| 180 | |||
| 181 | /* | ||
| 182 | * Let tracing know that we've done the handler setup. | ||
| 183 | */ | ||
| 184 | tracehook_signal_handler(signr, &info, &ka, regs, | ||
| 185 | test_thread_flag(TIF_SINGLESTEP)); | ||
| 180 | } | 186 | } |
| 181 | 187 | ||
| 182 | return ret; | 188 | return ret; |
| 183 | } | 189 | } |
| 184 | 190 | ||
| 191 | void do_signal(struct pt_regs *regs, unsigned long thread_info_flags) | ||
| 192 | { | ||
| 193 | if (thread_info_flags & _TIF_SIGPENDING) | ||
| 194 | do_signal_pending(NULL, regs); | ||
| 195 | |||
| 196 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { | ||
| 197 | clear_thread_flag(TIF_NOTIFY_RESUME); | ||
| 198 | tracehook_notify_resume(regs); | ||
| 199 | } | ||
| 200 | } | ||
| 201 | |||
| 185 | long sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | 202 | long sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, |
| 186 | unsigned long r5, unsigned long r6, unsigned long r7, | 203 | unsigned long r5, unsigned long r6, unsigned long r7, |
| 187 | unsigned long r8, struct pt_regs *regs) | 204 | unsigned long r8, struct pt_regs *regs) |
