From 77d60040fe62a09c8e9c71f44c2e3d4dc42dab51 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 16 Jul 2004 23:09:27 +0000 Subject: [BZ #269] Update. 2004-07-16 Steven Munroe [BZ #269] * setjmp/Makefile (tests): Add bug269-setjmp. * setjmp/bug269-setjmp.c: New file. * sysdeps/powerpc/powerpc64/__longjmp-common.S [SHARED && !IS_IN_rtld]: Store R2 from jmpbuf in callers TOC save area. * sysdeps/powerpc/powerpc64/bsd-_setjmp.S [SHARED && !IS_IN_rtld]: Store R2 in TOC save area. * sysdeps/powerpc/powerpc64/setjmp-common.S [SHARED && !IS_IN_rtld]: Copy TOC save area from previous frame as R2 (TOC) in jmpbuf. --- sysdeps/powerpc/powerpc64/__longjmp-common.S | 4 ++++ sysdeps/powerpc/powerpc64/bsd-_setjmp.S | 3 +++ sysdeps/powerpc/powerpc64/setjmp-common.S | 5 +++++ 3 files changed, 12 insertions(+) (limited to 'sysdeps/powerpc') diff --git a/sysdeps/powerpc/powerpc64/__longjmp-common.S b/sysdeps/powerpc/powerpc64/__longjmp-common.S index b6a2b79e55..b11a0fd7b5 100644 --- a/sysdeps/powerpc/powerpc64/__longjmp-common.S +++ b/sysdeps/powerpc/powerpc64/__longjmp-common.S @@ -112,6 +112,9 @@ no_vmx: ld r0,(JB_LR*8)(r3) ld r14,((JB_GPRS+0)*8)(r3) lfd fp14,((JB_FPRS+0)*8)(r3) +#if defined SHARED && !defined IS_IN_rtld + std r2,40(r1) /* Restore the callers TOC save area. */ +#endif ld r15,((JB_GPRS+1)*8)(r3) lfd fp15,((JB_FPRS+1)*8)(r3) ld r16,((JB_GPRS+2)*8)(r3) @@ -125,6 +128,7 @@ no_vmx: ld r20,((JB_GPRS+6)*8)(r3) lfd fp20,((JB_FPRS+6)*8)(r3) mtlr r0 +/* std r2,40(r1) Restore the TOC save area. */ ld r21,((JB_GPRS+7)*8)(r3) lfd fp21,((JB_FPRS+7)*8)(r3) ld r22,((JB_GPRS+8)*8)(r3) diff --git a/sysdeps/powerpc/powerpc64/bsd-_setjmp.S b/sysdeps/powerpc/powerpc64/bsd-_setjmp.S index e4428ecff7..13f4056706 100644 --- a/sysdeps/powerpc/powerpc64/bsd-_setjmp.S +++ b/sysdeps/powerpc/powerpc64/bsd-_setjmp.S @@ -47,6 +47,9 @@ default_symbol_version (__vmx_setjmp,_setjmp,GLIBC_2.3.4) as a libc_hidden_proto & is used in sysdeps/generic/libc-start.c if HAVE_CLEANUP_JMP_BUF is defined */ ENTRY (BP_SYM (__GI__setjmp)) +#if defined SHARED && !defined IS_IN_rtld + std r2,40(r1) /* Save the callers TOC in the save area. */ +#endif li r4,0 /* Set second argument to 0. */ b JUMPTARGET(BP_SYM (__vmx__sigsetjmp)) END (BP_SYM (__GI__setjmp)) diff --git a/sysdeps/powerpc/powerpc64/setjmp-common.S b/sysdeps/powerpc/powerpc64/setjmp-common.S index 99b181dfe4..ab57170875 100644 --- a/sysdeps/powerpc/powerpc64/setjmp-common.S +++ b/sysdeps/powerpc/powerpc64/setjmp-common.S @@ -44,7 +44,12 @@ ENTRY (BP_SYM (__sigsetjmp)) CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE) std r1,(JB_GPR1*8)(3) mflr r0 +#if defined SHARED && !defined IS_IN_rtld + ld r5,40(r1) /* Retrieve the callers TOC. */ + std r5,(JB_GPR2*8)(3) +#else std r2,(JB_GPR2*8)(3) +#endif std r14,((JB_GPRS+0)*8)(3) stfd fp14,((JB_FPRS+0)*8)(3) std r0,(JB_LR*8)(3) -- cgit v1.2.3