Stefan Agner 858a0745c8 disk/efi/efidisk: Pass buffers with higher alignment
Some devices report IoAlign values but seem to require buffers with
higher alignment.

The UEFI specification is saying: "IoAlign values of 0 and 1 mean that
the buffer can be placed anywhere in memory. Otherwise, IoAlign must
be a power of 2, and the requirement is that the start address of
a buffer must be evenly divisible by IoAlign with no remainder."

Some devices report IoAlign of 2, however seem to require 4 bytes
aligned buffers. It seems that this got misinterpreted by some vendors
assuming IoAlign is 2^IoAlign. There is also such a hint in an example
in earlier versions of the Driver Writer's Guide:

  ScsiPassThruMode.IoAlign = 2; // Data must be alligned on 4-byte boundary

Some devices report no alignment requirements at all but seem to read
corrupted data or report read errors when passing unaligned buffers.

Work around by using an alignment of at least BlockSize (typically 512
bytes) in any case. If IoAlign (interpreted as per UEFI specification)
requests a higher alignment than BlockSize, follow IoAlign still.

Note: The problem has only noticed with compressed squashfs. It seems
that ext4 (and presumably other file system drivers) pass buffers with
a higher alignment already.

Signed-off-by: Stefan Agner <stefan@agner.ch>
Acked-by: Heinrich Schuchardt <heinrich.schuchardt@canaonical.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2022-06-07 13:40:48 +02:00
..
2019-03-25 15:14:52 +01:00
2019-03-25 15:14:52 +01:00
2020-07-29 16:55:47 +02:00
2022-03-14 15:44:45 +01:00
2022-03-14 15:44:45 +01:00
2022-03-14 15:44:45 +01:00
2022-03-14 15:44:45 +01:00
2022-03-14 15:44:45 +01:00
2012-03-26 16:10:40 +02:00
2019-03-25 15:14:52 +01:00
2022-03-14 15:44:45 +01:00
2022-03-14 15:44:45 +01:00
2022-03-14 15:44:45 +01:00