summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2014-11-19 00:40:32 -0500
committerRich Felker <dalias@aerifal.cx>2014-11-19 01:02:01 -0500
commit4a241f14a6bea81b9b50edda09f8184e35a75860 (patch)
treecafc783295719edfa98d5e654e337acfe19ee83e /src
parentd8bdc97d148088bdaa672f56d4b8e0a15b03e70e (diff)
downloadmusl-4a241f14a6bea81b9b50edda09f8184e35a75860.tar.gz
overhaul ARM atomics/tls for performance and compatibility
previously, builds for pre-armv6 targets hard-coded use of the "kuser helper" system for atomics and thread-pointer access, resulting in binaries that fail to run (crash) on systems where this functionality has been disabled (as a security/hardening measure) in the kernel. additionally, builds for armv6 hard-coded an outdated/deprecated memory barrier instruction which may require emulation (extremely slow) on future models. this overhaul replaces the behavior for all pre-armv7 builds (both of the above cases) to perform runtime detection of the appropriate mechanisms for barrier, atomic compare-and-swap, and thread pointer access. detection is based on information provided by the kernel in auxv: presence of the HWCAP_TLS bit for AT_HWCAP and the architecture version encoded in AT_PLATFORM. direct use of the instructions is preferred when possible, since probing for the existence of the kuser helper page would be difficult and would incur runtime cost. for builds targeting armv7 or later, the runtime detection code is not compiled at all, and much more efficient versions of the non-cas atomic operations are provided by using ldrex/strex directly rather than wrapping cas.
Diffstat (limited to 'src')
-rw-r--r--src/thread/arm/__set_thread_area.s13
1 files changed, 1 insertions, 12 deletions
diff --git a/src/thread/arm/__set_thread_area.s b/src/thread/arm/__set_thread_area.s
index 63d8884f..4a4cd0d8 100644
--- a/src/thread/arm/__set_thread_area.s
+++ b/src/thread/arm/__set_thread_area.s
@@ -1,12 +1 @@
-.text
-.global __set_thread_area
-.type __set_thread_area,%function
-__set_thread_area:
- mov r1,r7
- mov r7,#0x0f0000
- add r7,r7,#5
- svc 0
- mov r7,r1
- tst lr,#1
- moveq pc,lr
- bx lr
+/* Replaced by C code in arch/arm/src */