56 lines
1.0 KiB
ArmAsm
56 lines
1.0 KiB
ArmAsm
.syntax unified
|
|
|
|
.text
|
|
.global __tlsdesc_static
|
|
.hidden __tlsdesc_static
|
|
.type __tlsdesc_static,%function
|
|
__tlsdesc_static:
|
|
ldr r0,[r0]
|
|
bx lr
|
|
|
|
.global __tlsdesc_dynamic
|
|
.hidden __tlsdesc_dynamic
|
|
.type __tlsdesc_dynamic,%function
|
|
__tlsdesc_dynamic:
|
|
push {r2,r3,ip,lr}
|
|
ldr r1,[r0]
|
|
ldr r2,[r1,#4] // r2 = offset
|
|
ldr r1,[r1] // r1 = modid
|
|
|
|
#if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \
|
|
|| __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
|
|
mrc p15,0,r0,c13,c0,3
|
|
#else
|
|
ldr r0,1f
|
|
add r0,r0,pc
|
|
ldr r0,[r0]
|
|
2:
|
|
#if __ARM_ARCH >= 5
|
|
blx r0 // r0 = tp
|
|
#else
|
|
#if __thumb__
|
|
add lr,pc,#1
|
|
#else
|
|
mov lr,pc
|
|
#endif
|
|
bx r0
|
|
#endif
|
|
#endif
|
|
ldr r3,[r0,#-4] // r3 = dtv
|
|
ldr ip,[r3,r1,LSL #2]
|
|
sub r0,ip,r0
|
|
add r0,r0,r2 // r0 = r3[r1]-r0+r2
|
|
#if __ARM_ARCH >= 5
|
|
pop {r2,r3,ip,pc}
|
|
#else
|
|
pop {r2,r3,ip,lr}
|
|
bx lr
|
|
#endif
|
|
|
|
#if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \
|
|
|| __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
|
|
#else
|
|
.align 2
|
|
1: .word __a_gettp_ptr - 2b
|
|
#endif
|