This patch enables CONFIG_VMAP_STACK. For that, a few changes are
done in head_8xx.S.

Signed-off-by: Christophe Leroy <christophe.le...@c-s.fr>
---
 arch/powerpc/Kconfig           |  1 +
 arch/powerpc/kernel/head_8xx.S | 47 +++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 6137f5e3bb2d..ddbec19c3c22 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -178,6 +178,7 @@ config PPC
        select HAVE_ARCH_NVRAM_OPS
        select HAVE_ARCH_SECCOMP_FILTER
        select HAVE_ARCH_TRACEHOOK
+       select HAVE_ARCH_VMAP_STACK             if PPC_8xx
        select HAVE_C_RECORDMCOUNT
        select HAVE_CBPF_JIT                    if !PPC64
        select HAVE_STACKPROTECTOR              if PPC64 && 
$(cc-option,-mstack-protector-guard=tls -mstack-protector-guard-reg=r13)
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S
index 2fa02ae7a88c..dfd68b72688e 100644
--- a/arch/powerpc/kernel/head_8xx.S
+++ b/arch/powerpc/kernel/head_8xx.S
@@ -127,8 +127,12 @@ instruction_counter:
        . = 0x200
 MachineCheck:
        EXCEPTION_PROLOG
+#ifdef CONFIG_VMAP_STACK
+       lwz r4, _DAR(r11)
+#else
        mfspr r4,SPRN_DAR
        stw r4,_DAR(r11)
+#endif
        li r5,RPN_PATTERN
        mtspr SPRN_DAR,r5       /* Tag DAR, to be used in DTLB Error */
        mfspr r5,SPRN_DSISR
@@ -143,8 +147,12 @@ MachineCheck:
        . = 0x600
 Alignment:
        EXCEPTION_PROLOG
+#ifdef CONFIG_VMAP_STACK
+       lwz r4, _DAR(r11)
+#else
        mfspr   r4,SPRN_DAR
        stw     r4,_DAR(r11)
+#endif
        li      r5,RPN_PATTERN
        mtspr   SPRN_DAR,r5     /* Tag DAR, to be used in DTLB Error */
        mfspr   r5,SPRN_DSISR
@@ -467,17 +475,28 @@ DataTLBError:
        cmpwi   cr0, r11, RPN_PATTERN
        beq-    FixupDAR        /* must be a buggy dcbX, icbi insn. */
 DARFixed:/* Return from dcbx instruction bug workaround */
+#ifdef CONFIG_VMAP_STACK
+       li      r11, RPN_PATTERN
+       mtspr   SPRN_DAR, r11   /* Tag DAR, to be used in DTLB Error */
+       mfspr   r11, SPRN_SRR1
+#endif
        EXCEPTION_PROLOG_1
        EXCEPTION_PROLOG_2
        mfspr   r5,SPRN_DSISR
        stw     r5,_DSISR(r11)
+#ifdef CONFIG_VMAP_STACK
+       lwz r4, _DAR(r11)
+#else
        mfspr   r4,SPRN_DAR
+#endif
        andis.  r10,r5,DSISR_NOHPTE@h
        beq+    .Ldtlbie
        tlbie   r4
 .Ldtlbie:
+#ifndef CONFIG_VMAP_STACK
        li      r10,RPN_PATTERN
        mtspr   SPRN_DAR,r10    /* Tag DAR, to be used in DTLB Error */
+#endif
        /* 0x300 is DataAccess exception, needed by bad_page_fault() */
        EXC_XFER_LITE(0x300, handle_page_fault)
 
@@ -498,6 +517,9 @@ DARFixed:/* Return from dcbx instruction bug workaround */
  * using them.
  */
 do_databreakpoint:
+#ifdef CONFIG_VMAP_STACK
+       mfspr   r11, SPRN_SRR1
+#endif
        EXCEPTION_PROLOG_1
        EXCEPTION_PROLOG_2
        addi    r3,r1,STACK_FRAME_OVERHEAD
@@ -508,8 +530,21 @@ do_databreakpoint:
 
        . = 0x1c00
 DataBreakpoint:
-       EXCEPTION_PROLOG_0
+       mtspr   SPRN_SPRG_SCRATCH0, r10
+       mtspr   SPRN_SPRG_SCRATCH1, r11
+#ifdef CONFIG_VMAP_STACK
+       mfspr   r10, SPRN_SPRG_THREAD
+       mfspr   r11, SPRN_DAR
+       stw     r11, DAR(r10)
+       mfspr   r11, SPRN_SRR1
+       stw     r11, SRR1(r10)
+#endif
        mfspr   r11, SPRN_SRR0
+#ifdef CONFIG_VMAP_STACK
+       stw     r11, SRR0(r10)
+#endif
+       mfcr    r10
+
        cmplwi  cr0, r11, (.Ldtlbie - PAGE_OFFSET)@l
        cmplwi  cr7, r11, (.Litlbie - PAGE_OFFSET)@l
        cror    4*cr0+eq, 4*cr0+eq, 4*cr7+eq
@@ -625,7 +660,12 @@ modified_instr:
        .space  4               /* this is where the add instr. is stored */
        bne+    143f
        subf    r10,r0,r10      /* r10=r10-r0, only if reg RA is r0 */
+#ifdef CONFIG_VMAP_STACK
+143:   mfspr   r11, SPRN_SPRG_THREAD
+       stw     r10, DAR(r11)
+#else
 143:   mtdar   r10             /* store faulting EA in DAR */
+#endif
        mfspr   r10,SPRN_M_TW
        b       DARFixed        /* Go back to normal TLB handling */
 #else
@@ -679,7 +719,12 @@ modified_instr:
 152:
        mfdar   r11
        mtctr   r11                     /* restore ctr reg from DAR */
+#ifdef CONFIG_VMAP_STACK
+       mfspr   r11, SPRN_SPRG_THREAD
+       stw     r10, DAR(r11)
+#else
        mtdar   r10                     /* save fault EA to DAR */
+#endif
        mfspr   r10,SPRN_M_TW
        b       DARFixed                /* Go back to normal TLB handling */
 
-- 
2.13.3

Reply via email to