From 7f350e7ee1c2c38e5ac0b6c22c17388f6c78f0b5 Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Wed, 10 Sep 2025 13:28:28 -0400 Subject: refactor paging code. regression on loading init program --- arch/x86_64/lib/object.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 arch/x86_64/lib/object.c (limited to 'arch/x86_64/lib') diff --git a/arch/x86_64/lib/object.c b/arch/x86_64/lib/object.c new file mode 100644 index 0000000..4ab8f06 --- /dev/null +++ b/arch/x86_64/lib/object.c @@ -0,0 +1,59 @@ +#include "object.h" +#include "error.h" +#include "device/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); -- cgit v1.2.1