AndroidBootImg.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /** @file
  2. Copyright (c) 2013-2014, ARM Ltd. All rights reserved.<BR>
  3. SPDX-License-Identifier: BSD-2-Clause-Patent
  4. **/
  5. #include "AndroidFastbootApp.h"
  6. // Find the kernel and ramdisk in an Android boot.img.
  7. // return EFI_INVALID_PARAMTER if the boot.img is invalid (i.e. doesn't have the
  8. // right magic value),
  9. // return EFI_NOT_FOUND if there was no kernel in the boot.img.
  10. // Note that the Ramdisk is optional - *Ramdisk won't be touched if it isn't
  11. // present, but RamdiskSize will be set to 0.
  12. EFI_STATUS
  13. ParseAndroidBootImg (
  14. IN VOID *BootImg,
  15. OUT VOID **Kernel,
  16. OUT UINTN *KernelSize,
  17. OUT VOID **Ramdisk,
  18. OUT UINTN *RamdiskSize,
  19. OUT CHAR8 *KernelArgs
  20. )
  21. {
  22. ANDROID_BOOTIMG_HEADER *Header;
  23. UINT8 *BootImgBytePtr;
  24. // Cast to UINT8 so we can do pointer arithmetic
  25. BootImgBytePtr = (UINT8 *) BootImg;
  26. Header = (ANDROID_BOOTIMG_HEADER *) BootImg;
  27. if (AsciiStrnCmp ((CONST CHAR8 *)Header->BootMagic, ANDROID_BOOT_MAGIC,
  28. ANDROID_BOOT_MAGIC_LENGTH) != 0) {
  29. return EFI_INVALID_PARAMETER;
  30. }
  31. if (Header->KernelSize == 0) {
  32. return EFI_NOT_FOUND;
  33. }
  34. ASSERT (IS_VALID_ANDROID_PAGE_SIZE (Header->PageSize));
  35. *KernelSize = Header->KernelSize;
  36. *Kernel = BootImgBytePtr + Header->PageSize;
  37. *RamdiskSize = Header->RamdiskSize;
  38. if (Header->RamdiskSize != 0) {
  39. *Ramdisk = (VOID *) (BootImgBytePtr
  40. + Header->PageSize
  41. + ALIGN_VALUE (Header->KernelSize, Header->PageSize));
  42. }
  43. AsciiStrnCpyS (KernelArgs, ANDROID_BOOTIMG_KERNEL_ARGS_SIZE, Header->KernelArgs,
  44. ANDROID_BOOTIMG_KERNEL_ARGS_SIZE);
  45. return EFI_SUCCESS;
  46. }