diff options
author | Rich Felker <dalias@aerifal.cx> | 2014-11-22 12:26:38 -0500 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2014-11-22 12:26:38 -0500 |
commit | 8cd0b11eafeaaec3df5113cb39094e5456ca6b22 (patch) | |
tree | 310e944d94172757e21a27734d4261ee1e6d8cea /arch/arm/src/arm/atomics.s | |
parent | 4a241f14a6bea81b9b50edda09f8184e35a75860 (diff) | |
download | musl-8cd0b11eafeaaec3df5113cb39094e5456ca6b22.tar.gz |
fix __aeabi_read_tp oversight in arm atomics/tls overhaul
calls to __aeabi_read_tp may be generated by the compiler to access
TLS on pre-v6 targets. previously, this function was hard-coded to
call the kuser helper, which would crash on kernels with kuser helper
removed.
to fix the problem most efficiently, the definition of __aeabi_read_tp
is moved so that it's an alias for the new __a_gettp. however, on v7+
targets, code to initialize the runtime choice of thread-pointer
loading code is not even compiled, meaning that defining
__aeabi_read_tp would have caused an immediate crash due to using the
default implementation of __a_gettp with a HCF instruction.
fortunately there is an elegant solution which reduces overall code
size: putting the native thread-pointer loading instruction in the
default code path for __a_gettp, so that separate default/native code
paths are not needed. this function should never be called before
__set_thread_area anyway, and if it is called early on pre-v6
hardware, the old behavior (crashing) is maintained.
ideally __aeabi_read_tp would not be called at all on v7+ targets
anyway -- in fact, prior to the overhaul, the same problem existed,
but it was never caught by users building for v7+ with kuser disabled.
however, it's possible for calls to __aeabi_read_tp to end up in a v7+
binary if some of the object files were built for pre-v7 targets, e.g.
in the case of static libraries that were built separately, so this
case needs to be handled.
Diffstat (limited to 'arch/arm/src/arm/atomics.s')
-rw-r--r-- | arch/arm/src/arm/atomics.s | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/arch/arm/src/arm/atomics.s b/arch/arm/src/arm/atomics.s index 9fcc7bd7..f241cc02 100644 --- a/arch/arm/src/arm/atomics.s +++ b/arch/arm/src/arm/atomics.s @@ -81,6 +81,10 @@ __a_cas_v7: .word 0xf57ff05b /* dmb ish */ bx lr +.global __aeabi_read_tp +.type __aeabi_read_tp,%function +__aeabi_read_tp: + .global __a_gettp .hidden __a_gettp .type __a_gettp,%function @@ -92,10 +96,6 @@ __a_gettp: .global __a_gettp_dummy .hidden __a_gettp_dummy __a_gettp_dummy: - .word 0xe7fddef1 -.global __a_gettp_native -.hidden __a_gettp_native -__a_gettp_native: mrc p15,0,r0,c13,c0,3 bx lr |