Merge ath-next from ath.git
[deliverable/linux.git] / arch / mips / kernel / ptrace32.c
index b8aa2dd5b00bc13af9f2b88225718773d7b5732d..283b5a1967d1461298bf065b2073d62c6296dc1d 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/errno.h>
 #include <linux/ptrace.h>
 #include <linux/smp.h>
-#include <linux/user.h>
 #include <linux/security.h>
 
 #include <asm/cpu.h>
@@ -32,6 +31,7 @@
 #include <asm/mipsmtregs.h>
 #include <asm/pgtable.h>
 #include <asm/page.h>
+#include <asm/reg.h>
 #include <asm/uaccess.h>
 #include <asm/bootinfo.h>
 
@@ -80,7 +80,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
        /* Read the word at location addr in the USER area. */
        case PTRACE_PEEKUSR: {
                struct pt_regs *regs;
-               fpureg_t *fregs;
+               union fpureg *fregs;
                unsigned int tmp;
 
                regs = task_pt_regs(child);
@@ -103,13 +103,11 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
                                 * order bits of the values stored in the even
                                 * registers - unless we're using r2k_switch.S.
                                 */
-                               if (addr & 1)
-                                       tmp = fregs[(addr & ~1) - 32] >> 32;
-                               else
-                                       tmp = fregs[addr - 32];
+                               tmp = get_fpr32(&fregs[(addr & ~1) - FPR_BASE],
+                                               addr & 1);
                                break;
                        }
-                       tmp = fregs[addr - FPR_BASE];
+                       tmp = get_fpr32(&fregs[addr - FPR_BASE], 0);
                        break;
                case PC:
                        tmp = regs->cp0_epc;
@@ -129,46 +127,10 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
                case FPC_CSR:
                        tmp = child->thread.fpu.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 */
-
-                       preempt_disable();
-                       if (!cpu_has_fpu) {
-                               preempt_enable();
-                               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 */
-
-                       if (cpu_has_mipsmt) {
-                               unsigned int vpflags = dvpe();
-                               flags = read_c0_status();
-                               __enable_fpu(FPU_AS_IS);
-                               __asm__ __volatile__("cfc1\t%0,$0": "=r" (tmp));
-                               write_c0_status(flags);
-                               evpe(vpflags);
-                       } else {
-                               flags = read_c0_status();
-                               __enable_fpu(FPU_AS_IS);
-                               __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();
+               case FPC_EIR:
+                       /* implementation / version register */
+                       tmp = boot_cpu_data.fpu_id;
                        break;
-               }
                case DSP_BASE ... DSP_BASE + 5: {
                        dspreg_t *dregs;
 
@@ -233,7 +195,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
                        regs->regs[addr] = data;
                        break;
                case FPR_BASE ... FPR_BASE + 31: {
-                       fpureg_t *fregs = get_fpu_regs(child);
+                       union fpureg *fregs = get_fpu_regs(child);
 
                        if (!tsk_used_math(child)) {
                                /* FP not yet used  */
@@ -247,18 +209,11 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
                                 * order bits of the values stored in the even
                                 * registers - unless we're using r2k_switch.S.
                                 */
-                               if (addr & 1) {
-                                       fregs[(addr & ~1) - FPR_BASE] &=
-                                               0xffffffff;
-                                       fregs[(addr & ~1) - FPR_BASE] |=
-                                               ((u64)data) << 32;
-                               } else {
-                                       fregs[addr - FPR_BASE] &= ~0xffffffffLL;
-                                       fregs[addr - FPR_BASE] |= data;
-                               }
+                               set_fpr32(&fregs[(addr & ~1) - FPR_BASE],
+                                         addr & 1, data);
                                break;
                        }
-                       fregs[addr - FPR_BASE] = data;
+                       set_fpr64(&fregs[addr - FPR_BASE], 0, data);
                        break;
                }
                case PC:
@@ -301,11 +256,13 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
                }
 
        case PTRACE_GETREGS:
-               ret = ptrace_getregs(child, (__s64 __user *) (__u64) data);
+               ret = ptrace_getregs(child,
+                               (struct user_pt_regs __user *) (__u64) data);
                break;
 
        case PTRACE_SETREGS:
-               ret = ptrace_setregs(child, (__s64 __user *) (__u64) data);
+               ret = ptrace_setregs(child,
+                               (struct user_pt_regs __user *) (__u64) data);
                break;
 
        case PTRACE_GETFPREGS:
This page took 0.052964 seconds and 5 git commands to generate.