EmbeddedPkg/AndroidFastboot: split android boot header

Split android boot header definition to share code among
different applications and libraries.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jun Nie <jun.nie@linaro.org>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
This commit is contained in:
Jun Nie 2017-08-02 22:03:40 +08:00 committed by Leif Lindholm
parent dba1521c3d
commit 6e414300b5
4 changed files with 65 additions and 31 deletions

View File

@ -14,32 +14,6 @@
#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),
@ -64,7 +38,8 @@ ParseAndroidBootImg (
Header = (ANDROID_BOOTIMG_HEADER *) BootImg;
if (AsciiStrnCmp (Header->BootMagic, BOOT_MAGIC, BOOT_MAGIC_LENGTH) != 0) {
if (AsciiStrnCmp ((CONST CHAR8 *)Header->BootMagic, ANDROID_BOOT_MAGIC,
ANDROID_BOOT_MAGIC_LENGTH) != 0) {
return EFI_INVALID_PARAMETER;
}
@ -72,7 +47,7 @@ ParseAndroidBootImg (
return EFI_NOT_FOUND;
}
ASSERT (IS_POWER_OF_2 (Header->PageSize));
ASSERT (IS_VALID_ANDROID_PAGE_SIZE (Header->PageSize));
*KernelSize = Header->KernelSize;
*Kernel = BootImgBytePtr + Header->PageSize;
@ -84,8 +59,8 @@ ParseAndroidBootImg (
+ ALIGN_VALUE (Header->KernelSize, Header->PageSize));
}
AsciiStrnCpyS (KernelArgs, BOOTIMG_KERNEL_ARGS_SIZE, Header->KernelArgs,
BOOTIMG_KERNEL_ARGS_SIZE);
AsciiStrnCpyS (KernelArgs, ANDROID_BOOTIMG_KERNEL_ARGS_SIZE, Header->KernelArgs,
ANDROID_BOOTIMG_KERNEL_ARGS_SIZE);
return EFI_SUCCESS;
}

View File

@ -15,6 +15,7 @@
#ifndef __ANDROID_FASTBOOT_APP_H__
#define __ANDROID_FASTBOOT_APP_H__
#include <Library/AndroidBootImgLib.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>

View File

@ -112,7 +112,7 @@ BootAndroidBootImg (
)
{
EFI_STATUS Status;
CHAR8 KernelArgs[BOOTIMG_KERNEL_ARGS_SIZE];
CHAR8 KernelArgs[ANDROID_BOOTIMG_KERNEL_ARGS_SIZE];
VOID *Kernel;
UINTN KernelSize;
VOID *Ramdisk;

View File

@ -0,0 +1,58 @@
/** @file
Copyright (c) 2013-2014, ARM Ltd. All rights reserved.<BR>
Copyright (c) 2017, Linaro.
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.
**/
#ifndef __ABOOTIMG_H__
#define __ABOOTIMG_H__
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Uefi/UefiBaseType.h>
#include <Uefi/UefiSpec.h>
#define ANDROID_BOOTIMG_KERNEL_ARGS_SIZE 512
#define ANDROID_BOOT_MAGIC "ANDROID!"
#define ANDROID_BOOT_MAGIC_LENGTH (sizeof (ANDROID_BOOT_MAGIC) - 1)
// No documentation for this really - sizes of fields has been determined
// empirically.
#pragma pack(1)
/* https://android.googlesource.com/platform/system/core/+/master/mkbootimg/bootimg.h */
typedef struct {
UINT8 BootMagic[ANDROID_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[ANDROID_BOOTIMG_KERNEL_ARGS_SIZE];
UINT32 Id[32];
} ANDROID_BOOTIMG_HEADER;
#pragma pack ()
/* 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))
/* Android boot image page size is not specified, but it should be power of 2
* and larger than boot header */
#define IS_VALID_ANDROID_PAGE_SIZE(Val) \
(IS_POWER_OF_2(Val) && (Val > sizeof(ANDROID_BOOTIMG_HEADER)))
#endif /* __ABOOTIMG_H__ */