Hi Pingfan, Lianbo,
-----Original Message-----
Hi, Pingfan
Thank you for the update.
> This bug connects 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 phys_offset. If
> using memstart_addr to calculate the real paddr, the unreasonable paddr
> will be got.
> Furthermore, in crash utility, PTOV() needs memstart_addr to calculate
> VA from PA, while getting PFN offset in a dumpfile, phys_offset is
> required.
As you mentioned above, the calculation formula has been changed, how to
deal with the backward compatibility issue? Should we use kernel version
to determine which code branch it should execute? Please correct me if I
was wrong.
I'm not sure whether this is the same as Lianbo's concern, but my concern
is that if a kernel has the "physvirt_offset" variable, PTOV() looks to be
changed needlessly by the patch. Does it work with such an old kernel?
static void
arm64_calc_physvirt_offset(void)
{
...
ms->physvirt_offset = ms->phys_offset_nominal;
if ((sp = kernel_symbol_search("physvirt_offset")) &&
machdep->machspec->kimage_voffset) {
if (READMEM(pc->mfd, &physvirt_offset, sizeof(physvirt_offset),
sp->value, sp->value -
machdep->machspec->kimage_voffset) > 0) {
ms->physvirt_offset = physvirt_offset; <<-- this
case
}
}
}
-#define PTOV(X) \
- ((unsigned long)(X) - (machdep->machspec->physvirt_offset))
+#define PTOV(X) \
+ (((unsigned long)(X) - (machdep->machspec->physvirt_offset)) | PAGE_OFFSET)
Maybe we can set ms->physvirt_offset to work with the current PTOV()
when no symbol?
Sorry that I cannot try the patch or ideas because of no machine.
Thanks,
Kazu