Organize resources into process groups

This commit is contained in:
2026-01-27 14:18:05 +01:00
parent 67b66f2b39
commit 600886a7ee
20 changed files with 387 additions and 457 deletions

View File

@@ -8,6 +8,7 @@
#include <proc/mem.h>
#include <proc/mutex.h>
#include <proc/proc.h>
#include <proc/procgroup.h>
#include <proc/resource.h>
#include <sync/spin_lock.h>
#include <sys/debug.h>
@@ -23,16 +24,16 @@ static void* sys_get_user_buffer (struct proc* proc, uintptr_t uvaddr, size_t si
struct limine_hhdm_response* hhdm = limine_hhdm_request.response;
spin_lock_ctx_t ctxprpd;
spin_lock (&proc->pd->lock, &ctxprpd);
spin_lock (&proc->procgroup->pd.lock, &ctxprpd);
if (!mm_validate_buffer (proc->pd, (uintptr_t)uvaddr, size, 0)) {
spin_unlock (&proc->pd->lock, &ctxprpd);
if (!mm_validate_buffer (&proc->procgroup->pd, (uintptr_t)uvaddr, size, 0)) {
spin_unlock (&proc->procgroup->pd.lock, &ctxprpd);
return NULL;
}
uintptr_t out_paddr = mm_v2p (proc->pd, uvaddr, 0);
uintptr_t out_paddr = mm_v2p (&proc->procgroup->pd, uvaddr, 0);
spin_unlock (&proc->pd->lock, &ctxprpd);
spin_unlock (&proc->procgroup->pd.lock, &ctxprpd);
uintptr_t out_kvaddr = (uintptr_t)hhdm->offset + out_paddr;
@@ -52,22 +53,18 @@ DEFINE_SYSCALL (sys_test) {
return ST_OK;
}
/* int map (int mem_rid, int vis, uintptr_t vaddr, uint32_t flags) */
/* int map (int mem_rid, uintptr_t vaddr, uint32_t flags) */
DEFINE_SYSCALL (sys_map) {
spin_lock_ctx_t ctxrs;
int mem_rid = (int)a1;
int vis = (int)a2;
uintptr_t vaddr = a3;
uint32_t flags = (uint32_t)a4;
uintptr_t vaddr = a2;
uint32_t flags = (uint32_t)a3;
if (vaddr % PAGE_SIZE != 0)
return -ST_UNALIGNED;
if (!(vis == RV_PUBLIC || vis == RV_PRIVATE))
return -ST_BAD_RESOURCE;
struct proc_resource* mem_resource = proc_find_resource (proc, mem_rid, vis);
struct proc_resource* mem_resource = proc_find_resource (proc->procgroup, mem_rid);
if (mem_resource == NULL) {
return -ST_NOT_FOUND;
@@ -99,22 +96,18 @@ DEFINE_SYSCALL (sys_unmap) {
return proc_unmap (proc, vaddr, pages) ? ST_OK : -ST_OOM_ERROR;
}
/* int create_mem (int rid, int vis, size_t pages) */
/* int create_mem (int rid, size_t pages) */
DEFINE_SYSCALL (sys_create_mem) {
int rid = (int)a1;
int vis = (int)a2;
size_t pages = (size_t)a3;
if (!(vis == RV_PUBLIC || vis == RV_PRIVATE))
return -ST_BAD_RESOURCE;
size_t pages = (size_t)a2;
if (pages == 0)
return ST_OK;
int rid1 = rid < 0 ? atomic_fetch_add (&proc->resources->sys_rids, 1) : rid;
struct proc_resource_mem_init mem_init = {.managed = false, .pages = pages};
struct proc_resource* mem_resource = proc_create_resource (proc, rid1, PR_MEM, vis, &mem_init);
/* int rid1 = rid < 0 ? atomic_fetch_add (&proc->resources->sys_rids, 1) : rid; */
int rid1 = rid < 0 ? procgroup_get_sys_rid (proc->procgroup) : rid;
struct proc_resource* mem_resource =
proc_create_resource_mem (proc->procgroup, rid1, pages, 0, false);
if (mem_resource == NULL)
return -ST_OOM_ERROR;
@@ -122,34 +115,33 @@ DEFINE_SYSCALL (sys_create_mem) {
return mem_resource->rid;
}
/* int unlink_mem (int rid, int vis, size_t pages) */
/* int unlink_mem (int rid, size_t pages) */
DEFINE_SYSCALL (sys_unlink_mem) {
spin_lock_ctx_t ctxrs;
/* spin_lock_ctx_t ctxrs; */
int rid = (int)a1;
int vis = (int)a2;
size_t pages = (size_t)a3;
/* int rid = (int)a1; */
/* size_t pages = (size_t)a2; */
if (!(vis == RV_PUBLIC || vis == RV_PRIVATE))
return -ST_BAD_RESOURCE;
/* if (!(vis == RV_PUBLIC || vis == RV_PRIVATE)) */
/* return -ST_BAD_RESOURCE; */
struct proc_resource* mem_resource = proc_find_resource (proc, rid, vis);
/* struct proc_resource* mem_resource = proc_find_resource (proc, rid, vis); */
if (mem_resource == NULL)
return -ST_NOT_FOUND;
/* if (mem_resource == NULL) */
/* return -ST_NOT_FOUND; */
spin_lock (&mem_resource->lock, &ctxrs);
/* spin_lock (&mem_resource->lock, &ctxrs); */
if (mem_resource->type != PR_MEM) {
spin_unlock (&mem_resource->lock, &ctxrs);
return -ST_BAD_RESOURCE;
}
/* if (mem_resource->type != PR_MEM) { */
/* spin_unlock (&mem_resource->lock, &ctxrs); */
/* return -ST_BAD_RESOURCE; */
/* } */
mem_resource->u.mem.alive_pages -= pages;
if (mem_resource->u.mem.alive_pages < 0) {
spin_unlock (&mem_resource->lock, &ctxrs);
proc_drop_resource (proc, mem_resource, true);
}
/* mem_resource->u.mem.alive_pages -= pages; */
/* if (mem_resource->u.mem.alive_pages < 0) { */
/* spin_unlock (&mem_resource->lock, &ctxrs); */
/* proc_drop_resource (proc, mem_resource, true); */
/* } */
return ST_OK;
}
@@ -181,19 +173,11 @@ DEFINE_SYSCALL (sys_sched) {
return ST_OK;
}
/* int create_mutex (int mutex_rid, int vis) */
/* int create_mutex (int mutex_rid) */
DEFINE_SYSCALL (sys_create_mutex) {
int mutex_rid = (int)a1;
int vis = (int)a2;
if (mutex_rid < 0)
return -ST_BAD_RESOURCE;
if (!(vis == RV_PUBLIC || vis == RV_PRIVATE))
return -ST_BAD_RESOURCE;
struct proc_resource* mutex_resource =
proc_create_resource (proc, mutex_rid, PR_MUTEX, vis, NULL);
struct proc_resource* mutex_resource = proc_create_resource_mutex (proc->procgroup, mutex_rid);
if (mutex_resource == NULL)
return -ST_OOM_ERROR;
@@ -201,33 +185,25 @@ DEFINE_SYSCALL (sys_create_mutex) {
return mutex_resource->rid;
}
/* int unlink_mutex (int mutex_rid, int vis) */
/* int unlink_mutex (int mutex_rid) */
DEFINE_SYSCALL (sys_unlink_mutex) {
int mutex_rid = (int)a1;
int vis = (int)a2;
if (!(vis == RV_PUBLIC || vis == RV_PRIVATE))
return -ST_BAD_RESOURCE;
struct proc_resource* mutex_resource = proc_find_resource (proc, mutex_rid, vis);
struct proc_resource* mutex_resource = proc_find_resource (proc->procgroup, mutex_rid);
if (mutex_resource == NULL)
return -ST_NOT_FOUND;
proc_drop_resource (proc, mutex_resource, true);
/* proc_drop_resource (proc, mutex_resource, true); */
return ST_OK;
}
/* int lock_mutex (int mutex_rid, int vis) */
/* int lock_mutex (int mutex_rid) */
DEFINE_SYSCALL (sys_lock_mutex) {
int mutex_rid = (int)a1;
int vis = (int)a2;
if (!(vis == RV_PUBLIC || vis == RV_PRIVATE))
return -ST_BAD_RESOURCE;
struct proc_resource* mutex_resource = proc_find_resource (proc, mutex_rid, vis);
struct proc_resource* mutex_resource = proc_find_resource (proc->procgroup, mutex_rid);
if (mutex_resource == NULL)
return -ST_NOT_FOUND;
@@ -237,15 +213,11 @@ DEFINE_SYSCALL (sys_lock_mutex) {
return ST_OK;
}
/* int unlock_mutex (int mutex_rid, int vis) */
/* int unlock_mutex (int mutex_rid) */
DEFINE_SYSCALL (sys_unlock_mutex) {
int mutex_rid = (int)a1;
int vis = (int)a2;
if (!(vis == RV_PUBLIC || vis == RV_PRIVATE))
return -ST_BAD_RESOURCE;
struct proc_resource* mutex_resource = proc_find_resource (proc, mutex_rid, vis);
struct proc_resource* mutex_resource = proc_find_resource (proc->procgroup, mutex_rid);
if (mutex_resource == NULL)
return -ST_NOT_FOUND;