tlsdesc.S raw

   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
  56