diff options
author | Thomas Huth <thuth@redhat.com> | 2023-08-02 15:57:19 +0200 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2023-08-03 16:06:49 -0400 |
commit | 642ba89672279fbdd14016a90da239c85e845d18 (patch) | |
tree | f051c67c9bb7c9c3d703555fa36bf7bc173589e5 /trace | |
parent | cc2a08480e19007c05be8fe5b6893e20448954dc (diff) | |
download | qemu-642ba89672279fbdd14016a90da239c85e845d18.zip qemu-642ba89672279fbdd14016a90da239c85e845d18.tar.gz qemu-642ba89672279fbdd14016a90da239c85e845d18.tar.bz2 |
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>
Diffstat (limited to 'trace')
0 files changed, 0 insertions, 0 deletions