diff options
Diffstat (limited to 'arch/powerpc/mm/fault.c')
| -rw-r--r-- | arch/powerpc/mm/fault.c | 27 | 
1 files changed, 11 insertions, 16 deletions
| diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c index eb79907f34fa..b396868d2aa7 100644 --- a/arch/powerpc/mm/fault.c +++ b/arch/powerpc/mm/fault.c @@ -389,19 +389,6 @@ good_area:  #endif /* CONFIG_8xx */  	if (is_exec) { -#ifdef CONFIG_PPC_STD_MMU -		/* Protection fault on exec go straight to failure on -		 * Hash based MMUs as they either don't support per-page -		 * execute permission, or if they do, it's handled already -		 * at the hash level. This test would probably have to -		 * be removed if we change the way this works to make hash -		 * processors use the same I/D cache coherency mechanism -		 * as embedded. -		 */ -		if (error_code & DSISR_PROTFAULT) -			goto bad_area; -#endif /* CONFIG_PPC_STD_MMU */ -  		/*  		 * Allow execution from readable areas if the MMU does not  		 * provide separate controls over reading and executing. @@ -416,6 +403,14 @@ good_area:  		    (cpu_has_feature(CPU_FTR_NOEXECUTE) ||  		     !(vma->vm_flags & (VM_READ | VM_WRITE))))  			goto bad_area; +#ifdef CONFIG_PPC_STD_MMU +		/* +		 * protfault should only happen due to us +		 * mapping a region readonly temporarily. PROT_NONE +		 * is also covered by the VMA check above. +		 */ +		WARN_ON_ONCE(error_code & DSISR_PROTFAULT); +#endif /* CONFIG_PPC_STD_MMU */  	/* a write */  	} else if (is_write) {  		if (!(vma->vm_flags & VM_WRITE)) @@ -423,11 +418,9 @@ good_area:  		flags |= FAULT_FLAG_WRITE;  	/* a read */  	} else { -		/* protection fault */ -		if (error_code & 0x08000000) -			goto bad_area;  		if (!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE)))  			goto bad_area; +		WARN_ON_ONCE(error_code & DSISR_PROTFAULT);  	}  	/* @@ -437,6 +430,8 @@ good_area:  	 */  	fault = handle_mm_fault(mm, vma, address, flags);  	if (unlikely(fault & (VM_FAULT_RETRY|VM_FAULT_ERROR))) { +		if (fault & VM_FAULT_SIGSEGV) +			goto bad_area;  		rc = mm_fault_error(regs, address, fault);  		if (rc >= MM_FAULT_RETURN)  			goto bail; |