From 5db674c184acfdcf4c7c08216176c86f2774c884 Mon Sep 17 00:00:00 2001 From: Franz Scherr Date: Thu, 3 Dec 2015 21:43:04 +0100 Subject: [PATCH] Free table and directory pages --- arch/x86/64/source/ArchMemory.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/arch/x86/64/source/ArchMemory.cpp b/arch/x86/64/source/ArchMemory.cpp index 041438832..1d83be34a 100644 --- a/arch/x86/64/source/ArchMemory.cpp +++ b/arch/x86/64/source/ArchMemory.cpp @@ -32,7 +32,7 @@ bool ArchMemory::checkAndRemove(pointer map_ptr, uint64 index) ((uint64*) map)[index] = 0; for (uint64 i = 0; i < PAGE_DIR_ENTRIES; i++) { - if (map[index].present != 0) + if (map[i].present != 0) return false; } return true; @@ -43,13 +43,23 @@ bool ArchMemory::unmapPage(uint64 virtual_page) ArchMemoryMapping m = resolveMapping(page_map_level_4_, virtual_page); assert(m.page_ppn != 0 && m.page_size == PAGE_SIZE); + PageManager::instance()->freePPN(m.pt_ppn, PAGE_SIZE); bool empty = checkAndRemove(getIdentAddressOfPPN(m.pt_ppn), m.pti); - if (empty) - empty = checkAndRemove(getIdentAddressOfPPN(m.pd_ppn), m.pdi); - if (empty) + if (empty) + { + PageManager::instance()->freePPN(m.pt_ppn, PAGE_SIZE); + empty = checkAndRemove(getIdentAddressOfPPN(m.pd_ppn), m.pdi); + } + if (empty) + { + PageManager::instance()->freePPN(m.pd_ppn, PAGE_SIZE); empty = checkAndRemove(getIdentAddressOfPPN(m.pdpt_ppn), m.pdpti); - if (empty) + } + if (empty) + { + PageManager::instance()->freePPN(m.pdpt_ppn, PAGE_SIZE); empty = checkAndRemove(getIdentAddressOfPPN(m.pml4_ppn), m.pml4i); + } return true; }