From 57d2931b96decb77da9cd62116aa800d3b6adcf7 Mon Sep 17 00:00:00 2001 From: Ruslan Isaev Date: Wed, 5 Nov 2025 20:52:58 +0300 Subject: [PATCH] mm: fix mapping memory in non-present PDEs --- src/kernel/kernel.c | 2 +- src/mm/page_tables.c | 21 ++++++++++++++++----- src/mm/paging.c | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 13fd8e5..3d87ec6 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -134,7 +134,7 @@ void kmain(unsigned int magic, unsigned int info) l9660_dir dir; l9660_file file; - follow_path("/katau/caller.", &file, &dir); + follow_path("/katau/dash.", &file, &dir); exec_from_file(&file, &dir); diff --git a/src/mm/page_tables.c b/src/mm/page_tables.c index c4c3bdc..80a157e 100644 --- a/src/mm/page_tables.c +++ b/src/mm/page_tables.c @@ -48,11 +48,22 @@ void map_page(void *physaddr, void *virtualaddr, unsigned int flags) { // adjust the PDE accordingly. if (!(pd[pdindex] & 0x1)) { // If PDE not present - unsigned long *new_pt = alloc_page(); - unsigned long *virt_pt = (unsigned long *)(0xC0000000 + new_pt); - memset(virt_pt, 0, 4096); - //pd[pdindex] = (uint32_t)new_pt | 0x3; // Present, R/W - pd[pdindex] = (uint32_t)new_pt | (flags & 0x7); // Add User bit if needed + void *new_pt_phys = alloc_page(); + if (!new_pt_phys) { + printf("failed to allocate a new page table\n"); + return; + } + + unsigned int pde_flags = PAGE_PRESENT | PAGE_RW; + if (flags & PAGE_USER) { + pde_flags |= PAGE_USER; + } + pd[pdindex] = (unsigned long)new_pt_phys | pde_flags; + + uint32_t *pt_virt = (uint32_t*)(0xFFC00000 + (pdindex << 12)); + asm volatile("invlpg (%0)" : : "r" (pt_virt) : "memory"); + + memset(pt_virt, 0, 4096); } uint32_t *pt = (uint32_t*)(0xFFC00000 + (pdindex << 12)); diff --git a/src/mm/paging.c b/src/mm/paging.c index 467eeb3..91325b4 100644 --- a/src/mm/paging.c +++ b/src/mm/paging.c @@ -138,7 +138,7 @@ uint32_t* create_page_dir() uint32_t* current_pd = (uint32_t*)0xFFFFF000; // Current PD (self-mapped) uint32_t* new_pd = (uint32_t*)phys_to_virt((uint32_t)ppp); - for(int i = 768; i < 1023; i++) + for(int i = 768; i < 1024; i++) { if(current_pd[i] & PAGE_PRESENT) { new_pd[i] = current_pd[i];