With kernel commit 7bc1a0f9e176 ("arm64: mm: use single quantity to
represent the PA to VA translation"), memstart_addr can be negative,
which makes it different from real phy_offset.
In crash utility, PTOV() needs memstart_addr, while getting PFN offset
in a dumpfile, phy_offset is required. So storing them separately for
different purpose.
Signed-off-by: Pingfan Liu <piliu@xxxxxxxxxx>
Cc: Lianbo Jiang <lijiang@xxxxxxxxxx>
To: crash-utility@xxxxxxxxxx
---
arm64.c | 22 +++++++++++++++++++---
defs.h | 1 +
2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/arm64.c b/arm64.c
index 37aed07..e560d07 100644
--- a/arm64.c
+++ b/arm64.c
@@ -687,6 +687,7 @@ arm64_dump_machdep_table(ulong arg)
fprintf(fp, " kimage_voffset: %016lx\n", ms->kimage_voffset);
}
fprintf(fp, " phys_offset: %lx\n", ms->phys_offset);
+ fprintf(fp, " memstart_addr: %lx\n", ms->memstart_addr);
fprintf(fp, "__exception_text_start: %lx\n", ms->__exception_text_start);
fprintf(fp, " __exception_text_end: %lx\n", ms->__exception_text_end);
fprintf(fp, " __irqentry_text_start: %lx\n", ms->__irqentry_text_start);
@@ -987,7 +988,7 @@ arm64_calc_physvirt_offset(void)
ulong physvirt_offset;
struct syment *sp;
- ms->physvirt_offset = ms->phys_offset - ms->page_offset;
+ ms->physvirt_offset = ms->memstart_addr - ms->page_offset;
if ((sp = kernel_symbol_search("physvirt_offset")) &&
machdep->machspec->kimage_voffset) {
@@ -1028,7 +1029,11 @@ arm64_calc_phys_offset(void)
ms->kimage_voffset && (sp = kernel_symbol_search("memstart_addr"))) {
if (pc->flags & PROC_KCORE) {
if ((string = pc->read_vmcoreinfo("NUMBER(PHYS_OFFSET)"))) {
- ms->phys_offset = htol(string, QUIET, NULL);
+ ms->memstart_addr = htol(string, QUIET, NULL);
+ if (ms->memstart_addr < 0)
+ ms->phys_offset = ms->memstart_addr + 0xffff000000000000 - 0xfff0000000000000;