diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c index 78ad4de..576512e 100644 --- a/xen/arch/arm/gic-v2.c +++ b/xen/arch/arm/gic-v2.c @@ -395,7 +395,7 @@ static void gicv2_update_lr(int lr, const struct pending_irq *p, << GICH_V2_LR_PRIORITY_SHIFT) | ((p->irq & GICH_V2_LR_VIRTUAL_MASK) << GICH_V2_LR_VIRTUAL_SHIFT)); - if ( p->desc != NULL ) + if ( p->desc != NULL && !is_lpi(p->irq) ) { if ( platform_has_quirk(PLATFORM_QUIRK_GUEST_PIRQ_NEED_EOI) ) lr_reg |= GICH_V2_LR_MAINTENANCE_IRQ; diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c index 6611ba0..74e2ab4 100644 --- a/xen/arch/arm/gic.c +++ b/xen/arch/arm/gic.c @@ -343,7 +343,7 @@ static void gic_update_one_lr(struct vcpu *v, int i) if ( test_bit(GIC_IRQ_GUEST_ENABLED, &p->status) && test_and_clear_bit(GIC_IRQ_GUEST_QUEUED, &p->status) ) { - if ( p->desc == NULL ) + if ( p->desc == NULL || is_lpi(irq) ) { lr_val.state |= GICH_LR_PENDING; gic_hw_ops->write_lr(i, &lr_val); diff --git a/xen/include/asm-arm/gic.h b/xen/include/asm-arm/gic.h index a0c07bf..1b3b0fc 100644 --- a/xen/include/asm-arm/gic.h +++ b/xen/include/asm-arm/gic.h @@ -154,6 +154,11 @@ #define DT_MATCH_GIC_V2 DT_MATCH_COMPATIBLE(DT_COMPAT_GIC_CORTEX_A15), \ DT_MATCH_COMPATIBLE(DT_COMPAT_GIC_CORTEX_A7) +static inline bool_t is_lpi(int irq) +{ + return irq >= 8192; +} + /* * GICv2 register that needs to be saved/restored * on VCPU context switch