powerpc/64s/exception: consolidate maskable and non-maskable prologs
Conditionally expand the soft-masking test if a mask is passed in. No generated code change. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:

committed by
Michael Ellerman

parent
a7c1ca19c2
commit
fa4cf6b703
@@ -238,7 +238,7 @@
|
||||
#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 ; \
|
||||
EXCEPTION_PROLOG_1 hsrr, area, kvm, vec, 0 ; \
|
||||
EXCEPTION_PROLOG_2_VIRT label, hsrr
|
||||
|
||||
/* Exception register prefixes */
|
||||
@@ -309,73 +309,51 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
|
||||
std r10,area+EX_R10(r13); /* save r10 - r12 */ \
|
||||
OPT_GET_SPR(r10, SPRN_CFAR, CPU_FTR_CFAR)
|
||||
|
||||
#define __EXCEPTION_PROLOG_1_PRE(area) \
|
||||
OPT_SAVE_REG_TO_PACA(area+EX_PPR, r9, CPU_FTR_HAS_PPR); \
|
||||
OPT_SAVE_REG_TO_PACA(area+EX_CFAR, r10, CPU_FTR_CFAR); \
|
||||
INTERRUPT_TO_KERNEL; \
|
||||
SAVE_CTR(r10, area); \
|
||||
.macro EXCEPTION_PROLOG_1 hsrr, area, kvm, vec, bitmask
|
||||
OPT_SAVE_REG_TO_PACA(\area\()+EX_PPR, r9, CPU_FTR_HAS_PPR)
|
||||
OPT_SAVE_REG_TO_PACA(\area\()+EX_CFAR, r10, CPU_FTR_CFAR)
|
||||
INTERRUPT_TO_KERNEL
|
||||
SAVE_CTR(r10, \area\())
|
||||
mfcr r9
|
||||
|
||||
#define __EXCEPTION_PROLOG_1_POST(area) \
|
||||
std r11,area+EX_R11(r13); \
|
||||
std r12,area+EX_R12(r13); \
|
||||
GET_SCRATCH0(r10); \
|
||||
std r10,area+EX_R13(r13)
|
||||
|
||||
/*
|
||||
* This version of the EXCEPTION_PROLOG_1 will carry
|
||||
* addition parameter called "bitmask" to support
|
||||
* checking of the interrupt maskable level.
|
||||
* Intended to be used in MASKABLE_EXCPETION_* macros.
|
||||
*/
|
||||
.macro MASKABLE_EXCEPTION_PROLOG_1 hsrr, area, kvm, vec, bitmask
|
||||
__EXCEPTION_PROLOG_1_PRE(\area\())
|
||||
.if \kvm
|
||||
KVMTEST \hsrr \vec
|
||||
.endif
|
||||
|
||||
lbz r10,PACAIRQSOFTMASK(r13)
|
||||
andi. r10,r10,\bitmask
|
||||
/* This associates vector numbers with bits in paca->irq_happened */
|
||||
.if \vec == 0x500 || \vec == 0xea0
|
||||
li r10,PACA_IRQ_EE
|
||||
.elseif \vec == 0x900
|
||||
li r10,PACA_IRQ_DEC
|
||||
.elseif \vec == 0xa00 || \vec == 0xe80
|
||||
li r10,PACA_IRQ_DBELL
|
||||
.elseif \vec == 0xe60
|
||||
li r10,PACA_IRQ_HMI
|
||||
.elseif \vec == 0xf00
|
||||
li r10,PACA_IRQ_PMI
|
||||
.else
|
||||
.abort "Bad maskable vector"
|
||||
.if \bitmask
|
||||
lbz r10,PACAIRQSOFTMASK(r13)
|
||||
andi. r10,r10,\bitmask
|
||||
/* Associate vector numbers with bits in paca->irq_happened */
|
||||
.if \vec == 0x500 || \vec == 0xea0
|
||||
li r10,PACA_IRQ_EE
|
||||
.elseif \vec == 0x900
|
||||
li r10,PACA_IRQ_DEC
|
||||
.elseif \vec == 0xa00 || \vec == 0xe80
|
||||
li r10,PACA_IRQ_DBELL
|
||||
.elseif \vec == 0xe60
|
||||
li r10,PACA_IRQ_HMI
|
||||
.elseif \vec == 0xf00
|
||||
li r10,PACA_IRQ_PMI
|
||||
.else
|
||||
.abort "Bad maskable vector"
|
||||
.endif
|
||||
|
||||
.if \hsrr
|
||||
bne masked_Hinterrupt
|
||||
.else
|
||||
bne masked_interrupt
|
||||
.endif
|
||||
.endif
|
||||
|
||||
.if \hsrr
|
||||
bne masked_Hinterrupt
|
||||
.else
|
||||
bne masked_interrupt
|
||||
.endif
|
||||
|
||||
__EXCEPTION_PROLOG_1_POST(\area\())
|
||||
.endm
|
||||
|
||||
/*
|
||||
* This version of the EXCEPTION_PROLOG_1 is intended
|
||||
* to be used in STD_EXCEPTION* macros
|
||||
*/
|
||||
.macro EXCEPTION_PROLOG_1 hsrr, area, kvm, vec
|
||||
__EXCEPTION_PROLOG_1_PRE(\area\())
|
||||
.if \kvm
|
||||
KVMTEST \hsrr \vec
|
||||
.endif
|
||||
__EXCEPTION_PROLOG_1_POST(\area\())
|
||||
std r11,\area\()+EX_R11(r13)
|
||||
std r12,\area\()+EX_R12(r13)
|
||||
GET_SCRATCH0(r10)
|
||||
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 ; \
|
||||
EXCEPTION_PROLOG_1 hsrr, area, kvm, vec, 0 ; \
|
||||
EXCEPTION_PROLOG_2_REAL label, hsrr, 1
|
||||
|
||||
#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
|
||||
@@ -444,7 +422,7 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
|
||||
/* Do not enable RI */
|
||||
#define EXCEPTION_PROLOG_NORI(area, label, hsrr, kvm, vec) \
|
||||
EXCEPTION_PROLOG_0(area); \
|
||||
EXCEPTION_PROLOG_1 hsrr, area, kvm, vec ; \
|
||||
EXCEPTION_PROLOG_1 hsrr, area, kvm, vec, 0 ; \
|
||||
EXCEPTION_PROLOG_2_REAL label, hsrr, 0
|
||||
|
||||
#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
|
||||
@@ -599,14 +577,14 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
|
||||
b hdlr
|
||||
|
||||
#define STD_EXCEPTION_OOL(vec, label) \
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 1, vec ; \
|
||||
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 ; \
|
||||
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) \
|
||||
@@ -614,54 +592,54 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
|
||||
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 ; \
|
||||
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; \
|
||||
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); \
|
||||
MASKABLE_EXCEPTION_PROLOG_1 hsrr, PACA_EXGEN, kvm, vec, bitmask ; \
|
||||
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) \
|
||||
MASKABLE_EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 1, vec, 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) \
|
||||
MASKABLE_EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, vec, 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); \
|
||||
MASKABLE_EXCEPTION_PROLOG_1 hsrr, PACA_EXGEN, kvm, vec, bitmask ; \
|
||||
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) \
|
||||
MASKABLE_EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 0, vec, 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) \
|
||||
MASKABLE_EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, vec, bitmask ; \
|
||||
EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, vec, bitmask ; \
|
||||
EXCEPTION_PROLOG_2_VIRT label, EXC_HV
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user