[PATCH] Treat ISI faults as read faults on classic 32-bit PowerPC

Johannes Berg johannes at sipsolutions.net
Thu Jul 12 19:47:52 EST 2007


On Wed, 2007-07-11 at 20:18 +0200, Segher Boessenkool wrote:
> Some old software on ppc32 executes from pages it hasn't marked
> executable.  Since "classic" hardware doesn't distinguish between
> execute and read accesses, the do_page_fault() code shouldn't
> either.  This makes glibc-2.2 work again on such hardware.
> 
> Signed-off-by: Segher Boessenkool <segher at kernel.crashing.org>
> Cc: Scott Wood <scottwood at freescale.com>
> Cc: Johannes Berg <johannes at sipsolutions.net>
> ---
> Tested by Scott on 32-bit, glibc-2.2.5 and glibc-2.3.3 (no new
> failures and problem solved), needs confirmation from Johannes
> on his glibc-2.4 "---p" testcase.  Could use testing on ppc64
> and BookE too, for good measure.

Acked-by: Johannes Berg <johannes at sipsolutions.net>

I tested this patch and it does fix the problem I was seeing.

> This reverts the previous change and makes the bugfix behave
> more like the arch/ppc code.
>  arch/powerpc/mm/fault.c |   14 ++++++++++----
>  1 files changed, 10 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c
> index 115b25f..5d7add0 100644
> --- a/arch/powerpc/mm/fault.c
> +++ b/arch/powerpc/mm/fault.c
> @@ -278,14 +278,17 @@ good_area:
>  		goto bad_area;
>  #endif /* CONFIG_8xx */
>  
> +#ifdef CONFIG_PPC64
>  	if (is_exec) {
> -#if !(defined(CONFIG_4xx) || defined(CONFIG_BOOKE))
>  		/* protection fault */
>  		if (error_code & DSISR_PROTFAULT)
>  			goto bad_area;
>  		if (!(vma->vm_flags & VM_EXEC))
>  			goto bad_area;
> -#else
> +	} else
> +		/* A read or write, code continues below...  */
> +#elsif defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
> +	if (is_exec) {
>  		pte_t *ptep;
>  		pmd_t *pmdp;
>  
> @@ -310,9 +313,12 @@ good_area:
>  			}
>  			pte_unmap_unlock(ptep, ptl);
>  		}
> +	} else
> +		/* A read or write, code continues below...  */
>  #endif
> -	/* a write */
> -	} else if (is_write) {
> +
> +	/* A read or write.  Classic PPC32 execute is considered a read.  */
> +	if (is_write) {
>  		if (!(vma->vm_flags & VM_WRITE))
>  			goto bad_area;
>  	/* a read */
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 190 bytes
Desc: This is a digitally signed message part
URL: <http://lists.ozlabs.org/pipermail/linuxppc-dev/attachments/20070712/6e969903/attachment.pgp>


More information about the Linuxppc-dev mailing list