Merge to Fedora kernel-2.6.18-1.2224_FC5 patched with stable patch-2.6.18.1-vs2.0...
[linux-2.6.git] / arch / mips / kernel / ptrace.c
index ceaf3e9..25b696f 100644 (file)
@@ -14,7 +14,6 @@
  * At this time Linux/MIPS64 only supports syscall tracing, even for 32-bit
  * binaries.
  */
-#include <linux/config.h>
 #include <linux/compiler.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
@@ -120,11 +119,11 @@ int ptrace_getfpregs (struct task_struct *child, __u32 __user *data)
                        __put_user ((__u64) -1, i + (__u64 __user *) data);
        }
 
+       __put_user (child->thread.fpu.fcr31, data + 64);
+
        if (cpu_has_fpu) {
                unsigned int flags, tmp;
 
-               __put_user (child->thread.fpu.hard.fcr31, data + 64);
-
                preempt_disable();
                if (cpu_has_mipsmt) {
                        unsigned int vpflags = dvpe();
@@ -142,7 +141,6 @@ int ptrace_getfpregs (struct task_struct *child, __u32 __user *data)
                preempt_enable();
                __put_user (tmp, data + 65);
        } else {
-               __put_user (child->thread.fpu.soft.fcr31, data + 64);
                __put_user ((__u32) 0, data + 65);
        }
 
@@ -162,10 +160,7 @@ int ptrace_setfpregs (struct task_struct *child, __u32 __user *data)
        for (i = 0; i < 32; i++)
                __get_user (fregs[i], i + (__u64 __user *) data);
 
-       if (cpu_has_fpu)
-               __get_user (child->thread.fpu.hard.fcr31, data + 64);
-       else
-               __get_user (child->thread.fpu.soft.fcr31, data + 64);
+       __get_user (child->thread.fpu.fcr31, data + 64);
 
        /* FIR may not be written.  */
 
@@ -176,6 +171,9 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
 {
        int ret;
 
+       if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT))
+               goto out;
+
        switch (request) {
        /* when I and D space are separate, these will need to be fixed. */
        case PTRACE_PEEKTEXT: /* read word at location addr. */
@@ -241,10 +239,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                        tmp = regs->lo;
                        break;
                case FPC_CSR:
-                       if (cpu_has_fpu)
-                               tmp = child->thread.fpu.hard.fcr31;
-                       else
-                               tmp = child->thread.fpu.soft.fcr31;
+                       tmp = child->thread.fpu.fcr31;
                        break;
                case FPC_EIR: { /* implementation / version register */
                        unsigned int flags;
@@ -336,9 +331,9 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
 
                        if (!tsk_used_math(child)) {
                                /* FP not yet used  */
-                               memset(&child->thread.fpu.hard, ~0,
-                                      sizeof(child->thread.fpu.hard));
-                               child->thread.fpu.hard.fcr31 = 0;
+                               memset(&child->thread.fpu, ~0,
+                                      sizeof(child->thread.fpu));
+                               child->thread.fpu.fcr31 = 0;
                        }
 #ifdef CONFIG_32BIT
                        /*
@@ -369,10 +364,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                        regs->lo = data;
                        break;
                case FPC_CSR:
-                       if (cpu_has_fpu)
-                               child->thread.fpu.hard.fcr31 = data;
-                       else
-                               child->thread.fpu.soft.fcr31 = data;
+                       child->thread.fpu.fcr31 = data;
                        break;
                case DSP_BASE ... DSP_BASE + 5: {
                        dspreg_t *dregs;
@@ -486,28 +478,9 @@ asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit)
                audit_syscall_exit(AUDITSC_RESULT(regs->regs[2]),
                                   regs->regs[2]);
 
-       if (!(current->ptrace & PT_PTRACED))
-               goto out;
-       if (!test_thread_flag(TIF_SYSCALL_TRACE))
-               goto out;
-       if (!vx_check(vx_task_xid(child), VX_WATCH|VX_IDENT))
-               goto out_tsk;
-
-       /* 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));
+       if (test_thread_flag(TIF_SYSCALL_TRACE))
+               tracehook_report_syscall(regs, entryexit);
 
-       /*
-        * 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;
-       }
- out:
        if (unlikely(current->audit_context) && !entryexit)
                audit_syscall_entry(audit_arch(), regs->regs[2],
                                    regs->regs[4], regs->regs[5],