Ensure normal exception handler are able to manage stuff with
MMU enabled. For that we use CONFIG_VMAP_STACK related code
allthough there is no intention to really activate CONFIG_VMAP_STACK
on powerpc 40x for the moment.

40x uses SPRN_DEAR instead of SPRN_DAR and SPRN_ESR instead of
SPRN_DSISR. Take it into account in common macros.

Signed-off-by: Christophe Leroy <christophe.le...@csgroup.eu>
---
 arch/powerpc/kernel/entry_32.S |  2 +-
 arch/powerpc/kernel/head_32.h  | 15 ++++++++++++++-
 arch/powerpc/kernel/head_40x.S | 17 ++++++-----------
 3 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
index 715a8b1aafc6..859a13d34bdc 100644
--- a/arch/powerpc/kernel/entry_32.S
+++ b/arch/powerpc/kernel/entry_32.S
@@ -162,7 +162,7 @@ transfer_to_handler:
        li      r12,-1                  /* clear all pending debug events */
        mtspr   SPRN_DBSR,r12
        lis     r11,global_dbcr0@ha
-       tophys(r11,r11)
+       tophys_novmstack r11,r11
        addi    r11,r11,global_dbcr0@l
 #ifdef CONFIG_SMP
        lwz     r9,TASK_CPU(r2)
diff --git a/arch/powerpc/kernel/head_32.h b/arch/powerpc/kernel/head_32.h
index a2f72c966baf..1f5e64c70ddb 100644
--- a/arch/powerpc/kernel/head_32.h
+++ b/arch/powerpc/kernel/head_32.h
@@ -22,9 +22,17 @@
 #ifdef CONFIG_VMAP_STACK
        mfspr   r10, SPRN_SPRG_THREAD
        .if     \handle_dar_dsisr
+#ifdef CONFIG_40x
+       mfspr   r11, SPRN_DEAR
+#else
        mfspr   r11, SPRN_DAR
+#endif
        stw     r11, DAR(r10)
+#ifdef CONFIG_40x
+       mfspr   r11, SPRN_ESR
+#else
        mfspr   r11, SPRN_DSISR
+#endif
        stw     r11, DSISR(r10)
        .endif
        mfspr   r11, SPRN_SRR0
@@ -190,7 +198,7 @@
        li      r12,-1                  /* clear all pending debug events */
        mtspr   SPRN_DBSR,r12
        lis     r11,global_dbcr0@ha
-       tophys(r11,r11)
+       tophys_novmstack(r11,r11)
        addi    r11,r11,global_dbcr0@l
        lwz     r12,0(r11)
        mtspr   SPRN_DBCR0,r12
@@ -228,8 +236,13 @@
 
 .macro save_dar_dsisr_on_stack reg1, reg2, sp
 #ifndef CONFIG_VMAP_STACK
+#ifdef CONFIG_40x
+       mfspr   \reg1, SPRN_DEAR
+       mfspr   \reg2, SPRN_ESR
+#else
        mfspr   \reg1, SPRN_DAR
        mfspr   \reg2, SPRN_DSISR
+#endif
        stw     \reg1, _DAR(\sp)
        stw     \reg2, _DSISR(\sp)
 #endif
diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S
index c0582ad84117..ef0bdc20849f 100644
--- a/arch/powerpc/kernel/head_40x.S
+++ b/arch/powerpc/kernel/head_40x.S
@@ -223,11 +223,8 @@ _ENTRY(saved_ksp_limit)
  * if they can't resolve the lightweight TLB fault.
  */
        START_EXCEPTION(0x0300, DataStorage)
-       EXCEPTION_PROLOG
-       mfspr   r5, SPRN_ESR            /* Grab the ESR, save it */
-       stw     r5, _ESR(r11)
-       mfspr   r4, SPRN_DEAR           /* Grab the DEAR, save it */
-       stw     r4, _DEAR(r11)
+       EXCEPTION_PROLOG handle_dar_dsisr=1
+       save_dar_dsisr_on_stack r4, r5, r11
        EXC_XFER_LITE(0x300, handle_page_fault)
 
 /*
@@ -246,17 +243,15 @@ _ENTRY(saved_ksp_limit)
 
 /* 0x0600 - Alignment Exception */
        START_EXCEPTION(0x0600, Alignment)
-       EXCEPTION_PROLOG
-       mfspr   r4,SPRN_DEAR            /* Grab the DEAR and save it */
-       stw     r4,_DEAR(r11)
+       EXCEPTION_PROLOG handle_dar_dsisr=1
+       save_dar_dsisr_on_stack r4, r5, r11
        addi    r3,r1,STACK_FRAME_OVERHEAD
        EXC_XFER_STD(0x600, alignment_exception)
 
 /* 0x0700 - Program Exception */
        START_EXCEPTION(0x0700, ProgramCheck)
-       EXCEPTION_PROLOG
-       mfspr   r4,SPRN_ESR             /* Grab the ESR and save it */
-       stw     r4,_ESR(r11)
+       EXCEPTION_PROLOG handle_dar_dsisr=1
+       save_dar_dsisr_on_stack r4, r5, r11
        addi    r3,r1,STACK_FRAME_OVERHEAD
        EXC_XFER_STD(0x700, program_check_exception)
 
-- 
2.25.0

Reply via email to