From c9e7d41a70dd2212a927f42fcf4acbddb733bdd7 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Rasmusson Date: Wed, 7 Oct 2026 14:02:27 -0400 Subject: vgsp: m98 - dump the program prologue (entry offset) and the param/const-0 page at launch m97 settled the fetch question: zeros planted at the QMD's program offset executed and trapped ILLEGAL_INSTR_ENCODING (0x9) at PC=0x109800 - the SM instruction fetch and const reads through our shadows work; the m90-m96 MMU_NACK at PC=0x109880 is a memory access by the prologue instruction at +0x80, almost certainly the first global load using a guest-VA device pointer from the param buffer (c[0x0]). Dump the program page from the entry offset (40 words) and the param page (16 words) so the access instruction and its pointer arguments are visible in the log. --- kernel/gsp_phys_booter.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'kernel/gsp_phys_booter.c') diff --git a/kernel/gsp_phys_booter.c b/kernel/gsp_phys_booter.c index 28bf6f9..19fb67e 100644 --- a/kernel/gsp_phys_booter.c +++ b/kernel/gsp_phys_booter.c @@ -16444,6 +16444,37 @@ int gsp_phys_backend_guest_gr_submit(const struct gsp_phys_gr_submit *req, GSP_PHYS_PAGE_SIZE); copied++; } + /* + * m98: dump the program prologue (qmd_word 48, from + * the QMD's in-page entry offset) and the param/const-0 + * page (qmd_word 32, from page start) so the first + * data-access instruction and the guest VA arguments it + * fetches can be read from the log. + */ + if (pg->hpa && pg->qmd_word == 48u) { + u32 po = (qmd[48] & + (GSP_PHYS_PAGE_SIZE - 1)) / 4; + const u32 *w = (const u32 *)sh_page + po; + + pr_info("vgsp-gr: program +0x%x: %08x %08x %08x %08x %08x %08x %08x %08x | %08x %08x %08x %08x %08x %08x %08x %08x | %08x %08x %08x %08x %08x %08x %08x %08x | %08x %08x %08x %08x %08x %08x %08x %08x | %08x %08x %08x %08x %08x %08x %08x %08x\n", + po * 4, + w[0], w[1], w[2], w[3], w[4], w[5], + w[6], w[7], w[8], w[9], w[10], w[11], + w[12], w[13], w[14], w[15], w[16], + w[17], w[18], w[19], w[20], w[21], + w[22], w[23], w[24], w[25], w[26], + w[27], w[28], w[29], w[30], w[31], + w[32], w[33], w[34], w[35], w[36], + w[37], w[38], w[39]); + } + if (pg->hpa && pg->qmd_word == 32u) { + const u32 *w = (const u32 *)sh_page; + + pr_info("vgsp-gr: param page: %08x %08x %08x %08x %08x %08x %08x %08x | %08x %08x %08x %08x %08x %08x %08x %08x\n", + w[0], w[1], w[2], w[3], w[4], w[5], + w[6], w[7], w[8], w[9], w[10], w[11], + w[12], w[13], w[14], w[15]); + } for (j = 0; j < req->n_inl; j++) { const struct gsp_phys_gr_inline *inl = &req->inl[j]; -- cgit v1.2.3