mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 11:12:45 +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:
		
							parent
							
								
									cc30407b8c
								
							
						
					
					
						commit
						a5ffa2eec7
					
				
					 2 changed files with 11 additions and 14 deletions
				
			
		|  | @ -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); | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling