[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH v2 13/26] ARM: vGICv3: Handle disabled LPIs
If a guest disables an LPI, we do not forward this to the associated host LPI to avoid queueing commands to the host ITS command queue. So it may happen that an LPI fires nevertheless on the host. In this case we can bail out early, but have to save the pending state on the virtual side. Signed-off-by: Andre Przywara <andre.przywara@xxxxxxx> --- xen/arch/arm/gic-its.c | 8 ++++++++ xen/arch/arm/vgic-v3.c | 12 ++++++++++++ xen/include/asm-arm/vgic.h | 1 + 3 files changed, 21 insertions(+) diff --git a/xen/arch/arm/gic-its.c b/xen/arch/arm/gic-its.c index 602e19a..54e604a 100644 --- a/xen/arch/arm/gic-its.c +++ b/xen/arch/arm/gic-its.c @@ -104,6 +104,14 @@ void do_LPI(unsigned int lpi) vcpu = d->vcpu[hlpi.vcpu_id]; + /* + * We keep all host LPIs enabled, so check if it's disabled on the guest + * side and just record this LPI in the virtual pending table in this case. + * The guest picks it up once it gets enabled again. + */ + if ( !vgic_can_inject_lpi(vcpu, hlpi.virt_lpi) ) + return; + vgic_vcpu_inject_irq(vcpu, hlpi.virt_lpi); } diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c index b981d4e..206e00b 100644 --- a/xen/arch/arm/vgic-v3.c +++ b/xen/arch/arm/vgic-v3.c @@ -483,6 +483,18 @@ bool vgic_lpi_is_enabled(struct domain *d, uint32_t vlpi) return d->arch.vgic.proptable[vlpi - 8192] & LPI_PROP_ENABLED; } +bool vgic_can_inject_lpi(struct vcpu *vcpu, uint32_t vlpi) +{ + if ( vlpi >= vcpu->domain->arch.vgic.nr_lpis ) + return false; + + if ( vgic_lpi_is_enabled(vcpu->domain, vlpi) ) + return true; + + set_bit(vlpi - 8192, vcpu->arch.vgic.pendtable); + return false; +} + static int __vgic_v3_rdistr_rd_mmio_write(struct vcpu *v, mmio_info_t *info, uint32_t gicr_reg, register_t r) diff --git a/xen/include/asm-arm/vgic.h b/xen/include/asm-arm/vgic.h index 1c157d3..73291dd 100644 --- a/xen/include/asm-arm/vgic.h +++ b/xen/include/asm-arm/vgic.h @@ -317,6 +317,7 @@ extern void vgic_disable_irqs(struct vcpu *v, uint32_t r, int n); extern void vgic_enable_irqs(struct vcpu *v, uint32_t r, int n); extern bool vgic_lpi_is_enabled(struct domain *d, uint32_t vlpi); extern int vgic_lpi_get_priority(struct domain *d, uint32_t vlpi); +extern bool vgic_can_inject_lpi(struct vcpu *v, uint32_t vlpi); extern void register_vgic_ops(struct domain *d, const struct vgic_ops *ops); int vgic_v2_init(struct domain *d, int *mmio_count); int vgic_v3_init(struct domain *d, int *mmio_count); -- 2.9.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |