Use SPRN_SPRG_SCRATCH2 as an alternative scratch register in
the early part of DSI prolog in order to avoid clobbering
SPRN_SPRG_SCRATCH0/1 used by other prologs.

The 603 doesn't like a jump from DataLoadTLBMiss to the 10 nops
that are now in the beginning of DSI exception as a result of
the feature section. To workaround this, add a jump as alternative.
It also avoids fetching 10 nops for nothing.

Signed-off-by: Christophe Leroy <christophe.le...@csgroup.eu>
---
 arch/powerpc/include/asm/reg.h       |  1 +
 arch/powerpc/kernel/head_book3s_32.S | 24 ++++++++----------------
 2 files changed, 9 insertions(+), 16 deletions(-)

diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index a37ce826f6f6..acd334ee3936 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -1203,6 +1203,7 @@
 #ifdef CONFIG_PPC_BOOK3S_32
 #define SPRN_SPRG_SCRATCH0     SPRN_SPRG0
 #define SPRN_SPRG_SCRATCH1     SPRN_SPRG1
+#define SPRN_SPRG_SCRATCH2     SPRN_SPRG2
 #define SPRN_SPRG_603_LRU      SPRN_SPRG4
 #endif
 
diff --git a/arch/powerpc/kernel/head_book3s_32.S 
b/arch/powerpc/kernel/head_book3s_32.S
index 51eef7b82f9c..22d670263222 100644
--- a/arch/powerpc/kernel/head_book3s_32.S
+++ b/arch/powerpc/kernel/head_book3s_32.S
@@ -288,9 +288,9 @@ MachineCheck:
        DO_KVM  0x300
 DataAccess:
 #ifdef CONFIG_VMAP_STACK
-       mtspr   SPRN_SPRG_SCRATCH0,r10
-       mfspr   r10, SPRN_SPRG_THREAD
 BEGIN_MMU_FTR_SECTION
+       mtspr   SPRN_SPRG_SCRATCH2,r10
+       mfspr   r10, SPRN_SPRG_THREAD
        stw     r11, THR11(r10)
        mfspr   r10, SPRN_DSISR
        mfcr    r11
@@ -304,19 +304,11 @@ BEGIN_MMU_FTR_SECTION
 .Lhash_page_dsi_cont:
        mtcr    r11
        lwz     r11, THR11(r10)
-END_MMU_FTR_SECTION_IFSET(MMU_FTR_HPTE_TABLE)
-       mtspr   SPRN_SPRG_SCRATCH1,r11
-       mfspr   r11, SPRN_DAR
-       stw     r11, DAR(r10)
-       mfspr   r11, SPRN_DSISR
-       stw     r11, DSISR(r10)
-       mfspr   r11, SPRN_SRR0
-       stw     r11, SRR0(r10)
-       mfspr   r11, SPRN_SRR1          /* check whether user or kernel */
-       stw     r11, SRR1(r10)
-       mfcr    r10
-       andi.   r11, r11, MSR_PR
-
+       mfspr   r10, SPRN_SPRG_SCRATCH2
+MMU_FTR_SECTION_ELSE
+       b       1f
+ALT_MMU_FTR_SECTION_END_IFSET(MMU_FTR_HPTE_TABLE)
+1:     EXCEPTION_PROLOG_0 handle_dar_dsisr=1
        EXCEPTION_PROLOG_1
        b       handle_page_fault_tramp_1
 #else  /* CONFIG_VMAP_STACK */
@@ -760,7 +752,7 @@ fast_hash_page_return:
        /* DSI */
        mtcr    r11
        lwz     r11, THR11(r10)
-       mfspr   r10, SPRN_SPRG_SCRATCH0
+       mfspr   r10, SPRN_SPRG_SCRATCH2
        RFI
 
 1:     /* ISI */
-- 
2.25.0

Reply via email to