[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v5 17/22] xen/arm: vsmmuv3: Add support to send stage-1 event to guest


  • To: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Milan Djokic <milan_djokic@xxxxxxxx>
  • Date: Tue, 3 Nov 2026 17:30:50 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=epam.com; dmarc=pass action=none header.from=epam.com; dkim=pass header.d=epam.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1KCpdXRKAXdQEdm2NQv0CErWiAD2OMKxubJ598FQNOM=; b=DJWjaCD8reyct6VsBzzihmqxYJ4hDeu5ME3ho2505WdJcNedt1yOi89HKZUdU9n6UKg6TYL6b6oOcaiN5GVi+z9mvvUhxN/wjlMfaRmc9Twv+yKgF1ADKjdEPsPMU7FPovEha0u7mN7dWNVhoXOh5vuRGTcPdiGYyZv098021afFKHdiUD/MwqKcbW/nF3a+rBaiI41AneemVpNQxw8OvKOI0KNypB+Vc64ex0RTS/VWYFYhh89+BDO8xJf01vhfvEO3J4Gnpo9IM54RnDS387UlQPy/tMZM8HurL2YvloY2eDaahOmWNUTpDU6qJsgcP6dEJK3pA7LpNRq6YcMSVA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=SXJe94yEhT+FQ7Mx/GEmy5YfQsRvWCAOc6KmTX/qXtoNHDv7jr2NCJehiQJr051lSqqEHG95K+iX7YXwPRaUVK9ounbY9wU1kRe2e2eNR8XqgTgXrAXECXUJixaodi52ttbcjqr49bCNdvyMTpfBjj/O6FS+iEtsyCBm1yzTx/ghNmBv0uY4HJGwe+mmgEAHVVOgIjhnC99JEpiOMFkTBLZTWWTOeG2FdZt5gvXUmSc3GYxpMORQ/waDNp65SXd3YhWMWGjNXWmRNViGycK+57L4CCU2ssSOeE1YFXPW464nv1mNWZYau6u7BeRjIverYJ8hALTTaFf45eFbHrjFag==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=epam.com header.i="@epam.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:x-ms-exchange-senderadcheck"
  • Authentication-results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=epam.com;
  • Cc: Rahul Singh <rahul.singh@xxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>, Milan Djokic <milan_djokic@xxxxxxxx>
  • Delivery-date: Tue, 03 Nov 2026 17:30:54 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Thread-index: AQHda7kRgq+8QDTpUk6bKfQWFvQtuw==
  • Thread-topic: [PATCH v5 17/22] xen/arm: vsmmuv3: Add support to send stage-1 event to guest

From: Rahul Singh <rahul.singh@xxxxxxx>

Stage-1 translation is handled by guest, therefore stage-1 fault has to
be forwarded to guest.

Signed-off-by: Rahul Singh <rahul.singh@xxxxxxx>
Signed-off-by: Milan Djokic <milan_djokic@xxxxxxxx>
---
 xen/drivers/passthrough/arm/smmu-v3.c  | 45 ++++++++++++++++++++++++--
 xen/drivers/passthrough/arm/vsmmu-v3.c | 44 +++++++++++++++++++++++++
 xen/drivers/passthrough/arm/vsmmu-v3.h |  8 +++++
 3 files changed, 95 insertions(+), 2 deletions(-)

diff --git a/xen/drivers/passthrough/arm/smmu-v3.c 
b/xen/drivers/passthrough/arm/smmu-v3.c
index 4f95b5206e..f213b3de12 100644
--- a/xen/drivers/passthrough/arm/smmu-v3.c
+++ b/xen/drivers/passthrough/arm/smmu-v3.c
@@ -871,7 +871,6 @@ static int arm_smmu_init_l2_strtab(struct arm_smmu_device 
*smmu, u32 sid)
        return 0;
 }
 
-__maybe_unused
 static struct arm_smmu_master *
 arm_smmu_find_master(struct arm_smmu_device *smmu, u32 sid)
 {
@@ -892,10 +891,48 @@ arm_smmu_find_master(struct arm_smmu_device *smmu, u32 
sid)
        return NULL;
 }
 
+static int arm_smmu_handle_evt(struct arm_smmu_device *smmu, u64 *evt)
+{
+       int ret = 0;
+       struct arm_smmu_master *master;
+       u32 sid = FIELD_GET(EVTQ_0_SID, evt[0]);
+
+       switch (FIELD_GET(EVTQ_0_ID, evt[0])) {
+       case EVT_ID_TRANSLATION_FAULT:
+               break;
+       case EVT_ID_ADDR_SIZE_FAULT:
+               break;
+       case EVT_ID_ACCESS_FAULT:
+               break;
+       case EVT_ID_PERMISSION_FAULT:
+               break;
+       default:
+               return -EOPNOTSUPP;
+       }
+
+       /* Stage-2 event */
+       if (evt[1] & EVTQ_1_S2)
+               return -EFAULT;
+
+       mutex_lock(&smmu->streams_mutex);
+       master = arm_smmu_find_master(smmu, sid);
+       if (!master) {
+               ret = -EINVAL;
+               goto out_unlock;
+       }
+
+       if (master->domain)
+               ret = arm_vsmmu_handle_evt(master->domain->d, smmu->dev, evt);
+
+out_unlock:
+       mutex_unlock(&smmu->streams_mutex);
+       return ret;
+}
+
 /* IRQ and event handlers */
 static void arm_smmu_evtq_tasklet(void *dev)
 {
-       int i;
+       int i, ret;
        struct arm_smmu_device *smmu = dev;
        struct arm_smmu_queue *q = &smmu->evtq.q;
        struct arm_smmu_ll_queue *llq = &q->llq;
@@ -905,6 +942,10 @@ static void arm_smmu_evtq_tasklet(void *dev)
                while (!queue_remove_raw(q, evt)) {
                        u8 id = FIELD_GET(EVTQ_0_ID, evt[0]);
 
+                       ret = arm_smmu_handle_evt(smmu, evt);
+                       if (!ret)
+                               continue;
+
                        dev_info(smmu->dev, "event 0x%02x received:\n", id);
                        for (i = 0; i < ARRAY_SIZE(evt); ++i)
                                dev_info(smmu->dev, "\t0x%016llx\n",
diff --git a/xen/drivers/passthrough/arm/vsmmu-v3.c 
b/xen/drivers/passthrough/arm/vsmmu-v3.c
index 17e83dcb1a..24588affe9 100644
--- a/xen/drivers/passthrough/arm/vsmmu-v3.c
+++ b/xen/drivers/passthrough/arm/vsmmu-v3.c
@@ -347,6 +347,49 @@ static void arm_vsmmu_send_event(struct virt_smmu *smmu,
     return;
 }
 
+static struct virt_smmu *vsmmuv3_find_by_addr(struct domain *d, paddr_t paddr)
+{
+    struct virt_smmu *smmu;
+
+    list_for_each_entry( smmu, &d->arch.viommu_list, viommu_list )
+    {
+        if ( smmu->addr == paddr )
+            return smmu;
+    }
+
+    return NULL;
+}
+
+int arm_vsmmu_handle_evt(struct domain *d, struct device *dev, uint64_t *evt)
+{
+    int ret;
+    struct virt_smmu *smmu;
+
+    if ( domain_use_host_layout(d) )
+    {
+        paddr_t paddr;
+        /* Base address */
+        ret = dt_device_get_address(dev_to_dt(dev), 0, &paddr, NULL);
+        if ( ret )
+            return -EINVAL;
+
+        smmu = vsmmuv3_find_by_addr(d, paddr);
+        if ( !smmu )
+            return -ENODEV;
+    }
+    else
+    {
+        smmu = list_entry(d->arch.viommu_list.next,
+                          struct virt_smmu, viommu_list);
+    }
+
+    ret = arm_vsmmu_write_evtq(smmu, evt);
+    if ( ret )
+        arm_vsmmu_set_gerror(smmu, GERROR_EVTQ_ABT_ERR);
+
+    return 0;
+}
+
 static int arm_vsmmu_find_ste(struct virt_smmu *smmu, uint32_t sid,
                               uint64_t *ste)
 {
@@ -1142,6 +1185,7 @@ static int vsmmuv3_init_single(struct domain *d, paddr_t 
addr,
     smmu->d = d;
     smmu->features = features;
     smmu->virq = virq;
+    smmu->addr = addr;
     smmu->cmdq.ent_size = CMDQ_ENT_DWORDS * DWORDS_BYTES;
     smmu->evtq.ent_size = EVTQ_ENT_DWORDS * DWORDS_BYTES;
 
diff --git a/xen/drivers/passthrough/arm/vsmmu-v3.h 
b/xen/drivers/passthrough/arm/vsmmu-v3.h
index 9f4c86abd5..d4b7cf805f 100644
--- a/xen/drivers/passthrough/arm/vsmmu-v3.h
+++ b/xen/drivers/passthrough/arm/vsmmu-v3.h
@@ -8,6 +8,8 @@
 
 void vsmmuv3_set_type(void);
 
+int arm_vsmmu_handle_evt(struct domain *d, struct device *dev, uint64_t *evt);
+
 #else
 
 static inline void __init vsmmuv3_set_type(void)
@@ -15,6 +17,12 @@ static inline void __init vsmmuv3_set_type(void)
     return;
 }
 
+static inline int arm_vsmmu_handle_evt(struct domain *d,
+                                       struct device *dev, uint64_t *evt)
+{
+    return -EINVAL;
+}
+
 #endif /* CONFIG_VIRTUAL_ARM_SMMU_V3 */
 
 #endif /* __ARCH_ARM_VSMMU_V3_H__ */
-- 
2.43.0



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.