#include "object.h" #include "error.h" #include "device/processor.h" #include "arch/x86_64/processor.h" #include "arch/x86_64/page.h" #include "arch/x86_64/page-mapping.h" void* ko_entry_data(objdir_entry_t *entry) { if((intmax_t)entry->data < 0) return (void*)entry->data; return pptr_tovirt_ident(entry->data); } uintptr_t ko_data_toentry(uintptr_t vptr) { return vptr_tophys((void*)vptr); } int ko_message_unmap(objdir_entry_t *message, uintptr_t *saveptr) { /* message data should point to the virtual address. */ /* If it doesn't, fail*/ if(!(message->extra & KODE_EX_MESSAGE_MAPPED)) return KE_BADCALL; uintptr_t vptr = message->data; processor_t *cproc = processor_current(); pmle_t *pml4 = pptr_tovirt_ident(cproc->pdir); pmle_t *message_pmle = pml4_get_mapping(pml4, 4, vptr); *saveptr = (uintptr_t)pptr_tovirt_ident(message_pmle->paddr << 12); message_pmle->p = 0; __asm__ volatile("invlpg (%0)":: "r"(vptr): "memory"); message->extra &= ~KODE_EX_MESSAGE_MAPPED; return 0; } int ko_message_remap(objdir_entry_t *message) { if(message->extra & KODE_EX_MESSAGE_MAPPED) return KE_BADCALL; uintptr_t vptr = message->data; processor_t *cproc = processor_current(); pmle_t *pml4 = pptr_tovirt_ident(cproc->pdir); pmle_t *message_pmle = pml4_get_mapping(pml4, 4, vptr); message_pmle->p = 1; __asm__ volatile("invlpg (%0)":: "r"(vptr): "memory"); message->extra |= KODE_EX_MESSAGE_MAPPED; return 0; } void ko_message_move(objdir_entry_t *message, uintptr_t vptr);