Re: [edk2] [PATCH v4 3/4] EmbeddedPkg/AndroidBoot: boot android kernel from storage

2017-08-02 Thread Jun Nie
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

2017-08-01 Thread 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.

> 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

2017-08-01 Thread Jun Nie
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