diff --git a/src/kernel/memory/vmm.c b/src/kernel/memory/vmm.c index fccb76c..707fe41 100644 --- a/src/kernel/memory/vmm.c +++ b/src/kernel/memory/vmm.c @@ -55,7 +55,11 @@ int touch_page(void *P4, uintptr_t addr, uint16_t flags) (void)flags; if(!P4) return -1; if(!P4e(P4, addr).present) - P4e(P4, addr).value = pmm_alloc(); + P4e(P4, addr).value = pmm_alloc() | flags | PAGE_PRESENT; + if(!P3e(P4, addr).present) + P3e(P4, addr).value = pmm_alloc() | flags | PAGE_PRESENT; + if(!P2e(P4, addr).present) + P2e(P4, addr).value = pmm_alloc() | flags | PAGE_PRESENT; return 0; } diff --git a/src/kernel/memory/vmm.tt b/src/kernel/memory/vmm.tt index 6da6503..4e63e54 100644 --- a/src/kernel/memory/vmm.tt +++ b/src/kernel/memory/vmm.tt @@ -124,9 +124,19 @@ uintptr_t pmm_alloc() TEST(touch_page_adds_P3) { - p4[0] = 0; + touch_page(p4, (1UL<<39)+(2UL<<30)+(3UL<<21)+(4UL<<12), 0); - touch_page(p4, 0, 0); - - ASSERT_NEQ_PTR(p4[0], 0); + ASSERT_EQ_PTR(p4[1], (uintptr_t)p3 | PAGE_PRESENT); +} +TEST(touch_page_adds_P2) +{ + touch_page(p4, (1UL<<39)+(2UL<<30)+(3UL<<21)+(4UL<<12), 0); + + ASSERT_EQ_PTR(p3[2], (uintptr_t)p2 | PAGE_PRESENT); +} +TEST(touch_page_adds_P1) +{ + touch_page(p4, (1UL<<39)+(2UL<<30)+(3UL<<21)+(4UL<<12), 0); + + ASSERT_EQ_PTR(p2[3], (uintptr_t)p1 | PAGE_PRESENT); }