From 20cdccf09c4ba412ddbe9e3225692177c8108359 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Rasmusson Date: Thu, 22 Oct 2026 14:25:05 -0400 Subject: r481b sema_push_raw walk fix: handle op!=1 method groups (data runs, scans) and bound to launch-sized pushes (512..8192 bytes) so the launch method stream dumps cleanly --- kernel/gsp_sema_service.c | 65 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 19 deletions(-) diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c index eddc73d..6bc28a1 100644 --- a/kernel/gsp_sema_service.c +++ b/kernel/gsp_sema_service.c @@ -9003,7 +9003,9 @@ static void svc_push_raw_dump(const u8 *buf, u32 len, u64 push_va, { u32 off = 0, gi = 0; - if (svc_pushraw_n >= gsp_sema_push_raw || !gsp_sema_push_raw) + if (!gsp_sema_push_raw || svc_pushraw_n >= gsp_sema_push_raw) + return; + if (len < 512 || len > 8192) return; if (push_va == svc_pushraw_last_va) return; @@ -9011,29 +9013,54 @@ static void svc_push_raw_dump(const u8 *buf, u32 len, u64 push_va, svc_pushraw_n++; pr_info("sema-pushraw: BEGIN h=0x%x va=0x%llx len=%u n=%u\n", h_object, push_va, len, svc_pushraw_n); - while (off + 4 <= len && gi < 128) { - u32 hdr, cnt, addr, v[8], k, n; + while (off + 4 <= len && gi < 160) { + u32 hdr, op, cnt, subch, addr, v[4] = {0,0,0,0}, k, n; memcpy(&hdr, buf + off, 4); - if ((hdr >> 29) != 1) { - pr_info("sema-pushraw: off=0x%x raw=%08x (not a method header)\n", - off, hdr); - break; - } + op = (hdr >> 29) & 0x7; cnt = (hdr >> 16) & 0xfff; + subch = (hdr >> 13) & 0x7; addr = (hdr & 0x1fff) << 2; - n = cnt > 8 ? 8 : cnt; - for (k = 0; k < n && off + 4 + 4 * k + 4 <= len; k++) + n = cnt > 4 ? 4 : cnt; + for (k = 0; k < n && off + 8 + 4 * k <= len; k++) memcpy(&v[k], buf + off + 4 + 4 * k, 4); - pr_info("sema-pushraw: [%u] off=0x%x addr=0x%x cnt=%u v0=%08x v1=%08x v2=%08x v3=%08x v4=%08x\n", - gi, off, addr, cnt, - n > 0 ? v[0] : 0, n > 1 ? v[1] : 0, - n > 2 ? v[2] : 0, n > 3 ? v[3] : 0, - n > 4 ? v[4] : 0); - if (!cnt) - break; - off += 4 + cnt * 4; - gi++; + pr_info("sema-pushraw: [%u] off=0x%x op=%u sub=%u addr=0x%x cnt=%u v0=%08x v1=%08x v2=%08x v3=%08x\n", + gi, off, op, subch, addr, cnt, + v[0], v[1], v[2], v[3]); + if (op == 3 && cnt) { + off += 4 + cnt * 4; + gi++; + continue; + } + if (!cnt) { + gi++; + off += 4; + continue; + } + if (op == 1) { + off += 4 + cnt * 4; + gi++; + continue; + } + { + u32 p; + bool found = false; + + for (p = off + 4; p + 4 <= len; p += 4) { + u32 h2; + + memcpy(&h2, buf + p, 4); + if (((h2 >> 29) & 0x7) == 1 && + ((h2 >> 16) & 0xfff)) { + off = p; + found = true; + break; + } + } + if (!found) + off = len; + gi++; + } } pr_info("sema-pushraw: END h=0x%x va=0x%llx consumed=0x%x/%u\n", h_object, push_va, off, len); -- cgit v1.2.3