* Fri Nov 14 2025 Miroslav Rezanina <mrezanin@redhat.com> - 10.1.0-5
- kvm-io-move-websock-resource-release-to-close-method.patch [RHEL-120116] - kvm-io-fix-use-after-free-in-websocket-handshake-code.patch [RHEL-120116] - kvm-vfio-Disable-VFIO-migration-with-MultiFD-support.patch [RHEL-126573] - kvm-hw-arm-virt-Use-ACPI-PCI-hotplug-by-default-from-10..patch [RHEL-67323] - kvm-hw-arm-smmu-common-Check-SMMU-has-PCIe-Root-Complex-.patch [RHEL-73800] - kvm-hw-arm-virt-acpi-build-Re-arrange-SMMUv3-IORT-build.patch [RHEL-73800] - kvm-hw-arm-virt-acpi-build-Update-IORT-for-multiple-smmu.patch [RHEL-73800] - kvm-hw-arm-virt-Factor-out-common-SMMUV3-dt-bindings-cod.patch [RHEL-73800] - kvm-hw-arm-virt-Add-an-SMMU_IO_LEN-macro.patch [RHEL-73800] - kvm-hw-pci-Introduce-pci_setup_iommu_per_bus-for-per-bus.patch [RHEL-73800] - kvm-hw-arm-virt-Allow-user-creatable-SMMUv3-dev-instanti.patch [RHEL-73800] - kvm-qemu-options.hx-Document-the-arm-smmuv3-device.patch [RHEL-73800] - kvm-bios-tables-test-Allow-for-smmuv3-test-data.patch [RHEL-73800] - kvm-qtest-bios-tables-test-Add-tests-for-legacy-smmuv3-a.patch [RHEL-73800] - kvm-qtest-bios-tables-test-Update-tables-for-smmuv3-test.patch [RHEL-73800] - kvm-qtest-Do-not-run-bios-tables-test-on-aarch64.patch [] - Resolves: RHEL-120116 (CVE-2025-11234 qemu-kvm: VNC WebSocket handshake use-after-free [rhel-10.2]) - Resolves: RHEL-126573 (VFIO migration using multifd should be disabled by default) - Resolves: RHEL-67323 ([aarch64] Support ACPI based PCI hotplug on ARM) - Resolves: RHEL-73800 (NVIDIA:Grace-Hopper:Backport support for user-creatable nested SMMUv3 - RHEL 10.1)
This commit is contained in:
parent
9a3e1e2331
commit
321b8a8d36
54
kvm-bios-tables-test-Allow-for-smmuv3-test-data.patch
Normal file
54
kvm-bios-tables-test-Allow-for-smmuv3-test-data.patch
Normal file
@ -0,0 +1,54 @@
|
||||
From b4eeed1e8633df76598de0fe6ca5df4be359222c Mon Sep 17 00:00:00 2001
|
||||
From: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Date: Fri, 29 Aug 2025 09:25:31 +0100
|
||||
Subject: [PATCH 13/16] bios-tables-test: Allow for smmuv3 test data.
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 423: hw/arm/virt: Add support for user creatable SMMUv3 device
|
||||
RH-Jira: RHEL-73800
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Sebastian Ott <sebott@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Commit: [9/11] cf98e2e7589b794775c1d9c4f564e3cd536b886e (eauger1/centos-qemu-kvm)
|
||||
|
||||
The tests to be added exercise both legacy(iommu=smmuv3) and new
|
||||
-device arm-smmuv3,.. cases.
|
||||
|
||||
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
|
||||
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
||||
Signed-off-by: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Reviewed-by: Donald Dutile <ddutile@redhat.com>
|
||||
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Message-id: 20250829082543.7680-10-skolothumtho@nvidia.com
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
(cherry picked from commit c69520c13d6ea45a69a7a49361806fa05b19046d)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
tests/data/acpi/aarch64/virt/DSDT.smmuv3-dev | 0
|
||||
tests/data/acpi/aarch64/virt/DSDT.smmuv3-legacy | 0
|
||||
tests/data/acpi/aarch64/virt/IORT.smmuv3-dev | 0
|
||||
tests/data/acpi/aarch64/virt/IORT.smmuv3-legacy | 0
|
||||
tests/qtest/bios-tables-test-allowed-diff.h | 4 ++++
|
||||
5 files changed, 4 insertions(+)
|
||||
create mode 100644 tests/data/acpi/aarch64/virt/DSDT.smmuv3-dev
|
||||
create mode 100644 tests/data/acpi/aarch64/virt/DSDT.smmuv3-legacy
|
||||
create mode 100644 tests/data/acpi/aarch64/virt/IORT.smmuv3-dev
|
||||
create mode 100644 tests/data/acpi/aarch64/virt/IORT.smmuv3-legacy
|
||||
|
||||
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
|
||||
index dfb8523c8b..2e3e3ccdce 100644
|
||||
--- a/tests/qtest/bios-tables-test-allowed-diff.h
|
||||
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
|
||||
@@ -1 +1,5 @@
|
||||
/* List of comma-separated changed AML files to ignore */
|
||||
+"tests/data/acpi/aarch64/virt/DSDT.smmuv3-legacy",
|
||||
+"tests/data/acpi/aarch64/virt/DSDT.smmuv3-dev",
|
||||
+"tests/data/acpi/aarch64/virt/IORT.smmuv3-legacy",
|
||||
+"tests/data/acpi/aarch64/virt/IORT.smmuv3-dev",
|
||||
--
|
||||
2.47.3
|
||||
|
||||
131
kvm-hw-arm-smmu-common-Check-SMMU-has-PCIe-Root-Complex-.patch
Normal file
131
kvm-hw-arm-smmu-common-Check-SMMU-has-PCIe-Root-Complex-.patch
Normal file
@ -0,0 +1,131 @@
|
||||
From ad929c3b2e90eeb1f81a3f7074cdaaa922b073b9 Mon Sep 17 00:00:00 2001
|
||||
From: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Date: Fri, 29 Aug 2025 09:25:23 +0100
|
||||
Subject: [PATCH 05/16] hw/arm/smmu-common: Check SMMU has PCIe Root Complex
|
||||
association
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 423: hw/arm/virt: Add support for user creatable SMMUv3 device
|
||||
RH-Jira: RHEL-73800
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Sebastian Ott <sebott@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Commit: [1/11] 9e7a87070ebfef643848d31fe66f5b4e82bfe0cf (eauger1/centos-qemu-kvm)
|
||||
|
||||
We only allow default PCIe Root Complex(pcie.0) or pxb-pcie based extra
|
||||
root complexes to be associated with SMMU.
|
||||
|
||||
Although this change does not affect functionality at present, it is
|
||||
required when we add support for user-creatable SMMUv3 devices in
|
||||
future patches.
|
||||
|
||||
Note: Added a specific check to identify pxb-pcie to avoid matching
|
||||
pxb-cxl host bridges, which are also of type PCI_HOST_BRIDGE. This
|
||||
restriction can be relaxed once support for CXL devices on arm/virt
|
||||
is added and validated with SMMUv3.
|
||||
|
||||
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
|
||||
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Nathan Chen <nathanc@nvidia.com>
|
||||
Tested-by: Eric Auger <eric.auger@redhat.com>
|
||||
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
||||
Signed-off-by: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Reviewed-by: Donald Dutile <ddutile@redhat.com>
|
||||
Message-id: 20250829082543.7680-2-skolothumtho@nvidia.com
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
(cherry picked from commit d9e6b8424fd2523a0361972d5dd841471879479c)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/arm/smmu-common.c | 31 ++++++++++++++++++++++++++---
|
||||
hw/pci-bridge/pci_expander_bridge.c | 1 -
|
||||
include/hw/pci/pci_bridge.h | 1 +
|
||||
3 files changed, 29 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
|
||||
index 0dcaf2f589..7f64ea48d0 100644
|
||||
--- a/hw/arm/smmu-common.c
|
||||
+++ b/hw/arm/smmu-common.c
|
||||
@@ -20,6 +20,7 @@
|
||||
#include "trace.h"
|
||||
#include "exec/target_page.h"
|
||||
#include "hw/core/cpu.h"
|
||||
+#include "hw/pci/pci_bridge.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/jhash.h"
|
||||
@@ -925,6 +926,7 @@ static void smmu_base_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
SMMUState *s = ARM_SMMU(dev);
|
||||
SMMUBaseClass *sbc = ARM_SMMU_GET_CLASS(dev);
|
||||
+ PCIBus *pci_bus = s->primary_bus;
|
||||
Error *local_err = NULL;
|
||||
|
||||
sbc->parent_realize(dev, &local_err);
|
||||
@@ -937,11 +939,34 @@ static void smmu_base_realize(DeviceState *dev, Error **errp)
|
||||
g_free, g_free);
|
||||
s->smmu_pcibus_by_busptr = g_hash_table_new(NULL, NULL);
|
||||
|
||||
- if (s->primary_bus) {
|
||||
- pci_setup_iommu(s->primary_bus, &smmu_ops, s);
|
||||
- } else {
|
||||
+ if (!pci_bus) {
|
||||
error_setg(errp, "SMMU is not attached to any PCI bus!");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * We only allow default PCIe Root Complex(pcie.0) or pxb-pcie based extra
|
||||
+ * root complexes to be associated with SMMU.
|
||||
+ */
|
||||
+ if (pci_bus_is_express(pci_bus) && pci_bus_is_root(pci_bus) &&
|
||||
+ object_dynamic_cast(OBJECT(pci_bus)->parent, TYPE_PCI_HOST_BRIDGE)) {
|
||||
+ /*
|
||||
+ * This condition matches either the default pcie.0, pxb-pcie, or
|
||||
+ * pxb-cxl. For both pxb-pcie and pxb-cxl, parent_dev will be set.
|
||||
+ * Currently, we don't allow pxb-cxl as it requires further
|
||||
+ * verification. Therefore, make sure this is indeed pxb-pcie.
|
||||
+ */
|
||||
+ if (pci_bus->parent_dev) {
|
||||
+ if (!object_dynamic_cast(OBJECT(pci_bus), TYPE_PXB_PCIE_BUS)) {
|
||||
+ goto out_err;
|
||||
+ }
|
||||
+ }
|
||||
+ pci_setup_iommu(pci_bus, &smmu_ops, s);
|
||||
+ return;
|
||||
}
|
||||
+out_err:
|
||||
+ error_setg(errp, "SMMU should be attached to a default PCIe root complex"
|
||||
+ "(pcie.0) or a pxb-pcie based root complex");
|
||||
}
|
||||
|
||||
/*
|
||||
diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c
|
||||
index 3a29dfefc2..1bcceddbc4 100644
|
||||
--- a/hw/pci-bridge/pci_expander_bridge.c
|
||||
+++ b/hw/pci-bridge/pci_expander_bridge.c
|
||||
@@ -34,7 +34,6 @@ typedef struct PXBBus PXBBus;
|
||||
DECLARE_INSTANCE_CHECKER(PXBBus, PXB_BUS,
|
||||
TYPE_PXB_BUS)
|
||||
|
||||
-#define TYPE_PXB_PCIE_BUS "pxb-pcie-bus"
|
||||
DECLARE_INSTANCE_CHECKER(PXBBus, PXB_PCIE_BUS,
|
||||
TYPE_PXB_PCIE_BUS)
|
||||
|
||||
diff --git a/include/hw/pci/pci_bridge.h b/include/hw/pci/pci_bridge.h
|
||||
index 8cdacbc4e1..a055fd8d32 100644
|
||||
--- a/include/hw/pci/pci_bridge.h
|
||||
+++ b/include/hw/pci/pci_bridge.h
|
||||
@@ -104,6 +104,7 @@ typedef struct PXBPCIEDev {
|
||||
PXBDev parent_obj;
|
||||
} PXBPCIEDev;
|
||||
|
||||
+#define TYPE_PXB_PCIE_BUS "pxb-pcie-bus"
|
||||
#define TYPE_PXB_CXL_BUS "pxb-cxl-bus"
|
||||
#define TYPE_PXB_DEV "pxb"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(PXBDev, PXB_DEV)
|
||||
--
|
||||
2.47.3
|
||||
|
||||
61
kvm-hw-arm-virt-Add-an-SMMU_IO_LEN-macro.patch
Normal file
61
kvm-hw-arm-virt-Add-an-SMMU_IO_LEN-macro.patch
Normal file
@ -0,0 +1,61 @@
|
||||
From c62e5defde6f02bdd316b772169571d0de5d2d83 Mon Sep 17 00:00:00 2001
|
||||
From: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Date: Fri, 29 Aug 2025 09:25:27 +0100
|
||||
Subject: [PATCH 09/16] hw/arm/virt: Add an SMMU_IO_LEN macro
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 423: hw/arm/virt: Add support for user creatable SMMUv3 device
|
||||
RH-Jira: RHEL-73800
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Sebastian Ott <sebott@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Commit: [5/11] 72c82e228bb256db07fbe28728ad47dbd8b04dc3 (eauger1/centos-qemu-kvm)
|
||||
|
||||
This is useful as the subsequent support for new SMMUv3 dev will also
|
||||
use the same.
|
||||
|
||||
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Reviewed-by: Donald Dutile <ddutile@redhat.com>
|
||||
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Nathan Chen <nathanc@nvidia.com>
|
||||
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
|
||||
Tested-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
||||
Signed-off-by: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Message-id: 20250829082543.7680-6-skolothumtho@nvidia.com
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
(cherry picked from commit 466197fc7a25658f9187d538c26887f5738d1ac9)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 9b95a7c9a9..b435efafe1 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -186,6 +186,9 @@ static void arm_virt_compat_set(MachineClass *mc)
|
||||
#define LEGACY_RAMLIMIT_GB 255
|
||||
#define LEGACY_RAMLIMIT_BYTES (LEGACY_RAMLIMIT_GB * GiB)
|
||||
|
||||
+/* MMIO region size for SMMUv3 */
|
||||
+#define SMMU_IO_LEN 0x20000
|
||||
+
|
||||
/* Addresses and sizes of our components.
|
||||
* 0..128MB is space for a flash device so we can run bootrom code such as UEFI.
|
||||
* 128MB..256MB is used for miscellaneous device I/O.
|
||||
@@ -217,7 +220,7 @@ static const MemMapEntry base_memmap[] = {
|
||||
[VIRT_FW_CFG] = { 0x09020000, 0x00000018 },
|
||||
[VIRT_GPIO] = { 0x09030000, 0x00001000 },
|
||||
[VIRT_UART1] = { 0x09040000, 0x00001000 },
|
||||
- [VIRT_SMMU] = { 0x09050000, 0x00020000 },
|
||||
+ [VIRT_SMMU] = { 0x09050000, SMMU_IO_LEN },
|
||||
[VIRT_PCDIMM_ACPI] = { 0x09070000, MEMORY_HOTPLUG_IO_LEN },
|
||||
[VIRT_ACPI_GED] = { 0x09080000, ACPI_GED_EVT_SEL_LEN },
|
||||
[VIRT_NVDIMM_ACPI] = { 0x09090000, NVDIMM_ACPI_IO_LEN},
|
||||
--
|
||||
2.47.3
|
||||
|
||||
215
kvm-hw-arm-virt-Allow-user-creatable-SMMUv3-dev-instanti.patch
Normal file
215
kvm-hw-arm-virt-Allow-user-creatable-SMMUv3-dev-instanti.patch
Normal file
@ -0,0 +1,215 @@
|
||||
From 20b24c8ae68ff5059392188762c8d8b24c3dfa28 Mon Sep 17 00:00:00 2001
|
||||
From: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Date: Fri, 29 Aug 2025 09:25:29 +0100
|
||||
Subject: [PATCH 11/16] hw/arm/virt: Allow user-creatable SMMUv3 dev
|
||||
instantiation
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 423: hw/arm/virt: Add support for user creatable SMMUv3 device
|
||||
RH-Jira: RHEL-73800
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Sebastian Ott <sebott@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Commit: [7/11] 8f4a03c34d5c699023b3916f4919caf669f7a87c (eauger1/centos-qemu-kvm)
|
||||
|
||||
Allow cold-plugging of an SMMUv3 device on the virt machine when no
|
||||
global (legacy) SMMUv3 is present or when a virtio-iommu is specified.
|
||||
|
||||
This user-created SMMUv3 device is tied to a specific PCI bus provided
|
||||
by the user, so ensure the IOMMU ops are configured accordingly.
|
||||
|
||||
Due to current limitations in QEMU’s device tree support, specifically
|
||||
its inability to properly present pxb-pcie based root complexes and
|
||||
their devices, the device tree support for the new SMMUv3 device is
|
||||
limited to cases where it is attached to the default pcie.0 root complex.
|
||||
|
||||
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
|
||||
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Nathan Chen <nathanc@nvidia.com>
|
||||
Tested-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
||||
Signed-off-by: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Reviewed-by: Donald Dutile <ddutile@redhat.com>
|
||||
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Message-id: 20250829082543.7680-8-skolothumtho@nvidia.com
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
(cherry picked from commit 66d2f665e163cf1afccd171e3c16f8d3acb3d94a)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/arm/smmu-common.c | 8 +++++-
|
||||
hw/arm/smmuv3.c | 2 ++
|
||||
hw/arm/virt.c | 51 ++++++++++++++++++++++++++++++++++++
|
||||
hw/core/sysbus-fdt.c | 3 +++
|
||||
include/hw/arm/smmu-common.h | 1 +
|
||||
5 files changed, 64 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
|
||||
index 7f64ea48d0..62a7612184 100644
|
||||
--- a/hw/arm/smmu-common.c
|
||||
+++ b/hw/arm/smmu-common.c
|
||||
@@ -961,7 +961,12 @@ static void smmu_base_realize(DeviceState *dev, Error **errp)
|
||||
goto out_err;
|
||||
}
|
||||
}
|
||||
- pci_setup_iommu(pci_bus, &smmu_ops, s);
|
||||
+
|
||||
+ if (s->smmu_per_bus) {
|
||||
+ pci_setup_iommu_per_bus(pci_bus, &smmu_ops, s);
|
||||
+ } else {
|
||||
+ pci_setup_iommu(pci_bus, &smmu_ops, s);
|
||||
+ }
|
||||
return;
|
||||
}
|
||||
out_err:
|
||||
@@ -986,6 +991,7 @@ static void smmu_base_reset_exit(Object *obj, ResetType type)
|
||||
|
||||
static const Property smmu_dev_properties[] = {
|
||||
DEFINE_PROP_UINT8("bus_num", SMMUState, bus_num, 0),
|
||||
+ DEFINE_PROP_BOOL("smmu_per_bus", SMMUState, smmu_per_bus, false),
|
||||
DEFINE_PROP_LINK("primary-bus", SMMUState, primary_bus,
|
||||
TYPE_PCI_BUS, PCIBus *),
|
||||
};
|
||||
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
|
||||
index ab67972353..bcf8af8dc7 100644
|
||||
--- a/hw/arm/smmuv3.c
|
||||
+++ b/hw/arm/smmuv3.c
|
||||
@@ -1996,6 +1996,8 @@ static void smmuv3_class_init(ObjectClass *klass, const void *data)
|
||||
device_class_set_parent_realize(dc, smmu_realize,
|
||||
&c->parent_realize);
|
||||
device_class_set_props(dc, smmuv3_properties);
|
||||
+ dc->hotpluggable = false;
|
||||
+ dc->user_creatable = true;
|
||||
}
|
||||
|
||||
static int smmuv3_notify_flag_changed(IOMMUMemoryRegion *iommu,
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index b435efafe1..e8e64fe7fe 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -56,6 +56,7 @@
|
||||
#include "qemu/cutils.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/module.h"
|
||||
+#include "hw/pci/pci_bus.h"
|
||||
#include "hw/pci-host/gpex.h"
|
||||
#include "hw/pci-bridge/pci_expander_bridge.h"
|
||||
#include "hw/virtio/virtio-pci.h"
|
||||
@@ -1510,6 +1511,29 @@ static void create_smmuv3_dt_bindings(const VirtMachineState *vms, hwaddr base,
|
||||
g_free(node);
|
||||
}
|
||||
|
||||
+static void create_smmuv3_dev_dtb(VirtMachineState *vms,
|
||||
+ DeviceState *dev, PCIBus *bus)
|
||||
+{
|
||||
+ PlatformBusDevice *pbus = PLATFORM_BUS_DEVICE(vms->platform_bus_dev);
|
||||
+ SysBusDevice *sbdev = SYS_BUS_DEVICE(dev);
|
||||
+ int irq = platform_bus_get_irqn(pbus, sbdev, 0);
|
||||
+ hwaddr base = platform_bus_get_mmio_addr(pbus, sbdev, 0);
|
||||
+ MachineState *ms = MACHINE(vms);
|
||||
+
|
||||
+ if (!(vms->bootinfo.firmware_loaded && virt_is_acpi_enabled(vms)) &&
|
||||
+ strcmp("pcie.0", bus->qbus.name)) {
|
||||
+ warn_report("SMMUv3 device only supported with pcie.0 for DT");
|
||||
+ return;
|
||||
+ }
|
||||
+ base += vms->memmap[VIRT_PLATFORM_BUS].base;
|
||||
+ irq += vms->irqmap[VIRT_PLATFORM_BUS];
|
||||
+
|
||||
+ vms->iommu_phandle = qemu_fdt_alloc_phandle(ms->fdt);
|
||||
+ create_smmuv3_dt_bindings(vms, base, SMMU_IO_LEN, irq);
|
||||
+ qemu_fdt_setprop_cells(ms->fdt, vms->pciehb_nodename, "iommu-map",
|
||||
+ 0x0, vms->iommu_phandle, 0x0, 0x10000);
|
||||
+}
|
||||
+
|
||||
static void create_smmu(const VirtMachineState *vms,
|
||||
PCIBus *bus)
|
||||
{
|
||||
@@ -3057,6 +3081,16 @@ static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
|
||||
qlist_append_str(reserved_regions, resv_prop_str);
|
||||
qdev_prop_set_array(dev, "reserved-regions", reserved_regions);
|
||||
g_free(resv_prop_str);
|
||||
+ } else if (object_dynamic_cast(OBJECT(dev), TYPE_ARM_SMMUV3)) {
|
||||
+ if (vms->legacy_smmuv3_present || vms->iommu == VIRT_IOMMU_VIRTIO) {
|
||||
+ error_setg(errp, "virt machine already has %s set. "
|
||||
+ "Doesn't support incompatible iommus",
|
||||
+ (vms->legacy_smmuv3_present) ?
|
||||
+ "iommu=smmuv3" : "virtio-iommu");
|
||||
+ } else if (vms->iommu == VIRT_IOMMU_NONE) {
|
||||
+ /* The new SMMUv3 device is specific to the PCI bus */
|
||||
+ object_property_set_bool(OBJECT(dev), "smmu_per_bus", true, NULL);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3080,6 +3114,22 @@ static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev,
|
||||
virtio_md_pci_plug(VIRTIO_MD_PCI(dev), MACHINE(hotplug_dev), errp);
|
||||
}
|
||||
|
||||
+ if (object_dynamic_cast(OBJECT(dev), TYPE_ARM_SMMUV3)) {
|
||||
+ if (!vms->legacy_smmuv3_present && vms->platform_bus_dev) {
|
||||
+ PCIBus *bus;
|
||||
+
|
||||
+ bus = PCI_BUS(object_property_get_link(OBJECT(dev), "primary-bus",
|
||||
+ &error_abort));
|
||||
+ if (pci_bus_bypass_iommu(bus)) {
|
||||
+ error_setg(errp, "Bypass option cannot be set for SMMUv3 "
|
||||
+ "associated PCIe RC");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ create_smmuv3_dev_dtb(vms, dev, bus);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_IOMMU_PCI)) {
|
||||
PCIDevice *pdev = PCI_DEVICE(dev);
|
||||
|
||||
@@ -3286,6 +3336,7 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
|
||||
#endif
|
||||
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_RAMFB_DEVICE);
|
||||
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_UEFI_VARS_SYSBUS);
|
||||
+ machine_class_allow_dynamic_sysbus_dev(mc, TYPE_ARM_SMMUV3);
|
||||
#ifdef CONFIG_TPM
|
||||
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_TPM_TIS_SYSBUS);
|
||||
#endif
|
||||
diff --git a/hw/core/sysbus-fdt.c b/hw/core/sysbus-fdt.c
|
||||
index 1e1966813f..673e083d31 100644
|
||||
--- a/hw/core/sysbus-fdt.c
|
||||
+++ b/hw/core/sysbus-fdt.c
|
||||
@@ -31,6 +31,7 @@
|
||||
#include "qemu/error-report.h"
|
||||
#include "system/device_tree.h"
|
||||
#include "system/tpm.h"
|
||||
+#include "hw/arm/smmuv3.h"
|
||||
#include "hw/platform-bus.h"
|
||||
#include "hw/vfio/vfio-platform.h"
|
||||
#include "hw/vfio/vfio-calxeda-xgmac.h"
|
||||
@@ -518,6 +519,8 @@ static const BindingEntry bindings[] = {
|
||||
#ifdef CONFIG_TPM
|
||||
TYPE_BINDING(TYPE_TPM_TIS_SYSBUS, add_tpm_tis_fdt_node),
|
||||
#endif
|
||||
+ /* No generic DT support for smmuv3 dev. Support added for arm virt only */
|
||||
+ TYPE_BINDING(TYPE_ARM_SMMUV3, no_fdt_node),
|
||||
TYPE_BINDING(TYPE_RAMFB_DEVICE, no_fdt_node),
|
||||
TYPE_BINDING(TYPE_UEFI_VARS_SYSBUS, add_uefi_vars_node),
|
||||
TYPE_BINDING("", NULL), /* last element */
|
||||
diff --git a/include/hw/arm/smmu-common.h b/include/hw/arm/smmu-common.h
|
||||
index e5e2d09294..80d0fecfde 100644
|
||||
--- a/include/hw/arm/smmu-common.h
|
||||
+++ b/include/hw/arm/smmu-common.h
|
||||
@@ -161,6 +161,7 @@ struct SMMUState {
|
||||
QLIST_HEAD(, SMMUDevice) devices_with_notifiers;
|
||||
uint8_t bus_num;
|
||||
PCIBus *primary_bus;
|
||||
+ bool smmu_per_bus; /* SMMU is specific to the primary_bus */
|
||||
};
|
||||
|
||||
struct SMMUBaseClass {
|
||||
--
|
||||
2.47.3
|
||||
|
||||
118
kvm-hw-arm-virt-Factor-out-common-SMMUV3-dt-bindings-cod.patch
Normal file
118
kvm-hw-arm-virt-Factor-out-common-SMMUV3-dt-bindings-cod.patch
Normal file
@ -0,0 +1,118 @@
|
||||
From 1b3c413355ee5f3917e8e39dbf7a281f8e31a0f5 Mon Sep 17 00:00:00 2001
|
||||
From: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Date: Fri, 29 Aug 2025 09:25:26 +0100
|
||||
Subject: [PATCH 08/16] hw/arm/virt: Factor out common SMMUV3 dt bindings code
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 423: hw/arm/virt: Add support for user creatable SMMUv3 device
|
||||
RH-Jira: RHEL-73800
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Sebastian Ott <sebott@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Commit: [4/11] db5d2a44f4cd1583c839b93ae551a2ddbd68b83b (eauger1/centos-qemu-kvm)
|
||||
|
||||
No functional changes intended. This will be useful when we
|
||||
add support for user-creatable smmuv3 device.
|
||||
|
||||
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Nathan Chen <nathanc@nvidia.com>
|
||||
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
|
||||
Tested-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
||||
Signed-off-by: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Reviewed-by: Donald Dutile <ddutile@redhat.com>
|
||||
Message-id: 20250829082543.7680-5-skolothumtho@nvidia.com
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
(cherry picked from commit 7a276b7570266ec39611f9d91089741ec7e9295b)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 54 +++++++++++++++++++++++++++------------------------
|
||||
1 file changed, 29 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 0cc9e5f068..9b95a7c9a9 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -1479,19 +1479,43 @@ static void create_pcie_irq_map(const MachineState *ms,
|
||||
0x7 /* PCI irq */);
|
||||
}
|
||||
|
||||
+static void create_smmuv3_dt_bindings(const VirtMachineState *vms, hwaddr base,
|
||||
+ hwaddr size, int irq)
|
||||
+{
|
||||
+ char *node;
|
||||
+ const char compat[] = "arm,smmu-v3";
|
||||
+ const char irq_names[] = "eventq\0priq\0cmdq-sync\0gerror";
|
||||
+ MachineState *ms = MACHINE(vms);
|
||||
+
|
||||
+ node = g_strdup_printf("/smmuv3@%" PRIx64, base);
|
||||
+ qemu_fdt_add_subnode(ms->fdt, node);
|
||||
+ qemu_fdt_setprop(ms->fdt, node, "compatible", compat, sizeof(compat));
|
||||
+ qemu_fdt_setprop_sized_cells(ms->fdt, node, "reg", 2, base, 2, size);
|
||||
+
|
||||
+ qemu_fdt_setprop_cells(ms->fdt, node, "interrupts",
|
||||
+ GIC_FDT_IRQ_TYPE_SPI, irq , GIC_FDT_IRQ_FLAGS_EDGE_LO_HI,
|
||||
+ GIC_FDT_IRQ_TYPE_SPI, irq + 1, GIC_FDT_IRQ_FLAGS_EDGE_LO_HI,
|
||||
+ GIC_FDT_IRQ_TYPE_SPI, irq + 2, GIC_FDT_IRQ_FLAGS_EDGE_LO_HI,
|
||||
+ GIC_FDT_IRQ_TYPE_SPI, irq + 3, GIC_FDT_IRQ_FLAGS_EDGE_LO_HI);
|
||||
+
|
||||
+ qemu_fdt_setprop(ms->fdt, node, "interrupt-names", irq_names,
|
||||
+ sizeof(irq_names));
|
||||
+
|
||||
+ qemu_fdt_setprop(ms->fdt, node, "dma-coherent", NULL, 0);
|
||||
+ qemu_fdt_setprop_cell(ms->fdt, node, "#iommu-cells", 1);
|
||||
+ qemu_fdt_setprop_cell(ms->fdt, node, "phandle", vms->iommu_phandle);
|
||||
+ g_free(node);
|
||||
+}
|
||||
+
|
||||
static void create_smmu(const VirtMachineState *vms,
|
||||
PCIBus *bus)
|
||||
{
|
||||
VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
|
||||
- char *node;
|
||||
- const char compat[] = "arm,smmu-v3";
|
||||
int irq = vms->irqmap[VIRT_SMMU];
|
||||
int i;
|
||||
hwaddr base = vms->memmap[VIRT_SMMU].base;
|
||||
hwaddr size = vms->memmap[VIRT_SMMU].size;
|
||||
- const char irq_names[] = "eventq\0priq\0cmdq-sync\0gerror";
|
||||
DeviceState *dev;
|
||||
- MachineState *ms = MACHINE(vms);
|
||||
|
||||
if (vms->iommu != VIRT_IOMMU_SMMUV3 || !vms->iommu_phandle) {
|
||||
return;
|
||||
@@ -1510,27 +1534,7 @@ static void create_smmu(const VirtMachineState *vms,
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(dev), i,
|
||||
qdev_get_gpio_in(vms->gic, irq + i));
|
||||
}
|
||||
-
|
||||
- node = g_strdup_printf("/smmuv3@%" PRIx64, base);
|
||||
- qemu_fdt_add_subnode(ms->fdt, node);
|
||||
- qemu_fdt_setprop(ms->fdt, node, "compatible", compat, sizeof(compat));
|
||||
- qemu_fdt_setprop_sized_cells(ms->fdt, node, "reg", 2, base, 2, size);
|
||||
-
|
||||
- qemu_fdt_setprop_cells(ms->fdt, node, "interrupts",
|
||||
- GIC_FDT_IRQ_TYPE_SPI, irq , GIC_FDT_IRQ_FLAGS_EDGE_LO_HI,
|
||||
- GIC_FDT_IRQ_TYPE_SPI, irq + 1, GIC_FDT_IRQ_FLAGS_EDGE_LO_HI,
|
||||
- GIC_FDT_IRQ_TYPE_SPI, irq + 2, GIC_FDT_IRQ_FLAGS_EDGE_LO_HI,
|
||||
- GIC_FDT_IRQ_TYPE_SPI, irq + 3, GIC_FDT_IRQ_FLAGS_EDGE_LO_HI);
|
||||
-
|
||||
- qemu_fdt_setprop(ms->fdt, node, "interrupt-names", irq_names,
|
||||
- sizeof(irq_names));
|
||||
-
|
||||
- qemu_fdt_setprop(ms->fdt, node, "dma-coherent", NULL, 0);
|
||||
-
|
||||
- qemu_fdt_setprop_cell(ms->fdt, node, "#iommu-cells", 1);
|
||||
-
|
||||
- qemu_fdt_setprop_cell(ms->fdt, node, "phandle", vms->iommu_phandle);
|
||||
- g_free(node);
|
||||
+ create_smmuv3_dt_bindings(vms, base, size, irq);
|
||||
}
|
||||
|
||||
static void create_virtio_iommu_dt_bindings(VirtMachineState *vms)
|
||||
--
|
||||
2.47.3
|
||||
|
||||
@ -0,0 +1,66 @@
|
||||
From 5264d9ea8c029dab0663a3da82f4d8241ad0f1b9 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Auger <eric.auger@redhat.com>
|
||||
Date: Fri, 7 Nov 2025 05:23:16 -0500
|
||||
Subject: [PATCH 04/16] hw/arm/virt: Use ACPI PCI hotplug by default from 10.2
|
||||
onwards
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 422: hw/arm/virt: Use ACPI PCI hotplug by default from 10.2 onwards
|
||||
RH-Jira: RHEL-67323
|
||||
RH-Acked-by: Sebastian Ott <sebott@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
|
||||
RH-Commit: [1/1] 4539ba6526fef80adb9893a643eb001449397447 (eauger1/centos-qemu-kvm)
|
||||
|
||||
UPSTREAM: RHEL-only
|
||||
|
||||
Use ACPI PCI hotplug by default from 10.2 onwards. For older
|
||||
rhel10 machine types and all rhel9 machine types ACPI PCI hotplug
|
||||
is kept disabled.
|
||||
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/arm/virt.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index dcdd53043e..542d702513 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -94,9 +94,15 @@
|
||||
|
||||
static GlobalProperty arm_virt_compat[] = {
|
||||
{ TYPE_VIRTIO_IOMMU_PCI, "aw-bits", "48" },
|
||||
+ { TYPE_ACPI_GED, "acpi-pci-hotplug-with-bridge-support", "on" },
|
||||
};
|
||||
static const size_t arm_virt_compat_len = G_N_ELEMENTS(arm_virt_compat);
|
||||
|
||||
+GlobalProperty arm_acpi_pci_hp_disabled_compat[] = {
|
||||
+ { TYPE_ACPI_GED, "acpi-pci-hotplug-with-bridge-support", "off" },
|
||||
+};
|
||||
+static const size_t arm_acpi_pci_hp_disabled_compat_len = G_N_ELEMENTS(arm_virt_compat);
|
||||
+
|
||||
/*
|
||||
* RHEL9 kernels have pauth disabled while RHEL10 has it enabled,
|
||||
* since qemu will setup the VM with pauth when KVM supports it we
|
||||
@@ -104,6 +110,7 @@ static const size_t arm_virt_compat_len = G_N_ELEMENTS(arm_virt_compat);
|
||||
*/
|
||||
GlobalProperty arm_rhel9_compat[] = {
|
||||
{TYPE_ARM_CPU, "pauth", "off", .optional = true},
|
||||
+ {TYPE_ACPI_GED, "acpi-pci-hotplug-with-bridge-support", "off" },
|
||||
};
|
||||
const size_t arm_rhel9_compat_len = G_N_ELEMENTS(arm_rhel9_compat);
|
||||
|
||||
@@ -3701,6 +3708,8 @@ static void virt_rhel_machine_10_0_0_options(MachineClass *mc)
|
||||
|
||||
/* QEMU 9.1 and earlier have only a stage-1 SMMU, not a nested s1+2 one */
|
||||
vmc->no_nested_smmu = true;
|
||||
+ compat_props_add(mc->compat_props, arm_acpi_pci_hp_disabled_compat,
|
||||
+ arm_acpi_pci_hp_disabled_compat_len);
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_10_2, hw_compat_rhel_10_2_len);
|
||||
compat_props_add(mc->compat_props, hw_compat_rhel_10_1, hw_compat_rhel_10_1_len);
|
||||
}
|
||||
--
|
||||
2.47.3
|
||||
|
||||
291
kvm-hw-arm-virt-acpi-build-Re-arrange-SMMUv3-IORT-build.patch
Normal file
291
kvm-hw-arm-virt-acpi-build-Re-arrange-SMMUv3-IORT-build.patch
Normal file
@ -0,0 +1,291 @@
|
||||
From 221e12accdd5e699d727cd862760829e973a7b2a Mon Sep 17 00:00:00 2001
|
||||
From: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Date: Fri, 29 Aug 2025 09:25:24 +0100
|
||||
Subject: [PATCH 06/16] hw/arm/virt-acpi-build: Re-arrange SMMUv3 IORT build
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 423: hw/arm/virt: Add support for user creatable SMMUv3 device
|
||||
RH-Jira: RHEL-73800
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Sebastian Ott <sebott@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Commit: [2/11] 73e2dd4f48ffaf614c79241bc73cbb0457849131 (eauger1/centos-qemu-kvm)
|
||||
|
||||
Introduce a new struct AcpiIortSMMUv3Dev to hold all the information
|
||||
required for SMMUv3 IORT node and use that for populating the node.
|
||||
|
||||
The current machine wide SMMUv3 is named as legacy SMMUv3 as we will
|
||||
soon add support for user-creatable SMMUv3 devices. These changes will
|
||||
be useful to have common code paths when we add that support.
|
||||
|
||||
Tested-by: Nathan Chen <nathanc@nvidia.com>
|
||||
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
|
||||
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
||||
Signed-off-by: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Reviewed-by: Donald Dutile <ddutile@redhat.com>
|
||||
Message-id: 20250829082543.7680-3-skolothumtho@nvidia.com
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
(cherry picked from commit 0e6a5bfb0eb17f57fb923b7905bd1435204bdd62)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/arm/virt-acpi-build.c | 137 ++++++++++++++++++++++++++-------------
|
||||
hw/arm/virt.c | 1 +
|
||||
include/hw/arm/virt.h | 1 +
|
||||
3 files changed, 94 insertions(+), 45 deletions(-)
|
||||
|
||||
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
|
||||
index b01fc4f8ef..bef4fabe56 100644
|
||||
--- a/hw/arm/virt-acpi-build.c
|
||||
+++ b/hw/arm/virt-acpi-build.c
|
||||
@@ -305,29 +305,65 @@ static int iort_idmap_compare(gconstpointer a, gconstpointer b)
|
||||
return idmap_a->input_base - idmap_b->input_base;
|
||||
}
|
||||
|
||||
+typedef struct AcpiIortSMMUv3Dev {
|
||||
+ int irq;
|
||||
+ hwaddr base;
|
||||
+ GArray *rc_smmu_idmaps;
|
||||
+ /* Offset of the SMMUv3 IORT Node relative to the start of the IORT */
|
||||
+ size_t offset;
|
||||
+} AcpiIortSMMUv3Dev;
|
||||
+
|
||||
+/*
|
||||
+ * Populate the struct AcpiIortSMMUv3Dev for the legacy SMMUv3 and
|
||||
+ * return the total number of associated idmaps.
|
||||
+ */
|
||||
+static int populate_smmuv3_legacy_dev(GArray *sdev_blob)
|
||||
+{
|
||||
+ VirtMachineState *vms = VIRT_MACHINE(qdev_get_machine());
|
||||
+ AcpiIortSMMUv3Dev sdev;
|
||||
+
|
||||
+ sdev.rc_smmu_idmaps = g_array_new(false, true, sizeof(AcpiIortIdMapping));
|
||||
+ object_child_foreach_recursive(object_get_root(), iort_host_bridges,
|
||||
+ sdev.rc_smmu_idmaps);
|
||||
+ /*
|
||||
+ * There can be only one legacy SMMUv3("iommu=smmuv3") as it is a machine
|
||||
+ * wide one. Since it may cover multiple PCIe RCs(based on "bypass_iommu"
|
||||
+ * property), may have multiple SMMUv3 idmaps. Sort it by input_base.
|
||||
+ */
|
||||
+ g_array_sort(sdev.rc_smmu_idmaps, iort_idmap_compare);
|
||||
+
|
||||
+ sdev.base = vms->memmap[VIRT_SMMU].base;
|
||||
+ sdev.irq = vms->irqmap[VIRT_SMMU] + ARM_SPI_BASE;
|
||||
+ g_array_append_val(sdev_blob, sdev);
|
||||
+ return sdev.rc_smmu_idmaps->len;
|
||||
+}
|
||||
+
|
||||
/* Compute ID ranges (RIDs) from RC that are directed to the ITS Group node */
|
||||
-static void create_rc_its_idmaps(GArray *its_idmaps, GArray *smmu_idmaps)
|
||||
+static void create_rc_its_idmaps(GArray *its_idmaps, GArray *smmuv3_devs)
|
||||
{
|
||||
AcpiIortIdMapping *idmap;
|
||||
AcpiIortIdMapping next_range = {0};
|
||||
+ AcpiIortSMMUv3Dev *sdev;
|
||||
|
||||
- /*
|
||||
- * Based on the RID ranges that are directed to the SMMU, determine the
|
||||
- * bypassed RID ranges, i.e., the ones that are directed to the ITS Group
|
||||
- * node and do not pass through the SMMU, by subtracting the SMMU-bound
|
||||
- * ranges from the full RID range (0x0000–0xFFFF).
|
||||
- */
|
||||
- for (int i = 0; i < smmu_idmaps->len; i++) {
|
||||
- idmap = &g_array_index(smmu_idmaps, AcpiIortIdMapping, i);
|
||||
+ for (int i = 0; i < smmuv3_devs->len; i++) {
|
||||
+ sdev = &g_array_index(smmuv3_devs, AcpiIortSMMUv3Dev, i);
|
||||
+ /*
|
||||
+ * Based on the RID ranges that are directed to the SMMU, determine the
|
||||
+ * bypassed RID ranges, i.e., the ones that are directed to the ITS
|
||||
+ * Group node and do not pass through the SMMU, by subtracting the
|
||||
+ * SMMU-bound ranges from the full RID range (0x0000–0xFFFF).
|
||||
+ */
|
||||
+ for (int j = 0; j < sdev->rc_smmu_idmaps->len; j++) {
|
||||
+ idmap = &g_array_index(sdev->rc_smmu_idmaps, AcpiIortIdMapping, j);
|
||||
|
||||
- if (next_range.input_base < idmap->input_base) {
|
||||
- next_range.id_count = idmap->input_base - next_range.input_base;
|
||||
- g_array_append_val(its_idmaps, next_range);
|
||||
- }
|
||||
+ if (next_range.input_base < idmap->input_base) {
|
||||
+ next_range.id_count = idmap->input_base - next_range.input_base;
|
||||
+ g_array_append_val(its_idmaps, next_range);
|
||||
+ }
|
||||
|
||||
- next_range.input_base = idmap->input_base + idmap->id_count;
|
||||
+ next_range.input_base = idmap->input_base + idmap->id_count;
|
||||
+ }
|
||||
}
|
||||
-
|
||||
/*
|
||||
* Append the last RC -> ITS ID mapping.
|
||||
*
|
||||
@@ -341,7 +377,6 @@ static void create_rc_its_idmaps(GArray *its_idmaps, GArray *smmu_idmaps)
|
||||
}
|
||||
}
|
||||
|
||||
-
|
||||
/*
|
||||
* Input Output Remapping Table (IORT)
|
||||
* Conforms to "IO Remapping Table System Software on ARM Platforms",
|
||||
@@ -351,9 +386,12 @@ static void
|
||||
build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||||
{
|
||||
int i, nb_nodes, rc_mapping_count;
|
||||
- size_t node_size, smmu_offset = 0;
|
||||
+ AcpiIortSMMUv3Dev *sdev;
|
||||
+ size_t node_size;
|
||||
+ int num_smmus = 0;
|
||||
uint32_t id = 0;
|
||||
- GArray *rc_smmu_idmaps = g_array_new(false, true, sizeof(AcpiIortIdMapping));
|
||||
+ int rc_smmu_idmaps_len = 0;
|
||||
+ GArray *smmuv3_devs = g_array_new(false, true, sizeof(AcpiIortSMMUv3Dev));
|
||||
GArray *rc_its_idmaps = g_array_new(false, true, sizeof(AcpiIortIdMapping));
|
||||
|
||||
AcpiTable table = { .sig = "IORT", .rev = 3, .oem_id = vms->oem_id,
|
||||
@@ -361,22 +399,21 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||||
/* Table 2 The IORT */
|
||||
acpi_table_begin(&table, table_data);
|
||||
|
||||
- if (vms->iommu == VIRT_IOMMU_SMMUV3) {
|
||||
- object_child_foreach_recursive(object_get_root(),
|
||||
- iort_host_bridges, rc_smmu_idmaps);
|
||||
-
|
||||
- /* Sort the smmu idmap by input_base */
|
||||
- g_array_sort(rc_smmu_idmaps, iort_idmap_compare);
|
||||
+ if (vms->legacy_smmuv3_present) {
|
||||
+ rc_smmu_idmaps_len = populate_smmuv3_legacy_dev(smmuv3_devs);
|
||||
+ }
|
||||
|
||||
- nb_nodes = 2; /* RC and SMMUv3 */
|
||||
- rc_mapping_count = rc_smmu_idmaps->len;
|
||||
+ num_smmus = smmuv3_devs->len;
|
||||
+ if (num_smmus) {
|
||||
+ nb_nodes = num_smmus + 1; /* RC and SMMUv3 */
|
||||
+ rc_mapping_count = rc_smmu_idmaps_len;
|
||||
|
||||
if (vms->its) {
|
||||
/*
|
||||
* Knowing the ID ranges from the RC to the SMMU, it's possible to
|
||||
* determine the ID ranges from RC that go directly to ITS.
|
||||
*/
|
||||
- create_rc_its_idmaps(rc_its_idmaps, rc_smmu_idmaps);
|
||||
+ create_rc_its_idmaps(rc_its_idmaps, smmuv3_devs);
|
||||
|
||||
nb_nodes++; /* ITS */
|
||||
rc_mapping_count += rc_its_idmaps->len;
|
||||
@@ -411,9 +448,10 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||||
build_append_int_noprefix(table_data, 0 /* MADT translation_id */, 4);
|
||||
}
|
||||
|
||||
- if (vms->iommu == VIRT_IOMMU_SMMUV3) {
|
||||
- int irq = vms->irqmap[VIRT_SMMU] + ARM_SPI_BASE;
|
||||
+ for (i = 0; i < num_smmus; i++) {
|
||||
+ sdev = &g_array_index(smmuv3_devs, AcpiIortSMMUv3Dev, i);
|
||||
int smmu_mapping_count, offset_to_id_array;
|
||||
+ int irq = sdev->irq;
|
||||
|
||||
if (vms->its) {
|
||||
smmu_mapping_count = 1; /* ITS Group node */
|
||||
@@ -422,7 +460,7 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||||
smmu_mapping_count = 0; /* No ID mappings */
|
||||
offset_to_id_array = 0; /* No ID mappings array */
|
||||
}
|
||||
- smmu_offset = table_data->len - table.table_offset;
|
||||
+ sdev->offset = table_data->len - table.table_offset;
|
||||
/* Table 9 SMMUv3 Format */
|
||||
build_append_int_noprefix(table_data, 4 /* SMMUv3 */, 1); /* Type */
|
||||
node_size = SMMU_V3_ENTRY_SIZE +
|
||||
@@ -435,7 +473,7 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||||
/* Reference to ID Array */
|
||||
build_append_int_noprefix(table_data, offset_to_id_array, 4);
|
||||
/* Base address */
|
||||
- build_append_int_noprefix(table_data, vms->memmap[VIRT_SMMU].base, 8);
|
||||
+ build_append_int_noprefix(table_data, sdev->base, 8);
|
||||
/* Flags */
|
||||
build_append_int_noprefix(table_data, 1 /* COHACC Override */, 4);
|
||||
build_append_int_noprefix(table_data, 0, 4); /* Reserved */
|
||||
@@ -486,21 +524,26 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||||
build_append_int_noprefix(table_data, 0, 3); /* Reserved */
|
||||
|
||||
/* Output Reference */
|
||||
- if (vms->iommu == VIRT_IOMMU_SMMUV3) {
|
||||
+ if (num_smmus) {
|
||||
AcpiIortIdMapping *range;
|
||||
|
||||
- /*
|
||||
- * Map RIDs (input) from RC to SMMUv3 nodes: RC -> SMMUv3.
|
||||
- *
|
||||
- * N.B.: The mapping from SMMUv3 to ITS Group node (SMMUv3 -> ITS) is
|
||||
- * defined in the SMMUv3 table, where all SMMUv3 IDs are mapped to the
|
||||
- * ITS Group node, if ITS is available.
|
||||
- */
|
||||
- for (i = 0; i < rc_smmu_idmaps->len; i++) {
|
||||
- range = &g_array_index(rc_smmu_idmaps, AcpiIortIdMapping, i);
|
||||
- /* Output IORT node is the SMMUv3 node. */
|
||||
- build_iort_id_mapping(table_data, range->input_base,
|
||||
- range->id_count, smmu_offset);
|
||||
+ for (i = 0; i < num_smmus; i++) {
|
||||
+ sdev = &g_array_index(smmuv3_devs, AcpiIortSMMUv3Dev, i);
|
||||
+
|
||||
+ /*
|
||||
+ * Map RIDs (input) from RC to SMMUv3 nodes: RC -> SMMUv3.
|
||||
+ *
|
||||
+ * N.B.: The mapping from SMMUv3 to ITS Group node (SMMUv3 -> ITS)
|
||||
+ * is defined in the SMMUv3 table, where all SMMUv3 IDs are mapped
|
||||
+ * to the ITS Group node, if ITS is available.
|
||||
+ */
|
||||
+ for (int j = 0; j < sdev->rc_smmu_idmaps->len; j++) {
|
||||
+ range = &g_array_index(sdev->rc_smmu_idmaps,
|
||||
+ AcpiIortIdMapping, j);
|
||||
+ /* Output IORT node is the SMMUv3 node. */
|
||||
+ build_iort_id_mapping(table_data, range->input_base,
|
||||
+ range->id_count, sdev->offset);
|
||||
+ }
|
||||
}
|
||||
|
||||
if (vms->its) {
|
||||
@@ -525,8 +568,12 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||||
}
|
||||
|
||||
acpi_table_end(linker, &table);
|
||||
- g_array_free(rc_smmu_idmaps, true);
|
||||
g_array_free(rc_its_idmaps, true);
|
||||
+ for (i = 0; i < num_smmus; i++) {
|
||||
+ sdev = &g_array_index(smmuv3_devs, AcpiIortSMMUv3Dev, i);
|
||||
+ g_array_free(sdev->rc_smmu_idmaps, true);
|
||||
+ }
|
||||
+ g_array_free(smmuv3_devs, true);
|
||||
}
|
||||
|
||||
/*
|
||||
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||||
index 542d702513..0cc9e5f068 100644
|
||||
--- a/hw/arm/virt.c
|
||||
+++ b/hw/arm/virt.c
|
||||
@@ -1686,6 +1686,7 @@ static void create_pcie(VirtMachineState *vms)
|
||||
qemu_fdt_setprop_cells(ms->fdt, nodename, "iommu-map",
|
||||
0x0, vms->iommu_phandle, 0x0, 0x10000);
|
||||
}
|
||||
+ vms->legacy_smmuv3_present = true;
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
|
||||
index 94c79d6c6d..98b877c8b9 100644
|
||||
--- a/include/hw/arm/virt.h
|
||||
+++ b/include/hw/arm/virt.h
|
||||
@@ -180,6 +180,7 @@ struct VirtMachineState {
|
||||
char *oem_table_id;
|
||||
bool ns_el2_virt_timer_irq;
|
||||
CXLState cxl_devices_state;
|
||||
+ bool legacy_smmuv3_present;
|
||||
};
|
||||
|
||||
#define VIRT_ECAM_ID(high) (high ? VIRT_HIGH_PCIE_ECAM : VIRT_PCIE_ECAM)
|
||||
--
|
||||
2.47.3
|
||||
|
||||
170
kvm-hw-arm-virt-acpi-build-Update-IORT-for-multiple-smmu.patch
Normal file
170
kvm-hw-arm-virt-acpi-build-Update-IORT-for-multiple-smmu.patch
Normal file
@ -0,0 +1,170 @@
|
||||
From f89d89a3758ebd8725e677431f1e7493c65381c2 Mon Sep 17 00:00:00 2001
|
||||
From: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Date: Fri, 29 Aug 2025 09:25:25 +0100
|
||||
Subject: [PATCH 07/16] hw/arm/virt-acpi-build: Update IORT for multiple smmuv3
|
||||
devices
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 423: hw/arm/virt: Add support for user creatable SMMUv3 device
|
||||
RH-Jira: RHEL-73800
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Sebastian Ott <sebott@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Commit: [3/11] 9cb15768a319676af16cd2cdef8b8fabfa7b6f13 (eauger1/centos-qemu-kvm)
|
||||
|
||||
With the soon to be introduced user-creatable SMMUv3 devices for
|
||||
virt, it is possible to have multiple SMMUv3 devices associated
|
||||
with different PCIe root complexes.
|
||||
|
||||
Update IORT nodes accordingly.
|
||||
|
||||
An example IORT Id mappings for a Qemu virt machine with two
|
||||
PCIe Root Complexes each assocaited with a SMMUv3 will
|
||||
be something like below,
|
||||
|
||||
-device arm-smmuv3,primary-bus=pcie.0,id=smmuv3.0
|
||||
-device arm-smmuv3,primary-bus=pcie.1,id=smmuv3.1
|
||||
...
|
||||
|
||||
+--------------------+ +--------------------+
|
||||
| Root Complex 0 | | Root Complex 1 |
|
||||
| | | |
|
||||
| Requestor IDs | | Requestor IDs |
|
||||
| 0x0000 - 0x00FF | | 0x0100 - 0x01FF |
|
||||
+---------+----------+ +---------+----------+
|
||||
| |
|
||||
| |
|
||||
| Stream ID Mapping |
|
||||
v v
|
||||
+--------------------+ +--------------------+
|
||||
| SMMUv3 Node 0 | | SMMUv3 Node 1 |
|
||||
| | | |
|
||||
| Stream IDs 0x0000- | | Stream IDs 0x0100- |
|
||||
| 0x00FF mapped from | | 0x01FF mapped from |
|
||||
| RC0 Requestor IDs | | RC1 Requestor IDs |
|
||||
+--------------------+ +--------------------+
|
||||
| |
|
||||
| |
|
||||
+----------------+---------------+
|
||||
|
|
||||
|Device ID Mapping
|
||||
v
|
||||
+----------------------------+
|
||||
| ITS Node 0 |
|
||||
| |
|
||||
| Device IDs: |
|
||||
| 0x0000 - 0x00FF (from RC0) |
|
||||
| 0x0100 - 0x01FF (from RC1) |
|
||||
| 0x0200 - 0xFFFF (No SMMU) |
|
||||
+----------------------------+
|
||||
|
||||
Tested-by: Nathan Chen <nathanc@nvidia.com>
|
||||
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
|
||||
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
||||
Signed-off-by: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Reviewed-by: Donald Dutile <ddutile@redhat.com>
|
||||
Message-id: 20250829082543.7680-4-skolothumtho@nvidia.com
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
(cherry picked from commit 01e9a18730e6f56f713ed074603a8b0f2982ed26)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/arm/virt-acpi-build.c | 64 ++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 64 insertions(+)
|
||||
|
||||
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
|
||||
index bef4fabe56..96830f7c4e 100644
|
||||
--- a/hw/arm/virt-acpi-build.c
|
||||
+++ b/hw/arm/virt-acpi-build.c
|
||||
@@ -45,6 +45,7 @@
|
||||
#include "hw/acpi/generic_event_device.h"
|
||||
#include "hw/acpi/tpm.h"
|
||||
#include "hw/acpi/hmat.h"
|
||||
+#include "hw/arm/smmuv3.h"
|
||||
#include "hw/cxl/cxl.h"
|
||||
#include "hw/pci/pcie_host.h"
|
||||
#include "hw/pci/pci.h"
|
||||
@@ -338,6 +339,67 @@ static int populate_smmuv3_legacy_dev(GArray *sdev_blob)
|
||||
return sdev.rc_smmu_idmaps->len;
|
||||
}
|
||||
|
||||
+static int smmuv3_dev_idmap_compare(gconstpointer a, gconstpointer b)
|
||||
+{
|
||||
+ AcpiIortSMMUv3Dev *sdev_a = (AcpiIortSMMUv3Dev *)a;
|
||||
+ AcpiIortSMMUv3Dev *sdev_b = (AcpiIortSMMUv3Dev *)b;
|
||||
+ AcpiIortIdMapping *map_a = &g_array_index(sdev_a->rc_smmu_idmaps,
|
||||
+ AcpiIortIdMapping, 0);
|
||||
+ AcpiIortIdMapping *map_b = &g_array_index(sdev_b->rc_smmu_idmaps,
|
||||
+ AcpiIortIdMapping, 0);
|
||||
+ return map_a->input_base - map_b->input_base;
|
||||
+}
|
||||
+
|
||||
+static int iort_smmuv3_devices(Object *obj, void *opaque)
|
||||
+{
|
||||
+ VirtMachineState *vms = VIRT_MACHINE(qdev_get_machine());
|
||||
+ GArray *sdev_blob = opaque;
|
||||
+ AcpiIortIdMapping idmap;
|
||||
+ PlatformBusDevice *pbus;
|
||||
+ AcpiIortSMMUv3Dev sdev;
|
||||
+ int min_bus, max_bus;
|
||||
+ SysBusDevice *sbdev;
|
||||
+ PCIBus *bus;
|
||||
+
|
||||
+ if (!object_dynamic_cast(obj, TYPE_ARM_SMMUV3)) {
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ bus = PCI_BUS(object_property_get_link(obj, "primary-bus", &error_abort));
|
||||
+ pbus = PLATFORM_BUS_DEVICE(vms->platform_bus_dev);
|
||||
+ sbdev = SYS_BUS_DEVICE(obj);
|
||||
+ sdev.base = platform_bus_get_mmio_addr(pbus, sbdev, 0);
|
||||
+ sdev.base += vms->memmap[VIRT_PLATFORM_BUS].base;
|
||||
+ sdev.irq = platform_bus_get_irqn(pbus, sbdev, 0);
|
||||
+ sdev.irq += vms->irqmap[VIRT_PLATFORM_BUS];
|
||||
+ sdev.irq += ARM_SPI_BASE;
|
||||
+
|
||||
+ pci_bus_range(bus, &min_bus, &max_bus);
|
||||
+ sdev.rc_smmu_idmaps = g_array_new(false, true, sizeof(AcpiIortIdMapping));
|
||||
+ idmap.input_base = min_bus << 8,
|
||||
+ idmap.id_count = (max_bus - min_bus + 1) << 8,
|
||||
+ g_array_append_val(sdev.rc_smmu_idmaps, idmap);
|
||||
+ g_array_append_val(sdev_blob, sdev);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Populate the struct AcpiIortSMMUv3Dev for all SMMUv3 devices and
|
||||
+ * return the total number of idmaps.
|
||||
+ */
|
||||
+static int populate_smmuv3_dev(GArray *sdev_blob)
|
||||
+{
|
||||
+ object_child_foreach_recursive(object_get_root(),
|
||||
+ iort_smmuv3_devices, sdev_blob);
|
||||
+ /* Sort the smmuv3 devices(if any) by smmu idmap input_base */
|
||||
+ g_array_sort(sdev_blob, smmuv3_dev_idmap_compare);
|
||||
+ /*
|
||||
+ * Since each SMMUv3 dev is assocaited with specific host bridge,
|
||||
+ * total number of idmaps equals to total number of smmuv3 devices.
|
||||
+ */
|
||||
+ return sdev_blob->len;
|
||||
+}
|
||||
+
|
||||
/* Compute ID ranges (RIDs) from RC that are directed to the ITS Group node */
|
||||
static void create_rc_its_idmaps(GArray *its_idmaps, GArray *smmuv3_devs)
|
||||
{
|
||||
@@ -401,6 +463,8 @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||||
|
||||
if (vms->legacy_smmuv3_present) {
|
||||
rc_smmu_idmaps_len = populate_smmuv3_legacy_dev(smmuv3_devs);
|
||||
+ } else {
|
||||
+ rc_smmu_idmaps_len = populate_smmuv3_dev(smmuv3_devs);
|
||||
}
|
||||
|
||||
num_smmus = smmuv3_devs->len;
|
||||
--
|
||||
2.47.3
|
||||
|
||||
150
kvm-hw-pci-Introduce-pci_setup_iommu_per_bus-for-per-bus.patch
Normal file
150
kvm-hw-pci-Introduce-pci_setup_iommu_per_bus-for-per-bus.patch
Normal file
@ -0,0 +1,150 @@
|
||||
From 34d06db7ea02cd3a0a07082fef93e08bfbf0b06a Mon Sep 17 00:00:00 2001
|
||||
From: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Date: Fri, 29 Aug 2025 09:25:28 +0100
|
||||
Subject: [PATCH 10/16] hw/pci: Introduce pci_setup_iommu_per_bus() for per-bus
|
||||
IOMMU ops retrieval
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 423: hw/arm/virt: Add support for user creatable SMMUv3 device
|
||||
RH-Jira: RHEL-73800
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Sebastian Ott <sebott@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Commit: [6/11] 0c41f77254cd66a3648c14c5d4ba2dfdbd396665 (eauger1/centos-qemu-kvm)
|
||||
|
||||
Currently, pci_setup_iommu() registers IOMMU ops for a given PCIBus.
|
||||
However, when retrieving IOMMU ops for a device using
|
||||
pci_device_get_iommu_bus_devfn(), the function checks the parent_dev
|
||||
and fetches IOMMU ops from the parent device, even if the current
|
||||
bus does not have any associated IOMMU ops.
|
||||
|
||||
This behavior works for now because QEMU's IOMMU implementations are
|
||||
globally scoped, and host bridges rely on the bypass_iommu property
|
||||
to skip IOMMU translation when needed.
|
||||
|
||||
However, this model will break with the soon to be introduced
|
||||
arm-smmuv3 device, which allows users to associate the IOMMU
|
||||
with a specific PCIe root complex (e.g., the default pcie.0
|
||||
or a pxb-pcie root complex).
|
||||
|
||||
For example, consider the following setup with multiple root
|
||||
complexes:
|
||||
|
||||
-device arm-smmuv3,primary-bus=pcie.0,id=smmuv3.0 \
|
||||
...
|
||||
-device pxb-pcie,id=pcie.1,bus_nr=8,bus=pcie.0 \
|
||||
-device pcie-root-port,id=pcie.port1,bus=pcie.1 \
|
||||
-device virtio-net-pci,bus=pcie.port1
|
||||
|
||||
In Qemu, pxb-pcie acts as a special root complex whose parent is
|
||||
effectively the default root complex(pcie.0). Hence, though pcie.1
|
||||
has no associated SMMUv3 as per above, pci_device_get_iommu_bus_devfn()
|
||||
will incorrectly return the IOMMU ops from pcie.0 due to the fallback
|
||||
via parent_dev.
|
||||
|
||||
To fix this, introduce a new helper pci_setup_iommu_per_bus() that
|
||||
explicitly sets the new iommu_per_bus field in the PCIBus structure.
|
||||
This helper will be used in a subsequent patch that adds support for
|
||||
the new arm-smmuv3 device.
|
||||
|
||||
Update pci_device_get_iommu_bus_devfn() to use iommu_per_bus when
|
||||
determining the correct IOMMU ops, ensuring accurate behavior for
|
||||
per-bus IOMMUs.
|
||||
|
||||
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
|
||||
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Nathan Chen <nathanc@nvidia.com>
|
||||
Tested-by: Eric Auger <eric.auger@redhat.com>
|
||||
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
||||
Signed-off-by: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Reviewed-by: Donald Dutile <ddutile@redhat.com>
|
||||
Message-id: 20250829082543.7680-7-skolothumtho@nvidia.com
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
(cherry picked from commit 951bc76fb669eab96cc60e38a50097ad4435163e)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
hw/pci/pci.c | 31 +++++++++++++++++++++++++++++++
|
||||
include/hw/pci/pci.h | 2 ++
|
||||
include/hw/pci/pci_bus.h | 1 +
|
||||
3 files changed, 34 insertions(+)
|
||||
|
||||
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
|
||||
index c70b5ceeba..0012cc12e7 100644
|
||||
--- a/hw/pci/pci.c
|
||||
+++ b/hw/pci/pci.c
|
||||
@@ -2909,6 +2909,19 @@ static void pci_device_get_iommu_bus_devfn(PCIDevice *dev,
|
||||
}
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * When multiple PCI Express Root Buses are defined using pxb-pcie,
|
||||
+ * the IOMMU configuration may be specific to each root bus. However,
|
||||
+ * pxb-pcie acts as a special root complex whose parent is effectively
|
||||
+ * the default root complex(pcie.0). Ensure that we retrieve the
|
||||
+ * correct IOMMU ops(if any) in such cases.
|
||||
+ */
|
||||
+ if (pci_bus_is_express(iommu_bus) && pci_bus_is_root(iommu_bus)) {
|
||||
+ if (parent_bus->iommu_per_bus) {
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
iommu_bus = parent_bus;
|
||||
}
|
||||
|
||||
@@ -3169,6 +3182,24 @@ void pci_setup_iommu(PCIBus *bus, const PCIIOMMUOps *ops, void *opaque)
|
||||
bus->iommu_opaque = opaque;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Similar to pci_setup_iommu(), but sets iommu_per_bus to true,
|
||||
+ * indicating that the IOMMU is specific to this bus. This is used by
|
||||
+ * IOMMU implementations that are tied to a specific PCIe root complex.
|
||||
+ *
|
||||
+ * In QEMU, pxb-pcie behaves as a special root complex whose parent is
|
||||
+ * effectively the default root complex (pcie.0). The iommu_per_bus
|
||||
+ * is checked in pci_device_get_iommu_bus_devfn() to ensure the correct
|
||||
+ * IOMMU ops are returned, avoiding the use of the parent’s IOMMU when
|
||||
+ * it's not appropriate.
|
||||
+ */
|
||||
+void pci_setup_iommu_per_bus(PCIBus *bus, const PCIIOMMUOps *ops,
|
||||
+ void *opaque)
|
||||
+{
|
||||
+ pci_setup_iommu(bus, ops, opaque);
|
||||
+ bus->iommu_per_bus = true;
|
||||
+}
|
||||
+
|
||||
static void pci_dev_get_w64(PCIBus *b, PCIDevice *dev, void *opaque)
|
||||
{
|
||||
Range *range = opaque;
|
||||
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
|
||||
index 6b7d3ac8a3..6bccb25ac2 100644
|
||||
--- a/include/hw/pci/pci.h
|
||||
+++ b/include/hw/pci/pci.h
|
||||
@@ -773,6 +773,8 @@ int pci_iommu_unregister_iotlb_notifier(PCIDevice *dev, uint32_t pasid,
|
||||
*/
|
||||
void pci_setup_iommu(PCIBus *bus, const PCIIOMMUOps *ops, void *opaque);
|
||||
|
||||
+void pci_setup_iommu_per_bus(PCIBus *bus, const PCIIOMMUOps *ops, void *opaque);
|
||||
+
|
||||
pcibus_t pci_bar_address(PCIDevice *d,
|
||||
int reg, uint8_t type, pcibus_t size);
|
||||
|
||||
diff --git a/include/hw/pci/pci_bus.h b/include/hw/pci/pci_bus.h
|
||||
index 2261312546..c738446788 100644
|
||||
--- a/include/hw/pci/pci_bus.h
|
||||
+++ b/include/hw/pci/pci_bus.h
|
||||
@@ -35,6 +35,7 @@ struct PCIBus {
|
||||
enum PCIBusFlags flags;
|
||||
const PCIIOMMUOps *iommu_ops;
|
||||
void *iommu_opaque;
|
||||
+ bool iommu_per_bus;
|
||||
uint8_t devfn_min;
|
||||
uint32_t slot_reserved_mask;
|
||||
pci_set_irq_fn set_irq;
|
||||
--
|
||||
2.47.3
|
||||
|
||||
189
kvm-io-fix-use-after-free-in-websocket-handshake-code.patch
Normal file
189
kvm-io-fix-use-after-free-in-websocket-handshake-code.patch
Normal file
@ -0,0 +1,189 @@
|
||||
From 728cf99416aaaae2cc0fca6ee88f28ccec33d697 Mon Sep 17 00:00:00 2001
|
||||
From: Jon Maloy <jmaloy@redhat.com>
|
||||
Date: Tue, 4 Nov 2025 17:28:47 -0500
|
||||
Subject: [PATCH 02/16] io: fix use after free in websocket handshake code
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Jon Maloy <jmaloy@redhat.com>
|
||||
RH-MergeRequest: 419: io: move websock resource release to close method
|
||||
RH-Jira: RHEL-120116
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [2/2] acdb5414387815a8b2f0a84a151990875947e855 (jmaloy/jmaloy-qemu-kvm-2)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-120116
|
||||
CVE: CVE-2025-11234
|
||||
|
||||
commit b7a1f2ca45c7865b9e98e02ae605a65fc9458ae9
|
||||
Author: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Date: Tue Sep 30 12:03:15 2025 +0100
|
||||
|
||||
io: fix use after free in websocket handshake code
|
||||
|
||||
If the QIOChannelWebsock object is freed while it is waiting to
|
||||
complete a handshake, a GSource is leaked. This can lead to the
|
||||
callback firing later on and triggering a use-after-free in the
|
||||
use of the channel. This was observed in the VNC server with the
|
||||
following trace from valgrind:
|
||||
|
||||
==2523108== Invalid read of size 4
|
||||
==2523108== at 0x4054A24: vnc_disconnect_start (vnc.c:1296)
|
||||
==2523108== by 0x4054A24: vnc_client_error (vnc.c:1392)
|
||||
==2523108== by 0x4068A09: vncws_handshake_done (vnc-ws.c:105)
|
||||
==2523108== by 0x44863B4: qio_task_complete (task.c:197)
|
||||
==2523108== by 0x448343D: qio_channel_websock_handshake_io (channel-websock.c:588)
|
||||
==2523108== by 0x6EDB862: UnknownInlinedFun (gmain.c:3398)
|
||||
==2523108== by 0x6EDB862: g_main_context_dispatch_unlocked.lto_priv.0 (gmain.c:4249)
|
||||
==2523108== by 0x6EDBAE4: g_main_context_dispatch (gmain.c:4237)
|
||||
==2523108== by 0x45EC79F: glib_pollfds_poll (main-loop.c:287)
|
||||
==2523108== by 0x45EC79F: os_host_main_loop_wait (main-loop.c:310)
|
||||
==2523108== by 0x45EC79F: main_loop_wait (main-loop.c:589)
|
||||
==2523108== by 0x423A56D: qemu_main_loop (runstate.c:835)
|
||||
==2523108== by 0x454F300: qemu_default_main (main.c:37)
|
||||
==2523108== by 0x73D6574: (below main) (libc_start_call_main.h:58)
|
||||
==2523108== Address 0x57a6e0dc is 28 bytes inside a block of size 103,608 free'd
|
||||
==2523108== at 0x5F2FE43: free (vg_replace_malloc.c:989)
|
||||
==2523108== by 0x6EDC444: g_free (gmem.c:208)
|
||||
==2523108== by 0x4053F23: vnc_update_client (vnc.c:1153)
|
||||
==2523108== by 0x4053F23: vnc_refresh (vnc.c:3225)
|
||||
==2523108== by 0x4042881: dpy_refresh (console.c:880)
|
||||
==2523108== by 0x4042881: gui_update (console.c:90)
|
||||
==2523108== by 0x45EFA1B: timerlist_run_timers.part.0 (qemu-timer.c:562)
|
||||
==2523108== by 0x45EFC8F: timerlist_run_timers (qemu-timer.c:495)
|
||||
==2523108== by 0x45EFC8F: qemu_clock_run_timers (qemu-timer.c:576)
|
||||
==2523108== by 0x45EFC8F: qemu_clock_run_all_timers (qemu-timer.c:663)
|
||||
==2523108== by 0x45EC765: main_loop_wait (main-loop.c:600)
|
||||
==2523108== by 0x423A56D: qemu_main_loop (runstate.c:835)
|
||||
==2523108== by 0x454F300: qemu_default_main (main.c:37)
|
||||
==2523108== by 0x73D6574: (below main) (libc_start_call_main.h:58)
|
||||
==2523108== Block was alloc'd at
|
||||
==2523108== at 0x5F343F3: calloc (vg_replace_malloc.c:1675)
|
||||
==2523108== by 0x6EE2F81: g_malloc0 (gmem.c:133)
|
||||
==2523108== by 0x4057DA3: vnc_connect (vnc.c:3245)
|
||||
==2523108== by 0x448591B: qio_net_listener_channel_func (net-listener.c:54)
|
||||
==2523108== by 0x6EDB862: UnknownInlinedFun (gmain.c:3398)
|
||||
==2523108== by 0x6EDB862: g_main_context_dispatch_unlocked.lto_priv.0 (gmain.c:4249)
|
||||
==2523108== by 0x6EDBAE4: g_main_context_dispatch (gmain.c:4237)
|
||||
==2523108== by 0x45EC79F: glib_pollfds_poll (main-loop.c:287)
|
||||
==2523108== by 0x45EC79F: os_host_main_loop_wait (main-loop.c:310)
|
||||
==2523108== by 0x45EC79F: main_loop_wait (main-loop.c:589)
|
||||
==2523108== by 0x423A56D: qemu_main_loop (runstate.c:835)
|
||||
==2523108== by 0x454F300: qemu_default_main (main.c:37)
|
||||
==2523108== by 0x73D6574: (below main) (libc_start_call_main.h:58)
|
||||
==2523108==
|
||||
|
||||
The above can be reproduced by launching QEMU with
|
||||
|
||||
$ qemu-system-x86_64 -vnc localhost:0,websocket=5700
|
||||
|
||||
and then repeatedly running:
|
||||
|
||||
for i in {1..100}; do
|
||||
(echo -n "GET / HTTP/1.1" && sleep 0.05) | nc -w 1 localhost 5700 &
|
||||
done
|
||||
|
||||
CVE-2025-11234
|
||||
Reported-by: Grant Millar | Cylo <rid@cylo.io>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
|
||||
Signed-off-by: Jon Maloy <jmaloy@redhat.com>
|
||||
---
|
||||
include/io/channel-websock.h | 3 ++-
|
||||
io/channel-websock.c | 22 ++++++++++++++++------
|
||||
2 files changed, 18 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/include/io/channel-websock.h b/include/io/channel-websock.h
|
||||
index e180827c57..6700cf8946 100644
|
||||
--- a/include/io/channel-websock.h
|
||||
+++ b/include/io/channel-websock.h
|
||||
@@ -61,7 +61,8 @@ struct QIOChannelWebsock {
|
||||
size_t payload_remain;
|
||||
size_t pong_remain;
|
||||
QIOChannelWebsockMask mask;
|
||||
- guint io_tag;
|
||||
+ guint hs_io_tag; /* tracking handshake task */
|
||||
+ guint io_tag; /* tracking watch task */
|
||||
Error *io_err;
|
||||
gboolean io_eof;
|
||||
uint8_t opcode;
|
||||
diff --git a/io/channel-websock.c b/io/channel-websock.c
|
||||
index a19b902ff9..ec5e09f9ab 100644
|
||||
--- a/io/channel-websock.c
|
||||
+++ b/io/channel-websock.c
|
||||
@@ -545,6 +545,7 @@ static gboolean qio_channel_websock_handshake_send(QIOChannel *ioc,
|
||||
trace_qio_channel_websock_handshake_fail(ioc, error_get_pretty(err));
|
||||
qio_task_set_error(task, err);
|
||||
qio_task_complete(task);
|
||||
+ wioc->hs_io_tag = 0;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -560,6 +561,7 @@ static gboolean qio_channel_websock_handshake_send(QIOChannel *ioc,
|
||||
trace_qio_channel_websock_handshake_complete(ioc);
|
||||
qio_task_complete(task);
|
||||
}
|
||||
+ wioc->hs_io_tag = 0;
|
||||
return FALSE;
|
||||
}
|
||||
trace_qio_channel_websock_handshake_pending(ioc, G_IO_OUT);
|
||||
@@ -586,6 +588,7 @@ static gboolean qio_channel_websock_handshake_io(QIOChannel *ioc,
|
||||
trace_qio_channel_websock_handshake_fail(ioc, error_get_pretty(err));
|
||||
qio_task_set_error(task, err);
|
||||
qio_task_complete(task);
|
||||
+ wioc->hs_io_tag = 0;
|
||||
return FALSE;
|
||||
}
|
||||
if (ret == 0) {
|
||||
@@ -597,7 +600,7 @@ static gboolean qio_channel_websock_handshake_io(QIOChannel *ioc,
|
||||
error_propagate(&wioc->io_err, err);
|
||||
|
||||
trace_qio_channel_websock_handshake_reply(ioc);
|
||||
- qio_channel_add_watch(
|
||||
+ wioc->hs_io_tag = qio_channel_add_watch(
|
||||
wioc->master,
|
||||
G_IO_OUT,
|
||||
qio_channel_websock_handshake_send,
|
||||
@@ -907,11 +910,12 @@ void qio_channel_websock_handshake(QIOChannelWebsock *ioc,
|
||||
|
||||
trace_qio_channel_websock_handshake_start(ioc);
|
||||
trace_qio_channel_websock_handshake_pending(ioc, G_IO_IN);
|
||||
- qio_channel_add_watch(ioc->master,
|
||||
- G_IO_IN,
|
||||
- qio_channel_websock_handshake_io,
|
||||
- task,
|
||||
- NULL);
|
||||
+ ioc->hs_io_tag = qio_channel_add_watch(
|
||||
+ ioc->master,
|
||||
+ G_IO_IN,
|
||||
+ qio_channel_websock_handshake_io,
|
||||
+ task,
|
||||
+ NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -922,6 +926,9 @@ static void qio_channel_websock_finalize(Object *obj)
|
||||
buffer_free(&ioc->encinput);
|
||||
buffer_free(&ioc->encoutput);
|
||||
buffer_free(&ioc->rawinput);
|
||||
+ if (ioc->hs_io_tag) {
|
||||
+ g_source_remove(ioc->hs_io_tag);
|
||||
+ }
|
||||
if (ioc->io_tag) {
|
||||
g_source_remove(ioc->io_tag);
|
||||
}
|
||||
@@ -1222,6 +1229,9 @@ static int qio_channel_websock_close(QIOChannel *ioc,
|
||||
buffer_free(&wioc->encinput);
|
||||
buffer_free(&wioc->encoutput);
|
||||
buffer_free(&wioc->rawinput);
|
||||
+ if (wioc->hs_io_tag) {
|
||||
+ g_clear_handle_id(&wioc->hs_io_tag, g_source_remove);
|
||||
+ }
|
||||
if (wioc->io_tag) {
|
||||
g_clear_handle_id(&wioc->io_tag, g_source_remove);
|
||||
}
|
||||
--
|
||||
2.47.3
|
||||
|
||||
84
kvm-io-move-websock-resource-release-to-close-method.patch
Normal file
84
kvm-io-move-websock-resource-release-to-close-method.patch
Normal file
@ -0,0 +1,84 @@
|
||||
From 9aaede253bb55035f0a1171fb1c4eda847ca9493 Mon Sep 17 00:00:00 2001
|
||||
From: Jon Maloy <jmaloy@redhat.com>
|
||||
Date: Tue, 4 Nov 2025 17:23:29 -0500
|
||||
Subject: [PATCH 01/16] io: move websock resource release to close method
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Jon Maloy <jmaloy@redhat.com>
|
||||
RH-MergeRequest: 419: io: move websock resource release to close method
|
||||
RH-Jira: RHEL-120116
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Commit: [1/2] ca3067b2afed8d770626436b77fdd90bd5cb22e7 (jmaloy/jmaloy-qemu-kvm-2)
|
||||
|
||||
JIRA: https://issues.redhat.com/browse/RHEL-120116
|
||||
CVE: CVE-2025-11234
|
||||
|
||||
commit 322c3c4f3abee616a18b3bfe563ec29dd67eae63
|
||||
Author: Daniel P. Berrangé <berrange@redhat.com>
|
||||
Date: Tue Sep 30 11:58:35 2025 +0100
|
||||
|
||||
io: move websock resource release to close method
|
||||
|
||||
The QIOChannelWebsock object releases all its resources in the
|
||||
finalize callback. This is later than desired, as callers expect
|
||||
to be able to call qio_channel_close() to fully close a channel
|
||||
and release resources related to I/O.
|
||||
|
||||
The logic in the finalize method is at most a failsafe to handle
|
||||
cases where a consumer forgets to call qio_channel_close.
|
||||
|
||||
This adds equivalent logic to the close method to release the
|
||||
resources, using g_clear_handle_id/g_clear_pointer to be robust
|
||||
against repeated invocations. The finalize method is tweaked
|
||||
so that the GSource is removed before releasing the underlying
|
||||
channel.
|
||||
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||
|
||||
Signed-off-by: Jon Maloy <jmaloy@redhat.com>
|
||||
---
|
||||
io/channel-websock.c | 11 ++++++++++-
|
||||
1 file changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/io/channel-websock.c b/io/channel-websock.c
|
||||
index 08ddb274f0..a19b902ff9 100644
|
||||
--- a/io/channel-websock.c
|
||||
+++ b/io/channel-websock.c
|
||||
@@ -922,13 +922,13 @@ static void qio_channel_websock_finalize(Object *obj)
|
||||
buffer_free(&ioc->encinput);
|
||||
buffer_free(&ioc->encoutput);
|
||||
buffer_free(&ioc->rawinput);
|
||||
- object_unref(OBJECT(ioc->master));
|
||||
if (ioc->io_tag) {
|
||||
g_source_remove(ioc->io_tag);
|
||||
}
|
||||
if (ioc->io_err) {
|
||||
error_free(ioc->io_err);
|
||||
}
|
||||
+ object_unref(OBJECT(ioc->master));
|
||||
}
|
||||
|
||||
|
||||
@@ -1219,6 +1219,15 @@ static int qio_channel_websock_close(QIOChannel *ioc,
|
||||
QIOChannelWebsock *wioc = QIO_CHANNEL_WEBSOCK(ioc);
|
||||
|
||||
trace_qio_channel_websock_close(ioc);
|
||||
+ buffer_free(&wioc->encinput);
|
||||
+ buffer_free(&wioc->encoutput);
|
||||
+ buffer_free(&wioc->rawinput);
|
||||
+ if (wioc->io_tag) {
|
||||
+ g_clear_handle_id(&wioc->io_tag, g_source_remove);
|
||||
+ }
|
||||
+ if (wioc->io_err) {
|
||||
+ g_clear_pointer(&wioc->io_err, error_free);
|
||||
+ }
|
||||
return qio_channel_close(wioc->master, errp);
|
||||
}
|
||||
|
||||
--
|
||||
2.47.3
|
||||
|
||||
53
kvm-qemu-options.hx-Document-the-arm-smmuv3-device.patch
Normal file
53
kvm-qemu-options.hx-Document-the-arm-smmuv3-device.patch
Normal file
@ -0,0 +1,53 @@
|
||||
From bf0ecadea242c05671bf057fc45d8c58862032d3 Mon Sep 17 00:00:00 2001
|
||||
From: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Date: Fri, 29 Aug 2025 09:25:30 +0100
|
||||
Subject: [PATCH 12/16] qemu-options.hx: Document the arm-smmuv3 device
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 423: hw/arm/virt: Add support for user creatable SMMUv3 device
|
||||
RH-Jira: RHEL-73800
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Sebastian Ott <sebott@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Commit: [8/11] 775310b784fd7631a58e8bab1e8fcc36973fceca (eauger1/centos-qemu-kvm)
|
||||
|
||||
Now that arm,virt can have user-creatable smmuv3 devices, document it.
|
||||
|
||||
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
|
||||
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
||||
Signed-off-by: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Reviewed-by: Donald Dutile <ddutile@redhat.com>
|
||||
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Message-id: 20250829082543.7680-9-skolothumtho@nvidia.com
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
(cherry picked from commit 73d3d0187bc6b482d8b15116edce1475c7975b89)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
qemu-options.hx | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/qemu-options.hx b/qemu-options.hx
|
||||
index 3837456a61..5f146c1860 100644
|
||||
--- a/qemu-options.hx
|
||||
+++ b/qemu-options.hx
|
||||
@@ -1231,6 +1231,13 @@ SRST
|
||||
``aw-bits=val`` (val between 32 and 64, default depends on machine)
|
||||
This decides the address width of the IOVA address space.
|
||||
|
||||
+``-device arm-smmuv3,primary-bus=id``
|
||||
+ This is only supported by ``-machine virt`` (ARM).
|
||||
+
|
||||
+ ``primary-bus=id``
|
||||
+ Accepts either the default root complex (pcie.0) or a
|
||||
+ pxb-pcie based root complex.
|
||||
+
|
||||
ERST
|
||||
|
||||
DEF("name", HAS_ARG, QEMU_OPTION_name,
|
||||
--
|
||||
2.47.3
|
||||
|
||||
30
kvm-qtest-Do-not-run-bios-tables-test-on-aarch64.patch
Normal file
30
kvm-qtest-Do-not-run-bios-tables-test-on-aarch64.patch
Normal file
@ -0,0 +1,30 @@
|
||||
From 3b21c60b771087e7d566bf738e04e01a7a1bdf09 Mon Sep 17 00:00:00 2001
|
||||
From: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
Date: Fri, 14 Nov 2025 06:46:07 +0100
|
||||
Subject: [PATCH 16/16] qtest: Do not run bios-tables-test on aarch64
|
||||
|
||||
We do several disruptive downstream only changes that make
|
||||
bios-tables-test to fail. Disabling it for now.
|
||||
|
||||
This is done to enable fixing RHEL-126573 and RHEL-67323.
|
||||
|
||||
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
---
|
||||
tests/qtest/meson.build | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
|
||||
index ef44ffaf78..13b52ea41a 100644
|
||||
--- a/tests/qtest/meson.build
|
||||
+++ b/tests/qtest/meson.build
|
||||
@@ -252,7 +252,6 @@ qtests_arm = \
|
||||
|
||||
# TODO: once aarch64 TCG is fixed on ARM 32 bit host, make bios-tables-test unconditional
|
||||
qtests_aarch64 = \
|
||||
- (cpu != 'arm' and unpack_edk2_blobs ? ['bios-tables-test'] : []) + \
|
||||
(config_all_accel.has_key('CONFIG_TCG') and config_all_devices.has_key('CONFIG_TPM_TIS_SYSBUS') ? \
|
||||
['tpm-tis-device-test', 'tpm-tis-device-swtpm-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_XLNX_ZYNQMP_ARM') ? ['xlnx-can-test', 'fuzz-xlnx-dp-test'] : []) + \
|
||||
--
|
||||
2.47.3
|
||||
|
||||
160
kvm-qtest-bios-tables-test-Add-tests-for-legacy-smmuv3-a.patch
Normal file
160
kvm-qtest-bios-tables-test-Add-tests-for-legacy-smmuv3-a.patch
Normal file
@ -0,0 +1,160 @@
|
||||
From 51ec91309c99a5d81b53c2762d18c073f672e45a Mon Sep 17 00:00:00 2001
|
||||
From: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Date: Fri, 29 Aug 2025 09:25:32 +0100
|
||||
Subject: [PATCH 14/16] qtest/bios-tables-test: Add tests for legacy smmuv3 and
|
||||
smmuv3 device
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 423: hw/arm/virt: Add support for user creatable SMMUv3 device
|
||||
RH-Jira: RHEL-73800
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Sebastian Ott <sebott@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Commit: [10/11] 101ed34313636fdc11f7fbdedbe2f91671b84c4b (eauger1/centos-qemu-kvm)
|
||||
|
||||
For the legacy SMMUv3 test, the setup includes three PCIe Root Complexes,
|
||||
one of which has bypass_iommu enabled. The generated IORT table contains
|
||||
a single SMMUv3 node, a Root Complex(RC) node and 1 ITS node.
|
||||
RC node features 4 ID mappings, of which 2 points to SMMU node and the
|
||||
remaining ones points to ITS.
|
||||
|
||||
pcie.0 -> {SMMU0} -> {ITS}
|
||||
{RC} pcie.1 -> {SMMU0} -> {ITS}
|
||||
pcie.2 -> {ITS}
|
||||
[all other ids] -> {ITS}
|
||||
|
||||
For the -device arm-smmuv3,... test, the configuration also includes three
|
||||
Root Complexes, with two connected to separate SMMUv3 devices.
|
||||
The resulting IORT table contains 1 RC node, 2 SMMU nodes and 1 ITS node.
|
||||
RC node features 4 ID mappings. 2 of them target the 2 SMMU nodes while
|
||||
the others targets the ITS.
|
||||
|
||||
pcie.0 -> {SMMU0} -> {ITS}
|
||||
{RC} pcie.1 -> {SMMU1} -> {ITS}
|
||||
pcie.2 -> {ITS}
|
||||
[all other ids] -> {ITS}
|
||||
|
||||
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
|
||||
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
||||
Signed-off-by: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Reviewed-by: Donald Dutile <ddutile@redhat.com>
|
||||
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Message-id: 20250829082543.7680-11-skolothumtho@nvidia.com
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
(cherry picked from commit 3f8cd046c151c471d9a34181320f4a7d3f72b32a)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
tests/qtest/bios-tables-test.c | 86 ++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 86 insertions(+)
|
||||
|
||||
diff --git a/tests/qtest/bios-tables-test.c b/tests/qtest/bios-tables-test.c
|
||||
index 386196edc8..a384aac1be 100644
|
||||
--- a/tests/qtest/bios-tables-test.c
|
||||
+++ b/tests/qtest/bios-tables-test.c
|
||||
@@ -2343,6 +2343,86 @@ static void test_acpi_aarch64_virt_viot(void)
|
||||
free_test_data(&data);
|
||||
}
|
||||
|
||||
+static void test_acpi_aarch64_virt_smmuv3_legacy(void)
|
||||
+{
|
||||
+ test_data data = {
|
||||
+ .machine = "virt",
|
||||
+ .arch = "aarch64",
|
||||
+ .tcg_only = true,
|
||||
+ .uefi_fl1 = "pc-bios/edk2-aarch64-code.fd",
|
||||
+ .uefi_fl2 = "pc-bios/edk2-arm-vars.fd",
|
||||
+ .ram_start = 0x40000000ULL,
|
||||
+ .scan_len = 128ULL * MiB,
|
||||
+ };
|
||||
+
|
||||
+ /*
|
||||
+ * cdrom is plugged into scsi controller to avoid conflict
|
||||
+ * with pxb-pcie. See comments in test_acpi_aarch64_virt_tcg_pxb() for
|
||||
+ * details.
|
||||
+ *
|
||||
+ * The setup includes three PCIe root complexes, one of which has
|
||||
+ * bypass_iommu enabled. The generated IORT table contains a single
|
||||
+ * SMMUv3 node and a Root Complex node with three ID mappings. Two
|
||||
+ * of the ID mappings have output references pointing to the SMMUv3
|
||||
+ * node and the remaining one points to ITS.
|
||||
+ */
|
||||
+ data.variant = ".smmuv3-legacy";
|
||||
+ test_acpi_one(" -device pcie-root-port,chassis=1,id=pci.1"
|
||||
+ " -device virtio-scsi-pci,id=scsi0,bus=pci.1"
|
||||
+ " -drive file="
|
||||
+ "tests/data/uefi-boot-images/bios-tables-test.aarch64.iso.qcow2,"
|
||||
+ "if=none,media=cdrom,id=drive-scsi0-0-0-1,readonly=on"
|
||||
+ " -device scsi-cd,bus=scsi0.0,scsi-id=0,"
|
||||
+ "drive=drive-scsi0-0-0-1,id=scsi0-0-0-1,bootindex=1"
|
||||
+ " -cpu cortex-a57"
|
||||
+ " -M iommu=smmuv3"
|
||||
+ " -device pxb-pcie,id=pcie.1,bus=pcie.0,bus_nr=0x10"
|
||||
+ " -device pxb-pcie,id=pcie.2,bus=pcie.0,bus_nr=0x20,bypass_iommu=on",
|
||||
+ &data);
|
||||
+ free_test_data(&data);
|
||||
+}
|
||||
+
|
||||
+static void test_acpi_aarch64_virt_smmuv3_dev(void)
|
||||
+{
|
||||
+ test_data data = {
|
||||
+ .machine = "virt",
|
||||
+ .arch = "aarch64",
|
||||
+ .tcg_only = true,
|
||||
+ .uefi_fl1 = "pc-bios/edk2-aarch64-code.fd",
|
||||
+ .uefi_fl2 = "pc-bios/edk2-arm-vars.fd",
|
||||
+ .ram_start = 0x40000000ULL,
|
||||
+ .scan_len = 128ULL * MiB,
|
||||
+ };
|
||||
+
|
||||
+ /*
|
||||
+ * cdrom is plugged into scsi controller to avoid conflict
|
||||
+ * with pxb-pcie. See comments in test_acpi_aarch64_virt_tcg_pxb()
|
||||
+ * for details.
|
||||
+ *
|
||||
+ * The setup includes three PCie root complexes, two of which are
|
||||
+ * connected to separate SMMUv3 devices. The resulting IORT table
|
||||
+ * contains two SMMUv3 nodes and a Root Complex node with ID mappings
|
||||
+ * of which two of the ID mappings have output references pointing
|
||||
+ * to two different SMMUv3 nodes and the remaining ones pointing to
|
||||
+ * ITS.
|
||||
+ */
|
||||
+ data.variant = ".smmuv3-dev";
|
||||
+ test_acpi_one(" -device pcie-root-port,chassis=1,id=pci.1"
|
||||
+ " -device virtio-scsi-pci,id=scsi0,bus=pci.1"
|
||||
+ " -drive file="
|
||||
+ "tests/data/uefi-boot-images/bios-tables-test.aarch64.iso.qcow2,"
|
||||
+ "if=none,media=cdrom,id=drive-scsi0-0-0-1,readonly=on"
|
||||
+ " -device scsi-cd,bus=scsi0.0,scsi-id=0,"
|
||||
+ "drive=drive-scsi0-0-0-1,id=scsi0-0-0-1,bootindex=1"
|
||||
+ " -cpu cortex-a57"
|
||||
+ " -device arm-smmuv3,primary-bus=pcie.0,id=smmuv3.0"
|
||||
+ " -device pxb-pcie,id=pcie.1,bus=pcie.0,bus_nr=0x10"
|
||||
+ " -device arm-smmuv3,primary-bus=pcie.1,id=smmuv3.1"
|
||||
+ " -device pxb-pcie,id=pcie.2,bus=pcie.0,bus_nr=0x20",
|
||||
+ &data);
|
||||
+ free_test_data(&data);
|
||||
+}
|
||||
+
|
||||
#ifndef _WIN32
|
||||
# define DEV_NULL "/dev/null"
|
||||
#else
|
||||
@@ -2776,6 +2856,12 @@ int main(int argc, char *argv[])
|
||||
if (qtest_has_device("virtio-iommu-pci")) {
|
||||
qtest_add_func("acpi/virt/viot", test_acpi_aarch64_virt_viot);
|
||||
}
|
||||
+ qtest_add_func("acpi/virt/smmuv3-legacy",
|
||||
+ test_acpi_aarch64_virt_smmuv3_legacy);
|
||||
+ if (qtest_has_device("arm-smmuv3")) {
|
||||
+ qtest_add_func("acpi/virt/smmuv3-dev",
|
||||
+ test_acpi_aarch64_virt_smmuv3_dev);
|
||||
+ }
|
||||
}
|
||||
#if 0 /* Disabled for Red Hat Enterprise Linux */
|
||||
} else if (strcmp(arch, "riscv64") == 0) {
|
||||
--
|
||||
2.47.3
|
||||
|
||||
282
kvm-qtest-bios-tables-test-Update-tables-for-smmuv3-test.patch
Normal file
282
kvm-qtest-bios-tables-test-Update-tables-for-smmuv3-test.patch
Normal file
@ -0,0 +1,282 @@
|
||||
From d6f27731c3d469f4ba68807a4c1f8ee534cc9d57 Mon Sep 17 00:00:00 2001
|
||||
From: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Date: Fri, 29 Aug 2025 09:25:33 +0100
|
||||
Subject: [PATCH 15/16] qtest/bios-tables-test: Update tables for smmuv3 tests
|
||||
|
||||
RH-Author: Eric Auger <eric.auger@redhat.com>
|
||||
RH-MergeRequest: 423: hw/arm/virt: Add support for user creatable SMMUv3 device
|
||||
RH-Jira: RHEL-73800
|
||||
RH-Acked-by: Gavin Shan <gshan@redhat.com>
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Sebastian Ott <sebott@redhat.com>
|
||||
RH-Acked-by: Donald Dutile <None>
|
||||
RH-Commit: [11/11] 88cb1daec4e92b759f12a96daacd46fc4656eacd (eauger1/centos-qemu-kvm)
|
||||
|
||||
For the legacy smmuv3 test case, generated IORT has a single SMMUv3 node,
|
||||
a Root Complex(RC) node and 1 ITS node.
|
||||
RC node features 4 ID mappings, of which 2 points to SMMU node and the
|
||||
remaining ones points to ITS.
|
||||
|
||||
pcie.0 -> {SMMU0} -> {ITS}
|
||||
{RC} pcie.1 -> {SMMU0} -> {ITS}
|
||||
pcie.2 -> {ITS}
|
||||
[all other ids] -> {ITS}
|
||||
|
||||
...
|
||||
[030h 0048 1] Type : 00
|
||||
[031h 0049 2] Length : 0018
|
||||
[033h 0051 1] Revision : 01
|
||||
[034h 0052 4] Identifier : 00000000
|
||||
[038h 0056 4] Mapping Count : 00000000
|
||||
[03Ch 0060 4] Mapping Offset : 00000000
|
||||
|
||||
[040h 0064 4] ItsCount : 00000001
|
||||
[044h 0068 4] Identifiers : 00000000
|
||||
|
||||
[048h 0072 1] Type : 04
|
||||
[049h 0073 2] Length : 0058
|
||||
[04Bh 0075 1] Revision : 04
|
||||
[04Ch 0076 4] Identifier : 00000001
|
||||
[050h 0080 4] Mapping Count : 00000001
|
||||
[054h 0084 4] Mapping Offset : 00000044
|
||||
|
||||
[058h 0088 8] Base Address : 0000000009050000
|
||||
[060h 0096 4] Flags (decoded below) : 00000001
|
||||
COHACC Override : 1
|
||||
HTTU Override : 0
|
||||
Proximity Domain Valid : 0
|
||||
[064h 0100 4] Reserved : 00000000
|
||||
[068h 0104 8] VATOS Address : 0000000000000000
|
||||
[070h 0112 4] Model : 00000000
|
||||
[074h 0116 4] Event GSIV : 0000006A
|
||||
[078h 0120 4] PRI GSIV : 0000006B
|
||||
[07Ch 0124 4] GERR GSIV : 0000006D
|
||||
[080h 0128 4] Sync GSIV : 0000006C
|
||||
[084h 0132 4] Proximity Domain : 00000000
|
||||
[088h 0136 4] Device ID Mapping Index : 00000000
|
||||
|
||||
[08Ch 0140 4] Input base : 00000000
|
||||
[090h 0144 4] ID Count : 0000FFFF
|
||||
[094h 0148 4] Output Base : 00000000
|
||||
[098h 0152 4] Output Reference : 00000030
|
||||
[09Ch 0156 4] Flags (decoded below) : 00000000
|
||||
Single Mapping : 0
|
||||
|
||||
[0A0h 0160 1] Type : 02
|
||||
[0A1h 0161 2] Length : 0074
|
||||
[0A3h 0163 1] Revision : 03
|
||||
[0A4h 0164 4] Identifier : 00000002
|
||||
[0A8h 0168 4] Mapping Count : 00000004
|
||||
[0ACh 0172 4] Mapping Offset : 00000024
|
||||
|
||||
[0B0h 0176 8] Memory Properties : [IORT Memory Access Properties]
|
||||
[0B0h 0176 4] Cache Coherency : 00000001
|
||||
[0B4h 0180 1] Hints (decoded below) : 00
|
||||
Transient : 0
|
||||
Write Allocate : 0
|
||||
Read Allocate : 0
|
||||
Override : 0
|
||||
[0B5h 0181 2] Reserved : 0000
|
||||
[0B7h 0183 1] Memory Flags (decoded below) : 03
|
||||
Coherency : 1
|
||||
Device Attribute : 1
|
||||
[0B8h 0184 4] ATS Attribute : 00000000
|
||||
[0BCh 0188 4] PCI Segment Number : 00000000
|
||||
[0C0h 0192 1] Memory Size Limit : 40
|
||||
[0C1h 0193 2] PASID Capabilities : 0000
|
||||
[0C3h 0195 1] Reserved : 00
|
||||
|
||||
[0C4h 0196 4] Input base : 00000000
|
||||
[0C8h 0200 4] ID Count : 000001FF
|
||||
[0CCh 0204 4] Output Base : 00000000
|
||||
[0D0h 0208 4] Output Reference : 00000048
|
||||
[0D4h 0212 4] Flags (decoded below) : 00000000
|
||||
Single Mapping : 0
|
||||
|
||||
[0D8h 0216 4] Input base : 00001000
|
||||
[0DCh 0220 4] ID Count : 000000FF
|
||||
[0E0h 0224 4] Output Base : 00001000
|
||||
[0E4h 0228 4] Output Reference : 00000048
|
||||
[0E8h 0232 4] Flags (decoded below) : 00000000
|
||||
Single Mapping : 0
|
||||
|
||||
[0ECh 0236 4] Input base : 00000200
|
||||
[0F0h 0240 4] ID Count : 00000DFF
|
||||
[0F4h 0244 4] Output Base : 00000200
|
||||
[0F8h 0248 4] Output Reference : 00000030
|
||||
[0FCh 0252 4] Flags (decoded below) : 00000000
|
||||
Single Mapping : 0
|
||||
|
||||
[100h 0256 4] Input base : 00001100
|
||||
[104h 0260 4] ID Count : 0000EEFF
|
||||
[108h 0264 4] Output Base : 00001100
|
||||
[10Ch 0268 4] Output Reference : 00000030
|
||||
[110h 0272 4] Flags (decoded below) : 00000000
|
||||
Single Mapping : 0
|
||||
|
||||
For the smmuv3-dev test case, IORT has 2 SMMUV3 nodes,
|
||||
1 RC node and 1 ITS node.
|
||||
RC node features 4 ID mappings. 2 of them target the 2
|
||||
SMMU nodes while the others targets the ITS.
|
||||
|
||||
pcie.0 -> {SMMU0} -> {ITS}
|
||||
{RC} pcie.1 -> {SMMU1} -> {ITS}
|
||||
pcie.2 -> {ITS}
|
||||
[all other ids] -> {ITS}
|
||||
...
|
||||
[030h 0048 1] Type : 00
|
||||
[031h 0049 2] Length : 0018
|
||||
[033h 0051 1] Revision : 01
|
||||
[034h 0052 4] Identifier : 00000000
|
||||
[038h 0056 4] Mapping Count : 00000000
|
||||
[03Ch 0060 4] Mapping Offset : 00000000
|
||||
|
||||
[040h 0064 4] ItsCount : 00000001
|
||||
[044h 0068 4] Identifiers : 00000000
|
||||
|
||||
[048h 0072 1] Type : 04
|
||||
[049h 0073 2] Length : 0058
|
||||
[04Bh 0075 1] Revision : 04
|
||||
[04Ch 0076 4] Identifier : 00000001
|
||||
[050h 0080 4] Mapping Count : 00000001
|
||||
[054h 0084 4] Mapping Offset : 00000044
|
||||
|
||||
[058h 0088 8] Base Address : 000000000C000000
|
||||
[060h 0096 4] Flags (decoded below) : 00000001
|
||||
COHACC Override : 1
|
||||
HTTU Override : 0
|
||||
Proximity Domain Valid : 0
|
||||
[064h 0100 4] Reserved : 00000000
|
||||
[068h 0104 8] VATOS Address : 0000000000000000
|
||||
[070h 0112 4] Model : 00000000
|
||||
[074h 0116 4] Event GSIV : 00000090
|
||||
[078h 0120 4] PRI GSIV : 00000091
|
||||
[07Ch 0124 4] GERR GSIV : 00000093
|
||||
[080h 0128 4] Sync GSIV : 00000092
|
||||
[084h 0132 4] Proximity Domain : 00000000
|
||||
[088h 0136 4] Device ID Mapping Index : 00000000
|
||||
|
||||
[08Ch 0140 4] Input base : 00000000
|
||||
[090h 0144 4] ID Count : 0000FFFF
|
||||
[094h 0148 4] Output Base : 00000000
|
||||
[098h 0152 4] Output Reference : 00000030
|
||||
[09Ch 0156 4] Flags (decoded below) : 00000000
|
||||
Single Mapping : 0
|
||||
|
||||
[0A0h 0160 1] Type : 04
|
||||
[0A1h 0161 2] Length : 0058
|
||||
[0A3h 0163 1] Revision : 04
|
||||
[0A4h 0164 4] Identifier : 00000002
|
||||
[0A8h 0168 4] Mapping Count : 00000001
|
||||
[0ACh 0172 4] Mapping Offset : 00000044
|
||||
|
||||
[0B0h 0176 8] Base Address : 000000000C020000
|
||||
[0B8h 0184 4] Flags (decoded below) : 00000001
|
||||
COHACC Override : 1
|
||||
HTTU Override : 0
|
||||
Proximity Domain Valid : 0
|
||||
[0BCh 0188 4] Reserved : 00000000
|
||||
[0C0h 0192 8] VATOS Address : 0000000000000000
|
||||
[0C8h 0200 4] Model : 00000000
|
||||
[0CCh 0204 4] Event GSIV : 00000094
|
||||
[0D0h 0208 4] PRI GSIV : 00000095
|
||||
[0D4h 0212 4] GERR GSIV : 00000097
|
||||
[0D8h 0216 4] Sync GSIV : 00000096
|
||||
[0DCh 0220 4] Proximity Domain : 00000000
|
||||
[0E0h 0224 4] Device ID Mapping Index : 00000000
|
||||
|
||||
[0E4h 0228 4] Input base : 00000000
|
||||
[0E8h 0232 4] ID Count : 0000FFFF
|
||||
[0ECh 0236 4] Output Base : 00000000
|
||||
[0F0h 0240 4] Output Reference : 00000030
|
||||
[0F4h 0244 4] Flags (decoded below) : 00000000
|
||||
Single Mapping : 0
|
||||
|
||||
[0F8h 0248 1] Type : 02
|
||||
[0F9h 0249 2] Length : 0074
|
||||
[0FBh 0251 1] Revision : 03
|
||||
[0FCh 0252 4] Identifier : 00000003
|
||||
[100h 0256 4] Mapping Count : 00000004
|
||||
[104h 0260 4] Mapping Offset : 00000024
|
||||
|
||||
[108h 0264 8] Memory Properties : [IORT Memory Access Properties]
|
||||
[108h 0264 4] Cache Coherency : 00000001
|
||||
[10Ch 0268 1] Hints (decoded below) : 00
|
||||
Transient : 0
|
||||
Write Allocate : 0
|
||||
Read Allocate : 0
|
||||
Override : 0
|
||||
[10Dh 0269 2] Reserved : 0000
|
||||
[10Fh 0271 1] Memory Flags (decoded below) : 03
|
||||
Coherency : 1
|
||||
Device Attribute : 1
|
||||
[110h 0272 4] ATS Attribute : 00000000
|
||||
[114h 0276 4] PCI Segment Number : 00000000
|
||||
[118h 0280 1] Memory Size Limit : 40
|
||||
[119h 0281 2] PASID Capabilities : 0000
|
||||
[11Bh 0283 1] Reserved : 00
|
||||
|
||||
[11Ch 0284 4] Input base : 00000000
|
||||
[120h 0288 4] ID Count : 000001FF
|
||||
[124h 0292 4] Output Base : 00000000
|
||||
[128h 0296 4] Output Reference : 00000048
|
||||
[12Ch 0300 4] Flags (decoded below) : 00000000
|
||||
Single Mapping : 0
|
||||
|
||||
[130h 0304 4] Input base : 00001000
|
||||
[134h 0308 4] ID Count : 000000FF
|
||||
[138h 0312 4] Output Base : 00001000
|
||||
[13Ch 0316 4] Output Reference : 000000A0
|
||||
[140h 0320 4] Flags (decoded below) : 00000000
|
||||
Single Mapping : 0
|
||||
|
||||
[144h 0324 4] Input base : 00000200
|
||||
[148h 0328 4] ID Count : 00000DFF
|
||||
[14Ch 0332 4] Output Base : 00000200
|
||||
[150h 0336 4] Output Reference : 00000030
|
||||
[154h 0340 4] Flags (decoded below) : 00000000
|
||||
Single Mapping : 0
|
||||
|
||||
[158h 0344 4] Input base : 00001100
|
||||
[15Ch 0348 4] ID Count : 0000EEFF
|
||||
[160h 0352 4] Output Base : 00001100
|
||||
[164h 0356 4] Output Reference : 00000030
|
||||
[168h 0360 4] Flags (decoded below) : 00000000
|
||||
Single Mapping : 0
|
||||
|
||||
Note: DSDT changes are not described here as it is not impacted by the
|
||||
way the SMMUv3 is instantiated.
|
||||
|
||||
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
|
||||
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Eric Auger <eric.auger@redhat.com>
|
||||
Tested-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
||||
Signed-off-by: Shameer Kolothum <skolothumtho@nvidia.com>
|
||||
Reviewed-by: Donald Dutile <ddutile@redhat.com>
|
||||
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
|
||||
Message-id: 20250829082543.7680-12-skolothumtho@nvidia.com
|
||||
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||||
(cherry picked from commit d35146a6606cf6ebb4e24bb97dfc0330f074f6e3)
|
||||
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||||
---
|
||||
tests/data/acpi/aarch64/virt/DSDT.smmuv3-dev | Bin 0 -> 10230 bytes
|
||||
tests/data/acpi/aarch64/virt/DSDT.smmuv3-legacy | Bin 0 -> 10230 bytes
|
||||
tests/data/acpi/aarch64/virt/IORT.smmuv3-dev | Bin 0 -> 364 bytes
|
||||
tests/data/acpi/aarch64/virt/IORT.smmuv3-legacy | Bin 0 -> 276 bytes
|
||||
tests/qtest/bios-tables-test-allowed-diff.h | 4 ----
|
||||
5 files changed, 4 deletions(-)
|
||||
|
||||
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
|
||||
index 2e3e3ccdce..dfb8523c8b 100644
|
||||
--- a/tests/qtest/bios-tables-test-allowed-diff.h
|
||||
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
|
||||
@@ -1,5 +1 @@
|
||||
/* List of comma-separated changed AML files to ignore */
|
||||
-"tests/data/acpi/aarch64/virt/DSDT.smmuv3-legacy",
|
||||
-"tests/data/acpi/aarch64/virt/DSDT.smmuv3-dev",
|
||||
-"tests/data/acpi/aarch64/virt/IORT.smmuv3-legacy",
|
||||
-"tests/data/acpi/aarch64/virt/IORT.smmuv3-dev",
|
||||
--
|
||||
2.47.3
|
||||
|
||||
47
kvm-vfio-Disable-VFIO-migration-with-MultiFD-support.patch
Normal file
47
kvm-vfio-Disable-VFIO-migration-with-MultiFD-support.patch
Normal file
@ -0,0 +1,47 @@
|
||||
From 66bd3c1e7702962060d23fdc3084f0ace26b94e6 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= <clg@redhat.com>
|
||||
Date: Thu, 6 Nov 2025 16:39:53 +0100
|
||||
Subject: [PATCH 03/16] vfio: Disable VFIO migration with MultiFD support
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Cédric Le Goater <clg@redhat.com>
|
||||
RH-MergeRequest: 421: vfio: Disable VFIO migration with MultiFD support
|
||||
RH-Jira: RHEL-126573
|
||||
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
||||
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||||
RH-Commit: [1/1] b3ec6731c96e5650c66ece6e3b8728a7b94353f2 (clegoate/qemu-kvm-centos)
|
||||
|
||||
QEMU 10.0 extends VFIO migration with MultiFD support, which can be
|
||||
controlled through the 'vfio-pci' device property
|
||||
'x-migration-multifd-transfer'. By default, this property is set to
|
||||
'auto', meaning its activation depends on the availability of other
|
||||
related features. However, it should be set to 'off' in RHEL until
|
||||
more testing has been completed.
|
||||
|
||||
Signed-off-by: Cédric Le Goater <clg@redhat.com>
|
||||
---
|
||||
hw/vfio/pci.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
|
||||
index 9486521a90..83ecffb535 100644
|
||||
--- a/hw/vfio/pci.c
|
||||
+++ b/hw/vfio/pci.c
|
||||
@@ -3686,10 +3686,11 @@ static const Property vfio_pci_dev_properties[] = {
|
||||
igd_legacy_mode, ON_OFF_AUTO_AUTO),
|
||||
DEFINE_PROP_ON_OFF_AUTO("enable-migration", VFIOPCIDevice,
|
||||
vbasedev.enable_migration, ON_OFF_AUTO_AUTO),
|
||||
+ /* RHEL only. Disable VFIO migration with MultiFD support */
|
||||
DEFINE_PROP("x-migration-multifd-transfer", VFIOPCIDevice,
|
||||
vbasedev.migration_multifd_transfer,
|
||||
vfio_pci_migration_multifd_transfer_prop, OnOffAuto,
|
||||
- .set_default = true, .defval.i = ON_OFF_AUTO_AUTO),
|
||||
+ .set_default = true, .defval.i = ON_OFF_AUTO_OFF),
|
||||
DEFINE_PROP_ON_OFF_AUTO("x-migration-load-config-after-iter", VFIOPCIDevice,
|
||||
vbasedev.migration_load_config_after_iter,
|
||||
ON_OFF_AUTO_AUTO),
|
||||
--
|
||||
2.47.3
|
||||
|
||||
@ -143,7 +143,7 @@ Obsoletes: %{name}-block-ssh <= %{epoch}:%{version} \
|
||||
Summary: QEMU is a machine emulator and virtualizer
|
||||
Name: qemu-kvm
|
||||
Version: 10.1.0
|
||||
Release: 4%{?rcrel}%{?dist}%{?cc_suffix}
|
||||
Release: 5%{?rcrel}%{?dist}%{?cc_suffix}
|
||||
# Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped
|
||||
# Epoch 15 used for RHEL 8
|
||||
# Epoch 17 used for RHEL 9 (due to release versioning offset in RHEL 8.5)
|
||||
@ -226,6 +226,37 @@ Patch34: kvm-x86-create-new-rhel-10.2-specific-pc-q35-machine-typ.patch
|
||||
Patch35: kvm-x86-create-new-rhel-9.8-specific-pc-q35-machine-type.patch
|
||||
# For RHEL-101929 - enable 'usb-bot' device for proper support of USB CD-ROM drives via libvirt
|
||||
Patch36: kvm-rh-enable-CONFIG_USB_STORAGE_BOT.patch
|
||||
# For RHEL-120116 - CVE-2025-11234 qemu-kvm: VNC WebSocket handshake use-after-free [rhel-10.2]
|
||||
Patch37: kvm-io-move-websock-resource-release-to-close-method.patch
|
||||
# For RHEL-120116 - CVE-2025-11234 qemu-kvm: VNC WebSocket handshake use-after-free [rhel-10.2]
|
||||
Patch38: kvm-io-fix-use-after-free-in-websocket-handshake-code.patch
|
||||
# For RHEL-126573 - VFIO migration using multifd should be disabled by default
|
||||
Patch39: kvm-vfio-Disable-VFIO-migration-with-MultiFD-support.patch
|
||||
# For RHEL-67323 - [aarch64] Support ACPI based PCI hotplug on ARM
|
||||
Patch40: kvm-hw-arm-virt-Use-ACPI-PCI-hotplug-by-default-from-10..patch
|
||||
# For RHEL-73800 - NVIDIA:Grace-Hopper:Backport support for user-creatable nested SMMUv3 - RHEL 10.1
|
||||
Patch41: kvm-hw-arm-smmu-common-Check-SMMU-has-PCIe-Root-Complex-.patch
|
||||
# For RHEL-73800 - NVIDIA:Grace-Hopper:Backport support for user-creatable nested SMMUv3 - RHEL 10.1
|
||||
Patch42: kvm-hw-arm-virt-acpi-build-Re-arrange-SMMUv3-IORT-build.patch
|
||||
# For RHEL-73800 - NVIDIA:Grace-Hopper:Backport support for user-creatable nested SMMUv3 - RHEL 10.1
|
||||
Patch43: kvm-hw-arm-virt-acpi-build-Update-IORT-for-multiple-smmu.patch
|
||||
# For RHEL-73800 - NVIDIA:Grace-Hopper:Backport support for user-creatable nested SMMUv3 - RHEL 10.1
|
||||
Patch44: kvm-hw-arm-virt-Factor-out-common-SMMUV3-dt-bindings-cod.patch
|
||||
# For RHEL-73800 - NVIDIA:Grace-Hopper:Backport support for user-creatable nested SMMUv3 - RHEL 10.1
|
||||
Patch45: kvm-hw-arm-virt-Add-an-SMMU_IO_LEN-macro.patch
|
||||
# For RHEL-73800 - NVIDIA:Grace-Hopper:Backport support for user-creatable nested SMMUv3 - RHEL 10.1
|
||||
Patch46: kvm-hw-pci-Introduce-pci_setup_iommu_per_bus-for-per-bus.patch
|
||||
# For RHEL-73800 - NVIDIA:Grace-Hopper:Backport support for user-creatable nested SMMUv3 - RHEL 10.1
|
||||
Patch47: kvm-hw-arm-virt-Allow-user-creatable-SMMUv3-dev-instanti.patch
|
||||
# For RHEL-73800 - NVIDIA:Grace-Hopper:Backport support for user-creatable nested SMMUv3 - RHEL 10.1
|
||||
Patch48: kvm-qemu-options.hx-Document-the-arm-smmuv3-device.patch
|
||||
# For RHEL-73800 - NVIDIA:Grace-Hopper:Backport support for user-creatable nested SMMUv3 - RHEL 10.1
|
||||
Patch49: kvm-bios-tables-test-Allow-for-smmuv3-test-data.patch
|
||||
# For RHEL-73800 - NVIDIA:Grace-Hopper:Backport support for user-creatable nested SMMUv3 - RHEL 10.1
|
||||
Patch50: kvm-qtest-bios-tables-test-Add-tests-for-legacy-smmuv3-a.patch
|
||||
# For RHEL-73800 - NVIDIA:Grace-Hopper:Backport support for user-creatable nested SMMUv3 - RHEL 10.1
|
||||
Patch51: kvm-qtest-bios-tables-test-Update-tables-for-smmuv3-test.patch
|
||||
Patch52: kvm-qtest-Do-not-run-bios-tables-test-on-aarch64.patch
|
||||
|
||||
%if %{have_clang}
|
||||
BuildRequires: clang
|
||||
@ -1305,6 +1336,32 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Fri Nov 14 2025 Miroslav Rezanina <mrezanin@redhat.com> - 10.1.0-5
|
||||
- kvm-io-move-websock-resource-release-to-close-method.patch [RHEL-120116]
|
||||
- kvm-io-fix-use-after-free-in-websocket-handshake-code.patch [RHEL-120116]
|
||||
- kvm-vfio-Disable-VFIO-migration-with-MultiFD-support.patch [RHEL-126573]
|
||||
- kvm-hw-arm-virt-Use-ACPI-PCI-hotplug-by-default-from-10..patch [RHEL-67323]
|
||||
- kvm-hw-arm-smmu-common-Check-SMMU-has-PCIe-Root-Complex-.patch [RHEL-73800]
|
||||
- kvm-hw-arm-virt-acpi-build-Re-arrange-SMMUv3-IORT-build.patch [RHEL-73800]
|
||||
- kvm-hw-arm-virt-acpi-build-Update-IORT-for-multiple-smmu.patch [RHEL-73800]
|
||||
- kvm-hw-arm-virt-Factor-out-common-SMMUV3-dt-bindings-cod.patch [RHEL-73800]
|
||||
- kvm-hw-arm-virt-Add-an-SMMU_IO_LEN-macro.patch [RHEL-73800]
|
||||
- kvm-hw-pci-Introduce-pci_setup_iommu_per_bus-for-per-bus.patch [RHEL-73800]
|
||||
- kvm-hw-arm-virt-Allow-user-creatable-SMMUv3-dev-instanti.patch [RHEL-73800]
|
||||
- kvm-qemu-options.hx-Document-the-arm-smmuv3-device.patch [RHEL-73800]
|
||||
- kvm-bios-tables-test-Allow-for-smmuv3-test-data.patch [RHEL-73800]
|
||||
- kvm-qtest-bios-tables-test-Add-tests-for-legacy-smmuv3-a.patch [RHEL-73800]
|
||||
- kvm-qtest-bios-tables-test-Update-tables-for-smmuv3-test.patch [RHEL-73800]
|
||||
- kvm-qtest-Do-not-run-bios-tables-test-on-aarch64.patch []
|
||||
- Resolves: RHEL-120116
|
||||
(CVE-2025-11234 qemu-kvm: VNC WebSocket handshake use-after-free [rhel-10.2])
|
||||
- Resolves: RHEL-126573
|
||||
(VFIO migration using multifd should be disabled by default)
|
||||
- Resolves: RHEL-67323
|
||||
([aarch64] Support ACPI based PCI hotplug on ARM)
|
||||
- Resolves: RHEL-73800
|
||||
(NVIDIA:Grace-Hopper:Backport support for user-creatable nested SMMUv3 - RHEL 10.1)
|
||||
|
||||
* Mon Nov 03 2025 Miroslav Rezanina <mrezanin@redhat.com> - 10.1.0-4
|
||||
- kvm-qapi-machine-s390x-add-QAPI-event-SCLP_CPI_INFO_AVAI.patch [RHEL-104009 RHEL-105823 RHEL-73008]
|
||||
- kvm-tests-functional-add-tests-for-SCLP-event-CPI.patch [RHEL-104009 RHEL-105823 RHEL-73008]
|
||||
|
||||
Loading…
Reference in New Issue
Block a user