about summary refs log tree commit diff stats
path: root/tools/iso/kernel.soso/spinlock.c
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-01-01 18:22:19 -0800
committerKartik Agaram <vc@akkartik.com>2020-01-01 18:42:48 -0800
commit65409d2312e702a48d3cf5b32479d25266bda3c3 (patch)
tree62a7262fce61f2302109246da4536ce6f8e9ef80 /tools/iso/kernel.soso/spinlock.c
parenta6da50ad30d2e1825575ffef497ab450a8f26e94 (diff)
downloadmu-65409d2312e702a48d3cf5b32479d25266bda3c3.tar.gz
5858
Move script to create a Soso boot image into a sub-directory.

I'm trying to streamline newcomer attention to just a couple of use cases.
Diffstat (limited to 'tools/iso/kernel.soso/spinlock.c')
-rw-r--r--tools/iso/kernel.soso/spinlock.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/tools/iso/kernel.soso/spinlock.c b/tools/iso/kernel.soso/spinlock.c
new file mode 100644
index 00000000..8efbdb20
--- /dev/null
+++ b/tools/iso/kernel.soso/spinlock.c
@@ -0,0 +1,25 @@
+#include "spinlock.h"
+
+static inline int32 exchangeAtomic(volatile int32* oldValueAddress, int32 newValue) {
+    //no need to use lock instruction on xchg
+
+    asm volatile ("xchgl %0, %1"
+                   : "=r"(newValue)
+                   : "m"(*oldValueAddress), "0"(newValue)
+                   : "memory");
+    return newValue;
+}
+
+void Spinlock_Init(Spinlock* spinlock) {
+    *spinlock = 0;
+}
+
+void Spinlock_Lock(Spinlock* spinlock) {
+    while (exchangeAtomic((int32*)spinlock, 1)) {
+        halt();
+    }
+}
+
+void Spinlock_Unlock(Spinlock* spinlock) {
+    *spinlock = 0;
+}