|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 1/2] arm: vgic: Add the ability to trigger MSIs from the Hypervisor
From: Mykyta Poturai <Mykyta_Poturai@xxxxxxxx>
Add the vgic_its_trigger_msi() function to the vgic interface. This
function allows to inject MSIs from the Hypervisor to the guest.
Which is useful for userspace PCI backend drivers.
Signed-off-by: Mykyta Poturai <mykyta_poturai@xxxxxxxx>
---
v1->v2:
* replace -1 with -ENOENT
* reduce guest memory access in vgic_its_trigger_msi
---
xen/arch/arm/include/asm/vgic.h | 11 +++++++++++
xen/arch/arm/vgic-v3-its.c | 19 +++++++++++++++++++
2 files changed, 30 insertions(+)
diff --git a/xen/arch/arm/include/asm/vgic.h b/xen/arch/arm/include/asm/vgic.h
index e309dca1ad..3d8e3a8343 100644
--- a/xen/arch/arm/include/asm/vgic.h
+++ b/xen/arch/arm/include/asm/vgic.h
@@ -318,6 +318,17 @@ extern bool vgic_migrate_irq(struct vcpu *old, struct vcpu
*new, unsigned int ir
extern void vgic_check_inflight_irqs_pending(struct vcpu *v,
unsigned int rank, uint32_t r);
+#ifdef CONFIG_HAS_ITS
+int vgic_its_trigger_msi(struct domain *d, paddr_t doorbell_address,
+ u32 devid, u32 eventid);
+#else
+static inline int vgic_its_trigger_msi(struct domain *d, paddr_t
doorbell_address,
+ u32 devid, u32 eventid)
+{
+ return -EOPNOTSUPP;
+}
+#endif /* CONFIG_HAS_ITS */
+
#endif /* !CONFIG_NEW_VGIC */
/*** Common VGIC functions used by Xen arch code ****/
diff --git a/xen/arch/arm/vgic-v3-its.c b/xen/arch/arm/vgic-v3-its.c
index c65c1dbf52..be5bfe0d21 100644
--- a/xen/arch/arm/vgic-v3-its.c
+++ b/xen/arch/arm/vgic-v3-its.c
@@ -1484,6 +1484,25 @@ static int vgic_v3_its_init_virtual(struct domain *d,
paddr_t guest_addr,
return 0;
}
+int vgic_its_trigger_msi(struct domain *d, paddr_t doorbell_address,
+ u32 devid, u32 eventid)
+{
+ struct pending_irq *pend;
+ unsigned int vcpu_id;
+
+ pend = gicv3_its_get_event_pending_irq(d,doorbell_address, devid, eventid);
+ if ( !pend )
+ return -ENOENT;
+
+ vcpu_id = ACCESS_ONCE(pend->lpi_vcpu_id);
+ if ( vcpu_id >= d->max_vcpus )
+ return -ENOENT;
+
+ vgic_inject_irq(d, d->vcpu[vcpu_id], pend->irq, true);
+
+ return 0;
+}
+
unsigned int vgic_v3_its_count(const struct domain *d)
{
struct host_its *hw_its;
--
2.34.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |