diff options
| -rw-r--r-- | kernel/gsp_phys_booter.c | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/kernel/gsp_phys_booter.c b/kernel/gsp_phys_booter.c index 0ea6076..e417d71 100644 --- a/kernel/gsp_phys_booter.c +++ b/kernel/gsp_phys_booter.c @@ -18550,6 +18550,21 @@ module_param_named(sema_gl_pair_orphan_drop, gsp_phys_rmcall_gr_pair_orphan_drop, bool, 0644); MODULE_PARM_DESC(sema_gl_pair_orphan_drop, "Pair-state sync: roll pair_open/open_split back on dropped/held/LOAD-ONLY windows and elide orphan END runs when no pair is open (default 1; 0 = legacy bytes)"); +/* + * SESSION 155-2: r1526's first calls-kept draw window faulted with a GR + * class error at SET_FRONT_FACE (0x191c <- 0x901) EC 0x0d + * ILLEGAL_METHOD_IN_BEGIN_END: the window entered with a BEGIN..END pair + * still open from the previous emitted window, so the first client state + * method ran inside it. Close the carried pair with the driver's own END + * form (0x1614 + event word, event 1 for split chains 1/2) before the + * window, then let the normal walk rebase the model. Gated: default 0 + * (legacy bytes). + */ +static bool gsp_phys_rmcall_gr_pair_close_entry; +module_param_named(sema_gl_pair_close_entry, + gsp_phys_rmcall_gr_pair_close_entry, bool, 0644); +MODULE_PARM_DESC(sema_gl_pair_close_entry, + "Emit an END (0x1614) for a BEGIN..END pair carried open into the window before its first run (default 0; A/B)"); static bool gsp_phys_gr_mme_pairs_emitted; /* launch emitted a pair run */ static u32 gsp_phys_gr_mme_pairs_gen; /* gen whose pairs retired OK */ static u32 gsp_phys_gr_mme_launch_gen; /* last built launch's gen */ @@ -18677,6 +18692,7 @@ static u32 gsp_phys_gr_pair_chain_fix(u32 *w, u32 *np, u32 cap) { u32 n = *np, r = 0, begins = 0, ends = 0, drains = 0; u32 chains = 0, orphans = 0, orphan_dropped = 0, nested = 0, badv = 0; + u32 entry_closes = 0; bool open = READ_ONCE(gsp_phys_gr_mme_pair_open); bool seen = false, begin_logged = false; u32 open_split = READ_ONCE(gsp_phys_gr_mme_pair_open_split); @@ -18684,6 +18700,27 @@ static u32 gsp_phys_gr_pair_chain_fix(u32 *w, u32 *np, u32 cap) WRITE_ONCE(gsp_phys_gr_mme_pair_open_entry, open); WRITE_ONCE(gsp_phys_gr_mme_pair_open_entry_split, open_split); + if (READ_ONCE(gsp_phys_rmcall_gr_pair_close_entry) && open) { + u32 expect = ((open_split == 1u || open_split == 2u) ? 1u : 0u); + + if (n + 2u <= cap) { + memmove(&w[2], &w[0], (size_t)n * 4u); + w[0] = ((u32)GSP_PHYS_RMCALL_METHOD_IMM << 29) | + (1u << 16) | (0x1614u >> 2); + w[1] = expect; + n += 2u; + r = 2u; + open = false; + seen = true; + entry_closes++; + pr_info_ratelimited("vgsp-gr: PAIR-CLOSE-ENTRY split=%u ev=%u window=%u (carried pair closed before the window)\n", + open_split, expect, n); + } else { + pr_warn_ratelimited("vgsp-gr: PAIR-CLOSE-ENTRY skipped (window=%u cap=%u)\n", + n, cap); + } + } + while (r < n) { u32 h = w[r]; u32 op = (h >> 29) & 7u; @@ -18796,12 +18833,12 @@ static u32 gsp_phys_gr_pair_chain_fix(u32 *w, u32 *np, u32 cap) r += span; } if (begins > 1u || drains || chains || orphans || orphan_dropped || - nested || badv || open) - pr_info_ratelimited("vgsp-gr: PAIR-CHAIN begin=%u end=%u drains=%u chain=%u orphan_end=%u orphan_drop=%u nested=%u endv_mismatch=%u open_at_end=%u entry=%u window=%u\n", + nested || badv || open || entry_closes) + pr_info_ratelimited("vgsp-gr: PAIR-CHAIN begin=%u end=%u drains=%u chain=%u orphan_end=%u orphan_drop=%u nested=%u endv_mismatch=%u open_at_end=%u entry=%u close=%u window=%u\n", begins, ends, drains, chains, orphans, orphan_dropped, nested, badv, open ? 1u : 0u, READ_ONCE(gsp_phys_gr_mme_pair_open_entry) ? 1u : 0u, - n); + entry_closes, n); *np = n; WRITE_ONCE(gsp_phys_gr_mme_pair_open, open); WRITE_ONCE(gsp_phys_gr_mme_pair_open_split, open_split); |
