From 063c065d2f61d54cefe7917b882764d27facf714 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Fri, 29 Dec 2017 23:15:34 +0100 Subject: [PATCH] VMM - free_page unsets page --- src/kernel/memory/vmm.c | 12 ++++++++++++ src/kernel/memory/vmm.tt | 15 +++++++++++++++ 2 files changed, 27 insertions(+) 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); +}