diff --git a/xen/arch/x86/io_apic.c b/xen/arch/x86/io_apic.c index 976c0c58c5..6f66562b4f 100644 --- a/xen/arch/x86/io_apic.c +++ b/xen/arch/x86/io_apic.c @@ -2614,6 +2614,10 @@ unsigned int arch_hwdom_irqs(domid_t domid) if ( !domid ) n = min(n, dom0_max_vcpus()); n = min(nr_irqs_gsi + n * NR_DYNAMIC_VECTORS, nr_irqs); + + /* Bounded by the domain pirq eoi bitmap gfn. */ + n = min_t(unsigned int, n, PAGE_SIZE * BITS_PER_BYTE); + printk("Dom%d has maximum %u PIRQs\n", domid, n); return n; diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index 1a219174cc..fe1ee333b8 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -1073,13 +1073,19 @@ bool_t cpu_has_pending_apic_eoi(void) static inline void set_pirq_eoi(struct domain *d, unsigned int irq) { if ( d->arch.pirq_eoi_map ) + { + ASSERT(irq < PAGE_SIZE * BITS_PER_BYTE); set_bit(irq, d->arch.pirq_eoi_map); + } } static inline void clear_pirq_eoi(struct domain *d, unsigned int irq) { if ( d->arch.pirq_eoi_map ) + { + ASSERT(irq < PAGE_SIZE * BITS_PER_BYTE); clear_bit(irq, d->arch.pirq_eoi_map); + } } static void set_eoi_ready(void *data);