[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