hw/i386/intel_iommu: Fix endianness problems related to VTD_IR_TableEntry
commit642ba89672279fbdd14016a90da239c85e845d18
authorThomas Huth <thuth@redhat.com>
Wed, 2 Aug 2023 13:57:19 +0000 (2 15:57 +0200)
committerMichael S. Tsirkin <mst@redhat.com>
Thu, 3 Aug 2023 20:06:49 +0000 (3 16:06 -0400)
treef051c67c9bb7c9c3d703555fa36bf7bc173589e5
parentcc2a08480e19007c05be8fe5b6893e20448954dc
hw/i386/intel_iommu: Fix endianness problems related to VTD_IR_TableEntry

The code already tries to do some endianness handling here, but
currently fails badly:
- While it already swaps the data when logging errors / tracing, it fails
  to byteswap the value before e.g. accessing entry->irte.present
- entry->irte.source_id is swapped with le32_to_cpu(), though this is
  a 16-bit value
- The whole union is apparently supposed to be swapped via the 64-bit
  data[2] array, but the struct is a mixture between 32 bit values
  (the first 8 bytes) and 64 bit values (the second 8 bytes), so this
  cannot work as expected.

Fix it by converting the struct to two proper 64-bit bitfields, and
by swapping the values only once for everybody right after reading
the data from memory.

Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20230802135723.178083-3-thuth@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
hw/i386/intel_iommu.c
include/hw/i386/intel_iommu.h