diff options
| author | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-07 14:02:27 -0400 |
|---|---|---|
| committer | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-07 14:02:27 -0400 |
| commit | c9e7d41a70dd2212a927f42fcf4acbddb733bdd7 (patch) | |
| tree | 6283cb4cd735e2c9b03f35cd6fafafbf736a8590 | |
| parent | 320c679a470b9eb31dd111b7189b07316298c23a (diff) | |
| download | open-iov-c9e7d41a70dd2212a927f42fcf4acbddb733bdd7.tar.gz open-iov-c9e7d41a70dd2212a927f42fcf4acbddb733bdd7.zip | |
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.
| -rw-r--r-- | kernel/gsp_phys_booter.c | 31 |
1 files changed, 31 insertions, 0 deletions
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]; |
