1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 09:58:11 +00:00

Kernel: Move region map/unmap operations into the Region class

The more Region can take care of itself, the better.
This commit is contained in:
Andreas Kling 2019-11-03 20:37:03 +01:00
parent 9e03f3ce20
commit 2cfc43c982
5 changed files with 42 additions and 39 deletions

View file

@ -713,35 +713,6 @@ void MemoryManager::map_region_at_address(PageDirectory& page_directory, Region&
}
}
bool MemoryManager::unmap_region(Region& region, bool deallocate_range)
{
ASSERT(region.page_directory());
InterruptDisabler disabler;
for (size_t i = 0; i < region.page_count(); ++i) {
auto vaddr = region.vaddr().offset(i * PAGE_SIZE);
auto& pte = ensure_pte(*region.page_directory(), vaddr);
pte.set_physical_page_base(0);
pte.set_present(false);
pte.set_writable(false);
pte.set_user_allowed(false);
region.page_directory()->flush(vaddr);
#ifdef MM_DEBUG
auto& physical_page = region.vmobject().physical_pages()[region.first_page_index() + i];
dbgprintf("MM: >> Unmapped V%p => P%p <<\n", vaddr, physical_page ? physical_page->paddr().get() : 0);
#endif
}
if (deallocate_range)
region.page_directory()->range_allocator().deallocate(region.range());
region.release_page_directory();
return true;
}
bool MemoryManager::map_region(Process& process, Region& region)
{
map_region_at_address(process.page_directory(), region, region.vaddr());
return true;
}
bool MemoryManager::validate_user_read(const Process& process, VirtualAddress vaddr) const
{
auto* region = region_from_vaddr(process, vaddr);