Organize resources into process groups
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user