Skip to content

Commit f14e953

Browse files
Madhavan Srinivasanmpe
authored andcommitted
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 <[email protected]> Signed-off-by: Michael Ellerman <[email protected]>
1 parent d32eb1b commit f14e953

File tree

3 files changed

+96
-68
lines changed

3 files changed

+96
-68
lines changed

arch/powerpc/include/asm/exception-64s.h

Lines changed: 57 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -198,18 +198,40 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
198198
std r10,area+EX_R10(r13); /* save r10 - r12 */ \
199199
OPT_GET_SPR(r10, SPRN_CFAR, CPU_FTR_CFAR)
200200

201-
#define __EXCEPTION_PROLOG_1(area, extra, vec) \
201+
#define __EXCEPTION_PROLOG_1_PRE(area) \
202202
OPT_SAVE_REG_TO_PACA(area+EX_PPR, r9, CPU_FTR_HAS_PPR); \
203203
OPT_SAVE_REG_TO_PACA(area+EX_CFAR, r10, CPU_FTR_CFAR); \
204204
SAVE_CTR(r10, area); \
205-
mfcr r9; \
206-
extra(vec); \
205+
mfcr r9;
206+
207+
#define __EXCEPTION_PROLOG_1_POST(area) \
207208
std r11,area+EX_R11(r13); \
208209
std r12,area+EX_R12(r13); \
209210
GET_SCRATCH0(r10); \
210211
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+
211233
#define EXCEPTION_PROLOG_1(area, extra, vec) \
212-
__EXCEPTION_PROLOG_1(area, extra, vec)
234+
_EXCEPTION_PROLOG_1(area, extra, vec)
213235

214236
#define __EXCEPTION_PROLOG_PSERIES_1(label, h) \
215237
ld r10,PACAKMSR(r13); /* get MSR value for kernel */ \
@@ -497,75 +519,75 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
497519
#define SOFTEN_VALUE_0xe60 PACA_IRQ_HMI
498520
#define SOFTEN_VALUE_0xea0 PACA_IRQ_EE
499521

500-
#define __SOFTEN_TEST(h, vec) \
522+
#define __SOFTEN_TEST(h, vec, bitmask) \
501523
lbz r10,PACAIRQSOFTMASK(r13); \
502-
andi. r10,r10,IRQS_DISABLED; \
524+
andi. r10,r10,bitmask; \
503525
li r10,SOFTEN_VALUE_##vec; \
504526
bne masked_##h##interrupt
505527

506-
#define _SOFTEN_TEST(h, vec) __SOFTEN_TEST(h, vec)
528+
#define _SOFTEN_TEST(h, vec, bitmask) __SOFTEN_TEST(h, vec, bitmask)
507529

508-
#define SOFTEN_TEST_PR(vec) \
530+
#define SOFTEN_TEST_PR(vec, bitmask) \
509531
KVMTEST(EXC_STD, vec); \
510-
_SOFTEN_TEST(EXC_STD, vec)
532+
_SOFTEN_TEST(EXC_STD, vec, bitmask)
511533

512-
#define SOFTEN_TEST_HV(vec) \
534+
#define SOFTEN_TEST_HV(vec, bitmask) \
513535
KVMTEST(EXC_HV, vec); \
514-
_SOFTEN_TEST(EXC_HV, vec)
536+
_SOFTEN_TEST(EXC_HV, vec, bitmask)
515537

516538
#define KVMTEST_PR(vec) \
517539
KVMTEST(EXC_STD, vec)
518540

519541
#define KVMTEST_HV(vec) \
520542
KVMTEST(EXC_HV, vec)
521543

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)
524546

525-
#define __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) \
547+
#define __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra, bitmask) \
526548
SET_SCRATCH0(r13); /* save r13 */ \
527549
EXCEPTION_PROLOG_0(PACA_EXGEN); \
528-
__EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \
550+
MASKABLE_EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec, bitmask); \
529551
EXCEPTION_PROLOG_PSERIES_1(label, h);
530552

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)
533555

