From 465cba0c00bfc5d89bf10ce353b0adf40bdc098d Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Sat, 3 Oct 2026 21:32:29 -0400 Subject: unmap message object used for syscalls --- sys/message.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 7 deletions(-) (limited to 'sys/message.c') diff --git a/sys/message.c b/sys/message.c index 7c871ce..c87487b 100644 --- a/sys/message.c +++ b/sys/message.c @@ -1,15 +1,54 @@ #include "message.h" +#include "api/error.h" +#include "errno.h" +#include "hal/memory.h" #include "hal/obj.h" +#include "lib/printf.h" -void * -message_data(jove_owned_obj_t *obj) +int +message_hasmap(jove_owned_obj_t *obj) { - uintptr_t objptr = (uintptr_t)obj_deref(obj); - return (void*)(objptr & ~0xFFF); + return obj_getvalue(obj) & 1; } -size_t -message_len(jove_owned_obj_t *obj) +uintptr_t +message_unmap(jove_owned_obj_t *obj, jove_owned_obj_t *pagedir) { - return (obj_getvalue(obj) & 0xFFF) << 12; + if(message_hasmap(obj) == 0) { + kprintf("Message %p doesn't have a map\n", obj_getvalue(obj)); + return -ENOMAP; + } + uintptr_t vptr = obj->locked.value & ~0xFFFULL; + uintptr_t *mapping = pagedir_get_mapping(pagedir, vptr); + + pagedir_mapping_set_present(mapping, false); + pagedir_invlpg(vptr); + + obj_setvalue(obj, *mapping); + return vptr; +} + +void +message_remap(jove_owned_obj_t *message, jove_owned_obj_t *pagedir, uintptr_t vptr) +{ + if(message_hasmap(message)) { + errno = -EHASMAP; + return; + } + + uintmax_t *mapping = pagedir_get_mapping(pagedir, vptr); + + *mapping = obj_getvalue(message) | 1; + pagedir_invlpg(vptr); + + obj_setvalue(message, vptr | 1); +} + +uintptr_t message_getdata(jove_owned_obj_t *message) +{ + if(message_hasmap(message)) + return obj_getvalue(message) & ~0xFFFULL; + + uintptr_t message_val = obj_getvalue(message); + return pagedir_ident_from_mapping(&message_val); } -- cgit v1.2.3