diff --git a/include/m/syscall_defs.h b/include/m/syscall_defs.h index 9a54233..26a9398 100644 --- a/include/m/syscall_defs.h +++ b/include/m/syscall_defs.h @@ -18,5 +18,6 @@ #define SR_NOT_FOUND 4 #define SR_BAD_ADDRESS_SPACE 5 #define SR_PERMISSION_ERROR 6 +#define SR_BAD_RESOURCE 7 #endif // _M_SYSCALL_DEFS_H diff --git a/init/init.c b/init/init.c index b0f2a78..b811e5d 100644 --- a/init/init.c +++ b/init/init.c @@ -8,7 +8,7 @@ char c = 'a'; void app_main (void) { uintptr_t out_paddr; - int mem_rid = proc_create_resource_mem (16, RV_PRIVATE, &out_paddr); + int mem_rid = proc_create_resource_mem (100, 16, RV_PRIVATE, &out_paddr); proc_map (out_paddr, PROC_MAP_BASE, 16, PM_PRESENT | PM_RW | PM_USER); @@ -20,7 +20,7 @@ void app_main (void) { proc_test ('a'); - int mutex_rid = proc_create_resource_mutex (RV_PRIVATE); + int mutex_rid = proc_create_resource_mutex (101, RV_PRIVATE); proc_mutex_lock (mutex_rid); proc_test ('b'); diff --git a/kernel/amd64/proc.c b/kernel/amd64/proc.c index da4342d..6bf6c25 100644 --- a/kernel/amd64/proc.c +++ b/kernel/amd64/proc.c @@ -42,10 +42,9 @@ struct proc* proc_from_elf (uint8_t* elf_contents) { return NULL; } - int kstk_rid = atomic_fetch_add (&proc->rids, 1); struct proc_resource_mem_init kstk_mem_init = {.pages = KSTACK_SIZE / PAGE_SIZE}; struct proc_resource* kstk_r = - proc_create_resource (proc, kstk_rid, PR_MEM, RV_PRIVATE, (void*)&kstk_mem_init); + proc_create_resource (proc, 0, PR_MEM, RV_PRIVATE, (void*)&kstk_mem_init); if (kstk_r == NULL) { pmm_free (proc->pd->cr3_paddr, 1); free (proc->pd); @@ -55,10 +54,9 @@ struct proc* proc_from_elf (uint8_t* elf_contents) { proc->pdata.kernel_stack = kstk_r->u.mem.paddr + (uintptr_t)hhdm->offset + KSTACK_SIZE; - int ustk_rid = atomic_fetch_add (&proc->rids, 1); struct proc_resource_mem_init ustk_mem_init = {.pages = USTACK_SIZE / PAGE_SIZE}; struct proc_resource* ustk_r = - proc_create_resource (proc, ustk_rid, PR_MEM, RV_PRIVATE, (void*)&ustk_mem_init); + proc_create_resource (proc, 1, PR_MEM, RV_PRIVATE, (void*)&ustk_mem_init); if (ustk_r == NULL) { kstk_r->ops.cleanup (proc, kstk_r); free (kstk_r); diff --git a/kernel/proc/proc.c b/kernel/proc/proc.c index 62d9839..39311c2 100644 --- a/kernel/proc/proc.c +++ b/kernel/proc/proc.c @@ -144,6 +144,7 @@ struct elf_aux proc_load_segments (struct proc* proc, uint8_t* elf) { aux.phent = ehdr->e_phentsize; struct limine_hhdm_response* hhdm = limine_hhdm_request.response; + int rid_counter = 10; for (uint64_t segment = 0; segment < ehdr->e_phnum; segment++) { Elf64_Phdr* phdr = @@ -159,10 +160,9 @@ struct elf_aux proc_load_segments (struct proc* proc, uint8_t* elf) { size_t blks = div_align_up (phdr->p_memsz + off, PAGE_SIZE); - int rid = atomic_fetch_add (&proc->rids, 1); struct proc_resource_mem_init mem_init = {.pages = blks}; struct proc_resource* r = - proc_create_resource (proc, rid, PR_MEM, RV_PRIVATE, (void*)&mem_init); + proc_create_resource (proc, rid_counter++, PR_MEM, RV_PRIVATE, (void*)&mem_init); if (r == NULL) { DEBUG ("pmm oom error while loading ELF segments! (tried to alloc %zu blks)\n", blks); } diff --git a/kernel/proc/proc.h b/kernel/proc/proc.h index e2b2544..328666c 100644 --- a/kernel/proc/proc.h +++ b/kernel/proc/proc.h @@ -49,7 +49,6 @@ struct proc { struct cpu* cpu; atomic_int state; struct rb_node_link* resource_tree; - atomic_int rids; struct proc_suspension_q* suspension_q; }; diff --git a/kernel/syscall/syscall.c b/kernel/syscall/syscall.c index 3be5ac5..affaf82 100644 --- a/kernel/syscall/syscall.c +++ b/kernel/syscall/syscall.c @@ -57,14 +57,18 @@ DEFINE_SYSCALL (sys_proc_unmap) { return ok ? SR_OK : -SR_OOM_ERROR; } -/* int proc_create_resource_mem (size_t pages, int vis, uintptr_t* out_paddr) */ +/* int proc_create_resource_mem (int rid, size_t pages, int vis, uintptr_t* out_paddr) */ DEFINE_SYSCALL (sys_proc_create_resource_mem) { struct limine_hhdm_response* hhdm = limine_hhdm_request.response; spin_lock_ctx_t ctxprpd; - size_t pages = (size_t)a1; - int vis = (int)a2; - uintptr_t* out_paddr_buf = (uintptr_t*)a3; + int rid = (int)a1; + size_t pages = (size_t)a2; + int vis = (int)a3; + uintptr_t* out_paddr_buf = (uintptr_t*)a4; + + if (rid < 0) + return -SR_BAD_RESOURCE; spin_lock (&proc->pd->lock, &ctxprpd); @@ -79,7 +83,6 @@ DEFINE_SYSCALL (sys_proc_create_resource_mem) { uintptr_t* out_paddr_buf_vaddr = (uintptr_t*)((uintptr_t)hhdm->offset + out_paddr_buf_paddr); - int rid = atomic_fetch_add (&proc->rids, 1); struct proc_resource_mem_init mem_init = {.pages = pages}; struct proc_resource* r = proc_create_resource (proc, rid, PR_MEM, vis, &mem_init); @@ -91,11 +94,14 @@ DEFINE_SYSCALL (sys_proc_create_resource_mem) { } } -/* int proc_create_resource_mutex (int vis) */ +/* int proc_create_resource_mutex (int rid, int vis) */ DEFINE_SYSCALL (sys_proc_create_resource_mutex) { - int vis = (int)a1; + int rid = (int)a1; + int vis = (int)a2; + + if (rid < 0) + return -SR_BAD_RESOURCE; - int rid = atomic_fetch_add (&proc->rids, 1); struct proc_resource* r = proc_create_resource (proc, rid, PR_MUTEX, vis, NULL); if (r != NULL) return r->rid; diff --git a/libmsl/m/proc.c b/libmsl/m/proc.c index 3e6099f..3820d6f 100644 --- a/libmsl/m/proc.c +++ b/libmsl/m/proc.c @@ -15,17 +15,17 @@ int proc_unmap (uintptr_t vaddr, size_t pages) { return syscall (SYS_PROC_UNMAP, vaddr, (uintptr_t)pages, 0, 0, 0, 0); } -int proc_create_resource_mem (size_t pages, int vis, uintptr_t* out_paddr) { - return syscall (SYS_PROC_CREATE_RESOURCE_MEM, (uintptr_t)pages, (uintptr_t)vis, - (uintptr_t)out_paddr, 0, 0, 0); +int proc_create_resource_mem (int rid, size_t pages, int vis, uintptr_t* out_paddr) { + return syscall (SYS_PROC_CREATE_RESOURCE_MEM, (uintptr_t)rid, (uintptr_t)pages, (uintptr_t)vis, + (uintptr_t)out_paddr, 0, 0); } int proc_drop_resource (int rid) { return syscall (SYS_PROC_DROP_RESOURCE, (uintptr_t)rid, 0, 0, 0, 0, 0); } -int proc_create_resource_mutex (int vis) { - return syscall (SYS_PROC_CREATE_RESOURCE_MUTEX, (uintptr_t)vis, 0, 0, 0, 0, 0); +int proc_create_resource_mutex (int rid, int vis) { + return syscall (SYS_PROC_CREATE_RESOURCE_MUTEX, (uintptr_t)rid, (uintptr_t)vis, 0, 0, 0, 0); } int proc_mutex_lock (int mutex_rid) { diff --git a/libmsl/m/proc.h b/libmsl/m/proc.h index a586d8f..fce6d13 100644 --- a/libmsl/m/proc.h +++ b/libmsl/m/proc.h @@ -20,9 +20,9 @@ int proc_quit (void); int proc_test (char c); int proc_map (uintptr_t paddr, uintptr_t vaddr, size_t pages, uint32_t flags); int proc_unmap (uintptr_t vaddr, size_t pages); -int proc_create_resource_mem (size_t pages, int vis, uintptr_t* out_paddr); +int proc_create_resource_mem (int rid, size_t pages, int vis, uintptr_t* out_paddr); int proc_drop_resource (int rid); -int proc_create_resource_mutex (int vis); +int proc_create_resource_mutex (int rid, int vis); int proc_mutex_lock (int mutex_rid); int proc_mutex_unlock (int mutex_rid);