alpha: don't open-code trace_report_syscall_{enter,exit}
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 27 May 2012 01:44:21 +0000 (21:44 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 1 Oct 2012 13:58:19 +0000 (09:58 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/alpha/kernel/entry.S
arch/alpha/kernel/ptrace.c

index 7e43e1156d10c98c4d360f238255e7f573ec6924..2a359c9ee3cd88a341550c57f34177288ee61ecd 100644 (file)
@@ -418,11 +418,10 @@ $work_notifysig:
 strace:
        /* set up signal stack, call syscall_trace */
        bsr     $1, do_switch_stack
-       jsr     $26, syscall_trace
+       jsr     $26, syscall_trace_enter /* returns the syscall number */
        bsr     $1, undo_switch_stack
 
-       /* get the system call number and the arguments back.. */
-       ldq     $0, 0($sp)
+       /* get the arguments back.. */
        ldq     $16, SP_OFF+24($sp)
        ldq     $17, SP_OFF+32($sp)
        ldq     $18, SP_OFF+40($sp)
@@ -449,7 +448,7 @@ $strace_success:
        stq     $0, 0($sp)              /* save return value */
 
        bsr     $1, do_switch_stack
-       jsr     $26, syscall_trace
+       jsr     $26, syscall_trace_leave
        bsr     $1, undo_switch_stack
        br      $31, ret_from_sys_call
 
@@ -467,7 +466,7 @@ $strace_error:
        bsr     $1, do_switch_stack
        mov     $19, $9         /* save old syscall number */
        mov     $20, $10        /* save old a3 */
-       jsr     $26, syscall_trace
+       jsr     $26, syscall_trace_leave
        mov     $9, $19
        mov     $10, $20
        bsr     $1, undo_switch_stack
@@ -698,7 +697,7 @@ sys_sigreturn:
        lda     $sp, -SWITCH_STACK_SIZE($sp)
        jsr     $26, do_sigreturn
        bne     $9, 1f
-       jsr     $26, syscall_trace
+       jsr     $26, syscall_trace_leave
 1:     br      $1, undo_switch_stack
        br      ret_from_sys_call
 .end sys_sigreturn
@@ -715,7 +714,7 @@ sys_rt_sigreturn:
        lda     $sp, -SWITCH_STACK_SIZE($sp)
        jsr     $26, do_rt_sigreturn
        bne     $9, 1f
-       jsr     $26, syscall_trace
+       jsr     $26, syscall_trace_leave
 1:     br      $1, undo_switch_stack
        br      ret_from_sys_call
 .end sys_rt_sigreturn
index 54616f496aedb27629d298329a43ff8447113300..2a4a80ff4a2064262ea04298dee0a3d6e12f66be 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/user.h>
 #include <linux/security.h>
 #include <linux/signal.h>
+#include <linux/tracehook.h>
 
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
@@ -312,25 +313,18 @@ long arch_ptrace(struct task_struct *child, long request,
        return ret;
 }
 
+asmlinkage unsigned long syscall_trace_enter(void)
+{
+       unsigned long ret = 0;
+       if (test_thread_flag(TIF_SYSCALL_TRACE) &&
+           tracehook_report_syscall_entry(current_pt_regs()))
+               ret = -1UL;
+       return ret ?: current_pt_regs()->r0;
+}
+
 asmlinkage void
-syscall_trace(void)
+syscall_trace_leave(void)
 {
-       if (!test_thread_flag(TIF_SYSCALL_TRACE))
-               return;
-       if (!(current->ptrace & PT_PTRACED))
-               return;
-       /* The 0x80 provides a way for the tracing parent to distinguish
-          between a syscall stop and SIGTRAP delivery */
-       ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
-                                ? 0x80 : 0));
-
-       /*
-        * This isn't the same as continuing with a signal, but it will do
-        * for normal use.  strace only continues with a signal if the
-        * stopping signal is not SIGTRAP.  -brl
-        */
-       if (current->exit_code) {
-               send_sig(current->exit_code, current, 1);
-               current->exit_code = 0;
-       }
+       if (test_thread_flag(TIF_SYSCALL_TRACE))
+               tracehook_report_syscall_exit(current_pt_regs(), 0);
 }