summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/gsp_phys_booter.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/kernel/gsp_phys_booter.c b/kernel/gsp_phys_booter.c
index 189d8b7..b548b62 100644
--- a/kernel/gsp_phys_booter.c
+++ b/kernel/gsp_phys_booter.c
@@ -21275,7 +21275,17 @@ if (gsp_phys_gr_slot_kept(j, sa_mask,
WRITE_ONCE(gsp_phys_gr_mme_pack_sa,
false);
}
- if (pl_room >= 24u) {
+ /*
+ * c220 (eng11): pl_room is clamped to pl_n
+ * (what fits), so a captured prelude shorter
+ * than 24 words always failed the >= 24u test
+ * and was "deferred" forever - the MME code
+ * never loaded and the first CALL ran macro
+ * 0xf1 with the IRAM unloaded (MME-REGS
+ * miss=1 pc=513 mac=0xf1 -> badf1201 poison).
+ * Emit whenever the WHOLE prelude fits too.
+ */
+ if (pl_room >= 24u || pl_room == pl_n) {
emit_prelude =
(pl_gen != READ_ONCE(
gsp_phys_gr_mme_prelude_gen) ||
@@ -27020,7 +27030,7 @@ static bool gsp_phys_gr_win_drop_auto = 1;
module_param_named(sema_gl_win_drop_auto, gsp_phys_gr_win_drop_auto, bool,
0644);
MODULE_PARM_DESC(sema_gl_win_drop_auto,
- "Drop the software-emulated trigger methods (0x10c NOTIFY, 0x1b0 LAUNCH_DMA, 0x5e0 TWOD fill) from verbatim 3D replays (default 1)");
+ "Drop the software-emulated trigger methods (0x10c NOTIFY, 0x1b0 LAUNCH_DMA, 0x5e0 TWOD fill, 0x22c SET_GO_IDLE_TIMEOUT trap) from verbatim 3D replays (default 1)");
static bool gsp_phys_rmcall_gr_win_drop_auto_match(u32 addr)
{
@@ -27047,9 +27057,19 @@ static bool gsp_phys_rmcall_gr_win_drop_auto_match(u32 addr)
* the client actually waits on (the r1061 keep-prefix window
* retired with ch_rel=0xc0ffee02 and the client kept pushing
* frames without any 0x1b00 in the replay).
+ *
+ * c222 (eng11): 0x22c SET_GO_IDLE_TIMEOUT <- 0x800 rides the
+ * captured per-frame window (the client's own channel-init block
+ * is inside it) and every replay ends with
+ * `trap=0x8000022c/00000800` (mthd=0x22c mmegen=0) - the FE's
+ * trapped-method latch names exactly this write and the window
+ * retires with zero MME-generated methods (pc0=0 gen0=0) and zero
+ * stores. It is init-only configuration for GO_IDLE (SEND_GO_IDLE
+ * 0x13c is never replayed), so the replay channel does not need
+ * it; drop it like the other replay-hostile triggers above.
*/
return addr == 0x010cu || addr == 0x01b0u || addr == 0x05e0u ||
- addr == 0x1b00u;
+ addr == 0x1b00u || addr == 0x022cu;
}
/*