about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMarcus Shawcroft <marcus.shawcroft@linaro.org>2013-12-18 10:00:07 +0000
committerMarcus Shawcroft <marcus.shawcroft@linaro.org>2013-12-19 14:00:07 +0000
commitca0dd6386ed2b5c5c6ca392547628a1228432ae0 (patch)
treef1070a37e9b87a57aa7b8f3d5629ba92d6fe2b8a
parent6d153c48a17487a1bd2ae47a1d6be8df28c21130 (diff)
downloadglibc-ca0dd6386ed2b5c5c6ca392547628a1228432ae0.tar.gz
glibc-ca0dd6386ed2b5c5c6ca392547628a1228432ae0.tar.xz
glibc-ca0dd6386ed2b5c5c6ca392547628a1228432ae0.zip
[AArch64] Save and restore q0-q7 on entry to dynamic linker.
[BZ #15128] Ensure all argument passing registers are saved and
restored on entry to dynamic linker.

(cherry picked from commit 9dbebe1a67bbedfcb39c6b739f15bc639e8d40a2)

Conflicts:
	NEWS
-rw-r--r--NEWS2
-rw-r--r--ports/ChangeLog.aarch646
-rw-r--r--ports/sysdeps/aarch64/dl-trampoline.S28
3 files changed, 31 insertions, 5 deletions
diff --git a/NEWS b/NEWS
index df97235ac8..6c7aaa7c21 100644
--- a/NEWS
+++ b/NEWS
@@ -9,7 +9,7 @@ Version 2.18.1
 
 * The following bugs are resolved with this release:
 
-  15909, 15996, 16150.
+  15128, 15909, 15996, 16150.
 
 Version 2.18
 
diff --git a/ports/ChangeLog.aarch64 b/ports/ChangeLog.aarch64
index 537ae601e0..dbb330bc9c 100644
--- a/ports/ChangeLog.aarch64
+++ b/ports/ChangeLog.aarch64
@@ -1,3 +1,9 @@
+2013-12-18  Marcus Shawcroft  <marcus.shawcroft@linaro.org>
+
+	[BZ #15128]
+	* sysdeps/aarch64/dl-trampoline.S (_dl_runtime_resolve): Save and
+	restore q0-q7.
+
 2013-07-26  Marcus Shawcroft  <marcus.shawcroft@linaro.org>
 
 	* sysdeps/aarch64/Versions: New file.
diff --git a/ports/sysdeps/aarch64/dl-trampoline.S b/ports/sysdeps/aarch64/dl-trampoline.S
index 94c69a0e2d..923ca76afc 100644
--- a/ports/sysdeps/aarch64/dl-trampoline.S
+++ b/ports/sysdeps/aarch64/dl-trampoline.S
@@ -41,7 +41,7 @@ _dl_runtime_resolve:
 	cfi_rel_offset (lr, 8)
 
 	/* Save arguments.  */
-	stp	x8, x9, [sp, #-80]!
+	stp	x8, x9, [sp, #-(80+8*16)]!
 	cfi_adjust_cfa_offset (80)
 	cfi_rel_offset (x8, 0)
 	cfi_rel_offset (x9, 8)
@@ -62,11 +62,27 @@ _dl_runtime_resolve:
 	cfi_rel_offset (x0, 64)
 	cfi_rel_offset (x1, 72)
 
+	stp	q0, q1, [sp, #(80+0*16)]
+	cfi_rel_offset (q0, 80+0*16)
+	cfi_rel_offset (q1, 80+1*16)
+
+	stp	q2, q3, [sp, #(80+2*16)]
+	cfi_rel_offset (q0, 80+2*16)
+	cfi_rel_offset (q1, 80+3*16)
+
+	stp	q4, q5, [sp, #(80+4*16)]
+	cfi_rel_offset (q0, 80+4*16)
+	cfi_rel_offset (q1, 80+5*16)
+
+	stp	q6, q7, [sp, #(80+6*16)]
+	cfi_rel_offset (q0, 80+6*16)
+	cfi_rel_offset (q1, 80+7*16)
+
 	/* Get pointer to linker struct.  */
 	ldr	x0, [ip0, #-8]
 
 	/* Prepare to call _dl_fixup().  */
-	ldr	x1, [sp, 80]	/* Recover &PLTGOT[n] */
+	ldr	x1, [sp, 80+8*16]	/* Recover &PLTGOT[n] */
 
 	sub     x1, x1, ip0
 	add     x1, x1, x1, lsl #1
@@ -81,12 +97,16 @@ _dl_runtime_resolve:
 	mov	ip0, x0
 
 	/* Get arguments and return address back.  */
+	ldp	q0, q1, [sp, #(80+0*16)]
+	ldp	q2, q3, [sp, #(80+2*16)]
+	ldp	q4, q5, [sp, #(80+4*16)]
+	ldp	q6, q7, [sp, #(80+6*16)]
 	ldp	x0, x1, [sp, #64]
 	ldp	x2, x3, [sp, #48]
 	ldp	x4, x5, [sp, #32]
 	ldp	x6, x7, [sp, #16]
-	ldp	x8, x9, [sp], #80
-	cfi_adjust_cfa_offset (-80)
+	ldp	x8, x9, [sp], #(80+8*16)
+	cfi_adjust_cfa_offset (-(80+8*16))
 
 	ldp	ip1, lr, [sp], #16
 	cfi_adjust_cfa_offset (-16)