powerpc/64s/exception: consolidate EXCEPTION_PROLOG_2 with _NORI variant
authorNicholas Piggin <npiggin@gmail.com>
Sat, 22 Jun 2019 13:15:12 +0000 (23:15 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 2 Jul 2019 10:24:41 +0000 (20:24 +1000)
Switch to a gas macro that conditionally expands the RI clearing
instruction.

No generated code change.

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 eddd74cf36c3ac30dd025a77c3c21b6ad79e286e..82a1c0576fbb02674596ed7b6fb1194cd756486f 100644 (file)
@@ -323,32 +323,11 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
 #define EXCEPTION_PROLOG_1(area, extra, vec)                           \
        _EXCEPTION_PROLOG_1(area, extra, vec)
 
-.macro EXCEPTION_PROLOG_2 label, hsrr
-       ld      r10,PACAKMSR(r13)       /* get MSR value for kernel */
-       .if \hsrr
-       mfspr   r11,SPRN_HSRR0          /* save HSRR0 */
-       .else
-       mfspr   r11,SPRN_SRR0           /* save SRR0 */
-       .endif
-       LOAD_HANDLER(r12,\label\())
-       .if \hsrr
-       mtspr   SPRN_HSRR0,r12
-       mfspr   r12,SPRN_HSRR1          /* and HSRR1 */
-       mtspr   SPRN_HSRR1,r10
-       HRFI_TO_KERNEL
-       .else
-       mtspr   SPRN_SRR0,r12
-       mfspr   r12,SPRN_SRR1           /* and SRR1 */
-       mtspr   SPRN_SRR1,r10
-       RFI_TO_KERNEL
-       .endif
-       b       .       /* prevent speculative execution */
-.endm
-
-/* _NORI variant keeps MSR_RI clear */
-.macro EXCEPTION_PROLOG_2_NORI label, hsrr
+.macro EXCEPTION_PROLOG_2 label, hsrr, set_ri
        ld      r10,PACAKMSR(r13)       /* get MSR value for kernel */
+       .if ! \set_ri
        xori    r10,r10,MSR_RI          /* Clear MSR_RI */
+       .endif
        .if \hsrr
        mfspr   r11,SPRN_HSRR0          /* save HSRR0 */
        .else
@@ -373,7 +352,7 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
        SET_SCRATCH0(r13);              /* save r13 */                  \
        EXCEPTION_PROLOG_0(area);                                       \
        EXCEPTION_PROLOG_1(area, extra, vec);                           \
-       EXCEPTION_PROLOG_2 label, h
+       EXCEPTION_PROLOG_2 label, h, 1
 
 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
 /*
@@ -442,7 +421,7 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
 #define EXCEPTION_PROLOG_NORI(area, label, h, extra, vec)              \
        EXCEPTION_PROLOG_0(area);                                       \
        EXCEPTION_PROLOG_1(area, extra, vec);                           \
-       EXCEPTION_PROLOG_2_NORI label, h
+       EXCEPTION_PROLOG_2 label, h, 0
 
 #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
 .macro KVMTEST hsrr, n
@@ -599,14 +578,14 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
 
 #define STD_EXCEPTION_OOL(vec, label)                          \
        EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_PR, vec);        \
-       EXCEPTION_PROLOG_2 label, EXC_STD
+       EXCEPTION_PROLOG_2 label, EXC_STD, 1
 
 #define STD_EXCEPTION_HV(loc, vec, label)                      \
        EXCEPTION_PROLOG(PACA_EXGEN, label, EXC_HV, KVMTEST_HV, vec)
 
 #define STD_EXCEPTION_HV_OOL(vec, label)                       \
        EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_HV, vec);        \
-       EXCEPTION_PROLOG_2 label, EXC_HV
+       EXCEPTION_PROLOG_2 label, EXC_HV, 1
 
 #define STD_RELON_EXCEPTION(loc, vec, label)           \
        /* No guest interrupts come through here */     \
@@ -670,21 +649,21 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
        SET_SCRATCH0(r13);    /* save r13 */                            \
        EXCEPTION_PROLOG_0(PACA_EXGEN);                                 \
        MASKABLE_EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec, bitmask);   \
-       EXCEPTION_PROLOG_2 label, h
+       EXCEPTION_PROLOG_2 label, h, 1
 
 #define MASKABLE_EXCEPTION(vec, label, bitmask)                                \
        __MASKABLE_EXCEPTION(vec, label, EXC_STD, SOFTEN_TEST_PR, bitmask)
 
 #define MASKABLE_EXCEPTION_OOL(vec, label, bitmask)                    \
        MASKABLE_EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_TEST_PR, vec, bitmask);\
