#include "message.h" #include "api/error.h" #include "errno.h" #include "hal/memory.h" #include "hal/obj.h" #include "lib/printf.h" int message_hasmap(jove_owned_obj_t *obj) { return obj_getvalue(obj) & 1; } uintptr_t message_unmap(jove_owned_obj_t *obj, jove_owned_obj_t *pagedir) { 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); }