]> 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>
Wed, 18 Dec 2013 12:07:05 +0000 (12:07 +0000)
[BZ #15128] Ensure all argument passing registers are saved and
restored on entry to dynamic linker.

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

diff --git a/NEWS b/NEWS
index fa19722fcea5f27ef2cd159ca2e24c5f94b4f8d3..35eceffbf6460f026deb289755326724b6ea5c56 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -12,17 +12,17 @@ Version 2.19
   156, 387, 431, 832, 926, 2801, 4772, 6786, 6787, 6807, 6810, 7003, 9954,
   10253, 10278, 11087, 11157, 11214, 12100, 12486, 13028, 13982, 13985,
   14029, 14032, 14120, 14143, 14155, 14547, 14699, 14752, 14876, 14910,
-  15004, 15048, 15089, 15218, 15268, 15277, 15308, 15362, 15374, 15400,
-  15425, 15427, 15483, 15522, 15531, 15532, 15593, 15601, 15608, 15609,
-  15610, 15632, 15640, 15670, 15672, 15680, 15681, 15723, 15734, 15735,
-  15736, 15748, 15749, 15754, 15760, 15763, 15764, 15797, 15799, 15825,
-  15843, 15844, 15847, 15849, 15855, 15856, 15857, 15859, 15867, 15886,
-  15887, 15890, 15892, 15893, 15895, 15897, 15901, 15905, 15909, 15915,
-  15917, 15919, 15921, 15923, 15939, 15941, 15948, 15963, 15966, 15985,
-  15988, 15997, 16032, 16034, 16036, 16037, 16038, 16041, 16055, 16071,
-  16072, 16074, 16077, 16078, 16103, 16112, 16143, 16144, 16146, 16150,
-  16151, 16153, 16167, 16172, 16195, 16214, 16245, 16271, 16274, 16283,
-  16289, 16314, 16316, 16330, 16338.
+  15004, 15048, 15089, 15128, 15218, 15268, 15277, 15308, 15362, 15374,
+  15400, 15425, 15427, 15483, 15522, 15531, 15532, 15593, 15601, 15608,
+  15609, 15610, 15632, 15640, 15670, 15672, 15680, 15681, 15723, 15734,
+  15735, 15736, 15748, 15749, 15754, 15760, 15763, 15764, 15797, 15799,
+  15825, 15843, 15844, 15847, 15849, 15855, 15856, 15857, 15859, 15867,
+  15886, 15887, 15890, 15892, 15893, 15895, 15897, 15901, 15905, 15909,
+  15915, 15917, 15919, 15921, 15923, 15939, 15941, 15948, 15963, 15966,
+  15985, 15988, 15997, 16032, 16034, 16036, 16037, 16038, 16041, 16055,
+  16071, 16072, 16074, 16077, 16078, 16103, 16112, 16143, 16144, 16146,
+  16150, 16151, 16153, 16167, 16172, 16195, 16214, 16245, 16271, 16274,
+  16283, 16289, 16314, 16316, 16330, 16338.
 
 * The public headers no longer use __unused nor __block.  This change is to
   support compiling programs that are derived from BSD sources and use
index b1f6729386349e30daeb29c13fd0bf88fe04d09d..279a2272c16ad21186bc9ce4bdcff76a3a8ebaf2 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-12-17  Marcus Shawcroft  <marcus.shawcroft@linaro.org>
 
        * sysdeps/unix/sysv/linux/aarch64/nptl/lowlevellock.h
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)