mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-04-13 09:59:31 +00:00
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:
parent
2613c15b0c
commit
b6de116e46
1 changed files with 52 additions and 0 deletions
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue