Merge pull request #2844 from radical/assign-proj-config
[mono.git] / mono / mini / mini-arm-tls.S
index 1f7204a884b0d09aae0f4319b5fc8721ab2d1b98..c8fa1c9519b8a3cd82b81e7b38120ab20f2c0fbd 100644 (file)
@@ -2,6 +2,7 @@
  * mini-arm-tls.S: tls getters and setters for arm platforms
  *
  * Copyright 2015 Xamarin, Inc.
+        * Licensed under the MIT license. See LICENSE file in the project root for full license information.
  */
 
 #include <config.h>
@@ -57,24 +58,22 @@ DECLARE_GLOBAL_SYMBOL mono_fast_get_tls_key_end
 
        .align 4
 DECLARE_GLOBAL_SYMBOL mono_fallback_get_tls_key
-#if defined(__linux__)
-       mov     r1, r0
-       mvn     r0, #0xf000
-       sub     r0, r0, #31
+#if defined(__linux__) && defined(HAVE_KW_THREAD) && defined(__ARM_EABI__)
        push    {lr}
-       blx     r0
-#if defined(HAVE_KW_THREAD)
+       mov     r1, r0
+       bl      __aeabi_read_tp
        ldr     r0, [r0, r1]
-#elif defined(TARGET_ANDROID)
-       ldr     r0, [r0, r1, lsl #2]
-#endif
        pop     {pc}
 #elif defined(TARGET_IOS)
-       push    {lr}
+       push    {r7, lr}
+       mov     r7, sp
        bl      _pthread_getspecific
+       pop     {r7, pc}
+#elif defined(TARGET_ANDROID)
+       push    {lr}
+       bl      pthread_getspecific
        pop     {pc}
 #endif
-
        /*
         * The following thunks set the value corresponding to the key/offset
         * passed in R0. These thunks don't do jumps to external code so execution
@@ -107,23 +106,54 @@ DECLARE_GLOBAL_SYMBOL mono_fast_set_tls_key_end
 
        .align 4
 DECLARE_GLOBAL_SYMBOL mono_fallback_set_tls_key
-#if defined(__linux__)
-       mov     r2, r0
-       mvn     r0, #0xf000
-       sub     r0, r0, #31
+#if defined(__linux__) && defined(HAVE_KW_THREAD) && defined(__ARM_EABI__)
        push    {lr}
-       blx     r0
-#if defined(HAVE_KW_THREAD)
+       mov     r2, r0
+       bl      __aeabi_read_tp
        str     r1, [r0, r2]
-#elif defined(TARGET_ANDROID)
-       str     r1, [r0, r2, lsl #2]
-#endif
        pop     {pc}
 #elif defined(TARGET_IOS)
-       push    {lr}
+       push    {r7, lr}
+       mov     r7, sp
        bl      _pthread_setspecific
+       pop     {r7, pc}
+#elif defined(TARGET_ANDROID)
+       push    {lr}
+       bl      pthread_setspecific
        pop     {pc}
 #endif
 
+
+       /* Additional tls getters/setters */
+
+#if defined(TARGET_ANDROID)
+       .align 4
+DECLARE_GLOBAL_SYMBOL mono_fast_get_tls_key2
+       bic     r0, r0, #0x80000000
+       mrc     p15, 0, r1, cr13, cr0, #3
+       lsls    r0, r0, #3
+       ldr     r1, [r1, #4]
+       add     r0, r1
+       ldr     r0, [r0, #0x68]
+       bx      lr
+DECLARE_GLOBAL_SYMBOL mono_fast_get_tls_key2_end
+
+       /*
+        * In order to use this fast setter we need to make sure that the key was
+        * already set at least once using the pthread api, otherwise it will not
+        * interwork with the api.
+        */
+       .align 4
+DECLARE_GLOBAL_SYMBOL mono_fast_set_tls_key2
+       bic     r0, r0, #0x80000000
+       mrc     p15, 0, r2, cr13, cr0, #3
+       lsls    r0, r0, #3
+       ldr     r2, [r2, #4]
+       add     r0, r2
+       str     r1, [r0, #0x68]
+       bx      lr
+DECLARE_GLOBAL_SYMBOL mono_fast_set_tls_key2_end
+#endif
+
 #endif