Message ID | 20180321163235.12529-29-andre.przywara@linaro.org |
---|---|
State | New |
Headers | show |
Series | New VGIC(-v2) implementation | expand |
On Wed, 21 Mar 2018, Andre Przywara wrote: > The Xen core/arch code relies on two abstracted functions to inject an > event channel IRQ and to query its pending state. > Implement those to query the state of the new VGIC implementation. > > Signed-off-by: Andre Przywara <andre.przywara@linaro.org> > Acked-by: Julien Grall <julien.grall@arm.com> Acked-by: Stefano Stabellini <sstabellini@kernel.org> > --- > xen/arch/arm/vgic/vgic.c | 23 +++++++++++++++++++++++ > 1 file changed, 23 insertions(+) > > diff --git a/xen/arch/arm/vgic/vgic.c b/xen/arch/arm/vgic/vgic.c > index 07866d7243..3d818a98ad 100644 > --- a/xen/arch/arm/vgic/vgic.c > +++ b/xen/arch/arm/vgic/vgic.c > @@ -699,6 +699,29 @@ void vgic_kick_vcpus(struct domain *d) > } > } > > +void arch_evtchn_inject(struct vcpu *v) > +{ > + vgic_inject_irq(v->domain, v, v->domain->arch.evtchn_irq, true); > +} > + > +bool vgic_evtchn_irq_pending(struct vcpu *v) > +{ > + struct vgic_irq *irq; > + unsigned long flags; > + bool pending; > + > + /* Does not work for LPIs. */ > + ASSERT(!is_lpi(v->domain->arch.evtchn_irq)); > + > + irq = vgic_get_irq(v->domain, v, v->domain->arch.evtchn_irq); > + spin_lock_irqsave(&irq->irq_lock, flags); > + pending = irq_is_pending(irq); > + spin_unlock_irqrestore(&irq->irq_lock, flags); > + vgic_put_irq(v->domain, irq); > + > + return pending; > +} > + > struct irq_desc *vgic_get_hw_irq_desc(struct domain *d, struct vcpu *v, > unsigned int virq) > { > -- > 2.14.1 >
diff --git a/xen/arch/arm/vgic/vgic.c b/xen/arch/arm/vgic/vgic.c index 07866d7243..3d818a98ad 100644 --- a/xen/arch/arm/vgic/vgic.c +++ b/xen/arch/arm/vgic/vgic.c @@ -699,6 +699,29 @@ void vgic_kick_vcpus(struct domain *d) } } +void arch_evtchn_inject(struct vcpu *v) +{ + vgic_inject_irq(v->domain, v, v->domain->arch.evtchn_irq, true); +} + +bool vgic_evtchn_irq_pending(struct vcpu *v) +{ + struct vgic_irq *irq; + unsigned long flags; + bool pending; + + /* Does not work for LPIs. */ + ASSERT(!is_lpi(v->domain->arch.evtchn_irq)); + + irq = vgic_get_irq(v->domain, v, v->domain->arch.evtchn_irq); + spin_lock_irqsave(&irq->irq_lock, flags); + pending = irq_is_pending(irq); + spin_unlock_irqrestore(&irq->irq_lock, flags); + vgic_put_irq(v->domain, irq); + + return pending; +} + struct irq_desc *vgic_get_hw_irq_desc(struct domain *d, struct vcpu *v, unsigned int virq) {