AndroidBootImg.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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_PARAMETER 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 (
  28. (CONST CHAR8 *)Header->BootMagic,
  29. ANDROID_BOOT_MAGIC,
  30. ANDROID_BOOT_MAGIC_LENGTH
  31. ) != 0)
  32. {
  33. return EFI_INVALID_PARAMETER;
  34. }
  35. if (Header->KernelSize == 0) {
  36. return EFI_NOT_FOUND;
  37. }
  38. ASSERT (IS_VALID_ANDROID_PAGE_SIZE (Header->PageSize));
  39. *KernelSize = Header->KernelSize;
  40. *Kernel = BootImgBytePtr + Header->PageSize;
  41. *RamdiskSize = Header->RamdiskSize;
  42. if (Header->RamdiskSize != 0) {
  43. *Ramdisk = (VOID *)(BootImgBytePtr
  44. + Header->PageSize
  45. + ALIGN_VALUE (Header->KernelSize, Header->PageSize));
  46. }
  47. AsciiStrnCpyS (
  48. KernelArgs,
  49. ANDROID_BOOTIMG_KERNEL_ARGS_SIZE,
  50. Header->KernelArgs,
  51. ANDROID_BOOTIMG_KERNEL_ARGS_SIZE
  52. );
  53. return EFI_SUCCESS;
  54. }