Hi, Jeremy Sorry for missing this mail.
I would *REJECT* this patch as it should be grub2's bug in which it passes down an unaligned buffer. Accroding to UEFI spec , it clearly described that the IoAlign should be met by the BlockIo's caller "IoAlign Supplies the alignment requirement for any buffer used in a data transfer. 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." And another proof is the return status described in BlockIo.ReadBlocks() "EFI_INVALID_PARAMETER The read request contains LBAs that are not valid, or the buffer is not on proper alignment." Thanks Feng -----Original Message----- From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Ryan Harkin Sent: Tuesday, February 09, 2016 21:23 To: Jeremy Linton Cc: edk2-devel@lists.01.org; Leif Lindholm Subject: Re: [edk2] [PATCH] MdeModulePkg, AtaBusDxe: Bounce buffer IO operations if unaligned Hi Jeremy, On 15 January 2016 at 15:20, Jeremy Linton <jeremy.lin...@arm.com> wrote: > BlockIo Protocol devices specify a buffer alignment requirement in > their media descriptors. This should be honored by users of the protocol. > In cases where the user of the protocol (grub2 in this case) fail to > correctly align their buffers, IO failures occur. Apparently this has > been known for a while as numerous other BlockIo protocol providers in > edk2 bounce IO operations rather than simply allowing them to fail. > > This patch adds bounce buffer logic to the AtaBusDxe. This logic is > only triggered if the buffers are not correctly aligned. It assures > that a wide range of adapters work regardless of buggy EFI applications. > You are missing this line: Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Jeremy Linton <jeremy.lin...@arm.com> > --- > MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBus.c | 26 > ++++++++++++++++++++++++-- > 1 file changed, 24 insertions(+), 2 deletions(-) > > diff --git a/MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBus.c > b/MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBus.c > index e7449f9..8cb08ce 100644 > --- a/MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBus.c > +++ b/MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBus.c > @@ -1038,6 +1038,7 @@ BlockIoReadWrite ( > UINTN BlockSize; > UINTN NumberOfBlocks; > UINTN IoAlign; > + VOID *IoBounceBuffer; > > if (IsBlockIo2) { > Media = ((EFI_BLOCK_IO2_PROTOCOL *) This)->Media; > @@ -1078,7 +1079,18 @@ BlockIoReadWrite ( > > IoAlign = Media->IoAlign; > if (IoAlign > 0 && (((UINTN) Buffer & (IoAlign - 1)) != 0)) { > - return EFI_INVALID_PARAMETER; > + IoBounceBuffer=AllocateAlignedBuffer(AtaDevice,BufferSize); > + if (IoBounceBuffer == NULL) { > + //both bad parameter and out of resources.. > + return EFI_INVALID_PARAMETER; > + } > + > + if (IsWrite) { > + CopyMem(IoBounceBuffer,Buffer,BufferSize); > + } > + } > + else { > + IoBounceBuffer=Buffer; > } > > OldTpl = gBS->RaiseTPL (TPL_CALLBACK); @@ -1086,10 +1098,20 @@ > BlockIoReadWrite ( > // > // Invoke low level AtaDevice Access Routine. > // > - Status = AccessAtaDevice (AtaDevice, Buffer, Lba, NumberOfBlocks, > IsWrite, Token); > + Status = AccessAtaDevice (AtaDevice, IoBounceBuffer, Lba, > + NumberOfBlocks, IsWrite, Token); > > gBS->RestoreTPL (OldTpl); > > + // were we using a bounce buffer? > + if (IoAlign > 0 && (((UINTN) Buffer & (IoAlign - 1)) != 0)) { > + if (!IsWrite) { > + // for reads copy the data back to the original buffer > + CopyMem(Buffer,IoBounceBuffer,BufferSize); > + } > + FreeAlignedBuffer(IoBounceBuffer,BufferSize); > + } > + > return Status; > } > > -- > 2.4.3 > > Unfortunately, when I booted with this patch on top of my tree [1] the board crashes when booting from PXE when I have a SATA hard drive attached. If I disconnect the drive, it boots fine. Here's the trace: Booting EFI Network Synchronous Exception at 0x00000000F8B6C058 /working/platforms/uefi/edk2/Build/ArmJuno/DEBUG_GCC49/AARCH64/MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe/DEBUG/Udp4Dxe.dll loaded at 0x00000000F8B65000 X0 0xAFAFAFAFAFAFAFAF X1 0x00000000000F4240 X2 0x0000000000000000 X3 0x0000000000000000 X4 0x00000000FCFC68A0 X5 0x00000000F8B68E4C X6 0x00000000FD007AA8 X7 0x00000000FD02F120 X8 0x00000000FE331780 X9 0x0000004100000000 X10 0x0000000000000092 X11 0x0000000000000083 X12 0x0000000070FFE07A X13 0x0000000000000000 X14 0x0000000000000000 X15 0x0000000000000000 X16 0x00000000FEFFFBF0 X17 0x0000000000000000 X18 0x0000000000000000 X19 0x00000000FCFC68AC X20 0x0000000000000000 X21 0x0000000000000000 X22 0x0000000000000000 X23 0x0000000000000000 X24 0x0000000000000000 X25 0x0000000000000000 X26 0x0000000000000000 X27 0x0000000000000000 X28 0x0000000000000000 FP 0x0000000000000000 LR 0x00000000F8B6BF24 V0 0xF7FFFFFFFEBFFFBF FFFFFFFB77FFFFFF V1 0xFFFF9FFDFFFEFFFE FCFFFFFBAFFFBFDF V2 0xB77FE7EFFFFFFFFF FBFFFFF1BFFFEFF7 V3 0xFFBDFFFBDFBBFFFD FFFFFFF5FFFDFF73 V4 0x7BF7FBFFFBFFFFFB F77FFFFBFDFFFFF7 V5 0xFFFBFFFF7DEDF7FF FFFFFFFFFFFFFFFF V6 0xFABAFFFE57BFFFFF 7F7F9FFFDFFFFF7F V7 0xBBFFFCFBFFFFFFBD EFFFBFFDFFFFFFFF V8 0x0000000000000000 FFFF7FFFF5FFFFFF V9 0x0000000000000000 F7FFFFFFFFFFFBFE V10 0x0000000000000000 7FFBFEFEFFFFFFFF V11 0x0000000000000000 F3FFBFFFFFFBFFFF V12 0x0000000000000000 FEFF7DFFBFFFFFFF V13 0x0000000000000000 BFFEFEFEFFFFFFFF V14 0x0000000000000000 FBFCFFFF7FFFFBFF V15 0x0000000000000000 FFFEFFFFFFFF7FFF V16 0xFFEF7EFFFFFFF7FF F7FFFBFFFFF7FFFF V17 0xFDFEFDFFFFFFD5FF FFFFFFFFFFFDFFFE V18 0xEFFFFFFFFFFFFFFF DBFFFF7DFFFFFBFE V19 0xFFFDFFBBFFFFE7FF FFFDFFFFFFF7FBBE V20 0x7FFD5F7FFFFFFFFF FFFFFBFF7FD7FDFF V21 0xFFFFFFFBFFFFFFF7 FFFBFEFFFEFDFDB5 V22 0x7FFBF7F6FFFEFFFF FF7DDFFA06A10300 V23 0xFFDFEFFFB7FFFFFF 7F377EFEBFBFFEFF V24 0xFFDFFFFFFFFFFFFF 7DEE7FF7FFFFDFEF V25 0xFFFFFFFFDFFF7FFF FFFBFFFFFEDFF7FF V26 0xDFFFFFFEFFFFFFFF FFFFBFDF7FFFFFBF V27 0xFDFBFFBFFFFFFFFF FFC7F7EFFFFFFDFF V28 0xFF7FEFFF7FDF6BFF CFFE7EFFFFFDFFDF V29 0xF7FFBF77EFFFFFFF BFFFFF9F71024505 V30 0xFF77FDBDF7FFFFFF DFFEEEFBBB6FFFFF V31 0xFFFFFFF7FFFFFFBF F7FFF77FB6FF7FFF SP 0x00000000FEFFF150 ELR 0x00000000F8B6C058 SPSR 0x20000309 FPSR 0x00000000 ESR 0x96000004 FAR 0xAFAFAFAFAFAFAFAF ESR : EC 0x25 IL 0x1 ISS 0x00000004 Data abort: Translation fault, zeroth level ASSERT [ArmCpuDxe] /working/platforms/uefi/edk2/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c(186): ((BOOLEAN)(0==1)) If I unplug the network cable so PXE fails, it attempts to boot from HDD instead and I get another trace: Booting EFI Hard Drive Synchronous Exception at 0x00000000FE3177C0 /working/platforms/uefi/edk2/Build/ArmJuno/DEBUG_GCC49/AARCH64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll loaded at 0x00000000FE305000 X0 0x00000000FE3323C8 X1 0x00000000AFAFAFAF X2 0x0000000000000000 X3 0x00000000000007E0 X4 0x00000000018D0D10 X5 0x0000000000000000 X6 0x0000000000000000 X7 0x0000000000000020 X8 0x00000000FE331780 X9 0x0000004100000000 X10 0x0000000000000092 X11 0x0000000000000083 X12 0x0000000070FFE07A X13 0x0000000000000000 X14 0x0000000000000000 X15 0x0000000000000000 X16 0x00000000FEFFFBF0 X17 0x0000000000000000 X18 0x0000000000000000 X19 0x00000000FE32517C X20 0x0000000000010000 X21 0x00000000FD89C018 X22 0x0000000000000000 X23 0x0000000000A03800 X24 0x00000000FC6FE018 X25 0x0000000000000000 X26 0x0000000000000000 X27 0x0000000000000010 X28 0x0000000000000001 FP 0x0000000000000000 LR 0x00000000FE317768 V0 0xF7FFFFFFF6BFFFA7 7FFFFEBA77FFFFFF V1 0xFFFFBFFDFFFEFFFE FC7FFFFBAFFFBFDF V2 0x97FFE7EFFFFFFFFF FBFFBFF1BFFFEFFF V3 0xFFBDFFFBCFBBFFED FFF9FFE5FEF9EF73 V4 0x7BF77BFFDBFFFFFB F77FFFF9FDFFAFF7 V5 0xFFFBFFFF7DE9F77F FFFFFF5FFFFFFFFF V6 0xB8DAFFFF57BFFFDF 7F5FDFFFFFFFFF7F V7 0xBAFFFCFBF7FFFE3D EFFDBFFDFFFFFFFF V8 0x0000000000000000 FFFF7CFFF5FFFF7F V9 0x0000000000000000 F7FDFFFFFFFFFBFE V10 0x0000000000000000 7FFBFEFAF7FFFFFF V11 0x0000000000000000 F3FFB2FFFFFBFDFF V12 0x0000000000000000 EFFF7DFF9FFFBFFF V13 0x0000000000000000 BFFEFEFEFFFFFFFF V14 0x0000000000000000 FBECFFFF7FFFFBFF V15 0x0000000000000000 FFFEFEBFFFFF7FFF V16 0xFFEF7EBFFFFFF7FF B5FFFBFFFFE7F7FB V17 0xFDFED9FFBFFFD5FF FFFFFFFFFFFDFFFF V18 0xFFFFFFFFFFFFFFFF DFF7FF7DFF7FFBFE V19 0xFFEDFFFBFFFFE7FF DFFDFFFFFFF7FBBE V20 0x7FFD5F7F5FFFFFFF BFFFF9FF7FD7FCFB V21 0xFFFFFFFDFFFFFFF7 FFF3FEFFFFFDFDF5 V22 0x7BFFF7D6FFFEFFFF FF7DDFFA06A10100 V23 0xFFDFEFFFF7FFFFFF 7F277EFEBFBFFEFF V24 0xFFDFFFFEFFFFFFFF 7D6E7FF7FFFFDFEF V25 0xFFD7FFFFDFFF7FFF FFFBFFFFFEDFF7FF V26 0x97FFFFDFFEFFFFFF FFFFBFDF7FFEFFBF V27 0xFDFAFFBFFFFFFFFF FDC7F7FF7FFFF5FF V28 0xFD7FE7FE7FDFEBFF CDFE7E7FFFFDFFDF V29 0xF7EFAF66EFFFFFFF BFFFFF9F71024505 V30 0x7F77FDBCF7FDFFFF DFFECEFABB6FFFFF V31 0xFFDEFFF7FFFFFFBF F7BFF77FF6F77FFF SP 0x00000000FEFFE8B0 ELR 0x00000000FE3177C0 SPSR 0x30000309 FPSR 0x00000000 ESR 0x96000005 FAR 0x000000025D928326 ESR : EC 0x25 IL 0x1 ISS 0x00000005 Data abort: Translation fault, first level ASSERT [ArmCpuDxe] /working/platforms/uefi/edk2/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c(186): ((BOOLEAN)(0==1)) [1] https://git.linaro.org/landing-teams/working/arm/edk2.git/shortlog/refs/tags/armlt-20160209 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel