diff options
| author | Jon Santmyer <jon@jonsantmyer.com> | 2026-10-03 21:32:29 -0400 |
|---|---|---|
| committer | Jon Santmyer <jon@jonsantmyer.com> | 2026-10-03 21:32:29 -0400 |
| commit | 465cba0c00bfc5d89bf10ce353b0adf40bdc098d (patch) | |
| tree | 914fd856946800199e2191dda1659ba9ccd55978 /sys/message.c | |
| parent | 153ac5fa0b8c4d178bf7590f0344612c6c3eaa70 (diff) | |
| download | jove-kernel-465cba0c00bfc5d89bf10ce353b0adf40bdc098d.tar.gz jove-kernel-465cba0c00bfc5d89bf10ce353b0adf40bdc098d.tar.bz2 jove-kernel-465cba0c00bfc5d89bf10ce353b0adf40bdc098d.zip | |
unmap message object used for syscalls
Diffstat (limited to 'sys/message.c')
| -rw-r--r-- | sys/message.c | 53 |
1 files changed, 46 insertions, 7 deletions
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); } |
