Watchdog: seed the stall clock instead of bailing on it

poll_frame_stall_watchdog returned early when g_last_frame_time was zero,
where the RSX-side check seeds it -- and seeding is what starts the clock.
Since the whole reason the watchdog exists is an RSX thread too stuck to run
that check, nothing ever seeded it: the value stayed zero and the watchdog
bailed on every tick forever, blocked in exactly the scenario it was written
for.

Reproduced on Tales of Xillia 2: white screen held for nearly nine minutes,
guest mutex traffic zero throughout, and not one dump.
This commit is contained in:
jpolo1224
2026-08-24 14:49:26 -04:00
parent c3cc0c9687
commit fae49e2b6c
+9
View File
@@ -1450,8 +1450,17 @@ namespace rsx
{
const u64 now = get_system_time();
// SEED the timestamp, do not merely bail on it.
//
// The RSX-side check sets g_last_frame_time here, which is what starts its clock. This
// half returned instead -- and since the case it exists for is an RSX thread too stuck to
// run that check, nothing ever seeded it, g_last_frame_time stayed zero, and the watchdog
// bailed on every tick forever. Blocked in exactly the scenario it was written for.
if (g_progr_text || !g_last_frame_time)
{
g_last_frame_time = now;
g_frame_stall_reported = false;
g_frame_stall_dumps = 0;
return;
}