534-
#define MASKABLE_EXCEPTION_PSERIES(loc, vec, label) \
556+
#define MASKABLE_EXCEPTION_PSERIES(loc, vec, label, bitmask) \
535557
_MASKABLE_EXCEPTION_PSERIES(vec, label, \
536-
EXC_STD, SOFTEN_TEST_PR)
558+
EXC_STD, SOFTEN_TEST_PR, bitmask)
537559

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);\
540562
EXCEPTION_PROLOG_PSERIES_1(label, EXC_STD)
541563

542-
#define MASKABLE_EXCEPTION_HV(loc, vec, label) \
564+
#define MASKABLE_EXCEPTION_HV(loc, vec, label, bitmask) \
543565
_MASKABLE_EXCEPTION_PSERIES(vec, label, \
544-
EXC_HV, SOFTEN_TEST_HV)
566+
EXC_HV, SOFTEN_TEST_HV, bitmask)
545567

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);\
548570
EXCEPTION_PROLOG_PSERIES_1(label, EXC_HV)
549571

550-
#define __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) \
572+
#define __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra, bitmask) \
551573
SET_SCRATCH0(r13); /* save r13 */ \
552574
EXCEPTION_PROLOG_0(PACA_EXGEN); \
553-
__EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \
575+
MASKABLE_EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec, bitmask); \
554576
EXCEPTION_RELON_PROLOG_PSERIES_1(label, h)
555577

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)
558580

559-
#define MASKABLE_RELON_EXCEPTION_PSERIES(loc, vec, label) \
581+
#define MASKABLE_RELON_EXCEPTION_PSERIES(loc, vec, label, bitmask) \
560582
_MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, \
561-
EXC_STD, SOFTEN_NOTEST_PR)
583+
EXC_STD, SOFTEN_NOTEST_PR, bitmask)
562584

563-
#define MASKABLE_RELON_EXCEPTION_HV(loc, vec, label) \
585+
#define MASKABLE_RELON_EXCEPTION_HV(loc, vec, label, bitmask) \
564586
_MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, \
565-
EXC_HV, SOFTEN_TEST_HV)
587+
EXC_HV, SOFTEN_TEST_HV, bitmask)
566588

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);\
569591
EXCEPTION_RELON_PROLOG_PSERIES_1(label, EXC_HV)
570592

