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); +}