summaryrefslogtreecommitdiffstats
path: root/src/core/hle/kernel/k_page_table_base.cpp
diff options
context:
space:
mode:
authorCharles Lombardo <clombardo169@gmail.com>2024-01-15 19:50:58 +0100
committerGitHub <noreply@github.com>2024-01-15 19:50:58 +0100
commit0127cec371164c5cb59233b860c0932c66d9d697 (patch)
tree9977b279f22dba2f73944f6ea99453f1ba3319e9 /src/core/hle/kernel/k_page_table_base.cpp
parentMerge pull request #12610 from liamwhite/reply-and-dont-receive (diff)
parentkernel: optimize page free on shutdown (diff)
downloadyuzu-0127cec371164c5cb59233b860c0932c66d9d697.tar
yuzu-0127cec371164c5cb59233b860c0932c66d9d697.tar.gz
yuzu-0127cec371164c5cb59233b860c0932c66d9d697.tar.bz2
yuzu-0127cec371164c5cb59233b860c0932c66d9d697.tar.lz
yuzu-0127cec371164c5cb59233b860c0932c66d9d697.tar.xz
yuzu-0127cec371164c5cb59233b860c0932c66d9d697.tar.zst
yuzu-0127cec371164c5cb59233b860c0932c66d9d697.zip
Diffstat (limited to 'src/core/hle/kernel/k_page_table_base.cpp')
-rw-r--r--src/core/hle/kernel/k_page_table_base.cpp34
1 files changed, 31 insertions, 3 deletions
diff --git a/src/core/hle/kernel/k_page_table_base.cpp b/src/core/hle/kernel/k_page_table_base.cpp
index 73fbda331..3f0a39d33 100644
--- a/src/core/hle/kernel/k_page_table_base.cpp
+++ b/src/core/hle/kernel/k_page_table_base.cpp
@@ -431,15 +431,43 @@ Result KPageTableBase::InitializeForProcess(Svc::CreateProcessFlag as_type, bool
m_memory_block_slab_manager));
}
+Result KPageTableBase::FinalizeProcess() {
+ // Only process tables should be finalized.
+ ASSERT(!this->IsKernel());
+
+ // NOTE: Here Nintendo calls an unknown OnFinalize function.
+ // this->OnFinalize();
+
+ // NOTE: Here Nintendo calls a second unknown OnFinalize function.
+ // this->OnFinalize2();
+
+ // NOTE: Here Nintendo does a page table walk to discover heap pages to free.
+ // We will use the block manager finalization below to free them.
+
+ R_SUCCEED();
+}
+
void KPageTableBase::Finalize() {
- auto HostUnmapCallback = [&](KProcessAddress addr, u64 size) {
- if (Settings::IsFastmemEnabled()) {
+ this->FinalizeProcess();
+
+ auto BlockCallback = [&](KProcessAddress addr, u64 size) {
+ if (m_impl->fastmem_arena) {
m_system.DeviceMemory().buffer.Unmap(GetInteger(addr), size, false);
}
+
+ // Get physical pages.
+ KPageGroup pg(m_kernel, m_block_info_manager);
+ this->MakePageGroup(pg, addr, size / PageSize);
+
+ // Free the pages.
+ pg.CloseAndReset();
};
// Finalize memory blocks.
- m_memory_block_manager.Finalize(m_memory_block_slab_manager, std::move(HostUnmapCallback));
+ {
+ KScopedLightLock lk(m_general_lock);
+ m_memory_block_manager.Finalize(m_memory_block_slab_manager, std::move(BlockCallback));
+ }
// Free any unsafe mapped memory.
if (m_mapped_unsafe_physical_memory) {