about summary refs log tree commit diff
path: root/sysdeps/powerpc/powerpc64/dl-trampoline.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/powerpc/powerpc64/dl-trampoline.S')
-rw-r--r--sysdeps/powerpc/powerpc64/dl-trampoline.S146
1 files changed, 112 insertions, 34 deletions
diff --git a/sysdeps/powerpc/powerpc64/dl-trampoline.S b/sysdeps/powerpc/powerpc64/dl-trampoline.S
index 946ad8a3e3..316f17a405 100644
--- a/sysdeps/powerpc/powerpc64/dl-trampoline.S
+++ b/sysdeps/powerpc/powerpc64/dl-trampoline.S
@@ -73,46 +73,124 @@ END(_dl_runtime_resolve)
 EALIGN(_dl_profile_resolve, 4, 0)
 /* We need to save the registers used to pass parameters, ie. r3 thru
    r10; the registers are saved in a stack frame.  */
-	stdu	1,-128(1)
-	std	3,48(1)
-	mr	3,11
-	std	4,56(1)
-	sldi	4,0,1
-	std	5,64(1)
-	add	4,4,0
-	std	6,72(1)
-	sldi	4,4,3
-	std	7,80(1)
-	mflr	0
-	std	8,88(1)
+	stdu	r1,-448(r1)
+	/* Stack layout:
+
+	  +432   stackframe
+	  +424   lr
+	  +416   r1
+	  +400   v12
+	  +384   v11
+	  +368   v10
+	  +362   v9
+	  +336   v8
+	  +320   v7
+	  +304   v6
+	  +288   v5
+	  +272   v4
+	  +256   v3
+	  +240   v2
+	  +224   v1
+	  +216   free
+	  +208   fp13
+	  +200   fp12
+	  +192   fp11
+	  +184   fp10
+	  +176   fp9
+	  +168   fp8
+	  +160   fp7
+	  +152   fp6
+	  +144   fp5
+	  +136   fp4
+	  +128   fp3
+	  +120   fp2
+	  +112   fp1
+	  +104   r10
+	  +96    r9
+	  +88    r8
+	  +80    r7
+	  +72    r6
+	  +64    r5
+	  +56    r4
+	  +48    r3
+	  +8     cr
+	   r1    link
+	*/
+	std	r3,48(r1)
+	mr	r3,r11
+	std	r4,56(r1)
+	sldi	r4,r0,1
+	std	r5,64(r1)
+	add	r4,r4,0
+	std	r6,72(r1)
+	sldi	r4,r4,3
+	std	r7,80(r1)
+	mflr	r5
+	std	r8,88(r1)
 /* Store the LR in the LR Save area of the previous frame.  */
-	std	0,128+16(1)
-	mfcr	0
-	std	9,96(1)
-	std	10,104(1)
+/* XXX Do we have to do this?  */
+	std	r5,448+16(r1)
+	std	r5,424(r1)
+	mfcr	r0
+	std	r9,96(r1)
+	std	r10,104(r1)
 /* I'm almost certain we don't have to save cr...  be safe.  */
-	std	0,8(1)
+	std	r0,8(r1)
+/* Save floating registers.  */
+	stfd	fp1,112(r1)
+	stfd	fp2,120(r1)
+	stfd	fp3,128(r1)
+	stfd	fp4,136(r1)
+	stfd	fp5,144(r1)
+	stfd	fp6,152(r1)
+	stfd	fp7,160(r1)
+	stfd	fp8,168(r1)
+	stfd	fp9,176(r1)
+	stfd	fp10,184(r1)
+	stfd	fp11,192(r1)
+	stfd	fp12,200(r1)
+	stfd	fp13,208(r1)
+/* XXX TODO: store vmx registers.  */
+/* Load the extra parameters.  */
+	addi	r6,r1,48
+	addi	r7,r1,432
+	li	r0,-1
+	stdu	r0,0(r7)
 	bl	JUMPTARGET(_dl_profile_fixup)
 /* Put the registers back.  */
-	ld	0,128+16(1)
-	ld	10,104(1)
-	ld	9,96(1)
-	ld	8,88(1)
-	ld	7,80(1)
-	mtlr	0
-	ld	0,8(1)
-	ld	6,72(1)
-	ld	5,64(1)
-	ld	4,56(1)
-	mtcrf	0xFF,0
+	ld	r0,448+16(r1)
+	ld	r10,104(r1)
+	ld	r9,96(r1)
+	ld	r8,88(r1)
+	ld	r7,80(r1)
+	mtlr	r0
+	ld	r0,8(r1)
+	ld	r6,72(r1)
+	ld	r5,64(r1)
+	ld	r4,56(r1)
+	mtcrf	0xFF,r0
 /* Load the target address, toc and static chain reg from the function
    descriptor returned by fixup.  */
-	ld	0,0(3)
-	ld	2,8(3)
-	mtctr	0
-	ld	11,16(3)
-	ld	3,48(1)
+	ld	r0,0(r3)
+	ld	r2,8(r3)
+	mtctr	r0
+	ld	r11,16(r3)
+	ld	r3,48(r1)
+/* Load the floating point registers.  */
+	lfd	fp1,112(r1)
+	lfd	fp2,120(r1)
+	lfd	fp3,128(r1)
+	lfd	fp4,136(r1)
+	lfd	fp5,144(r1)
+	lfd	fp6,152(r1)
+	lfd	fp7,160(r1)
+	lfd	fp8,168(r1)
+	lfd	fp9,176(r1)
+	lfd	fp10,184(r1)
+	lfd	fp11,192(r1)
+	lfd	fp12,200(r1)
+	lfd	fp13,208(r1)
 /* Unwind the stack frame, and jump.  */
-	addi	1,1,128
+	addi	r1,r1,448
 	bctr
 END(_dl_profile_resolve)