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); }