github.com/afumu/libc@v0.0.6/musl/src/ldso/arm/tlsdesc.S (about) 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 .global __tlsdesc_dynamic 12 .hidden __tlsdesc_dynamic 13 .type __tlsdesc_dynamic,%function 14 __tlsdesc_dynamic: 15 push {r2,r3,ip,lr} 16 ldr r1,[r0] 17 ldr r2,[r1,#4] // r2 = offset 18 ldr r1,[r1] // r1 = modid 19 20 #if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \ 21 || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7 22 mrc p15,0,r0,c13,c0,3 23 #else 24 ldr r0,1f 25 add r0,r0,pc 26 ldr r0,[r0] 27 2: 28 #if __ARM_ARCH >= 5 29 blx r0 // r0 = tp 30 #else 31 #if __thumb__ 32 add lr,pc,#1 33 #else 34 mov lr,pc 35 #endif 36 bx r0 37 #endif 38 #endif 39 ldr r3,[r0,#-4] // r3 = dtv 40 ldr ip,[r3,r1,LSL #2] 41 sub r0,ip,r0 42 add r0,r0,r2 // r0 = r3[r1]-r0+r2 43 #if __ARM_ARCH >= 5 44 pop {r2,r3,ip,pc} 45 #else 46 pop {r2,r3,ip,lr} 47 bx lr 48 #endif 49 50 #if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \ 51 || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7 52 #else 53 .align 2 54 1: .word __a_gettp_ptr - 2b 55 #endif