mirror of
https://github.com/RGBCube/serenity
synced 2025-05-28 17:35:08 +00:00
Kernel: Move page remapping into Region::remap_page(index)
Let Region deal with this, instead of everyone calling MemoryManager.
This commit is contained in:
parent
dc35b1d647
commit
fe455c5ac4
4 changed files with 31 additions and 30 deletions
|
@ -302,7 +302,7 @@ bool MemoryManager::zero_page(Region& region, unsigned page_index_in_region)
|
|||
#ifdef PAGE_FAULT_DEBUG
|
||||
dbgprintf("MM: zero_page() but page already present. Fine with me!\n");
|
||||
#endif
|
||||
remap_region_page(region, page_index_in_region);
|
||||
region.remap_page(page_index_in_region);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -314,7 +314,7 @@ bool MemoryManager::zero_page(Region& region, unsigned page_index_in_region)
|
|||
dbgprintf(" >> ZERO P%p\n", physical_page->paddr().get());
|
||||
#endif
|
||||
vmo.physical_pages()[page_index_in_region] = move(physical_page);
|
||||
remap_region_page(region, page_index_in_region);
|
||||
region.remap_page(page_index_in_region);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -327,7 +327,7 @@ bool MemoryManager::copy_on_write(Region& region, unsigned page_index_in_region)
|
|||
dbgprintf(" >> It's a COW page but nobody is sharing it anymore. Remap r/w\n");
|
||||
#endif
|
||||
region.set_should_cow(page_index_in_region, false);
|
||||
remap_region_page(region, page_index_in_region);
|
||||
region.remap_page(page_index_in_region);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -348,7 +348,7 @@ bool MemoryManager::copy_on_write(Region& region, unsigned page_index_in_region)
|
|||
vmo.physical_pages()[page_index_in_region] = move(physical_page);
|
||||
unquickmap_page();
|
||||
region.set_should_cow(page_index_in_region, false);
|
||||
remap_region_page(region, page_index_in_region);
|
||||
region.remap_page(page_index_in_region);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -372,7 +372,7 @@ bool MemoryManager::page_in_from_inode(Region& region, unsigned page_index_in_re
|
|||
#ifdef PAGE_FAULT_DEBUG
|
||||
dbgprintf("MM: page_in_from_inode() but page already present. Fine with me!\n");
|
||||
#endif
|
||||
remap_region_page(region, page_index_in_region);
|
||||
region.remap_page( page_index_in_region);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -400,7 +400,7 @@ bool MemoryManager::page_in_from_inode(Region& region, unsigned page_index_in_re
|
|||
kprintf("MM: page_in_from_inode was unable to allocate a physical page\n");
|
||||
return false;
|
||||
}
|
||||
remap_region_page(region, page_index_in_region);
|
||||
region.remap_page(page_index_in_region);
|
||||
u8* dest_ptr = region.vaddr().offset(page_index_in_region * PAGE_SIZE).as_ptr();
|
||||
memcpy(dest_ptr, page_buffer, PAGE_SIZE);
|
||||
return true;
|
||||
|
@ -672,27 +672,6 @@ void MemoryManager::unquickmap_page()
|
|||
m_quickmap_in_use = false;
|
||||
}
|
||||
|
||||
void MemoryManager::remap_region_page(Region& region, unsigned page_index_in_region)
|
||||
{
|
||||
ASSERT(region.page_directory());
|
||||
InterruptDisabler disabler;
|
||||
auto page_vaddr = region.vaddr().offset(page_index_in_region * PAGE_SIZE);
|
||||
auto& pte = ensure_pte(*region.page_directory(), page_vaddr);
|
||||
auto& physical_page = region.vmobject().physical_pages()[page_index_in_region];
|
||||
ASSERT(physical_page);
|
||||
pte.set_physical_page_base(physical_page->paddr().get());
|
||||
pte.set_present(true); // FIXME: Maybe we should use the is_readable flag here?
|
||||
if (region.should_cow(page_index_in_region))
|
||||
pte.set_writable(false);
|
||||
else
|
||||
pte.set_writable(region.is_writable());
|
||||
pte.set_user_allowed(region.is_user_accessible());
|
||||
region.page_directory()->flush(page_vaddr);
|
||||
#ifdef MM_DEBUG
|
||||
dbg() << "MM: >> remap_region_page (PD=" << region.page_directory()->cr3() << ", PTE=" << (void*)pte.raw() << "{" << &pte << "}) " << region.name() << " " << page_vaddr << " => " << physical_page->paddr() << " (@" << physical_page.ptr() << ")";
|
||||
#endif
|
||||
}
|
||||
|
||||
void MemoryManager::remap_region(PageDirectory& page_directory, Region& region)
|
||||
{
|
||||
InterruptDisabler disabler;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue