powerpc/mm: Move error_code checks for bad faults earlier

There's no point looking for the VMA etc.. when we already know
we are going to fail.

This adds some code to set "code" for the si_code but that will
be gone in subsequent patches.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
Benjamin Herrenschmidt 2017-07-19 14:49:30 +10:00 committed by Michael Ellerman
parent 41b464e5e5
commit e6c8290a89
1 changed files with 20 additions and 15 deletions

View File

@ -237,6 +237,26 @@ static int __do_page_fault(struct pt_regs *regs, unsigned long address,
if (unlikely(debugger_fault_handler(regs))) if (unlikely(debugger_fault_handler(regs)))
goto bail; goto bail;
#if defined(CONFIG_6xx)
if (error_code & 0x95700000) {
/* an error such as lwarx to I/O controller space,
address matching DABR, eciwx, etc. */
code = SEGV_ACCERR;
goto bad_area_nosemaphore;
}
#endif /* CONFIG_6xx */
#if defined(CONFIG_8xx)
/* The MPC8xx seems to always set 0x80000000, which is
* "undefined". Of those that can be set, this is the only
* one which seems bad.
*/
if (error_code & 0x10000000) {
/* Guarded storage error. */
code = SEGV_ACCERR;
goto bad_area_nosemaphore;
}
#endif /* CONFIG_8xx */
/* /*
* The kernel should never take an execute fault nor should it * The kernel should never take an execute fault nor should it
* take a page fault to a kernel address. * take a page fault to a kernel address.
@ -351,21 +371,6 @@ static int __do_page_fault(struct pt_regs *regs, unsigned long address,
good_area: good_area:
code = SEGV_ACCERR; code = SEGV_ACCERR;
#if defined(CONFIG_6xx)
if (error_code & 0x95700000)
/* an error such as lwarx to I/O controller space,
address matching DABR, eciwx, etc. */
goto bad_area;
#endif /* CONFIG_6xx */
#if defined(CONFIG_8xx)
/* The MPC8xx seems to always set 0x80000000, which is
* "undefined". Of those that can be set, this is the only
* one which seems bad.
*/
if (error_code & 0x10000000)
/* Guarded storage error. */
goto bad_area;
#endif /* CONFIG_8xx */
if (is_exec) { if (is_exec) {
/* /*