summaryrefslogtreecommitdiff
path: root/ports
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-18 12:07:05 +0000
commit9dbebe1a67bbedfcb39c6b739f15bc639e8d40a2 (patch)
tree9a930c9e11202ce957474f74347e3d6837505d32 /ports
parent5953eb3ad70bb1a75a9ff419798ef7034c85baed (diff)
[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.
Diffstat (limited to 'ports')
-rw-r--r--ports/ChangeLog.aarch646
-rw-r--r--ports/sysdeps/aarch64/dl-trampoline.S28
2 files changed, 30 insertions, 4 deletions
diff --git a/ports/ChangeLog.aarch64 b/ports/ChangeLog.aarch64
index b1f6729386..279a2272c1 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-12-17 Marcus Shawcroft <marcus.shawcroft@linaro.org>
* sysdeps/unix/sysv/linux/aarch64/nptl/lowlevellock.h
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)