This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

one more mips64 n32 setjmp/longjmp bug


Turns out the calling conventions for FP registers of n32 is not like
n64, but like o32.  Oops.  This patch fixes it.  I'm undecided as to
whether to entirely avoid ifdefs in setjmp_aux.c and __longjmp.c, by
moving specialized versions into the n32 and n64 files, or to merge
all of the setjmp/longjmp files into sysdeps/mips.  Ok?

Index: ChangeLog
from  Alexandre Oliva  <aoliva at redhat dot com>
	* sysdeps/mips/bits/setjmp.h: n32 has only 6 call-saved fpregs.
	* sysdeps/mips/mips64/setjmp_aux.c (__sigsetjmp_aux): Adjust.
	* sysdeps/mips/mips64/__longjmp.c (__longjmp): Likewise.

Index: sysdeps/mips/bits/setjmp.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/mips/bits/setjmp.h,v
retrieving revision 1.6
diff -u -p -r1.6 setjmp.h
--- sysdeps/mips/bits/setjmp.h 20 Mar 2003 10:27:55 -0000 1.6
+++ sysdeps/mips/bits/setjmp.h 20 Mar 2003 20:50:33 -0000
@@ -60,10 +60,10 @@ typedef struct
     int __fpc_csr;
 
     /* Callee-saved floating point registers.  */
-#if _MIPS_SIM == _MIPS_SIM_ABI32
-    double __fpregs[6];
-#else
+#if defined _ABI64 && _MIPS_SIM == _ABI64
     double __fpregs[8];
+#else
+    double __fpregs[6];
 #endif
   } __jmp_buf[1];
 
Index: sysdeps/mips/mips64/__longjmp.c
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/mips/mips64/__longjmp.c,v
retrieving revision 1.4
diff -u -p -r1.4 __longjmp.c
--- sysdeps/mips/mips64/__longjmp.c 6 Jul 2001 04:56:01 -0000 1.4
+++ sysdeps/mips/mips64/__longjmp.c 20 Mar 2003 20:50:33 -0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 1995, 1997, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1995, 1997, 2000, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Brendan Kehoe (brendan at zen dot org).
 
@@ -38,6 +38,7 @@ __longjmp (env, val_arg)
   register int val asm ("a1");
 
   /* Pull back the floating point callee-saved registers.  */
+#if defined _ABI64 && _MIPS_SIM == _ABI64
   asm volatile ("l.d $f24, %0" : : "m" (env[0].__fpregs[0]));
   asm volatile ("l.d $f25, %0" : : "m" (env[0].__fpregs[1]));
   asm volatile ("l.d $f26, %0" : : "m" (env[0].__fpregs[2]));
@@ -46,6 +47,14 @@ __longjmp (env, val_arg)
   asm volatile ("l.d $f29, %0" : : "m" (env[0].__fpregs[5]));
   asm volatile ("l.d $f30, %0" : : "m" (env[0].__fpregs[6]));
   asm volatile ("l.d $f31, %0" : : "m" (env[0].__fpregs[7]));
+#else
+  asm volatile ("l.d $f20, %0" : : "m" (env[0].__fpregs[0]));
+  asm volatile ("l.d $f22, %0" : : "m" (env[0].__fpregs[1]));
+  asm volatile ("l.d $f24, %0" : : "m" (env[0].__fpregs[2]));
+  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]));
+#endif
 
   /* Get and reconstruct the floating point csr.  */
   asm volatile ("lw $2, %0" : : "m" (env[0].__fpc_csr));
Index: sysdeps/mips/mips64/setjmp_aux.c
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/mips/mips64/setjmp_aux.c,v
retrieving revision 1.3
diff -u -p -r1.3 setjmp_aux.c
--- sysdeps/mips/mips64/setjmp_aux.c 20 Mar 2003 10:27:55 -0000 1.3
+++ sysdeps/mips/mips64/setjmp_aux.c 20 Mar 2003 20:50:33 -0000
@@ -29,6 +29,7 @@ __sigsetjmp_aux (jmp_buf env, int savema
 		 long long gp)
 {
   /* Store the floating point callee-saved registers...  */
+#if defined _ABI64 && _MIPS_SIM == _ABI64
   asm volatile ("s.d $f24, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[0]));
   asm volatile ("s.d $f25, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[1]));
   asm volatile ("s.d $f26, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[2]));
@@ -37,6 +38,14 @@ __sigsetjmp_aux (jmp_buf env, int savema
   asm volatile ("s.d $f29, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[5]));
   asm volatile ("s.d $f30, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[6]));
   asm volatile ("s.d $f31, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[7]));
+#else
+  asm volatile ("s.d $f20, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[0]));
+  asm volatile ("s.d $f22, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[1]));
+  asm volatile ("s.d $f24, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[2]));
+  asm volatile ("s.d $f26, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[3]));
+  asm volatile ("s.d $f28, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[4]));
+  asm volatile ("s.d $f30, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[5]));
+#endif
 
   /* .. and the PC;  */
   asm volatile ("sd $31, %0" : : "m" (env[0].__jmpbuf[0].__pc));
-- 
Alexandre Oliva   Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer                 aoliva at {redhat dot com, gcc.gnu.org}
CS PhD student at IC-Unicamp        oliva at {lsd dot ic dot unicamp dot br, gnu.org}
Free Software Evangelist                Professional serial bug killer

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]