]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
MIPS: Quick debug helper to dump page table for an addres to the console.
authorRalf Baechle <ralf@linux-mips.org>
Tue, 16 Oct 2012 22:04:01 +0000 (00:04 +0200)
committerRalf Baechle <ralf@linux-mips.org>
Mon, 26 Nov 2012 12:41:06 +0000 (13:41 +0100)
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/include/asm/tlbdebug.h
arch/mips/lib/dump_tlb.c

index bb8f5c29c3d9f9a5e0c72c4497993fec46fcfae2..89571466524e00a94e2574797814966017a31196 100644 (file)
@@ -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 */
index a99c1d3fc56769dc91f58ce64e117e0eb8533b44..2d7a91aa83607c67c11616443bf45109ddc9b14f 100644 (file)
@@ -5,11 +5,14 @@
  * Copyright (C) 1999 by Silicon Graphics, Inc.
  */
 #include <linux/kernel.h>
+#include <linux/hugetlb.h>
 #include <linux/mm.h>
+#include <linux/sched.h>
 
 #include <asm/mipsregs.h>
 #include <asm/page.h>
 #include <asm/pgtable.h>
+#include <asm/current.h>
 #include <asm/tlbdebug.h>
 
 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");
+}