sh: Fix up recursive fault in oops with unset TTB.
authorPaul Mundt <lethal@linux-sh.org>
Tue, 24 Jul 2012 04:15:54 +0000 (13:15 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Wed, 25 Jul 2012 04:11:13 +0000 (13:11 +0900)
Presently the oops code looks for the pgd either from the mm context or
the cached TTB value. There are presently cases where the TTB can be
unset or otherwise cleared by hardware, which we weren't handling,
resulting in recursive faults on the NULL pgd. In these cases we can
simply reload from swapper_pg_dir and continue on as normal.

Cc: stable@vger.kernel.org
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/mm/fault.c

index 1fc25d85e5154803a50b2858af40798f22b1e7c1..3bdc1ad9a341f4418a1724dfcd8cd3ac4388a011 100644 (file)
@@ -58,11 +58,15 @@ static void show_pte(struct mm_struct *mm, unsigned long addr)
 {
        pgd_t *pgd;
 
-       if (mm)
+       if (mm) {
                pgd = mm->pgd;
-       else
+       } else {
                pgd = get_TTB();
 
+               if (unlikely(!pgd))
+                       pgd = swapper_pg_dir;
+       }
+
        printk(KERN_ALERT "pgd = %p\n", pgd);
        pgd += pgd_index(addr);
        printk(KERN_ALERT "[%08lx] *pgd=%0*Lx", addr,