aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2012-07-24 13:15:54 +0900
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-08-15 07:52:46 -0700
commitdaa0139a3430417f55160daf93af4537cdc0e126 (patch)
treef288e581585174baeec4dad88fece66b729ce65f
parentbd60cd238b0b3056cc610fad8f52fa5f0e6bdb38 (diff)
sh: Fix up recursive fault in oops with unset TTB.
commit 90eed7d87b748f9c0d11b9bad64a4c41e31b78c4 upstream. 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. Signed-off-by: Paul Mundt <lethal@linux-sh.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--arch/sh/mm/fault.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/arch/sh/mm/fault.c b/arch/sh/mm/fault.c
index 1fc25d85e51..3bdc1ad9a34 100644
--- a/arch/sh/mm/fault.c
+++ b/arch/sh/mm/fault.c
@@ -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,