57 lines
2.3 KiB
Diff
57 lines
2.3 KiB
Diff
|
|
From cba5a006eb08a400126e1882923a28f71a40a94a Mon Sep 17 00:00:00 2001
|
||
|
|
From: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
|
Date: Mon, 4 Nov 2024 20:55:36 +0800
|
||
|
|
Subject: [PATCH] intel_iommu: Add missed reserved bit check for IEC descriptor
|
||
|
|
|
||
|
|
IEC descriptor is 128-bit invalidation descriptor, must be padded with
|
||
|
|
128-bits of 0s in the upper bytes to create a 256-bit descriptor when
|
||
|
|
the invalidation queue is configured for 256-bit descriptors (IQA_REG.DW=1).
|
||
|
|
|
||
|
|
Fixes: 02a2cbc872df ("x86-iommu: introduce IEC notifiers")
|
||
|
|
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
|
Message-Id: <20241104125536.1236118-4-zhenzhong.duan@intel.com>
|
||
|
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||
|
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||
|
|
Signed-off-by: Zhongrui Tang tangzhongrui_yewu@cmss.chinamobile.com
|
||
|
|
---
|
||
|
|
hw/i386/intel_iommu.c | 8 ++++++++
|
||
|
|
hw/i386/intel_iommu_internal.h | 3 +++
|
||
|
|
2 files changed, 11 insertions(+)
|
||
|
|
|
||
|
|
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
|
||
|
|
index 2f8bcc1557..bc580237a8 100644
|
||
|
|
--- a/hw/i386/intel_iommu.c
|
||
|
|
+++ b/hw/i386/intel_iommu.c
|
||
|
|
@@ -2417,6 +2417,14 @@ static bool vtd_process_iotlb_desc(IntelIOMMUState *s, VTDInvDesc *inv_desc)
|
||
|
|
static bool vtd_process_inv_iec_desc(IntelIOMMUState *s,
|
||
|
|
VTDInvDesc *inv_desc)
|
||
|
|
{
|
||
|
|
+ uint64_t mask[4] = {VTD_INV_DESC_IEC_RSVD, VTD_INV_DESC_ALL_ONE,
|
||
|
|
+ VTD_INV_DESC_ALL_ONE, VTD_INV_DESC_ALL_ONE};
|
||
|
|
+
|
||
|
|
+ if (!vtd_inv_desc_reserved_check(s, inv_desc, mask, false,
|
||
|
|
+ __func__, "iec inv")) {
|
||
|
|
+ return false;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
trace_vtd_inv_desc_iec(inv_desc->iec.granularity,
|
||
|
|
inv_desc->iec.index,
|
||
|
|
inv_desc->iec.index_mask);
|
||
|
|
diff --git a/hw/i386/intel_iommu_internal.h b/hw/i386/intel_iommu_internal.h
|
||
|
|
index 2b2f0dd848..7415b56bc4 100644
|
||
|
|
--- a/hw/i386/intel_iommu_internal.h
|
||
|
|
+++ b/hw/i386/intel_iommu_internal.h
|
||
|
|
@@ -388,6 +388,9 @@ typedef union VTDInvDesc VTDInvDesc;
|
||
|
|
#define VTD_INV_DESC_DEVICE_IOTLB_RSVD_HI 0xffeULL
|
||
|
|
#define VTD_INV_DESC_DEVICE_IOTLB_RSVD_LO 0xffff0000ffe0f1f0
|
||
|
|
|
||
|
|
+/* Masks for Interrupt Entry Invalidate Descriptor */
|
||
|
|
+#define VTD_INV_DESC_IEC_RSVD 0xffff000007fff1e0ULL
|
||
|
|
+
|
||
|
|
/* Rsvd field masks for spte */
|
||
|
|
#define VTD_SPTE_SNP 0x800ULL
|
||
|
|
|
||
|
|
--
|
||
|
|
2.33.0
|
||
|
|
|