diff --git a/libc/private/bionic_tls.h b/libc/private/bionic_tls.h
index 2e7a82b..6fe7007 100644
--- a/libc/private/bionic_tls.h
+++ b/libc/private/bionic_tls.h
@@ -94,11 +94,17 @@ extern int __set_tls(void *ptr);
  */
 #  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; })
+	({ register unsigned int __val asm("r0"); \
+           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 );
