diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c index 4bb11960ee..9469c9d08c 100644 --- a/xen/arch/arm/gic.c +++ b/xen/arch/arm/gic.c @@ -134,8 +134,7 @@ int gic_route_irq_to_guest(struct domain *d, unsigned int virq, ASSERT(spin_is_locked(&desc->lock)); /* Caller has already checked that the IRQ is an SPI */ - ASSERT(virq >= 32); - ASSERT(virq < vgic_num_irqs(d)); + ASSERT(vgic_is_spi(d, virq)); ASSERT(!is_lpi(virq)); ret = vgic_connect_hw_irq(d, NULL, virq, desc, true); diff --git a/xen/arch/arm/include/asm/vgic.h b/xen/arch/arm/include/asm/vgic.h index 35c0c6a8b0..3e7cbbb196 100644 --- a/xen/arch/arm/include/asm/vgic.h +++ b/xen/arch/arm/include/asm/vgic.h @@ -335,6 +335,13 @@ extern void vgic_check_inflight_irqs_pending(struct vcpu *v, /* Default number of vGIC SPIs. 32 are substracted to cover local IRQs. */ #define VGIC_DEF_NR_SPIS (min(gic_number_lines(), VGIC_MAX_IRQS) - 32) +extern bool vgic_is_valid_line(struct domain *d, unsigned int virq); + +static inline bool vgic_is_spi(struct domain *d, unsigned int virq) +{ + return virq >= NR_LOCAL_IRQS && vgic_is_valid_line(d, virq); +} + /* * Allocate a guest VIRQ * - spi == 0 => allocate a PPI. It will be the same on every vCPU diff --git a/xen/arch/arm/irq.c b/xen/arch/arm/irq.c index 29524e5d53..0df1e0a7c1 100644 --- a/xen/arch/arm/irq.c +++ b/xen/arch/arm/irq.c @@ -445,7 +445,7 @@ int route_irq_to_guest(struct domain *d, unsigned int virq, unsigned long flags; int retval = 0; - if ( virq >= vgic_num_irqs(d) ) + if ( !vgic_is_valid_line(d, virq) ) { printk(XENLOG_G_ERR "the vIRQ number %u is too high for domain %u (max = %u)\n", @@ -563,7 +563,7 @@ int release_guest_irq(struct domain *d, unsigned int virq) int ret; /* Only SPIs are supported */ - if ( virq < NR_LOCAL_IRQS || virq >= vgic_num_irqs(d) ) + if ( !vgic_is_spi(d, virq) ) return -EINVAL; desc = vgic_get_hw_irq_desc(d, NULL, virq); diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c index c563ba93af..2bbf4d99aa 100644 --- a/xen/arch/arm/vgic.c +++ b/xen/arch/arm/vgic.c @@ -24,6 +24,12 @@ #include #include + +bool vgic_is_valid_line(struct domain *d, unsigned int virq) +{ + return virq < vgic_num_irqs(d); +} + static inline struct vgic_irq_rank *vgic_get_rank(struct vcpu *v, unsigned int rank) { @@ -582,7 +588,7 @@ void vgic_inject_irq(struct domain *d, struct vcpu *v, unsigned int virq, if ( !v ) { /* The IRQ needs to be an SPI if no vCPU is specified. */ - ASSERT(virq >= 32 && virq <= vgic_num_irqs(d)); + ASSERT(vgic_is_spi(d, virq)); v = vgic_get_target_vcpu(d->vcpu[0], virq); }; @@ -659,7 +665,7 @@ bool vgic_emulate(struct cpu_user_regs *regs, union hsr hsr) bool vgic_reserve_virq(struct domain *d, unsigned int virq) { - if ( virq >= vgic_num_irqs(d) ) + if ( !vgic_is_valid_line(d, virq) ) return false; return !test_and_set_bit(virq, d->arch.vgic.allocated_irqs); diff --git a/xen/arch/arm/vgic/vgic.c b/xen/arch/arm/vgic/vgic.c index 6cabd0496d..b2c0e1873a 100644 --- a/xen/arch/arm/vgic/vgic.c +++ b/xen/arch/arm/vgic/vgic.c @@ -718,6 +718,11 @@ bool vgic_reserve_virq(struct domain *d, unsigned int virq) return !test_and_set_bit(virq, d->arch.vgic.allocated_irqs); } +bool vgic_is_valid_line(struct domain *d, unsigned int virq) +{ + return virq < vgic_num_irqs(d); +} + int vgic_allocate_virq(struct domain *d, bool spi) { int first, end;