image: android: fix abootimg support
authorChristian Gmeiner <christian.gmeiner@gmail.com>
Fri, 29 May 2020 15:53:45 +0000 (17:53 +0200)
committerTom Rini <trini@konsulko.com>
Tue, 2 Jun 2020 17:06:12 +0000 (13:06 -0400)
abootimg creates images where all load addresses are 0.

 Android Boot Image Info:
* file name = artifacts/fastboot.img
* image size = 31381504 bytes (29.93 MB)
  page size  = 2048 bytes
* Boot Name = ""
* kernel size       = 9397406 bytes (8.96 MB)
  ramdisk size      = 21981144 bytes (20.96 MB)
* load addresses:
  kernel:       0x00000000
  ramdisk:      0x00000000
  tags:         0x00000000

Without this fix we end in a data abort:

Booting kernel at 0x15000000...
*  kernel: cmdline image address = 0x15000000
Kernel load addr 0x00000000 size 9178 KiB
Kernel command line: ip=dhcp console=ttymxc0,115200n8
   kernel data at 0x15000800, len = 0x008f649e (9397406)
*  ramdisk: cmdline image address = 0x15000000
RAM disk load addr 0x00000000 size 21473 KiB
   ramdisk start = 0x158f7000, ramdisk end = 0x16def35c
   kernel loaded at 0x00000000, end = 0x00000000
   Loading Kernel Image
data abort
pc : [<8ff8c004>]    lr : [<5d7ac70f>]
sp : 8f57ed64  ip : 48f17668  fp : 00000000
r10: 00000002  r9 : 8f58aed0  r8 : 03fa4c58
r7 : 5e842497  r6 : fbe73965  r5 : 7c459955  r4 : df020fde
r3 : 1b7aa45b  r2 : 007f23fe  r1 : 15104820  r0 : 00104000
Flags: nzCv  IRQs off  FIQs off  Mode SVC_32 (T)
Code: f07c e8b1 51f8 3a20 (e8a0) 51f8
Resetting CPU ...
resetting ...

Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com>
common/image-android.c

index 6af9baa121dbab45a827454b41f02bff895e657f..18f7c8db03ba7284d78d1c1723fd97988093ee0e 100644 (file)
@@ -33,6 +33,13 @@ static ulong android_image_get_kernel_addr(const struct andr_img_hdr *hdr)
        if (hdr->kernel_addr == ANDROID_IMAGE_DEFAULT_KERNEL_ADDR)
                return (ulong)hdr + hdr->page_size;
 
+       /*
+        * abootimg creates images where all load addresses are 0
+        * and we need to fix them.
+        */
+       if (hdr->kernel_addr == 0 && hdr->ramdisk_addr == 0)
+               return env_get_ulong("kernel_addr_r", 16, 0);
+
        return hdr->kernel_addr;
 }