@@ -198,18 +198,40 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
198
198
std r10 ,area + EX_R10 (r13 ); /* save r10 - r12 */ \
199
199
OPT_GET_SPR (r10 , SPRN_CFAR , CPU_FTR_CFAR )
200
200
201
- #define __EXCEPTION_PROLOG_1 (area , extra , vec ) \
201
+ #define __EXCEPTION_PROLOG_1_PRE (area ) \
202
202
OPT_SAVE_REG_TO_PACA(area+EX_PPR, r9, CPU_FTR_HAS_PPR); \
203
203
OPT_SAVE_REG_TO_PACA(area+EX_CFAR, r10, CPU_FTR_CFAR); \
204
204
SAVE_CTR(r10, area); \
205
- mfcr r9; \
206
- extra(vec); \
205
+ mfcr r9;
206
+
207
+ #define __EXCEPTION_PROLOG_1_POST (area ) \
207
208
std r11,area+EX_R11(r13); \
208
209
std r12,area+EX_R12(r13); \
209
210
GET_SCRATCH0(r10); \
210
211
std r10,area+EX_R13(r13)
212
+
213
+ /*
214
+ * This version of the EXCEPTION_PROLOG_1 will carry
215
+ * addition parameter called "bitmask" to support
216
+ * checking of the interrupt maskable level in the SOFTEN_TEST.
217
+ * Intended to be used in MASKABLE_EXCPETION_* macros.
218
+ */
219
+ #define MASKABLE_EXCEPTION_PROLOG_1 (area , extra , vec , bitmask ) \
220
+ __EXCEPTION_PROLOG_1_PRE(area); \
221
+ extra(vec, bitmask); \
222
+ __EXCEPTION_PROLOG_1_POST(area);
223
+
224
+ /*
225
+ * This version of the EXCEPTION_PROLOG_1 is intended
226
+ * to be used in STD_EXCEPTION* macros
227
+ */
228
+ #define _EXCEPTION_PROLOG_1 (area , extra , vec ) \
229
+ __EXCEPTION_PROLOG_1_PRE(area); \
230
+ extra(vec); \
231
+ __EXCEPTION_PROLOG_1_POST(area);
232
+
211
233
#define EXCEPTION_PROLOG_1 (area , extra , vec ) \
212
- __EXCEPTION_PROLOG_1 (area, extra, vec)
234
+ _EXCEPTION_PROLOG_1 (area, extra, vec)
213
235
214
236
#define __EXCEPTION_PROLOG_PSERIES_1 (label , h ) \
215
237
ld r10,PACAKMSR(r13); /* get MSR value for kernel */ \
@@ -497,75 +519,75 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
497
519
#define SOFTEN_VALUE_0xe60 PACA_IRQ_HMI
498
520
#define SOFTEN_VALUE_0xea0 PACA_IRQ_EE
499
521
500
- #define __SOFTEN_TEST (h , vec ) \
522
+ #define __SOFTEN_TEST (h , vec , bitmask ) \
501
523
lbz r10,PACAIRQSOFTMASK(r13); \
502
- andi. r10,r10,IRQS_DISABLED; \
524
+ andi. r10,r10,bitmask; \
503
525
li r10,SOFTEN_VALUE_##vec; \
504
526
bne masked_##h##interrupt
505
527
506
- #define _SOFTEN_TEST (h , vec ) __SOFTEN_TEST(h, vec)
528
+ #define _SOFTEN_TEST (h , vec , bitmask ) __SOFTEN_TEST(h, vec, bitmask )
507
529
508
- #define SOFTEN_TEST_PR (vec ) \
530
+ #define SOFTEN_TEST_PR (vec , bitmask ) \
509
531
KVMTEST(EXC_STD, vec); \
510
- _SOFTEN_TEST(EXC_STD, vec)
532
+ _SOFTEN_TEST(EXC_STD, vec, bitmask )
511
533
512
- #define SOFTEN_TEST_HV (vec ) \
534
+ #define SOFTEN_TEST_HV (vec , bitmask ) \
513
535
KVMTEST(EXC_HV, vec); \
514
- _SOFTEN_TEST(EXC_HV, vec)
536
+ _SOFTEN_TEST(EXC_HV, vec, bitmask )
515
537
516
538
#define KVMTEST_PR (vec ) \
517
539
KVMTEST(EXC_STD, vec)
518
540
519
541
#define KVMTEST_HV (vec ) \
520
542
KVMTEST(EXC_HV, vec)
521
543
522
- #define SOFTEN_NOTEST_PR (vec ) _SOFTEN_TEST(EXC_STD, vec)
523
- #define SOFTEN_NOTEST_HV (vec ) _SOFTEN_TEST(EXC_HV, vec)
544
+ #define SOFTEN_NOTEST_PR (vec , bitmask ) _SOFTEN_TEST(EXC_STD, vec, bitmask )
545
+ #define SOFTEN_NOTEST_HV (vec , bitmask ) _SOFTEN_TEST(EXC_HV, vec, bitmask )
524
546
525
- #define __MASKABLE_EXCEPTION_PSERIES (vec , label , h , extra ) \
547
+ #define __MASKABLE_EXCEPTION_PSERIES (vec , label , h , extra , bitmask ) \
526
548
SET_SCRATCH0(r13); /* save r13 */ \
527
549
EXCEPTION_PROLOG_0 (PACA_EXGEN ); \
528
- __EXCEPTION_PROLOG_1 (PACA_EXGEN , extra , vec ); \
550
+ MASKABLE_EXCEPTION_PROLOG_1 (PACA_EXGEN , extra , vec , bitmask ); \
529
551
EXCEPTION_PROLOG_PSERIES_1 (label , h );
530
552
531
- #define _MASKABLE_EXCEPTION_PSERIES (vec , label , h , extra ) \
532
- __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra)
553
+ #define _MASKABLE_EXCEPTION_PSERIES (vec , label , h , extra , bitmask ) \
554
+ __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra, bitmask )
533
555
534
- #define MASKABLE_EXCEPTION_PSERIES (loc , vec , label ) \
556
+ #define MASKABLE_EXCEPTION_PSERIES (loc , vec , label , bitmask ) \
535
557
_MASKABLE_EXCEPTION_PSERIES(vec, label, \
536
- EXC_STD, SOFTEN_TEST_PR)
558
+ EXC_STD, SOFTEN_TEST_PR, bitmask )
537
559
538
- #define MASKABLE_EXCEPTION_PSERIES_OOL (vec , label ) \
539
- __EXCEPTION_PROLOG_1 (PACA_EXGEN, SOFTEN_TEST_PR, vec); \
560
+ #define MASKABLE_EXCEPTION_PSERIES_OOL (vec , label , bitmask ) \
561
+ MASKABLE_EXCEPTION_PROLOG_1 (PACA_EXGEN, SOFTEN_TEST_PR, vec, bitmask); \
540
562
EXCEPTION_PROLOG_PSERIES_1(label, EXC_STD)
541
563
542
- #define MASKABLE_EXCEPTION_HV (loc , vec , label ) \
564
+ #define MASKABLE_EXCEPTION_HV (loc , vec , label , bitmask ) \
543
565
_MASKABLE_EXCEPTION_PSERIES(vec, label, \
544
- EXC_HV, SOFTEN_TEST_HV)
566
+ EXC_HV, SOFTEN_TEST_HV, bitmask )
545
567
546
- #define MASKABLE_EXCEPTION_HV_OOL (vec , label ) \
547
- __EXCEPTION_PROLOG_1 (PACA_EXGEN, SOFTEN_TEST_HV, vec); \
568
+ #define MASKABLE_EXCEPTION_HV_OOL (vec , label , bitmask ) \
569
+ MASKABLE_EXCEPTION_PROLOG_1 (PACA_EXGEN, SOFTEN_TEST_HV, vec, bitmask); \
548
570
EXCEPTION_PROLOG_PSERIES_1(label, EXC_HV)
549
571
550
- #define __MASKABLE_RELON_EXCEPTION_PSERIES (vec , label , h , extra ) \
572
+ #define __MASKABLE_RELON_EXCEPTION_PSERIES (vec , label , h , extra , bitmask ) \
551
573
SET_SCRATCH0(r13); /* save r13 */ \
552
574
EXCEPTION_PROLOG_0 (PACA_EXGEN ); \
553
- __EXCEPTION_PROLOG_1 (PACA_EXGEN , extra , vec ); \
575
+ MASKABLE_EXCEPTION_PROLOG_1 (PACA_EXGEN , extra , vec , bitmask ); \
554
576
EXCEPTION_RELON_PROLOG_PSERIES_1 (label , h )
555
577
556
- #define _MASKABLE_RELON_EXCEPTION_PSERIES (vec , label , h , extra ) \
557
- __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra)
578
+ #define _MASKABLE_RELON_EXCEPTION_PSERIES (vec , label , h , extra , bitmask ) \
579
+ __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra, bitmask )
558
580
559
- #define MASKABLE_RELON_EXCEPTION_PSERIES (loc , vec , label ) \
581
+ #define MASKABLE_RELON_EXCEPTION_PSERIES (loc , vec , label , bitmask ) \
560
582
_MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, \
561
- EXC_STD, SOFTEN_NOTEST_PR)
583
+ EXC_STD, SOFTEN_NOTEST_PR, bitmask )
562
584
563
- #define MASKABLE_RELON_EXCEPTION_HV (loc , vec , label ) \
585
+ #define MASKABLE_RELON_EXCEPTION_HV (loc , vec , label , bitmask ) \
564
586
_MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, \
565
- EXC_HV, SOFTEN_TEST_HV)
587
+ EXC_HV, SOFTEN_TEST_HV, bitmask )
566
588
567
- #define MASKABLE_RELON_EXCEPTION_HV_OOL (vec , label ) \
568
- __EXCEPTION_PROLOG_1 (PACA_EXGEN, SOFTEN_TEST_HV , vec); \
589
+ #define MASKABLE_RELON_EXCEPTION_HV_OOL (vec , label , bitmask ) \
590
+ MASKABLE_EXCEPTION_PROLOG_1 (PACA_EXGEN, SOFTEN_NOTEST_HV , vec, bitmask); \
569
591
EXCEPTION_RELON_PROLOG_PSERIES_1(label, EXC_HV)
570
592
571
593
/*
0 commit comments