dns response handling: don't treat too many addresses as an error
[musl] / src / ldso / arm / tlsdesc.S
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