summaryrefslogtreecommitdiff
path: root/kernel/src/scheduler
diff options
context:
space:
mode:
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);
+}