diff options
| -rw-r--r-- | kernel/Makefile | 1 | ||||
| -rw-r--r-- | kernel/include/atomic.h | 17 | ||||
| -rw-r--r-- | kernel/src/apic/rsdp.c | 1 | ||||
| -rw-r--r-- | kernel/src/main.c | 1 | ||||
| -rw-r--r-- | kernel/src/scheduler/atomic.c | 27 |
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); +} |
