71 lines
2.1 KiB
Diff
71 lines
2.1 KiB
Diff
|
|
From 4ef1b086272552378c09356b0e9fd2548a27a621 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
|
Date: Wed, 5 Jun 2024 16:30:43 +0800
|
||
|
|
Subject: [PATCH] intel_iommu: Check compatibility with host IOMMU capabilities
|
||
|
|
|
||
|
|
If check fails, host device (either VFIO or VDPA device) is not
|
||
|
|
compatible with current vIOMMU config and should not be passed to
|
||
|
|
guest.
|
||
|
|
|
||
|
|
Only aw_bits is checked for now, we don't care about other caps
|
||
|
|
before scalable modern mode is introduced.
|
||
|
|
|
||
|
|
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
|
||
|
|
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
|
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
||
|
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||
|
|
---
|
||
|
|
hw/i386/intel_iommu.c | 29 +++++++++++++++++++++++++++++
|
||
|
|
1 file changed, 29 insertions(+)
|
||
|
|
|
||
|
|
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
|
||
|
|
index bdc14f8438..60d86e0cb6 100644
|
||
|
|
--- a/hw/i386/intel_iommu.c
|
||
|
|
+++ b/hw/i386/intel_iommu.c
|
||
|
|
@@ -3838,6 +3838,30 @@ VTDAddressSpace *vtd_find_add_as(IntelIOMMUState *s, PCIBus *bus,
|
||
|
|
return vtd_dev_as;
|
||
|
|
}
|
||
|
|
|
||
|
|
+static bool vtd_check_hiod(IntelIOMMUState *s, HostIOMMUDevice *hiod,
|
||
|
|
+ Error **errp)
|
||
|
|
+{
|
||
|
|
+ HostIOMMUDeviceClass *hiodc = HOST_IOMMU_DEVICE_GET_CLASS(hiod);
|
||
|
|
+ int ret;
|
||
|
|
+
|
||
|
|
+ if (!hiodc->get_cap) {
|
||
|
|
+ error_setg(errp, ".get_cap() not implemented");
|
||
|
|
+ return false;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ /* Common checks */
|
||
|
|
+ ret = hiodc->get_cap(hiod, HOST_IOMMU_DEVICE_CAP_AW_BITS, errp);
|
||
|
|
+ if (ret < 0) {
|
||
|
|
+ return false;
|
||
|
|
+ }
|
||
|
|
+ if (s->aw_bits > ret) {
|
||
|
|
+ error_setg(errp, "aw-bits %d > host aw-bits %d", s->aw_bits, ret);
|
||
|
|
+ return false;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ return true;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
static bool vtd_dev_set_iommu_device(PCIBus *bus, void *opaque, int devfn,
|
||
|
|
HostIOMMUDevice *hiod, Error **errp)
|
||
|
|
{
|
||
|
|
@@ -3858,6 +3882,11 @@ static bool vtd_dev_set_iommu_device(PCIBus *bus, void *opaque, int devfn,
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
+ if (!vtd_check_hiod(s, hiod, errp)) {
|
||
|
|
+ vtd_iommu_unlock(s);
|
||
|
|
+ return false;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
new_key = g_malloc(sizeof(*new_key));
|
||
|
|
new_key->bus = bus;
|
||
|
|
new_key->devfn = devfn;
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|