]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/mips/kernel/r4k_fpu.S
Merge branch 'linus'
[linux-2.6-omap-h63xx.git] / arch / mips / kernel / r4k_fpu.S
index aba665bcb3864e22b73c69f4ec7c94ae39199d29..59c1577ecbb31e303dd8aa00d99d5dc3dfd4e13f 100644 (file)
  * Copyright (C) 2000 MIPS Technologies, Inc.
  * Copyright (C) 1999, 2001 Silicon Graphics, Inc.
  */
-#include <linux/config.h>
 #include <asm/asm.h>
 #include <asm/errno.h>
 #include <asm/fpregdef.h>
 #include <asm/mipsregs.h>
-#include <asm/offset.h>
+#include <asm/asm-offsets.h>
 #include <asm/regdef.h>
 
        .macro  EX insn, reg, src
@@ -32,7 +31,7 @@
 
        .set    noreorder
        .set    mips3
-       /* Save floating point context */
+
 LEAF(_save_fp_context)
        cfc1    t1, fcr31
 
@@ -74,9 +73,6 @@ LEAF(_save_fp_context)
        EX      sdc1 $f28, SC_FPREGS+224(a0)
        EX      sdc1 $f30, SC_FPREGS+240(a0)
        EX      sw t1, SC_FPC_CSR(a0)
-       cfc1    t0, $0                          # implementation/version
-       EX      sw t0, SC_FPC_EIR(a0)
-
        jr      ra
         li     v0, 0                                   # success
        END(_save_fp_context)
@@ -118,6 +114,14 @@ LEAF(_save_fp_context32)
  */
 LEAF(_restore_fp_context)
        EX      lw t0, SC_FPC_CSR(a0)
+
+       /* Fail if the CSR has exceptions pending */
+       srl     t1, t0, 5
+       and     t1, t0
+       andi    t1, 0x1f << 7
+       bnez    t1, fault
+        nop
+
 #ifdef CONFIG_64BIT
        EX      ldc1 $f1, SC_FPREGS+8(a0)
        EX      ldc1 $f3, SC_FPREGS+24(a0)
@@ -161,6 +165,14 @@ LEAF(_restore_fp_context)
 LEAF(_restore_fp_context32)
        /* Restore an o32 sigcontext.  */
        EX      lw t0, SC32_FPC_CSR(a0)
+
+       /* Fail if the CSR has exceptions pending */
+       srl     t1, t0, 5
+       and     t1, t0
+       andi    t1, 0x1f << 7
+       bnez    t1, fault
+        nop
+
        EX      ldc1 $f0, SC32_FPREGS+0(a0)
        EX      ldc1 $f2, SC32_FPREGS+16(a0)
        EX      ldc1 $f4, SC32_FPREGS+32(a0)
@@ -181,9 +193,10 @@ LEAF(_restore_fp_context32)
        jr      ra
         li     v0, 0                                   # success
        END(_restore_fp_context32)
-       .set    reorder
 #endif
 
+       .set    reorder
+
        .type   fault@function
        .ent    fault
 fault: li      v0, -EFAULT                             # failure