Query about ARM64 virt_to_phys and vice versa implementation
Pratyush Anand
panand at redhat.com
Wed Aug 10 01:28:08 PDT 2016
Hi,
Would like to discuss virt_to_phys() and phys_to_virt() conversion in latest
kernel. I can see that if VA < PAGE_OFFSET, then we just subtract kimage_voffset
from VA and we get the PA. However, there is no such condition for
phys_to_virt(). phys_to_virt is always done by (PA - PHYS_OFFSET + PAGE_OFFSET).
So, how does phys_to_virt() work for all the cases? I must be missing something.
-- I am using a platform with VA bits = 42.
Therefore PAGE_OFFSET on my platform is 0xfffffe0000000000
PHYS_OFFSET is 0x8000000000
kimage_voffset is 0xfffffb8006000000
Now lets find physical address of log_buf:
# cat /proc/kallsyms | grep -w "d log_buf"
fffffc0008ca6b40 d log_buf
Since VA < PAGE_OFFSET (fffffc0008ca6b40 < fffffe0000000000)
Therefore as per definition of virt_to_phys() from asm/memory.h:
PA = VA - kimage_voffset = fffffc0008ca6b40 - fffffb8006000000 = 8002CA6B40
Now convert PA=8002CA6B40 to VA.
VA = PA - PHYS_OFFSET + PAGE_OFFSET = 8002CA6B40 - 8000000000 + fffffe0000000000
= fffffe0002CA6B40 which not equal to fffffc0008ca6b40.
So, do we have dual mapping for all physical addresses? If not, how does it
work? What I am missing.
If its dual mapping, then probably we will need to fix couple of things in
kexec-tools.
~Pratyush
More information about the linux-arm-kernel
mailing list