|
@@ -251,18 +251,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 */ \
|
|
@@ -485,7 +507,7 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
|
|
|
mflr r9; /* Get LR, later save to stack */ \
|
|
|
ld r2,PACATOC(r13); /* get kernel TOC into r2 */ \
|
|
|
std r9,_LINK(r1); \
|
|
|
- lbz r10,PACASOFTIRQEN(r13); \
|
|
|
+ lbz r10,PACAIRQSOFTMASK(r13); \
|
|
|
mfspr r11,SPRN_XER; /* save XER in stackframe */ \
|
|
|
std r10,SOFTE(r1); \
|
|
|
std r11,_XER(r1); \
|
|
@@ -549,22 +571,23 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
|
|
|
#define SOFTEN_VALUE_0xe80 PACA_IRQ_DBELL
|
|
|
#define SOFTEN_VALUE_0xe60 PACA_IRQ_HMI
|
|
|
#define SOFTEN_VALUE_0xea0 PACA_IRQ_EE
|
|
|
+#define SOFTEN_VALUE_0xf00 PACA_IRQ_PMI
|
|
|
|
|
|
-#define __SOFTEN_TEST(h, vec) \
|
|
|
- lbz r10,PACASOFTIRQEN(r13); \
|
|
|
- cmpwi r10,0; \
|
|
|
+#define __SOFTEN_TEST(h, vec, bitmask) \
|
|
|
+ lbz r10,PACAIRQSOFTMASK(r13); \
|
|
|
+ andi. r10,r10,bitmask; \
|
|
|
li r10,SOFTEN_VALUE_##vec; \
|
|
|
- beq masked_##h##interrupt
|
|
|
+ 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)
|
|
@@ -572,53 +595,57 @@ 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_PSERIES_OOL(vec, label, bitmask) \
|
|
|
+ MASKABLE_EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_NOTEST_PR, vec, bitmask);\
|
|
|
+ EXCEPTION_PROLOG_PSERIES_1(label, EXC_STD);
|
|
|
|
|
|
-#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)
|
|
|
|
|
|
/*
|