diff options
Diffstat (limited to 'libc-top-half/musl/src/thread/arm/atomics.s')
-rw-r--r-- | libc-top-half/musl/src/thread/arm/atomics.s | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/libc-top-half/musl/src/thread/arm/atomics.s b/libc-top-half/musl/src/thread/arm/atomics.s new file mode 100644 index 0000000..da50508 --- /dev/null +++ b/libc-top-half/musl/src/thread/arm/atomics.s @@ -0,0 +1,106 @@ +.syntax unified +.text + +.global __a_barrier_dummy +.hidden __a_barrier_dummy +.type __a_barrier_dummy,%function +__a_barrier_dummy: + bx lr + +.global __a_barrier_oldkuser +.hidden __a_barrier_oldkuser +.type __a_barrier_oldkuser,%function +__a_barrier_oldkuser: + push {r0,r1,r2,r3,ip,lr} + mov r1,r0 + mov r2,sp + ldr ip,=0xffff0fc0 + bl 1f + pop {r0,r1,r2,r3,ip,lr} + bx lr +1: bx ip + +.global __a_barrier_v6 +.hidden __a_barrier_v6 +.type __a_barrier_v6,%function +__a_barrier_v6: + .arch armv6t2 + mcr p15,0,r0,c7,c10,5 + bx lr + +.global __a_barrier_v7 +.hidden __a_barrier_v7 +.type __a_barrier_v7,%function +__a_barrier_v7: + .arch armv7-a + dmb ish + bx lr + +.global __a_cas_dummy +.hidden __a_cas_dummy +.type __a_cas_dummy,%function +__a_cas_dummy: + mov r3,r0 + ldr r0,[r2] + subs r0,r3,r0 + streq r1,[r2] + bx lr + +.global __a_cas_v6 +.hidden __a_cas_v6 +.type __a_cas_v6,%function +__a_cas_v6: + .arch armv6t2 + mov r3,r0 + mcr p15,0,r0,c7,c10,5 +1: ldrex r0,[r2] + subs r0,r3,r0 + strexeq r0,r1,[r2] + teqeq r0,#1 + beq 1b + mcr p15,0,r0,c7,c10,5 + bx lr + +.global __a_cas_v7 +.hidden __a_cas_v7 +.type __a_cas_v7,%function +__a_cas_v7: + .arch armv7-a + mov r3,r0 + dmb ish +1: ldrex r0,[r2] + subs r0,r3,r0 + strexeq r0,r1,[r2] + teqeq r0,#1 + beq 1b + dmb ish + bx lr + +.global __a_gettp_cp15 +.hidden __a_gettp_cp15 +.type __a_gettp_cp15,%function +__a_gettp_cp15: + mrc p15,0,r0,c13,c0,3 + bx lr + +/* Tag this file with minimum ISA level so as not to affect linking. */ +.object_arch armv4t +.eabi_attribute 6,2 + +.data +.align 2 + +.global __a_barrier_ptr +.hidden __a_barrier_ptr +__a_barrier_ptr: + .word __a_barrier_dummy + +.global __a_cas_ptr +.hidden __a_cas_ptr +__a_cas_ptr: + .word __a_cas_dummy + +.global __a_gettp_ptr +.hidden __a_gettp_ptr +__a_gettp_ptr: + .word __a_gettp_cp15 |