Kernel: Teach Region how to remap itself

Now remapping (i.e flushing kernel metadata to the CPU page tables)
is done by simply calling Region::remap().
This commit is contained in:
Andreas Kling 2019-11-03 20:59:54 +01:00
parent 3dce0f23f4
commit 4bf1a72d21
Notes: sideshowbarker 2024-07-19 11:26:36 +09:00
7 changed files with 15 additions and 19 deletions

View file

@ -283,7 +283,7 @@ int Process::sys$mprotect(void* addr, size_t size, int prot)
if (!region)
return -EINVAL;
region->set_writable(prot & PROT_WRITE);
MM.remap_region(page_directory(), *region);
region->remap();
return 0;
}
@ -885,7 +885,7 @@ void create_signal_trampolines()
memcpy(code_ptr, trampoline, trampoline_size);
trampoline_region->set_writable(false);
MM.remap_region(*trampoline_region->page_directory(), *trampoline_region);
trampoline_region->remap();
}
int Process::sys$restore_signal_mask(u32 mask)

View file

@ -155,7 +155,7 @@ void SharedBuffer::seal()
for (auto& ref : m_refs) {
if (ref.region) {
ref.region->set_writable(false);
MM.remap_region(*ref.region->page_directory(), *ref.region);
ref.region->remap();
}
}
}

View file

@ -47,9 +47,8 @@ void InodeVMObject::inode_size_changed(Badge<Inode>, size_t old_size, size_t new
m_physical_pages.resize(new_page_count);
// FIXME: Consolidate with inode_contents_changed() so we only do a single walk.
for_each_region([](Region& region) {
ASSERT(region.page_directory());
MM.remap_region(*region.page_directory(), region);
for_each_region([](auto& region) {
region.remap();
});
}
@ -99,9 +98,8 @@ void InodeVMObject::inode_contents_changed(Badge<Inode>, off_t offset, ssize_t s
#endif
// FIXME: Consolidate with inode_size_changed() so we only do a single walk.
for_each_region([](Region& region) {
ASSERT(region.page_directory());
MM.remap_region(*region.page_directory(), region);
for_each_region([](auto& region) {
region.remap();
});
}

View file

@ -673,13 +673,6 @@ void MemoryManager::unquickmap_page()
m_quickmap_in_use = false;
}
void MemoryManager::remap_region(PageDirectory& page_directory, Region& region)
{
InterruptDisabler disabler;
ASSERT(region.page_directory() == &page_directory);
map_region_at_address(page_directory, region, region.vaddr());
}
void MemoryManager::map_region_at_address(PageDirectory& page_directory, Region& region, VirtualAddress vaddr)
{
InterruptDisabler disabler;

View file

@ -64,8 +64,6 @@ public:
void deallocate_user_physical_page(PhysicalPage&&);
void deallocate_supervisor_physical_page(PhysicalPage&&);
void remap_region(PageDirectory&, Region&);
void map_for_kernel(VirtualAddress, PhysicalAddress, bool cache_disabled = false);
OwnPtr<Region> allocate_kernel_region(size_t, const StringView& name, bool user_accessible = false, bool should_commit = true);

View file

@ -75,7 +75,7 @@ NonnullOwnPtr<Region> Region::clone()
#endif
// Set up a COW region. The parent (this) region becomes COW as well!
ensure_cow_map().fill(true);
MM.remap_region(current->process().page_directory(), *this);
remap();
auto clone_region = Region::create_user_accessible(m_range, m_vmobject->clone(), m_offset_in_vmo, m_name, m_access);
clone_region->ensure_cow_map();
return clone_region;
@ -220,3 +220,9 @@ void Region::map(PageDirectory& page_directory)
{
MM.map_region_at_address(page_directory, *this, vaddr());
}
void Region::remap()
{
ASSERT(m_page_directory);
MM.map_region_at_address(*m_page_directory, *this, vaddr());
}

View file

@ -121,6 +121,7 @@ public:
};
void unmap(ShouldDeallocateVirtualMemoryRange = ShouldDeallocateVirtualMemoryRange::Yes);
void remap();
void remap_page(size_t index);
// For InlineLinkedListNode