summaryrefslogtreecommitdiff
path: root/kernel/src/scheduler
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksav013@gmail.com>2023-01-28 21:06:31 +0100
committerAleksa Vuckovic <aleksav013@gmail.com>2023-01-28 21:13:50 +0100
commitd9194d46ef70e7c9f76b876b2439c24649d57d1e (patch)
tree80c84763508f0431f3f8dde673615f6b2714a4be /kernel/src/scheduler
parentc53c696286821ad13ab9ec61ed011cfe90e193c0 (diff)
atomic test_and_set; spinlocks
Diffstat (limited to 'kernel/src/scheduler')
-rw-r--r--kernel/src/scheduler/atomic.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/kernel/src/scheduler/atomic.c b/kernel/src/scheduler/atomic.c
new file mode 100644
index 0000000..41ce3b9
--- /dev/null
+++ b/kernel/src/scheduler/atomic.c
@@ -0,0 +1,27 @@
+#include <types.h>
+#include <atomic.h>
+#include <libk/stdio.h>
+#include <heap.h>
+
+void init_mutex(mutex_t* mutex)
+{
+ mutex->addr = (uint64_t*)kalloc(sizeof(uint64_t));
+ *(mutex->addr) = 0;
+}
+
+bool test_and_set(mutex_t mutex, bool value)
+{
+ bool rax;
+ __asm__ volatile ("lock xchg %%rax, (%%rbx);" : "=a"(rax) : "b"(mutex.addr), "a"(value));
+ return rax;
+}
+
+void lock(mutex_t mutex)
+{
+ while (test_and_set(mutex, 1)) ;
+}
+
+void unlock(mutex_t mutex)
+{
+ test_and_set(mutex, 0);
+}