The current vaddr_to_paddr_riscv64() incorrectly uses VTOP() linear
mapping for vmalloc and vmemmap addresses, which are not linearly
mapped. Add checks to exclude these regions so they fall through to
page table walk via vtop_riscv64().

Co-developed-by: Rui Qi <[email protected]>
Signed-off-by: Shuan He <[email protected]>
---
 arch/riscv64.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/riscv64.c b/arch/riscv64.c
index 1b43ec4f62a1..28365fa0cc5b 100644
--- a/arch/riscv64.c
+++ b/arch/riscv64.c
@@ -202,6 +202,8 @@ vaddr_to_paddr_riscv64(unsigned long vaddr)
        unsigned long long swapper_phys;
 
        if (vaddr >= PAGE_OFFSET &&
+           !(vaddr >= NUMBER(vmalloc_start) && vaddr <= NUMBER(vmalloc_end)) &&
+           !(vaddr >= NUMBER(vmemmap_start) && vaddr <= NUMBER(vmemmap_end)) &&
            !(vaddr >= NUMBER(modules_vaddr) && vaddr <= NUMBER(modules_end))){
                return VTOP(vaddr);
        }
-- 
2.20.1

Reply via email to