riscv/mm/fault: add show_pte() before die()

When the kernel displays "Unable to handle kernel paging request at
virtual address", we would like to confirm the status of the virtual
address in the page table. So add show_pte() before die().

Signed-off-by: Yunhui Cui <cuiyunhui@bytedance.com>
Reviewed-by: Alexandre Ghiti <alexghiti@rivosinc.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Link: https://lore.kernel.org/r/20240723021820.87718-1-cuiyunhui@bytedance.com
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
This commit is contained in:
Yunhui Cui 2024-07-23 10:18:20 +08:00 committed by Palmer Dabbelt
parent 2613c15b0c
commit b6de116e46
No known key found for this signature in database
GPG key ID: 2E1319F35FBB1889

View file

@ -22,6 +22,57 @@
#include "../kernel/head.h"
static void show_pte(unsigned long addr)
{
pgd_t *pgdp, pgd;
p4d_t *p4dp, p4d;
pud_t *pudp, pud;
pmd_t *pmdp, pmd;
pte_t *ptep, pte;
struct mm_struct *mm = current->mm;
if (!mm)
mm = &init_mm;
pr_alert("Current %s pgtable: %luK pagesize, %d-bit VAs, pgdp=0x%016llx\n",
current->comm, PAGE_SIZE / SZ_1K, VA_BITS,
mm == &init_mm ? (u64)__pa_symbol(mm->pgd) : virt_to_phys(mm->pgd));
pgdp = pgd_offset(mm, addr);
pgd = pgdp_get(pgdp);
pr_alert("[%016lx] pgd=%016lx", addr, pgd_val(pgd));
if (pgd_none(pgd) || pgd_bad(pgd) || pgd_leaf(pgd))
goto out;
p4dp = p4d_offset(pgdp, addr);
p4d = p4dp_get(p4dp);
pr_cont(", p4d=%016lx", p4d_val(p4d));
if (p4d_none(p4d) || p4d_bad(p4d) || p4d_leaf(p4d))
goto out;
pudp = pud_offset(p4dp, addr);
pud = pudp_get(pudp);
pr_cont(", pud=%016lx", pud_val(pud));
if (pud_none(pud) || pud_bad(pud) || pud_leaf(pud))
goto out;
pmdp = pmd_offset(pudp, addr);
pmd = pmdp_get(pmdp);
pr_cont(", pmd=%016lx", pmd_val(pmd));
if (pmd_none(pmd) || pmd_bad(pmd) || pmd_leaf(pmd))
goto out;
ptep = pte_offset_map(pmdp, addr);
if (!ptep)
goto out;
pte = ptep_get(ptep);
pr_cont(", pte=%016lx", pte_val(pte));
pte_unmap(ptep);
out:
pr_cont("\n");
}
static void die_kernel_fault(const char *msg, unsigned long addr,
struct pt_regs *regs)
{
@ -31,6 +82,7 @@ static void die_kernel_fault(const char *msg, unsigned long addr,
addr);
bust_spinlocks(0);
show_pte(addr);
die(regs, "Oops");
make_task_dead(SIGKILL);
}