Skip to content

Commit b6de116

Browse files
cuiyunhuipalmer-dabbelt
authored andcommitted
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 <[email protected]> Reviewed-by: Alexandre Ghiti <[email protected]> Reviewed-by: Andrew Jones <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Palmer Dabbelt <[email protected]>
1 parent 2613c15 commit b6de116

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

arch/riscv/mm/fault.c

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,57 @@
2222

2323
#include "../kernel/head.h"
2424

25+
static void show_pte(unsigned long addr)
26+
{
27+
pgd_t *pgdp, pgd;
28+
p4d_t *p4dp, p4d;
29+
pud_t *pudp, pud;
30+
pmd_t *pmdp, pmd;
31+
pte_t *ptep, pte;
32+
struct mm_struct *mm = current->mm;
33+
34+
if (!mm)
35+
mm = &init_mm;
36+
37+
pr_alert("Current %s pgtable: %luK pagesize, %d-bit VAs, pgdp=0x%016llx\n",
38+
current->comm, PAGE_SIZE / SZ_1K, VA_BITS,
39+
mm == &init_mm ? (u64)__pa_symbol(mm->pgd) : virt_to_phys(mm->pgd));
40+
41+
pgdp = pgd_offset(mm, addr);
42+
pgd = pgdp_get(pgdp);
43+
pr_alert("[%016lx] pgd=%016lx", addr, pgd_val(pgd));
44+
if (pgd_none(pgd) || pgd_bad(pgd) || pgd_leaf(pgd))
45+
goto out;
46+
47+
p4dp = p4d_offset(pgdp, addr);
48+
p4d = p4dp_get(p4dp);
49+
pr_cont(", p4d=%016lx", p4d_val(p4d));
50+
if (p4d_none(p4d) || p4d_bad(p4d) || p4d_leaf(p4d))
51+
goto out;
52+
53+
pudp = pud_offset(p4dp, addr);
54+
pud = pudp_get(pudp);
55+
pr_cont(", pud=%016lx", pud_val(pud));
56+
if (pud_none(pud) || pud_bad(pud) || pud_leaf(pud))
57+
goto out;
58+
59+
pmdp = pmd_offset(pudp, addr);
60+
pmd = pmdp_get(pmdp);
61+
pr_cont(", pmd=%016lx", pmd_val(pmd));
62+
if (pmd_none(pmd) || pmd_bad(pmd) || pmd_leaf(pmd))
63+
goto out;
64+
65+
ptep = pte_offset_map(pmdp, addr);
66+
if (!ptep)
67+
goto out;
68+
69+
pte = ptep_get(ptep);
70+
pr_cont(", pte=%016lx", pte_val(pte));
71+
pte_unmap(ptep);
72+
out:
73+
pr_cont("\n");
74+
}
75+
2576
static void die_kernel_fault(const char *msg, unsigned long addr,
2677
struct pt_regs *regs)
2778
{
@@ -31,6 +82,7 @@ static void die_kernel_fault(const char *msg, unsigned long addr,
3182
addr);
3283

3384
bust_spinlocks(0);
85+
show_pte(addr);
3486
die(regs, "Oops");
3587
make_task_dead(SIGKILL);
3688
}

0 commit comments

Comments
 (0)