]> xenbits.xensource.com Git - qemu-xen.git/commit
hw/i386/intel_iommu: Fix endianness problems related to VTD_IR_TableEntry
authorThomas Huth <thuth@redhat.com>
Wed, 2 Aug 2023 13:57:19 +0000 (15:57 +0200)
committerMichael Tokarev <mjt@tls.msk.ru>
Fri, 4 Aug 2023 16:14:46 +0000 (19:14 +0300)
commitb3c94ecf3c36fde253759cd0a3dc85da1afce007
treee1cbc6d2aa871ae432c3e90ab5ad4c16400d847b
parentbc5740e1783ceb14897548bbc5250e62ea0549d5
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>
(cherry picked from commit 642ba89672279fbdd14016a90da239c85e845d18)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
hw/i386/intel_iommu.c
include/hw/i386/intel_iommu.h