We might want to compile QEMU with Clang on Windows - but it does not support the __attribute__((gcc_struct)) yet. So we have to make sure that the structs will stay the same when the compiler uses the "ms_struct" layout. The VTD_IR_TableEntry struct is affected - rewrite it a little bit so that it works fine with both struct layouts.
Reported-by: Daniel P. Berrangé <berra...@redhat.com> Signed-off-by: Thomas Huth <th...@redhat.com> --- include/hw/i386/intel_iommu.h | 14 ++++++++------ hw/i386/intel_iommu.c | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/include/hw/i386/intel_iommu.h b/include/hw/i386/intel_iommu.h index 89dcbc5e1e..08bf220393 100644 --- a/include/hw/i386/intel_iommu.h +++ b/include/hw/i386/intel_iommu.h @@ -204,18 +204,20 @@ union VTD_IR_TableEntry { #endif uint32_t dest_id; /* Destination ID */ uint16_t source_id; /* Source-ID */ + uint16_t __reserved_2; /* Reserved 2 */ #if HOST_BIG_ENDIAN - uint64_t __reserved_2:44; /* Reserved 2 */ - uint64_t sid_vtype:2; /* Source-ID Validation Type */ - uint64_t sid_q:2; /* Source-ID Qualifier */ + uint32_t __reserved_3:28; /* Reserved 3 */ + uint32_t sid_vtype:2; /* Source-ID Validation Type */ + uint32_t sid_q:2; /* Source-ID Qualifier */ #else - uint64_t sid_q:2; /* Source-ID Qualifier */ - uint64_t sid_vtype:2; /* Source-ID Validation Type */ - uint64_t __reserved_2:44; /* Reserved 2 */ + uint32_t sid_q:2; /* Source-ID Qualifier */ + uint32_t sid_vtype:2; /* Source-ID Validation Type */ + uint32_t __reserved_3:28; /* Reserved 3 */ #endif } QEMU_PACKED irte; uint64_t data[2]; }; +QEMU_BUILD_BUG_ON(sizeof(union VTD_IR_TableEntry) != 16); #define VTD_IR_INT_FORMAT_COMPAT (0) /* Compatible Interrupt */ #define VTD_IR_INT_FORMAT_REMAP (1) /* Remappable Interrupt */ diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c index dcc334060c..d5c5ee0751 100644 --- a/hw/i386/intel_iommu.c +++ b/hw/i386/intel_iommu.c @@ -3335,7 +3335,7 @@ static int vtd_irte_get(IntelIOMMUState *iommu, uint16_t index, } if (entry->irte.__reserved_0 || entry->irte.__reserved_1 || - entry->irte.__reserved_2) { + entry->irte.__reserved_2 || entry->irte.__reserved_3) { error_report_once("%s: detected non-zero reserved IRTE " "(index=%u, high=0x%" PRIx64 ", low=0x%" PRIx64 ")", __func__, index, le64_to_cpu(entry->data[1]), -- 2.39.3