powerpc/64s/exception: simplify machine check early path
authorNicholas Piggin <npiggin@gmail.com>
Fri, 2 Aug 2019 10:56:38 +0000 (20:56 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 30 Aug 2019 00:32:35 +0000 (10:32 +1000)
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 <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20190802105709.27696-14-npiggin@gmail.com
arch/powerpc/kernel/exceptions-64s.S

index 06821b1..bbbcab8 100644 (file)
@@ -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)
@@ -2269,6 +2268,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
  */