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-18 12:07:05 +0000 |
commit | 9dbebe1a67bbedfcb39c6b739f15bc639e8d40a2 (patch) | |
tree | 9a930c9e11202ce957474f74347e3d6837505d32 | |
parent | 5953eb3ad70bb1a75a9ff419798ef7034c85baed (diff) | |
download | glibc-9dbebe1a67bbedfcb39c6b739f15bc639e8d40a2.tar.gz glibc-9dbebe1a67bbedfcb39c6b739f15bc639e8d40a2.tar.xz glibc-9dbebe1a67bbedfcb39c6b739f15bc639e8d40a2.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.
-rw-r--r-- | NEWS | 22 | ||||
-rw-r--r-- | ports/ChangeLog.aarch64 | 6 | ||||
-rw-r--r-- | ports/sysdeps/aarch64/dl-trampoline.S | 28 |
3 files changed, 41 insertions, 15 deletions
diff --git a/NEWS b/NEWS index fa19722fce..35eceffbf6 100644 --- 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 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) |