diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 46be2697e4..6a836e93ac 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -4790,7 +4790,7 @@ bool spu_thread::process_mfc_cmd() getllar_spin_count = 0; getllar_busy_waiting_switch = umax; - u64 ntime; + u64 ntime = 0; rsx::reservation_lock rsx_lock(addr, 128); for (u64 i = 0; i != umax; [&]() @@ -4896,7 +4896,7 @@ bool spu_thread::process_mfc_cmd() // Avoid logging useless commands if there is no reservation const bool dump = g_cfg.core.mfc_debug && raddr; - const bool is_spurs_task_wait = pc == 0x11e4 && spurs_addr != -0x80u; + const bool is_spurs_task_wait = pc == 0x11e4 && spurs_addr != 0u - 0x80u; if (!is_spurs_task_wait || spurs_addr != raddr || spurs_waited) { @@ -5570,6 +5570,8 @@ s64 spu_thread::get_ch_value(u32 ch) thread_ctrl::wait_on(state, old); } + + fmt::throw_exception("Unreachable"); // Fix unannotated fallthrough warning } case MFC_RdTagStat: diff --git a/rpcs3/main.cpp b/rpcs3/main.cpp index d6124407f0..a6f7acf285 100644 --- a/rpcs3/main.cpp +++ b/rpcs3/main.cpp @@ -252,11 +252,12 @@ LOG_CHANNEL(q_debug, "QDEBUG"); struct fatal_error_listener final : logs::listener { +public: ~fatal_error_listener() override = default; void log(u64 /*stamp*/, const logs::message& msg, const std::string& prefix, const std::string& text) override { - if (msg <= logs::level::fatal) + if (msg == logs::level::fatal || (msg == logs::level::always && m_log_always)) { std::string _msg = "RPCS3: "; @@ -276,10 +277,17 @@ struct fatal_error_listener final : logs::listener _msg += '\n'; // If launched from CMD - utils::attach_console(utils::console_stream::std_err, false); + utils::attach_console(msg == logs::level::fatal ? utils::console_stream::std_err : utils::console_stream::std_out, false); // Output to error stream as is - utils::output_stderr(_msg); + if (msg == logs::level::fatal) + { + utils::output_stderr(_msg); + } + else + { + std::cout << _msg; + } #ifdef _WIN32 if (IsDebuggerPresent()) @@ -295,6 +303,14 @@ struct fatal_error_listener final : logs::listener } } } + + void log_always(bool enabled) + { + m_log_always = enabled; + } + +private: + bool m_log_always = false; }; // Arguments that force a headless application (need to be checked in create_application) @@ -572,7 +588,7 @@ int main(int argc, char** argv) log_file = logs::make_file_listener(log_name, stats.avail_free / 4); } - static std::unique_ptr fatal_listener = std::make_unique(); + static std::unique_ptr fatal_listener = std::make_unique(); logs::listener::add(fatal_listener.get()); { @@ -1000,6 +1016,10 @@ int main(int argc, char** argv) return 0; } + // Enable console output of "always" log messages. + // Do this after parsing any Qt cli args that might open a window. + fatal_listener->log_always(true); + // Log unique ID gui::utils::log_uuid();