mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-30 08:41:15 +00:00
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:
parent
3dce0f23f4
commit
4bf1a72d21
Notes:
sideshowbarker
2024-07-19 11:26:36 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/4bf1a72d215
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -121,6 +121,7 @@ public:
|
|||
};
|
||||
void unmap(ShouldDeallocateVirtualMemoryRange = ShouldDeallocateVirtualMemoryRange::Yes);
|
||||
|
||||
void remap();
|
||||
void remap_page(size_t index);
|
||||
|
||||
// For InlineLinkedListNode
|
||||
|
|
Loading…
Reference in a new issue