diff --git a/Kernel/MemoryManager.cpp b/Kernel/MemoryManager.cpp index 283b5aaf7d..25f3cb6c70 100644 --- a/Kernel/MemoryManager.cpp +++ b/Kernel/MemoryManager.cpp @@ -439,8 +439,7 @@ void MemoryManager::remap_region_page(PageDirectory& page_directory, Region& reg else pte.set_writable(region.is_writable); pte.set_user_allowed(user_allowed); - if (page_directory.is_active()) - flush_tlb(page_laddr); + page_directory.flush(page_laddr); #ifdef MM_DEBUG dbgprintf("MM: >> remap_region_page (PD=%x) '%s' L%x => P%x (@%p)\n", &page_directory, region.name.characters(), page_laddr.get(), physical_page->paddr().get(), physical_page.ptr()); #endif @@ -477,8 +476,7 @@ void MemoryManager::map_region_at_address(PageDirectory& page_directory, Region& pte.set_writable(region.is_writable); } pte.set_user_allowed(user_allowed); - if (page_directory.is_active()) - flush_tlb(page_laddr); + page_directory.flush(page_laddr); #ifdef MM_DEBUG dbgprintf("MM: >> map_region_at_address (PD=%x) '%s' L%x => P%x (@%p)\n", &page_directory, region.name.characters(), page_laddr, physical_page ? physical_page->paddr().get() : 0, physical_page.ptr()); #endif @@ -498,8 +496,7 @@ void MemoryManager::unmap_range(PageDirectory& page_directory, LinearAddress lad pte.set_present(false); pte.set_writable(false); pte.set_user_allowed(false); - if (page_directory.is_active()) - flush_tlb(page_laddr); + page_directory.flush(page_laddr); #ifdef MM_DEBUG dbgprintf("MM: << unmap_range L%x =/> 0\n", page_laddr); #endif @@ -548,8 +545,7 @@ bool MemoryManager::unmap_region(Process& process, Region& region) pte.set_present(false); pte.set_writable(false); pte.set_user_allowed(false); - if (process.page_directory().is_active()) - flush_tlb(laddr); + process.page_directory().flush(laddr); #ifdef MM_DEBUG auto& physical_page = region.vmo().physical_pages()[region.first_page_index() + i]; dbgprintf("MM: >> Unmapped L%x => P%x <<\n", laddr, physical_page ? physical_page->paddr().get() : 0); @@ -772,11 +768,6 @@ void MemoryManager::unregister_region(Region& region) m_regions.remove(®ion); } -inline bool PageDirectory::is_active() const -{ - return ¤t->page_directory() == this; -} - size_t Region::committed() const { size_t bytes = 0; @@ -801,3 +792,9 @@ PageDirectory::~PageDirectory() MM.remove_identity_mapping(LinearAddress(page_table.paddr().get()), PAGE_SIZE); } } + +void PageDirectory::flush(LinearAddress laddr) +{ + if (¤t->page_directory() == this) + MM.flush_tlb(laddr); +} diff --git a/Kernel/MemoryManager.h b/Kernel/MemoryManager.h index 3c0a6f6408..1e29a2254a 100644 --- a/Kernel/MemoryManager.h +++ b/Kernel/MemoryManager.h @@ -61,7 +61,7 @@ public: dword cr3() const { return m_directory_page->paddr().get(); } dword* entries() { return reinterpret_cast(cr3()); } - bool is_active() const; + void flush(LinearAddress); private: RetainPtr m_directory_page;