diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c index e80fe0ca24..4bb11960ee 100644 --- a/xen/arch/arm/gic.c +++ b/xen/arch/arm/gic.c @@ -111,7 +111,8 @@ static void gic_set_irq_priority(struct irq_desc *desc, unsigned int priority) void gic_route_irq_to_xen(struct irq_desc *desc, unsigned int priority) { ASSERT(priority <= 0xff); /* Only 8 bits of priority */ - ASSERT(desc->irq < gic_number_lines());/* Can't route interrupts that don't exist */ + /* Can't route interrupts that don't exist */ + ASSERT(gic_is_valid_line(desc->irq)); ASSERT(test_bit(_IRQ_DISABLED, &desc->status)); ASSERT(spin_is_locked(&desc->lock)); diff --git a/xen/arch/arm/include/asm/gic.h b/xen/arch/arm/include/asm/gic.h index 541f0eeb80..3fcee42675 100644 --- a/xen/arch/arm/include/asm/gic.h +++ b/xen/arch/arm/include/asm/gic.h @@ -306,6 +306,15 @@ extern void gic_dump_vgic_info(struct vcpu *v); /* Number of interrupt lines */ extern unsigned int gic_number_lines(void); +static inline bool gic_is_valid_line(unsigned int irq) +{ + return irq < gic_number_lines(); +} + +static inline bool gic_is_spi(unsigned int irq) +{ + return irq >= NR_LOCAL_IRQS && gic_is_valid_line(irq); +} /* IRQ translation function for the device tree */ int gic_irq_xlate(const u32 *intspec, unsigned int intsize, diff --git a/xen/arch/arm/irq.c b/xen/arch/arm/irq.c index 02ca82c089..29524e5d53 100644 --- a/xen/arch/arm/irq.c +++ b/xen/arch/arm/irq.c @@ -418,7 +418,7 @@ err: bool is_assignable_irq(unsigned int irq) { /* For now, we can only route SPIs to the guest */ - return (irq >= NR_LOCAL_IRQS) && (irq < gic_number_lines()); + return gic_is_spi(irq); } /*