diff --git a/libc/private/bionic_tls.h b/libc/private/bionic_tls.h
index 2412577..cc051f3 100644
--- a/libc/private/bionic_tls.h
+++ b/libc/private/bionic_tls.h
@@ -88,18 +88,24 @@ extern int __set_tls(void *ptr);
 
 /* get the TLS */
 #ifdef __arm__
-/* Linux kernel helpers for its TLS implementation */
-/* For performance reasons, avoid calling the kernel helper
- * Note that HAVE_ARM_TLS_REGISTER is build-specific
- * (it must match your kernel configuration)
+/* 
+ * Linux kernel helpers for its TLS implementation.
+ * Call the kernel helper function, regardless if the arch version has
+ * the TLS register or not.
  */
 #  ifdef HAVE_ARM_TLS_REGISTER
 #    define __get_tls() \
     ({ register unsigned int __val asm("r0"); \
-       asm ("mrc p15, 0, r0, c13, c0, 3" : "=r"(__val) ); \
-       (volatile void*)__val; })
+           asm(                         \
+                "ldr r0,=0xffff0fe0\n"  \
+                "blx r0\n"              \
+                : "=r" (__val)          \
+                :                       \
+                : "lr", "cc"            \
+               );                       \
+      (volatile void*)__val; })
 #  else /* !HAVE_ARM_TLS_REGISTER */
-#    define __get_tls() ( *((volatile void **) 0xffff0ff0) )
+#    define __get_tls() ( ((volatile void * (*)(void)) 0xffff0fe0)() )
 #  endif
 #else
 extern void*  __get_tls( void );
