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]

[Fwd: [PATCH] PPC64] Fix for Bugz# 269


Sorry I hit send before I filled out the subject line ...
--- Begin Message --- 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)

--- End Message ---

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