summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/gsp_sema_service.c65
1 files 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);