Commit:     08ae6cc15db201fa20cc4893d9500c1f6b20e560
Parent:     ca8ffc974d43033be6e1d4277a45822d2c3656f4
Author:     Paul Mackerras <[EMAIL PROTECTED]>
AuthorDate: Thu Jul 19 10:00:20 2007 +1000
Committer:  Paul Mackerras <[EMAIL PROTECTED]>
CommitDate: Sun Jul 22 21:30:58 2007 +1000

    [POWERPC] Allow exec faults on readable areas on classic 32-bit PowerPC
    Classic 32-bit PowerPC CPUs, and the early 64-bit PowerPC CPUs, don't
    provide a way to prevent execution from readable pages, that is, the
    MMU doesn't distinguish between data reads and instruction reads,
    although a different exception is taken for faults in data accesses
    and instruction accesses.
    Commit 9ba4ace39fdfe22268daca9f28c5df384ae462cf, in the course of
    fixing another bug, added a check that meant that a page fault due
    to an instruction access would fail if the vma did not have the
    VM_EXEC flag set.  This gives an inconsistent enforcement on these
    CPUs of the no-execute status of the vma (since reading from the page
    is sufficient to allow subsequent execution from it), and causes old
    versions of ppc32 glibc (2.2 and earlier) to fail, since they rely
    on executing the word before the GOT but don't have it marked
    This fixes the problem by allowing execution from readable (or writable)
    areas on CPUs which do not provide separate control over data and
    instruction reads.
    Signed-off-by: Paul Mackerras <[EMAIL PROTECTED]>
    Acked-by: Jon Loeliger <[EMAIL PROTECTED]>
 arch/powerpc/mm/fault.c |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c
index 3767211..ab3546c 100644
--- a/arch/powerpc/mm/fault.c
+++ b/arch/powerpc/mm/fault.c
@@ -283,7 +283,13 @@ good_area:
                /* protection fault */
                if (error_code & DSISR_PROTFAULT)
                        goto bad_area;
-               if (!(vma->vm_flags & VM_EXEC))
+               /*
+                * Allow execution from readable areas if the MMU does not
+                * provide separate controls over reading and executing.
+                */
+               if (!(vma->vm_flags & VM_EXEC) &&
+                   (cpu_has_feature(CPU_FTR_NOEXECUTE) ||
+                    !(vma->vm_flags & (VM_READ | VM_WRITE))))
                        goto bad_area;
                pte_t *ptep;
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to