summaryrefslogtreecommitdiffstats
path: root/libc-top-half/musl/src/thread/arm/atomics.s
diff options
context:
space:
mode:
Diffstat (limited to 'libc-top-half/musl/src/thread/arm/atomics.s')
-rw-r--r--libc-top-half/musl/src/thread/arm/atomics.s106
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