Skip to content

Commit 3f1f323

Browse files
Julien Thierryctmarinas
authored andcommitted
irqchip/gic-v3: Switch to PMR masking before calling IRQ handler
Mask the IRQ priority through PMR and re-enable IRQs at CPU level, allowing only higher priority interrupts to be received during interrupt handling. Signed-off-by: Julien Thierry <[email protected]> Acked-by: Catalin Marinas <[email protected]> Acked-by: Marc Zyngier <[email protected]> Cc: Will Deacon <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: Jason Cooper <[email protected]> Cc: Marc Zyngier <[email protected]> Signed-off-by: Catalin Marinas <[email protected]>
1 parent e99da7c commit 3f1f323

File tree

3 files changed

+39
-0
lines changed

3 files changed

+39
-0
lines changed

arch/arm/include/asm/arch_gicv3.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,5 +363,22 @@ static inline void gits_write_vpendbaser(u64 val, void * __iomem addr)
363363

364364
#define gits_read_vpendbaser(c) __gic_readq_nonatomic(c)
365365

366+
static inline bool gic_prio_masking_enabled(void)
367+
{
368+
return false;
369+
}
370+
371+
static inline void gic_pmr_mask_irqs(void)
372+
{
373+
/* Should not get called. */
374+
WARN_ON_ONCE(true);
375+
}
376+
377+
static inline void gic_arch_enable_irqs(void)
378+
{
379+
/* Should not get called. */
380+
WARN_ON_ONCE(true);
381+
}
382+
366383
#endif /* !__ASSEMBLY__ */
367384
#endif /* !__ASM_ARCH_GICV3_H */

arch/arm64/include/asm/arch_gicv3.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,5 +155,22 @@ static inline u32 gic_read_rpr(void)
155155
#define gits_write_vpendbaser(v, c) writeq_relaxed(v, c)
156156
#define gits_read_vpendbaser(c) readq_relaxed(c)
157157

158+
static inline bool gic_prio_masking_enabled(void)
159+
{
160+
return system_uses_irq_prio_masking();
161+
}
162+
163+
static inline void gic_pmr_mask_irqs(void)
164+
{
165+
/* Should not get called yet. */
166+
WARN_ON_ONCE(true);
167+
}
168+
169+
static inline void gic_arch_enable_irqs(void)
170+
{
171+
/* Should not get called yet. */
172+
WARN_ON_ONCE(true);
173+
}
174+
158175
#endif /* __ASSEMBLY__ */
159176
#endif /* __ASM_ARCH_GICV3_H */

drivers/irqchip/irq-gic-v3.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,11 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs
356356

357357
irqnr = gic_read_iar();
358358

359+
if (gic_prio_masking_enabled()) {
360+
gic_pmr_mask_irqs();
361+
gic_arch_enable_irqs();
362+
}
363+
359364
if (likely(irqnr > 15 && irqnr < 1020) || irqnr >= 8192) {
360365
int err;
361366

0 commit comments

Comments
 (0)