diff options
author | Vladimir Azarov <avm@intermediate-node.net> | 2024-10-01 15:47:05 +0200 |
---|---|---|
committer | Vladimir Azarov <avm@intermediate-node.net> | 2024-10-01 15:47:05 +0200 |
commit | 4abab5ad6c8465a7528ccdd5f49367da05f78bbd (patch) | |
tree | ebf009bf1376a5a223a915bc27cbbd791a1316bc /src/ldso/arm/tlsdesc.S |
Initial version
Diffstat (limited to 'src/ldso/arm/tlsdesc.S')
-rw-r--r-- | src/ldso/arm/tlsdesc.S | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/ldso/arm/tlsdesc.S b/src/ldso/arm/tlsdesc.S new file mode 100644 index 0000000..3ae133c --- /dev/null +++ b/src/ldso/arm/tlsdesc.S @@ -0,0 +1,55 @@ +.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 |