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]

mips64 setjmp fixes


It turned out we didn't have enough room to save some of the registers
in N32, and we didn't save the correct gp in N32 or N64.  This patch
fixes both problems.  Ok?

While at that, I noticed that the gp value that we save in O32 is
entirely useless.  Since gp is not preserved across calls in O32, and
all of the setjmp_aux wrappers set their own gp without restoring the
original one, the value we save is that set by the setjmp_aux function
itself, not that of the caller of whatever setjmp variant is in use.
Which doesn't really matter, since the caller is required to restore
gp anyway.  It's just pointless to save and restore it, given that
we're not saving anything useful.  The only thing this accomplishes is
to make sure setjmp returns the same value for gp every time it
returns, but there's no requirement to do so, AFAIK.  I'm thinking on
O32 we might as well just refrain from saving and restoring gp at
all.  Too bad we can't take it out from the jmpbuf struct.  Comments?

Index: ChangeLog
from  Alexandre Oliva  <aoliva at redhat dot com>
	* sysdeps/mips/bits/setjmp.h: Store all N32 and N64 registers,
	including pc, gp, sp and fp, as long long.
	* sysdeps/mips/mips64/setjmp.S: Pass gp to __sigsetjmp_aux.
	* sysdeps/mips/mips64/setjmp_aux.c: Adjust type of arguments.
	Add gp argument, and set gp in the jmpbuf to it.
	* sysdeps/mips/setjmp_aux.c: Revert to o32-only.

Index: sysdeps/mips/setjmp_aux.c
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/mips/setjmp_aux.c,v
retrieving revision 1.9
diff -u -p -r1.9 setjmp_aux.c
--- sysdeps/mips/setjmp_aux.c 17 Mar 2003 15:47:11 -0000 1.9
+++ sysdeps/mips/setjmp_aux.c 20 Mar 2003 08:22:25 -0000
@@ -18,11 +18,6 @@
    02111-1307 USA.  */
 
 #include <setjmp.h>
-#include <sys/asm.h>
-
-#define STRINGXP(X) __STRING(X)
-#define REGS STRINGXP(REG_S)
-#define PTRS STRINGXP(PTR_S)
 
 /* This function is only called via the assembly language routine
    __sigsetjmp, which arranges to pass in the stack pointer and the frame
@@ -33,26 +28,15 @@ int
 __sigsetjmp_aux (jmp_buf env, int savemask, int sp, int fp)
 {
   /* Store the floating point callee-saved registers...  */
-#if _MIPS_SIM == _MIPS_SIM_ABI32
   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]));
-#else
-  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]));
-  asm volatile ("s.d $f27, %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 $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]));
-#endif  
 
   /* .. and the PC;  */
-  asm volatile (PTRS " $31, %0" : : "m" (env[0].__jmpbuf[0].__pc));
+  asm volatile ("sw $31, %0" : : "m" (env[0].__jmpbuf[0].__pc));
 
   /* .. and the stack pointer;  */
   env[0].__jmpbuf[0].__sp = (void *) sp;
@@ -61,17 +45,17 @@ __sigsetjmp_aux (jmp_buf env, int savema
   env[0].__jmpbuf[0].__fp = (void *) fp;
 
   /* .. and the GP; */
-  asm volatile (PTRS " $gp, %0" : : "m" (env[0].__jmpbuf[0].__gp));
+  asm volatile ("sw $gp, %0" : : "m" (env[0].__jmpbuf[0].__gp));
 
   /* .. and the callee-saved registers; */
-  asm volatile (REGS " $16, %0" : : "m" (env[0].__jmpbuf[0].__regs[0]));
-  asm volatile (REGS " $17, %0" : : "m" (env[0].__jmpbuf[0].__regs[1]));
-  asm volatile (REGS " $18, %0" : : "m" (env[0].__jmpbuf[0].__regs[2]));
-  asm volatile (REGS " $19, %0" : : "m" (env[0].__jmpbuf[0].__regs[3]));
-  asm volatile (REGS " $20, %0" : : "m" (env[0].__jmpbuf[0].__regs[4]));
-  asm volatile (REGS " $21, %0" : : "m" (env[0].__jmpbuf[0].__regs[5]));
-  asm volatile (REGS " $22, %0" : : "m" (env[0].__jmpbuf[0].__regs[6]));
-  asm volatile (REGS " $23, %0" : : "m" (env[0].__jmpbuf[0].__regs[7]));
+  asm volatile ("sw $16, %0" : : "m" (env[0].__jmpbuf[0].__regs[0]));
+  asm volatile ("sw $17, %0" : : "m" (env[0].__jmpbuf[0].__regs[1]));
+  asm volatile ("sw $18, %0" : : "m" (env[0].__jmpbuf[0].__regs[2]));
+  asm volatile ("sw $19, %0" : : "m" (env[0].__jmpbuf[0].__regs[3]));
+  asm volatile ("sw $20, %0" : : "m" (env[0].__jmpbuf[0].__regs[4]));
+  asm volatile ("sw $21, %0" : : "m" (env[0].__jmpbuf[0].__regs[5]));
+  asm volatile ("sw $22, %0" : : "m" (env[0].__jmpbuf[0].__regs[6]));
+  asm volatile ("sw $23, %0" : : "m" (env[0].__jmpbuf[0].__regs[7]));
 
   /* .. and finally get and reconstruct the floating point csr.  */
   asm ("cfc1 %0, $31" : "=r" (env[0].__jmpbuf[0].__fpc_csr));
Index: sysdeps/mips/bits/setjmp.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/mips/bits/setjmp.h,v
retrieving revision 1.5
diff -u -p -r1.5 setjmp.h
--- sysdeps/mips/bits/setjmp.h 17 Mar 2003 15:47:12 -0000 1.5
+++ sysdeps/mips/bits/setjmp.h 20 Mar 2003 08:22:25 -0000
@@ -24,6 +24,7 @@
 
 typedef struct
   {
+#if _MIPS_SIM == _MIPS_SIM_ABI32
     /* Program counter.  */
     __ptr_t __pc;
 
@@ -31,17 +32,29 @@ typedef struct
     __ptr_t __sp;
 
     /* Callee-saved registers s0 through s7.  */
-#if _MIPS_SIM == _MIPS_SIM_ABI32
     int __regs[8];
-#else
-    __extension__ long long __regs[8];
-#endif
 
     /* The frame pointer.  */
     __ptr_t __fp;
 
     /* The global pointer.  */
     __ptr_t __gp;
+#else
+    /* Program counter.  */
+    __extension__ long long __pc;
+
+    /* Stack pointer.  */
+    __extension__ long long __sp;
+
+    /* Callee-saved registers s0 through s7.  */
+    __extension__ long long __regs[8];
+
+    /* The frame pointer.  */
+    __extension__ long long __fp;
+
+    /* The global pointer.  */
+    __extension__ long long __gp;
+#endif
 
     /* Floating point status register.  */
     int __fpc_csr;
Index: sysdeps/mips/mips64/setjmp.S
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/mips/mips64/setjmp.S,v
retrieving revision 1.4
diff -u -p -r1.4 setjmp.S
--- sysdeps/mips/mips64/setjmp.S 17 Mar 2003 15:47:12 -0000 1.4
+++ sysdeps/mips/mips64/setjmp.S 20 Mar 2003 08:22:25 -0000
@@ -37,5 +37,8 @@ ENTRY (__sigsetjmp)
 	nop
 #endif	
 	RESTORE_GP64
+#if _MIPS_SIM != _MIPS_SIM_ABI32
+	move a4, gp
+#endif
 	jr t9
 	.end __sigsetjmp
Index: sysdeps/mips/mips64/setjmp_aux.c
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/mips/mips64/setjmp_aux.c,v
retrieving revision 1.2
diff -u -p -r1.2 setjmp_aux.c
--- sysdeps/mips/mips64/setjmp_aux.c 6 Jul 2001 04:56:01 -0000 1.2
+++ sysdeps/mips/mips64/setjmp_aux.c 20 Mar 2003 08:22:25 -0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Brendan Kehoe (brendan at zen dot org).
 
@@ -25,7 +25,8 @@
    access them in C.  */
 
 int
-__sigsetjmp_aux (jmp_buf env, int savemask, int sp, int fp)
+__sigsetjmp_aux (jmp_buf env, int savemask, long long sp, long long fp,
+		 long long gp)
 {
   /* Store the floating point callee-saved registers...  */
   asm volatile ("s.d $f24, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[0]));
@@ -47,7 +48,7 @@ __sigsetjmp_aux (jmp_buf env, int savema
   env[0].__jmpbuf[0].__fp = fp;
 
   /* .. and the GP; */
-  asm volatile ("sd $gp, %0" : : "m" (env[0].__jmpbuf[0].__gp));
+  env[0].__jmpbuf[0].__gp = gp;
 
   /* .. and the callee-saved registers; */
   asm volatile ("sd $16, %0" : : "m" (env[0].__jmpbuf[0].__regs[0]));
-- 
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]