From ce6b17d72bc5fe37f455d5ff4fd326af80ab312f Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Wed, 13 Aug 2025 22:19:11 +0200 Subject: [PATCH] Move spinlock to separate folder --- kernel/Makefile | 1 + kernel/kmain.c | 2 +- kernel/pmm/pmm.c | 12 ++++++------ kernel/pmm/pmm.h | 2 +- kernel/spinlock.h | 31 ------------------------------- kernel/spinlock/spinlock.c | 20 ++++++++++++++++++++ kernel/spinlock/spinlock.h | 21 +++++++++++++++++++++ 7 files changed, 50 insertions(+), 39 deletions(-) delete mode 100644 kernel/spinlock.h create mode 100644 kernel/spinlock/spinlock.c create mode 100644 kernel/spinlock/spinlock.h diff --git a/kernel/Makefile b/kernel/Makefile index 6fded82..0e87b4f 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -19,6 +19,7 @@ SRCFILES := $(wildcard *.c) \ $(wildcard bitmap/*.c) \ $(wildcard pmm/*.c) \ $(wildcard bootinfo/*.c) \ + $(wildcard spinlock/*.c) \ $(wildcard hal/*.c) \ $(wildcard hal/$(ARCH)/*.c) \ $(wildcard hal/$(ARCH)/*.S) \ diff --git a/kernel/kmain.c b/kernel/kmain.c index 7fddd12..7abcc7a 100644 --- a/kernel/kmain.c +++ b/kernel/kmain.c @@ -13,8 +13,8 @@ void kmain(void) { } bootinfo_init(); - pmm_init(); hal_init(); + pmm_init(); kprintf(BANNER_TEXT "\n"); diff --git a/kernel/pmm/pmm.c b/kernel/pmm/pmm.c index 0516593..31ddc1c 100644 --- a/kernel/pmm/pmm.c +++ b/kernel/pmm/pmm.c @@ -1,17 +1,17 @@ #include #include #include "pmm.h" -#include "spinlock.h" #include "kprintf.h" #include "bitmap/bitmap.h" #include "bootinfo/bootinfo.h" +#include "spinlock/spinlock.h" #define _DIV_ROUNDUP(num, div) ((num + div - 1) / div) PhysMem PHYS_MEM; void pmm_init(void) { - PHYS_MEM.spinlock = SPINLOCK_INIT(); + spinlock_init(&PHYS_MEM.spinlock); BitMap *bm = &PHYS_MEM.self; bm->init = false; @@ -53,9 +53,9 @@ void pmm_init(void) { } void *pmm_alloc(size_t pages) { - SPINLOCK_ACQUIRE(&PHYS_MEM.spinlock); + spinlock_acquire(&PHYS_MEM.spinlock); uintptr_t phys = (uintptr_t)bitmap_alloc(&PHYS_MEM.self, pages); - SPINLOCK_RELEASE(&PHYS_MEM.spinlock); + spinlock_release(&PHYS_MEM.spinlock); if (!phys) { ERR("hal/pmm", "phys memory ran out\n"); @@ -65,7 +65,7 @@ void *pmm_alloc(size_t pages) { } void pmm_free(uintptr_t ptr, size_t pages) { - SPINLOCK_ACQUIRE(&PHYS_MEM.spinlock); + spinlock_acquire(&PHYS_MEM.spinlock); bitmap_markregion(&PHYS_MEM.self, (void *)ptr, pages * BITMAP_BLOCK_SIZE, 0); - SPINLOCK_RELEASE(&PHYS_MEM.spinlock); + spinlock_release(&PHYS_MEM.spinlock); } diff --git a/kernel/pmm/pmm.h b/kernel/pmm/pmm.h index 005cd25..f377d5e 100644 --- a/kernel/pmm/pmm.h +++ b/kernel/pmm/pmm.h @@ -3,8 +3,8 @@ #include #include -#include "spinlock.h" #include "bitmap/bitmap.h" +#include "spinlock/spinlock.h" typedef struct { SpinLock spinlock; diff --git a/kernel/spinlock.h b/kernel/spinlock.h deleted file mode 100644 index 5ee2b72..0000000 --- a/kernel/spinlock.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef SPINLOCK_SPINLOCK_H_ -#define SPINLOCK_SPINLOCK_H_ - -#include -#include "hal/hal.h" - -typedef atomic_bool SpinLock; - -// Spin more efficiently - cpu dependant -#if defined(__x86_64__) -# define SPINLOCK_HINT() asm volatile("pause") -#else -# define SPINLOCK_HINT() -#endif - -#define SPINLOCK_ACQUIRE(sl) \ - do { \ - bool __unlocked = false; \ - while (!atomic_compare_exchange_weak((sl), &__unlocked, true)) { \ - SPINLOCK_HINT(); \ - } \ - } while(0) - -#define SPINLOCK_RELEASE(sl) \ - do { \ - atomic_store((sl), false); \ - } while(0) - -#define SPINLOCK_INIT() false - -#endif // SPINLOCK_SPINLOCK_H_ diff --git a/kernel/spinlock/spinlock.c b/kernel/spinlock/spinlock.c new file mode 100644 index 0000000..390c41d --- /dev/null +++ b/kernel/spinlock/spinlock.c @@ -0,0 +1,20 @@ +#include +#include +#include "spinlock.h" + +void spinlock_init(SpinLock *sl) { + atomic_store(&sl->lock, false); +} + +void spinlock_acquire(SpinLock *sl) { + bool unlocked = false; + while (!atomic_compare_exchange_weak(&sl->lock, &unlocked, true)) { + unlocked = false; + SPINLOCK_HINT(); + } +} + +void spinlock_release(SpinLock *sl) { + atomic_store(&sl->lock, false); +} + diff --git a/kernel/spinlock/spinlock.h b/kernel/spinlock/spinlock.h new file mode 100644 index 0000000..9fc80c4 --- /dev/null +++ b/kernel/spinlock/spinlock.h @@ -0,0 +1,21 @@ +#ifndef SPINLOCK_SPINLOCK_H_ +#define SPINLOCK_SPINLOCK_H_ + +#include +#include +#include "hal/hal.h" + +typedef struct { atomic_bool lock; } SpinLock; + +// Spin more efficiently - cpu dependant +#if defined(__x86_64__) +# define SPINLOCK_HINT() asm volatile("pause") +#else +# define SPINLOCK_HINT() +#endif + +void spinlock_init(SpinLock *sl); +void spinlock_acquire(SpinLock *sl); +void spinlock_release(SpinLock *sl); + +#endif // SPINLOCK_SPINLOCK_H_