diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c index 204e0d9580..c097bd4393 100644 --- a/xen/arch/arm/vgic.c +++ b/xen/arch/arm/vgic.c @@ -62,10 +62,14 @@ struct vgic_irq_rank *vgic_rank_irq(struct vcpu *v, unsigned int irq) void vgic_init_pending_irq(struct pending_irq *p, unsigned int virq) { + /* The lpi_vcpu_id field must be big enough to hold a VCPU ID. */ + BUILD_BUG_ON(BIT(sizeof(p->lpi_vcpu_id) * 8) < MAX_VIRT_CPUS); + memset(p, 0, sizeof(*p)); INIT_LIST_HEAD(&p->inflight); INIT_LIST_HEAD(&p->lr_queue); p->irq = virq; + p->lpi_vcpu_id = INVALID_VCPU_ID; } static void vgic_rank_init(struct vgic_irq_rank *rank, uint8_t index, diff --git a/xen/include/asm-arm/vgic.h b/xen/include/asm-arm/vgic.h index d1fcea1e27..33b2fb5761 100644 --- a/xen/include/asm-arm/vgic.h +++ b/xen/include/asm-arm/vgic.h @@ -73,6 +73,7 @@ struct pending_irq uint8_t lr; uint8_t priority; uint8_t lpi_priority; /* Caches the priority if this is an LPI. */ + uint8_t lpi_vcpu_id; /* The VCPU for an LPI. */ /* inflight is used to append instances of pending_irq to * vgic.inflight_irqs */ struct list_head inflight;