]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/sparc64/kernel/signal.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
[linux-2.6-omap-h63xx.git] / arch / sparc64 / kernel / signal.c
index 9667e96fd5138ba3531f507d8292483e40242a80..ca5a6ae3a6e2b37c77bcedb7bb18523cd95d615b 100644 (file)
@@ -2,7 +2,7 @@
  *  arch/sparc64/kernel/signal.c
  *
  *  Copyright (C) 1991, 1992  Linus Torvalds
- *  Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
+ *  Copyright (C) 1995, 2008 David S. Miller (davem@davemloft.net)
  *  Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
  *  Copyright (C) 1997 Eddie C. Dost   (ecd@skynet.be)
  *  Copyright (C) 1997,1998 Jakub Jelinek   (jj@sunsite.mff.cuni.cz)
 #include <linux/errno.h>
 #include <linux/wait.h>
 #include <linux/ptrace.h>
+#include <linux/tracehook.h>
 #include <linux/unistd.h>
 #include <linux/mm.h>
 #include <linux/tty.h>
 #include <linux/binfmts.h>
 #include <linux/bitops.h>
+#include <linux/tracehook.h>
 
 #include <asm/uaccess.h>
 #include <asm/ptrace.h>
@@ -89,7 +91,9 @@ asmlinkage void sparc64_set_context(struct pt_regs *regs)
        err |= __get_user(regs->u_regs[UREG_G4], (&(*grp)[MC_G4]));
        err |= __get_user(regs->u_regs[UREG_G5], (&(*grp)[MC_G5]));
        err |= __get_user(regs->u_regs[UREG_G6], (&(*grp)[MC_G6]));
-       err |= __get_user(regs->u_regs[UREG_G7], (&(*grp)[MC_G7]));
+
+       /* Skip %g7 as that's the thread register in userspace.  */
+
        err |= __get_user(regs->u_regs[UREG_I0], (&(*grp)[MC_O0]));
        err |= __get_user(regs->u_regs[UREG_I1], (&(*grp)[MC_O1]));
        err |= __get_user(regs->u_regs[UREG_I2], (&(*grp)[MC_O2]));
@@ -574,6 +578,8 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
                 * clear the TS_RESTORE_SIGMASK flag.
                 */
                current_thread_info()->status &= ~TS_RESTORE_SIGMASK;
+
+               tracehook_signal_handler(signr, &info, &ka, regs, 0);
                return;
        }
        if (restart_syscall &&
@@ -605,4 +611,8 @@ void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long
 {
        if (thread_info_flags & _TIF_SIGPENDING)
                do_signal(regs, orig_i0);
+       if (thread_info_flags & _TIF_NOTIFY_RESUME) {
+               clear_thread_flag(TIF_NOTIFY_RESUME);
+               tracehook_notify_resume(regs);
+       }
 }