OSDN Git Service

4e67c3e25cfef21c1198db99e0a918361c63d989
[android-x86/external-musl-libc.git] / src / ldso / arm / tlsdesc.S
1 .syntax unified
2
3 .text
4 .global __tlsdesc_static
5 .hidden __tlsdesc_static
6 .type __tlsdesc_static,%function
7 __tlsdesc_static:
8         ldr r0,[r0]
9         bx lr
10
11 .hidden __tls_get_new
12
13 .global __tlsdesc_dynamic
14 .hidden __tlsdesc_dynamic
15 .type __tlsdesc_dynamic,%function
16 __tlsdesc_dynamic:
17         push {r2,r3,ip,lr}
18         ldr r1,[r0]
19         ldr r2,[r1,#4]  // r2 = offset
20         ldr r1,[r1]     // r1 = modid
21
22 #if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \
23  || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
24         mrc p15,0,r0,c13,c0,3
25 #else
26         ldr r0,1f
27         add r0,r0,pc
28         ldr r0,[r0]
29 2:
30 #if __ARM_ARCH >= 5
31         blx r0          // r0 = tp
32 #else
33         mov lr,pc
34         bx r0
35 #endif
36 #endif
37         ldr r3,[r0,#-4] // r3 = dtv
38         ldr ip,[r3]     // ip = dtv slot count
39         cmp r1,ip
40         bhi 3f
41         ldr ip,[r3,r1,LSL #2]
42         sub r0,ip,r0
43         add r0,r0,r2    // r0 = r3[r1]-r0+r2
44 4:
45 #if __ARM_ARCH >= 5
46         pop {r2,r3,ip,pc}
47 #else
48         pop {r2,r3,ip,lr}
49         bx lr
50 #endif
51
52 3:
53 #if __ARM_PCS_VFP || !__SOFTFP__
54         .fpu vfp
55         vpush {d0-d7}
56 #endif
57         push {r0-r3}
58         add r0,sp,#4
59         bl __tls_get_new
60         pop {r1-r3,ip}
61 #if __ARM_PCS_VFP || !__SOFTFP__
62         vpop {d0-d7}
63 #endif
64         sub r0,r0,r1    // r0 = retval-tp
65         b 4b
66
67 #if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \
68  || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
69 #else
70         .align 2
71 1:      .word __a_gettp_ptr - 2b
72 #endif