From f211fa0100d930372b3db53f4f61c6254024962a Mon Sep 17 00:00:00 2001 From: Ralf Baechle Date: Wed, 17 Oct 2012 00:04:01 +0200 Subject: [PATCH] MIPS: Quick debug helper to dump page table for an addres to the console. Signed-off-by: Ralf Baechle --- arch/mips/include/asm/tlbdebug.h | 1 + arch/mips/lib/dump_tlb.c | 47 ++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/arch/mips/include/asm/tlbdebug.h b/arch/mips/include/asm/tlbdebug.h index bb8f5c29c3d9..89571466524e 100644 --- a/arch/mips/include/asm/tlbdebug.h +++ b/arch/mips/include/asm/tlbdebug.h @@ -12,5 +12,6 @@ * TLB debugging functions: */ extern void dump_tlb_all(void); +extern void dump_current_addr(unsigned long addr); #endif /* __ASM_TLBDEBUG_H */ diff --git a/arch/mips/lib/dump_tlb.c b/arch/mips/lib/dump_tlb.c index a99c1d3fc567..2d7a91aa8360 100644 --- a/arch/mips/lib/dump_tlb.c +++ b/arch/mips/lib/dump_tlb.c @@ -5,11 +5,14 @@ * Copyright (C) 1999 by Silicon Graphics, Inc. */ #include +#include #include +#include #include #include #include +#include #include static inline const char *msk2str(unsigned int mask) @@ -111,3 +114,47 @@ void dump_tlb_all(void) { dump_tlb(0, current_cpu_data.tlbsize - 1); } + +void dump_current_addr(unsigned long addr) +{ + pgd_t *pgdp; + pud_t *pudp; + pmd_t *pmdp; + pte_t *ptep; + pte_t pte; + + printk("Dumping for address %lx\n", addr); + pgdp = pgd_offset(current->mm, addr); + printk("pgd %lx\n", pgd_val(*pgdp)); + + pudp = pud_offset(pgdp, addr); + printk("pud %lx", pud_val(*pudp)); +#ifndef __PAGETABLE_PMD_FOLDED + if (pud_val(*pudp) == (unsigned long) invalid_pmd_table) { + printk(" (invalid_pmd_table)\n"); + + return; + } +#endif + printk("\n"); + + pmdp = pmd_offset(pudp, addr); + printk("pmd %lx", pmd_val(*pmdp)); + if (pmd_huge(*pmdp)) { + printk(" pmd is huge\n"); + + return; + } + if (pmd_val(*pmdp) == (unsigned long) invalid_pte_table) { + printk(" (invalid_pte_table)\n"); + + return; + } + printk("\n"); + + ptep = pte_offset_map(pmdp, addr); + pte = *ptep; + printk("pte %lx\n", pte_val(pte)); + if (pte_huge(pte)) + printk(" pte is huge\n"); +} -- 2.39.5