From a9d7902bb738f5b363add48b6cc6f4c850ae166d Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 8 Feb 2020 12:49:00 +0100 Subject: [PATCH] x86: Simplify region unmapping a bit Add PageTableEntry::clear() to zero out a whole PTE, and use that for unmapping instead of clearing individual fields. --- Kernel/Arch/i386/CPU.h | 2 ++ Kernel/VM/MemoryManager.cpp | 3 +-- Kernel/VM/Region.cpp | 8 ++------ 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Kernel/Arch/i386/CPU.h b/Kernel/Arch/i386/CPU.h index 11fb73881c..a9c93d51d4 100644 --- a/Kernel/Arch/i386/CPU.h +++ b/Kernel/Arch/i386/CPU.h @@ -215,6 +215,8 @@ public: bool is_execute_disabled() const { return raw() & NoExecute; } void set_execute_disabled(bool b) { set_bit(NoExecute, b); } + void clear() { m_raw = 0; } + void set_bit(u64 bit, bool value) { if (value) diff --git a/Kernel/VM/MemoryManager.cpp b/Kernel/VM/MemoryManager.cpp index 5f6147ae54..aa50e71757 100644 --- a/Kernel/VM/MemoryManager.cpp +++ b/Kernel/VM/MemoryManager.cpp @@ -559,8 +559,7 @@ void MemoryManager::unquickmap_page() ASSERT_INTERRUPTS_DISABLED(); ASSERT(m_quickmap_in_use); auto& pte = boot_pd3_pde1023_pt[0]; - pte.set_physical_page_base(0); - pte.set_present(false); + pte.clear(); flush_tlb(VirtualAddress(0xffe00000)); m_quickmap_in_use = false; } diff --git a/Kernel/VM/Region.cpp b/Kernel/VM/Region.cpp index c97c809579..86a567dd76 100644 --- a/Kernel/VM/Region.cpp +++ b/Kernel/VM/Region.cpp @@ -255,8 +255,7 @@ void Region::map_individual_page_impl(size_t page_index) auto& pte = MM.ensure_pte(*m_page_directory, page_vaddr); auto& physical_page = vmobject().physical_pages()[first_page_index() + page_index]; if (!physical_page) { - pte.set_physical_page_base(0); - pte.set_present(false); + pte.clear(); } else { pte.set_cache_disabled(!m_cacheable); pte.set_physical_page_base(physical_page->paddr().get()); @@ -290,10 +289,7 @@ void Region::unmap(ShouldDeallocateVirtualMemoryRange deallocate_range) for (size_t i = 0; i < page_count(); ++i) { auto vaddr = this->vaddr().offset(i * PAGE_SIZE); auto& pte = MM.ensure_pte(*m_page_directory, vaddr); - pte.set_physical_page_base(0); - pte.set_present(false); - pte.set_writable(false); - pte.set_user_allowed(false); + pte.clear(); MM.flush_tlb(vaddr); #ifdef MM_DEBUG auto& physical_page = vmobject().physical_pages()[first_page_index() + i];