571593
/*

arch/powerpc/include/asm/head-64.h

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -268,14 +268,14 @@ end_##sname:
268268
STD_RELON_EXCEPTION_PSERIES(start, realvec, name##_common); \
269269
EXC_VIRT_END(name, start, size);
270270

271-
#define EXC_REAL_MASKABLE(name, start, size) \
271+
#define EXC_REAL_MASKABLE(name, start, size, bitmask) \
272272
EXC_REAL_BEGIN(name, start, size); \
273-
MASKABLE_EXCEPTION_PSERIES(start, start, name##_common); \
273+
MASKABLE_EXCEPTION_PSERIES(start, start, name##_common, bitmask);\
274274
EXC_REAL_END(name, start, size);
275275

276-
#define EXC_VIRT_MASKABLE(name, start, size, realvec) \
276+
#define EXC_VIRT_MASKABLE(name, start, size, realvec, bitmask) \
277277
EXC_VIRT_BEGIN(name, start, size); \
278-
MASKABLE_RELON_EXCEPTION_PSERIES(start, realvec, name##_common); \
278+
MASKABLE_RELON_EXCEPTION_PSERIES(start, realvec, name##_common, bitmask);\
279279
EXC_VIRT_END(name, start, size);
280280

281281
#define EXC_REAL_HV(name, start, size) \
@@ -304,13 +304,13 @@ end_##sname:
304304
#define __EXC_REAL_OOL_MASKABLE(name, start, size) \
305305
__EXC_REAL_OOL(name, start, size);
306306

307-
#define __TRAMP_REAL_OOL_MASKABLE(name, vec) \
307+
#define __TRAMP_REAL_OOL_MASKABLE(name, vec, bitmask) \
308308
TRAMP_REAL_BEGIN(tramp_real_##name); \
309-
MASKABLE_EXCEPTION_PSERIES_OOL(vec, name##_common); \
309+
MASKABLE_EXCEPTION_PSERIES_OOL(vec, name##_common, bitmask); \
310310

311-
#define EXC_REAL_OOL_MASKABLE(name, start, size) \
311+
#define EXC_REAL_OOL_MASKABLE(name, start, size, bitmask) \
312312
__EXC_REAL_OOL_MASKABLE(name, start, size); \
313-
__TRAMP_REAL_OOL_MASKABLE(name, start);
313+
__TRAMP_REAL_OOL_MASKABLE(name, start, bitmask);
314314

315315
#define __EXC_REAL_OOL_HV_DIRECT(name, start, size, handler) \
316316
EXC_REAL_BEGIN(name, start, size); \
@@ -331,13 +331,13 @@ end_##sname:
331331
#define __EXC_REAL_OOL_MASKABLE_HV(name, start, size) \
332332
__EXC_REAL_OOL(name, start, size);
333333

334-
#define __TRAMP_REAL_OOL_MASKABLE_HV(name, vec) \
334+
#define __TRAMP_REAL_OOL_MASKABLE_HV(name, vec, bitmask) \
335335
TRAMP_REAL_BEGIN(tramp_real_##name); \
336-
MASKABLE_EXCEPTION_HV_OOL(vec, name##_common); \
336+
MASKABLE_EXCEPTION_HV_OOL(vec, name##_common, bitmask); \
337337

338-
#define EXC_REAL_OOL_MASKABLE_HV(name, start, size) \
338+
#define EXC_REAL_OOL_MASKABLE_HV(name, start, size, bitmask) \
339339
__EXC_REAL_OOL_MASKABLE_HV(name, start, size); \
340-
__TRAMP_REAL_OOL_MASKABLE_HV(name, start);
340+
__TRAMP_REAL_OOL_MASKABLE_HV(name, start, bitmask);
341341

342342
#define __EXC_VIRT_OOL(name, start, size) \
343343
EXC_VIRT_BEGIN(name, start, size); \
@@ -355,13 +355,13 @@ end_##sname:
355355
#define __EXC_VIRT_OOL_MASKABLE(name, start, size) \
356356
__EXC_VIRT_OOL(name, start, size);
357357

358-
#define __TRAMP_VIRT_OOL_MASKABLE(name, realvec) \
358+
#define __TRAMP_VIRT_OOL_MASKABLE(name, realvec, bitmask) \
359359
TRAMP_VIRT_BEGIN(tramp_virt_##name); \
360-
MASKABLE_RELON_EXCEPTION_PSERIES_OOL(realvec, name##_common); \
360+
MASKABLE_RELON_EXCEPTION_PSERIES_OOL(realvec, name##_common, bitmask);\
361361

362-
#define EXC_VIRT_OOL_MASKABLE(name, start, size, realvec) \
362+
#define EXC_VIRT_OOL_MASKABLE(name, start, size, realvec, bitmask) \
363363
__EXC_VIRT_OOL_MASKABLE(name, start, size); \
364-
__TRAMP_VIRT_OOL_MASKABLE(name, realvec);
364+
__TRAMP_VIRT_OOL_MASKABLE(name, realvec, bitmask);
365365

366366
#define __EXC_VIRT_OOL_HV(name, start, size) \
367367
__EXC_VIRT_OOL(name, start, size);
@@ -377,13 +377,13 @@ end_##sname:
377377
#define __EXC_VIRT_OOL_MASKABLE_HV(name, start, size) \
378378
__EXC_VIRT_OOL(name, start, size);
379379

380-
#define __TRAMP_VIRT_OOL_MASKABLE_HV(name, realvec) \
380+
#define __TRAMP_VIRT_OOL_MASKABLE_HV(name, realvec, bitmask) \
381381
TRAMP_VIRT_BEGIN(tramp_virt_##name); \
382-
MASKABLE_RELON_EXCEPTION_HV_OOL(realvec, name##_common); \
382+
MASKABLE_RELON_EXCEPTION_HV_OOL(realvec, name##_common, bitmask);\
383383

384-
#define EXC_VIRT_OOL_MASKABLE_HV(name, start, size, realvec) \
384+
#define EXC_VIRT_OOL_MASKABLE_HV(name, start, size, realvec, bitmask) \
385385
__EXC_VIRT_OOL_MASKABLE_HV(name, start, size); \
386-
__TRAMP_VIRT_OOL_MASKABLE_HV(name, realvec);
386+
__TRAMP_VIRT_OOL_MASKABLE_HV(name, realvec, bitmask);
387387

388388
#define TRAMP_KVM(area, n) \
389389
TRAMP_KVM_BEGIN(do_kvm_##n); \

arch/powerpc/kernel/exceptions-64s.S

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -691,20 +691,26 @@ EXC_REAL_BEGIN(hardware_interrupt, 0x500, 0x100)
691691
hardware_interrupt_hv:
692692
BEGIN_FTR_SECTION
693693
_MASKABLE_EXCEPTION_PSERIES(0x500, hardware_interrupt_common,
694-
EXC_HV, SOFTEN_TEST_HV)
694+
EXC_HV, SOFTEN_TEST_HV,
695+
IRQS_DISABLED)
695696
FTR_SECTION_ELSE
696697
_MASKABLE_EXCEPTION_PSERIES(0x500, hardware_interrupt_common,
697-
EXC_STD, SOFTEN_TEST_PR)
698+
EXC_STD, SOFTEN_TEST_PR,
699+
IRQS_DISABLED)
698700
ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
699701
EXC_REAL_END(hardware_interrupt, 0x500, 0x100)
700702

701703
EXC_VIRT_BEGIN(hardware_interrupt, 0x4500, 0x100)
702704
.globl hardware_interrupt_relon_hv;
703705
hardware_interrupt_relon_hv:
704706
BEGIN_FTR_SECTION
705-
_MASKABLE_RELON_EXCEPTION_PSERIES(0x500, hardware_interrupt_common, EXC_HV, SOFTEN_TEST_HV)
707+
_MASKABLE_RELON_EXCEPTION_PSERIES(0x500, hardware_interrupt_common,
708+
EXC_HV, SOFTEN_TEST_HV,
709+
IRQS_DISABLED)
706710
FTR_SECTION_ELSE
707-
_MASKABLE_RELON_EXCEPTION_PSERIES(0x500, hardware_interrupt_common, EXC_STD, SOFTEN_TEST_PR)
711+
_MASKABLE_RELON_EXCEPTION_PSERIES(0x500, hardware_interrupt_common,
712+
EXC_STD, SOFTEN_TEST_PR,
713+
IRQS_DISABLED)
708714
ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
709715
EXC_VIRT_END(hardware_interrupt, 0x4500, 0x100)
710716

@@ -800,8 +806,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_TM)
800806
#endif
801807

802808

803-
EXC_REAL_MASKABLE(decrementer, 0x900, 0x80)
804-
EXC_VIRT_MASKABLE(decrementer, 0x4900, 0x80, 0x900)
809+
EXC_REAL_MASKABLE(decrementer, 0x900, 0x80, IRQS_DISABLED)
810+
EXC_VIRT_MASKABLE(decrementer, 0x4900, 0x80, 0x900, IRQS_DISABLED)
805811
TRAMP_KVM(PACA_EXGEN, 0x900)
806812
EXC_COMMON_ASYNC(decrementer_common, 0x900, timer_interrupt)
807813

@@ -812,8 +818,8 @@ TRAMP_KVM_HV(PACA_EXGEN, 0x980)
812818
EXC_COMMON(hdecrementer_common, 0x980, hdec_interrupt)
813819

814820

815-
EXC_REAL_MASKABLE(doorbell_super, 0xa00, 0x100)
816-
EXC_VIRT_MASKABLE(doorbell_super, 0x4a00, 0x100, 0xa00)
821+
EXC_REAL_MASKABLE(doorbell_super, 0xa00, 0x100, IRQS_DISABLED)
822+
EXC_VIRT_MASKABLE(doorbell_super, 0x4a00, 0x100, 0xa00, IRQS_DISABLED)
817823
TRAMP_KVM(PACA_EXGEN, 0xa00)
818824
#ifdef CONFIG_PPC_DOORBELL
819825
EXC_COMMON_ASYNC(doorbell_super_common, 0xa00, doorbell_exception)
@@ -1025,7 +1031,7 @@ EXC_COMMON(emulation_assist_common, 0xe40, emulation_assist_interrupt)
10251031
* mode.
10261032
*/
10271033
__EXC_REAL_OOL_HV_DIRECT(hmi_exception, 0xe60, 0x20, hmi_exception_early)
1028-
__TRAMP_REAL_OOL_MASKABLE_HV(hmi_exception, 0xe60)
1034+
__TRAMP_REAL_OOL_MASKABLE_HV(hmi_exception, 0xe60, IRQS_DISABLED)
10291035
EXC_VIRT_NONE(0x4e60, 0x20)
10301036
TRAMP_KVM_HV(PACA_EXGEN, 0xe60)
10311037
TRAMP_REAL_BEGIN(hmi_exception_early)
@@ -1083,8 +1089,8 @@ EXC_COMMON_BEGIN(hmi_exception_common)
10831089
EXCEPTION_COMMON(PACA_EXGEN, 0xe60, hmi_exception_common, handle_hmi_exception,
10841090
ret_from_except, FINISH_NAP;ADD_NVGPRS;ADD_RECONCILE;RUNLATCH_ON)
10851091

