From 817995394b9d9054c89c8bb78b2ab4186ebfad69 Mon Sep 17 00:00:00 2001 From: notsomeidiot123 Date: Sat, 4 Jul 2026 18:10:56 -0400 Subject: [PATCH] Added spinlocks --- src/kernel/kmain.c | 2 +- src/kernel/shared/spinlock.h | 13 +++++++++++++ src/kernel/system/vfs.c | 11 +++++++++++ src/kernel/system/vfs.h | 2 ++ src/kmodules/disk_driver.c | 3 ++- 5 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/kernel/shared/spinlock.h diff --git a/src/kernel/kmain.c b/src/kernel/kmain.c index 0f115a1..c9cf5e9 100644 --- a/src/kernel/kmain.c +++ b/src/kernel/kmain.c @@ -57,7 +57,7 @@ extern void kmain(kernel_info_t *kernel_info){ pic_init(0x20); pic_setmask(0x0, PIC1_DATA); pic_setmask(0x0, PIC2_DATA); - + vfs_init(); fcreate("/dev", FS_FILE_IS_DIR); fcreate("/dev/disk", FS_FILE_IS_DIR); fcreate("/tmp", FS_FILE_IS_DIR); diff --git a/src/kernel/shared/spinlock.h b/src/kernel/shared/spinlock.h new file mode 100644 index 0000000..16eafb1 --- /dev/null +++ b/src/kernel/shared/spinlock.h @@ -0,0 +1,13 @@ +#include + +typedef struct spinlock{ + atomic_flag lock; +}spinlock_t; + +inline void spinlock_acquire(spinlock_t spinlock){ + // atomic_compare_exchange_strong(&spinlock.lock, &spinlock.unlocked, spinlock.locked); + while(atomic_flag_test_and_set_explicit(&spinlock.lock, memory_order_acquire)); +} +inline void spinlock_release(spinlock_t spinlock){ + atomic_flag_clear_explicit(&spinlock.lock, memory_order_release); +} \ No newline at end of file diff --git a/src/kernel/system/vfs.c b/src/kernel/system/vfs.c index 0d691cd..322a197 100644 --- a/src/kernel/system/vfs.c +++ b/src/kernel/system/vfs.c @@ -3,6 +3,7 @@ #include "../shared/kstdlib.h" #include "../shared/memory.h" #include "../shared/string.h" +#include "../shared/spinlock.h" #define MODULE_NAME "KVFS" // !TODO: Modify code to become thread-safe @@ -13,9 +14,17 @@ // return; // } +spinlock_t vfs_lock; + +void vfs_init(){ + spinlock_release(vfs_lock); +} + vfile_t *fcreate(char *path, FS_FILE_FLAGS flags){ // return 0; + spinlock_acquire(vfs_lock); vfile_t *returnable = vfcreate(get_root_dir(), path, flags); + spinlock_release(vfs_lock); return 0; } @@ -60,9 +69,11 @@ vfile_t *vfcreate(vfile_t *parent_dir, char *relpath, FS_FILE_FLAGS flags){ } int fdelete(vfile_t *file_entry){ + spinlock_acquire(vfs_lock); if(!file_entry || !file_entry->fileops || !file_entry->fileops->delete){ return 0; } + spinlock_release(vfs_lock); return file_entry->fileops->delete(file_entry); } diff --git a/src/kernel/system/vfs.h b/src/kernel/system/vfs.h index 08ae398..b2c7ba7 100644 --- a/src/kernel/system/vfs.h +++ b/src/kernel/system/vfs.h @@ -37,6 +37,8 @@ typedef struct virtual_file{ }vfile_t; +void vfs_init(); + // vfile_t *rfopen(char *name, vfile_t dir); vfile_t *fcreate(char *path, FS_FILE_FLAGS flags); int fdelete(vfile_t* file_entry); diff --git a/src/kmodules/disk_driver.c b/src/kmodules/disk_driver.c index b16655d..b0f277f 100644 --- a/src/kmodules/disk_driver.c +++ b/src/kmodules/disk_driver.c @@ -379,7 +379,8 @@ int ata_read(vfile_t *file, uint8_t *ptr, uint32_t offset, uint32_t count) { transferring_pid = cpid; outb(bm_base, 0x09); - asm("sti"); + // asm("sti"); // TODO: Make it so that instead of sti(), restore interrupt flag + if(!api(MODULE_API_IS_INTERRUPT)) asm("sti"); uint8_t status = inb(ctrl_base); uint8_t bm_status = inb(bm_base + 2);