diff options
Diffstat (limited to 'arch/sparc64/kernel/signal.c')
-rw-r--r-- | arch/sparc64/kernel/signal.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/arch/sparc64/kernel/signal.c b/arch/sparc64/kernel/signal.c index 9667e96fd513..ec82d76dc6f2 100644 --- a/arch/sparc64/kernel/signal.c +++ b/arch/sparc64/kernel/signal.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * arch/sparc64/kernel/signal.c | 2 | * arch/sparc64/kernel/signal.c |
3 | * | 3 | * |
4 | * Copyright (C) 1991, 1992 Linus Torvalds | 4 | * Copyright (C) 1991, 1992 Linus Torvalds |
5 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | 5 | * Copyright (C) 1995, 2008 David S. Miller (davem@davemloft.net) |
6 | * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx) | 6 | * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx) |
7 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) | 7 | * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) |
8 | * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | 8 | * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) |
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/errno.h> | 17 | #include <linux/errno.h> |
18 | #include <linux/wait.h> | 18 | #include <linux/wait.h> |
19 | #include <linux/ptrace.h> | 19 | #include <linux/ptrace.h> |
20 | #include <linux/tracehook.h> | ||
20 | #include <linux/unistd.h> | 21 | #include <linux/unistd.h> |
21 | #include <linux/mm.h> | 22 | #include <linux/mm.h> |
22 | #include <linux/tty.h> | 23 | #include <linux/tty.h> |
@@ -89,7 +90,9 @@ asmlinkage void sparc64_set_context(struct pt_regs *regs) | |||
89 | err |= __get_user(regs->u_regs[UREG_G4], (&(*grp)[MC_G4])); | 90 | err |= __get_user(regs->u_regs[UREG_G4], (&(*grp)[MC_G4])); |
90 | err |= __get_user(regs->u_regs[UREG_G5], (&(*grp)[MC_G5])); | 91 | err |= __get_user(regs->u_regs[UREG_G5], (&(*grp)[MC_G5])); |
91 | err |= __get_user(regs->u_regs[UREG_G6], (&(*grp)[MC_G6])); | 92 | err |= __get_user(regs->u_regs[UREG_G6], (&(*grp)[MC_G6])); |
92 | err |= __get_user(regs->u_regs[UREG_G7], (&(*grp)[MC_G7])); | 93 | |
94 | /* Skip %g7 as that's the thread register in userspace. */ | ||
95 | |||
93 | err |= __get_user(regs->u_regs[UREG_I0], (&(*grp)[MC_O0])); | 96 | err |= __get_user(regs->u_regs[UREG_I0], (&(*grp)[MC_O0])); |
94 | err |= __get_user(regs->u_regs[UREG_I1], (&(*grp)[MC_O1])); | 97 | err |= __get_user(regs->u_regs[UREG_I1], (&(*grp)[MC_O1])); |
95 | err |= __get_user(regs->u_regs[UREG_I2], (&(*grp)[MC_O2])); | 98 | err |= __get_user(regs->u_regs[UREG_I2], (&(*grp)[MC_O2])); |
@@ -574,6 +577,8 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
574 | * clear the TS_RESTORE_SIGMASK flag. | 577 | * clear the TS_RESTORE_SIGMASK flag. |
575 | */ | 578 | */ |
576 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; | 579 | current_thread_info()->status &= ~TS_RESTORE_SIGMASK; |
580 | |||
581 | tracehook_signal_handler(signr, &info, &ka, regs, 0); | ||
577 | return; | 582 | return; |
578 | } | 583 | } |
579 | if (restart_syscall && | 584 | if (restart_syscall && |
@@ -605,4 +610,8 @@ void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long | |||
605 | { | 610 | { |
606 | if (thread_info_flags & _TIF_SIGPENDING) | 611 | if (thread_info_flags & _TIF_SIGPENDING) |
607 | do_signal(regs, orig_i0); | 612 | do_signal(regs, orig_i0); |
613 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { | ||
614 | clear_thread_flag(TIF_NOTIFY_RESUME); | ||
615 | tracehook_notify_resume(regs); | ||
616 | } | ||
608 | } | 617 | } |