1086-
EXC_REAL_OOL_MASKABLE_HV(h_doorbell, 0xe80, 0x20)
1087-
EXC_VIRT_OOL_MASKABLE_HV(h_doorbell, 0x4e80, 0x20, 0xe80)
1092+
EXC_REAL_OOL_MASKABLE_HV(h_doorbell, 0xe80, 0x20, IRQS_DISABLED)
1093+
EXC_VIRT_OOL_MASKABLE_HV(h_doorbell, 0x4e80, 0x20, 0xe80, IRQS_DISABLED)
10881094
TRAMP_KVM_HV(PACA_EXGEN, 0xe80)
10891095
#ifdef CONFIG_PPC_DOORBELL
10901096
EXC_COMMON_ASYNC(h_doorbell_common, 0xe80, doorbell_exception)
@@ -1093,8 +1099,8 @@ EXC_COMMON_ASYNC(h_doorbell_common, 0xe80, unknown_exception)
10931099
#endif
10941100

10951101

1096-
EXC_REAL_OOL_MASKABLE_HV(h_virt_irq, 0xea0, 0x20)
1097-
EXC_VIRT_OOL_MASKABLE_HV(h_virt_irq, 0x4ea0, 0x20, 0xea0)
1102+
EXC_REAL_OOL_MASKABLE_HV(h_virt_irq, 0xea0, 0x20, IRQS_DISABLED)
1103+
EXC_VIRT_OOL_MASKABLE_HV(h_virt_irq, 0x4ea0, 0x20, 0xea0, IRQS_DISABLED)
10981104
TRAMP_KVM_HV(PACA_EXGEN, 0xea0)
10991105
EXC_COMMON_ASYNC(h_virt_irq_common, 0xea0, do_IRQ)
11001106

0 commit comments

Comments
 (0)