powerpc/64s: Add support to take additional parameter in MASKABLE_* macro
To support addition of "bitmask" to MASKABLE_* macros, factor out the EXCPETION_PROLOG_1 macro. Make it explicit the interrupt masking supported by a gievn interrupt handler. Patch correspondingly extends the MASKABLE_* macros with an addition's parameter. "bitmask" parameter is passed to SOFTEN_TEST macro to decide on masking the interrupt. Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:

committed by
Michael Ellerman

parent
d32eb1b550
commit
f14e953b19
@@ -198,18 +198,40 @@ 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(area, extra, vec) \
|
||||
#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); \
|
||||
SAVE_CTR(r10, area); \
|
||||
mfcr r9; \
|
||||
extra(vec); \
|
||||
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 in the SOFTEN_TEST.
|
||||
* Intended to be used in MASKABLE_EXCPETION_* macros.
|
||||
*/
|
||||
#define MASKABLE_EXCEPTION_PROLOG_1(area, extra, vec, bitmask) \
|
||||
__EXCEPTION_PROLOG_1_PRE(area); \
|
||||
extra(vec, bitmask); \
|
||||
__EXCEPTION_PROLOG_1_POST(area);
|
||||
|
||||
/*
|
||||
* This version of the EXCEPTION_PROLOG_1 is intended
|
||||
* to be used in STD_EXCEPTION* macros
|
||||
*/
|
||||
#define _EXCEPTION_PROLOG_1(area, extra, vec) \
|
||||
__EXCEPTION_PROLOG_1_PRE(area); \
|
||||
extra(vec); \
|
||||
__EXCEPTION_PROLOG_1_POST(area);
|
||||
|
||||
#define EXCEPTION_PROLOG_1(area, extra, vec) \
|
||||
__EXCEPTION_PROLOG_1(area, extra, vec)
|
||||
_EXCEPTION_PROLOG_1(area, extra, vec)
|
||||
|
||||
#define __EXCEPTION_PROLOG_PSERIES_1(label, h) \
|
||||
ld r10,PACAKMSR(r13); /* get MSR value for kernel */ \
|
||||
@@ -497,21 +519,21 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
|
||||
#define SOFTEN_VALUE_0xe60 PACA_IRQ_HMI
|
||||
#define SOFTEN_VALUE_0xea0 PACA_IRQ_EE
|
||||
|
||||
#define __SOFTEN_TEST(h, vec) \
|
||||
#define __SOFTEN_TEST(h, vec, bitmask) \
|
||||
lbz r10,PACAIRQSOFTMASK(r13); \
|
||||
andi. r10,r10,IRQS_DISABLED; \
|
||||
andi. r10,r10,bitmask; \
|
||||
li r10,SOFTEN_VALUE_##vec; \
|
||||
bne masked_##h##interrupt
|
||||
|
||||
#define _SOFTEN_TEST(h, vec) __SOFTEN_TEST(h, vec)
|
||||
#define _SOFTEN_TEST(h, vec, bitmask) __SOFTEN_TEST(h, vec, bitmask)
|
||||
|
||||
#define SOFTEN_TEST_PR(vec) \
|
||||
#define SOFTEN_TEST_PR(vec, bitmask) \
|
||||
KVMTEST(EXC_STD, vec); \
|
||||
_SOFTEN_TEST(EXC_STD, vec)
|
||||
_SOFTEN_TEST(EXC_STD, vec, bitmask)
|
||||
|
||||
#define SOFTEN_TEST_HV(vec) \
|
||||
#define SOFTEN_TEST_HV(vec, bitmask) \
|
||||
KVMTEST(EXC_HV, vec); \
|
||||
_SOFTEN_TEST(EXC_HV, vec)
|
||||
_SOFTEN_TEST(EXC_HV, vec, bitmask)
|
||||
|
||||
#define KVMTEST_PR(vec) \
|
||||
KVMTEST(EXC_STD, vec)
|
||||
@@ -519,53 +541,53 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
|
||||
#define KVMTEST_HV(vec) \
|
||||
KVMTEST(EXC_HV, vec)
|
||||
|
||||
#define SOFTEN_NOTEST_PR(vec) _SOFTEN_TEST(EXC_STD, vec)
|
||||
#define SOFTEN_NOTEST_HV(vec) _SOFTEN_TEST(EXC_HV, vec)
|
||||
#define SOFTEN_NOTEST_PR(vec, bitmask) _SOFTEN_TEST(EXC_STD, vec, bitmask)
|
||||
#define SOFTEN_NOTEST_HV(vec, bitmask) _SOFTEN_TEST(EXC_HV, vec, bitmask)
|
||||
|
||||
#define __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) \
|
||||
#define __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra, bitmask) \
|
||||
SET_SCRATCH0(r13); /* save r13 */ \
|
||||
EXCEPTION_PROLOG_0(PACA_EXGEN); \
|
||||
__EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \
|
||||
MASKABLE_EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec, bitmask); \
|
||||
EXCEPTION_PROLOG_PSERIES_1(label, h);
|
||||
|
||||
#define _MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) \
|
||||
__MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra)
|
||||
#define _MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra, bitmask) \
|
||||
__MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra, bitmask)
|
||||
|
||||
#define MASKABLE_EXCEPTION_PSERIES(loc, vec, label) \
|
||||
#define MASKABLE_EXCEPTION_PSERIES(loc, vec, label, bitmask) \
|
||||
_MASKABLE_EXCEPTION_PSERIES(vec, label, \
|
||||
EXC_STD, SOFTEN_TEST_PR)
|
||||
EXC_STD, SOFTEN_TEST_PR, bitmask)
|
||||
|
||||
#define MASKABLE_EXCEPTION_PSERIES_OOL(vec, label) \
|
||||
__EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_TEST_PR, vec); \
|
||||
#define MASKABLE_EXCEPTION_PSERIES_OOL(vec, label, bitmask) \
|
||||
MASKABLE_EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_TEST_PR, vec, bitmask);\
|
||||
EXCEPTION_PROLOG_PSERIES_1(label, EXC_STD)
|
||||
|
||||
#define MASKABLE_EXCEPTION_HV(loc, vec, label) \
|
||||
#define MASKABLE_EXCEPTION_HV(loc, vec, label, bitmask) \
|
||||
_MASKABLE_EXCEPTION_PSERIES(vec, label, \
|
||||
EXC_HV, SOFTEN_TEST_HV)
|
||||
EXC_HV, SOFTEN_TEST_HV, bitmask)
|
||||
|
||||
#define MASKABLE_EXCEPTION_HV_OOL(vec, label) \
|
||||
__EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_TEST_HV, vec); \
|
||||
#define MASKABLE_EXCEPTION_HV_OOL(vec, label, bitmask) \
|
||||
MASKABLE_EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_TEST_HV, vec, bitmask);\
|
||||
EXCEPTION_PROLOG_PSERIES_1(label, EXC_HV)
|
||||
|
||||
#define __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) \
|
||||
#define __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra, bitmask) \
|
||||
SET_SCRATCH0(r13); /* save r13 */ \
|
||||
EXCEPTION_PROLOG_0(PACA_EXGEN); \
|
||||
__EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \
|
||||
MASKABLE_EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec, bitmask); \
|
||||
EXCEPTION_RELON_PROLOG_PSERIES_1(label, h)
|
||||
|
||||
#define _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) \
|
||||
__MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra)
|
||||
#define _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra, bitmask)\
|
||||
__MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra, bitmask)
|
||||
|
||||
#define MASKABLE_RELON_EXCEPTION_PSERIES(loc, vec, label) \
|
||||
#define MASKABLE_RELON_EXCEPTION_PSERIES(loc, vec, label, bitmask) \
|
||||
_MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, \
|
||||
EXC_STD, SOFTEN_NOTEST_PR)
|
||||
EXC_STD, SOFTEN_NOTEST_PR, bitmask)
|
||||
|
||||
#define MASKABLE_RELON_EXCEPTION_HV(loc, vec, label) \
|
||||
#define MASKABLE_RELON_EXCEPTION_HV(loc, vec, label, bitmask) \
|
||||
_MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, \
|
||||
EXC_HV, SOFTEN_TEST_HV)
|
||||
EXC_HV, SOFTEN_TEST_HV, bitmask)
|
||||
|
||||
#define MASKABLE_RELON_EXCEPTION_HV_OOL(vec, label) \
|
||||
__EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_TEST_HV, vec); \
|
||||
#define MASKABLE_RELON_EXCEPTION_HV_OOL(vec, label, bitmask) \
|
||||
MASKABLE_EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_NOTEST_HV, vec, bitmask);\
|
||||
EXCEPTION_RELON_PROLOG_PSERIES_1(label, EXC_HV)
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user