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 <[EMAIL PROTECTED]>
> Cc: Scott Wood <[EMAIL PROTECTED]>
> Cc: Johannes Berg <[EMAIL PROTECTED]>
> ---
> 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 <[EMAIL PROTECTED]>

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 */

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to