diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | sysdeps/arm/dl-tlsdesc.S | 31 |
3 files changed, 19 insertions, 20 deletions
@@ -1,3 +1,9 @@ +2014-05-27 Will Newton <will.newton@linaro.org> + + [BZ #16990] + * sysdeps/arm/dl-tlsdesc.S (_dl_tlsdesc_resolve_hold): Save + and restore r2 rather than just restoring. + 2014-05-27 Siddhesh Poyarekar <siddhesh@redhat.com> [BZ #16724] @@ -18,7 +18,7 @@ Version 2.20 16759, 16760, 16770, 16786, 16789, 16791, 16796, 16799, 16800, 16815, 16823, 16824, 16831, 16838, 16849, 16854, 16876, 16877, 16878, 16885, 16888, 16890, 16912, 16915, 16916, 16917, 16922, 16927, 16928, 16932, - 16943, 16958, 16966, 16967, 16965, 16977, 16978, 16984. + 16943, 16958, 16966, 16967, 16965, 16977, 16978, 16984, 16990. * The minimum Linux kernel version that this version of the GNU C Library can be used with is 2.6.32. diff --git a/sysdeps/arm/dl-tlsdesc.S b/sysdeps/arm/dl-tlsdesc.S index 1644a32..e87e7fb 100644 --- a/sysdeps/arm/dl-tlsdesc.S +++ b/sysdeps/arm/dl-tlsdesc.S @@ -186,7 +186,9 @@ _dl_tlsdesc_lazy_resolver: .size _dl_tlsdesc_lazy_resolver, .-_dl_tlsdesc_lazy_resolver /* Holder for lazy tls descriptors being resolve in another thread. - Same ABI as the lazy resolver itself. */ + + Our calling convention is to clobber r0, r1 and the processor + flags. All others that are modified must be saved */ .hidden _dl_tlsdesc_resolve_hold .global _dl_tlsdesc_resolve_hold .type _dl_tlsdesc_resolve_hold,#function @@ -194,29 +196,20 @@ _dl_tlsdesc_lazy_resolver: eabi_fnstart .align 2 _dl_tlsdesc_resolve_hold: - /* Tell the unwinder that r2 has already been pushed. */ - eabi_save ({r2}) - cfi_adjust_cfa_offset (4) + eabi_save ({r2,r3,ip,lr}) + push {r2, r3, ip, lr} + cfi_adjust_cfa_offset (16) cfi_rel_offset (r2, 0) - eabi_save ({r0,r1,r3,ip,lr}) - push {r0, r1, r3, ip, lr} - cfi_adjust_cfa_offset (20) - cfi_rel_offset (r0, 0) - cfi_rel_offset (r1, 4) - cfi_rel_offset (r3, 8) - cfi_rel_offset (ip, 12) - cfi_rel_offset (lr, 16) - adr r2, _dl_tlsdesc_resolve_hold + cfi_rel_offset (r3, 4) + cfi_rel_offset (ip, 8) + cfi_rel_offset (lr, 12) + adr r1, _dl_tlsdesc_resolve_hold bl _dl_tlsdesc_resolve_hold_fixup - pop {r0, r1, r3, ip, lr} - cfi_adjust_cfa_offset (-20) + pop {r2, r3, ip, lr} + cfi_adjust_cfa_offset (-16) cfi_restore (lr) cfi_restore (ip) cfi_restore (r3) - cfi_restore (r1) - cfi_restore (r0) - pop {r2} - cfi_adjust_cfa_offset (-4) cfi_restore (r2) sfi_breg r0, \ ldr r1, [\B, #4] |