summaryrefslogtreecommitdiff
path: root/arch/powerpc/mm
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2017-07-19 14:49:30 +1000
committerMichael Ellerman <mpe@ellerman.id.au>2017-08-03 16:06:44 +1000
commite6c8290a894bcaf0d8f06c504a04da3412a3cf55 (patch)
tree9f936b8755b0195baa2d064e97cc7cb0668e1e2e /arch/powerpc/mm
parent41b464e5e5675476a5fd923aea8d5a87d2493d93 (diff)
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>
Diffstat (limited to 'arch/powerpc/mm')
-rw-r--r--arch/powerpc/mm/fault.c35
1 files changed, 20 insertions, 15 deletions
diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c
index 26ec0dd4f419..e2f3144a48b9 100644
--- a/arch/powerpc/mm/fault.c
+++ b/arch/powerpc/mm/fault.c
@@ -237,6 +237,26 @@ static int __do_page_fault(struct pt_regs *regs, unsigned long address,
if (unlikely(debugger_fault_handler(regs)))
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
* take a page fault to a kernel address.
@@ -351,21 +371,6 @@ retry:
good_area:
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) {
/*