sh: Fix up recursive fault in oops with unset TTB.
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>
This commit is contained in:
Родитель
92f53a85db
Коммит
90eed7d87b
|
@ -58,11 +58,15 @@ static void show_pte(struct mm_struct *mm, unsigned long addr)
|
||||||
{
|
{
|
||||||
pgd_t *pgd;
|
pgd_t *pgd;
|
||||||
|
|
||||||
if (mm)
|
if (mm) {
|
||||||
pgd = mm->pgd;
|
pgd = mm->pgd;
|
||||||
else
|
} else {
|
||||||
pgd = get_TTB();
|
pgd = get_TTB();
|
||||||
|
|
||||||
|
if (unlikely(!pgd))
|
||||||
|
pgd = swapper_pg_dir;
|
||||||
|
}
|
||||||
|
|
||||||
printk(KERN_ALERT "pgd = %p\n", pgd);
|
printk(KERN_ALERT "pgd = %p\n", pgd);
|
||||||
pgd += pgd_index(addr);
|
pgd += pgd_index(addr);
|
||||||
printk(KERN_ALERT "[%08lx] *pgd=%0*Lx", addr,
|
printk(KERN_ALERT "[%08lx] *pgd=%0*Lx", addr,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче