about summary refs log tree commit diff
path: root/ports
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2013-06-14 21:42:24 +0000
committerJoseph Myers <joseph@codesourcery.com>2013-06-14 21:42:24 +0000
commit601eb33debf0c7548f52ba72cec4b3f362105e39 (patch)
tree417ce9870681af465ea79b12cbe85f0731ac6323 /ports
parentc69f6af9e5a03620c253e75fd925d38adaa3c039 (diff)
downloadglibc-601eb33debf0c7548f52ba72cec4b3f362105e39.tar.gz
glibc-601eb33debf0c7548f52ba72cec4b3f362105e39.tar.xz
glibc-601eb33debf0c7548f52ba72cec4b3f362105e39.zip
Stop MIPS setjmp / longjmp saving / restoring floating-point flags (bug 14909).
Diffstat (limited to 'ports')
-rw-r--r--ports/ChangeLog.mips12
-rw-r--r--ports/sysdeps/mips/__longjmp.c4
-rw-r--r--ports/sysdeps/mips/bits/setjmp.h4
-rw-r--r--ports/sysdeps/mips/mips64/__longjmp.c4
-rw-r--r--ports/sysdeps/mips/mips64/setjmp_aux.c5
-rw-r--r--ports/sysdeps/mips/setjmp_aux.c5
6 files changed, 14 insertions, 20 deletions
diff --git a/ports/ChangeLog.mips b/ports/ChangeLog.mips
index e876ee2651..66f859d997 100644
--- a/ports/ChangeLog.mips
+++ b/ports/ChangeLog.mips
@@ -1,5 +1,17 @@
 2013-06-14  Joseph Myers  <joseph@codesourcery.com>
 
+	[BZ #14909]
+	* sysdeps/mips/bits/setjmp.h (struct __jmp_buf_internal_tag):
+	Rename __fpc_csr field to __glibc_reserved1.
+	* sysdeps/mips/setjmp_aux.c (__sigsetjmp_aux) [__mips_hard_float]:
+	Do not set __fpc_csr.
+	* sysdeps/mips/mips64/setjmp_aux.c (__sigsetjmp_aux)
+	[__mips_hard_float]: Likewise.
+	* sysdeps/mips/__longjmp.c (____longjmp) [__mips_hard_float]: Do
+	not use __fpc_csr.
+	* sysdeps/mips/mips64/__longjmp.c (__longjmp) [__mips_hard_float]:
+	Likewise.
+
 	* sysdeps/mips/math-tests.h: New file.
 
 2013-06-05  Joseph Myers  <joseph@codesourcery.com>
diff --git a/ports/sysdeps/mips/__longjmp.c b/ports/sysdeps/mips/__longjmp.c
index 67bdb86cf8..d1d7d64dfa 100644
--- a/ports/sysdeps/mips/__longjmp.c
+++ b/ports/sysdeps/mips/__longjmp.c
@@ -47,10 +47,6 @@ ____longjmp (env_arg, val_arg)
   asm volatile ("l.d $f26, %0" : : "m" (env[0].__fpregs[3]));
   asm volatile ("l.d $f28, %0" : : "m" (env[0].__fpregs[4]));
   asm volatile ("l.d $f30, %0" : : "m" (env[0].__fpregs[5]));
-
-  /* Get and reconstruct the floating point csr.  */
-  asm volatile ("lw $2, %0" : : "m" (env[0].__fpc_csr));
-  asm volatile ("ctc1 $2, $31");
 #endif
 
   /* Get the GP. */
diff --git a/ports/sysdeps/mips/bits/setjmp.h b/ports/sysdeps/mips/bits/setjmp.h
index d35b12dc65..437848fcb9 100644
--- a/ports/sysdeps/mips/bits/setjmp.h
+++ b/ports/sysdeps/mips/bits/setjmp.h
@@ -59,8 +59,8 @@ typedef struct __jmp_buf_internal_tag
     __extension__ long long __gp;
 #endif
 
-    /* Floating point status register.  */
-    int __fpc_csr;
+    /* Unused (was floating point status register).  */
+    int __glibc_reserved1;
 
     /* Callee-saved floating point registers.  */
 #if _MIPS_SIM == _ABI64
diff --git a/ports/sysdeps/mips/mips64/__longjmp.c b/ports/sysdeps/mips/mips64/__longjmp.c
index 1e42e9c28f..bffb1137cd 100644
--- a/ports/sysdeps/mips/mips64/__longjmp.c
+++ b/ports/sysdeps/mips/mips64/__longjmp.c
@@ -59,10 +59,6 @@ __longjmp (env_arg, val_arg)
   asm volatile ("l.d $f28, %0" : : "m" (env[0].__fpregs[4]));
   asm volatile ("l.d $f30, %0" : : "m" (env[0].__fpregs[5]));
 #endif
-
-  /* Get and reconstruct the floating point csr.  */
-  asm volatile ("lw $2, %0" : : "m" (env[0].__fpc_csr));
-  asm volatile ("ctc1 $2, $31");
 #endif
 
   /* Get the GP. */
diff --git a/ports/sysdeps/mips/mips64/setjmp_aux.c b/ports/sysdeps/mips/mips64/setjmp_aux.c
index 9515f44b83..931830391b 100644
--- a/ports/sysdeps/mips/mips64/setjmp_aux.c
+++ b/ports/sysdeps/mips/mips64/setjmp_aux.c
@@ -71,11 +71,6 @@ __sigsetjmp_aux (jmp_buf env, int savemask, long long sp, long long fp,
   asm volatile ("sd $22, %0" : : "m" (env[0].__jmpbuf[0].__regs[6]));
   asm volatile ("sd $23, %0" : : "m" (env[0].__jmpbuf[0].__regs[7]));
 
-#ifdef __mips_hard_float
-  /* .. and finally get and reconstruct the floating point csr.  */
-  asm ("cfc1 %0, $31" : "=r" (env[0].__jmpbuf[0].__fpc_csr));
-#endif
-
   /* Save the signal mask if requested.  */
   return __sigjmp_save (env, savemask);
 }
diff --git a/ports/sysdeps/mips/setjmp_aux.c b/ports/sysdeps/mips/setjmp_aux.c
index cb9ea245bb..26715b77d8 100644
--- a/ports/sysdeps/mips/setjmp_aux.c
+++ b/ports/sysdeps/mips/setjmp_aux.c
@@ -58,11 +58,6 @@ __sigsetjmp_aux (jmp_buf env, int savemask, int sp, int fp)
   asm volatile ("sw $22, %0" : : "m" (env[0].__jmpbuf[0].__regs[6]));
   asm volatile ("sw $23, %0" : : "m" (env[0].__jmpbuf[0].__regs[7]));
 
-#ifdef __mips_hard_float
-  /* .. and finally get and reconstruct the floating point csr.  */
-  asm ("cfc1 %0, $31" : "=r" (env[0].__jmpbuf[0].__fpc_csr));
-#endif
-
   /* Save the signal mask if requested.  */
   return __sigjmp_save (env, savemask);
 }