From 548506392b789f58b1556a6ffca917441e1d89fd Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Tue, 13 Oct 2026 22:31:43 -0400 Subject: ipc functions. work on process spawning --- sys/message.c | 96 ++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 68 insertions(+), 28 deletions(-) (limited to 'sys/message.c') diff --git a/sys/message.c b/sys/message.c index c87487b..c4414e0 100644 --- a/sys/message.c +++ b/sys/message.c @@ -1,54 +1,94 @@ #include "message.h" #include "api/error.h" -#include "errno.h" +#include "jove.h" #include "hal/memory.h" #include "hal/obj.h" #include "lib/printf.h" -int -message_hasmap(jove_owned_obj_t *obj) +static inline uintptr_t +s_message_addr(jove_owned_obj_t *message_obj) +{ + return (obj_getvalue(message_obj) >> 1) << 12; +} + +int message_new(jove_owned_obj_t *untyped_obj) +{ + uintmax_t untyped_value = obj_getvalue(untyped_obj); + jove_untyped_t *untyped = obj_deref(untyped_obj); + if(untyped->limit != 0x1000) { + klogf("Passed untyped has bad size : %x vs %x\n", untyped->limit, MESSAGE_SIZE); + return -EBADSIZE; + } + if(untyped_value & (MESSAGE_ALIGN - 1)) { + klogf("Passed untyped has bad alignment : %x\n", untyped_value & (MESSAGE_ALIGN - 1)); + return -EALIGN; + } + + obj_settype(untyped_obj, JOVE_OBJ_MESSAGE); + obj_setvalue(untyped_obj, obj_getvalue(untyped_obj) >> 11); + return 0; +} + +inline int +message_hasmap(jove_owned_obj_t *message_obj) { - return obj_getvalue(obj) & 1; + return obj_getvalue(message_obj) & 1; } -uintptr_t -message_unmap(jove_owned_obj_t *obj, jove_owned_obj_t *pagedir) +virtaddr_t +message_unmap(jove_owned_obj_t *message_obj, jove_owned_obj_t *pagedir_obj) { - if(message_hasmap(obj) == 0) { - kprintf("Message %p doesn't have a map\n", obj_getvalue(obj)); - return -ENOMAP; + errno = 0; + if(message_hasmap(message_obj) == 0) { + klogf("Message %p doesn't have a map\n", obj_getvalue(message_obj)); + errno = -ENOMAP; + return 0; } - uintptr_t vptr = obj->locked.value & ~0xFFFULL; - uintptr_t *mapping = pagedir_get_mapping(pagedir, vptr); + + virtaddr_t message_vaddr = s_message_addr(message_obj); + virtaddr_t *mapping = pagedir_get_mapping(pagedir_obj, message_vaddr); + physaddr_t message_pfn = pagedir_mapping_get_pfn(mapping); pagedir_mapping_set_present(mapping, false); - pagedir_invlpg(vptr); + obj_setvalue(message_obj, message_pfn << 1); + pagedir_invlpg(message_vaddr); + message_klogf("Unmapped message %p from %p\n", message_pfn << 12, message_vaddr); - obj_setvalue(obj, *mapping); - return vptr; + return message_vaddr; } -void -message_remap(jove_owned_obj_t *message, jove_owned_obj_t *pagedir, uintptr_t vptr) +int +message_map(jove_owned_obj_t *message, jove_owned_obj_t *pagedir, virtaddr_t vaddr) { if(message_hasmap(message)) { - errno = -EHASMAP; - return; + return -EHASMAP; } - uintmax_t *mapping = pagedir_get_mapping(pagedir, vptr); + virtaddr_t message_paddr = s_message_addr(message); + virtaddr_t *mapping = pagedir_get_mapping(pagedir, vaddr); - *mapping = obj_getvalue(message) | 1; - pagedir_invlpg(vptr); + if(pagedir_mapping_is_present(mapping)) { + klogf("Mapping %p is occupied\n", + mapping, message); + return -EHASMAP; + } + + pagedir_mapping_set_pfn(mapping, message_paddr >> 12); + pagedir_mapping_set_present(mapping, true); + pagedir_mapping_set_writeable(mapping, true); + pagedir_mapping_set_user(mapping, true); + pagedir_mapping_set_type(mapping, JOVE_MAPPING_TYPE_MESSAGE); - obj_setvalue(message, vptr | 1); + pagedir_invlpg(vaddr); + + message_klogf("Mapped message %p to %p\n", message_paddr, vaddr); + obj_setvalue(message, (vaddr >> 11) | 1); + return 0; } -uintptr_t message_getdata(jove_owned_obj_t *message) +virtaddr_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); + uintptr_t message_addr = s_message_addr(message); + if(message_hasmap(message)) return message_addr; + return (virtaddr_t)phys_tovirt(message_addr); } -- cgit v1.2.3