arm: add support for folded p4d page tables
[linux-2.6-microblaze.git] / arch / arm / mm / fault.c
index 2dd5c41..ff230e9 100644 (file)
@@ -43,19 +43,21 @@ void show_pte(const char *lvl, struct mm_struct *mm, unsigned long addr)
        printk("%s[%08lx] *pgd=%08llx", lvl, addr, (long long)pgd_val(*pgd));
 
        do {
+               p4d_t *p4d;
                pud_t *pud;
                pmd_t *pmd;
                pte_t *pte;
 
-               if (pgd_none(*pgd))
+               p4d = p4d_offset(pgd, addr);
+               if (p4d_none(*p4d))
                        break;
 
-               if (pgd_bad(*pgd)) {
+               if (p4d_bad(*p4d)) {
                        pr_cont("(bad)");
                        break;
                }
 
-               pud = pud_offset(pgd, addr);
+               pud = pud_offset(p4d, addr);
                if (PTRS_PER_PUD != 1)
                        pr_cont(", *pud=%08llx", (long long)pud_val(*pud));
 
@@ -405,6 +407,7 @@ do_translation_fault(unsigned long addr, unsigned int fsr,
 {
        unsigned int index;
        pgd_t *pgd, *pgd_k;
+       p4d_t *p4d, *p4d_k;
        pud_t *pud, *pud_k;
        pmd_t *pmd, *pmd_k;
 
@@ -419,13 +422,16 @@ do_translation_fault(unsigned long addr, unsigned int fsr,
        pgd = cpu_get_pgd() + index;
        pgd_k = init_mm.pgd + index;
 
-       if (pgd_none(*pgd_k))
+       p4d = p4d_offset(pgd, addr);
+       p4d_k = p4d_offset(pgd_k, addr);
+
+       if (p4d_none(*p4d_k))
                goto bad_area;
-       if (!pgd_present(*pgd))
-               set_pgd(pgd, *pgd_k);
+       if (!p4d_present(*p4d))
+               set_p4d(p4d, *p4d_k);
 
-       pud = pud_offset(pgd, addr);
-       pud_k = pud_offset(pgd_k, addr);
+       pud = pud_offset(p4d, addr);
+       pud_k = pud_offset(p4d_k, addr);
 
        if (pud_none(*pud_k))
                goto bad_area;