machine_check_handle_early_common can reach machine_check_handle_early
directly now that it runs at the relocated address, so just branch
directly.

The rfi sequence is required to enable MSR[ME] but that step is moved
into a helper function, making the code easier to follow.

Signed-off-by: Nicholas Piggin <npig...@gmail.com>
---
 arch/powerpc/kernel/exceptions-64s.S | 31 ++++++++++++++++++++--------
 1 file changed, 22 insertions(+), 9 deletions(-)

diff --git a/arch/powerpc/kernel/exceptions-64s.S 
b/arch/powerpc/kernel/exceptions-64s.S
index 9bb8c89e9e77..2a17275296d5 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -1006,16 +1006,13 @@ EXC_COMMON_BEGIN(machine_check_early_common)
        std     r3,_DAR(r1)
        std     r4,_DSISR(r1)
 
-       mfmsr   r11                     /* get MSR value */
 BEGIN_FTR_SECTION
-       ori     r11,r11,MSR_ME          /* turn on ME bit */
+       bl      enable_machine_check
 END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
-       ori     r11,r11,MSR_RI          /* turn on RI bit */
-       LOAD_HANDLER(r12, machine_check_handle_early)
-1:     mtspr   SPRN_SRR0,r12
-       mtspr   SPRN_SRR1,r11
-       RFI_TO_KERNEL
-       b       .       /* prevent speculative execution */
+       li      r10,MSR_RI
+       mtmsrd  r10,1
+       b       machine_check_handle_early
+
 2:
        /* Stack overflow. Stay on emergency stack and panic.
         * Keep the ME bit off while panic-ing, so that if we hit
@@ -1026,7 +1023,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
        LOAD_HANDLER(r12, unrecover_mce)
        li      r10,MSR_ME
        andc    r11,r11,r10             /* Turn off MSR_ME */
-       b       1b
+       mtspr   SPRN_SRR0,r12
+       mtspr   SPRN_SRR1,r11
+       RFI_TO_KERNEL
        b       .       /* prevent speculative execution */
 
 EXC_COMMON_BEGIN(machine_check_common)
@@ -2270,6 +2269,20 @@ CLOSE_FIXED_SECTION(virt_trampolines);
 
 USE_TEXT_SECTION()
 
+/* MSR[RI] should be clear because this uses SRR[01] */
+enable_machine_check:
+       mflr    r0
+       bcl     20,31,$+4
+0:     mflr    r3
+       addi    r3,r3,(1f - 0b)
+       mtspr   SPRN_SRR0,r3
+       mfmsr   r3
+       ori     r3,r3,MSR_ME
+       mtspr   SPRN_SRR1,r3
+       RFI_TO_KERNEL
+1:     mtlr    r0
+       blr
+
 /*
  * Hash table stuff
  */
-- 
2.20.1

Reply via email to