| /** @file | |
| Copyright (c) 2013-2014, ARM Ltd. All rights reserved.<BR> | |
| Copyright (c) 2017, Linaro. | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #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))) | |
| EFI_STATUS | |
| AndroidBootImgGetImgSize ( | |
| IN VOID *BootImg, | |
| OUT UINTN *ImgSize | |
| ); | |
| EFI_STATUS | |
| AndroidBootImgBoot ( | |
| IN VOID *Buffer, | |
| IN UINTN BufferSize | |
| ); | |
| #endif /* __ABOOTIMG_H__ */ |