From: Li Yang <le...@freescale.com>

In CONFIG_PTE_64BIT the PTE format has unique permission bits for user
and supervisor execute.  However on !CONFIG_PTE_64BIT we overload the
supervisor bit to imply user execute with _PAGE_USER set.  This allows
us to use the same permission check mask for user or supervisor code on
!CONFIG_PTE_64BIT.

However, on CONFIG_PTE_64BIT we map _PAGE_EXEC to _PAGE_BAP_UX so we
need a different permission mask based on the fault coming from a kernel
address or user space.

Without unique permission masks we see issues like the following with
modules:

Unable to handle kernel paging request for instruction fetch
Faulting instruction address: 0xf938d040
Oops: Kernel access of bad area, sig: 11 [#1]

Signed-off-by: Li Yang <le...@freescale.com>
Signed-off-by: Jin Qing <b24...@freescale.com>
Signed-off-by: Kumar Gala <ga...@kernel.crashing.org>
---
For 2.6.34 stable commit 78e2e68a2b79f394b7cd61e07987a8a89af907f7

 arch/powerpc/kernel/head_fsl_booke.S |   13 ++++++++++---
 1 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/kernel/head_fsl_booke.S 
b/arch/powerpc/kernel/head_fsl_booke.S
index 7255265..edd4a57 100644
--- a/arch/powerpc/kernel/head_fsl_booke.S
+++ b/arch/powerpc/kernel/head_fsl_booke.S
@@ -639,6 +639,13 @@ interrupt_base:
        rlwinm  r12,r12,0,16,1
        mtspr   SPRN_MAS1,r12
 
+       /* Make up the required permissions for kernel code */
+#ifdef CONFIG_PTE_64BIT
+       li      r13,_PAGE_PRESENT | _PAGE_BAP_SX
+       oris    r13,r13,_page_acces...@h
+#else
+       li      r13,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC
+#endif
        b       4f
 
        /* Get the PGD for the current thread */
@@ -646,15 +653,15 @@ interrupt_base:
        mfspr   r11,SPRN_SPRG_THREAD
        lwz     r11,PGDIR(r11)
 
-4:
-       /* Make up the required permissions */
+       /* Make up the required permissions for user code */
 #ifdef CONFIG_PTE_64BIT
-       li      r13,_PAGE_PRESENT | _PAGE_EXEC
+       li      r13,_PAGE_PRESENT | _PAGE_BAP_UX
        oris    r13,r13,_page_acces...@h
 #else
        li      r13,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC
 #endif
 
+4:
        FIND_PTE
        andc.   r13,r13,r11             /* Check permission */
 
-- 
1.6.0.6

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

Reply via email to