1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 08:38:12 +00:00

Add a PageDirectory::flush() that does nothing if another PD is active.

This way callers can just flush() every time after making any modification
and the PageDirectory itself will decide if TLB invalidation is necessary.
This commit is contained in:
Andreas Kling 2018-12-31 20:52:59 +01:00
parent cc30407b8c
commit a5ffa2eec7
2 changed files with 11 additions and 14 deletions

View file

@ -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(&region);
}
inline bool PageDirectory::is_active() const
{
return &current->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 (&current->page_directory() == this)
MM.flush_tlb(laddr);
}