]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
[AArch64] Save and restore q0-q7 on entry to dynamic linker.
authorMarcus Shawcroft <marcus.shawcroft@linaro.org>
Wed, 18 Dec 2013 10:00:07 +0000 (10:00 +0000)
committerMarcus Shawcroft <marcus.shawcroft@linaro.org>
Thu, 19 Dec 2013 14:00:07 +0000 (14:00 +0000)
[BZ #15128] Ensure all argument passing registers are saved and
restored on entry to dynamic linker.

(cherry picked from commit 9dbebe1a67bbedfcb39c6b739f15bc639e8d40a2)

Conflicts:
NEWS

NEWS
ports/ChangeLog.aarch64
ports/sysdeps/aarch64/dl-trampoline.S

diff --git a/NEWS b/NEWS
index df97235ac8cbf96491ce64da982c4e5ebd05fffa..6c7aaa7c2131b4dab261af61c1c091bbe22d05d5 100644 (file)
--- 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.
 \f
 Version 2.18
 
index 537ae601e049027e50133088f3e4c1a48eca15ba..dbb330bc9cbfb3129f9a3b880dfa2ff4ebf9040b 100644 (file)
@@ -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.
index 94c69a0e2dab0320be0c0a27914eaa2520bf6fb6..923ca76afc105347b651dba810b9b4a7cbeb29a6 100644 (file)
@@ -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)