xref: /aosp_15_r20/external/musl/src/ldso/arm/tlsdesc.S (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker.syntax unified
2*c9945492SAndroid Build Coastguard Worker
3*c9945492SAndroid Build Coastguard Worker.text
4*c9945492SAndroid Build Coastguard Worker.global __tlsdesc_static
5*c9945492SAndroid Build Coastguard Worker.hidden __tlsdesc_static
6*c9945492SAndroid Build Coastguard Worker.type __tlsdesc_static,%function
7*c9945492SAndroid Build Coastguard Worker__tlsdesc_static:
8*c9945492SAndroid Build Coastguard Worker	ldr r0,[r0]
9*c9945492SAndroid Build Coastguard Worker	bx lr
10*c9945492SAndroid Build Coastguard Worker
11*c9945492SAndroid Build Coastguard Worker.global __tlsdesc_dynamic
12*c9945492SAndroid Build Coastguard Worker.hidden __tlsdesc_dynamic
13*c9945492SAndroid Build Coastguard Worker.type __tlsdesc_dynamic,%function
14*c9945492SAndroid Build Coastguard Worker__tlsdesc_dynamic:
15*c9945492SAndroid Build Coastguard Worker	push {r2,r3,ip,lr}
16*c9945492SAndroid Build Coastguard Worker	ldr r1,[r0]
17*c9945492SAndroid Build Coastguard Worker	ldr r2,[r1,#4]  // r2 = offset
18*c9945492SAndroid Build Coastguard Worker	ldr r1,[r1]     // r1 = modid
19*c9945492SAndroid Build Coastguard Worker
20*c9945492SAndroid Build Coastguard Worker#if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \
21*c9945492SAndroid Build Coastguard Worker || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
22*c9945492SAndroid Build Coastguard Worker	mrc p15,0,r0,c13,c0,3
23*c9945492SAndroid Build Coastguard Worker#else
24*c9945492SAndroid Build Coastguard Worker	ldr r0,1f
25*c9945492SAndroid Build Coastguard Worker	add r0,r0,pc
26*c9945492SAndroid Build Coastguard Worker	ldr r0,[r0]
27*c9945492SAndroid Build Coastguard Worker2:
28*c9945492SAndroid Build Coastguard Worker#if __ARM_ARCH >= 5
29*c9945492SAndroid Build Coastguard Worker	blx r0          // r0 = tp
30*c9945492SAndroid Build Coastguard Worker#else
31*c9945492SAndroid Build Coastguard Worker#if __thumb__
32*c9945492SAndroid Build Coastguard Worker	add lr,pc,#1
33*c9945492SAndroid Build Coastguard Worker#else
34*c9945492SAndroid Build Coastguard Worker	mov lr,pc
35*c9945492SAndroid Build Coastguard Worker#endif
36*c9945492SAndroid Build Coastguard Worker	bx r0
37*c9945492SAndroid Build Coastguard Worker#endif
38*c9945492SAndroid Build Coastguard Worker#endif
39*c9945492SAndroid Build Coastguard Worker	ldr r3,[r0,#-4] // r3 = dtv
40*c9945492SAndroid Build Coastguard Worker	ldr ip,[r3,r1,LSL #2]
41*c9945492SAndroid Build Coastguard Worker	sub r0,ip,r0
42*c9945492SAndroid Build Coastguard Worker	add r0,r0,r2    // r0 = r3[r1]-r0+r2
43*c9945492SAndroid Build Coastguard Worker#if __ARM_ARCH >= 5
44*c9945492SAndroid Build Coastguard Worker	pop {r2,r3,ip,pc}
45*c9945492SAndroid Build Coastguard Worker#else
46*c9945492SAndroid Build Coastguard Worker	pop {r2,r3,ip,lr}
47*c9945492SAndroid Build Coastguard Worker	bx lr
48*c9945492SAndroid Build Coastguard Worker#endif
49*c9945492SAndroid Build Coastguard Worker
50*c9945492SAndroid Build Coastguard Worker#if ((__ARM_ARCH_6K__ || __ARM_ARCH_6KZ__ || __ARM_ARCH_6ZK__) && !__thumb__) \
51*c9945492SAndroid Build Coastguard Worker || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7
52*c9945492SAndroid Build Coastguard Worker#else
53*c9945492SAndroid Build Coastguard Worker	.align 2
54*c9945492SAndroid Build Coastguard Worker1:	.word __a_gettp_ptr - 2b
55*c9945492SAndroid Build Coastguard Worker#endif
56