diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index 17ac7ace70..3a9c99a506 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -1231,20 +1231,16 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) no bool handled = rsx::g_access_violation_handler(addr, is_writing); + if (cpu && (cpu->state += cpu_flag::temp, cpu->test_stopped())) + { + // + } + if (handled) { g_tls_fault_rsx++; - if (cpu && cpu->test_stopped()) - { - // - } - return true; } - - if (cpu && cpu->test_stopped()) - { - } } const u8* const code = reinterpret_cast(RIP(context)); @@ -1389,11 +1385,6 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) no if (vm::check_addr(addr, is_writing ? vm::page_writable : vm::page_readable)) { - if (cpu && cpu->test_stopped()) - { - // - } - return true; } diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 36bd0143b6..63cbf1845f 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -1657,14 +1657,20 @@ void spu_thread::cpu_task() void spu_thread::cpu_work() { + if (std::exchange(in_cpu_work, true)) + { + return; + } + const auto timeout = +g_cfg.core.mfc_transfers_timeout; // If either MFC size exceeds limit or timeout has been reached execute pending MFC commands if (mfc_size > g_cfg.core.mfc_transfers_shuffling || (timeout && get_system_time() - mfc_last_timestamp >= timeout)) { do_mfc(false, false); - check_mfc_interrupts(pc + 4); } + + in_cpu_work = false; } struct raw_spu_cleanup @@ -3187,6 +3193,11 @@ bool spu_thread::process_mfc_cmd() // Process MFC commands do_mfc(); + if (mfc_size < 16) + { + break; + } + auto old = state.add_fetch(cpu_flag::wait); if (is_stopped(old)) diff --git a/rpcs3/Emu/Cell/SPUThread.h b/rpcs3/Emu/Cell/SPUThread.h index 8ef8a7cec5..9ee096fe6b 100644 --- a/rpcs3/Emu/Cell/SPUThread.h +++ b/rpcs3/Emu/Cell/SPUThread.h @@ -778,6 +778,8 @@ public: u64 mfc_dump_idx = 0; static constexpr u32 max_mfc_dump_idx = 2048; + bool in_cpu_work = false; + std::array stack_mirror; // Return address information const char* current_func{}; // Current STOP or RDCH blocking function