summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/memory/page-mapping.c
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2025-09-10 13:28:28 -0400
committerJon Santmyer <jon@jonsantmyer.com>2025-09-10 13:28:28 -0400
commit7f350e7ee1c2c38e5ac0b6c22c17388f6c78f0b5 (patch)
treeaef9904e2495ce840319f2815cd859c47294c88a /arch/x86_64/memory/page-mapping.c
parent032a7bc4d79efea100a00cf3464bea3249a07ff6 (diff)
downloadjove-kernel-7f350e7ee1c2c38e5ac0b6c22c17388f6c78f0b5.tar.gz
jove-kernel-7f350e7ee1c2c38e5ac0b6c22c17388f6c78f0b5.tar.bz2
jove-kernel-7f350e7ee1c2c38e5ac0b6c22c17388f6c78f0b5.zip
refactor paging code. regression on loading init program
Diffstat (limited to 'arch/x86_64/memory/page-mapping.c')
-rw-r--r--arch/x86_64/memory/page-mapping.c34
1 files changed, 17 insertions, 17 deletions
diff --git a/arch/x86_64/memory/page-mapping.c b/arch/x86_64/memory/page-mapping.c
index d4b4e98..bbf210a 100644
--- a/arch/x86_64/memory/page-mapping.c
+++ b/arch/x86_64/memory/page-mapping.c
@@ -1,28 +1,28 @@
#include "arch/x86_64/page-mapping.h"
#include "arch/x86_64/page.h"
+#include "memory.h"
+#include "error.h"
#include <stddef.h>
#include "print.h"
-pmle_t*
-page_mapping_traverse(pmle_t *pml4, uint8_t depth, uint16_t *path)
+void
+mapping_setup_init()
{
- uint16_t pathi = path[0];
-
- pmle_t *pmle = &pml4[pathi];
- pmle_t *pmle_table = vmem_phys_tovirt(pmle->paddr << 12);
- if(depth == 0) return pmle;
- if(!pmle->p) return NULL;
- return page_mapping_traverse(pmle_table, depth - 1, path + 1);
+ pml4_setup_init();
}
-pmle_t*
-mem_mapping_vptr_mapping(pmle_t *pml4, uint8_t depth, uintptr_t vptr)
+void
+mapping_setup(objdir_entry_t *mapping)
{
- uint64_t pathval = 0;
- uint16_t *path = (uint16_t*)&pathval;
+ pmle_t *pml4 = (pmle_t*)ko_entry_data(mapping);
+ pml4_setup(pml4);
+}
- for(uint8_t i = 0; i < depth; i++) {
- path[i] = PML_I_FOR_LAYER(vptr, 4 - i);
- }
- return page_mapping_traverse(pml4, depth - 1, path);
+int
+mapping_try_map_obj(objdir_entry_t *mapping, uintptr_t vptr, objdir_entry_t *obj)
+{
+ if(vptr & 0xFFFF800000000000) return KE_OOB;
+ pmle_t *pml4 = (pmle_t*)ko_entry_data(mapping);
+ uintptr_t pptr = (uintptr_t)ko_entry_data(obj);
+ return pml4_try_map(pml4, pptr, vptr);
}