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]

Re: mips64 setjmp fixes


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


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