mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 11:38:11 +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
|
@ -96,7 +96,7 @@ int Region::commit()
|
|||
return -ENOMEM;
|
||||
}
|
||||
vmobject().physical_pages()[i] = move(physical_page);
|
||||
MM.remap_region_page(*this, i);
|
||||
remap_page(i - first_page_index());
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -169,3 +169,25 @@ Bitmap& Region::ensure_cow_map() const
|
|||
m_cow_map = make<Bitmap>(page_count(), true);
|
||||
return *m_cow_map;
|
||||
}
|
||||
|
||||
void Region::remap_page(size_t index)
|
||||
{
|
||||
ASSERT(page_directory());
|
||||
InterruptDisabler disabler;
|
||||
auto page_vaddr = vaddr().offset(index * PAGE_SIZE);
|
||||
auto& pte = MM.ensure_pte(*page_directory(), page_vaddr);
|
||||
auto& physical_page = vmobject().physical_pages()[first_page_index() + index];
|
||||
ASSERT(physical_page);
|
||||
pte.set_physical_page_base(physical_page->paddr().get());
|
||||
pte.set_present(true);
|
||||
if (should_cow(index))
|
||||
pte.set_writable(false);
|
||||
else
|
||||
pte.set_writable(is_writable());
|
||||
pte.set_user_allowed(is_user_accessible());
|
||||
page_directory()->flush(page_vaddr);
|
||||
#ifdef MM_DEBUG
|
||||
dbg() << "MM: >> region.remap_page (PD=" << page_directory()->cr3() << ", PTE=" << (void*)pte.raw() << "{" << &pte << "}) " << name() << " " << page_vaddr << " => " << physical_page->paddr() << " (@" << physical_page.ptr() << ")";
|
||||
#endif
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue