Skip to content
  • Thomas Huth's avatar
    642ba896
    hw/i386/intel_iommu: Fix endianness problems related to VTD_IR_TableEntry · 642ba896
    Thomas Huth authored
    
    
    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: default avatarThomas Huth <thuth@redhat.com>
    Message-Id: <20230802135723.178083-3-thuth@redhat.com>
    Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Reviewed-by: default avatarPeter Xu <peterx@redhat.com>
    642ba896
    hw/i386/intel_iommu: Fix endianness problems related to VTD_IR_TableEntry
    Thomas Huth authored
    
    
    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: default avatarThomas Huth <thuth@redhat.com>
    Message-Id: <20230802135723.178083-3-thuth@redhat.com>
    Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Reviewed-by: default avatarPeter Xu <peterx@redhat.com>
Loading