From 5f813d49a08cf3c3f8cf6c422cfb6587df575f62 Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Sat, 26 Sep 2026 17:11:50 -0400 Subject: add docs for syscalls. make syscall code kind-of cleaner --- sys/link.c | 56 +++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 17 deletions(-) (limited to 'sys/link.c') diff --git a/sys/link.c b/sys/link.c index 5be9457..592fe8f 100644 --- a/sys/link.c +++ b/sys/link.c @@ -2,31 +2,23 @@ #include "arch/x86_64/hal/obj.h" #include "hal/memory.h" -void* -obj_deref_linked(jove_owned_obj_t *obj) +uint8_t +link_gettype(jove_owned_obj_t *obj) { - switch(obj_gettype(obj)) { - case JOVE_OBJ_LINK: return obj_deref_linked(link_deref(obj)); - default: return obj_deref(obj); - } + return obj_gettype(link_deref(obj)); } uint8_t -obj_gettype_linked(jove_owned_obj_t *obj) +link_getperm(jove_owned_obj_t *link) { - switch(obj_gettype(obj)) { - case JOVE_OBJ_LINK: return obj_gettype_linked(link_deref(obj)); - default: return obj_gettype(obj); - } + struct obj_link *linkval = obj_deref(link); + return linkval->permissions; } uint64_t -obj_getvalue_linked(jove_owned_obj_t *obj) +link_getvalue(jove_owned_obj_t *obj) { - switch(obj_gettype(obj)) { - case JOVE_OBJ_LINK: return obj_getvalue_linked(link_deref(obj)); - default: return obj_getvalue(obj); - } + return obj_getvalue(link_deref(obj)); } jove_owned_obj_t* @@ -36,11 +28,41 @@ link_deref(jove_owned_obj_t *link) return obj_take(&linkval->obj); } -jove_owned_obj_t *link_new(jove_obj_t *tgt, jove_owned_obj_t *dst) +jove_owned_obj_t* +link_try_deref(jove_owned_obj_t *link) +{ + struct obj_link *linkval = obj_deref(link); + return obj_trytake(&linkval->obj); +} + +jove_perm_obj_t +link_traverse(jove_owned_obj_t *link, lockstack_t *lockstack) +{ + jove_perm_obj_t perm_obj = { .obj = link, .permissions = JOVE_PERM_ALL }; + while(obj_gettype(perm_obj.obj) == JOVE_OBJ_LINK) { + perm_obj.permissions &= link_getperm(perm_obj.obj); + perm_obj.obj = lockstack_push(lockstack, link_deref(perm_obj.obj)); + } + return perm_obj; +} + +jove_perm_obj_t +link_try_traverse(jove_owned_obj_t *link, lockstack_t *lockstack) +{ + jove_perm_obj_t perm_obj = { .obj = link, .permissions = JOVE_PERM_ALL }; + while(perm_obj.obj != NULL && obj_gettype(perm_obj.obj) == JOVE_OBJ_LINK) { + perm_obj.permissions &= link_getperm(perm_obj.obj); + perm_obj.obj = lockstack_push(lockstack, link_deref(perm_obj.obj)); + } + return perm_obj; +} + +jove_owned_obj_t *link_new(jove_obj_t *tgt, jove_owned_obj_t *dst, uint16_t permissions) { struct obj_link *linkval = obj_deref(dst); linkval->obj = *tgt; linkval->refcount = 2; + linkval->permissions = permissions; { jove_owned_obj_t *tgt_owned = obj_take(tgt); -- cgit v1.2.3