summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/Makefile1
-rw-r--r--kernel/include/atomic.h17
-rw-r--r--kernel/src/apic/rsdp.c1
-rw-r--r--kernel/src/main.c1
-rw-r--r--kernel/src/scheduler/atomic.c27
5 files changed, 46 insertions, 1 deletions
diff --git a/kernel/Makefile b/kernel/Makefile
index 9417ffd..93cfa24 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -33,6 +33,7 @@ OBJS = \
src/mem/paging.o \
src/misc/graphics.o \
src/misc/stdbuff.o \
+ src/scheduler/atomic.o \
src/scheduler/scheduler.o \
src/sys/syscall_asm.o \
src/sys/syscall.o \
diff --git a/kernel/include/atomic.h b/kernel/include/atomic.h
new file mode 100644
index 0000000..5ddc620
--- /dev/null
+++ b/kernel/include/atomic.h
@@ -0,0 +1,17 @@
+#ifndef ATOMIC
+#define ATOMIC
+
+#include <types.h>
+
+struct mutex_t {
+ volatile uint64_t* addr;
+};
+typedef struct mutex_t mutex_t;
+
+
+void init_mutex(mutex_t* mutex);
+bool test_and_set(mutex_t mutex, bool value);
+void lock(mutex_t mutex);
+void unlock(mutex_t mutex);
+
+#endif
diff --git a/kernel/src/apic/rsdp.c b/kernel/src/apic/rsdp.c
index 983ab5f..e0127aa 100644
--- a/kernel/src/apic/rsdp.c
+++ b/kernel/src/apic/rsdp.c
@@ -59,7 +59,6 @@ void list_sys_tables(void)
printf("\n");
kfree(rsdt);
-
}
uint64_t* find_sys_table_addr(const char* signature)
diff --git a/kernel/src/main.c b/kernel/src/main.c
index a14d5ad..766d69c 100644
--- a/kernel/src/main.c
+++ b/kernel/src/main.c
@@ -19,6 +19,7 @@
#include <serial.h>
#include <containter_of.h>
#include <madt.h>
+#include <atomic.h>
int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic);
int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic)
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);
+}