This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
[PATCH] PPC64
- From: Steve Munroe <sjmunroe at us dot ibm dot com>
- To: libc-alpha at sources dot redhat dot com, mendell at ca dot ibm dot com
- Date: Fri, 16 Jul 2004 13:07:56 -0500
- Subject: [PATCH] PPC64
- Organization: IBM LTC
- Reply-to: sjmunroe at vnet dot ibm dot com
This patch fixes bugzilla #269.
This captures the callers TOC for the dynamic case and saves it in the
jmpbuf (without clobbering the libc.so's TOC). Also handle the special
case of internal libc.so calles which don't save the TOC. Then it is
safe for __longjmp to retore the TOC (R2) to the TOC save area on the
previous frame.
Thanks to Mark Mendell for finding this bug.
2004-07-16 Steven Munroe <sjmunroe@us.ibm.com>
* 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.
diff -urN libc23-cvstip-20040713/sysdeps/powerpc/powerpc64/__longjmp-common.S libc23/sysdeps/powerpc/powerpc64/__longjmp-common.S
--- libc23-cvstip-20040713/sysdeps/powerpc/powerpc64/__longjmp-common.S 2004-05-28 16:19:15.000000000 -0500
+++ libc23/sysdeps/powerpc/powerpc64/__longjmp-common.S 2004-07-15 17:39:12.171310648 -0500
@@ -112,6 +112,9 @@
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 @@
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 -urN libc23-cvstip-20040713/sysdeps/powerpc/powerpc64/bsd-_setjmp.S libc23/sysdeps/powerpc/powerpc64/bsd-_setjmp.S
--- libc23-cvstip-20040713/sysdeps/powerpc/powerpc64/bsd-_setjmp.S 2004-03-17 11:26:38.000000000 -0600
+++ libc23/sysdeps/powerpc/powerpc64/bsd-_setjmp.S 2004-07-15 18:23:43.562364760 -0500
@@ -47,6 +47,9 @@
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 -urN libc23-cvstip-20040713/sysdeps/powerpc/powerpc64/setjmp-common.S libc23/sysdeps/powerpc/powerpc64/setjmp-common.S
--- libc23-cvstip-20040713/sysdeps/powerpc/powerpc64/setjmp-common.S 2004-05-28 16:19:15.000000000 -0500
+++ libc23/sysdeps/powerpc/powerpc64/setjmp-common.S 2004-07-15 18:04:01.022289672 -0500
@@ -44,7 +44,12 @@
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 called 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)