diff options
author | Charles Lombardo <clombardo169@gmail.com> | 2024-01-15 19:50:58 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-15 19:50:58 +0100 |
commit | 0127cec371164c5cb59233b860c0932c66d9d697 (patch) | |
tree | 9977b279f22dba2f73944f6ea99453f1ba3319e9 /src/core/hle/kernel/k_page_table_base.cpp | |
parent | Merge pull request #12610 from liamwhite/reply-and-dont-receive (diff) | |
parent | kernel: optimize page free on shutdown (diff) | |
download | yuzu-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.cpp | 34 |
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) { |