[SeaBIOS] [PATCH] mpt-scsi: Align MPT request to 8 bytes

Liran Alon liran.alon at oracle.com
Wed Nov 28 16:50:01 CET 2018

From: Nikita Leshchenko <nikita.leshchenko at oracle.com>

When mpt-scsi receives a SCSI message, it wraps it in a MPT request
message and writes it's address to an IO port to be added to the
request queue.

This MPT request is allocated on the stack. Previous to this commit,
the request is aligned to 4 bytes. However, VirtualBox LSI53c1030
device emulation aligns the request address to 8 bytes.
Therefore, this commit change alignment of request to 8 bytes.

VirtualBox source code which handles this is at
Devices/Storage/DevLsiLogicSCSI.cpp. lsilogicRegisterWrite()
LSILOGIC_REG_REQUEST_QUEUE handler adds the request to the
queue (pRequestQueueBase). lsilogicR3Worker() reads request from
pRequestQueueBase and aligns it to 8 bytes
(u32RequestMessageFrameDesc & ~0x07).

Reviewed-by: Liran Alon <liran.alon at oracle.com>
Reviewed-by: Mark Kanda <mark.kanda at oracle.com>
Signed-off-by: Nikita Leshchenko <nikita.leshchenko at oracle.com>
 src/hw/mpt-scsi.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/hw/mpt-scsi.c b/src/hw/mpt-scsi.c
index 1faede6aec6f..9966ca28054f 100644
--- a/src/hw/mpt-scsi.c
+++ b/src/hw/mpt-scsi.c
@@ -124,7 +124,7 @@ mpt_scsi_cmd(u32 iobase, struct disk_op_s *op,
     struct scsi_req {
         MptSCSIIORequest_t      scsi_io;
         MptSGEntrySimple32_t    sge;
-    } __attribute__((packed, aligned(4))) req = {
+    } __attribute__((packed, aligned(8))) req = {
         .scsi_io = {
             .TargetID = target,
             .Bus = 0,

More information about the SeaBIOS mailing list