summaryrefslogtreecommitdiff
path: root/demo/lock.S
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2023-10-03 23:16:08 -0600
committerAlejandro Soto <alejandro@34project.org>2023-10-03 23:16:08 -0600
commit3de42a19661a3d6d24de46ca2920b06e1dc88fe0 (patch)
treeacdd022a14d43d60dbfec1f4df8c634e0d080ec0 /demo/lock.S
parent1094451235282af6a9daba2b2a460577f82d289c (diff)
demo: initial commit
Diffstat (limited to 'demo/lock.S')
-rw-r--r--demo/lock.S26
1 files changed, 26 insertions, 0 deletions
diff --git a/demo/lock.S b/demo/lock.S
new file mode 100644
index 0000000..3ec2765
--- /dev/null
+++ b/demo/lock.S
@@ -0,0 +1,26 @@
+.global spin_init
+spin_init:
+ mov r1, #0
+ str r1, [r0]
+ mov pc, lr
+
+.global spin_lock
+spin_lock:
+ mrs r2, cpsr
+ str r2, [r1]
+ orr r2, r2, #0xc0 @ Levanta I, F
+ msr cpsr_c, r2
+ mov r3, #1
+1: ldrex r2, [r0]
+ teq r2, #0
+ strexeq r2, r3, [r0]
+ teqeq r2, #0
+ bne 1b
+ mov pc, lr
+
+.global spin_unlock
+spin_unlock:
+ mov r2, #0
+ str r2, [r0]
+ msr cpsr_c, r1
+ mov pc, lr