powerpc/64s/exception: unwind exception-64s.h macros
authorNicholas Piggin <npiggin@gmail.com>
Sat, 22 Jun 2019 13:15:22 +0000 (23:15 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 2 Jul 2019 10:24:42 +0000 (20:24 +1000)
Many of these macros just specify 1-4 lines which are only called a
few times each at most, and often just once. Remove this indirection.

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/include/asm/head-64.h
arch/powerpc/kernel/exceptions-64s.S

index 127ebd8d774617c9aa26fdcab81c000ede56a0ba..6efd182da2545b386d96c2fd9aeec2c49a88f876 100644 (file)
 #endif
 .endm
 
-/*
- * As EXCEPTION_PROLOG(), except we've already got relocation on so no need to
- * rfid. Save CTR in case we're CONFIG_RELOCATABLE, in which case
- * EXCEPTION_PROLOG_2_VIRT will be using CTR.
- */
-#define EXCEPTION_RELON_PROLOG(area, label, hsrr, kvm, vec)            \
-       SET_SCRATCH0(r13);              /* save r13 */                  \
-       EXCEPTION_PROLOG_0 area ;                                       \
-       EXCEPTION_PROLOG_1 hsrr, area, kvm, vec, 0 ;                    \
-       EXCEPTION_PROLOG_2_VIRT label, hsrr
-
 /* Exception register prefixes */
 #define EXC_HV         1
 #define EXC_STD                0
@@ -351,12 +340,6 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
        std     r10,\area\()+EX_R13(r13)
 .endm
 
-#define EXCEPTION_PROLOG(area, label, hsrr, kvm, vec)                  \
-       SET_SCRATCH0(r13);              /* save r13 */                  \
-       EXCEPTION_PROLOG_0 area ;                                       \
-       EXCEPTION_PROLOG_1 hsrr, area, kvm, vec, 0 ;                    \
-       EXCEPTION_PROLOG_2_REAL label, hsrr, 1
-
 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
 /*
  * If hv is possible, interrupts come into to the hv version
@@ -420,12 +403,6 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
 
 #endif
 
-/* Do not enable RI */
-#define EXCEPTION_PROLOG_NORI(area, label, hsrr, kvm, vec)             \
-       EXCEPTION_PROLOG_0 area ;                                       \
-       EXCEPTION_PROLOG_1 hsrr, area, kvm, vec, 0 ;                    \
-       EXCEPTION_PROLOG_2_REAL label, hsrr, 0
-
 #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
 .macro KVMTEST hsrr, n
        lbz     r10,HSTATE_IN_GUEST(r13)
@@ -562,84 +539,6 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
        std     r10,RESULT(r1);         /* clear regs->result           */ \
        std     r11,STACK_FRAME_OVERHEAD-16(r1); /* mark the frame      */
 
-/*
- * Exception vectors.
- */
-#define STD_EXCEPTION(vec, label)                              \
-       EXCEPTION_PROLOG(PACA_EXGEN, label, EXC_STD, 1, vec);
-
-/* Version of above for when we have to branch out-of-line */
-#define __OOL_EXCEPTION(vec, label, hdlr)                      \
-       SET_SCRATCH0(r13);                                      \
-       EXCEPTION_PROLOG_0 PACA_EXGEN ;                         \
-       b hdlr
-
-#define STD_EXCEPTION_OOL(vec, label)                          \
-       EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 1, vec, 0 ;     \
-       EXCEPTION_PROLOG_2_REAL label, EXC_STD, 1
-
-#define STD_EXCEPTION_HV(loc, vec, label)                      \
-       EXCEPTION_PROLOG(PACA_EXGEN, label, EXC_HV, 1, vec)
-
-#define STD_EXCEPTION_HV_OOL(vec, label)                       \
-       EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, vec, 0 ;      \
-       EXCEPTION_PROLOG_2_REAL label, EXC_HV, 1
-
-#define STD_RELON_EXCEPTION(loc, vec, label)           \
-       /* No guest interrupts come through here */     \
-       EXCEPTION_RELON_PROLOG(PACA_EXGEN, label, EXC_STD, 0, vec)
-
-#define STD_RELON_EXCEPTION_OOL(vec, label)                    \
-       EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 0, vec, 0 ;     \
-       EXCEPTION_PROLOG_2_VIRT label, EXC_STD
-
-#define STD_RELON_EXCEPTION_HV(loc, vec, label)                        \
-       EXCEPTION_RELON_PROLOG(PACA_EXGEN, label, EXC_HV, 1, vec)
-
-#define STD_RELON_EXCEPTION_HV_OOL(vec, label)                 \
-       EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, vec, 0 ;      \
-       EXCEPTION_PROLOG_2_VIRT label, EXC_HV
-
-#define __MASKABLE_EXCEPTION(vec, label, hsrr, kvm, bitmask)           \
-       SET_SCRATCH0(r13);    /* save r13 */                            \
-       EXCEPTION_PROLOG_0 PACA_EXGEN ;                                 \
-       EXCEPTION_PROLOG_1 hsrr, PACA_EXGEN, kvm, vec, bitmask ;        \
-       EXCEPTION_PROLOG_2_REAL label, hsrr, 1
-
-#define MASKABLE_EXCEPTION(vec, label, bitmask)                                \
-       __MASKABLE_EXCEPTION(vec, label, EXC_STD, 1, bitmask)
-
-#define MASKABLE_EXCEPTION_OOL(vec, label, bitmask)                    \
-       EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 1, vec, bitmask ;       \
-       EXCEPTION_PROLOG_2_REAL label, EXC_STD, 1
-
-#define MASKABLE_EXCEPTION_HV(vec, label, bitmask)                     \
-       __MASKABLE_EXCEPTION(vec, label, EXC_HV, 1, bitmask)
-
-#define MASKABLE_EXCEPTION_HV_OOL(vec, label, bitmask)                 \
-       EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, vec, bitmask ;        \
-       EXCEPTION_PROLOG_2_REAL label, EXC_HV, 1
-
-#define __MASKABLE_RELON_EXCEPTION(vec, label, hsrr, kvm, bitmask)     \
-       SET_SCRATCH0(r13);    /* save r13 */                            \
-       EXCEPTION_PROLOG_0 PACA_EXGEN ;                                 \
-       EXCEPTION_PROLOG_1 hsrr, PACA_EXGEN, kvm, vec, bitmask ;        \
-       EXCEPTION_PROLOG_2_VIRT label, hsrr
-
-#define MASKABLE_RELON_EXCEPTION(vec, label, bitmask)                  \
-       __MASKABLE_RELON_EXCEPTION(vec, label, EXC_STD, 0, bitmask)
-
-#define MASKABLE_RELON_EXCEPTION_OOL(vec, label, bitmask)              \
-       EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 0, vec, bitmask ;       \
-       EXCEPTION_PROLOG_2_REAL label, EXC_STD, 1
-
-#define MASKABLE_RELON_EXCEPTION_HV(vec, label, bitmask)               \
-       __MASKABLE_RELON_EXCEPTION(vec, label, EXC_HV, 1, bitmask)
-
-#define MASKABLE_RELON_EXCEPTION_HV_OOL(vec, label, bitmask)           \
-       EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, vec, bitmask ;        \
-       EXCEPTION_PROLOG_2_VIRT label, EXC_HV
-
 #define RUNLATCH_ON                            \
 BEGIN_FTR_SECTION                              \
        ld      r3, PACA_THREAD_INFO(r13);      \
index acd94fcf9f4002373cdb3c0da5210ad355086b73..54db05afb80fc431c29ff4c28df93e90d1633262 100644 (file)
@@ -258,44 +258,71 @@ name:
        FIXED_SECTION_ENTRY_END_LOCATION(virt_vectors, exc_virt_##start##_##unused, start, size)
 
 
-#define EXC_REAL(name, start, size)                                    \
+#define __EXC_REAL(name, start, size, area)                            \
        EXC_REAL_BEGIN(name, start, size);                              \
-       STD_EXCEPTION(start, name##_common);                            \
+       SET_SCRATCH0(r13);              /* save r13 */                  \
+       EXCEPTION_PROLOG_0 area ;                                       \
+       EXCEPTION_PROLOG_1 EXC_STD, area, 1, start, 0 ;                 \
+       EXCEPTION_PROLOG_2_REAL name##_common, EXC_STD, 1 ;             \
        EXC_REAL_END(name, start, size)
 
-#define EXC_VIRT(name, start, size, realvec)                           \
+#define EXC_REAL(name, start, size)                                    \
+       __EXC_REAL(name, start, size, PACA_EXGEN)
+
+#define __EXC_VIRT(name, start, size, realvec, area)                   \
        EXC_VIRT_BEGIN(name, start, size);                              \
-       STD_RELON_EXCEPTION(start, realvec, name##_common);             \
+       SET_SCRATCH0(r13);    /* save r13 */                            \
+       EXCEPTION_PROLOG_0 area ;                                       \
+       EXCEPTION_PROLOG_1 EXC_STD, area, 0, realvec, 0;                \
+       EXCEPTION_PROLOG_2_VIRT name##_common, EXC_STD ;                \
        EXC_VIRT_END(name, start, size)
 
+#define EXC_VIRT(name, start, size, realvec)                           \
+       __EXC_VIRT(name, start, size, realvec, PACA_EXGEN)
+
 #define EXC_REAL_MASKABLE(name, start, size, bitmask)                  \
        EXC_REAL_BEGIN(name, start, size);                              \
-       MASKABLE_EXCEPTION(start, name##_common, bitmask);              \
+       SET_SCRATCH0(r13);    /* save r13 */                            \
+       EXCEPTION_PROLOG_0 PACA_EXGEN ;                                 \
+       EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 1, start, bitmask ;     \
+       EXCEPTION_PROLOG_2_REAL name##_common, EXC_STD, 1 ;             \
        EXC_REAL_END(name, start, size)
 
 #define EXC_VIRT_MASKABLE(name, start, size, realvec, bitmask)         \
        EXC_VIRT_BEGIN(name, start, size);                              \
-       MASKABLE_RELON_EXCEPTION(realvec, name##_common, bitmask);      \
+       SET_SCRATCH0(r13);    /* save r13 */                            \
+       EXCEPTION_PROLOG_0 PACA_EXGEN ;                                 \
+       EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 0, realvec, bitmask ;   \
+       EXCEPTION_PROLOG_2_VIRT name##_common, EXC_STD ;                \
        EXC_VIRT_END(name, start, size)
 
 #define EXC_REAL_HV(name, start, size)                                 \
        EXC_REAL_BEGIN(name, start, size);                              \
-       STD_EXCEPTION_HV(start, start, name##_common);                  \
+       SET_SCRATCH0(r13);              /* save r13 */                  \
+       EXCEPTION_PROLOG_0 PACA_EXGEN;                                  \
+       EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, start, 0 ;            \
+       EXCEPTION_PROLOG_2_REAL name##_common, EXC_HV, 1 ;              \
        EXC_REAL_END(name, start, size)
 
 #define EXC_VIRT_HV(name, start, size, realvec)                                \
        EXC_VIRT_BEGIN(name, start, size);                              \
-       STD_RELON_EXCEPTION_HV(start, realvec, name##_common);          \
+       SET_SCRATCH0(r13);              /* save r13 */                  \
+       EXCEPTION_PROLOG_0 PACA_EXGEN;                                  \
+       EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, realvec, 0 ;          \
+       EXCEPTION_PROLOG_2_VIRT name##_common, EXC_HV ;                 \
        EXC_VIRT_END(name, start, size)
 
 #define __EXC_REAL_OOL(name, start, size)                              \
        EXC_REAL_BEGIN(name, start, size);                              \
-       __OOL_EXCEPTION(start, label, tramp_real_##name);               \
+       SET_SCRATCH0(r13);                                              \
+       EXCEPTION_PROLOG_0 PACA_EXGEN ;                                 \
+       b       tramp_real_##name ;                                     \
        EXC_REAL_END(name, start, size)
 
 #define __TRAMP_REAL_OOL(name, vec)                                    \
        TRAMP_REAL_BEGIN(tramp_real_##name);                            \
-       STD_EXCEPTION_OOL(vec, name##_common)
+       EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 1, vec, 0 ;     \
+       EXCEPTION_PROLOG_2_REAL name##_common, EXC_STD, 1
 
 #define EXC_REAL_OOL(name, start, size)                                        \
        __EXC_REAL_OOL(name, start, size);                              \
@@ -306,7 +333,8 @@ name:
 
 #define __TRAMP_REAL_OOL_MASKABLE(name, vec, bitmask)                  \
        TRAMP_REAL_BEGIN(tramp_real_##name);                            \
-       MASKABLE_EXCEPTION_OOL(vec, name##_common, bitmask)
+       EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 1, vec, bitmask ;       \
+       EXCEPTION_PROLOG_2_REAL name##_common, EXC_STD, 1
 
 #define EXC_REAL_OOL_MASKABLE(name, start, size, bitmask)              \
        __EXC_REAL_OOL_MASKABLE(name, start, size);                     \
@@ -314,7 +342,9 @@ name:
 
 #define __EXC_REAL_OOL_HV_DIRECT(name, start, size, handler)           \
        EXC_REAL_BEGIN(name, start, size);                              \
-       __OOL_EXCEPTION(start, label, handler);                         \
+       SET_SCRATCH0(r13);                                              \
+       EXCEPTION_PROLOG_0 PACA_EXGEN ;                                 \
+       b       handler;                                                \
        EXC_REAL_END(name, start, size)
 
 #define __EXC_REAL_OOL_HV(name, start, size)                           \
@@ -322,7 +352,8 @@ name:
 
 #define __TRAMP_REAL_OOL_HV(name, vec)                                 \
        TRAMP_REAL_BEGIN(tramp_real_##name);                            \
-       STD_EXCEPTION_HV_OOL(vec, name##_common)
+       EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, vec, 0 ;      \
+       EXCEPTION_PROLOG_2_REAL name##_common, EXC_HV, 1
 
 #define EXC_REAL_OOL_HV(name, start, size)                             \
        __EXC_REAL_OOL_HV(name, start, size);                           \
@@ -333,7 +364,8 @@ name:
 
 #define __TRAMP_REAL_OOL_MASKABLE_HV(name, vec, bitmask)               \
        TRAMP_REAL_BEGIN(tramp_real_##name);                            \
-       MASKABLE_EXCEPTION_HV_OOL(vec, name##_common, bitmask)
+       EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, vec, bitmask ;        \
+       EXCEPTION_PROLOG_2_REAL name##_common, EXC_HV, 1
 
 #define EXC_REAL_OOL_MASKABLE_HV(name, start, size, bitmask)           \
        __EXC_REAL_OOL_MASKABLE_HV(name, start, size);                  \
@@ -341,12 +373,15 @@ name:
 
 #define __EXC_VIRT_OOL(name, start, size)                              \
        EXC_VIRT_BEGIN(name, start, size);                              \
-       __OOL_EXCEPTION(start, label, tramp_virt_##name);               \
+       SET_SCRATCH0(r13);                                              \
+       EXCEPTION_PROLOG_0 PACA_EXGEN ;                                 \
+       b       tramp_virt_##name;                                      \
        EXC_VIRT_END(name, start, size)
 
 #define __TRAMP_VIRT_OOL(name, realvec)                                        \
        TRAMP_VIRT_BEGIN(tramp_virt_##name);                            \
-       STD_RELON_EXCEPTION_OOL(realvec, name##_common)
+       EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 0, vec, 0 ;             \
+       EXCEPTION_PROLOG_2_VIRT name##_common, EXC_STD
 
 #define EXC_VIRT_OOL(name, start, size, realvec)                       \
        __EXC_VIRT_OOL(name, start, size);                              \
@@ -357,7 +392,8 @@ name:
 
 #define __TRAMP_VIRT_OOL_MASKABLE(name, realvec, bitmask)              \
        TRAMP_VIRT_BEGIN(tramp_virt_##name);                            \
-       MASKABLE_RELON_EXCEPTION_OOL(realvec, name##_common, bitmask)
+       EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 0, realvec, bitmask ;   \
+       EXCEPTION_PROLOG_2_REAL name##_common, EXC_STD, 1
 
 #define EXC_VIRT_OOL_MASKABLE(name, start, size, realvec, bitmask)     \
        __EXC_VIRT_OOL_MASKABLE(name, start, size);                     \
@@ -368,7 +404,8 @@ name:
 
 #define __TRAMP_VIRT_OOL_HV(name, realvec)                             \
        TRAMP_VIRT_BEGIN(tramp_virt_##name);                            \
-       STD_RELON_EXCEPTION_HV_OOL(realvec, name##_common)
+       EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, realvec, 0 ;          \
+       EXCEPTION_PROLOG_2_VIRT name##_common, EXC_HV
 
 #define EXC_VIRT_OOL_HV(name, start, size, realvec)                    \
        __EXC_VIRT_OOL_HV(name, start, size);                           \
@@ -379,7 +416,8 @@ name:
 
 #define __TRAMP_VIRT_OOL_MASKABLE_HV(name, realvec, bitmask)           \
        TRAMP_VIRT_BEGIN(tramp_virt_##name);                            \
-       MASKABLE_RELON_EXCEPTION_HV_OOL(realvec, name##_common, bitmask)
+       EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, realvec, bitmask ;    \
+       EXCEPTION_PROLOG_2_VIRT name##_common, EXC_HV
 
 #define EXC_VIRT_OOL_MASKABLE_HV(name, start, size, realvec, bitmask)  \
        __EXC_VIRT_OOL_MASKABLE_HV(name, start, size);                  \
index 2685c81e28f23056285f3534fe54e220fa0998f8..2774046e6cf43c97b857cee3d823d95061201760 100644 (file)
@@ -254,9 +254,11 @@ EXC_COMMON_BEGIN(system_reset_common)
  */
 TRAMP_REAL_BEGIN(system_reset_fwnmi)
        SET_SCRATCH0(r13)               /* save r13 */
-       /* See comment at system_reset exception */
-       EXCEPTION_PROLOG_NORI(PACA_EXNMI, system_reset_common, EXC_STD,
-                             0, 0x100)
+       /* See comment at system_reset exception, don't turn on RI */
+       EXCEPTION_PROLOG_0 PACA_EXNMI
+       EXCEPTION_PROLOG_1 EXC_STD, PACA_EXNMI, 0, 0x100, 0
+       EXCEPTION_PROLOG_2_REAL system_reset_common, EXC_STD, 0
+
 #endif /* CONFIG_PPC_PSERIES */
 
 
@@ -714,14 +716,8 @@ MMU_FTR_SECTION_ELSE
 ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
 
 
-EXC_REAL_BEGIN(instruction_access_slb, 0x480, 0x80)
-EXCEPTION_PROLOG(PACA_EXSLB, instruction_access_slb_common, EXC_STD, 1, 0x480);
-EXC_REAL_END(instruction_access_slb, 0x480, 0x80)
-
-EXC_VIRT_BEGIN(instruction_access_slb, 0x4480, 0x80)
-EXCEPTION_RELON_PROLOG(PACA_EXSLB, instruction_access_slb_common, EXC_STD, 0, 0x480);
-EXC_VIRT_END(instruction_access_slb, 0x4480, 0x80)
-
+__EXC_REAL(instruction_access_slb, 0x480, 0x80, PACA_EXSLB)
+__EXC_VIRT(instruction_access_slb, 0x4480, 0x80, 0x480, PACA_EXSLB)
 TRAMP_KVM(PACA_EXSLB, 0x480)
 
 EXC_COMMON_BEGIN(instruction_access_slb_common)
@@ -750,24 +746,34 @@ ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
 
 
 EXC_REAL_BEGIN(hardware_interrupt, 0x500, 0x100)
-       .globl hardware_interrupt_hv;
+       .globl hardware_interrupt_hv
 hardware_interrupt_hv:
        BEGIN_FTR_SECTION
-               MASKABLE_EXCEPTION_HV(0x500, hardware_interrupt_common, IRQS_DISABLED)
+               SET_SCRATCH0(r13)       /* save r13 */
+               EXCEPTION_PROLOG_0 PACA_EXGEN
+               EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, 0x500, IRQS_DISABLED
+               EXCEPTION_PROLOG_2_REAL hardware_interrupt_common, EXC_HV, 1
        FTR_SECTION_ELSE
-               MASKABLE_EXCEPTION(0x500, hardware_interrupt_common, IRQS_DISABLED)
+               SET_SCRATCH0(r13)       /* save r13 */
+               EXCEPTION_PROLOG_0 PACA_EXGEN
+               EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 1, 0x500, IRQS_DISABLED
+               EXCEPTION_PROLOG_2_REAL hardware_interrupt_common, EXC_STD, 1
        ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
 EXC_REAL_END(hardware_interrupt, 0x500, 0x100)
 
 EXC_VIRT_BEGIN(hardware_interrupt, 0x4500, 0x100)
-       .globl hardware_interrupt_relon_hv;
+       .globl hardware_interrupt_relon_hv
 hardware_interrupt_relon_hv:
        BEGIN_FTR_SECTION
-               MASKABLE_RELON_EXCEPTION_HV(0x500, hardware_interrupt_common,
-                                           IRQS_DISABLED)
+               SET_SCRATCH0(r13)       /* save r13 */
+               EXCEPTION_PROLOG_0 PACA_EXGEN
+               EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, 0x500, IRQS_DISABLED
+               EXCEPTION_PROLOG_2_VIRT hardware_interrupt_common, EXC_HV
        FTR_SECTION_ELSE
-               __MASKABLE_RELON_EXCEPTION(0x500, hardware_interrupt_common,
-                                          EXC_STD, 1, IRQS_DISABLED)
+               SET_SCRATCH0(r13)       /* save r13 */
+               EXCEPTION_PROLOG_0 PACA_EXGEN
+               EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 1, 0x500, IRQS_DISABLED
+               EXCEPTION_PROLOG_2_VIRT hardware_interrupt_common, EXC_STD
        ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
 EXC_VIRT_END(hardware_interrupt, 0x4500, 0x100)