um: split syscall_trace(), pass pt_regs to it
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 23 May 2012 04:18:33 +0000 (00:18 -0400)
committerRichard Weinberger <richard@nod.at>
Wed, 1 Aug 2012 22:25:38 +0000 (00:25 +0200)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
[richard@nod.at: Fixed some minor build issues]
Signed-off-by: Richard Weinberger <richard@nod.at>
arch/um/include/asm/ptrace-generic.h
arch/um/kernel/ptrace.c
arch/um/kernel/skas/syscall.c

index e786a6a3ec5e88c3ae6fc61d2036096d79304fcc..442f1d025dc2f838096eaa5a77c066933a1db58d 100644 (file)
@@ -37,6 +37,8 @@ extern int putreg(struct task_struct *child, int regno, unsigned long value);
 
 extern int arch_copy_tls(struct task_struct *new);
 extern void clear_flushed_tls(struct task_struct *task);
+extern void syscall_trace_enter(struct pt_regs *regs);
+extern void syscall_trace_leave(struct pt_regs *regs);
 
 #endif
 
index 06b190390505f848a095648d2c555bd9d996604d..694d551c88996dbee7c974487b9299c9f1efc8fe 100644 (file)
@@ -3,11 +3,12 @@
  * Licensed under the GPL
  */
 
-#include "linux/audit.h"
-#include "linux/ptrace.h"
-#include "linux/sched.h"
-#include "asm/uaccess.h"
-#include "skas_ptrace.h"
+#include <linux/audit.h>
+#include <linux/ptrace.h>
+#include <linux/sched.h>
+#include <linux/tracehook.h>
+#include <asm/uaccess.h>
+#include <skas_ptrace.h>
 
 
 
@@ -162,48 +163,36 @@ static void send_sigtrap(struct task_struct *tsk, struct uml_pt_regs *regs,
  * XXX Check PT_DTRACE vs TIF_SINGLESTEP for singlestepping check and
  * PT_PTRACED vs TIF_SYSCALL_TRACE for syscall tracing check
  */
-void syscall_trace(struct uml_pt_regs *regs, int entryexit)
+void syscall_trace_enter(struct pt_regs *regs)
 {
-       int is_singlestep = (current->ptrace & PT_DTRACE) && entryexit;
-       int tracesysgood;
-
-       if (!entryexit)
-               audit_syscall_entry(HOST_AUDIT_ARCH,
-                                   UPT_SYSCALL_NR(regs),
-                                   UPT_SYSCALL_ARG1(regs),
-                                   UPT_SYSCALL_ARG2(regs),
-                                   UPT_SYSCALL_ARG3(regs),
-                                   UPT_SYSCALL_ARG4(regs));
-       else
-               audit_syscall_exit(regs);
-
-       /* Fake a debug trap */
-       if (is_singlestep)
-               send_sigtrap(current, regs, 0);
+       audit_syscall_entry(HOST_AUDIT_ARCH,
+                           UPT_SYSCALL_NR(&regs->regs),
+                           UPT_SYSCALL_ARG1(&regs->regs),
+                           UPT_SYSCALL_ARG2(&regs->regs),
+                           UPT_SYSCALL_ARG3(&regs->regs),
+                           UPT_SYSCALL_ARG4(&regs->regs));
 
        if (!test_thread_flag(TIF_SYSCALL_TRACE))
                return;
 
-       if (!(current->ptrace & PT_PTRACED))
-               return;
+       tracehook_report_syscall_entry(regs);
+}
 
-       /*
-        * the 0x80 provides a way for the tracing parent to distinguish
-        * between a syscall stop and SIGTRAP delivery
-        */
-       tracesysgood = (current->ptrace & PT_TRACESYSGOOD);
-       ptrace_notify(SIGTRAP | (tracesysgood ? 0x80 : 0));
+void syscall_trace_leave(struct pt_regs *regs)
+{
+       int ptraced = current->ptrace;
 
-       if (entryexit) /* force do_signal() --> is_syscall() */
-               set_thread_flag(TIF_SIGPENDING);
+       audit_syscall_exit(regs);
 
-       /*
-        * 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;
-       }
+       /* Fake a debug trap */
+       if (ptraced & PT_DTRACE)
+               send_sigtrap(current, &regs->regs, 0);
+
+       if (!test_thread_flag(TIF_SYSCALL_TRACE))
+               return;
+
+       tracehook_report_syscall_exit(regs, 0);
+       /* force do_signal() --> is_syscall() */
+       if (ptraced & PT_PTRACED)
+               set_thread_flag(TIF_SIGPENDING);
 }
index 800551a29dbf7281e5bb432f7d77451d1db42212..86368a025a9684e0bb4dea3707128c4693befe7c 100644 (file)
@@ -18,7 +18,7 @@ void handle_syscall(struct uml_pt_regs *r)
        long result;
        int syscall;
 
-       syscall_trace(r, 0);
+       syscall_trace_enter(regs);
 
        /*
         * This should go in the declaration of syscall, but when I do that,
@@ -36,5 +36,5 @@ void handle_syscall(struct uml_pt_regs *r)
 
        PT_REGS_SET_SYSCALL_RETURN(regs, result);
 
-       syscall_trace(r, 1);
+       syscall_trace_leave(regs);
 }