diff options
author | liamwhite <liamwhite@users.noreply.github.com> | 2024-01-25 22:21:38 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-25 22:21:38 +0100 |
commit | e04368ad7cf4c8d8820ef4da451d9954ff38cb2d (patch) | |
tree | be7e40d1bcd44304eff90e6e5a7a49c02628111e /src/core/hle/kernel/k_page_table_base.cpp | |
parent | Merge pull request #12777 from t895/firmware-warning (diff) | |
parent | nvservices: close map handles on session close (diff) | |
download | yuzu-e04368ad7cf4c8d8820ef4da451d9954ff38cb2d.tar yuzu-e04368ad7cf4c8d8820ef4da451d9954ff38cb2d.tar.gz yuzu-e04368ad7cf4c8d8820ef4da451d9954ff38cb2d.tar.bz2 yuzu-e04368ad7cf4c8d8820ef4da451d9954ff38cb2d.tar.lz yuzu-e04368ad7cf4c8d8820ef4da451d9954ff38cb2d.tar.xz yuzu-e04368ad7cf4c8d8820ef4da451d9954ff38cb2d.tar.zst yuzu-e04368ad7cf4c8d8820ef4da451d9954ff38cb2d.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 | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/src/core/hle/kernel/k_page_table_base.cpp b/src/core/hle/kernel/k_page_table_base.cpp index 3f0a39d33..1dd86fb3c 100644 --- a/src/core/hle/kernel/k_page_table_base.cpp +++ b/src/core/hle/kernel/k_page_table_base.cpp @@ -69,9 +69,14 @@ public: }; template <typename AddressType> -void InvalidateInstructionCache(KernelCore& kernel, AddressType addr, u64 size) { +void InvalidateInstructionCache(KernelCore& kernel, KPageTableBase* table, AddressType addr, + u64 size) { // TODO: lock the process list for (auto& process : kernel.GetProcessList()) { + if (std::addressof(process->GetPageTable().GetBasePageTable()) != table) { + continue; + } + for (size_t i = 0; i < Core::Hardware::NUM_CPU_CORES; i++) { auto* interface = process->GetArmInterface(i); if (interface) { @@ -1302,7 +1307,7 @@ Result KPageTableBase::UnmapCodeMemory(KProcessAddress dst_address, KProcessAddr bool reprotected_pages = false; SCOPE_EXIT({ if (reprotected_pages && any_code_pages) { - InvalidateInstructionCache(m_kernel, dst_address, size); + InvalidateInstructionCache(m_kernel, this, dst_address, size); } }); @@ -2036,7 +2041,7 @@ Result KPageTableBase::SetProcessMemoryPermission(KProcessAddress addr, size_t s for (const auto& block : pg) { StoreDataCache(GetHeapVirtualPointer(m_kernel, block.GetAddress()), block.GetSize()); } - InvalidateInstructionCache(m_kernel, addr, size); + InvalidateInstructionCache(m_kernel, this, addr, size); } R_SUCCEED(); @@ -3277,7 +3282,7 @@ Result KPageTableBase::WriteDebugMemory(KProcessAddress dst_address, KProcessAdd R_TRY(PerformCopy()); // Invalidate the instruction cache, as this svc allows modifying executable pages. - InvalidateInstructionCache(m_kernel, dst_address, size); + InvalidateInstructionCache(m_kernel, this, dst_address, size); R_SUCCEED(); } |