summaryrefslogtreecommitdiff
path: root/Kernel
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel')
-rw-r--r--Kernel/Memory/AddressSpace.cpp3
-rw-r--r--Kernel/Memory/Region.cpp5
-rw-r--r--Kernel/Memory/Region.h2
3 files changed, 7 insertions, 3 deletions
diff --git a/Kernel/Memory/AddressSpace.cpp b/Kernel/Memory/AddressSpace.cpp
index d275561b4e..dbda1324e1 100644
--- a/Kernel/Memory/AddressSpace.cpp
+++ b/Kernel/Memory/AddressSpace.cpp
@@ -320,7 +320,10 @@ void AddressSpace::dump_regions()
void AddressSpace::remove_all_regions(Badge<Process>)
{
+ VERIFY(Thread::current() == g_finalizer);
SpinlockLocker lock(m_lock);
+ for (auto& region : m_regions)
+ (*region).unmap(Region::ShouldDeallocateVirtualRange::No, ShouldFlushTLB::No);
m_regions.clear();
}
diff --git a/Kernel/Memory/Region.cpp b/Kernel/Memory/Region.cpp
index c503c0dbed..3c3a2fd83f 100644
--- a/Kernel/Memory/Region.cpp
+++ b/Kernel/Memory/Region.cpp
@@ -234,7 +234,7 @@ bool Region::remap_vmobject_page(size_t page_index, bool with_flush)
return success;
}
-void Region::unmap(ShouldDeallocateVirtualRange deallocate_range)
+void Region::unmap(ShouldDeallocateVirtualRange deallocate_range, ShouldFlushTLB should_flush_tlb)
{
if (!m_page_directory)
return;
@@ -245,7 +245,8 @@ void Region::unmap(ShouldDeallocateVirtualRange deallocate_range)
auto vaddr = vaddr_from_page_index(i);
MM.release_pte(*m_page_directory, vaddr, i == count - 1 ? MemoryManager::IsLastPTERelease::Yes : MemoryManager::IsLastPTERelease::No);
}
- MemoryManager::flush_tlb(m_page_directory, vaddr(), page_count());
+ if (should_flush_tlb == ShouldFlushTLB::Yes)
+ MemoryManager::flush_tlb(m_page_directory, vaddr(), page_count());
if (deallocate_range == ShouldDeallocateVirtualRange::Yes) {
m_page_directory->range_allocator().deallocate(range());
}
diff --git a/Kernel/Memory/Region.h b/Kernel/Memory/Region.h
index 7571456ca3..5ca89bfd53 100644
--- a/Kernel/Memory/Region.h
+++ b/Kernel/Memory/Region.h
@@ -178,7 +178,7 @@ public:
No,
Yes,
};
- void unmap(ShouldDeallocateVirtualRange = ShouldDeallocateVirtualRange::Yes);
+ void unmap(ShouldDeallocateVirtualRange, ShouldFlushTLB = ShouldFlushTLB::Yes);
void remap();