As for SA57(4K page) in RISC-V based vmcore, 'vtop address' command
produces the misleading information, including P4D, PUD, PMD, PTE.

This commit is based on the following previous commit:
commit 536a0d78f1fa ("RISCV64: fix wrong information of PMD and PTE - SA39(4K 
page)")

Signed-off-by: Austin Kim <[email protected]>
---
 riscv64.c | 49 ++++++++++++++++++++++++-------------------------
 1 file changed, 24 insertions(+), 25 deletions(-)

diff --git a/riscv64.c b/riscv64.c
index 4400d5c..eceae70 100644
--- a/riscv64.c
+++ b/riscv64.c
@@ -1287,11 +1287,10 @@ static int
 riscv64_vtop_5level_4k(ulong *pgd, ulong vaddr, physaddr_t *paddr, int verbose)
 {
        ulong *pgd_ptr, pgd_val;
-       ulong p4d_val;
-       ulong pud_val;
-       ulong pmd_val;
-       ulong pte_val, pte_pfn;
-       ulong pt_phys;
+       ulong p4d_base, p4d_addr, p4d_val;
+       ulong pud_base, pud_addr, pud_val;
+       ulong pmd_base, pmd_addr, pmd_val;
+       ulong pte_base, pte_addr, pte_val, pte_pfn;
 
        if (verbose)
                fprintf(fp, "PAGE DIRECTORY: %lx\n", (ulong)pgd);
@@ -1305,47 +1304,47 @@ riscv64_vtop_5level_4k(ulong *pgd, ulong vaddr, 
physaddr_t *paddr, int verbose)
        if (!pgd_val)
                goto no_page;
        pgd_val &= PTE_PFN_PROT_MASK;
-       pt_phys = (pgd_val >> _PAGE_PFN_SHIFT) << PAGESHIFT();
+       p4d_base = (pgd_val >> _PAGE_PFN_SHIFT) << PAGESHIFT();
 
        /* P4D */
-       FILL_P4D(PAGEBASE(pt_phys), PHYSADDR, PAGESIZE());
-       p4d_val = ULONG(machdep->machspec->p4d + PAGEOFFSET(sizeof(p4d_t) *
-                       p4d_index_l5_4k(vaddr)));
+       FILL_P4D(PAGEBASE(p4d_base), PHYSADDR, PAGESIZE());
+       p4d_addr = p4d_base + sizeof(p4d_t) * p4d_index_l5_4k(vaddr);
+       p4d_val = ULONG(machdep->machspec->p4d + PAGEOFFSET(p4d_addr));
        if (verbose)
-               fprintf(fp, "  P4D: %016lx => %016lx\n", pt_phys, p4d_val);
+               fprintf(fp, "  P4D: %016lx => %016lx\n", p4d_addr, p4d_val);
        if (!p4d_val)
                goto no_page;
        p4d_val &= PTE_PFN_PROT_MASK;
-       pt_phys = (p4d_val >> _PAGE_PFN_SHIFT) << PAGESHIFT();
+       pud_base = (p4d_val >> _PAGE_PFN_SHIFT) << PAGESHIFT();
 
        /* PUD */
-       FILL_PUD(PAGEBASE(pt_phys), PHYSADDR, PAGESIZE());
-       pud_val = ULONG(machdep->pud + PAGEOFFSET(sizeof(pud_t) *
-                       pud_index_l5_4k(vaddr)));
+       FILL_PUD(PAGEBASE(pud_base), PHYSADDR, PAGESIZE());
+       pud_addr = pud_base + sizeof(pud_t) * pud_index_l5_4k(vaddr);
+       pud_val = ULONG(machdep->pud + PAGEOFFSET(pud_addr));
        if (verbose)
-               fprintf(fp, "  PUD: %016lx => %016lx\n", pt_phys, pud_val);
+               fprintf(fp, "  PUD: %016lx => %016lx\n", pud_addr, pud_val);
        if (!pud_val)
                goto no_page;
        pud_val &= PTE_PFN_PROT_MASK;
-       pt_phys = (pud_val >> _PAGE_PFN_SHIFT) << PAGESHIFT();
+       pmd_base = (pud_val >> _PAGE_PFN_SHIFT) << PAGESHIFT();
 
        /* PMD */
-       FILL_PMD(PAGEBASE(pt_phys), PHYSADDR, PAGESIZE());
-       pmd_val = ULONG(machdep->pmd + PAGEOFFSET(sizeof(pmd_t) *
-                       pmd_index_l4_4k(vaddr)));
+       FILL_PMD(PAGEBASE(pmd_base), PHYSADDR, PAGESIZE());
+       pmd_addr = pmd_base + sizeof(pmd_t) * pmd_index_l5_4k(vaddr);
+       pmd_val = ULONG(machdep->pmd + PAGEOFFSET(pmd_addr));
        if (verbose)
-               fprintf(fp, "  PMD: %016lx => %016lx\n", pt_phys, pmd_val);
+               fprintf(fp, "  PMD: %016lx => %016lx\n", pmd_addr, pmd_val);
        if (!pmd_val)
                goto no_page;
        pmd_val &= PTE_PFN_PROT_MASK;
-       pt_phys = (pmd_val >> _PAGE_PFN_SHIFT) << PAGESHIFT();
+       pte_base = (pmd_val >> _PAGE_PFN_SHIFT) << PAGESHIFT();
 
        /* PTE */
-       FILL_PTBL(PAGEBASE(pt_phys), PHYSADDR, PAGESIZE());
-       pte_val = ULONG(machdep->ptbl + PAGEOFFSET(sizeof(pte_t) *
-                       pte_index_l4_4k(vaddr)));
+       FILL_PTBL(PAGEBASE(pte_base), PHYSADDR, PAGESIZE());
+       pte_addr = pte_base + sizeof(pte_t) * pte_index_l5_4k(vaddr);
+       pte_val = ULONG(machdep->ptbl + PAGEOFFSET(pte_addr));
        if (verbose)
-               fprintf(fp, "  PTE: %lx => %lx\n", pt_phys, pte_val);
+               fprintf(fp, "  PTE: %lx => %lx\n", pte_base, pte_val);
        if (!pte_val)
                goto no_page;
        pte_val &= PTE_PFN_PROT_MASK;
-- 
2.34.1
--
Crash-utility mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to