diff options
author | Marcus Shawcroft <marcus.shawcroft@linaro.org> | 2013-12-18 10:00:07 +0000 |
---|---|---|
committer | Marcus Shawcroft <marcus.shawcroft@linaro.org> | 2013-12-19 14:00:07 +0000 |
commit | ca0dd6386ed2b5c5c6ca392547628a1228432ae0 (patch) | |
tree | f1070a37e9b87a57aa7b8f3d5629ba92d6fe2b8a | |
parent | 6d153c48a17487a1bd2ae47a1d6be8df28c21130 (diff) | |
download | glibc-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-- | NEWS | 2 | ||||
-rw-r--r-- | ports/ChangeLog.aarch64 | 6 | ||||
-rw-r--r-- | ports/sysdeps/aarch64/dl-trampoline.S | 28 |
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) |