summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2017-06-25 07:44:47 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2017-06-25 07:44:47 +0000
commit9ec0de459846653f0a96b7111e5a54b1082dbcb5 (patch)
tree4a7391b9d0d97cedf9c33872136d13d4533e1592
parentd93628f535240a7fa94041627e87ec2d466250df (diff)
parentd12728add197560b5d9281bc6f1fe08387b884a7 (diff)
downloadedk2-9ec0de459846653f0a96b7111e5a54b1082dbcb5.tar.gz
release-request-7bfcab52-d1c0-4256-9d6b-5b5092bc78ca-for-git_oc-mr1-release-4133428 snap-temp-L95800000077479875
Change-Id: I3ffd8ea92e1fbce1680681b6d7595e328cc6c1d6
-rw-r--r--EmbeddedPkg/Application/AndroidFastboot/AndroidBootImg.c23
-rw-r--r--EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.c67
-rw-r--r--EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.h20
-rw-r--r--EmbeddedPkg/Include/Protocol/AndroidFastbootPlatform.h9
-rw-r--r--EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c6
5 files changed, 94 insertions, 31 deletions
diff --git a/EmbeddedPkg/Application/AndroidFastboot/AndroidBootImg.c b/EmbeddedPkg/Application/AndroidFastboot/AndroidBootImg.c
index bbca90fc0..105a82f01 100644
--- a/EmbeddedPkg/Application/AndroidFastboot/AndroidBootImg.c
+++ b/EmbeddedPkg/Application/AndroidFastboot/AndroidBootImg.c
@@ -14,32 +14,9 @@
#include "AndroidFastbootApp.h"
-#define BOOT_MAGIC "ANDROID!"
-#define BOOT_MAGIC_LENGTH sizeof (BOOT_MAGIC) - 1
-
// Check Val (unsigned) is a power of 2 (has only one bit set)
#define IS_POWER_OF_2(Val) (Val != 0 && ((Val & (Val - 1)) == 0))
-// No documentation for this really - sizes of fields has been determined
-// empirically.
-#pragma pack(1)
-typedef struct {
- CHAR8 BootMagic[BOOT_MAGIC_LENGTH];
- UINT32 KernelSize;
- UINT32 KernelAddress;
- UINT32 RamdiskSize;
- UINT32 RamdiskAddress;
- UINT32 SecondStageBootloaderSize;
- UINT32 SecondStageBootloaderAddress;
- UINT32 KernelTaggsAddress;
- UINT32 PageSize;
- UINT32 Reserved[2];
- CHAR8 ProductName[16];
- CHAR8 KernelArgs[BOOTIMG_KERNEL_ARGS_SIZE];
- UINT32 Id[32];
-} ANDROID_BOOTIMG_HEADER;
-#pragma pack()
-
// Find the kernel and ramdisk in an Android boot.img.
// return EFI_INVALID_PARAMTER if the boot.img is invalid (i.e. doesn't have the
// right magic value),
diff --git a/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.c b/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.c
index b891c0780..11a49f5e5 100644
--- a/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.c
+++ b/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.c
@@ -196,6 +196,66 @@ HandleErase (
}
STATIC
+EFI_STATUS
+HandleKernel (
+ IN CHAR8 *PartitionName
+ )
+{
+ VOID *BootBuffer;
+ UINTN BootSize = 0;
+ UINT32 KernelOff;
+ UINT32 RamdiskOff;
+ UINT32 NewRamdiskOff;
+ EFI_STATUS Status;
+ ANDROID_BOOTIMG_HEADER *Header;
+ CHAR16 OutputString[FASTBOOT_STRING_MAX_LENGTH];
+
+ Header = (ANDROID_BOOTIMG_HEADER *)mDataBuffer;
+ if ((AsciiStrnCmp (Header->BootMagic, BOOT_MAGIC, BOOT_MAGIC_LENGTH) == 0) &&
+ (Header->RamdiskSize != 0)) {
+ mTextOut->OutputString (mTextOut, L"It is boot.img\r\n");
+ return EFI_INVALID_PARAMETER;
+ }
+ mTextOut->OutputString (mTextOut, L"Booting downloaded kernel\r\n");
+ Status = mPlatform->ReadPartition (
+ PartitionName,
+ &BootSize,
+ &BootBuffer);
+ if (EFI_ERROR (Status)) {
+ UnicodeSPrint (OutputString, sizeof (OutputString), L"Fastboot: Fail to read %a partition: %r\r\n", PartitionName, Status);
+ mTextOut->OutputString (mTextOut, OutputString);
+ return Status;
+ }
+
+ Header = (ANDROID_BOOTIMG_HEADER *)BootBuffer;
+ if (AsciiStrnCmp (Header->BootMagic, BOOT_MAGIC, BOOT_MAGIC_LENGTH) != 0) {
+ return EFI_INVALID_PARAMETER;
+ }
+ KernelOff = Header->PageSize;
+ RamdiskOff = KernelOff +
+ Header->PageSize *
+ ((Header->KernelSize + Header->PageSize - 1) / Header->PageSize);
+ if (mNumDataBytes < KernelOff) {
+ return EFI_INVALID_PARAMETER;
+ }
+ Header->KernelSize = mNumDataBytes - KernelOff;
+ NewRamdiskOff = KernelOff +
+ Header->PageSize *
+ ((Header->KernelSize + Header->PageSize - 1) / Header->PageSize);
+ if (NewRamdiskOff + Header->RamdiskSize > BootSize) {
+ return EFI_INVALID_PARAMETER;
+ }
+ CopyMem(BootBuffer + NewRamdiskOff, BootBuffer + RamdiskOff, Header->RamdiskSize);
+ CopyMem(BootBuffer + KernelOff, mDataBuffer + KernelOff, Header->KernelSize);
+ FreePool (mDataBuffer);
+ Status = BootAndroidBootImg (NewRamdiskOff + Header->RamdiskSize, BootBuffer);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((EFI_D_ERROR, "Fastboot: Couldn't boot with new kernel: %r\n", Status));
+ }
+ return Status;
+}
+
+STATIC
VOID
HandleBoot (
VOID
@@ -215,9 +275,12 @@ HandleBoot (
// boot we lose control of the system.
SEND_LITERAL ("OKAY");
- Status = BootAndroidBootImg (mNumDataBytes, mDataBuffer);
+ Status = HandleKernel ("boot");
if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "Failed to boot downloaded image: %r\n", Status));
+ Status = BootAndroidBootImg (mNumDataBytes, mDataBuffer);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((EFI_D_ERROR, "Failed to boot downloaded image: %r\n", Status));
+ }
}
// We shouldn't get here
}
diff --git a/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.h b/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.h
index f62660feb..268a0d8a0 100644
--- a/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.h
+++ b/EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.h
@@ -23,6 +23,26 @@
#define ANDROID_FASTBOOT_VERSION "0.4"
+#define BOOT_MAGIC "ANDROID!"
+#define BOOT_MAGIC_LENGTH sizeof(BOOT_MAGIC) - 1
+#pragma pack(1)
+typedef struct {
+ CHAR8 BootMagic[BOOT_MAGIC_LENGTH];
+ UINT32 KernelSize;
+ UINT32 KernelAddress;
+ UINT32 RamdiskSize;
+ UINT32 RamdiskAddress;
+ UINT32 SecondStageBootloaderSize;
+ UINT32 SecondStageBootloaderAddress;
+ UINT32 KernelTaggsAddress;
+ UINT32 PageSize;
+ UINT32 Reserved[2];
+ CHAR8 ProductName[16];
+ CHAR8 KernelArgs[BOOTIMG_KERNEL_ARGS_SIZE];
+ UINT32 Id[32];
+} ANDROID_BOOTIMG_HEADER;
+#pragma pack()
+
EFI_STATUS
BootAndroidBootImg (
IN UINTN BufferSize,
diff --git a/EmbeddedPkg/Include/Protocol/AndroidFastbootPlatform.h b/EmbeddedPkg/Include/Protocol/AndroidFastbootPlatform.h
index d0693c151..efb861344 100644
--- a/EmbeddedPkg/Include/Protocol/AndroidFastbootPlatform.h
+++ b/EmbeddedPkg/Include/Protocol/AndroidFastbootPlatform.h
@@ -133,6 +133,14 @@ EFI_STATUS
IN CHAR8 *Command
);
+typedef
+EFI_STATUS
+(*FASTBOOT_PLATFORM_READ) (
+ IN CHAR8 *PartitionName,
+ IN OUT UINTN *BufferSize,
+ OUT VOID **Buffer
+ );
+
typedef struct _FASTBOOT_PLATFORM_PROTOCOL {
FASTBOOT_PLATFORM_INIT Init;
FASTBOOT_PLATFORM_UN_INIT UnInit;
@@ -140,6 +148,7 @@ typedef struct _FASTBOOT_PLATFORM_PROTOCOL {
FASTBOOT_PLATFORM_ERASE ErasePartition;
FASTBOOT_PLATFORM_GETVAR GetVar;
FASTBOOT_PLATFORM_OEM_COMMAND DoOemCommand;
+ FASTBOOT_PLATFORM_READ ReadPartition;
} FASTBOOT_PLATFORM_PROTOCOL;
/* See sparse_format.h in AOSP */
diff --git a/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c b/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c
index 9daa66279..9db221e15 100644
--- a/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c
+++ b/EmbeddedPkg/Universal/MmcDxe/MmcIdentification.c
@@ -427,12 +427,6 @@ InitializeSdMmcDevice (
if (EFI_ERROR (Status)) {
DEBUG ((EFI_D_ERROR, "%a(MMC_CMD6): Error and Status = %r\n", Status));
return Status;
- } else {
- Status = MmcHost->ReadBlockData (MmcHost, 0, 64, Buffer);
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "%a(MMC_CMD6): ReadBlockData Error and Status = %r\n", Status));
- return Status;
- }
}
}
if (Scr.SD_BUS_WIDTHS & SD_BUS_WIDTH_4BIT) {