From d54a206f82739c43af052ee799524170316d6184 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Sat, 30 Dec 2017 13:16:20 +0100 Subject: [PATCH] VMM - free_page returns P1 to PMM if empty --- src/kernel/memory/vmm.c | 3 +++ src/kernel/memory/vmm.tt | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/kernel/memory/vmm.c b/src/kernel/memory/vmm.c index e3c6ac5..4052cd8 100644 --- a/src/kernel/memory/vmm.c +++ b/src/kernel/memory/vmm.c @@ -91,17 +91,20 @@ void free_page(void *P4, uintptr_t addr, int free) for(int i = 0; i < ENTRIES_PER_PT; i++) if(pt[i].value) return; + pmm_free(MASK_FLAGS(P2e(P4, addr).value)); P2e(P4, addr).value = 0; pt = PT(P3e(P4, addr).value); for(int i = 0; i < ENTRIES_PER_PT; i++) if(pt[i].value) return; + pmm_free(MASK_FLAGS(P3e(P4, addr).value)); P3e(P4, addr).value = 0; pt = PT(P4e(P4, addr).value); for(int i = 0; i < ENTRIES_PER_PT; i++) if(pt[i].value) return; + pmm_free(MASK_FLAGS(P4e(P4, addr).value)); P4e(P4, addr).value = 0; } diff --git a/src/kernel/memory/vmm.tt b/src/kernel/memory/vmm.tt index a505d67..21773a1 100644 --- a/src/kernel/memory/vmm.tt +++ b/src/kernel/memory/vmm.tt @@ -165,3 +165,19 @@ TEST(free_page_does_not_unset_P2_entry_if_P1_is_not_empty) ASSERT_NEQ_PTR(p2[3], 0); } + +uintptr_t freed[] = {0,0,0,0,0}; +void pmm_free(uintptr_t page) +{ + static int counter = 0; + freed[counter++] = page; +} +TEST(free_page_returns_P1_to_PMM_if_empty) +{ + BUILD_PT(1,2,3); + p1[4] = PAGE_PRESENT; + + free_page(p4, ADDR1234, 1); + + ASSERT_EQ_PTR(freed[0], p1); +}