summaryrefslogtreecommitdiffstats
path: root/sys/message.c
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2026-10-03 21:32:29 -0400
committerJon Santmyer <jon@jonsantmyer.com>2026-10-03 21:32:29 -0400
commit465cba0c00bfc5d89bf10ce353b0adf40bdc098d (patch)
tree914fd856946800199e2191dda1659ba9ccd55978 /sys/message.c
parent153ac5fa0b8c4d178bf7590f0344612c6c3eaa70 (diff)
downloadjove-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.c53
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);
}