Cleanup syscalls
All checks were successful
Build documentation / build-and-deploy (push) Successful in 34s
All checks were successful
Build documentation / build-and-deploy (push) Successful in 34s
This commit is contained in:
@@ -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
|
||||
|
||||
99
init/init.c
99
init/init.c
@@ -6,10 +6,6 @@
|
||||
#include <stdint.h>
|
||||
#include <string/string.h>
|
||||
|
||||
#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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
void proc_delete_resource (struct proc_resource* resource) {
|
||||
resource->ops.cleanup (resource);
|
||||
free (resource);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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); }
|
||||
|
||||
|
||||
@@ -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); }
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user