From 3de885c7a623e2aef0c1058333a1a0ac14f9e3be Mon Sep 17 00:00:00 2001 From: Eladash Date: Wed, 10 Jul 2019 22:56:56 +0300 Subject: [PATCH] Dealloc exec cache after sys_prx/overlay_unload_module Must come before vm::dealloc of it. --- rpcs3/Emu/Cell/PPUModule.cpp | 6 ++++++ rpcs3/Emu/Cell/lv2/sys_overlay.cpp | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/rpcs3/Emu/Cell/PPUModule.cpp b/rpcs3/Emu/Cell/PPUModule.cpp index 28e688d4d0..822ca73458 100644 --- a/rpcs3/Emu/Cell/PPUModule.cpp +++ b/rpcs3/Emu/Cell/PPUModule.cpp @@ -1036,6 +1036,12 @@ void ppu_unload_prx(const lv2_prx& prx) for (auto& seg : prx.segs) { + if (seg.flags & 1) + { + // Segment was considered executable thus needing to free exec data + utils::memory_decommit(vm::g_exec_addr + size_t{seg.addr} * 2, size_t{seg.size} * 2); + } + vm::dealloc(seg.addr, vm::main); } } diff --git a/rpcs3/Emu/Cell/lv2/sys_overlay.cpp b/rpcs3/Emu/Cell/lv2/sys_overlay.cpp index 1984fba9a5..b1d5fe1874 100644 --- a/rpcs3/Emu/Cell/lv2/sys_overlay.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_overlay.cpp @@ -54,6 +54,11 @@ error_code sys_overlay_unload_module(u32 ovlmid) for (auto& seg : _main->segs) { + if (seg.flags & 1) + { + utils::memory_decommit(vm::g_exec_addr + size_t{seg.addr} * 2, size_t{seg.size} * 2); + } + vm::dealloc(seg.addr); }