diff --git a/rpcs3/Emu/Cell/PPUModule.cpp b/rpcs3/Emu/Cell/PPUModule.cpp index 6dbbf6c195c5..f311763a4205 100644 --- a/rpcs3/Emu/Cell/PPUModule.cpp +++ b/rpcs3/Emu/Cell/PPUModule.cpp @@ -2682,8 +2682,16 @@ std::pair, CellError> ppu_load_overlay(const ppu_ex ovlm->entry = static_cast(elf.header.e_entry); + const auto cpu = cpu_thread::get_current(); + // Analyse executable (TODO) - ovlm->analyse(0, ovlm->entry, end, applied); + if (!ovlm->analyse(0, ovlm->entry, end, applied, !cpu ? std::function() : [cpu, is_being_used_in_emulation = (vm::base(ovlm->segs[0].addr) == ovlm->segs[0].ptr)]() + { + return is_being_used_in_emulation && cpu->state & cpu_flag::exit; + })) + { + return {nullptr, CellError{CELL_CANCEL + 0u}}; + } // Validate analyser results (not required) ovlm->validate(0); diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index c25a765dc268..b86cde77b9ef 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -3479,6 +3479,12 @@ extern void ppu_precompile(std::vector& dir_queue, std::vector ovlmid, const std::string& vp if (error) { + if (error == CELL_CANCEL + 0u) + { + // Emulation stopped + return {}; + } + return error; }