Merge to Fedora kernel-2.6.18-1.2255_FC5-vs2.0.2.2-rc9 patched with stable patch...
[linux-2.6.git] / arch / arm / kernel / ptrace.c
index b145c7e..9254ba2 100644 (file)
@@ -812,18 +812,34 @@ asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno)
 {
        unsigned long ip;
 
-       if (test_thread_flag(TIF_SYSCALL_TRACE)) {
-               /*
-                * Save IP.  IP is used to denote syscall entry/exit:
-                *  IP = 0 -> entry, = 1 -> exit
-                */
-               ip = regs->ARM_ip;
-               regs->ARM_ip = why;
-
-               tracehook_report_syscall(regs, why);
-
-               regs->ARM_ip = ip;
+       if (!test_thread_flag(TIF_SYSCALL_TRACE))
+               return scno;
+       if (!(current->ptrace & PT_PTRACED))
+               return scno;
+
+       /*
+        * Save IP.  IP is used to denote syscall entry/exit:
+        *  IP = 0 -> entry, = 1 -> exit
+        */
+       ip = regs->ARM_ip;
+       regs->ARM_ip = why;
+
+       current->ptrace_message = scno;
+
+       /* 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;
        }
+       regs->ARM_ip = ip;
 
-       return scno;
+       return current->ptrace_message;
 }