]> git.ipfire.org Git - thirdparty/qemu.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 05:27:03 +0000 (08:27 +0300)
commitbbe3627f44e079a3eadb7713fa3aca291edf6ec9
treee46d32f5611beb63a725f7f791ebbbd19d5c70c2
parentcf2be5881f8da04f03e9a58591358e6057433f26
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