1.) When I tested live system with "crash vmlinux /proc/kcore" in kernel v5.7, I met the following crash issue: ........................................ crash: seek error: kernel virtual address: ffff75e9fffff000 type: "pud page" ........................................ 2.) The root cause is the PTOV does not work correctly for some kernel, and then arm64_vtop_4level_4k() does not work correctly too. Why PTOV does not work? Because the physvirt_offset does not get the correct value. 3.) This patch uses symbol_value_from_proc_kallsyms() to get the virtual address of "physvirt_offset", and then uses READMEM(,..,KCORE_USE_VADDR) to get the correct value of "physvirt_offset". And also updates the ms->phys_offset which is initialized with a wrong value in kernel version [5.4, 5.10). Also add more comments for arm64_calc_physvirt_offset(). Signed-off-by: Huang Shijie <shijie@xxxxxxxxxxxxxxxxxxxxxx> --- v1 --> v2: v1 tried to get the correct value for phys_offset, and then get the physvirt_offset correctly. v2 tried to get the physvirt_offset correctly, and them update phys_offset correctly. Tested this patch with kernel 5.7. --- arm64.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/arm64.c b/arm64.c index b843032..60ae644 100644 --- a/arm64.c +++ b/arm64.c @@ -1399,15 +1399,43 @@ arm64_calc_kimage_voffset(void) ms->kimage_voffset += (kt->relocate * -1); } +/* + * The physvirt_offset only exits in kernel [5.4, 5.10) + * + * 1) In kernel v5.4, the patch: + * "5383cc6efed137 arm64: mm: Introduce vabits_actual" + * + * introduced the physvirt_offset. + * + * 2) In kernel v5.10, the patch: + * "7bc1a0f9e17658 arm64: mm: use single quantity + * to represent the PA to VA translation" + * removed the physvirt_offset. + */ static void arm64_calc_physvirt_offset(void) { struct machine_specific *ms = machdep->machspec; ulong physvirt_offset; struct syment *sp; + ulong value; if ((sp = kernel_symbol_search("physvirt_offset")) && machdep->machspec->kimage_voffset) { + if (pc->flags & PROC_KCORE) { + value = symbol_value_from_proc_kallsyms("physvirt_offset"); + if ((value != BADVAL) && + (READMEM(pc->mfd, &physvirt_offset, sizeof(ulong), + value, KCORE_USE_VADDR) > 0)) { + machdep->flags |= HAS_PHYSVIRT_OFFSET; + ms->physvirt_offset = physvirt_offset; + + /* Update the ms->phys_offset which is wrong */ + ms->phys_offset = ms->physvirt_offset + ms->page_offset; + return; + } + } + if (READMEM(pc->mfd, &physvirt_offset, sizeof(physvirt_offset), sp->value, sp->value - machdep->machspec->kimage_voffset) > 0) { -- 2.30.2 -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/crash-utility Contribution Guidelines: https://github.com/crash-utility/crash/wiki