diff --git a/src/kernel/memory/vmm.c b/src/kernel/memory/vmm.c index e0bd1c3..c26049e 100644 --- a/src/kernel/memory/vmm.c +++ b/src/kernel/memory/vmm.c @@ -71,3 +71,15 @@ int touch_page(void *P4, uintptr_t addr, uint16_t flags) return 0; } + +void free_page(void *P4, uintptr_t addr, int free) +{ + (void)free; + if(!(P4 + && P4e(P4, addr).present + && P3e(P4, addr).present + && P2e(P4, addr).present + )) + return; + P1e(P4, addr).value = 0; +} diff --git a/src/kernel/memory/vmm.tt b/src/kernel/memory/vmm.tt index 846c9ff..8e41db0 100644 --- a/src/kernel/memory/vmm.tt +++ b/src/kernel/memory/vmm.tt @@ -155,3 +155,18 @@ TEST(touch_page_fails_if_out_of_pages) int retval = touch_page(p4, 0, 0); ASSERT_NEQ_INT(retval, 0); } + +TEST(free_page_unsets_page) +{ + p4[1] = (uintptr_t)p3; + p4[1] |= PAGE_PRESENT; + p3[2] = (uintptr_t)p2; + p3[2] |= PAGE_PRESENT; + p2[3] = (uintptr_t)p1; + p2[3] |= PAGE_PRESENT; + p1[4] = PAGE_PRESENT; + + free_page(p4, ADDR1234, 0); + + ASSERT_EQ_PTR(p1[4], 0); +}