#include #include #include #include #include "arch/x86_64/page.h" #include "arch/x86_64/page-mapping.h" #include "print.h" 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 = vmem_phys_tovirt(cproc->pdir); pmle_t *message_pmle = mem_mapping_vptr_mapping(pml4, 4, vptr); *saveptr = (uintptr_t)vmem_phys_tovirt(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 = vmem_phys_tovirt(cproc->pdir); pmle_t *message_pmle = mem_mapping_vptr_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);