the attached patch (against 2.4.3) makes pagetable-printing
PAE-compatible, handling the nonexistent pagetable case too.

        Ingo
--- linux/arch/i386/mm/fault.c.orig     Tue Apr  3 13:58:58 2001
+++ linux/arch/i386/mm/fault.c  Tue Apr  3 13:59:22 2001
@@ -90,6 +90,33 @@
        spin_lock_init(&timerlist_lock);
 }
 
+static void print_pagetable_entries (pgd_t *pgdir, unsigned long address)
+{
+       pgd_t *pgd;
+       pmd_t *pmd;
+       pte_t *pte;
+
+       pgd = pgdir + __pgd_offset(address);
+       printk("pgd entry %p: %016Lx\n", pgd, (long long)pgd_val(*pgd));
+
+       if (!pgd_present(*pgd)) {
+               printk("... pgd not present!\n");
+               return;
+       }
+       pmd = pmd_offset(pgd, address);
+       printk("pmd entry %p: %016Lx\n", pmd, (long long)pmd_val(*pmd));
+
+       if (!pmd_present(*pmd)) {
+               printk("... pmd not present!\n");
+               return;
+       }
+       pte = pte_offset(pmd, address);
+       printk("pte entry %p: %016Lx\n", pte, (long long)pte_val(*pte));
+
+       if (!pte_present(*pte))
+               printk("... pte not present!\n");
+}
+
 asmlinkage void do_invalid_op(struct pt_regs *, unsigned long);
 extern unsigned long idt;
 
@@ -274,14 +301,7 @@
        printk(" printing eip:\n");
        printk("%08lx\n", regs->eip);
        asm("movl %%cr3,%0":"=r" (page));
-       page = ((unsigned long *) __va(page))[address >> 22];
-       printk(KERN_ALERT "*pde = %08lx\n", page);
-       if (page & 1) {
-               page &= PAGE_MASK;
-               address &= 0x003ff000;
-               page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT];
-               printk(KERN_ALERT "*pte = %08lx\n", page);
-       }
+       print_pagetable_entries((pgd_t *)__va(page), address);
        die("Oops", regs, error_code);
        do_exit(SIGKILL);
 

Reply via email to