diff options
Diffstat (limited to 'kernel')
| -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]; |
