aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/mm/fault.c21
1 files changed, 5 insertions, 16 deletions
diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c
index 6fd30ac7d14a..62a50d6d1053 100644
--- a/arch/powerpc/mm/fault.c
+++ b/arch/powerpc/mm/fault.c
@@ -253,8 +253,11 @@ int do_page_fault(struct pt_regs *regs, unsigned long address,
253 if (unlikely(debugger_fault_handler(regs))) 253 if (unlikely(debugger_fault_handler(regs)))
254 goto bail; 254 goto bail;
255 255
256 /* On a kernel SLB miss we can only check for a valid exception entry */ 256 /*
257 if (!user_mode(regs) && (address >= TASK_SIZE)) { 257 * The kernel should never take an execute fault nor should it
258 * take a page fault to a kernel address.
259 */
260 if (!user_mode(regs) && (is_exec || (address >= TASK_SIZE))) {
258 rc = SIGSEGV; 261 rc = SIGSEGV;
259 goto bail; 262 goto bail;
260 } 263 }
@@ -391,20 +394,6 @@ good_area:
391 394
392 if (is_exec) { 395 if (is_exec) {
393 /* 396 /*
394 * An execution fault + no execute ?
395 *
396 * On CPUs that don't have CPU_FTR_COHERENT_ICACHE we
397 * deliberately create NX mappings, and use the fault to do the
398 * cache flush. This is usually handled in hash_page_do_lazy_icache()
399 * but we could end up here if that races with a concurrent PTE
400 * update. In that case we need to fall through here to the VMA
401 * check below.
402 */
403 if (cpu_has_feature(CPU_FTR_COHERENT_ICACHE) &&
404 (regs->msr & SRR1_ISI_N_OR_G))
405 goto bad_area;
406
407 /*
408 * Allow execution from readable areas if the MMU does not 397 * Allow execution from readable areas if the MMU does not
409 * provide separate controls over reading and executing. 398 * provide separate controls over reading and executing.
410 * 399 *