-       EXCEPTION_PROLOG_2 label, EXC_STD
+       EXCEPTION_PROLOG_2 label, EXC_STD, 1
 
 #define MASKABLE_EXCEPTION_HV(vec, label, bitmask)                     \
        __MASKABLE_EXCEPTION(vec, label, EXC_HV, SOFTEN_TEST_HV, bitmask)
 
 #define MASKABLE_EXCEPTION_HV_OOL(vec, label, bitmask)                 \
        MASKABLE_EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_TEST_HV, vec, bitmask);\
-       EXCEPTION_PROLOG_2 label, EXC_HV
+       EXCEPTION_PROLOG_2 label, EXC_HV, 1
 
 #define __MASKABLE_RELON_EXCEPTION(vec, label, h, extra, bitmask)      \
        SET_SCRATCH0(r13);    /* save r13 */                            \
@@ -697,7 +676,7 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
 
 #define MASKABLE_RELON_EXCEPTION_OOL(vec, label, bitmask)              \
        MASKABLE_EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_NOTEST_PR, vec, bitmask);\
-       EXCEPTION_PROLOG_2 label, EXC_STD
+       EXCEPTION_PROLOG_2 label, EXC_STD, 1
 
 #define MASKABLE_RELON_EXCEPTION_HV(vec, label, bitmask)               \
        __MASKABLE_RELON_EXCEPTION(vec, label, EXC_HV, SOFTEN_TEST_HV, bitmask)
index 13ae6b8d5e3ea2e270d46d52168d2ddcfd71d22c..f562b9a83b01f6b2074b39e806c8e4066b7c88ea 100644 (file)
@@ -356,7 +356,7 @@ machine_check_pSeries_0:
         * nested machine check corrupts it. machine_check_common enables
         * MSR_RI.
         */
-       EXCEPTION_PROLOG_2_NORI machine_check_common, EXC_STD
+       EXCEPTION_PROLOG_2 machine_check_common, EXC_STD, 0
 
 TRAMP_KVM_SKIP(PACA_EXMC, 0x200)
 
@@ -598,7 +598,7 @@ EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_PR, 0x300)
        mfspr   r11,SPRN_DSISR
        std     r10,PACA_EXGEN+EX_DAR(r13)
        stw     r11,PACA_EXGEN+EX_DSISR(r13)
-EXCEPTION_PROLOG_2 data_access_common, EXC_STD
+EXCEPTION_PROLOG_2 data_access_common, EXC_STD, 1
 
 EXC_VIRT_BEGIN(data_access, 0x4300, 0x80)
 SET_SCRATCH0(r13)              /* save r13 */
@@ -645,7 +645,7 @@ TRAMP_REAL_BEGIN(tramp_real_data_access_slb)
 EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x380)
        mfspr   r10,SPRN_DAR
        std     r10,PACA_EXSLB+EX_DAR(r13)
-EXCEPTION_PROLOG_2 data_access_slb_common, EXC_STD
+EXCEPTION_PROLOG_2 data_access_slb_common, EXC_STD, 1
 
 EXC_VIRT_BEGIN(data_access_slb, 0x4380, 0x80)
 SET_SCRATCH0(r13)              /* save r13 */
@@ -774,7 +774,7 @@ EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_PR, 0x600)
        mfspr   r11,SPRN_DSISR
        std     r10,PACA_EXGEN+EX_DAR(r13)
        stw     r11,PACA_EXGEN+EX_DSISR(r13)
-EXCEPTION_PROLOG_2 alignment_common, EXC_STD
+EXCEPTION_PROLOG_2 alignment_common, EXC_STD, 1
 EXC_REAL_END(alignment, 0x600, 0x100)
 
 EXC_VIRT_BEGIN(alignment, 0x4600, 0x100)
@@ -1320,7 +1320,7 @@ EXC_REAL_BEGIN(denorm_exception_hv, 0x1500, 0x100)
 #endif
 
        KVMTEST_HV(0x1500)
-       EXCEPTION_PROLOG_2 denorm_common, EXC_HV
+       EXCEPTION_PROLOG_2 denorm_common, EXC_HV, 1
 EXC_REAL_END(denorm_exception_hv, 0x1500, 0x100)
 
 #ifdef CONFIG_PPC_DENORMALISATION
@@ -1442,7 +1442,7 @@ EXC_VIRT_NONE(0x5800, 0x100)
        std     r12,PACA_EXGEN+EX_R12(r13);             \
        GET_SCRATCH0(r10);                              \
        std     r10,PACA_EXGEN+EX_R13(r13);             \
-       EXCEPTION_PROLOG_2 soft_nmi_common, _H
+       EXCEPTION_PROLOG_2 soft_nmi_common, _H, 1
 
 /*
  * Branch to soft_nmi_interrupt using the emergency stack. The emergency