From cf51600c6a55a26f51053cea902254b0c5e63a6a Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Tue, 27 Jan 2026 17:34:43 +0100 Subject: [PATCH] Cleanup syscalls --- include/m/syscall_defs.h | 8 ++-- init/init.c | 99 +++------------------------------------- kernel/amd64/proc.c | 3 +- kernel/proc/procgroup.c | 8 +--- kernel/proc/procgroup.h | 1 - kernel/proc/resource.c | 9 ++-- kernel/proc/resource.h | 3 +- kernel/sys/proc.h | 3 +- kernel/syscall/syscall.c | 31 +++++++------ libmsl/alloc/liballoc.c | 10 ++-- libmsl/m/system.c | 16 +++---- libmsl/m/system.h | 10 ++-- 12 files changed, 49 insertions(+), 152 deletions(-) diff --git a/include/m/syscall_defs.h b/include/m/syscall_defs.h index a484f64..0a950f9 100644 --- a/include/m/syscall_defs.h +++ b/include/m/syscall_defs.h @@ -7,9 +7,9 @@ #define SYS_UNMAP 4 #define SYS_CLONE 5 #define SYS_SCHED 6 -#define SYS_CREATE_MUTEX 7 -#define SYS_UNLINK_MUTEX 8 -#define SYS_LOCK_MUTEX 9 -#define SYS_UNLOCK_MUTEX 10 +#define SYS_MUTEX_CREATE 7 +#define SYS_MUTEX_DELETE 8 +#define SYS_MUTEX_LOCK 9 +#define SYS_MUTEX_UNLOCK 10 #endif // _M_SYSCALL_DEFS_H diff --git a/init/init.c b/init/init.c index bd2072b..5398546 100644 --- a/init/init.c +++ b/init/init.c @@ -6,10 +6,6 @@ #include #include -#define EXAMPLE 2 - -#if EXAMPLE == 1 - #define MUTEX 2000 void app_thread1 (void); @@ -21,116 +17,33 @@ int spawn (void (*fn) (void)) { return -ST_OOM_ERROR; uintptr_t stack_top = (uintptr_t)stack + stack_size; - return clone (stack_top, stack_size, fn); + return clone (stack_top, fn); } void app_main (void) { - create_mutex (MUTEX); - - spawn (&app_thread1); - - lock_mutex (MUTEX); - - for (int i = 0; i < 3; i++) - test ('a'); - - unlock_mutex (MUTEX); -} - -void app_thread1 (void) { - lock_mutex (MUTEX); - - for (int i = 0; i < 3; i++) - test ('b'); - - unlock_mutex (MUTEX); - - quit (); -} -#elif EXAMPLE == 2 - -#define MUTEX 2000 - -void app_thread1 (void); - -int spawn (void (*fn) (void)) { - size_t stack_size = 256 * PAGE_SIZE; - void* stack = malloc (stack_size); - if (stack == NULL) - return -ST_OOM_ERROR; - - uintptr_t stack_top = (uintptr_t)stack + stack_size; - return clone (stack_top, stack_size, fn); -} - -void app_main (void) { - create_mutex (MUTEX); + mutex_create (MUTEX); spawn (&app_thread1); for (;;) { - lock_mutex (MUTEX); + mutex_lock (MUTEX); for (int i = 0; i < 3; i++) test ('a'); - unlock_mutex (MUTEX); + mutex_unlock (MUTEX); } } void app_thread1 (void) { for (;;) { - lock_mutex (MUTEX); + mutex_lock (MUTEX); for (int i = 0; i < 3; i++) test ('b'); - unlock_mutex (MUTEX); + mutex_unlock (MUTEX); } quit (); } -#elif EXAMPLE == 3 - -#define MUTEX 2000 - -void app_thread1 (void); - -int spawn (void (*fn) (void)) { - size_t stack_size = 256 * PAGE_SIZE; - void* stack = malloc (stack_size); - if (stack == NULL) - return -ST_OOM_ERROR; - - uintptr_t stack_top = (uintptr_t)stack + stack_size; - return clone (stack_top, stack_size, fn); -} - -void app_main (void) { - create_mutex (MUTEX); - - spawn (&app_thread1); - - for (;;) { - lock_mutex (MUTEX); - - for (int i = 0; i < 3; i++) - test ('a'); - - quit (); - } -} - -void app_thread1 (void) { - for (;;) { - lock_mutex (MUTEX); - - for (int i = 0; i < 3; i++) - test ('b'); - - unlock_mutex (MUTEX); - } - - quit (); -} -#endif diff --git a/kernel/amd64/proc.c b/kernel/amd64/proc.c index 3a769a1..3f14cfc 100644 --- a/kernel/amd64/proc.c +++ b/kernel/amd64/proc.c @@ -57,8 +57,7 @@ struct proc* proc_from_elf (uint8_t* elf_contents) { return proc; } -struct proc* proc_clone (struct proc* proto, uintptr_t vstack_top, size_t stack_size, - uintptr_t entry) { +struct proc* proc_clone (struct proc* proto, uintptr_t vstack_top, uintptr_t entry) { struct limine_hhdm_response* hhdm = limine_hhdm_request.response; spin_lock_ctx_t ctxprt; diff --git a/kernel/proc/procgroup.c b/kernel/proc/procgroup.c index d56814d..c8ca3f8 100644 --- a/kernel/proc/procgroup.c +++ b/kernel/proc/procgroup.c @@ -183,7 +183,7 @@ void procgroup_detach (struct procgroup* procgroup, struct proc* proc) { spin_unlock (&procgroup->lock, &ctxpg); rw_spin_write_unlock (&procgroup_tree_lock, &ctxpgtr); - /* unlink resources */ + /* delete resources */ struct rb_node_link* rnode; rbtree_first (&procgroup->resource_tree, rnode); while (rnode) { @@ -195,7 +195,7 @@ void procgroup_detach (struct procgroup* procgroup, struct proc* proc) { rnode = next; - proc_resource_unlink (resource); + proc_delete_resource (resource); } struct list_node_link *mapping_link, *mapping_link_tmp; @@ -212,7 +212,3 @@ void procgroup_detach (struct procgroup* procgroup, struct proc* proc) { free (procgroup); } } - -int procgroup_get_sys_rid (struct procgroup* procgroup) { - return atomic_fetch_add (&procgroup->sys_rids, 1); -} diff --git a/kernel/proc/procgroup.h b/kernel/proc/procgroup.h index 4bd897c..cb46444 100644 --- a/kernel/proc/procgroup.h +++ b/kernel/proc/procgroup.h @@ -33,7 +33,6 @@ struct procgroup { struct procgroup* procgroup_create (void); void procgroup_attach (struct procgroup* procgroup, struct proc* proc); void procgroup_detach (struct procgroup* procgroup, struct proc* proc); -int procgroup_get_sys_rid (struct procgroup* procgroup); uintptr_t procgroup_map (struct procgroup* procgroup, uintptr_t vaddr, size_t pages, uint32_t flags, uintptr_t* out_paddr); bool procgroup_unmap (struct procgroup* procgroup, uintptr_t start_vaddr, size_t pages); diff --git a/kernel/proc/resource.c b/kernel/proc/resource.c index 276dd20..1d38932 100644 --- a/kernel/proc/resource.c +++ b/kernel/proc/resource.c @@ -42,7 +42,6 @@ struct proc_resource* proc_create_resource_mutex (struct procgroup* procgroup, i resource->u.mutex.resource = resource; resource->rid = rid; resource->type = PR_MUTEX; - resource->refs = 1; spin_lock (&procgroup->lock, &ctxpg); rbtree_insert (struct proc_resource, &procgroup->resource_tree, &resource->resource_tree_link, @@ -52,9 +51,7 @@ struct proc_resource* proc_create_resource_mutex (struct procgroup* procgroup, i return resource; } -void proc_resource_unlink (struct proc_resource* resource) { - if (atomic_fetch_sub (&resource->refs, 1) == 1) { - resource->ops.cleanup (resource); - free (resource); - } +void proc_delete_resource (struct proc_resource* resource) { + resource->ops.cleanup (resource); + free (resource); } diff --git a/kernel/proc/resource.h b/kernel/proc/resource.h index 7294aae..7e83627 100644 --- a/kernel/proc/resource.h +++ b/kernel/proc/resource.h @@ -15,7 +15,6 @@ struct procgroup; struct proc_resource { int type; int rid; - atomic_int refs; spin_lock_t lock; struct rb_node_link resource_tree_link; union { @@ -28,6 +27,6 @@ struct proc_resource { struct proc_resource* proc_find_resource (struct procgroup* procgroup, int rid); struct proc_resource* proc_create_resource_mutex (struct procgroup* procgroup, int rid); -void proc_resource_unlink (struct proc_resource* resource); +void proc_delete_resource (struct proc_resource* resource); #endif // _KERNEL_PROC_RESOURCE_H diff --git a/kernel/sys/proc.h b/kernel/sys/proc.h index d2fe89f..30f20dc 100644 --- a/kernel/sys/proc.h +++ b/kernel/sys/proc.h @@ -6,8 +6,7 @@ struct proc; struct proc* proc_from_elf (uint8_t* elf_contents); -struct proc* proc_clone (struct proc* proto, uintptr_t vstack_top, size_t stack_size, - uintptr_t entry); +struct proc* proc_clone (struct proc* proto, uintptr_t vstack_top, uintptr_t entry); void proc_cleanup (struct proc* proc); #endif // _KERNEL_SYS_PROC_H diff --git a/kernel/syscall/syscall.c b/kernel/syscall/syscall.c index 59ed69b..40c9aed 100644 --- a/kernel/syscall/syscall.c +++ b/kernel/syscall/syscall.c @@ -78,13 +78,12 @@ DEFINE_SYSCALL (sys_unmap) { return SYSRESULT (procgroup_unmap (proc->procgroup, vaddr, pages)); } -/* int clone (uintptr_t vstack_top, size_t stack_size, void* entry) */ +/* int clone (uintptr_t vstack_top, void* entry) */ DEFINE_SYSCALL (sys_clone) { uintptr_t vstack_top = a1; - size_t stack_size = (size_t)a2; uintptr_t entry = a3; - struct proc* new = proc_clone (proc, vstack_top, stack_size, entry); + struct proc* new = proc_clone (proc, vstack_top, entry); DEBUG ("new=%p\n", new); @@ -105,8 +104,8 @@ DEFINE_SYSCALL (sys_sched) { return SYSRESULT (ST_OK); } -/* int create_mutex (int mutex_rid) */ -DEFINE_SYSCALL (sys_create_mutex) { +/* int mutex_create (int mutex_rid) */ +DEFINE_SYSCALL (sys_mutex_create) { int mutex_rid = (int)a1; struct proc_resource* mutex_resource = proc_create_resource_mutex (proc->procgroup, mutex_rid); @@ -117,8 +116,8 @@ DEFINE_SYSCALL (sys_create_mutex) { return SYSRESULT (mutex_resource->rid); } -/* int unlink_mutex (int mutex_rid) */ -DEFINE_SYSCALL (sys_unlink_mutex) { +/* int mutex_delete (int mutex_rid) */ +DEFINE_SYSCALL (sys_mutex_delete) { int mutex_rid = (int)a1; struct proc_resource* mutex_resource = proc_find_resource (proc->procgroup, mutex_rid); @@ -126,11 +125,13 @@ DEFINE_SYSCALL (sys_unlink_mutex) { if (mutex_resource == NULL) return SYSRESULT (-ST_NOT_FOUND); + proc_delete_resource (mutex_resource); + return SYSRESULT (ST_OK); } -/* int lock_mutex (int mutex_rid) */ -DEFINE_SYSCALL (sys_lock_mutex) { +/* int mutex_lock (int mutex_rid) */ +DEFINE_SYSCALL (sys_mutex_lock) { int mutex_rid = (int)a1; struct proc_resource* mutex_resource = proc_find_resource (proc->procgroup, mutex_rid); @@ -143,8 +144,8 @@ DEFINE_SYSCALL (sys_lock_mutex) { return SYSRESULT (ST_OK); } -/* int unlock_mutex (int mutex_rid) */ -DEFINE_SYSCALL (sys_unlock_mutex) { +/* int mutex_unlock (int mutex_rid) */ +DEFINE_SYSCALL (sys_mutex_unlock) { int mutex_rid = (int)a1; struct proc_resource* mutex_resource = proc_find_resource (proc->procgroup, mutex_rid); @@ -163,10 +164,10 @@ static syscall_handler_func_t handler_table[] = { [SYS_UNMAP] = &sys_unmap, [SYS_CLONE] = &sys_clone, [SYS_SCHED] = &sys_sched, - [SYS_CREATE_MUTEX] = &sys_create_mutex, - [SYS_UNLINK_MUTEX] = &sys_unlink_mutex, - [SYS_LOCK_MUTEX] = &sys_lock_mutex, - [SYS_UNLOCK_MUTEX] = &sys_unlock_mutex, + [SYS_MUTEX_CREATE] = &sys_mutex_create, + [SYS_MUTEX_DELETE] = &sys_mutex_delete, + [SYS_MUTEX_LOCK] = &sys_mutex_lock, + [SYS_MUTEX_UNLOCK] = &sys_mutex_unlock, }; syscall_handler_func_t syscall_find_handler (int syscall_num) { diff --git a/libmsl/alloc/liballoc.c b/libmsl/alloc/liballoc.c index 5f444c4..6c7741d 100644 --- a/libmsl/alloc/liballoc.c +++ b/libmsl/alloc/liballoc.c @@ -6,15 +6,13 @@ #define LIBALLOC_MUTEX 500 -static int liballoc_mutex; +void liballoc_init (void) { mutex_create (LIBALLOC_MUTEX); } -void liballoc_init (void) { liballoc_mutex = create_mutex (LIBALLOC_MUTEX); } +void liballoc_deinit (void) { mutex_delete (LIBALLOC_MUTEX); } -void liballoc_deinit (void) { unlink_mutex (liballoc_mutex); } +int liballoc_lock (void) { return mutex_lock (LIBALLOC_MUTEX); } -int liballoc_lock (void) { return lock_mutex (liballoc_mutex); } - -int liballoc_unlock (void) { return unlock_mutex (liballoc_mutex); } +int liballoc_unlock (void) { return mutex_unlock (LIBALLOC_MUTEX); } void* liballoc_alloc (int pages) { return map (0, pages, MAP_FLAGS | MAP_RW); } diff --git a/libmsl/m/system.c b/libmsl/m/system.c index 3577e89..f95f3f2 100644 --- a/libmsl/m/system.c +++ b/libmsl/m/system.c @@ -21,18 +21,14 @@ void* map (uintptr_t vaddr, size_t pages, uint32_t flags) { int unmap (uintptr_t vaddr, size_t pages) { return do_syscall (SYS_UNMAP, vaddr, pages); } -int create_mem (int mem_rid, size_t pages) { return do_syscall (SYS_CREATE_MEM, mem_rid, pages); } - -int unlink_mem (int mem_rid, size_t pages) { return do_syscall (SYS_UNLINK_MEM, mem_rid, pages); } - -int clone (uintptr_t vstack_top, size_t stack_size, void (*entry) (void)) { - return do_syscall (SYS_CLONE, vstack_top, stack_size, entry); +int clone (uintptr_t vstack_top, void (*entry) (void)) { + return do_syscall (SYS_CLONE, vstack_top, entry); } -int create_mutex (int mutex_rid) { return do_syscall (SYS_CREATE_MUTEX, mutex_rid); } +int mutex_create (int mutex_rid) { return do_syscall (SYS_MUTEX_CREATE, mutex_rid); } -int unlink_mutex (int mutex_rid) { return do_syscall (SYS_UNLINK_MUTEX, mutex_rid); } +int mutex_delete (int mutex_rid) { return do_syscall (SYS_MUTEX_DELETE, mutex_rid); } -int lock_mutex (int mutex_rid) { return do_syscall (SYS_LOCK_MUTEX, mutex_rid); } +int mutex_lock (int mutex_rid) { return do_syscall (SYS_MUTEX_LOCK, mutex_rid); } -int unlock_mutex (int mutex_rid) { return do_syscall (SYS_UNLOCK_MUTEX, mutex_rid); } +int mutex_unlock (int mutex_rid) { return do_syscall (SYS_MUTEX_UNLOCK, mutex_rid); } diff --git a/libmsl/m/system.h b/libmsl/m/system.h index f473e4a..c8f25fe 100644 --- a/libmsl/m/system.h +++ b/libmsl/m/system.h @@ -18,10 +18,10 @@ int test (char c); int sched (void); void* map (uintptr_t vaddr, size_t pages, uint32_t flags); int unmap (uintptr_t vaddr, size_t pages); -int clone (uintptr_t vstack_top, size_t stack_size, void (*entry) (void)); -int create_mutex (int mutex_rid); -int unlink_mutex (int mutex_rid); -int lock_mutex (int mutex_rid); -int unlock_mutex (int mutex_rid); +int clone (uintptr_t vstack_top, void (*entry) (void)); +int mutex_create (int mutex_rid); +int mutex_delete (int mutex_rid); +int mutex_lock (int mutex_rid); +int mutex_unlock (int mutex_rid); #endif // _LIBMSL_M_SYSTEM_H