mirror of
https://github.com/fergalmoran/ladybird.git
synced 2026-01-04 07:36:50 +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:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user