Re: [edk2] [PATCH v4 3/4] EmbeddedPkg/AndroidBoot: boot android kernel from storage
2017-08-01 23:50 GMT+08:00 Leif Lindholm : > On Tue, Aug 01, 2017 at 05:29:00PM +0800, Jun Nie wrote: >> Add an android kernel loader that could load kernel from storage >> device. This patch is derived from Haojian's code as below link. >> https://patches.linaro.org/patch/94683/ >> >> This android boot image BDS add addtitional cmdline/dtb/ramfs >> support besides kernel that is introduced by Android boot header. > > This is nearly there - it's a big improvement, but a few more > comments below. Thank you for so much comments. All are addressed in v5. Jun > >> Contributed-under: TianoCore Contribution Agreement 1.0 >> Signed-off-by: Jun Nie >> --- >> .../Application/AndroidBoot/AndroidBootApp.c | 140 +++ >> .../Application/AndroidBoot/AndroidBootApp.inf | 64 +++ >> EmbeddedPkg/Include/Library/AndroidBootImgLib.h| 17 + >> EmbeddedPkg/Include/Protocol/AndroidBootImg.h | 47 +++ >> .../Library/AndroidBootImgLib/AndroidBootImgLib.c | 444 >> + >> .../AndroidBootImgLib/AndroidBootImgLib.inf| 48 +++ >> 6 files changed, 760 insertions(+) >> create mode 100644 EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.c >> create mode 100644 EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.inf >> create mode 100644 EmbeddedPkg/Include/Protocol/AndroidBootImg.h >> create mode 100644 EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.c >> create mode 100644 >> EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.inf >> >> diff --git a/EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.c >> b/EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.c >> new file mode 100644 >> index 000..5069819 >> --- /dev/null >> +++ b/EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.c >> @@ -0,0 +1,140 @@ >> +/** @file >> + >> + Copyright (c) 2013-2014, ARM Ltd. All rights reserved. >> + Copyright (c) 2017, Linaro. All rights reserved. >> + >> + This program and the accompanying materials >> + are licensed and made available under the terms and conditions of the BSD >> License >> + which accompanies this distribution. The full text of the license may be >> found at >> + http://opensource.org/licenses/bsd-license.php >> + >> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, >> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR >> IMPLIED. >> + >> +**/ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +#include >> +#include >> + >> +/* Validate the node is media hard drive type */ >> +EFI_STATUS >> +ValidateAndroidMediaDevicePath ( >> + IN EFI_DEVICE_PATH *DevicePath >> + ) >> +{ >> + EFI_DEVICE_PATH_PROTOCOL*Node, *NextNode; >> + >> + NextNode = DevicePath; >> + while (NextNode != NULL) { >> +Node = NextNode; >> +if (IS_DEVICE_PATH_NODE (Node, MEDIA_DEVICE_PATH, MEDIA_HARDDRIVE_DP)) { >> + return EFI_SUCCESS; >> +} >> +NextNode = NextDevicePathNode (Node); >> + } >> + return EFI_INVALID_PARAMETER; >> +} >> + >> +EFI_STATUS >> +EFIAPI >> +AndroidBootAppEntryPoint ( >> + IN EFI_HANDLEImageHandle, >> + IN EFI_SYSTEM_TABLE *SystemTable >> + ) >> +{ >> + EFI_STATUS Status; >> + CHAR16 *BootPathStr; >> + EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL *EfiDevicePathFromTextProtocol; >> + EFI_DEVICE_PATH *DevicePath; >> + EFI_BLOCK_IO_PROTOCOL *BlockIo; >> + UINT32 MediaId, BlockSize; >> + VOID*Buffer; >> + EFI_HANDLE Handle; >> + UINTN BootImgSize; >> + >> + BootPathStr = (CHAR16 *)PcdGetPtr (PcdAndroidBootDevicePath); >> + ASSERT (BootPathStr != NULL); >> + Status = gBS->LocateProtocol (&gEfiDevicePathFromTextProtocolGuid, NULL, >> +(VOID **)&EfiDevicePathFromTextProtocol); >> + ASSERT_EFI_ERROR(Status); >> + DevicePath = (EFI_DEVICE_PATH >> *)EfiDevicePathFromTextProtocol->ConvertTextToDevicePath (BootPathStr); >> + ASSERT (DevicePath != NULL); >> + >> + Status = ValidateAndroidMediaDevicePath (DevicePath); >> + if (EFI_ERROR (Status)) { >> +return Status; >> + } >> + >> + Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, >> + &DevicePath, &Handle); >> + if (EFI_ERROR (Status)) { >> +return Status; >> + } >> + >> + Status = gBS->OpenProtocol ( >> + Handle, >> + &gEfiBlockIoProtocolGuid, >> + (VOID **) &BlockIo, >> + gImageHandle, >> + NULL, >> + EFI_OPEN_PROTOCOL_GET_PROTOCOL >> + ); >> + if (EFI_ERROR (Status)) { >> +DEBUG ((EFI_D_ERROR, "Failed to get BlockIo: %r\n", Status)); > > BaseTools/Scripts/PatchCheck.py warns about
Re: [edk2] [PATCH v4 3/4] EmbeddedPkg/AndroidBoot: boot android kernel from storage
On Tue, Aug 01, 2017 at 05:29:00PM +0800, Jun Nie wrote: > Add an android kernel loader that could load kernel from storage > device. This patch is derived from Haojian's code as below link. > https://patches.linaro.org/patch/94683/ > > This android boot image BDS add addtitional cmdline/dtb/ramfs > support besides kernel that is introduced by Android boot header. This is nearly there - it's a big improvement, but a few more comments below. > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Jun Nie > --- > .../Application/AndroidBoot/AndroidBootApp.c | 140 +++ > .../Application/AndroidBoot/AndroidBootApp.inf | 64 +++ > EmbeddedPkg/Include/Library/AndroidBootImgLib.h| 17 + > EmbeddedPkg/Include/Protocol/AndroidBootImg.h | 47 +++ > .../Library/AndroidBootImgLib/AndroidBootImgLib.c | 444 > + > .../AndroidBootImgLib/AndroidBootImgLib.inf| 48 +++ > 6 files changed, 760 insertions(+) > create mode 100644 EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.c > create mode 100644 EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.inf > create mode 100644 EmbeddedPkg/Include/Protocol/AndroidBootImg.h > create mode 100644 EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.c > create mode 100644 > EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.inf > > diff --git a/EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.c > b/EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.c > new file mode 100644 > index 000..5069819 > --- /dev/null > +++ b/EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.c > @@ -0,0 +1,140 @@ > +/** @file > + > + Copyright (c) 2013-2014, ARM Ltd. All rights reserved. > + Copyright (c) 2017, Linaro. All rights reserved. > + > + This program and the accompanying materials > + are licensed and made available under the terms and conditions of the BSD > License > + which accompanies this distribution. The full text of the license may be > found at > + http://opensource.org/licenses/bsd-license.php > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR > IMPLIED. > + > +**/ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > + > +/* Validate the node is media hard drive type */ > +EFI_STATUS > +ValidateAndroidMediaDevicePath ( > + IN EFI_DEVICE_PATH *DevicePath > + ) > +{ > + EFI_DEVICE_PATH_PROTOCOL*Node, *NextNode; > + > + NextNode = DevicePath; > + while (NextNode != NULL) { > +Node = NextNode; > +if (IS_DEVICE_PATH_NODE (Node, MEDIA_DEVICE_PATH, MEDIA_HARDDRIVE_DP)) { > + return EFI_SUCCESS; > +} > +NextNode = NextDevicePathNode (Node); > + } > + return EFI_INVALID_PARAMETER; > +} > + > +EFI_STATUS > +EFIAPI > +AndroidBootAppEntryPoint ( > + IN EFI_HANDLEImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + EFI_STATUS Status; > + CHAR16 *BootPathStr; > + EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL *EfiDevicePathFromTextProtocol; > + EFI_DEVICE_PATH *DevicePath; > + EFI_BLOCK_IO_PROTOCOL *BlockIo; > + UINT32 MediaId, BlockSize; > + VOID*Buffer; > + EFI_HANDLE Handle; > + UINTN BootImgSize; > + > + BootPathStr = (CHAR16 *)PcdGetPtr (PcdAndroidBootDevicePath); > + ASSERT (BootPathStr != NULL); > + Status = gBS->LocateProtocol (&gEfiDevicePathFromTextProtocolGuid, NULL, > +(VOID **)&EfiDevicePathFromTextProtocol); > + ASSERT_EFI_ERROR(Status); > + DevicePath = (EFI_DEVICE_PATH > *)EfiDevicePathFromTextProtocol->ConvertTextToDevicePath (BootPathStr); > + ASSERT (DevicePath != NULL); > + > + Status = ValidateAndroidMediaDevicePath (DevicePath); > + if (EFI_ERROR (Status)) { > +return Status; > + } > + > + Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, > + &DevicePath, &Handle); > + if (EFI_ERROR (Status)) { > +return Status; > + } > + > + Status = gBS->OpenProtocol ( > + Handle, > + &gEfiBlockIoProtocolGuid, > + (VOID **) &BlockIo, > + gImageHandle, > + NULL, > + EFI_OPEN_PROTOCOL_GET_PROTOCOL > + ); > + if (EFI_ERROR (Status)) { > +DEBUG ((EFI_D_ERROR, "Failed to get BlockIo: %r\n", Status)); BaseTools/Scripts/PatchCheck.py warns about this and other occurrences of EFI_D_*: * EFI_D_ERROR was used, but DEBUG_ERROR is now recommended Can you update all occurrences of this on added or modified lines to DEBUG_*? > +return Status; > + } > + > + MediaId = BlockIo->Medi
[edk2] [PATCH v4 3/4] EmbeddedPkg/AndroidBoot: boot android kernel from storage
Add an android kernel loader that could load kernel from storage device. This patch is derived from Haojian's code as below link. https://patches.linaro.org/patch/94683/ This android boot image BDS add addtitional cmdline/dtb/ramfs support besides kernel that is introduced by Android boot header. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jun Nie --- .../Application/AndroidBoot/AndroidBootApp.c | 140 +++ .../Application/AndroidBoot/AndroidBootApp.inf | 64 +++ EmbeddedPkg/Include/Library/AndroidBootImgLib.h| 17 + EmbeddedPkg/Include/Protocol/AndroidBootImg.h | 47 +++ .../Library/AndroidBootImgLib/AndroidBootImgLib.c | 444 + .../AndroidBootImgLib/AndroidBootImgLib.inf| 48 +++ 6 files changed, 760 insertions(+) create mode 100644 EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.c create mode 100644 EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.inf create mode 100644 EmbeddedPkg/Include/Protocol/AndroidBootImg.h create mode 100644 EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.c create mode 100644 EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.inf diff --git a/EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.c b/EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.c new file mode 100644 index 000..5069819 --- /dev/null +++ b/EmbeddedPkg/Application/AndroidBoot/AndroidBootApp.c @@ -0,0 +1,140 @@ +/** @file + + Copyright (c) 2013-2014, ARM Ltd. All rights reserved. + Copyright (c) 2017, Linaro. All rights reserved. + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/* Validate the node is media hard drive type */ +EFI_STATUS +ValidateAndroidMediaDevicePath ( + IN EFI_DEVICE_PATH *DevicePath + ) +{ + EFI_DEVICE_PATH_PROTOCOL*Node, *NextNode; + + NextNode = DevicePath; + while (NextNode != NULL) { +Node = NextNode; +if (IS_DEVICE_PATH_NODE (Node, MEDIA_DEVICE_PATH, MEDIA_HARDDRIVE_DP)) { + return EFI_SUCCESS; +} +NextNode = NextDevicePathNode (Node); + } + return EFI_INVALID_PARAMETER; +} + +EFI_STATUS +EFIAPI +AndroidBootAppEntryPoint ( + IN EFI_HANDLEImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + CHAR16 *BootPathStr; + EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL *EfiDevicePathFromTextProtocol; + EFI_DEVICE_PATH *DevicePath; + EFI_BLOCK_IO_PROTOCOL *BlockIo; + UINT32 MediaId, BlockSize; + VOID*Buffer; + EFI_HANDLE Handle; + UINTN BootImgSize; + + BootPathStr = (CHAR16 *)PcdGetPtr (PcdAndroidBootDevicePath); + ASSERT (BootPathStr != NULL); + Status = gBS->LocateProtocol (&gEfiDevicePathFromTextProtocolGuid, NULL, +(VOID **)&EfiDevicePathFromTextProtocol); + ASSERT_EFI_ERROR(Status); + DevicePath = (EFI_DEVICE_PATH *)EfiDevicePathFromTextProtocol->ConvertTextToDevicePath (BootPathStr); + ASSERT (DevicePath != NULL); + + Status = ValidateAndroidMediaDevicePath (DevicePath); + if (EFI_ERROR (Status)) { +return Status; + } + + Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, + &DevicePath, &Handle); + if (EFI_ERROR (Status)) { +return Status; + } + + Status = gBS->OpenProtocol ( + Handle, + &gEfiBlockIoProtocolGuid, + (VOID **) &BlockIo, + gImageHandle, + NULL, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (EFI_ERROR (Status)) { +DEBUG ((EFI_D_ERROR, "Failed to get BlockIo: %r\n", Status)); +return Status; + } + + MediaId = BlockIo->Media->MediaId; + BlockSize = BlockIo->Media->BlockSize; + Buffer = AllocatePages (EFI_SIZE_TO_PAGES (sizeof(ANDROID_BOOTIMG_HEADER))); + if (Buffer == NULL) { +return EFI_BUFFER_TOO_SMALL; + } + /* Load header of boot.img */ + Status = BlockIo->ReadBlocks ( + BlockIo, + MediaId, + 0, + BlockSize, + Buffer + ); + Status = AndroidBootImgGetImgSize (Buffer, &BootImgSize); + if (EFI_ERROR (Status)) { +DEBUG ((EFI_D_ERROR, "Failed to get AndroidBootImg Size: %r\n", Status)); +retu