ARM: Fix handling of concurrent TLS descriptor resolution

The current code for handling concurrent resolution says that the
ABI for _dl_tlsdesc_resolve_hold is the same as that of
_dl_tlsdesc_lazy_resolver. However _dl_tlsdesc_resolve_hold is
called from the trampoline directly rather than the lazy resolver
stub so, for example, r2 has not been pushed so does not needed
to be restored.

This fixes an intermittent failure in nptl/tst-tls3 when building
glibc for arm-linux-gnueabihf with -mtls-dialect=gnu2.

ChangeLog:

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.
This commit is contained in:
Will Newton 2014-05-23 15:24:30 +01:00
parent 2482ae433a
commit 36ffe7398a
3 changed files with 19 additions and 20 deletions

View File

@ -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]

2
NEWS
View File

@ -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.

View File

@ -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]