]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/arm/mm/fault.c
Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block
[karo-tx-linux.git] / arch / arm / mm / fault.c
index f10f9bac220695d02037731e6715ad510bbfb33d..bc0e1d88fd3ba8b7863edfc9eca9cb11d90413dd 100644 (file)
@@ -76,9 +76,11 @@ void show_pte(struct mm_struct *mm, unsigned long addr)
 
        printk(KERN_ALERT "pgd = %p\n", mm->pgd);
        pgd = pgd_offset(mm, addr);
-       printk(KERN_ALERT "[%08lx] *pgd=%08lx", addr, pgd_val(*pgd));
+       printk(KERN_ALERT "[%08lx] *pgd=%08llx",
+                       addr, (long long)pgd_val(*pgd));
 
        do {
+               pud_t *pud;
                pmd_t *pmd;
                pte_t *pte;
 
@@ -90,9 +92,21 @@ void show_pte(struct mm_struct *mm, unsigned long addr)
                        break;
                }
 
-               pmd = pmd_offset(pgd, addr);
+               pud = pud_offset(pgd, addr);
+               if (PTRS_PER_PUD != 1)
+                       printk(", *pud=%08lx", pud_val(*pud));
+
+               if (pud_none(*pud))
+                       break;
+
+               if (pud_bad(*pud)) {
+                       printk("(bad)");
+                       break;
+               }
+
+               pmd = pmd_offset(pud, addr);
                if (PTRS_PER_PMD != 1)
-                       printk(", *pmd=%08lx", pmd_val(*pmd));
+                       printk(", *pmd=%08llx", (long long)pmd_val(*pmd));
 
                if (pmd_none(*pmd))
                        break;
@@ -107,8 +121,9 @@ void show_pte(struct mm_struct *mm, unsigned long addr)
                        break;
 
                pte = pte_offset_map(pmd, addr);
-               printk(", *pte=%08lx", pte_val(*pte));
-               printk(", *ppte=%08lx", pte_val(pte[PTE_HWTABLE_PTRS]));
+               printk(", *pte=%08llx", (long long)pte_val(*pte));
+               printk(", *ppte=%08llx",
+                      (long long)pte_val(pte[PTE_HWTABLE_PTRS]));
                pte_unmap(pte);
        } while(0);
 
@@ -388,6 +403,7 @@ do_translation_fault(unsigned long addr, unsigned int fsr,
 {
        unsigned int index;
        pgd_t *pgd, *pgd_k;
+       pud_t *pud, *pud_k;
        pmd_t *pmd, *pmd_k;
 
        if (addr < TASK_SIZE)
@@ -406,12 +422,19 @@ do_translation_fault(unsigned long addr, unsigned int fsr,
 
        if (pgd_none(*pgd_k))
                goto bad_area;
-
        if (!pgd_present(*pgd))
                set_pgd(pgd, *pgd_k);
 
-       pmd_k = pmd_offset(pgd_k, addr);
-       pmd   = pmd_offset(pgd, addr);
+       pud = pud_offset(pgd, addr);
+       pud_k = pud_offset(pgd_k, addr);
+
+       if (pud_none(*pud_k))
+               goto bad_area;
+       if (!pud_present(*pud))
+               set_pud(pud, *pud_k);
+
+       pmd = pmd_offset(pud, addr);
+       pmd_k = pmd_offset(pud_k, addr);
 
        /*
         * On ARM one Linux PGD entry contains two hardware entries (see page