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