Commit 7578162c49 for qemu.org
commit 7578162c491c544fd76071964126cc53f3d82083
Author: Junjie Cao <junjie.cao@intel.com>
Date: Fri May 15 02:07:03 2026 +0800
tests/qtest: add 8-byte MMIO access sweep for intel-iommu
Sweep every 4-byte-aligned offset in the VT-d MMIO register space
with 8-byte reads and writes to verify that no register handler
aborts on an oversized access.
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Junjie Cao <junjie.cao@intel.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Yi Liu <yi.l.liu@intel.com>
Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Message-Id: <20260514180703.85686-3-junjie.cao@intel.com>
diff --git a/tests/qtest/intel-iommu-test.c b/tests/qtest/intel-iommu-test.c
index 30ee6524df..ef6e6eb8b6 100644
--- a/tests/qtest/intel-iommu-test.c
+++ b/tests/qtest/intel-iommu-test.c
@@ -17,11 +17,39 @@
#define ECAP_STAGE_1_FIXED1 (VTD_ECAP_QI | VTD_ECAP_IR | VTD_ECAP_IRO | \
VTD_ECAP_MHMV | VTD_ECAP_SMTS | VTD_ECAP_FSTS)
+static inline uint32_t vtd_reg_readl(QTestState *s, uint64_t offset)
+{
+ return qtest_readl(s, Q35_HOST_BRIDGE_IOMMU_ADDR + offset);
+}
+
static inline uint64_t vtd_reg_readq(QTestState *s, uint64_t offset)
{
return qtest_readq(s, Q35_HOST_BRIDGE_IOMMU_ADDR + offset);
}
+static inline void vtd_reg_writeq(QTestState *s, uint64_t offset,
+ uint64_t value)
+{
+ qtest_writeq(s, Q35_HOST_BRIDGE_IOMMU_ADDR + offset, value);
+}
+
+static void test_intel_iommu_8byte_access(void)
+{
+ QTestState *s;
+ uint64_t off;
+
+ s = qtest_init("-M q35 -device intel-iommu");
+
+ for (off = 0; off < DMAR_REG_SIZE; off += 4) {
+ vtd_reg_readq(s, off);
+ vtd_reg_writeq(s, off, 0);
+ }
+
+ g_assert_cmpuint(vtd_reg_readl(s, DMAR_VER_REG), !=, 0);
+
+ qtest_quit(s);
+}
+
static void test_intel_iommu_stage_1(void)
{
uint8_t init_csr[DMAR_REG_SIZE]; /* register values */
@@ -58,6 +86,8 @@ static void test_intel_iommu_stage_1(void)
int main(int argc, char **argv)
{
g_test_init(&argc, &argv, NULL);
+ qtest_add_func("/q35/intel-iommu/8byte-access",
+ test_intel_iommu_8byte_access);
qtest_add_func("/q35/intel-iommu/stage-1", test_intel_iommu_stage_1);
return g_test_run();