linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / arch / mips / kernel / ptrace32.c
index f40ecd8..0d5cf97 100644 (file)
@@ -166,26 +166,19 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data)
                        tmp = regs->lo;
                        break;
                case FPC_CSR:
-                       tmp = child->thread.fpu.fcr31;
+                       if (cpu_has_fpu)
+                               tmp = child->thread.fpu.hard.fcr31;
+                       else
+                               tmp = child->thread.fpu.soft.fcr31;
                        break;
                case FPC_EIR: { /* implementation / version register */
                        unsigned int flags;
-#ifdef CONFIG_MIPS_MT_SMTC
-                       unsigned int irqflags;
-                       unsigned int mtflags;
-#endif /* CONFIG_MIPS_MT_SMTC */
 
                        if (!cpu_has_fpu) {
                                tmp = 0;
                                break;
                        }
 
-#ifdef CONFIG_MIPS_MT_SMTC
-                       /* Read-modify-write of Status must be atomic */
-                       local_irq_save(irqflags);
-                       mtflags = dmt();
-#endif /* CONFIG_MIPS_MT_SMTC */
-
                        preempt_disable();
                        if (cpu_has_mipsmt) {
                                unsigned int vpflags = dvpe();
@@ -200,10 +193,6 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data)
                                __asm__ __volatile__("cfc1\t%0,$0": "=r" (tmp));
                                write_c0_status(flags);
                        }
-#ifdef CONFIG_MIPS_MT_SMTC
-                       emt(mtflags);
-                       local_irq_restore(irqflags);
-#endif /* CONFIG_MIPS_MT_SMTC */
                        preempt_enable();
                        break;
                }
@@ -285,9 +274,9 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data)
 
                        if (!tsk_used_math(child)) {
                                /* FP not yet used  */
-                               memset(&child->thread.fpu, ~0,
-                                      sizeof(child->thread.fpu));
-                               child->thread.fpu.fcr31 = 0;
+                               memset(&child->thread.fpu.hard, ~0,
+                                      sizeof(child->thread.fpu.hard));
+                               child->thread.fpu.hard.fcr31 = 0;
                        }
                        /*
                         * The odd registers are actually the high order bits
@@ -315,7 +304,10 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data)
                        regs->lo = data;
                        break;
                case FPC_CSR:
-                       child->thread.fpu.fcr31 = data;
+                       if (cpu_has_fpu)
+                               child->thread.fpu.hard.fcr31 = data;
+                       else
+                               child->thread.fpu.soft.fcr31 = data;
                        break;
                case DSP_BASE ... DSP_BASE + 5: {
                        dspreg_t *dregs;