MIPS: Don't corrupt page tables on vmalloc fault.
The code after the vmalloc_fault: label in do_page_fault() modifies user page tables, this is not correct for 64-bit kernels. For 64-bit kernels we should go straight to the no_context handler skipping vmalloc_fault. Signed-off-by: David Daney <ddaney@caviumnetworks.com> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
e0cc87f594
commit
2ca2ebfd95
|
@ -58,11 +58,17 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,
|
||||||
* only copy the information from the master page table,
|
* only copy the information from the master page table,
|
||||||
* nothing more.
|
* nothing more.
|
||||||
*/
|
*/
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
|
# define VMALLOC_FAULT_TARGET no_context
|
||||||
|
#else
|
||||||
|
# define VMALLOC_FAULT_TARGET vmalloc_fault
|
||||||
|
#endif
|
||||||
|
|
||||||
if (unlikely(address >= VMALLOC_START && address <= VMALLOC_END))
|
if (unlikely(address >= VMALLOC_START && address <= VMALLOC_END))
|
||||||
goto vmalloc_fault;
|
goto VMALLOC_FAULT_TARGET;
|
||||||
#ifdef MODULE_START
|
#ifdef MODULE_START
|
||||||
if (unlikely(address >= MODULE_START && address < MODULE_END))
|
if (unlikely(address >= MODULE_START && address < MODULE_END))
|
||||||
goto vmalloc_fault;
|
goto VMALLOC_FAULT_TARGET;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -203,6 +209,7 @@ do_sigbus:
|
||||||
force_sig_info(SIGBUS, &info, tsk);
|
force_sig_info(SIGBUS, &info, tsk);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
#ifndef CONFIG_64BIT
|
||||||
vmalloc_fault:
|
vmalloc_fault:
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -241,4 +248,5 @@ vmalloc_fault:
|
||||||
goto no_context;
|
goto no_context;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue