This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
Re: mips64 setjmp fixes
- From: Andreas Jaeger <aj at suse dot de>
- To: Alexandre Oliva <aoliva at redhat dot com>
- Cc: libc-alpha at sources dot redhat dot com
- Date: Thu, 20 Mar 2003 10:51:30 +0100
- Subject: Re: mips64 setjmp fixes
- References: <orllza1lzn.fsf@free.redhat.lsd.ic.unicamp.br>
Alexandre Oliva <aoliva at redhat dot com> writes:
> 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?
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]));
Andreas
--
Andreas Jaeger
SuSE Labs aj at suse dot de
private aj at arthur dot inka dot de
http://www.suse.de/~aj