]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Normalize data transfer buffer in BlockIo thunk driver to avoid INT 13 Function 42H...
authorli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 4 Aug 2011 02:23:39 +0000 (02:23 +0000)
committerli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 4 Aug 2011 02:23:39 +0000 (02:23 +0000)
Signed-off-by: li-elvin
Reviewed-by: erictian
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12084 6f19259b-4bc3-4df7-8a09-765794883524

IntelFrameworkModulePkg/Csm/BiosThunk/BlockIoDxe/BiosInt13.c

index c53490b0e31e8e19679fa933be1ad9bacefc5fbd..63aa1a22c137418565b81bff746991d8b75c034c 100644 (file)
@@ -864,8 +864,13 @@ Edd11BiosReadBlocks (
     AddressPacket->Zero               = 0;\r
     AddressPacket->NumberOfBlocks     = (UINT8) NumberOfBlocks;\r
     AddressPacket->Zero2              = 0;\r
-    AddressPacket->SegOffset          = EFI_SEGMENT (TransferBuffer) << 16;\r
-    AddressPacket->SegOffset |= EFI_OFFSET (TransferBuffer);\r
+    //\r
+    // TransferBuffer has been 4KB alignment. Normalize TransferBuffer to make offset as 0 in seg:offset\r
+    // format to transfer maximum 127 blocks of data.\r
+    // Otherwise when offset adding data size exceeds 0xFFFF, if OpROM does not normalize TransferBuffer,\r
+    // INT13 function 42H will return data boundary error 09H.\r
+    //\r
+    AddressPacket->SegOffset = (UINT32) ((TransferBuffer >> 4) << 16);\r
     AddressPacket->Lba  = (UINT64) Lba;\r
 \r
     Regs.H.AH           = 0x42;\r
@@ -1012,8 +1017,13 @@ Edd11BiosWriteBlocks (
     AddressPacket->Zero               = 0;\r
     AddressPacket->NumberOfBlocks     = (UINT8) NumberOfBlocks;\r
     AddressPacket->Zero2              = 0;\r
-    AddressPacket->SegOffset          = EFI_SEGMENT (TransferBuffer) << 16;\r
-    AddressPacket->SegOffset |= EFI_OFFSET (TransferBuffer);\r
+    //\r
+    // TransferBuffer has been 4KB alignment. Normalize TransferBuffer to make offset as 0 in seg:offset\r
+    // format to transfer maximum 127 blocks of data.\r
+    // Otherwise when offset adding data size exceeds 0xFFFF, if OpROM does not normalize TransferBuffer,\r
+    // INT13 function 42H will return data boundary error 09H.\r
+    //\r
+    AddressPacket->SegOffset = (UINT32) ((TransferBuffer >> 4) << 16);\r
     AddressPacket->Lba  = (UINT64) Lba;\r
 \r
     Regs.H.AH           = 0x43;\r