powerpc/64s: Add exception macro that does not enable RI
authorNicholas Piggin <npiggin@gmail.com>
Mon, 19 Dec 2016 18:30:02 +0000 (04:30 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 28 Apr 2017 11:02:25 +0000 (21:02 +1000)
Subsequent patches will add more non-RI variant exceptions, so
create a macro for it rather than open-code it.

This does not change generated instructions.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/exception-64s.h
arch/powerpc/kernel/exceptions-64s.S

index 8925981..99ed1d8 100644 (file)
@@ -200,6 +200,21 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
 #define EXCEPTION_PROLOG_PSERIES_1(label, h)                           \
        __EXCEPTION_PROLOG_PSERIES_1(label, h)
 
+/* _NORI variant keeps MSR_RI clear */
+#define __EXCEPTION_PROLOG_PSERIES_1_NORI(label, h)                    \
+       ld      r10,PACAKMSR(r13);      /* get MSR value for kernel */  \
+       xori    r10,r10,MSR_RI;         /* Clear MSR_RI */              \
+       mfspr   r11,SPRN_##h##SRR0;     /* save SRR0 */                 \
+       LOAD_HANDLER(r12,label)                                         \
+       mtspr   SPRN_##h##SRR0,r12;                                     \
+       mfspr   r12,SPRN_##h##SRR1;     /* and SRR1 */                  \
+       mtspr   SPRN_##h##SRR1,r10;                                     \
+       h##rfid;                                                        \
+       b       .       /* prevent speculative execution */
+
+#define EXCEPTION_PROLOG_PSERIES_1_NORI(label, h)                      \
+       __EXCEPTION_PROLOG_PSERIES_1_NORI(label, h)
+
 #define EXCEPTION_PROLOG_PSERIES(area, label, h, extra, vec)           \
        EXCEPTION_PROLOG_0(area);                                       \
        EXCEPTION_PROLOG_1(area, extra, vec);                           \
index 28f8d7b..aa65e3c 100644 (file)
@@ -240,20 +240,11 @@ machine_check_fwnmi:
 machine_check_pSeries_0:
        EXCEPTION_PROLOG_1(PACA_EXMC, KVMTEST_PR, 0x200)
        /*
-        * The following is essentially EXCEPTION_PROLOG_PSERIES_1 with the
-        * difference that MSR_RI is not enabled, because PACA_EXMC is being
-        * used, so nested machine check corrupts it. machine_check_common
-        * enables MSR_RI.
+        * MSR_RI is not enabled, because PACA_EXMC is being used, so a
+        * nested machine check corrupts it. machine_check_common enables
+        * MSR_RI.
         */
-       ld      r10,PACAKMSR(r13)
-       xori    r10,r10,MSR_RI
-       mfspr   r11,SPRN_SRR0
-       LOAD_HANDLER(r12, machine_check_common)
-       mtspr   SPRN_SRR0,r12
-       mfspr   r12,SPRN_SRR1
-       mtspr   SPRN_SRR1,r10
-       rfid
-       b       .       /* prevent speculative execution */
+       EXCEPTION_PROLOG_PSERIES_1_NORI(machine_check_common, EXC_STD)
 
 TRAMP_KVM_SKIP(PACA_EXMC, 0x200)