Re: [PATCH v3 18/19] test/py: android: extend abootimg test

2023-03-06 Thread Safae Ouajih



On 27/02/2023 15:18, Tom Rini wrote:

On Mon, Feb 27, 2023 at 03:15:31PM +0100, Safae Ouajih wrote:

On 07/02/2023 20:02, Tom Rini wrote:

On Mon, Feb 06, 2023 at 12:50:20AM +0100, Safae Ouajih wrote:


test_abootimg is extended to include the testing of boot images
version 4. For this, boot.img and vendor_boot.img have been
generated using mkbootimg tool with setting the header
version to 4.

This tests:
- Getting the header version using abootimg
- Extracting the load address of the dtb
- Extracting the dtb start address in RAM

Running test:
$ ./test/py/test.py --bd sandbox --build -k test_abootimg

Signed-off-by: Safae Ouajih 
Reviewed-by: Simon Glass 
---
   test/py/tests/test_android/test_abootimg.py | 136 ++--
   1 file changed, 123 insertions(+), 13 deletions(-)

Alright, so I don't know where the failure starts, exactly. And to make
testing this easier, there's currently the
trini/u-boot-gitlab-ci-runner:jammy-20230126-07Feb2023 container you can
use to replicate my problem. The problem is that while this test passes
in CI, with GCC, with Clang it fails, consistently:
https://source.denx.de/u-boot/u-boot/-/jobs/572239#L284
and I'm not quite sure why. I hope that building sandbox with clang and
also just trying these features out interactively will fail too, and so
debugging this will be less of a problem.


Hello Tom,

I have investigated this issue, clang has a strange behavior in:

* abootimg_get_dtb_load_addr() : cmd/abootimg.c
* android_image_get_dtb_by_index() : boot/image-android.c

That is probably linked to some sort of optimization clang does.

However, The fail is not reproducible using clang-15 and clang-16 and also
not reproducible when turning off clang optimizations.

I suggest using clang-15 to run the test or I can remove all optimizations

on the related functions if clang-14 is used.

Thanks for investigating.  I see that 15 is now considered stable, so
I'll update the next branch for that, then re-take this series.



Hello Tom,

Thank you.

I am a bit confused, do you mean that you will apply this series after 
clang-15 update?


Best regards,

Safae



Re: [PATCH v3 18/19] test/py: android: extend abootimg test

2023-02-27 Thread Safae Ouajih



On 07/02/2023 20:02, Tom Rini wrote:

On Mon, Feb 06, 2023 at 12:50:20AM +0100, Safae Ouajih wrote:


test_abootimg is extended to include the testing of boot images
version 4. For this, boot.img and vendor_boot.img have been
generated using mkbootimg tool with setting the header
version to 4.

This tests:
- Getting the header version using abootimg
- Extracting the load address of the dtb
- Extracting the dtb start address in RAM

Running test:
$ ./test/py/test.py --bd sandbox --build -k test_abootimg

Signed-off-by: Safae Ouajih 
Reviewed-by: Simon Glass 
---
  test/py/tests/test_android/test_abootimg.py | 136 ++--
  1 file changed, 123 insertions(+), 13 deletions(-)

Alright, so I don't know where the failure starts, exactly. And to make
testing this easier, there's currently the
trini/u-boot-gitlab-ci-runner:jammy-20230126-07Feb2023 container you can
use to replicate my problem. The problem is that while this test passes
in CI, with GCC, with Clang it fails, consistently:
https://source.denx.de/u-boot/u-boot/-/jobs/572239#L284
and I'm not quite sure why. I hope that building sandbox with clang and
also just trying these features out interactively will fail too, and so
debugging this will be less of a problem.


Hello Tom,

I have investigated this issue, clang has a strange behavior in:

* abootimg_get_dtb_load_addr() : cmd/abootimg.c
* android_image_get_dtb_by_index() : boot/image-android.c

That is probably linked to some sort of optimization clang does.

However, The fail is not reproducible using clang-15 and clang-16 and also
not reproducible when turning off clang optimizations.

I suggest using clang-15 to run the test or I can remove all optimizations

on the related functions if clang-14 is used.

Best regards,

Safae



Re: [PATCH v3 09/19] android: boot: add vendor boot image to prepare for v3,v4 support

2023-02-09 Thread Safae Ouajih



On 07/02/2023 05:02, Simon Glass wrote:

On Sun, 5 Feb 2023 at 16:50, Safae Ouajih  wrote:

Introduce vendor boot image for version 3 and 4 of boot image header.
The vendor boot image will hold extra information about kernel, dtb
and ramdisk.

This is done to prepare for boot image version 3 and 4 support.

Signed-off-by: Safae Ouajih 
---
  boot/bootm.c |  8 +++
  boot/image-android.c | 54 
  boot/image-board.c   |  3 +--
  boot/image-fdt.c |  3 ++-
  cmd/abootimg.c   |  4 ++--
  include/image.h  | 48 ++-
  6 files changed, 81 insertions(+), 39 deletions(-)

I don't see a change log but I see some comments. Not sure what else I
said on the review.


Only the comments changed to add the new partition

Thank you for the review,

BR,

Safae


Reviewed-by: Simon Glass 


Re: [PATCH v3 18/19] test/py: android: extend abootimg test

2023-02-09 Thread Safae Ouajih



On 07/02/2023 20:02, Tom Rini wrote:

On Mon, Feb 06, 2023 at 12:50:20AM +0100, Safae Ouajih wrote:


test_abootimg is extended to include the testing of boot images
version 4. For this, boot.img and vendor_boot.img have been
generated using mkbootimg tool with setting the header
version to 4.

This tests:
- Getting the header version using abootimg
- Extracting the load address of the dtb
- Extracting the dtb start address in RAM

Running test:
$ ./test/py/test.py --bd sandbox --build -k test_abootimg

Signed-off-by: Safae Ouajih 
Reviewed-by: Simon Glass 
---
  test/py/tests/test_android/test_abootimg.py | 136 ++--
  1 file changed, 123 insertions(+), 13 deletions(-)

Alright, so I don't know where the failure starts, exactly. And to make
testing this easier, there's currently the
trini/u-boot-gitlab-ci-runner:jammy-20230126-07Feb2023 container you can
use to replicate my problem. The problem is that while this test passes
in CI, with GCC, with Clang it fails, consistently:
https://source.denx.de/u-boot/u-boot/-/jobs/572239#L284
and I'm not quite sure why. I hope that building sandbox with clang and
also just trying these features out interactively will fail too, and so
debugging this will be less of a problem.


Hi Tom,

I will try to reproduce this fail and fix it on a v4.

Thank you for reporting,

BRs,

Safae



Re: [PATCH v3 06/19] android: boot: move to andr_image_data structure

2023-02-09 Thread Safae Ouajih



On 09/02/2023 15:26, Mattijs Korpershoek wrote:

On Mon, Feb 06, 2023 at 00:50, Safae Ouajih  wrote:


Move from andr_boot_img_hdr_v0 to andr_image_data
structure to prepare for boot image header
version 3 and 4.

Signed-off-by: Safae Ouajih 
---
  boot/image-android.c | 121 +++
  cmd/abootimg.c   |  31 +--
  2 files changed, 81 insertions(+), 71 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index ea05c1814f..15a735e230 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -86,7 +86,7 @@ bool android_image_get_data(const void *boot_hdr, struct 
andr_image_data *data)
return true;
  }
  
-static ulong android_image_get_kernel_addr(const struct andr_boot_img_hdr_v0 *hdr)

+static ulong android_image_get_kernel_addr(struct andr_image_data *img_data)
  {
/*
 * All the Android tools that generate a boot.img use this
@@ -99,17 +99,17 @@ static ulong android_image_get_kernel_addr(const struct 
andr_boot_img_hdr_v0 *hd
 *
 * Otherwise, we will return the actual value set by the user.
 */
-   if (hdr->kernel_addr == ANDROID_IMAGE_DEFAULT_KERNEL_ADDR)
-   return (ulong)hdr + hdr->page_size;
+   if (img_data->kernel_addr  == ANDROID_IMAGE_DEFAULT_KERNEL_ADDR)
+   return img_data->kernel_ptr;
  
  	/*

 * abootimg creates images where all load addresses are 0
 * and we need to fix them.
 */
-   if (hdr->kernel_addr == 0 && hdr->ramdisk_addr == 0)
+   if (img_data->kernel_addr == 0 && img_data->ramdisk_addr == 0)
return env_get_ulong("kernel_addr_r", 16, 0);
  
-	return hdr->kernel_addr;

+   return img_data->kernel_addr;
  }
  
  /**

@@ -130,27 +130,33 @@ static ulong android_image_get_kernel_addr(const struct 
andr_boot_img_hdr_v0 *hd
  int android_image_get_kernel(const struct andr_boot_img_hdr_v0 *hdr, int 
verify,
 ulong *os_data, ulong *os_len)
  {
-   u32 kernel_addr = android_image_get_kernel_addr(hdr);
-   const struct legacy_img_hdr *ihdr = (const struct legacy_img_hdr *)
-   ((uintptr_t)hdr + hdr->page_size);
+   struct andr_image_data img_data = {0};
+   u32 kernel_addr;
+   const struct legacy_img_hdr *ihdr;
+
+   if (!android_image_get_data(hdr, _data))
+   return -EINVAL;
+
+   kernel_addr = android_image_get_kernel_addr(_data);
+   ihdr = (const struct legacy_img_hdr *)img_data.kernel_ptr;
  
  	/*

 * Not all Android tools use the id field for signing the image with
 * sha1 (or anything) so we don't check it. It is not obvious that the
 * string is null terminated so we take care of this.
 */
-   strncpy(andr_tmp_str, hdr->name, ANDR_BOOT_NAME_SIZE);
+   strlcpy(andr_tmp_str, img_data.image_name, ANDR_BOOT_NAME_SIZE);

While strlcpy is probably better than strncpy here, it has nothing to do
with this change. Either mention in the commit message that this is
intentional or drop this change.

Note that strncpy was used in v2 of this patch. Why change it to strlcpy here?


Hello Mattijs,

Thank you for the review,

This is done to fix checkpatch.pl warning :  WARNING: strlcpy is 
preferred over strncpy





andr_tmp_str[ANDR_BOOT_NAME_SIZE] = '\0';
if (strlen(andr_tmp_str))
printf("Android's image name: %s\n", andr_tmp_str);
  
  	printf("Kernel load addr 0x%08x size %u KiB\n",

-  kernel_addr, DIV_ROUND_UP(hdr->kernel_size, 1024));
+  kernel_addr, DIV_ROUND_UP(img_data.kernel_size, 1024));
  
  	int len = 0;

-   if (*hdr->cmdline) {
-   printf("Kernel command line: %s\n", hdr->cmdline);
-   len += strlen(hdr->cmdline);
+   if (*img_data.kcmdline) {
+   printf("Kernel command line: %s\n", img_data.kcmdline);
+   len += strlen(img_data.kcmdline);
}
  
  	char *bootargs = env_get("bootargs");

@@ -168,8 +174,9 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0 *hdr, int verify,
strcpy(newbootargs, bootargs);
strcat(newbootargs, " ");
}
-   if (*hdr->cmdline)
-   strcat(newbootargs, hdr->cmdline);
+
+   if (*img_data.kcmdline)
+   strcat(newbootargs, img_data.kcmdline);
  
  	env_set("bootargs", newbootargs);
  
@@ -177,15 +184,14 @@ int android_image_get_kernel(const struct andr_boot_img_hdr_v0 *hdr, int verify,

if (image_get_magic(ihdr) == IH_MAGIC) {
*os_data = image_get_data(ihdr);
} else {
-   *os_data = (ulong)hdr;
-   *os_data += hdr->page_size;
+   *os_data = img_data.kernel_ptr;
 

Re: [PATCH v3 06/19] android: boot: move to andr_image_data structure

2023-02-09 Thread Safae Ouajih



On 07/02/2023 05:02, Simon Glass wrote:

Hi Safae,

On Sun, 5 Feb 2023 at 16:50, Safae Ouajih  wrote:

Move from andr_boot_img_hdr_v0 to andr_image_data
structure to prepare for boot image header
version 3 and 4.


Change log?



Hi Simon,

I will make sure to include changelogs in v4.

For this patch it would be :

--

v2->v3

- Remove #ifdef directives that are not needed in v3

- Use strlcpy instead of strncpy as required by checkpatch.pl

- Fix coding style (spaces at the start of a line) in 
android_image_get_second() as required by checkpatch.pl


Thank you for the review,

BRs,

Safae



Signed-off-by: Safae Ouajih 
---
  boot/image-android.c | 121 +++
  cmd/abootimg.c   |  31 +--
  2 files changed, 81 insertions(+), 71 deletions(-)



[PATCH v3 15/19] android: boot: support boot image header version 3 and 4

2023-02-05 Thread Safae Ouajih
Enable the support for boot image header version 3 and 4
using abootimg command.

In order to use version 3 or 4:

1- Vendor boot image address should be given to abootimg cmd.

abootimg addr $1 $vendor_boot_load_addr

2- "ramdisk_addr_r" env variable (ramdisk address) should be set to host
the ramdisk : generic ramdisk + vendor ramdisk

Replace "struct andr_boot_img_hdr_v0*" by "void *" in
some functions since v3 and v4 are now supported as well.

Signed-off-by: Safae Ouajih 
---
 boot/bootm.c | 37 -
 boot/image-android.c | 16 ++--
 boot/image-board.c   | 18 +++---
 boot/image-fdt.c |  2 +-
 cmd/abootimg.c   | 24 ++--
 include/image.h  | 25 +++--
 6 files changed, 99 insertions(+), 23 deletions(-)

diff --git a/boot/bootm.c b/boot/bootm.c
index a58e6f391e..a7fc6c4545 100644
--- a/boot/bootm.c
+++ b/boot/bootm.c
@@ -113,6 +113,10 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, 
int argc,
 char *const argv[])
 {
const void *os_hdr;
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+   const void *vendor_boot_img;
+   const void *boot_img;
+#endif
bool ep_found = false;
int ret;
 
@@ -181,14 +185,23 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, 
int argc,
 #endif
 #ifdef CONFIG_ANDROID_BOOT_IMAGE
case IMAGE_FORMAT_ANDROID:
+   boot_img = os_hdr;
+   vendor_boot_img = NULL;
+   if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) {
+   boot_img = map_sysmem(get_abootimg_addr(), 0);
+   vendor_boot_img = 
map_sysmem(get_avendor_bootimg_addr(), 0);
+   }
images.os.type = IH_TYPE_KERNEL;
-   images.os.comp = android_image_get_kcomp(os_hdr, NULL);
+   images.os.comp = android_image_get_kcomp(boot_img, 
vendor_boot_img);
images.os.os = IH_OS_LINUX;
-
-   images.os.end = android_image_get_end(os_hdr, NULL);
-   images.os.load = android_image_get_kload(os_hdr, NULL);
+   images.os.end = android_image_get_end(boot_img, 
vendor_boot_img);
+   images.os.load = android_image_get_kload(boot_img, 
vendor_boot_img);
images.ep = images.os.load;
ep_found = true;
+   if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) {
+   unmap_sysmem(vendor_boot_img);
+   unmap_sysmem(boot_img);
+   }
break;
 #endif
default:
@@ -889,6 +902,10 @@ static const void *boot_get_kernel(struct cmd_tbl *cmdtp, 
int flag, int argc,
int os_noffset;
 #endif
 
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+   const void *boot_img;
+   const void *vendor_boot_img;
+#endif
img_addr = genimg_get_kernel_addr_fit(argc < 1 ? NULL : argv[0],
  _uname_config,
  _uname_kernel);
@@ -964,10 +981,20 @@ static const void *boot_get_kernel(struct cmd_tbl *cmdtp, 
int flag, int argc,
 #endif
 #ifdef CONFIG_ANDROID_BOOT_IMAGE
case IMAGE_FORMAT_ANDROID:
+   boot_img = buf;
+   vendor_boot_img = NULL;
+   if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) {
+   boot_img = map_sysmem(get_abootimg_addr(), 0);
+   vendor_boot_img = 
map_sysmem(get_avendor_bootimg_addr(), 0);
+   }
printf("## Booting Android Image at 0x%08lx ...\n", img_addr);
-   if (android_image_get_kernel(buf, NULL, images->verify,
+   if (android_image_get_kernel(boot_img, vendor_boot_img, 
images->verify,
 os_data, os_len))
return NULL;
+   if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) {
+   unmap_sysmem(vendor_boot_img);
+   unmap_sysmem(boot_img);
+   }
break;
 #endif
default:
diff --git a/boot/image-android.c b/boot/image-android.c
index 6be439ed12..fb29ff403f 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -201,7 +201,7 @@ static ulong android_image_get_kernel_addr(struct 
andr_image_data *img_data)
  * Return: Zero, os start address and length on success,
  * otherwise on failure.
  */
-int android_image_get_kernel(const struct andr_boot_img_hdr_v0 *hdr,
+int android_image_get_kernel(const void *hdr,
 const void *vendor_boot_img, int verify,
 ulong *os_data, ulong *os_len)
 {
@@ -286,7 +286,7 @@ bool is_android_vendor_boot_image_header(const void 
*vendor_boot_img)
return !memcmp(VENDOR_BOOT_MAGIC, vendor_boot_img, 
ANDR_VENDOR_BOOT_MAGIC_SIZE);
 }
 
-bool is_android_boot_image_hea

[PATCH v3 17/19] doc: android: add documentation for v3, v4 boot image header

2023-02-05 Thread Safae Ouajih
Update the Android documentation to describe version 3 and 4 of boot
image header.

Signed-off-by: Safae Ouajih 
---
 doc/android/boot-image.rst | 13 -
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/doc/android/boot-image.rst b/doc/android/boot-image.rst
index 71db02521b..c719b4d711 100644
--- a/doc/android/boot-image.rst
+++ b/doc/android/boot-image.rst
@@ -27,11 +27,21 @@ next image headers:
 * v2: used in devices launched with Android 10; adds ``dtb`` field, which
   references payload containing DTB blobs (either concatenated one after the
   other, or in Android DTBO image format)
+* v3: used in devices launched with Android 11; adds ``vendor_boot`` partition
+  and removes the second-stage bootloader and recovery image support. The new
+  ``vendor_boot`` partition holds the device tree blob (DTB) and a vendor 
ramdisk.
+  The generic ramdisk in ``boot`` partition is loaded immediately following
+  the vendor ramdisk.
+* v4: used in devices launched with Android 12; provides a boot signature in 
boot
+  image header, supports multiple vendor ramdisk fragments in ``vendor_boot``
+  partition. This version also adds a bootconfig section at the end of the 
vendor
+  boot image, this section contains boot configuration parameters known at 
build time
+  (see [9]_ for details).
 
 v2, v1 and v0 formats are backward compatible.
 
 The Android Boot Image format is represented by
-:c:type:`struct andr_img_hdr ` in U-Boot, and can be seen in
+:c:type:`struct andr_image_data ` in U-Boot, and can be seen 
in
 ``include/android_image.h``. U-Boot supports booting Android Boot Image and 
also
 has associated command
 
@@ -153,3 +163,4 @@ References
 .. [6] :doc:`avb2`
 .. [7] https://source.android.com/devices/bootloader
 .. [8] https://connect.linaro.org/resources/san19/san19-217/
+.. [9] 
https://source.android.com/docs/core/architecture/bootloader/implementing-bootconfig
-- 
2.34.1



[PATCH v3 16/19] android: boot: support bootconfig

2023-02-05 Thread Safae Ouajih
Support Bootconfig feature.
- The bootconfig feature replaces the androidboot.*
  kernel cmdline options.

This was adapted from downstream [1] commit : 7af0a0506d4d ("cuttlefish:
support bootconfig parameters").

Link:[1] https://android.googlesource.com/platform/external/u-boot/

Signed-off-by: Safae Ouajih 
Reviewed-by: Simon Glass 
Reviewed-by: Mattijs Korpershoek 
---
 boot/image-android.c| 58 +++--
 include/android_image.h | 11 
 2 files changed, 67 insertions(+), 2 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index fb29ff403f..88e40bc7ec 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -18,6 +18,45 @@
 
 static char andr_tmp_str[ANDR_BOOT_ARGS_SIZE + 1];
 
+static ulong checksum(const unsigned char *buffer, ulong size)
+{
+   ulong sum = 0;
+
+   for (ulong i = 0; i < size; i++)
+   sum += buffer[i];
+   return sum;
+}
+
+static bool is_trailer_present(ulong bootconfig_end_addr)
+{
+   return !strncmp((char *)(bootconfig_end_addr - BOOTCONFIG_MAGIC_SIZE),
+   BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_SIZE);
+}
+
+static ulong add_trailer(ulong bootconfig_start_addr, ulong bootconfig_size)
+{
+   ulong end;
+   ulong sum;
+
+   if (!bootconfig_start_addr)
+   return -1;
+   if (!bootconfig_size)
+   return 0;
+
+   end = bootconfig_start_addr + bootconfig_size;
+   if (is_trailer_present(end))
+   return 0;
+
+   memcpy((void *)(end), _size, BOOTCONFIG_SIZE_SIZE);
+   sum = checksum((unsigned char *)bootconfig_start_addr, bootconfig_size);
+   memcpy((void *)(end + BOOTCONFIG_SIZE_SIZE), ,
+  BOOTCONFIG_CHECKSUM_SIZE);
+   memcpy((void *)(end + BOOTCONFIG_SIZE_SIZE + BOOTCONFIG_CHECKSUM_SIZE),
+  BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_SIZE);
+
+   return BOOTCONFIG_TRAILER_SIZE;
+}
+
 static void android_boot_image_v3_v4_parse_hdr(const struct 
andr_boot_img_hdr_v3 *hdr,
   struct andr_image_data *data)
 {
@@ -61,6 +100,7 @@ static void android_vendor_boot_image_v3_v4_parse_hdr(const 
struct andr_vnd_boot
data->kernel_addr = hdr->kernel_addr;
data->ramdisk_addr = hdr->ramdisk_addr;
data->dtb_load_addr = hdr->dtb_addr;
+   data->bootconfig_size = hdr->bootconfig_size;
end = (ulong)hdr;
end += hdr->page_size;
if (hdr->vendor_ramdisk_size) {
@@ -75,7 +115,13 @@ static void android_vendor_boot_image_v3_v4_parse_hdr(const 
struct andr_vnd_boot
 
end += ALIGN(hdr->dtb_size, hdr->page_size);
end += ALIGN(hdr->vendor_ramdisk_table_size, hdr->page_size);
-   end += ALIGN(hdr->bootconfig_size, hdr->page_size);
+   data->bootconfig_addr = end;
+   if (hdr->bootconfig_size) {
+   data->bootconfig_size += add_trailer(data->bootconfig_addr,
+data->bootconfig_size);
+   data->ramdisk_size += data->bootconfig_size;
+   }
+   end += ALIGN(data->bootconfig_size, hdr->page_size);
data->vendor_boot_img_total_size = end - (ulong)hdr;
 }
 
@@ -352,7 +398,15 @@ int android_image_get_ramdisk(const void *hdr, const void 
*vendor_boot_img,
memcpy((void *)(ramdisk_ptr), (void 
*)img_data.vendor_ramdisk_ptr,
   img_data.vendor_ramdisk_size);
memcpy((void *)(ramdisk_ptr + img_data.vendor_ramdisk_size),
-  (void *)img_data.ramdisk_ptr, 
img_data.boot_ramdisk_size);
+  (void *)img_data.ramdisk_ptr,
+  img_data.boot_ramdisk_size);
+   if (img_data.bootconfig_size) {
+   memcpy((void *)
+  (ramdisk_ptr + img_data.vendor_ramdisk_size +
+  img_data.boot_ramdisk_size),
+  (void *)img_data.bootconfig_addr,
+  img_data.bootconfig_size);
+   }
}
 
printf("RAM disk load addr 0x%08lx size %u KiB\n",
diff --git a/include/android_image.h b/include/android_image.h
index 99e7803508..d503c980b2 100644
--- a/include/android_image.h
+++ b/include/android_image.h
@@ -25,6 +25,14 @@
 #define ANDR_VENDOR_BOOT_ARGS_SIZE 2048
 #define ANDR_VENDOR_BOOT_NAME_SIZE 16
 
+#define BOOTCONFIG_MAGIC "#BOOTCONFIG\n"
+#define BOOTCONFIG_MAGIC_SIZE 12
+#define BOOTCONFIG_SIZE_SIZE 4
+#define BOOTCONFIG_CHECKSUM_SIZE 4
+#define BOOTCONFIG_TRAILER_SIZE BOOTCONFIG_MAGIC_SIZE + \
+   BOOTCONFIG_SIZE_SIZE + \
+   BOOTCONFIG_CHECKSUM_SIZE
+
 struct andr_boot_img_hdr_v3 {
u8 magic[ANDR_BOOT_MAGIC_SIZE];
 
@@ -337,6 +345,9 @@ struct andr_image_data {
const char *

[PATCH v3 18/19] test/py: android: extend abootimg test

2023-02-05 Thread Safae Ouajih
test_abootimg is extended to include the testing of boot images
version 4. For this, boot.img and vendor_boot.img have been
generated using mkbootimg tool with setting the header
version to 4.

This tests:
- Getting the header version using abootimg
- Extracting the load address of the dtb
- Extracting the dtb start address in RAM

Running test:
$ ./test/py/test.py --bd sandbox --build -k test_abootimg

Signed-off-by: Safae Ouajih 
Reviewed-by: Simon Glass 
---
 test/py/tests/test_android/test_abootimg.py | 136 ++--
 1 file changed, 123 insertions(+), 13 deletions(-)

diff --git a/test/py/tests/test_android/test_abootimg.py 
b/test/py/tests/test_android/test_abootimg.py
index 43a7099c46..6a8ff34538 100644
--- a/test/py/tests/test_android/test_abootimg.py
+++ b/test/py/tests/test_android/test_abootimg.py
@@ -32,6 +32,23 @@ Now one can obtain original boot.img from this hex dump like 
this:
 
 $ xxd -r -p boot.img.gz.hex boot.img.gz
 $ gunzip -9 boot.img.gz
+
+For boot image header version 4, these tests rely on two images that are 
generated
+using the same steps above :
+
+1- boot.img :
+$ mkbootimg --kernel ./kernel --ramdisk ./ramdisk.img  \
+--cmdline "cmdline test" --dtb ./dtb.img   \
+--os_version R --os_patch_level 2019-06-05 \
+--header_version 4 --output ./boot.img
+
+2- vendor_boot.img
+$ mkbootimg --kernel ./kernel --ramdisk ./ramdisk.img  \
+--cmdline "cmdline test" --dtb ./dtb.img   \
+--os_version R --os_patch_level 2019-06-05 \
+--pagesize 4096  --vendor_ramdisk ./ramdisk.img \
+--header_version 4 --vendor_boot ./vboot.img \
+
 """
 
 # boot.img.gz hex dump
@@ -44,6 +61,24 @@ b776207d345446c1281805e8a0868d81e117a45e111c0d8dc101b253
 9c03c41a0c90f17fe85400986d82452b6c3680198a192a0ce17c3610ae34
 d4a9820881a70f3873f35352731892f3730b124b32937252a96bb9119ae5
 463a5546f82c1f05a360148c8251300a462e85bf67f20020"""
+
+# boot img v4 hex dump
+boot_img_hex = """1f8b080827b0cd630203626f6f742e696d6700edd8bd0d82601885d1d7c4
+58d8c808b88195bd098d8d246e40e42b083f1aa0717be99d003d277916b8
+e5bddc8a7b792d8e8788c896ce9b88d32ebe6c971e7ddd3543cae734cd01
+c0ffc84cb0766d1a87d4e5afeadd3dab7a6f1000f84163d5d7cd
+d43a60c53e754499570040"""
+
+# vendor boot image v4 hex dump
+vboot_img_hex = """1f8b0808baaecd63020376626f6f742e696d6700edd8310b824018c6f1b3
+222a08f41b3436b4280dcdd19c11d16ee9109d18d59042d047ec8b04cd0d
+d19d5a4345534bf6ffc173ef29272f38e93b1d0ec67dd79d548462aa1cd2
+d5d20bf8438678f90c18d584b8a4bbb3a557991ecb2af80d6b2f
+f4179b656be5c532f2fc066f0480e23936af2755f62a3d918df1
+db2a7ab67f9ffdeb7df7cda3465ecb79c4ce7e5c577562bb9364b74449a5
+1e467e20c53c0a57de763193c1779b3b4fcd9d4ee27c6a0ec0ff
+309ffea70140f1dc00412985540040"""
+
 # Expected response for "abootimg dtb_dump" command
 dtb_dump_resp="""## DTB area contents (concat format):
  - DTB #0:
@@ -56,15 +91,21 @@ dtb_dump_resp="""## DTB area contents (concat format):
  (DTB)compatible = y2,z2"""
 # Address in RAM where to load the boot image ('abootimg' looks in $loadaddr)
 loadaddr = 0x1000
+# Address in RAM where to load the vendor boot image ('abootimg' looks in 
$vloadaddr)
+vloadaddr= 0x1
 # Expected DTB #1 offset from the boot image start address
 dtb1_offset = 0x187d
+# Expected DTB offset from the vendor boot image start address
+dtb2_offset = 0x207d
 # DTB #1 start address in RAM
 dtb1_addr = loadaddr + dtb1_offset
+# DTB #2 start address in RAM
+dtb2_addr = vloadaddr + dtb2_offset
 
 class AbootimgTestDiskImage(object):
 """Disk image used by abootimg tests."""
 
-def __init__(self, u_boot_console):
+def __init__(self, u_boot_console, image_name, hex_img):
 """Initialize a new AbootimgDiskImage object.
 
 Args:
@@ -74,13 +115,13 @@ class AbootimgTestDiskImage(object):
 Nothing.
 """
 
-gz_hex = u_boot_console.config.persistent_data_dir + '/boot.img.gz.hex'
-gz = u_boot_console.config.persistent_data_dir + '/boot.img.gz'
+gz_hex = u_boot_console.config.persistent_data_dir + '/' + image_name  
+ '.gz.hex'
+gz = u_boot_console.config.persistent_data_dir + '/' + image_name + 
'.gz'
 
-filename = 'boot.img'
+filename = image_name
 persistent = u_boot_console.config.persistent_data_dir + '/' + filename
 self.path = u_boot_console.config.result_dir  + '/' + filename
-
+u_boot_console.log.action('persistent is ' + persistent)
 with u_boot_utils.persistent_file_helper(u_boot_console.log, 
persistent):
 if os.path.exists(persistent):
 u_boot_console.log.action('Di

[PATCH v3 19/19] Dockerfile: add mkbootimg tool

2023-02-05 Thread Safae Ouajih
mkbootimg tool is part of the Android project and it is
used to pack Android boot images such as boot image
and vendor_boot image.

Use the following command to run mkbootimg:
$ python3 -m mkbootimg

Add mkbootimg to the docker file

Signed-off-by: Safae Ouajih 
---
 tools/docker/Dockerfile | 4 
 1 file changed, 4 insertions(+)

diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile
index 202a8145af..f74b866954 100644
--- a/tools/docker/Dockerfile
+++ b/tools/docker/Dockerfile
@@ -226,3 +226,7 @@ RUN /bin/echo -e "\n[toolchain-prefix]\nxtensa = 
/opt/2020.07/xtensa-dc233c-elf/
 RUN /bin/echo -e "\n[toolchain-alias]\nsh = sh2" >> ~/.buildman
 RUN /bin/echo -e "\nsandbox = x86_64" >> ~/.buildman
 RUN /bin/echo -e "\nx86 = i386" >> ~/.buildman;
+
+# Add mkbootimg tool
+RUN git clone https://android.googlesource.com/platform/system/tools/mkbootimg 
/home/uboot/mkbootimg
+ENV PYTHONPATH "${PYTHONPATH}:/home/uboot/mkbootimg"
-- 
2.34.1



[PATCH v3 12/19] android: boot: support extra command line

2023-02-05 Thread Safae Ouajih
In version 3 and 4 of boot image header, the vendor specific
command line are located in vendor boot image. Thus, use
extra command line to add those cmd to bootargs.

Signed-off-by: Safae Ouajih 
Reviewed-by: Simon Glass 
Reviewed-by: Mattijs Korpershoek 
---
 boot/image-android.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/boot/image-android.c b/boot/image-android.c
index 35243fd5b1..a944f0a31a 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -55,6 +55,7 @@ static void android_vendor_boot_image_v3_v4_parse_hdr(const 
struct andr_vnd_boot
 * The header takes a full page, the remaining components are aligned
 * on page boundary.
 */
+   data->kcmdline_extra = hdr->cmdline;
data->tags_addr = hdr->tags_addr;
data->image_name = hdr->name;
data->kernel_addr = hdr->kernel_addr;
@@ -233,6 +234,11 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0 *hdr,
len += strlen(img_data.kcmdline);
}
 
+   if (img_data.kcmdline_extra) {
+   printf("Kernel extra command line: %s\n", 
img_data.kcmdline_extra);
+   len += strlen(img_data.kcmdline_extra);
+   }
+
char *bootargs = env_get("bootargs");
if (bootargs)
len += strlen(bootargs);
@@ -252,6 +258,11 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0 *hdr,
if (*img_data.kcmdline)
strcat(newbootargs, img_data.kcmdline);
 
+   if (img_data.kcmdline_extra) {
+   strcat(newbootargs, " ");
+   strcat(newbootargs, img_data.kcmdline_extra);
+   }
+
env_set("bootargs", newbootargs);
 
if (os_data) {
-- 
2.34.1



[PATCH v3 13/19] android: boot: update android_image_get_dtb_img_addr to support v3, v4

2023-02-05 Thread Safae Ouajih
Add support for boot image version 3 and 4 in
android_image_get_dtb_img_addr().
Since the dtb is now included in vendor_boot image
instead of boot image, extract the dtb address from
vendor_boot image when a v3 or v4 is used.

Signed-off-by: Safae Ouajih 
Reviewed-by: Simon Glass 
Reviewed-by: Mattijs Korpershoek 
---
 boot/image-android.c | 47 +++-
 1 file changed, 33 insertions(+), 14 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index a944f0a31a..6be439ed12 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -457,6 +457,7 @@ exit:
 static bool android_image_get_dtb_img_addr(ulong hdr_addr, ulong vhdr_addr, 
ulong *addr)
 {
const struct andr_boot_img_hdr_v0 *hdr;
+   const struct andr_vnd_boot_img_hdr *v_hdr;
ulong dtb_img_addr;
bool ret = true;
 
@@ -473,22 +474,40 @@ static bool android_image_get_dtb_img_addr(ulong 
hdr_addr, ulong vhdr_addr, ulon
goto exit;
}
 
-   if (hdr->dtb_size == 0) {
-   printf("Error: dtb_size is 0\n");
-   ret = false;
-   goto exit;
+   if (hdr->header_version == 2) {
+   if (!hdr->dtb_size) {
+   printf("Error: dtb_size is 0\n");
+   ret = false;
+   goto exit;
+   }
+   /* Calculate the address of DTB area in boot image */
+   dtb_img_addr = hdr_addr;
+   dtb_img_addr += hdr->page_size;
+   dtb_img_addr += ALIGN(hdr->kernel_size, hdr->page_size);
+   dtb_img_addr += ALIGN(hdr->ramdisk_size, hdr->page_size);
+   dtb_img_addr += ALIGN(hdr->second_size, hdr->page_size);
+   dtb_img_addr += ALIGN(hdr->recovery_dtbo_size, hdr->page_size);
+
+   *addr = dtb_img_addr;
}
 
-   /* Calculate the address of DTB area in boot image */
-   dtb_img_addr = hdr_addr;
-   dtb_img_addr += hdr->page_size;
-   dtb_img_addr += ALIGN(hdr->kernel_size, hdr->page_size);
-   dtb_img_addr += ALIGN(hdr->ramdisk_size, hdr->page_size);
-   dtb_img_addr += ALIGN(hdr->second_size, hdr->page_size);
-   dtb_img_addr += ALIGN(hdr->recovery_dtbo_size, hdr->page_size);
-
-   *addr = dtb_img_addr;
-
+   if (hdr->header_version > 2) {
+   v_hdr = map_sysmem(vhdr_addr, sizeof(*v_hdr));
+   if (!v_hdr->dtb_size) {
+   printf("Error: dtb_size is 0\n");
+   ret = false;
+   unmap_sysmem(v_hdr);
+   goto exit;
+   }
+   /* Calculate the address of DTB area in boot image */
+   dtb_img_addr = vhdr_addr;
+   dtb_img_addr += v_hdr->page_size;
+   if (v_hdr->vendor_ramdisk_size)
+   dtb_img_addr += ALIGN(v_hdr->vendor_ramdisk_size, 
v_hdr->page_size);
+   *addr = dtb_img_addr;
+   unmap_sysmem(v_hdr);
+   goto exit;
+   }
 exit:
unmap_sysmem(hdr);
return ret;
-- 
2.34.1



[PATCH v3 14/19] drivers: fastboot: zImage flashing is not supported for v3, v4

2023-02-05 Thread Safae Ouajih
With vendor boot image introduced in version 3 and 4 of boot
image header, boot information is located in both boot image
and vendor boot image.

Flashing zImage is not supported for version 3 and 4 since this
requires updating vendor boot image and/or generating a new image.

Print an error message when the boot image header version is
greater than 2.

Signed-off-by: Safae Ouajih 
---
 drivers/fastboot/fb_mmc.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/drivers/fastboot/fb_mmc.c b/drivers/fastboot/fb_mmc.c
index 086e5f7843..1dea82835c 100644
--- a/drivers/fastboot/fb_mmc.c
+++ b/drivers/fastboot/fb_mmc.c
@@ -370,6 +370,14 @@ static int fb_mmc_update_zimage(struct blk_desc *dev_desc,
return -1;
}
 
+   /* Check if boot image header version is 2 or less */
+   if (hdr->header_version > 2) {
+   pr_err("zImage flashing supported only for boot images v2 and 
less\n");
+   fastboot_fail("zImage flashing supported only for boot images 
v2 and less",
+ response);
+   return -EOPNOTSUPP;
+   }
+
/* Check if boot image has second stage in it (we don't support it) */
if (hdr->second_size > 0) {
pr_err("moving second stage is not supported yet\n");
-- 
2.34.1



[PATCH v3 11/19] android: boot: ramdisk: support vendor ramdisk

2023-02-05 Thread Safae Ouajih
Version 3 and 4 of boot image header introduced
vendor boot ramdisk: Please check include/android_image.h
for details.

The ramdisk is now split into a generic ramdisk in boot image
and a vendor ramdisk in vendor boot image.

Support the new vendor ramdisk.

Signed-off-by: Safae Ouajih 
Reviewed-by: Simon Glass 
---
 boot/image-android.c | 13 +++--
 include/image.h  |  4 ++--
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index 712d437766..35243fd5b1 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -25,6 +25,7 @@ static void android_boot_image_v3_v4_parse_hdr(const struct 
andr_boot_img_hdr_v3
 
data->kcmdline = hdr->cmdline;
data->header_version = hdr->header_version;
+   data->ramdisk_ptr = env_get_ulong("ramdisk_addr_r", 16, 0);
 
/*
 * The header takes a full page, the remaining components are aligned
@@ -322,10 +323,11 @@ ulong android_image_get_kcomp(const struct 
andr_boot_img_hdr_v0 *hdr,
return image_decomp_type(p, sizeof(u32));
 }
 
-int android_image_get_ramdisk(const struct andr_boot_img_hdr_v0 *hdr,
- const void *vendor_boot_img, ulong *rd_data, 
ulong *rd_len)
+int android_image_get_ramdisk(const void *hdr, const void *vendor_boot_img,
+ ulong *rd_data, ulong *rd_len)
 {
struct andr_image_data img_data = {0};
+   ulong ramdisk_ptr;
 
if (!android_image_get_data(hdr, vendor_boot_img, _data))
return -EINVAL;
@@ -334,6 +336,13 @@ int android_image_get_ramdisk(const struct 
andr_boot_img_hdr_v0 *hdr,
*rd_data = *rd_len = 0;
return -1;
}
+   if (img_data.header_version > 2) {
+   ramdisk_ptr = img_data.ramdisk_ptr;
+   memcpy((void *)(ramdisk_ptr), (void 
*)img_data.vendor_ramdisk_ptr,
+  img_data.vendor_ramdisk_size);
+   memcpy((void *)(ramdisk_ptr + img_data.vendor_ramdisk_size),
+  (void *)img_data.ramdisk_ptr, 
img_data.boot_ramdisk_size);
+   }
 
printf("RAM disk load addr 0x%08lx size %u KiB\n",
   img_data.ramdisk_ptr, DIV_ROUND_UP(img_data.ramdisk_size, 1024));
diff --git a/include/image.h b/include/image.h
index c2e751c136..c4d9b1c575 100644
--- a/include/image.h
+++ b/include/image.h
@@ -1782,8 +1782,8 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0 *hdr,
  * @rd_len:Pointer to a ulong variable, will hold ramdisk length
  * Return: 0 if succeeded, -1 if ramdisk size is 0
  */
-int android_image_get_ramdisk(const struct andr_boot_img_hdr_v0 *hdr,
- const void *vendor_boot_img, ulong *rd_data, 
ulong *rd_len);
+int android_image_get_ramdisk(const void *hdr, const void *vendor_boot_img,
+ ulong *rd_data, ulong *rd_len);
 
 /**
  * android_image_get_second() - Extracts the secondary bootloader address
-- 
2.34.1



[PATCH v3 09/19] android: boot: add vendor boot image to prepare for v3, v4 support

2023-02-05 Thread Safae Ouajih
Introduce vendor boot image for version 3 and 4 of boot image header.
The vendor boot image will hold extra information about kernel, dtb
and ramdisk.

This is done to prepare for boot image version 3 and 4 support.

Signed-off-by: Safae Ouajih 
---
 boot/bootm.c |  8 +++
 boot/image-android.c | 54 
 boot/image-board.c   |  3 +--
 boot/image-fdt.c |  3 ++-
 cmd/abootimg.c   |  4 ++--
 include/image.h  | 48 ++-
 6 files changed, 81 insertions(+), 39 deletions(-)

diff --git a/boot/bootm.c b/boot/bootm.c
index 15fce8ad95..a58e6f391e 100644
--- a/boot/bootm.c
+++ b/boot/bootm.c
@@ -182,11 +182,11 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, 
int argc,
 #ifdef CONFIG_ANDROID_BOOT_IMAGE
case IMAGE_FORMAT_ANDROID:
images.os.type = IH_TYPE_KERNEL;
-   images.os.comp = android_image_get_kcomp(os_hdr);
+   images.os.comp = android_image_get_kcomp(os_hdr, NULL);
images.os.os = IH_OS_LINUX;
 
-   images.os.end = android_image_get_end(os_hdr);
-   images.os.load = android_image_get_kload(os_hdr);
+   images.os.end = android_image_get_end(os_hdr, NULL);
+   images.os.load = android_image_get_kload(os_hdr, NULL);
images.ep = images.os.load;
ep_found = true;
break;
@@ -965,7 +965,7 @@ static const void *boot_get_kernel(struct cmd_tbl *cmdtp, 
int flag, int argc,
 #ifdef CONFIG_ANDROID_BOOT_IMAGE
case IMAGE_FORMAT_ANDROID:
printf("## Booting Android Image at 0x%08lx ...\n", img_addr);
-   if (android_image_get_kernel(buf, images->verify,
+   if (android_image_get_kernel(buf, NULL, images->verify,
 os_data, os_len))
return NULL;
break;
diff --git a/boot/image-android.c b/boot/image-android.c
index 748fd212ae..f16eebff49 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -66,7 +66,8 @@ static void android_boot_image_v0_v1_v2_parse_hdr(const 
struct andr_boot_img_hdr
data->boot_img_total_size = end - (ulong)hdr;
 }
 
-bool android_image_get_data(const void *boot_hdr, struct andr_image_data *data)
+bool android_image_get_data(const void *boot_hdr, const void *vendor_boot_hdr,
+   struct andr_image_data *data)
 {
if (!boot_hdr || !data) {
printf("boot_hdr or data params can't be NULL\n");
@@ -114,8 +115,10 @@ static ulong android_image_get_kernel_addr(struct 
andr_image_data *img_data)
 
 /**
  * android_image_get_kernel() - processes kernel part of Android boot images
- * @hdr:   Pointer to image header, which is at the start
+ * @hdr:   Pointer to boot image header, which is at the start
  * of the image.
+ * @vendor_boot_img:   Pointer to vendor boot image header, which is at the
+ * start of the image.
  * @verify:Checksum verification flag. Currently unimplemented.
  * @os_data:   Pointer to a ulong variable, will hold os data start
  * address.
@@ -127,14 +130,15 @@ static ulong android_image_get_kernel_addr(struct 
andr_image_data *img_data)
  * Return: Zero, os start address and length on success,
  * otherwise on failure.
  */
-int android_image_get_kernel(const struct andr_boot_img_hdr_v0 *hdr, int 
verify,
+int android_image_get_kernel(const struct andr_boot_img_hdr_v0 *hdr,
+const void *vendor_boot_img, int verify,
 ulong *os_data, ulong *os_len)
 {
struct andr_image_data img_data = {0};
u32 kernel_addr;
const struct legacy_img_hdr *ihdr;
 
-   if (!android_image_get_data(hdr, _data))
+   if (!android_image_get_data(hdr, vendor_boot_img, _data))
return -EINVAL;
 
kernel_addr = android_image_get_kernel_addr(_data);
@@ -201,11 +205,12 @@ bool is_android_boot_image_header(const struct 
andr_boot_img_hdr_v0 *hdr)
return !memcmp(ANDR_BOOT_MAGIC, hdr, ANDR_BOOT_MAGIC_SIZE);
 }
 
-ulong android_image_get_end(const struct andr_boot_img_hdr_v0 *hdr)
+ulong android_image_get_end(const struct andr_boot_img_hdr_v0 *hdr,
+   const void *vendor_boot_img)
 {
struct andr_image_data img_data;
 
-   if (!android_image_get_data(hdr, _data))
+   if (!android_image_get_data(hdr, vendor_boot_img, _data))
return -EINVAL;
 
if (img_data.header_version > 2)
@@ -214,22 +219,24 @@ ulong android_image_get_end(const struct 
andr_boot_img_hdr_v0 *hdr)
return img_data.boot_img_total_size;
 }
 
-ulong android_image_get_kload(const struct andr_boot_img_hdr_v0 *hdr)
+ulong android_image_get_kload(const struct andr_boot_img_hdr_v0 *hdr,
+

[PATCH v3 10/19] android: boot: update android_image_get_data to support v3, v4

2023-02-05 Thread Safae Ouajih
Since boot image header version 3 and 4 introduced vendor boot image,
use the following functions to fill the generic android
structure : andr_image_data:

 - android_boot_image_v3_v4_parse_hdr()
 - android_vendor_boot_image_v3_v4_parse_hdr()

Update android_image_get_data() to support v3 and v4

Signed-off-by: Safae Ouajih 
Reviewed-by: Simon Glass 
---
 boot/image-android.c| 80 +++--
 include/android_image.h |  3 ++
 include/image.h | 11 ++
 3 files changed, 91 insertions(+), 3 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index f16eebff49..712d437766 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -18,6 +18,65 @@
 
 static char andr_tmp_str[ANDR_BOOT_ARGS_SIZE + 1];
 
+static void android_boot_image_v3_v4_parse_hdr(const struct 
andr_boot_img_hdr_v3 *hdr,
+  struct andr_image_data *data)
+{
+   ulong end;
+
+   data->kcmdline = hdr->cmdline;
+   data->header_version = hdr->header_version;
+
+   /*
+* The header takes a full page, the remaining components are aligned
+* on page boundary.
+*/
+   end = (ulong)hdr;
+   end += ANDR_GKI_PAGE_SIZE;
+   data->kernel_ptr = end;
+   data->kernel_size = hdr->kernel_size;
+   end += ALIGN(hdr->kernel_size, ANDR_GKI_PAGE_SIZE);
+   data->ramdisk_size = hdr->ramdisk_size;
+   data->boot_ramdisk_size = hdr->ramdisk_size;
+   end += ALIGN(hdr->ramdisk_size, ANDR_GKI_PAGE_SIZE);
+
+   if (hdr->header_version > 3)
+   end += ALIGN(hdr->signature_size, ANDR_GKI_PAGE_SIZE);
+
+   data->boot_img_total_size = end - (ulong)hdr;
+}
+
+static void android_vendor_boot_image_v3_v4_parse_hdr(const struct 
andr_vnd_boot_img_hdr
+ *hdr, struct 
andr_image_data *data)
+{
+   ulong end;
+
+   /*
+* The header takes a full page, the remaining components are aligned
+* on page boundary.
+*/
+   data->tags_addr = hdr->tags_addr;
+   data->image_name = hdr->name;
+   data->kernel_addr = hdr->kernel_addr;
+   data->ramdisk_addr = hdr->ramdisk_addr;
+   data->dtb_load_addr = hdr->dtb_addr;
+   end = (ulong)hdr;
+   end += hdr->page_size;
+   if (hdr->vendor_ramdisk_size) {
+   data->vendor_ramdisk_ptr = end;
+   data->vendor_ramdisk_size = hdr->vendor_ramdisk_size;
+   data->ramdisk_size += hdr->vendor_ramdisk_size;
+   end += ALIGN(hdr->vendor_ramdisk_size, hdr->page_size);
+   }
+
+   data->dtb_ptr = end;
+   data->dtb_size = hdr->dtb_size;
+
+   end += ALIGN(hdr->dtb_size, hdr->page_size);
+   end += ALIGN(hdr->vendor_ramdisk_table_size, hdr->page_size);
+   end += ALIGN(hdr->bootconfig_size, hdr->page_size);
+   data->vendor_boot_img_total_size = end - (ulong)hdr;
+}
+
 static void android_boot_image_v0_v1_v2_parse_hdr(const struct 
andr_boot_img_hdr_v0 *hdr,
  struct andr_image_data *data)
 {
@@ -79,10 +138,20 @@ bool android_image_get_data(const void *boot_hdr, const 
void *vendor_boot_hdr,
return false;
}
 
-   if (((struct andr_boot_img_hdr_v0 *)boot_hdr)->header_version > 2)
-   printf("Only boot image header version 2 and below are 
supported\n");
-   else
+   if (((struct andr_boot_img_hdr_v0 *)boot_hdr)->header_version > 2) {
+   if (!vendor_boot_hdr) {
+   printf("For boot header v3+ vendor boot image has to be 
provided\n");
+   return false;
+   }
+   if (!is_android_vendor_boot_image_header(vendor_boot_hdr)) {
+   printf("Incorrect vendor boot image header\n");
+   return false;
+   }
+   android_boot_image_v3_v4_parse_hdr(boot_hdr, data);
+   android_vendor_boot_image_v3_v4_parse_hdr(vendor_boot_hdr, 
data);
+   } else {
android_boot_image_v0_v1_v2_parse_hdr(boot_hdr, data);
+   }
 
return true;
 }
@@ -200,6 +269,11 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0 *hdr,
return 0;
 }
 
+bool is_android_vendor_boot_image_header(const void *vendor_boot_img)
+{
+   return !memcmp(VENDOR_BOOT_MAGIC, vendor_boot_img, 
ANDR_VENDOR_BOOT_MAGIC_SIZE);
+}
+
 bool is_android_boot_image_header(const struct andr_boot_img_hdr_v0 *hdr)
 {
return !memcmp(ANDR_BOOT_MAGIC, hdr, ANDR_BOOT_MAGIC_SIZE);
diff --git a/include/android_image.h b/include/android_image.h
index fb3a9d9858..99e7803508 100644
--- a/include/android_image.h
+++ b/include/android_image.h
@@ -323,6 +323,8 @@

[PATCH v3 08/19] android: boot: boot image header v3, v4 do not support recovery DTBO

2023-02-05 Thread Safae Ouajih
android_image_get_dtbo() is used to get recovery DTBO via abootimg cmd.
This is not supported in boot image header v3 and v4. Thus, print an
error message when v1,v2 header version are not used.

Signed-off-by: Safae Ouajih 
Reviewed-by: Simon Glass 
Reviewed-by: Mattijs Korpershoek 
---
 boot/image-android.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index 31a5d30162..748fd212ae 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -316,8 +316,8 @@ bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, 
u32 *size)
goto exit;
}
 
-   if (hdr->header_version < 1) {
-   printf("Error: header_version must be >= 1 to get dtbo\n");
+   if (hdr->header_version != 1 && hdr->header_version != 2) {
+   printf("Error: header version must be >= 1 and <= 2 to get 
dtbo\n");
ret = false;
goto exit;
}
-- 
2.34.1



[PATCH v3 07/19] android: boot: content print is not supported for v3, v4 header version

2023-02-05 Thread Safae Ouajih
Content print is not supported for version 3 and 4 of boot image header.
Thus, only print that content when v2 is used.

Update android_print_contents() to print an error message
when trying to print boot image header version 3 or 4 content.

Signed-off-by: Safae Ouajih 
Reviewed-by: Simon Glass 
Reviewed-by: Mattijs Korpershoek 
---
 boot/image-android.c | 6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index 15a735e230..31a5d30162 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -477,6 +477,10 @@ bool android_image_get_dtb_by_index(ulong hdr_addr, u32 
index, ulong *addr,
  */
 void android_print_contents(const struct andr_boot_img_hdr_v0 *hdr)
 {
+   if (hdr->header_version >= 3) {
+   printf("Content print is not supported for boot image header 
version > 2");
+   return;
+   }
const char * const p = IMAGE_INDENT_STRING;
/* os_version = ver << 11 | lvl */
u32 os_ver = hdr->os_version >> 11;
@@ -509,7 +513,7 @@ void android_print_contents(const struct 
andr_boot_img_hdr_v0 *hdr)
   hdr->header_size);
}
 
-   if (hdr->header_version >= 2) {
+   if (hdr->header_version == 2) {
printf("%sdtb size: %x\n", p, hdr->dtb_size);
printf("%sdtb addr: %llx\n", p, hdr->dtb_addr);
}
-- 
2.34.1



[PATCH v3 06/19] android: boot: move to andr_image_data structure

2023-02-05 Thread Safae Ouajih
Move from andr_boot_img_hdr_v0 to andr_image_data
structure to prepare for boot image header
version 3 and 4.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c | 121 +++
 cmd/abootimg.c   |  31 +--
 2 files changed, 81 insertions(+), 71 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index ea05c1814f..15a735e230 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -86,7 +86,7 @@ bool android_image_get_data(const void *boot_hdr, struct 
andr_image_data *data)
return true;
 }
 
-static ulong android_image_get_kernel_addr(const struct andr_boot_img_hdr_v0 
*hdr)
+static ulong android_image_get_kernel_addr(struct andr_image_data *img_data)
 {
/*
 * All the Android tools that generate a boot.img use this
@@ -99,17 +99,17 @@ static ulong android_image_get_kernel_addr(const struct 
andr_boot_img_hdr_v0 *hd
 *
 * Otherwise, we will return the actual value set by the user.
 */
-   if (hdr->kernel_addr == ANDROID_IMAGE_DEFAULT_KERNEL_ADDR)
-   return (ulong)hdr + hdr->page_size;
+   if (img_data->kernel_addr  == ANDROID_IMAGE_DEFAULT_KERNEL_ADDR)
+   return img_data->kernel_ptr;
 
/*
 * abootimg creates images where all load addresses are 0
 * and we need to fix them.
 */
-   if (hdr->kernel_addr == 0 && hdr->ramdisk_addr == 0)
+   if (img_data->kernel_addr == 0 && img_data->ramdisk_addr == 0)
return env_get_ulong("kernel_addr_r", 16, 0);
 
-   return hdr->kernel_addr;
+   return img_data->kernel_addr;
 }
 
 /**
@@ -130,27 +130,33 @@ static ulong android_image_get_kernel_addr(const struct 
andr_boot_img_hdr_v0 *hd
 int android_image_get_kernel(const struct andr_boot_img_hdr_v0 *hdr, int 
verify,
 ulong *os_data, ulong *os_len)
 {
-   u32 kernel_addr = android_image_get_kernel_addr(hdr);
-   const struct legacy_img_hdr *ihdr = (const struct legacy_img_hdr *)
-   ((uintptr_t)hdr + hdr->page_size);
+   struct andr_image_data img_data = {0};
+   u32 kernel_addr;
+   const struct legacy_img_hdr *ihdr;
+
+   if (!android_image_get_data(hdr, _data))
+   return -EINVAL;
+
+   kernel_addr = android_image_get_kernel_addr(_data);
+   ihdr = (const struct legacy_img_hdr *)img_data.kernel_ptr;
 
/*
 * Not all Android tools use the id field for signing the image with
 * sha1 (or anything) so we don't check it. It is not obvious that the
 * string is null terminated so we take care of this.
 */
-   strncpy(andr_tmp_str, hdr->name, ANDR_BOOT_NAME_SIZE);
+   strlcpy(andr_tmp_str, img_data.image_name, ANDR_BOOT_NAME_SIZE);
andr_tmp_str[ANDR_BOOT_NAME_SIZE] = '\0';
if (strlen(andr_tmp_str))
printf("Android's image name: %s\n", andr_tmp_str);
 
printf("Kernel load addr 0x%08x size %u KiB\n",
-  kernel_addr, DIV_ROUND_UP(hdr->kernel_size, 1024));
+  kernel_addr, DIV_ROUND_UP(img_data.kernel_size, 1024));
 
int len = 0;
-   if (*hdr->cmdline) {
-   printf("Kernel command line: %s\n", hdr->cmdline);
-   len += strlen(hdr->cmdline);
+   if (*img_data.kcmdline) {
+   printf("Kernel command line: %s\n", img_data.kcmdline);
+   len += strlen(img_data.kcmdline);
}
 
char *bootargs = env_get("bootargs");
@@ -168,8 +174,9 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0 *hdr, int verify,
strcpy(newbootargs, bootargs);
strcat(newbootargs, " ");
}
-   if (*hdr->cmdline)
-   strcat(newbootargs, hdr->cmdline);
+
+   if (*img_data.kcmdline)
+   strcat(newbootargs, img_data.kcmdline);
 
env_set("bootargs", newbootargs);
 
@@ -177,15 +184,14 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0 *hdr, int verify,
if (image_get_magic(ihdr) == IH_MAGIC) {
*os_data = image_get_data(ihdr);
} else {
-   *os_data = (ulong)hdr;
-   *os_data += hdr->page_size;
+   *os_data = img_data.kernel_ptr;
}
}
if (os_len) {
if (image_get_magic(ihdr) == IH_MAGIC)
*os_len = image_get_data_size(ihdr);
else
-   *os_len = hdr->kernel_size;
+   *os_len = img_data.kernel_size;
}
return 0;
 }
@@ -197,30 +203,25 @@ bool is_android_boot_image_header(const struct 
andr_boot_img_hdr_v0 *hdr)
 
 ulong android_image_get_end(const struct andr_boot_i

[PATCH v3 05/19] android: boot: kcomp: support andr_image_data

2023-02-05 Thread Safae Ouajih
andr_image_data structure is used as a global representation of
boot image header structure. Introduce this new structure to
support all boot header versions : v0,v1.v2.v3.v4 and to support
v3 and v4 while maitaining support for v0,v1,v2.
The need of using andr_image_data comes from the change of header
structure in both version 3 and 4.

Rework android_image_get_kcomp()  to support this new struct.

Signed-off-by: Safae Ouajih 
Reviewed-by: Simon Glass 
Reviewed-by: Mattijs Korpershoek 
---
 boot/image-android.c| 75 -
 include/android_image.h | 27 +++
 include/image.h | 12 +++
 3 files changed, 113 insertions(+), 1 deletion(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index ac7cb479c1..ea05c1814f 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -18,6 +18,74 @@
 
 static char andr_tmp_str[ANDR_BOOT_ARGS_SIZE + 1];
 
+static void android_boot_image_v0_v1_v2_parse_hdr(const struct 
andr_boot_img_hdr_v0 *hdr,
+ struct andr_image_data *data)
+{
+   ulong end;
+
+   data->image_name = hdr->name;
+   data->kcmdline = hdr->cmdline;
+   data->kernel_addr = hdr->kernel_addr;
+   data->ramdisk_addr = hdr->ramdisk_addr;
+   data->header_version = hdr->header_version;
+   data->dtb_load_addr = hdr->dtb_addr;
+
+   end = (ulong)hdr;
+
+   /*
+* The header takes a full page, the remaining components are aligned
+* on page boundary
+*/
+
+   end += hdr->page_size;
+
+   data->kernel_ptr = end;
+   data->kernel_size = hdr->kernel_size;
+   end += ALIGN(hdr->kernel_size, hdr->page_size);
+
+   data->ramdisk_ptr = end;
+   data->ramdisk_size = hdr->ramdisk_size;
+   end += ALIGN(hdr->ramdisk_size, hdr->page_size);
+
+   data->second_ptr = end;
+   data->second_size = hdr->second_size;
+   end += ALIGN(hdr->second_size, hdr->page_size);
+
+   if (hdr->header_version >= 1) {
+   data->recovery_dtbo_ptr = end;
+   data->recovery_dtbo_size = hdr->recovery_dtbo_size;
+   end += ALIGN(hdr->recovery_dtbo_size, hdr->page_size);
+   }
+
+   if (hdr->header_version >= 2) {
+   data->dtb_ptr = end;
+   data->dtb_size = hdr->dtb_size;
+   end += ALIGN(hdr->dtb_size, hdr->page_size);
+   }
+
+   data->boot_img_total_size = end - (ulong)hdr;
+}
+
+bool android_image_get_data(const void *boot_hdr, struct andr_image_data *data)
+{
+   if (!boot_hdr || !data) {
+   printf("boot_hdr or data params can't be NULL\n");
+   return false;
+   }
+
+   if (!is_android_boot_image_header(boot_hdr)) {
+   printf("Incorrect boot image header\n");
+   return false;
+   }
+
+   if (((struct andr_boot_img_hdr_v0 *)boot_hdr)->header_version > 2)
+   printf("Only boot image header version 2 and below are 
supported\n");
+   else
+   android_boot_image_v0_v1_v2_parse_hdr(boot_hdr, data);
+
+   return true;
+}
+
 static ulong android_image_get_kernel_addr(const struct andr_boot_img_hdr_v0 
*hdr)
 {
/*
@@ -157,8 +225,13 @@ ulong android_image_get_kload(const struct 
andr_boot_img_hdr_v0 *hdr)
 
 ulong android_image_get_kcomp(const struct andr_boot_img_hdr_v0 *hdr)
 {
-   const void *p = (void *)((uintptr_t)hdr + hdr->page_size);
+   struct andr_image_data img_data;
+   const void *p;
+
+   if (!android_image_get_data(hdr, _data))
+   return -EINVAL;
 
+   p = (const void *)img_data.kernel_ptr;
if (image_get_magic((struct legacy_img_hdr *)p) == IH_MAGIC)
return image_get_comp((struct legacy_img_hdr *)p);
else if (get_unaligned_le32(p) == LZ4F_MAGIC)
diff --git a/include/android_image.h b/include/android_image.h
index f054363001..fb3a9d9858 100644
--- a/include/android_image.h
+++ b/include/android_image.h
@@ -317,4 +317,31 @@ struct andr_boot_img_hdr_v0 {
  *contained outside boot and vendor boot partitions), otherwise
  *jump to kernel_addr
  */
+
+/* Private struct */
+struct andr_image_data {
+   ulong kernel_ptr;  /* kernel address */
+   u32 kernel_size;  /* size in bytes */
+   u32 ramdisk_size;  /* size in bytes */
+   u32 boot_ramdisk_size;  /* size in bytes */
+   ulong second_ptr;  /* secondary bootloader address */
+   u32 second_size;  /* secondary bootloader size */
+   ulong dtb_ptr;  /* address of dtb image */
+   u32 dtb_size;  /* size of dtb image */
+   ulong recovery_dtbo_ptr;  /* size in bytes for recovery DTBO/ACPIO 
image */
+   u32 recovery_dtbo_size;  /* offset to recovery dtbo/acpio in boot image 
*/
+
+   const char *

[PATCH v3 04/19] android: boot: add boot image header v3 and v4 structures

2023-02-05 Thread Safae Ouajih
Add support for v3/v4 boot image format by adding
the following structures:

- andr_boot_img_hdr_v3 : describes boot image header
- andr_vnd_boot_img_hdr : describes vendor boot image header

These definitions have been copied over from the AOSP documentation at
[1] and [2]

Boot arg sizes are taken from [3]:
commit: 35fb6262bc3f (ANDROID: Support for vendor boot)

This also adds documentation for boot image header v3/v4 structure
that was imported from [4], file: include/bootimg/bootimg.h
commit: 8d0922bfb932 (Adding GKI signature in boot.img v4)

Link:[1] 
https://source.android.com/docs/core/architecture/bootloader/boot-image-header
Link:[2] 
https://source.android.com/docs/core/architecture/bootloader/partitions/vendor-boot-partitions#vendor-boot-header
Link:[3] https://android.googlesource.com/platform/external/u-boot
Link:[4] https://android.googlesource.com/platform/system/tools/mkbootimg

Signed-off-by: Safae Ouajih 
Reviewed-by: Simon Glass 
Reviewed-by: Mattijs Korpershoek 
---
 include/android_image.h | 183 +++-
 1 file changed, 182 insertions(+), 1 deletion(-)

diff --git a/include/android_image.h b/include/android_image.h
index 2bdcab9122..f054363001 100644
--- a/include/android_image.h
+++ b/include/android_image.h
@@ -3,7 +3,7 @@
  * This is from the Android Project,
  * Repository: https://android.googlesource.com/platform/system/tools/mkbootimg
  * File: include/bootimg/bootimg.h
- * Commit: e55998a0f2b61b685d5eb4a486ca3a0c680b1a2f
+ * Commit: cce5b1923e3cd2fcb765b512610bdc5c42bc501d
  *
  * Copyright (C) 2007 The Android Open Source Project
  */
@@ -14,11 +14,58 @@
 #include 
 #include 
 
+#define ANDR_GKI_PAGE_SIZE 4096
 #define ANDR_BOOT_MAGIC "ANDROID!"
 #define ANDR_BOOT_MAGIC_SIZE 8
 #define ANDR_BOOT_NAME_SIZE 16
 #define ANDR_BOOT_ARGS_SIZE 512
 #define ANDR_BOOT_EXTRA_ARGS_SIZE 1024
+#define VENDOR_BOOT_MAGIC "VNDRBOOT"
+#define ANDR_VENDOR_BOOT_MAGIC_SIZE 8
+#define ANDR_VENDOR_BOOT_ARGS_SIZE 2048
+#define ANDR_VENDOR_BOOT_NAME_SIZE 16
+
+struct andr_boot_img_hdr_v3 {
+   u8 magic[ANDR_BOOT_MAGIC_SIZE];
+
+   u32 kernel_size;/* size in bytes */
+   u32 ramdisk_size;   /* size in bytes */
+
+   u32 os_version;
+
+   u32 header_size;/* size of boot image header in bytes */
+   u32 reserved[4];
+   u32 header_version; /* offset remains constant for version check */
+
+   u8 cmdline[ANDR_BOOT_ARGS_SIZE + ANDR_BOOT_EXTRA_ARGS_SIZE];
+   /* for boot image header v4 only */
+   u32 signature_size; /* size in bytes */
+};
+
+struct andr_vnd_boot_img_hdr {
+   u8 magic[ANDR_VENDOR_BOOT_MAGIC_SIZE];
+   u32 header_version;
+   u32 page_size;   /* flash page size we assume */
+
+   u32 kernel_addr; /* physical load addr */
+   u32 ramdisk_addr;/* physical load addr */
+
+   u32 vendor_ramdisk_size; /* size in bytes */
+
+   u8 cmdline[ANDR_VENDOR_BOOT_ARGS_SIZE];
+
+   u32 tags_addr;   /* physical addr for kernel tags */
+
+   u8 name[ANDR_VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */
+   u32 header_size; /* size of vendor boot image header in bytes */
+   u32 dtb_size;/* size of dtb image */
+   u64 dtb_addr;/* physical load address */
+   /* for boot image header v4 only */
+   u32 vendor_ramdisk_table_size; /* size in bytes for the vendor ramdisk 
table */
+   u32 vendor_ramdisk_table_entry_num; /* number of entries in the vendor 
ramdisk table */
+   u32 vendor_ramdisk_table_entry_size; /* size in bytes for a vendor 
ramdisk table entry */
+   u32 bootconfig_size; /* size in bytes for the bootconfig section */
+};
 
 /* The bootloader expects the structure of andr_boot_img_hdr_v0 with header
  * version 0 to be as follows: */
@@ -136,4 +183,138 @@ struct andr_boot_img_hdr_v0 {
  *else: jump to kernel_addr
  */
 
+/* When the boot image header has a version of 3, the structure of the boot
+ * image is as follows:
+ *
+ * +-+
+ * | boot header | 4096 bytes
+ * +-+
+ * | kernel  | m pages
+ * +-+
+ * | ramdisk | n pages
+ * +-+
+ *
+ * m = (kernel_size + 4096 - 1) / 4096
+ * n = (ramdisk_size + 4096 - 1) / 4096
+ *
+ * Note that in version 3 of the boot image header, page size is fixed at 4096 
bytes.
+ *
+ * The structure of the vendor boot image (introduced with version 3 and
+ * required to be present when a v3 boot image is used) is as follows:
+ *
+ * +-+
+ * | vendor boot header  | o pages
+ * +-+
+ * | vendor ramdisk  | p pages
+ * +-+
+ * | dtb | q pages
+ * +-+
+ * o = (2112 + page_size - 1) / page_size
+ * p = (vendor_ramdisk_size + page_size - 1) / page_size
+ * q = (dtb_size + page_size - 1) / page_size
+ *
+ * 0. all entiti

[PATCH v3 02/19] android: boot: support vendor boot image in abootimg

2023-02-05 Thread Safae Ouajih
Vendor boot image is introduced in boot image header
version 3 and 4. Please check [1] for more details.

To prepare for boot image v3/v4 support, allow the abootimg command
to store the vendor_boot image address.

Full support for this new format will be done in a future patch.

Link:[1] 
https://source.android.com/docs/core/architecture/bootloader/partitions/vendor-boot-partitions

Signed-off-by: Safae Ouajih 
Reviewed-by: Simon Glass 
Reviewed-by: Mattijs Korpershoek 
---
 cmd/abootimg.c | 18 +++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/cmd/abootimg.c b/cmd/abootimg.c
index 0262adb1e5..026c03f91c 100644
--- a/cmd/abootimg.c
+++ b/cmd/abootimg.c
@@ -15,6 +15,7 @@
 
 /* Please use abootimg_addr() macro to obtain the boot image address */
 static ulong _abootimg_addr = -1;
+static ulong _avendor_bootimg_addr = -1;
 
 static int abootimg_get_ver(int argc, char *const argv[])
 {
@@ -158,7 +159,7 @@ static int do_abootimg_addr(struct cmd_tbl *cmdtp, int 
flag, int argc,
char *endp;
ulong img_addr;
 
-   if (argc != 2)
+   if (argc < 2 || argc > 3)
return CMD_RET_USAGE;
 
img_addr = hextoul(argv[1], );
@@ -168,6 +169,17 @@ static int do_abootimg_addr(struct cmd_tbl *cmdtp, int 
flag, int argc,
}
 
_abootimg_addr = img_addr;
+
+   if (argc == 3) {
+   img_addr = simple_strtoul(argv[2], , 16);
+   if (*endp != '\0') {
+   printf("Error: Wrong vendor image address\n");
+   return CMD_RET_FAILURE;
+   }
+
+   _avendor_bootimg_addr = img_addr;
+   }
+
return CMD_RET_SUCCESS;
 }
 
@@ -211,7 +223,7 @@ static int do_abootimg_dump(struct cmd_tbl *cmdtp, int 
flag, int argc,
 }
 
 static struct cmd_tbl cmd_abootimg_sub[] = {
-   U_BOOT_CMD_MKENT(addr, 2, 1, do_abootimg_addr, "", ""),
+   U_BOOT_CMD_MKENT(addr, 3, 1, do_abootimg_addr, "", ""),
U_BOOT_CMD_MKENT(dump, 2, 1, do_abootimg_dump, "", ""),
U_BOOT_CMD_MKENT(get, 5, 1, do_abootimg_get, "", ""),
 };
@@ -239,7 +251,7 @@ static int do_abootimg(struct cmd_tbl *cmdtp, int flag, int 
argc,
 U_BOOT_CMD(
abootimg, CONFIG_SYS_MAXARGS, 0, do_abootimg,
"manipulate Android Boot Image",
-   "addr \n"
+   "addr  []>\n"
"- set the address in RAM where boot image is located\n"
"  ($loadaddr is used by default)\n"
"abootimg dump dtb\n"
-- 
2.34.1



[PATCH v3 03/19] android: boot: replace android_image_check_header

2023-02-05 Thread Safae Ouajih
With the new vendor boot image introduced in versions 3 and 4
of boot image header, the header check must be done for both boot
image and vendor boot image. Thus, replace android_image_check_header()
by is_android_boot_image_header() to only refer to boot image header check.

Signed-off-by: Safae Ouajih 
Reviewed-by: Simon Glass 
Reviewed-by: Mattijs Korpershoek 
---
 boot/image-android.c  | 17 -
 boot/image-board.c|  2 +-
 cmd/abootimg.c|  4 ++--
 drivers/fastboot/fb_mmc.c |  3 +--
 include/image.h   | 22 +++---
 5 files changed, 19 insertions(+), 29 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index b070974791..ac7cb479c1 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -122,18 +122,9 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0 *hdr, int verify,
return 0;
 }
 
-/**
- * android_image_check_header() - Check the magic of boot image
- *
- * This checks the header of Android boot image and verifies the
- * magic is "ANDROID!"
- *
- * @hdr: Pointer to boot image
- * Return: 0 if the magic is correct, non-zero if there is a magic mismatch
- */
-int android_image_check_header(const struct andr_boot_img_hdr_v0 *hdr)
+bool is_android_boot_image_header(const struct andr_boot_img_hdr_v0 *hdr)
 {
-   return memcmp(ANDR_BOOT_MAGIC, hdr->magic, ANDR_BOOT_MAGIC_SIZE);
+   return !memcmp(ANDR_BOOT_MAGIC, hdr, ANDR_BOOT_MAGIC_SIZE);
 }
 
 ulong android_image_get_end(const struct andr_boot_img_hdr_v0 *hdr)
@@ -240,7 +231,7 @@ bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, 
u32 *size)
bool ret = true;
 
hdr = map_sysmem(hdr_addr, sizeof(*hdr));
-   if (android_image_check_header(hdr)) {
+   if (!is_android_boot_image_header(hdr)) {
printf("Error: Boot Image header is incorrect\n");
ret = false;
goto exit;
@@ -289,7 +280,7 @@ static bool android_image_get_dtb_img_addr(ulong hdr_addr, 
ulong *addr)
bool ret = true;
 
hdr = map_sysmem(hdr_addr, sizeof(*hdr));
-   if (android_image_check_header(hdr)) {
+   if (!is_android_boot_image_header(hdr)) {
printf("Error: Boot Image header is incorrect\n");
ret = false;
goto exit;
diff --git a/boot/image-board.c b/boot/image-board.c
index e5d71a3d54..9295b6d0c8 100644
--- a/boot/image-board.c
+++ b/boot/image-board.c
@@ -284,7 +284,7 @@ int genimg_get_format(const void *img_addr)
return IMAGE_FORMAT_FIT;
}
if (IS_ENABLED(CONFIG_ANDROID_BOOT_IMAGE) &&
-   !android_image_check_header(img_addr))
+   is_android_boot_image_header(img_addr))
return IMAGE_FORMAT_ANDROID;
 
return IMAGE_FORMAT_INVALID;
diff --git a/cmd/abootimg.c b/cmd/abootimg.c
index 026c03f91c..b5cfb141ef 100644
--- a/cmd/abootimg.c
+++ b/cmd/abootimg.c
@@ -26,7 +26,7 @@ static int abootimg_get_ver(int argc, char *const argv[])
return CMD_RET_USAGE;
 
hdr = map_sysmem(abootimg_addr(), sizeof(*hdr));
-   if (android_image_check_header(hdr)) {
+   if (!is_android_boot_image_header(hdr)) {
printf("Error: Boot Image header is incorrect\n");
res = CMD_RET_FAILURE;
goto exit;
@@ -73,7 +73,7 @@ static int abootimg_get_dtb_load_addr(int argc, char *const 
argv[])
return CMD_RET_USAGE;
 
hdr = map_sysmem(abootimg_addr(), sizeof(*hdr));
-   if (android_image_check_header(hdr)) {
+   if (!is_android_boot_image_header(hdr)) {
printf("Error: Boot Image header is incorrect\n");
res = CMD_RET_FAILURE;
goto exit;
diff --git a/drivers/fastboot/fb_mmc.c b/drivers/fastboot/fb_mmc.c
index 6d0112fdf4..086e5f7843 100644
--- a/drivers/fastboot/fb_mmc.c
+++ b/drivers/fastboot/fb_mmc.c
@@ -313,8 +313,7 @@ static lbaint_t fb_mmc_get_boot_header(struct blk_desc 
*dev_desc,
}
 
/* Check boot header magic string */
-   res = android_image_check_header(hdr);
-   if (res != 0) {
+   if (!is_android_boot_image_header(hdr)) {
pr_err("bad boot image magic\n");
fastboot_fail("boot partition not initialized", response);
return 0;
diff --git a/include/image.h b/include/image.h
index 735484117d..6e67cf4817 100644
--- a/include/image.h
+++ b/include/image.h
@@ -1736,17 +1736,6 @@ struct cipher_algo *image_get_cipher_algo(const char 
*full_name);
 
 struct andr_boot_img_hdr_v0;
 
-/**
- * android_image_check_header() - Check the magic of boot image
- *
- * This checks the header of Android boot image and verifies the
- * magic is "ANDROID!"
- *
- * @hdr: Pointer to image header
- * Return: 0 if the magic is correct, non-zero if there is a

[PATCH v3 01/19] android: boot: rename andr_img_hdr -> andr_boot_img_hdr_v0

2023-02-05 Thread Safae Ouajih
Android introduced boot header version 3 or 4.
The header structure change with version 3 and 4 to support
the new updates such as:
- Introducing Vendor boot image: with a vendor ramdisk
- Bootconfig feature (v4)

Change andr_img_hdr struct name to maintain support for version v0,
v1 and v2 while introducing version 3 and 4.

Signed-off-by: Safae Ouajih 
Reviewed-by: Simon Glass 
Reviewed-by: Mattijs Korpershoek 
---
 boot/image-android.c  |  37 -
 boot/image-fdt.c  |   2 +-
 cmd/abootimg.c|   4 +-
 drivers/fastboot/fb_mmc.c |   8 +--
 include/android_image.h   |   4 +-
 include/image.h   | 107 ++
 6 files changed, 129 insertions(+), 33 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index 2628db3741..b070974791 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -18,7 +18,7 @@
 
 static char andr_tmp_str[ANDR_BOOT_ARGS_SIZE + 1];
 
-static ulong android_image_get_kernel_addr(const struct andr_img_hdr *hdr)
+static ulong android_image_get_kernel_addr(const struct andr_boot_img_hdr_v0 
*hdr)
 {
/*
 * All the Android tools that generate a boot.img use this
@@ -59,7 +59,7 @@ static ulong android_image_get_kernel_addr(const struct 
andr_img_hdr *hdr)
  * Return: Zero, os start address and length on success,
  * otherwise on failure.
  */
-int android_image_get_kernel(const struct andr_img_hdr *hdr, int verify,
+int android_image_get_kernel(const struct andr_boot_img_hdr_v0 *hdr, int 
verify,
 ulong *os_data, ulong *os_len)
 {
u32 kernel_addr = android_image_get_kernel_addr(hdr);
@@ -122,12 +122,21 @@ int android_image_get_kernel(const struct andr_img_hdr 
*hdr, int verify,
return 0;
 }
 
-int android_image_check_header(const struct andr_img_hdr *hdr)
+/**
+ * android_image_check_header() - Check the magic of boot image
+ *
+ * This checks the header of Android boot image and verifies the
+ * magic is "ANDROID!"
+ *
+ * @hdr: Pointer to boot image
+ * Return: 0 if the magic is correct, non-zero if there is a magic mismatch
+ */
+int android_image_check_header(const struct andr_boot_img_hdr_v0 *hdr)
 {
return memcmp(ANDR_BOOT_MAGIC, hdr->magic, ANDR_BOOT_MAGIC_SIZE);
 }
 
-ulong android_image_get_end(const struct andr_img_hdr *hdr)
+ulong android_image_get_end(const struct andr_boot_img_hdr_v0 *hdr)
 {
ulong end;
 
@@ -150,12 +159,12 @@ ulong android_image_get_end(const struct andr_img_hdr 
*hdr)
return end;
 }
 
-ulong android_image_get_kload(const struct andr_img_hdr *hdr)
+ulong android_image_get_kload(const struct andr_boot_img_hdr_v0 *hdr)
 {
return android_image_get_kernel_addr(hdr);
 }
 
-ulong android_image_get_kcomp(const struct andr_img_hdr *hdr)
+ulong android_image_get_kcomp(const struct andr_boot_img_hdr_v0 *hdr)
 {
const void *p = (void *)((uintptr_t)hdr + hdr->page_size);
 
@@ -167,7 +176,7 @@ ulong android_image_get_kcomp(const struct andr_img_hdr 
*hdr)
return image_decomp_type(p, sizeof(u32));
 }
 
-int android_image_get_ramdisk(const struct andr_img_hdr *hdr,
+int android_image_get_ramdisk(const struct andr_boot_img_hdr_v0 *hdr,
  ulong *rd_data, ulong *rd_len)
 {
if (!hdr->ramdisk_size) {
@@ -186,8 +195,8 @@ int android_image_get_ramdisk(const struct andr_img_hdr 
*hdr,
return 0;
 }
 
-int android_image_get_second(const struct andr_img_hdr *hdr,
- ulong *second_data, ulong *second_len)
+int android_image_get_second(const struct andr_boot_img_hdr_v0 *hdr,
+ulong *second_data, ulong *second_len)
 {
if (!hdr->second_size) {
*second_data = *second_len = 0;
@@ -226,7 +235,7 @@ int android_image_get_second(const struct andr_img_hdr *hdr,
  */
 bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, u32 *size)
 {
-   const struct andr_img_hdr *hdr;
+   const struct andr_boot_img_hdr_v0 *hdr;
ulong dtbo_img_addr;
bool ret = true;
 
@@ -275,7 +284,7 @@ exit:
  */
 static bool android_image_get_dtb_img_addr(ulong hdr_addr, ulong *addr)
 {
-   const struct andr_img_hdr *hdr;
+   const struct andr_boot_img_hdr_v0 *hdr;
ulong dtb_img_addr;
bool ret = true;
 
@@ -328,7 +337,7 @@ exit:
 bool android_image_get_dtb_by_index(ulong hdr_addr, u32 index, ulong *addr,
u32 *size)
 {
-   const struct andr_img_hdr *hdr;
+   const struct andr_boot_img_hdr_v0 *hdr;
bool res;
ulong dtb_img_addr; /* address of DTB part in boot image */
u32 dtb_img_size;   /* size of DTB payload in boot image */
@@ -393,7 +402,7 @@ bool android_image_get_dtb_by_index(ulong hdr_addr, u32 
index, ulong *addr,
  * returns:
  * no returned results
  */
-void android_print_contents(const struct andr_img_hdr *hdr)
+void android_print

[PATCH v3 00/19] Support android boot image v3/v4

2023-02-05 Thread Safae Ouajih
Hello everyone,

* This is based on Roman Stratiienko's work to support boot image header 
version 3 and 4.

* This supports the new boot image headers v3, v4 and bootconfig feature.
https://source.android.com/docs/core/architecture/bootloader/boot-image-header
https://source.android.com/docs/core/architecture/bootloader/implementing-bootconfig

- Tested on Amlogic Khadas vim3l, a reference board for Android Open Source 
Project
  https://www.khadas.com/vim3l

  And on AM625 Texas Instruments board with 5.10 linux kernel

Main changes :
- New partition : vendor boot, with a specific vendor ramdisk
- DTB is stored in the vendor boot partition
- The generic ramdisk is placed after the vendor ramdisk
- Bootconfig feature support


Here is a link to see the related android boot flow changes on KHADAS vim3l as 
an example:
https://gitlab.baylibre.com/baylibre/amlogic/atv/u-boot/-/commits/souajih/BootImagev4/

Changes in v3:
- Ddd documentation for v3,v4 boot image header
- Add mkbootimg tool to Dockerfile
- Add full comments for functions/structs in include/image.h and 
include/android_image.h
- Add map_sysmem() to make the boot work on Sandbox
- Rename andr_vendor_img_hdr -> andr_vnd_boot_img_hdr

Changes in v2:
- Rework parts of the code to fix the abootimg test: test_abootimg
- Update test_abootimg to support boot image header v4
- Remove LIBXBC library, import and adapt the functions to support bootconfig 
feature
- Rename the used structures :
andr_boot_img_hdr_v0_v1_v2 -> andr_boot_img_hdr_v0
andr_boot_img_hdr_v3_v4 -> andr_boot_img_hdr_v3
andr_vendor_boot_img_hdr_v3_v4 -> andr_vendor_img_hdr

Safae Ouajih (19):
  android: boot: rename andr_img_hdr -> andr_boot_img_hdr_v0
  android: boot: support vendor boot image in abootimg
  android: boot: replace android_image_check_header
  android: boot: add boot image header v3 and v4 structures
  android: boot: kcomp: support andr_image_data
  android: boot: move to andr_image_data structure
  android: boot: content print is not supported for v3,v4 header version
  android: boot: boot image header v3,v4 do not support recovery DTBO
  android: boot: add vendor boot image to prepare for v3,v4 support
  android: boot: update android_image_get_data to support v3,v4
  android: boot: ramdisk: support vendor ramdisk
  android: boot: support extra command line
  android: boot: update android_image_get_dtb_img_addr to support v3,v4
  drivers: fastboot: zImage flashing is not supported for v3,v4
  android: boot: support boot image header version 3 and 4
  android: boot: support bootconfig
  doc: android: add documentation for v3,v4 boot image header
  test/py: android: extend abootimg test
  Dockerfile: add mkbootimg tool

 boot/bootm.c|  37 +-
 boot/image-android.c| 461 
 boot/image-board.c  |  19 +-
 boot/image-fdt.c|   5 +-
 cmd/abootimg.c  |  75 +++-
 doc/android/boot-image.rst  |  13 +-
 drivers/fastboot/fb_mmc.c   |  19 +-
 include/android_image.h | 228 +-
 include/image.h | 173 +++-
 test/py/tests/test_android/test_abootimg.py | 136 +-
 tools/docker/Dockerfile |   4 +
 11 files changed, 1009 insertions(+), 161 deletions(-)

--
2.34.1



Re: [PATCH v2 15/17] android: boot: support boot image header version 3 and 4

2023-02-02 Thread Safae Ouajih



On 01/02/2023 09:44, Mattijs Korpershoek wrote:

On Thu, Jan 26, 2023 at 17:55, Simon Glass  wrote:


Hi Safae,

On Thu, 26 Jan 2023 at 09:05, Safae Ouajih  wrote:

This enables the support for boot image header version 3 and 4
using abootimg command.

In order to use version 3 or 4:

1- Vendor boot image address should be given to abootimg cmd.

 abootimg addr $1 $vendor_boot_load_addr

2- "ramdisk_addr_r" env variable (ramdisk address) should be set to host
the ramdisk : generic ramdisk + vendor ramdisk

"struct andr_boot_img_hdr_v0*" is replaced by "void *" in
some functions since v3 and v4 are now supported as well.

Signed-off-by: Safae Ouajih 
---
  boot/bootm.c | 29 -
  boot/image-android.c | 16 ++--
  boot/image-board.c   | 14 +++---
  boot/image-fdt.c |  2 +-
  cmd/abootimg.c   | 24 ++--
  include/image.h  | 14 --
  6 files changed, 76 insertions(+), 23 deletions(-)

Since this introduces the new formats (v3 and v4), can we also update
the doc/android/boot-image.rst files which lists all the boot formats
for android?



Hi Mattijs,

Thank you for the review,

I will update the documentation in a v3.

Best Regards,

Safae


diff --git a/boot/bootm.c b/boot/bootm.c
index a58e6f391e..3e130c175c 100644
--- a/boot/bootm.c
+++ b/boot/bootm.c
@@ -113,6 +113,10 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, 
int argc,
  char *const argv[])
  {
 const void *os_hdr;
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+   const void *vendor_boot_img;
+   const void *boot_img;
+#endif
 bool ep_found = false;
 int ret;

@@ -181,12 +185,17 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, 
int argc,
  #endif
  #ifdef CONFIG_ANDROID_BOOT_IMAGE
 case IMAGE_FORMAT_ANDROID:
+   boot_img = os_hdr;
+   vendor_boot_img = NULL;
+   if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) {
+   boot_img = (void *)get_abootimg_addr();
+   vendor_boot_img = (void *)get_avendor_bootimg_addr();

map_sysmem() so it owrks on sandbox


+   }
 images.os.type = IH_TYPE_KERNEL;
-   images.os.comp = android_image_get_kcomp(os_hdr, NULL);
+   images.os.comp = android_image_get_kcomp(boot_img, 
vendor_boot_img);
 images.os.os = IH_OS_LINUX;
-
-   images.os.end = android_image_get_end(os_hdr, NULL);
-   images.os.load = android_image_get_kload(os_hdr, NULL);
+   images.os.end = android_image_get_end(boot_img, 
vendor_boot_img);
+   images.os.load = android_image_get_kload(boot_img, 
vendor_boot_img);
 images.ep = images.os.load;
 ep_found = true;
 break;
@@ -889,6 +898,10 @@ static const void *boot_get_kernel(struct cmd_tbl *cmdtp, 
int flag, int argc,
 int os_noffset;
  #endif

+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+   const void *boot_img;
+   const void *vendor_boot_img;
+#endif
 img_addr = genimg_get_kernel_addr_fit(argc < 1 ? NULL : argv[0],
   _uname_config,
   _uname_kernel);
@@ -964,8 +977,14 @@ static const void *boot_get_kernel(struct cmd_tbl *cmdtp, 
int flag, int argc,
  #endif
  #ifdef CONFIG_ANDROID_BOOT_IMAGE
 case IMAGE_FORMAT_ANDROID:
+   boot_img = buf;
+   vendor_boot_img = NULL;
+   if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) {
+   boot_img = (void *)get_abootimg_addr();
+   vendor_boot_img = (void *)get_avendor_bootimg_addr();

and here


+   }
 printf("## Booting Android Image at 0x%08lx ...\n", img_addr);
-   if (android_image_get_kernel(buf, NULL, images->verify,
+   if (android_image_get_kernel(boot_img, vendor_boot_img, 
images->verify,
  os_data, os_len))
 return NULL;
 break;
diff --git a/boot/image-android.c b/boot/image-android.c
index edeeaaaee0..dd06c09279 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -201,7 +201,7 @@ static ulong android_image_get_kernel_addr(struct 
andr_image_data *img_data)
   * Return: Zero, os start address and length on success,
   * otherwise on failure.
   */
-int android_image_get_kernel(const struct andr_boot_img_hdr_v0 *hdr,
+int android_image_get_kernel(const void *hdr,
  const void *vendor_boot_img, int verify,
  ulong *os_data, ulong *os_len)
  {
@@ -286,7 +286,7 @@ bool is_android_vendor_boot_image_header(const void 
*vendor_boot_img)
 return !memcmp(VENDOR_BOOT_MAGIC, vendor_boot_img, 
ANDR_VENDOR_BOOT_MAG

Re: [PATCH v2 17/17] test/py: android: extend abootimg test

2023-01-31 Thread Safae Ouajih



On 27/01/2023 21:37, Tom Rini wrote:

On Fri, Jan 27, 2023 at 04:51:41PM +0100, Safae Ouajih wrote:

On 27/01/2023 01:55, Simon Glass wrote:

Hi Safae,

On Thu, 26 Jan 2023 at 09:05, Safae Ouajih  wrote:

test_abootimg is extended to include the testing of boot images
version 4. For this, boot.img and vendor_boot.img have been
generated using mkbootimg tool with setting the header
version to 4.

This tests:
- Getting the header version using abootimg
- Extracting the load address of the dtb
- Extracting the dtb start address in RAM

Running test:
$ ./test/py/test.py --bd sandbox --build -k test_abootimg

Signed-off-by: Safae Ouajih 
---
   test/py/tests/test_android/test_abootimg.py | 135 ++--
   1 file changed, 122 insertions(+), 13 deletions(-)


Reviewed-by: Simon Glass 

Question below


diff --git a/test/py/tests/test_android/test_abootimg.py 
b/test/py/tests/test_android/test_abootimg.py
index 43a7099c46..a5c734b9c5 100644
--- a/test/py/tests/test_android/test_abootimg.py
+++ b/test/py/tests/test_android/test_abootimg.py
@@ -32,6 +32,23 @@ Now one can obtain original boot.img from this hex dump like 
this:

   $ xxd -r -p boot.img.gz.hex boot.img.gz
   $ gunzip -9 boot.img.gz
+
+For boot image header version 4, these tests rely on two images that are 
generated
+using the same steps above :
+
+1- boot.img :
+$ mkbootimg --kernel ./kernel --ramdisk ./ramdisk.img  \
+--cmdline "cmdline test" --dtb ./dtb.img   \
+--os_version R --os_patch_level 2019-06-05 \
+--header_version 4 --output ./boot.img
+
+2- vendor_boot.img
+$ mkbootimg --kernel ./kernel --ramdisk ./ramdisk.img  \
+--cmdline "cmdline test" --dtb ./dtb.img   \
+--os_version R --os_patch_level 2019-06-05 \
+--pagesize 4096  --vendor_ramdisk ./ramdisk.img \
+--header_version 4 --vendor_boot ./vboot.img \

Is it possible for us to run these commands in the test, to avoid
hassle when we want to change the disk image? See test_ut.py

Hi Simon,

I think that it is possible to run these commands in the test. However,

this requires adding "mkbootimg" android tool with the last updates

Please update tools/docker/Dockerfile to include this tool then, so we
can run it in CI (or locally using the images).



Hello Tom,

I will add a patch to add that tool in a v3.

Thank you,

Best regards,

Safae



Re: [PATCH v2 17/17] test/py: android: extend abootimg test

2023-01-27 Thread Safae Ouajih



On 27/01/2023 01:55, Simon Glass wrote:

Hi Safae,

On Thu, 26 Jan 2023 at 09:05, Safae Ouajih  wrote:

test_abootimg is extended to include the testing of boot images
version 4. For this, boot.img and vendor_boot.img have been
generated using mkbootimg tool with setting the header
version to 4.

This tests:
- Getting the header version using abootimg
- Extracting the load address of the dtb
- Extracting the dtb start address in RAM

Running test:
$ ./test/py/test.py --bd sandbox --build -k test_abootimg

Signed-off-by: Safae Ouajih 
---
  test/py/tests/test_android/test_abootimg.py | 135 ++--
  1 file changed, 122 insertions(+), 13 deletions(-)


Reviewed-by: Simon Glass 

Question below


diff --git a/test/py/tests/test_android/test_abootimg.py 
b/test/py/tests/test_android/test_abootimg.py
index 43a7099c46..a5c734b9c5 100644
--- a/test/py/tests/test_android/test_abootimg.py
+++ b/test/py/tests/test_android/test_abootimg.py
@@ -32,6 +32,23 @@ Now one can obtain original boot.img from this hex dump like 
this:

  $ xxd -r -p boot.img.gz.hex boot.img.gz
  $ gunzip -9 boot.img.gz
+
+For boot image header version 4, these tests rely on two images that are 
generated
+using the same steps above :
+
+1- boot.img :
+$ mkbootimg --kernel ./kernel --ramdisk ./ramdisk.img  \
+--cmdline "cmdline test" --dtb ./dtb.img   \
+--os_version R --os_patch_level 2019-06-05 \
+--header_version 4 --output ./boot.img
+
+2- vendor_boot.img
+$ mkbootimg --kernel ./kernel --ramdisk ./ramdisk.img  \
+--cmdline "cmdline test" --dtb ./dtb.img   \
+--os_version R --os_patch_level 2019-06-05 \
+--pagesize 4096  --vendor_ramdisk ./ramdisk.img \
+--header_version 4 --vendor_boot ./vboot.img \

Is it possible for us to run these commands in the test, to avoid
hassle when we want to change the disk image? See test_ut.py


Hi Simon,

I think that it is possible to run these commands in the test. However,

this requires adding "mkbootimg" android tool with the last updates

to generate the new vendor boot image and boot image with header version 4.

I think this change may come as an update for the whole test_abootimg later.


+
  """

  # boot.img.gz hex dump
@@ -44,6 +61,24 @@ b776207d345446c1281805e8a0868d81e117a45e111c0d8dc101b253
  9c03c41a0c90f17fe85400986d82452b6c3680198a192a0ce17c3610ae34
  d4a9820881a70f3873f35352731892f3730b124b32937252a96bb9119ae5
  463a5546f82c1f05a360148c8251300a462e85bf67f20020"""
+
+# boot img v4 hex dump
+boot_img_hex = """1f8b080827b0cd630203626f6f742e696d6700edd8bd0d82601885d1d7c4
+58d8c808b88195bd098d8d246e40e42b083f1aa0717be99d003d277916b8
+e5bddc8a7b792d8e8788c896ce9b88d32ebe6c971e7ddd3543cae734cd01
+c0ffc84cb0766d1a87d4e5afeadd3dab7a6f1000f84163d5d7cd
+d43a60c53e754499570040"""
+
+# vendor boot image v4 hex dump
+vboot_img_hex = """1f8b0808baaecd63020376626f6f742e696d6700edd8310b824018c6f1b3
+222a08f41b3436b4280dcdd19c11d16ee9109d18d59042d047ec8b04cd0d
+d19d5a4345534bf6ffc173ef29272f38e93b1d0ec67dd79d548462aa1cd2
+d5d20bf8438678f90c18d584b8a4bbb3a557991ecb2af80d6b2f
+f4179b656be5c532f2fc066f0480e23936af2755f62a3d918df1
+db2a7ab67f9ffdeb7df7cda3465ecb79c4ce7e5c577562bb9364b74449a5
+1e467e20c53c0a57de763193c1779b3b4fcd9d4ee27c6a0ec0ff
+309ffea70140f1dc00412985540040"""
+

[..]


-gtdi = None
+gtdi1 = None
  @pytest.fixture(scope='function')
  def abootimg_disk_image(u_boot_console):
  """pytest fixture to provide a AbootimgTestDiskImage object to tests.
@@ -109,10 +148,36 @@ def abootimg_disk_image(u_boot_console):
  function-scoped. However, we don't need to actually do any function-scope
  work, so this simply returns the same object over and over each time."""

-global gtdi
-if not gtdi:
-gtdi = AbootimgTestDiskImage(u_boot_console)
-return gtdi
+global gtdi1
+if not gtdi1:
+gtdi1 = AbootimgTestDiskImage(u_boot_console, 'boot.img', img_hex)
+return gtdi1
+
+gtdi2 = None
+@pytest.fixture(scope='function')
+def abootimgv4_disk_image_vboot(u_boot_console):
+"""pytest fixture to provide a AbootimgTestDiskImage object to tests.
+This is function-scoped because it uses u_boot_console, which is also
+function-scoped. However, we don't need to actually do any function-scope
+work, so this simply returns the same object over and over each time."""
+
+global gtdi2
+if not gtdi2:
+gtdi2 = AbootimgTestDiskImage(u_boot_console, 'vendor_boot.img', 
vboot_img_hex)
+return gtdi2
+
+gtdi3 = None
+@pytest.fixture(scope='function')
+def abootimgv4_disk_image_boot(u_boot_console):
+"""pytest fixture to provide a Abootim

Re: [PATCH v2 12/17] android: boot: support extra command line

2023-01-27 Thread Safae Ouajih



On 27/01/2023 01:54, Simon Glass wrote:

Hi Safae,

On Thu, 26 Jan 2023 at 09:05, Safae Ouajih  wrote:

In version 3 and 4 of boot image header, the vendor specific

vendor-spefcific


command line are located in vendor boot image. Thus, using

use the


extra command line to add those cmd to bootargs.

Signed-off-by: Safae Ouajih 
---
  boot/image-android.c | 11 +++
  1 file changed, 11 insertions(+)

diff --git a/boot/image-android.c b/boot/image-android.c
index 5b270e4417..cb4fc22b00 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -55,6 +55,7 @@ static void android_vendor_boot_image_v3_v4_parse_hdr(const 
struct andr_vendor_i
  * The header takes a full page, the remaining components are aligned
  * on page boundary.
  */
+   data->kcmdline_extra = hdr->cmdline;
 data->tags_addr = hdr->tags_addr;
 data->image_name = hdr->name;
 data->kernel_addr = hdr->kernel_addr;
@@ -233,6 +234,11 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0 *hdr,
 len += strlen(img_data.kcmdline);
 }

+   if (img_data.kcmdline_extra) {
+   printf("Kernel extra command line: %s\n", 
img_data.kcmdline_extra);
+   len += strlen(img_data.kcmdline_extra);
+   }
+
 char *bootargs = env_get("bootargs");
 if (bootargs)
 len += strlen(bootargs);
@@ -252,6 +258,11 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0 *hdr,
 if (*img_data.kcmdline)
 strcat(newbootargs, img_data.kcmdline);

+   if (img_data.kcmdline_extra) {
+   strcat(newbootargs, " ");
+   strcat(newbootargs, img_data.kcmdline_extra);

Do we need to worry about overflow?


Hi Simon,

This line adds kcmdline_extra length to the len variable:

len += strlen(img_data.kcmdline_extra);

newbootargs is allocated just after in :

        char *newbootargs = malloc(len + 2);

I can not see a possible overflow, please let me know if you

think this is not enough.

Thank you,

BR,

--safae


+   }
+
 env_set("bootargs", newbootargs);

 if (os_data) {
--
2.34.1


Regards,
Simon


Re: [PATCH v2 07/17] android: boot: content print is not supported for v3,v4 header version

2023-01-27 Thread Safae Ouajih



On 27/01/2023 01:54, Simon Glass wrote:

Hi Safae,

On Thu, 26 Jan 2023 at 09:05, Safae Ouajih  wrote:

Content print is not supported for version 3 and 4 of boot image header.
Thus, only print that content when v2 is used.

Update android_print_contents() to print an error message
when trying to print boot image header version 3 or 4 content.

Signed-off-by: Safae Ouajih 
---
  boot/image-android.c | 6 +-
  1 file changed, 5 insertions(+), 1 deletion(-)


Why is that?

Regards,
Simon


Hi Simon,

Thank you for the review.

Content print for boot image header v4 can be supported

and only requires updating the existing functions.

This is something I intend to support later on.

Best regards,

--safae



Re: [PATCH v2 06/17] android: boot: move to andr_image_data structure

2023-01-27 Thread Safae Ouajih



On 27/01/2023 01:54, Simon Glass wrote:

Hi Safae,

On Thu, 26 Jan 2023 at 09:05, Safae Ouajih  wrote:

Move from andr_boot_img_hdr_v0 to andr_image_data
structure to prepare for boot image header
version 3 and 4.

Signed-off-by: Safae Ouajih 
---
  boot/image-android.c | 127 ---
  cmd/abootimg.c   |  31 ++-
  include/image.h  |   2 +
  3 files changed, 89 insertions(+), 71 deletions(-)


Do you need the #ifdef CONFIG_CMD_ABOOTIMG? We try to avoid adding those.

Regards,
Simon


Hi Simon,

This is needed to avoid warnings such as "unused function warnings" when

CONFIG_CMD_ABOOTIMG is not defined.

Best regards,

--safae




Re: [PATCH v2 00/17] Support android boot image v3/v4

2023-01-27 Thread Safae Ouajih



On 26/01/2023 19:17, Roman Stratiienko wrote:

чт, 26 янв. 2023 г. в 18:05, Safae Ouajih :

Hello everyone,

* This is based on Roman Stratiienko's work to support boot image header 
version 3 and 4.

* This supports the new boot image headers v3, v4 and bootconfig feature.
https://source.android.com/docs/core/architecture/bootloader/boot-image-header
https://source.android.com/docs/core/architecture/bootloader/implementing-bootconfig

- Tested on Amlogic Khadas vim3l, a reference board for Android Open Source 
Project
   https://www.khadas.com/vim3l

   And on AM625 Texas Instruments board with 5.10 linux kernel

Main changes :
- New partition : vendor boot, with a specific vendor ramdisk
- DTB is stored in the vendor boot partition
- The generic ramdisk is placed after the vendor ramdisk
- Bootconfig feature support


Here is a link to see the related android boot flow changes on KHADAS vim3l as 
an example:
https://gitlab.baylibre.com/baylibre/amlogic/atv/u-boot/-/commits/souajih/BootImagev4/

Changes in v2:
- Rework parts of the code to fix the abootimg test: test_abootimg
- Update test_abootimg to support boot image header v4
- Remove LIBXBC library, import and adapt the functions to support bootconfig 
feature
- Rename the used structures :
 andr_boot_img_hdr_v0_v1_v2 -> andr_boot_img_hdr_v0
 andr_boot_img_hdr_v3_v4 -> andr_boot_img_hdr_v3
 andr_vendor_boot_img_hdr_v3_v4 -> andr_vendor_img_hdr

Hello,

Thanks for these patches.

Please note that Android has both vendor.img and boot_vendor.img
I would suggest adding some prefix, e.g. andr_bootvnd_img_hdr or
something similar.


Hello,

Thank you for your remark.

Indeed " struct andr_vendor_img_hdr " can be confusing.

To differentiate vendor.img and vendor_boot.img I will make the 
following changed in a v3:


struct andr_vendor_img_hdr -> struct andr_vnd_boot_img_hdr

Best regards,

--safae


Safae Ouajih (17):
   android: boot: rename andr_img_hdr -> andr_boot_img_hdr_v0
   android: boot: support vendor boot image in abootimg
   android: boot: replace android_image_check_header
   android: boot: add boot image header v3 and v4 structures
   android: boot: kcomp: support andr_image_data
   android: boot: move to andr_image_data structure
   android: boot: content print is not supported for v3,v4 header version
   android: boot: boot image header v3,v4 do not support recovery DTBO
   android: boot: add vendor boot image to prepare for v3,v4 support
   android: boot: update android_image_get_data to support v3,v4
   android: boot: ramdisk: support vendor ramdisk
   android: boot: support extra command line
   android: boot: update android_image_get_dtb_img_addr to support v3,v4
   drivers: fastboot: zImage flashing is not supported for v3,v4
   android: boot: support boot image header version 3 and 4
   android: boot: support bootconfig
   test/py: android: extend abootimg test

  boot/bootm.c|  29 +-
  boot/image-android.c| 467 
  boot/image-board.c  |  15 +-
  boot/image-fdt.c|   5 +-
  cmd/abootimg.c  |  75 +++-
  drivers/fastboot/fb_mmc.c   |  19 +-
  include/android_image.h | 228 +-
  include/image.h |  37 +-
  test/py/tests/test_android/test_abootimg.py | 135 +-
  9 files changed, 850 insertions(+), 160 deletions(-)

--
2.34.1



[PATCH v2 15/17] android: boot: support boot image header version 3 and 4

2023-01-26 Thread Safae Ouajih
This enables the support for boot image header version 3 and 4
using abootimg command.

In order to use version 3 or 4:

1- Vendor boot image address should be given to abootimg cmd.

abootimg addr $1 $vendor_boot_load_addr

2- "ramdisk_addr_r" env variable (ramdisk address) should be set to host
the ramdisk : generic ramdisk + vendor ramdisk

"struct andr_boot_img_hdr_v0*" is replaced by "void *" in
some functions since v3 and v4 are now supported as well.

Signed-off-by: Safae Ouajih 
---
 boot/bootm.c | 29 -
 boot/image-android.c | 16 ++--
 boot/image-board.c   | 14 +++---
 boot/image-fdt.c |  2 +-
 cmd/abootimg.c   | 24 ++--
 include/image.h  | 14 --
 6 files changed, 76 insertions(+), 23 deletions(-)

diff --git a/boot/bootm.c b/boot/bootm.c
index a58e6f391e..3e130c175c 100644
--- a/boot/bootm.c
+++ b/boot/bootm.c
@@ -113,6 +113,10 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, 
int argc,
 char *const argv[])
 {
const void *os_hdr;
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+   const void *vendor_boot_img;
+   const void *boot_img;
+#endif
bool ep_found = false;
int ret;
 
@@ -181,12 +185,17 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, 
int argc,
 #endif
 #ifdef CONFIG_ANDROID_BOOT_IMAGE
case IMAGE_FORMAT_ANDROID:
+   boot_img = os_hdr;
+   vendor_boot_img = NULL;
+   if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) {
+   boot_img = (void *)get_abootimg_addr();
+   vendor_boot_img = (void *)get_avendor_bootimg_addr();
+   }
images.os.type = IH_TYPE_KERNEL;
-   images.os.comp = android_image_get_kcomp(os_hdr, NULL);
+   images.os.comp = android_image_get_kcomp(boot_img, 
vendor_boot_img);
images.os.os = IH_OS_LINUX;
-
-   images.os.end = android_image_get_end(os_hdr, NULL);
-   images.os.load = android_image_get_kload(os_hdr, NULL);
+   images.os.end = android_image_get_end(boot_img, 
vendor_boot_img);
+   images.os.load = android_image_get_kload(boot_img, 
vendor_boot_img);
images.ep = images.os.load;
ep_found = true;
break;
@@ -889,6 +898,10 @@ static const void *boot_get_kernel(struct cmd_tbl *cmdtp, 
int flag, int argc,
int os_noffset;
 #endif
 
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+   const void *boot_img;
+   const void *vendor_boot_img;
+#endif
img_addr = genimg_get_kernel_addr_fit(argc < 1 ? NULL : argv[0],
  _uname_config,
  _uname_kernel);
@@ -964,8 +977,14 @@ static const void *boot_get_kernel(struct cmd_tbl *cmdtp, 
int flag, int argc,
 #endif
 #ifdef CONFIG_ANDROID_BOOT_IMAGE
case IMAGE_FORMAT_ANDROID:
+   boot_img = buf;
+   vendor_boot_img = NULL;
+   if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) {
+   boot_img = (void *)get_abootimg_addr();
+   vendor_boot_img = (void *)get_avendor_bootimg_addr();
+   }
printf("## Booting Android Image at 0x%08lx ...\n", img_addr);
-   if (android_image_get_kernel(buf, NULL, images->verify,
+   if (android_image_get_kernel(boot_img, vendor_boot_img, 
images->verify,
 os_data, os_len))
return NULL;
break;
diff --git a/boot/image-android.c b/boot/image-android.c
index edeeaaaee0..dd06c09279 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -201,7 +201,7 @@ static ulong android_image_get_kernel_addr(struct 
andr_image_data *img_data)
  * Return: Zero, os start address and length on success,
  * otherwise on failure.
  */
-int android_image_get_kernel(const struct andr_boot_img_hdr_v0 *hdr,
+int android_image_get_kernel(const void *hdr,
 const void *vendor_boot_img, int verify,
 ulong *os_data, ulong *os_len)
 {
@@ -286,7 +286,7 @@ bool is_android_vendor_boot_image_header(const void 
*vendor_boot_img)
return !memcmp(VENDOR_BOOT_MAGIC, vendor_boot_img, 
ANDR_VENDOR_BOOT_MAGIC_SIZE);
 }
 
-bool is_android_boot_image_header(const struct andr_boot_img_hdr_v0 *hdr)
+bool is_android_boot_image_header(const void *hdr)
 {
return !memcmp(ANDR_BOOT_MAGIC, hdr, ANDR_BOOT_MAGIC_SIZE);
 }
@@ -305,7 +305,7 @@ ulong android_image_get_end(const struct 
andr_boot_img_hdr_v0 *hdr,
return img_data.boot_img_total_size;
 }
 
-ulong android_image_get_kload(const struct andr_boot_img_hdr_v0 *hdr,
+ulong android_image_get_kload(const void *hdr,
  const void *v

[PATCH v2 09/17] android: boot: add vendor boot image to prepare for v3, v4 support

2023-01-26 Thread Safae Ouajih
This is done to prepare for boot image version 3 and 4 support.

Signed-off-by: Safae Ouajih 
---
 boot/bootm.c |  8 +++
 boot/image-android.c | 54 
 boot/image-board.c   |  3 +--
 boot/image-fdt.c |  3 ++-
 cmd/abootimg.c   |  4 ++--
 include/image.h  | 22 +++---
 6 files changed, 58 insertions(+), 36 deletions(-)

diff --git a/boot/bootm.c b/boot/bootm.c
index 15fce8ad95..a58e6f391e 100644
--- a/boot/bootm.c
+++ b/boot/bootm.c
@@ -182,11 +182,11 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, 
int argc,
 #ifdef CONFIG_ANDROID_BOOT_IMAGE
case IMAGE_FORMAT_ANDROID:
images.os.type = IH_TYPE_KERNEL;
-   images.os.comp = android_image_get_kcomp(os_hdr);
+   images.os.comp = android_image_get_kcomp(os_hdr, NULL);
images.os.os = IH_OS_LINUX;
 
-   images.os.end = android_image_get_end(os_hdr);
-   images.os.load = android_image_get_kload(os_hdr);
+   images.os.end = android_image_get_end(os_hdr, NULL);
+   images.os.load = android_image_get_kload(os_hdr, NULL);
images.ep = images.os.load;
ep_found = true;
break;
@@ -965,7 +965,7 @@ static const void *boot_get_kernel(struct cmd_tbl *cmdtp, 
int flag, int argc,
 #ifdef CONFIG_ANDROID_BOOT_IMAGE
case IMAGE_FORMAT_ANDROID:
printf("## Booting Android Image at 0x%08lx ...\n", img_addr);
-   if (android_image_get_kernel(buf, images->verify,
+   if (android_image_get_kernel(buf, NULL, images->verify,
 os_data, os_len))
return NULL;
break;
diff --git a/boot/image-android.c b/boot/image-android.c
index d797270a32..66922355e5 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -66,7 +66,8 @@ static void android_boot_image_v0_v1_v2_parse_hdr(const 
struct andr_boot_img_hdr
data->boot_img_total_size = end - (ulong)hdr;
 }
 
-bool android_image_get_data(const void *boot_hdr, struct andr_image_data *data)
+bool android_image_get_data(const void *boot_hdr, const void *vendor_boot_hdr,
+   struct andr_image_data *data)
 {
if (!boot_hdr || !data) {
printf("boot_hdr or data params can't be NULL\n");
@@ -114,8 +115,10 @@ static ulong android_image_get_kernel_addr(struct 
andr_image_data *img_data)
 
 /**
  * android_image_get_kernel() - processes kernel part of Android boot images
- * @hdr:   Pointer to image header, which is at the start
+ * @hdr:   Pointer to boot image header, which is at the start
  * of the image.
+ * @vendor_boot_img:   Pointer to vendor boot image header, which is at the
+ * start of the image.
  * @verify:Checksum verification flag. Currently unimplemented.
  * @os_data:   Pointer to a ulong variable, will hold os data start
  * address.
@@ -127,14 +130,15 @@ static ulong android_image_get_kernel_addr(struct 
andr_image_data *img_data)
  * Return: Zero, os start address and length on success,
  * otherwise on failure.
  */
-int android_image_get_kernel(const struct andr_boot_img_hdr_v0 *hdr, int 
verify,
+int android_image_get_kernel(const struct andr_boot_img_hdr_v0 *hdr,
+const void *vendor_boot_img, int verify,
 ulong *os_data, ulong *os_len)
 {
struct andr_image_data img_data = {0};
u32 kernel_addr;
const struct legacy_img_hdr *ihdr;
 
-   if (!android_image_get_data(hdr, _data))
+   if (!android_image_get_data(hdr, vendor_boot_img, _data))
return -EINVAL;
 
kernel_addr = android_image_get_kernel_addr(_data);
@@ -201,11 +205,12 @@ bool is_android_boot_image_header(const struct 
andr_boot_img_hdr_v0 *hdr)
return !memcmp(ANDR_BOOT_MAGIC, hdr, ANDR_BOOT_MAGIC_SIZE);
 }
 
-ulong android_image_get_end(const struct andr_boot_img_hdr_v0 *hdr)
+ulong android_image_get_end(const struct andr_boot_img_hdr_v0 *hdr,
+   const void *vendor_boot_img)
 {
struct andr_image_data img_data;
 
-   if (!android_image_get_data(hdr, _data))
+   if (!android_image_get_data(hdr, vendor_boot_img, _data))
return -EINVAL;
 
if (img_data.header_version > 2)
@@ -214,22 +219,24 @@ ulong android_image_get_end(const struct 
andr_boot_img_hdr_v0 *hdr)
return img_data.boot_img_total_size;
 }
 
-ulong android_image_get_kload(const struct andr_boot_img_hdr_v0 *hdr)
+ulong android_image_get_kload(const struct andr_boot_img_hdr_v0 *hdr,
+ const void *vendor_boot_img)
 {
struct andr_image_data img_data;
 
-   if (!android_image_get_data(hdr, _data))
+   if (!android_image_get_

[PATCH v2 17/17] test/py: android: extend abootimg test

2023-01-26 Thread Safae Ouajih
test_abootimg is extended to include the testing of boot images
version 4. For this, boot.img and vendor_boot.img have been
generated using mkbootimg tool with setting the header
version to 4.

This tests:
- Getting the header version using abootimg
- Extracting the load address of the dtb
- Extracting the dtb start address in RAM

Running test:
$ ./test/py/test.py --bd sandbox --build -k test_abootimg

Signed-off-by: Safae Ouajih 
---
 test/py/tests/test_android/test_abootimg.py | 135 ++--
 1 file changed, 122 insertions(+), 13 deletions(-)

diff --git a/test/py/tests/test_android/test_abootimg.py 
b/test/py/tests/test_android/test_abootimg.py
index 43a7099c46..a5c734b9c5 100644
--- a/test/py/tests/test_android/test_abootimg.py
+++ b/test/py/tests/test_android/test_abootimg.py
@@ -32,6 +32,23 @@ Now one can obtain original boot.img from this hex dump like 
this:
 
 $ xxd -r -p boot.img.gz.hex boot.img.gz
 $ gunzip -9 boot.img.gz
+
+For boot image header version 4, these tests rely on two images that are 
generated
+using the same steps above :
+
+1- boot.img :
+$ mkbootimg --kernel ./kernel --ramdisk ./ramdisk.img  \
+--cmdline "cmdline test" --dtb ./dtb.img   \
+--os_version R --os_patch_level 2019-06-05 \
+--header_version 4 --output ./boot.img
+
+2- vendor_boot.img
+$ mkbootimg --kernel ./kernel --ramdisk ./ramdisk.img  \
+--cmdline "cmdline test" --dtb ./dtb.img   \
+--os_version R --os_patch_level 2019-06-05 \
+--pagesize 4096  --vendor_ramdisk ./ramdisk.img \
+--header_version 4 --vendor_boot ./vboot.img \
+
 """
 
 # boot.img.gz hex dump
@@ -44,6 +61,24 @@ b776207d345446c1281805e8a0868d81e117a45e111c0d8dc101b253
 9c03c41a0c90f17fe85400986d82452b6c3680198a192a0ce17c3610ae34
 d4a9820881a70f3873f35352731892f3730b124b32937252a96bb9119ae5
 463a5546f82c1f05a360148c8251300a462e85bf67f20020"""
+
+# boot img v4 hex dump
+boot_img_hex = """1f8b080827b0cd630203626f6f742e696d6700edd8bd0d82601885d1d7c4
+58d8c808b88195bd098d8d246e40e42b083f1aa0717be99d003d277916b8
+e5bddc8a7b792d8e8788c896ce9b88d32ebe6c971e7ddd3543cae734cd01
+c0ffc84cb0766d1a87d4e5afeadd3dab7a6f1000f84163d5d7cd
+d43a60c53e754499570040"""
+
+# vendor boot image v4 hex dump
+vboot_img_hex = """1f8b0808baaecd63020376626f6f742e696d6700edd8310b824018c6f1b3
+222a08f41b3436b4280dcdd19c11d16ee9109d18d59042d047ec8b04cd0d
+d19d5a4345534bf6ffc173ef29272f38e93b1d0ec67dd79d548462aa1cd2
+d5d20bf8438678f90c18d584b8a4bbb3a557991ecb2af80d6b2f
+f4179b656be5c532f2fc066f0480e23936af2755f62a3d918df1
+db2a7ab67f9ffdeb7df7cda3465ecb79c4ce7e5c577562bb9364b74449a5
+1e467e20c53c0a57de763193c1779b3b4fcd9d4ee27c6a0ec0ff
+309ffea70140f1dc00412985540040"""
+
 # Expected response for "abootimg dtb_dump" command
 dtb_dump_resp="""## DTB area contents (concat format):
  - DTB #0:
@@ -56,15 +91,21 @@ dtb_dump_resp="""## DTB area contents (concat format):
  (DTB)compatible = y2,z2"""
 # Address in RAM where to load the boot image ('abootimg' looks in $loadaddr)
 loadaddr = 0x1000
+# Address in RAM where to load the vendor boot image ('abootimg' looks in 
$vloadaddr)
+vloadaddr= 0x1
 # Expected DTB #1 offset from the boot image start address
 dtb1_offset = 0x187d
+# Expected DTB offset from the vendor boot image start address
+dtb2_offset = 0x207d
 # DTB #1 start address in RAM
 dtb1_addr = loadaddr + dtb1_offset
+# DTB #2 start address in RAM
+dtb2_addr = vloadaddr + dtb2_offset
 
 class AbootimgTestDiskImage(object):
 """Disk image used by abootimg tests."""
 
-def __init__(self, u_boot_console):
+def __init__(self, u_boot_console, image_name, hex_img):
 """Initialize a new AbootimgDiskImage object.
 
 Args:
@@ -74,13 +115,13 @@ class AbootimgTestDiskImage(object):
 Nothing.
 """
 
-gz_hex = u_boot_console.config.persistent_data_dir + '/boot.img.gz.hex'
-gz = u_boot_console.config.persistent_data_dir + '/boot.img.gz'
+gz_hex = u_boot_console.config.persistent_data_dir + '/' + image_name  
+ '.gz.hex'
+gz = u_boot_console.config.persistent_data_dir + '/' + image_name + 
'.gz'
 
-filename = 'boot.img'
+filename = image_name
 persistent = u_boot_console.config.persistent_data_dir + '/' + filename
 self.path = u_boot_console.config.result_dir  + '/' + filename
-
+u_boot_console.log.action('persistent is ' + persistent)
 with u_boot_utils.persistent_file_helper(u_boot_console.log, 
persistent):
 if os.path.exists(persistent):
 u_boot_console.log.action('Disk image

[PATCH v2 14/17] drivers: fastboot: zImage flashing is not supported for v3, v4

2023-01-26 Thread Safae Ouajih
Print an error message when the boot image header version is
greater than 2 as this is not supported for v3 and v4.

Signed-off-by: Safae Ouajih 
---
 drivers/fastboot/fb_mmc.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/drivers/fastboot/fb_mmc.c b/drivers/fastboot/fb_mmc.c
index 086e5f7843..9fb2ab3820 100644
--- a/drivers/fastboot/fb_mmc.c
+++ b/drivers/fastboot/fb_mmc.c
@@ -370,6 +370,14 @@ static int fb_mmc_update_zimage(struct blk_desc *dev_desc,
return -1;
}
 
+   /* Check if boot image header version is 2 or less */
+   if (hdr->header_version > 2) {
+   pr_err("zImage flashing supported only for boot images v2 and 
less\n");
+   fastboot_fail("zImage flashing supported only for boot images 
v2 and less",
+ response);
+   return -1;
+   }
+
/* Check if boot image has second stage in it (we don't support it) */
if (hdr->second_size > 0) {
pr_err("moving second stage is not supported yet\n");
-- 
2.34.1



[PATCH v2 12/17] android: boot: support extra command line

2023-01-26 Thread Safae Ouajih
In version 3 and 4 of boot image header, the vendor specific
command line are located in vendor boot image. Thus, using
extra command line to add those cmd to bootargs.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/boot/image-android.c b/boot/image-android.c
index 5b270e4417..cb4fc22b00 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -55,6 +55,7 @@ static void android_vendor_boot_image_v3_v4_parse_hdr(const 
struct andr_vendor_i
 * The header takes a full page, the remaining components are aligned
 * on page boundary.
 */
+   data->kcmdline_extra = hdr->cmdline;
data->tags_addr = hdr->tags_addr;
data->image_name = hdr->name;
data->kernel_addr = hdr->kernel_addr;
@@ -233,6 +234,11 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0 *hdr,
len += strlen(img_data.kcmdline);
}
 
+   if (img_data.kcmdline_extra) {
+   printf("Kernel extra command line: %s\n", 
img_data.kcmdline_extra);
+   len += strlen(img_data.kcmdline_extra);
+   }
+
char *bootargs = env_get("bootargs");
if (bootargs)
len += strlen(bootargs);
@@ -252,6 +258,11 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0 *hdr,
if (*img_data.kcmdline)
strcat(newbootargs, img_data.kcmdline);
 
+   if (img_data.kcmdline_extra) {
+   strcat(newbootargs, " ");
+   strcat(newbootargs, img_data.kcmdline_extra);
+   }
+
env_set("bootargs", newbootargs);
 
if (os_data) {
-- 
2.34.1



[PATCH v2 07/17] android: boot: content print is not supported for v3, v4 header version

2023-01-26 Thread Safae Ouajih
Content print is not supported for version 3 and 4 of boot image header.
Thus, only print that content when v2 is used.

Update android_print_contents() to print an error message
when trying to print boot image header version 3 or 4 content.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c | 6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index 9dab09a69a..a6e7a7abb0 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -481,6 +481,10 @@ bool android_image_get_dtb_by_index(ulong hdr_addr, u32 
index, ulong *addr,
  */
 void android_print_contents(const struct andr_boot_img_hdr_v0 *hdr)
 {
+   if (hdr->header_version >= 3) {
+   printf("Content print is not supported for boot image header 
version > 2");
+   return;
+   }
const char * const p = IMAGE_INDENT_STRING;
/* os_version = ver << 11 | lvl */
u32 os_ver = hdr->os_version >> 11;
@@ -513,7 +517,7 @@ void android_print_contents(const struct 
andr_boot_img_hdr_v0 *hdr)
   hdr->header_size);
}
 
-   if (hdr->header_version >= 2) {
+   if (hdr->header_version == 2) {
printf("%sdtb size: %x\n", p, hdr->dtb_size);
printf("%sdtb addr: %llx\n", p, hdr->dtb_addr);
}
-- 
2.34.1



[PATCH v2 06/17] android: boot: move to andr_image_data structure

2023-01-26 Thread Safae Ouajih
Move from andr_boot_img_hdr_v0 to andr_image_data
structure to prepare for boot image header
version 3 and 4.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c | 127 ---
 cmd/abootimg.c   |  31 ++-
 include/image.h  |   2 +
 3 files changed, 89 insertions(+), 71 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index 487223d850..9dab09a69a 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -86,7 +86,7 @@ bool android_image_get_data(const void *boot_hdr, struct 
andr_image_data *data)
return true;
 }
 
-static ulong android_image_get_kernel_addr(const struct andr_boot_img_hdr_v0 
*hdr)
+static ulong android_image_get_kernel_addr(struct andr_image_data *img_data)
 {
/*
 * All the Android tools that generate a boot.img use this
@@ -99,17 +99,17 @@ static ulong android_image_get_kernel_addr(const struct 
andr_boot_img_hdr_v0 *hd
 *
 * Otherwise, we will return the actual value set by the user.
 */
-   if (hdr->kernel_addr == ANDROID_IMAGE_DEFAULT_KERNEL_ADDR)
-   return (ulong)hdr + hdr->page_size;
+   if (img_data->kernel_addr  == ANDROID_IMAGE_DEFAULT_KERNEL_ADDR)
+   return img_data->kernel_ptr;
 
/*
 * abootimg creates images where all load addresses are 0
 * and we need to fix them.
 */
-   if (hdr->kernel_addr == 0 && hdr->ramdisk_addr == 0)
+   if (img_data->kernel_addr == 0 && img_data->ramdisk_addr == 0)
return env_get_ulong("kernel_addr_r", 16, 0);
 
-   return hdr->kernel_addr;
+   return img_data->kernel_addr;
 }
 
 /**
@@ -130,27 +130,33 @@ static ulong android_image_get_kernel_addr(const struct 
andr_boot_img_hdr_v0 *hd
 int android_image_get_kernel(const struct andr_boot_img_hdr_v0 *hdr, int 
verify,
 ulong *os_data, ulong *os_len)
 {
-   u32 kernel_addr = android_image_get_kernel_addr(hdr);
-   const struct legacy_img_hdr *ihdr = (const struct legacy_img_hdr *)
-   ((uintptr_t)hdr + hdr->page_size);
+   struct andr_image_data img_data = {0};
+   u32 kernel_addr;
+   const struct legacy_img_hdr *ihdr;
+
+   if (!android_image_get_data(hdr, _data))
+   return -EINVAL;
+
+   kernel_addr = android_image_get_kernel_addr(_data);
+   ihdr = (const struct legacy_img_hdr *)img_data.kernel_ptr;
 
/*
 * Not all Android tools use the id field for signing the image with
 * sha1 (or anything) so we don't check it. It is not obvious that the
 * string is null terminated so we take care of this.
 */
-   strncpy(andr_tmp_str, hdr->name, ANDR_BOOT_NAME_SIZE);
+   strncpy(andr_tmp_str, img_data.image_name, ANDR_BOOT_NAME_SIZE);
andr_tmp_str[ANDR_BOOT_NAME_SIZE] = '\0';
if (strlen(andr_tmp_str))
printf("Android's image name: %s\n", andr_tmp_str);
 
printf("Kernel load addr 0x%08x size %u KiB\n",
-  kernel_addr, DIV_ROUND_UP(hdr->kernel_size, 1024));
+  kernel_addr, DIV_ROUND_UP(img_data.kernel_size, 1024));
 
int len = 0;
-   if (*hdr->cmdline) {
-   printf("Kernel command line: %s\n", hdr->cmdline);
-   len += strlen(hdr->cmdline);
+   if (*img_data.kcmdline) {
+   printf("Kernel command line: %s\n", img_data.kcmdline);
+   len += strlen(img_data.kcmdline);
}
 
char *bootargs = env_get("bootargs");
@@ -168,8 +174,9 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0 *hdr, int verify,
strcpy(newbootargs, bootargs);
strcat(newbootargs, " ");
}
-   if (*hdr->cmdline)
-   strcat(newbootargs, hdr->cmdline);
+
+   if (*img_data.kcmdline)
+   strcat(newbootargs, img_data.kcmdline);
 
env_set("bootargs", newbootargs);
 
@@ -177,15 +184,14 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0 *hdr, int verify,
if (image_get_magic(ihdr) == IH_MAGIC) {
*os_data = image_get_data(ihdr);
} else {
-   *os_data = (ulong)hdr;
-   *os_data += hdr->page_size;
+   *os_data = img_data.kernel_ptr;
}
}
if (os_len) {
if (image_get_magic(ihdr) == IH_MAGIC)
*os_len = image_get_data_size(ihdr);
else
-   *os_len = hdr->kernel_size;
+   *os_len = img_data.kernel_size;
}
return 0;
 }
@@ -197,30 +203,25 @@ bool is_android_boot_image_header(const struct 
andr_boot_img_hdr_v0 *hdr)
 
 ulong android_image_get_

[PATCH v2 11/17] android: boot: ramdisk: support vendor ramdisk

2023-01-26 Thread Safae Ouajih
Version 3 and 4 of boot image header introduced
vendor boot ramdisk: Please check include/android_image.h
for details.

The ramdisk is now split into a generic ramdisk in boot image
and a vendor ramdisk in vendor boot image.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c | 13 +++--
 include/image.h  |  4 ++--
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index 0e78ca0dac..5b270e4417 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -25,6 +25,7 @@ static void android_boot_image_v3_v4_parse_hdr(const struct 
andr_boot_img_hdr_v3
 
data->kcmdline = hdr->cmdline;
data->header_version = hdr->header_version;
+   data->ramdisk_ptr = env_get_ulong("ramdisk_addr_r", 16, 0);
 
/*
 * The header takes a full page, the remaining components are aligned
@@ -322,10 +323,11 @@ ulong android_image_get_kcomp(const struct 
andr_boot_img_hdr_v0 *hdr,
return image_decomp_type(p, sizeof(u32));
 }
 
-int android_image_get_ramdisk(const struct andr_boot_img_hdr_v0 *hdr,
- const void *vendor_boot_img, ulong *rd_data, 
ulong *rd_len)
+int android_image_get_ramdisk(const void *hdr, const void *vendor_boot_img,
+ ulong *rd_data, ulong *rd_len)
 {
struct andr_image_data img_data = {0};
+   ulong ramdisk_ptr;
 
if (!android_image_get_data(hdr, vendor_boot_img, _data))
return -EINVAL;
@@ -334,6 +336,13 @@ int android_image_get_ramdisk(const struct 
andr_boot_img_hdr_v0 *hdr,
*rd_data = *rd_len = 0;
return -1;
}
+   if (img_data.header_version > 2) {
+   ramdisk_ptr = img_data.ramdisk_ptr;
+   memcpy((void *)(ramdisk_ptr), (void 
*)img_data.vendor_ramdisk_ptr,
+  img_data.vendor_ramdisk_size);
+   memcpy((void *)(ramdisk_ptr + img_data.vendor_ramdisk_size),
+  (void *)img_data.ramdisk_ptr, 
img_data.boot_ramdisk_size);
+   }
 
printf("RAM disk load addr 0x%08lx size %u KiB\n",
   img_data.ramdisk_ptr, DIV_ROUND_UP(img_data.ramdisk_size, 1024));
diff --git a/include/image.h b/include/image.h
index a1a14403d5..ac94ecaa14 100644
--- a/include/image.h
+++ b/include/image.h
@@ -1742,8 +1742,8 @@ struct andr_boot_img_hdr_v0;
 int android_image_get_kernel(const struct andr_boot_img_hdr_v0 *hdr,
 const void *vendor_boot_img, int verify,
 ulong *os_data, ulong *os_len);
-int android_image_get_ramdisk(const struct andr_boot_img_hdr_v0 *hdr,
- const void *vendor_boot_img, ulong *rd_data, 
ulong *rd_len);
+int android_image_get_ramdisk(const void *hdr, const void *vendor_boot_img,
+ ulong *rd_data, ulong *rd_len);
 int android_image_get_second(const struct andr_boot_img_hdr_v0 *hdr,
  ulong *second_data, ulong *second_len);
 bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, u32 *size);
-- 
2.34.1



[PATCH v2 16/17] android: boot: support bootconfig

2023-01-26 Thread Safae Ouajih
This adds support for Bootconfig feature.
- The bootconfig feature replaces the androidboot.*
  kernel cmdline options.

This was adapted from downstream [1] commit : 7af0a0506d4d ("cuttlefish:
support bootconfig parameters").

Link:[1] https://android.googlesource.com/platform/external/u-boot/

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c| 58 +++--
 include/android_image.h | 11 
 2 files changed, 67 insertions(+), 2 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index dd06c09279..5c2217676e 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -18,6 +18,45 @@
 
 static char andr_tmp_str[ANDR_BOOT_ARGS_SIZE + 1];
 
+static ulong checksum(const unsigned char *buffer, ulong size)
+{
+   ulong sum = 0;
+
+   for (ulong i = 0; i < size; i++)
+   sum += buffer[i];
+   return sum;
+}
+
+static bool is_trailer_present(ulong bootconfig_end_addr)
+{
+   return !strncmp((char *)(bootconfig_end_addr - BOOTCONFIG_MAGIC_SIZE),
+   BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_SIZE);
+}
+
+static ulong add_trailer(ulong bootconfig_start_addr, ulong bootconfig_size)
+{
+   ulong end;
+   ulong sum;
+
+   if (!bootconfig_start_addr)
+   return -1;
+   if (!bootconfig_size)
+   return 0;
+
+   end = bootconfig_start_addr + bootconfig_size;
+   if (is_trailer_present(end))
+   return 0;
+
+   memcpy((void *)(end), _size, BOOTCONFIG_SIZE_SIZE);
+   sum = checksum((unsigned char *)bootconfig_start_addr, bootconfig_size);
+   memcpy((void *)(end + BOOTCONFIG_SIZE_SIZE), ,
+  BOOTCONFIG_CHECKSUM_SIZE);
+   memcpy((void *)(end + BOOTCONFIG_SIZE_SIZE + BOOTCONFIG_CHECKSUM_SIZE),
+  BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_SIZE);
+
+   return BOOTCONFIG_TRAILER_SIZE;
+}
+
 static void android_boot_image_v3_v4_parse_hdr(const struct 
andr_boot_img_hdr_v3 *hdr,
   struct andr_image_data *data)
 {
@@ -61,6 +100,7 @@ static void android_vendor_boot_image_v3_v4_parse_hdr(const 
struct andr_vendor_i
data->kernel_addr = hdr->kernel_addr;
data->ramdisk_addr = hdr->ramdisk_addr;
data->dtb_load_addr = hdr->dtb_addr;
+   data->bootconfig_size = hdr->bootconfig_size;
end = (ulong)hdr;
end += hdr->page_size;
if (hdr->vendor_ramdisk_size) {
@@ -75,7 +115,13 @@ static void android_vendor_boot_image_v3_v4_parse_hdr(const 
struct andr_vendor_i
 
end += ALIGN(hdr->dtb_size, hdr->page_size);
end += ALIGN(hdr->vendor_ramdisk_table_size, hdr->page_size);
-   end += ALIGN(hdr->bootconfig_size, hdr->page_size);
+   data->bootconfig_addr = end;
+   if (hdr->bootconfig_size) {
+   data->bootconfig_size += add_trailer(data->bootconfig_addr,
+data->bootconfig_size);
+   data->ramdisk_size += data->bootconfig_size;
+   }
+   end += ALIGN(data->bootconfig_size, hdr->page_size);
data->vendor_boot_img_total_size = end - (ulong)hdr;
 }
 
@@ -352,7 +398,15 @@ int android_image_get_ramdisk(const void *hdr, const void 
*vendor_boot_img,
memcpy((void *)(ramdisk_ptr), (void 
*)img_data.vendor_ramdisk_ptr,
   img_data.vendor_ramdisk_size);
memcpy((void *)(ramdisk_ptr + img_data.vendor_ramdisk_size),
-  (void *)img_data.ramdisk_ptr, 
img_data.boot_ramdisk_size);
+  (void *)img_data.ramdisk_ptr,
+  img_data.boot_ramdisk_size);
+   if (img_data.bootconfig_size) {
+   memcpy((void *)
+  (ramdisk_ptr + img_data.vendor_ramdisk_size +
+  img_data.boot_ramdisk_size),
+  (void *)img_data.bootconfig_addr,
+  img_data.bootconfig_size);
+   }
}
 
printf("RAM disk load addr 0x%08lx size %u KiB\n",
diff --git a/include/android_image.h b/include/android_image.h
index 351e17750e..6e1afae4c0 100644
--- a/include/android_image.h
+++ b/include/android_image.h
@@ -25,6 +25,14 @@
 #define ANDR_VENDOR_BOOT_ARGS_SIZE 2048
 #define ANDR_VENDOR_BOOT_NAME_SIZE 16
 
+#define BOOTCONFIG_MAGIC "#BOOTCONFIG\n"
+#define BOOTCONFIG_MAGIC_SIZE 12
+#define BOOTCONFIG_SIZE_SIZE 4
+#define BOOTCONFIG_CHECKSUM_SIZE 4
+#define BOOTCONFIG_TRAILER_SIZE BOOTCONFIG_MAGIC_SIZE + \
+   BOOTCONFIG_SIZE_SIZE + \
+   BOOTCONFIG_CHECKSUM_SIZE
+
 struct andr_boot_img_hdr_v3 {
u8 magic[ANDR_BOOT_MAGIC_SIZE];
 
@@ -333,6 +341,9 @@ struct andr_image_data {
ulong recovery_dtbo_ptr;
u32 recovery_dtbo_size;
 
+

[PATCH v2 13/17] android: boot: update android_image_get_dtb_img_addr to support v3, v4

2023-01-26 Thread Safae Ouajih
This adds support for boot image version 3 and 4
in android_image_get_dtb_img_addr(). Since the dtb
is now included in vendor_boot image instead of
boot image, the dtb address should be extracted from
vendor_boot image when a v3 or v4 is used.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c | 47 +++-
 1 file changed, 33 insertions(+), 14 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index cb4fc22b00..edeeaaaee0 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -459,6 +459,7 @@ exit:
 static bool android_image_get_dtb_img_addr(ulong hdr_addr, ulong vhdr_addr, 
ulong *addr)
 {
const struct andr_boot_img_hdr_v0 *hdr;
+   const struct andr_vendor_img_hdr *v_hdr;
ulong dtb_img_addr;
bool ret = true;
 
@@ -475,22 +476,40 @@ static bool android_image_get_dtb_img_addr(ulong 
hdr_addr, ulong vhdr_addr, ulon
goto exit;
}
 
-   if (hdr->dtb_size == 0) {
-   printf("Error: dtb_size is 0\n");
-   ret = false;
-   goto exit;
+   if (hdr->header_version == 2) {
+   if (hdr->dtb_size == 0) {
+   printf("Error: dtb_size is 0\n");
+   ret = false;
+   goto exit;
+   }
+   /* Calculate the address of DTB area in boot image */
+   dtb_img_addr = hdr_addr;
+   dtb_img_addr += hdr->page_size;
+   dtb_img_addr += ALIGN(hdr->kernel_size, hdr->page_size);
+   dtb_img_addr += ALIGN(hdr->ramdisk_size, hdr->page_size);
+   dtb_img_addr += ALIGN(hdr->second_size, hdr->page_size);
+   dtb_img_addr += ALIGN(hdr->recovery_dtbo_size, hdr->page_size);
+
+   *addr = dtb_img_addr;
}
 
-   /* Calculate the address of DTB area in boot image */
-   dtb_img_addr = hdr_addr;
-   dtb_img_addr += hdr->page_size;
-   dtb_img_addr += ALIGN(hdr->kernel_size, hdr->page_size);
-   dtb_img_addr += ALIGN(hdr->ramdisk_size, hdr->page_size);
-   dtb_img_addr += ALIGN(hdr->second_size, hdr->page_size);
-   dtb_img_addr += ALIGN(hdr->recovery_dtbo_size, hdr->page_size);
-
-   *addr = dtb_img_addr;
-
+   if (hdr->header_version > 2) {
+   v_hdr = map_sysmem(vhdr_addr, sizeof(*v_hdr));
+   if (v_hdr->dtb_size == 0) {
+   printf("Error: dtb_size is 0\n");
+   ret = false;
+   unmap_sysmem(v_hdr);
+   goto exit;
+   }
+   /* Calculate the address of DTB area in boot image */
+   dtb_img_addr = vhdr_addr;
+   dtb_img_addr += v_hdr->page_size;
+   if (v_hdr->vendor_ramdisk_size)
+   dtb_img_addr += ALIGN(v_hdr->vendor_ramdisk_size, 
v_hdr->page_size);
+   *addr = dtb_img_addr;
+   unmap_sysmem(v_hdr);
+   goto exit;
+   }
 exit:
unmap_sysmem(hdr);
return ret;
-- 
2.34.1



[PATCH v2 10/17] android: boot: update android_image_get_data to support v3, v4

2023-01-26 Thread Safae Ouajih
Since boot image header version 3 and 4 introduced vendor boot image,
the following functions are used to fill the generic android
structure : andr_image_data:

 - android_boot_image_v3_v4_parse_hdr()
 - android_vendor_boot_image_v3_v4_parse_hdr()

android_image_get_data() is then updated to support v3 and v4

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c| 80 +++--
 include/android_image.h |  3 ++
 include/image.h |  1 +
 3 files changed, 81 insertions(+), 3 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index 66922355e5..0e78ca0dac 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -18,6 +18,65 @@
 
 static char andr_tmp_str[ANDR_BOOT_ARGS_SIZE + 1];
 
+static void android_boot_image_v3_v4_parse_hdr(const struct 
andr_boot_img_hdr_v3 *hdr,
+  struct andr_image_data *data)
+{
+   ulong end;
+
+   data->kcmdline = hdr->cmdline;
+   data->header_version = hdr->header_version;
+
+   /*
+* The header takes a full page, the remaining components are aligned
+* on page boundary.
+*/
+   end = (ulong)hdr;
+   end += ANDR_GKI_PAGE_SIZE;
+   data->kernel_ptr = end;
+   data->kernel_size = hdr->kernel_size;
+   end += ALIGN(hdr->kernel_size, ANDR_GKI_PAGE_SIZE);
+   data->ramdisk_size = hdr->ramdisk_size;
+   data->boot_ramdisk_size = hdr->ramdisk_size;
+   end += ALIGN(hdr->ramdisk_size, ANDR_GKI_PAGE_SIZE);
+
+   if (hdr->header_version > 3)
+   end += ALIGN(hdr->signature_size, ANDR_GKI_PAGE_SIZE);
+
+   data->boot_img_total_size = end - (ulong)hdr;
+}
+
+static void android_vendor_boot_image_v3_v4_parse_hdr(const struct 
andr_vendor_img_hdr
+ *hdr, struct 
andr_image_data *data)
+{
+   ulong end;
+
+   /*
+* The header takes a full page, the remaining components are aligned
+* on page boundary.
+*/
+   data->tags_addr = hdr->tags_addr;
+   data->image_name = hdr->name;
+   data->kernel_addr = hdr->kernel_addr;
+   data->ramdisk_addr = hdr->ramdisk_addr;
+   data->dtb_load_addr = hdr->dtb_addr;
+   end = (ulong)hdr;
+   end += hdr->page_size;
+   if (hdr->vendor_ramdisk_size) {
+   data->vendor_ramdisk_ptr = end;
+   data->vendor_ramdisk_size = hdr->vendor_ramdisk_size;
+   data->ramdisk_size += hdr->vendor_ramdisk_size;
+   end += ALIGN(hdr->vendor_ramdisk_size, hdr->page_size);
+   }
+
+   data->dtb_ptr = end;
+   data->dtb_size = hdr->dtb_size;
+
+   end += ALIGN(hdr->dtb_size, hdr->page_size);
+   end += ALIGN(hdr->vendor_ramdisk_table_size, hdr->page_size);
+   end += ALIGN(hdr->bootconfig_size, hdr->page_size);
+   data->vendor_boot_img_total_size = end - (ulong)hdr;
+}
+
 static void android_boot_image_v0_v1_v2_parse_hdr(const struct 
andr_boot_img_hdr_v0 *hdr,
  struct andr_image_data *data)
 {
@@ -79,10 +138,20 @@ bool android_image_get_data(const void *boot_hdr, const 
void *vendor_boot_hdr,
return false;
}
 
-   if (((struct andr_boot_img_hdr_v0 *)boot_hdr)->header_version > 2)
-   printf("Only boot image header version 2 and below are 
supported\n");
-   else
+   if (((struct andr_boot_img_hdr_v0 *)boot_hdr)->header_version > 2) {
+   if (!vendor_boot_hdr) {
+   printf("For boot header v3+ vendor boot image has to be 
provided\n");
+   return false;
+   }
+   if (!is_android_vendor_boot_image_header(vendor_boot_hdr)) {
+   printf("Incorrect vendor boot image header\n");
+   return false;
+   }
+   android_boot_image_v3_v4_parse_hdr(boot_hdr, data);
+   android_vendor_boot_image_v3_v4_parse_hdr(vendor_boot_hdr, 
data);
+   } else {
android_boot_image_v0_v1_v2_parse_hdr(boot_hdr, data);
+   }
 
return true;
 }
@@ -200,6 +269,11 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0 *hdr,
return 0;
 }
 
+bool is_android_vendor_boot_image_header(const void *vendor_boot_img)
+{
+   return !memcmp(VENDOR_BOOT_MAGIC, vendor_boot_img, 
ANDR_VENDOR_BOOT_MAGIC_SIZE);
+}
+
 bool is_android_boot_image_header(const struct andr_boot_img_hdr_v0 *hdr)
 {
return !memcmp(ANDR_BOOT_MAGIC, hdr, ANDR_BOOT_MAGIC_SIZE);
diff --git a/include/android_image.h b/include/android_image.h
index 5b36f96d7b..351e17750e 100644
--- a/include/android_image.h
+++ b/include/android_image.h
@@ -323,6 +323,8 @@ struct andr_image_

[PATCH v2 08/17] android: boot: boot image header v3, v4 do not support recovery DTBO

2023-01-26 Thread Safae Ouajih
android_image_get_dtbo() is used to get recovery DTBO via abootimg cmd.
This is not supported in boot image header v3 and v4. Thus, we print an
error message when v1,v2 header version are not used.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index a6e7a7abb0..d797270a32 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -316,8 +316,8 @@ bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, 
u32 *size)
goto exit;
}
 
-   if (hdr->header_version < 1) {
-   printf("Error: header_version must be >= 1 to get dtbo\n");
+   if (hdr->header_version != 1 && hdr->header_version != 2) {
+   printf("Error: header version must be >= 1 and <= 2 to get 
dtbo\n");
ret = false;
goto exit;
}
-- 
2.34.1



[PATCH v2 04/17] android: boot: add boot image header v3 and v4 structures

2023-01-26 Thread Safae Ouajih
This adds support for v3/v4 boot image format by adding
the following structures:

- andr_boot_img_hdr_v3 : describes boot image header
- andr_vendor_img_hdr : describes vendor boot image header

These definitions have been copied over from the AOSP documentation at
[1] and [2]

Boot arg sizes are taken from [3]:
commit: 35fb6262bc3f (ANDROID: Support for vendor boot)

This also adds documentation for boot image header v3/v4 structure
that was imported from [4], file: include/bootimg/bootimg.h
commit: 8d0922bfb932 (Adding GKI signature in boot.img v4)

Link:[1] 
https://source.android.com/docs/core/architecture/bootloader/boot-image-header
Link:[2] 
https://source.android.com/docs/core/architecture/bootloader/partitions/vendor-boot-partitions#vendor-boot-header
Link:[3] https://android.googlesource.com/platform/external/u-boot
Link:[4] https://android.googlesource.com/platform/system/tools/mkbootimg

Signed-off-by: Safae Ouajih 
---
 include/android_image.h | 183 +++-
 1 file changed, 182 insertions(+), 1 deletion(-)

diff --git a/include/android_image.h b/include/android_image.h
index 2bdcab9122..4fce363ff7 100644
--- a/include/android_image.h
+++ b/include/android_image.h
@@ -3,7 +3,7 @@
  * This is from the Android Project,
  * Repository: https://android.googlesource.com/platform/system/tools/mkbootimg
  * File: include/bootimg/bootimg.h
- * Commit: e55998a0f2b61b685d5eb4a486ca3a0c680b1a2f
+ * Commit: cce5b1923e3cd2fcb765b512610bdc5c42bc501d
  *
  * Copyright (C) 2007 The Android Open Source Project
  */
@@ -14,11 +14,58 @@
 #include 
 #include 
 
+#define ANDR_GKI_PAGE_SIZE 4096
 #define ANDR_BOOT_MAGIC "ANDROID!"
 #define ANDR_BOOT_MAGIC_SIZE 8
 #define ANDR_BOOT_NAME_SIZE 16
 #define ANDR_BOOT_ARGS_SIZE 512
 #define ANDR_BOOT_EXTRA_ARGS_SIZE 1024
+#define VENDOR_BOOT_MAGIC "VNDRBOOT"
+#define ANDR_VENDOR_BOOT_MAGIC_SIZE 8
+#define ANDR_VENDOR_BOOT_ARGS_SIZE 2048
+#define ANDR_VENDOR_BOOT_NAME_SIZE 16
+
+struct andr_boot_img_hdr_v3 {
+   u8 magic[ANDR_BOOT_MAGIC_SIZE];
+
+   u32 kernel_size;/* size in bytes */
+   u32 ramdisk_size;   /* size in bytes */
+
+   u32 os_version;
+
+   u32 header_size;/* size of boot image header in bytes */
+   u32 reserved[4];
+   u32 header_version; /* offset remains constant for version check */
+
+   u8 cmdline[ANDR_BOOT_ARGS_SIZE + ANDR_BOOT_EXTRA_ARGS_SIZE];
+   /* for boot image header v4 only */
+   u32 signature_size; /* size in bytes */
+};
+
+struct andr_vendor_img_hdr {
+   u8 magic[ANDR_VENDOR_BOOT_MAGIC_SIZE];
+   u32 header_version;
+   u32 page_size;   /* flash page size we assume */
+
+   u32 kernel_addr; /* physical load addr */
+   u32 ramdisk_addr;/* physical load addr */
+
+   u32 vendor_ramdisk_size; /* size in bytes */
+
+   u8 cmdline[ANDR_VENDOR_BOOT_ARGS_SIZE];
+
+   u32 tags_addr;   /* physical addr for kernel tags */
+
+   u8 name[ANDR_VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */
+   u32 header_size; /* size of vendor boot image header in bytes */
+   u32 dtb_size;/* size of dtb image */
+   u64 dtb_addr;/* physical load address */
+   /* for boot image header v4 only */
+   u32 vendor_ramdisk_table_size; /* size in bytes for the vendor ramdisk 
table */
+   u32 vendor_ramdisk_table_entry_num; /* number of entries in the vendor 
ramdisk table */
+   u32 vendor_ramdisk_table_entry_size; /* size in bytes for a vendor 
ramdisk table entry */
+   u32 bootconfig_size; /* size in bytes for the bootconfig section */
+};
 
 /* The bootloader expects the structure of andr_boot_img_hdr_v0 with header
  * version 0 to be as follows: */
@@ -136,4 +183,138 @@ struct andr_boot_img_hdr_v0 {
  *else: jump to kernel_addr
  */
 
+/* When the boot image header has a version of 3, the structure of the boot
+ * image is as follows:
+ *
+ * +-+
+ * | boot header | 4096 bytes
+ * +-+
+ * | kernel  | m pages
+ * +-+
+ * | ramdisk | n pages
+ * +-+
+ *
+ * m = (kernel_size + 4096 - 1) / 4096
+ * n = (ramdisk_size + 4096 - 1) / 4096
+ *
+ * Note that in version 3 of the boot image header, page size is fixed at 4096 
bytes.
+ *
+ * The structure of the vendor boot image (introduced with version 3 and
+ * required to be present when a v3 boot image is used) is as follows:
+ *
+ * +-+
+ * | vendor boot header  | o pages
+ * +-+
+ * | vendor ramdisk  | p pages
+ * +-+
+ * | dtb | q pages
+ * +-+
+ * o = (2112 + page_size - 1) / page_size
+ * p = (vendor_ramdisk_size + page_size - 1) / page_size
+ * q = (dtb_size + page_size - 1) / page_size
+ *
+ * 0. all entities in the boot image are 4096-byte aligned in flash,

[PATCH v2 02/17] android: boot: support vendor boot image in abootimg

2023-01-26 Thread Safae Ouajih
Vendor boot image is introduced in boot image header
version 3 and 4. Please check [1] for more details.

To prepare for boot image v3/v4 support, allow the abootimg command
to store the vendor_boot image address.

Full support for this new format will be done in a future patch.

Link:[1] 
https://source.android.com/docs/core/architecture/bootloader/partitions/vendor-boot-partitions

Signed-off-by: Safae Ouajih 
---
 cmd/abootimg.c | 18 +++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/cmd/abootimg.c b/cmd/abootimg.c
index 0262adb1e5..026c03f91c 100644
--- a/cmd/abootimg.c
+++ b/cmd/abootimg.c
@@ -15,6 +15,7 @@
 
 /* Please use abootimg_addr() macro to obtain the boot image address */
 static ulong _abootimg_addr = -1;
+static ulong _avendor_bootimg_addr = -1;
 
 static int abootimg_get_ver(int argc, char *const argv[])
 {
@@ -158,7 +159,7 @@ static int do_abootimg_addr(struct cmd_tbl *cmdtp, int 
flag, int argc,
char *endp;
ulong img_addr;
 
-   if (argc != 2)
+   if (argc < 2 || argc > 3)
return CMD_RET_USAGE;
 
img_addr = hextoul(argv[1], );
@@ -168,6 +169,17 @@ static int do_abootimg_addr(struct cmd_tbl *cmdtp, int 
flag, int argc,
}
 
_abootimg_addr = img_addr;
+
+   if (argc == 3) {
+   img_addr = simple_strtoul(argv[2], , 16);
+   if (*endp != '\0') {
+   printf("Error: Wrong vendor image address\n");
+   return CMD_RET_FAILURE;
+   }
+
+   _avendor_bootimg_addr = img_addr;
+   }
+
return CMD_RET_SUCCESS;
 }
 
@@ -211,7 +223,7 @@ static int do_abootimg_dump(struct cmd_tbl *cmdtp, int 
flag, int argc,
 }
 
 static struct cmd_tbl cmd_abootimg_sub[] = {
-   U_BOOT_CMD_MKENT(addr, 2, 1, do_abootimg_addr, "", ""),
+   U_BOOT_CMD_MKENT(addr, 3, 1, do_abootimg_addr, "", ""),
U_BOOT_CMD_MKENT(dump, 2, 1, do_abootimg_dump, "", ""),
U_BOOT_CMD_MKENT(get, 5, 1, do_abootimg_get, "", ""),
 };
@@ -239,7 +251,7 @@ static int do_abootimg(struct cmd_tbl *cmdtp, int flag, int 
argc,
 U_BOOT_CMD(
abootimg, CONFIG_SYS_MAXARGS, 0, do_abootimg,
"manipulate Android Boot Image",
-   "addr \n"
+   "addr  []>\n"
"- set the address in RAM where boot image is located\n"
"  ($loadaddr is used by default)\n"
"abootimg dump dtb\n"
-- 
2.34.1



[PATCH v2 03/17] android: boot: replace android_image_check_header

2023-01-26 Thread Safae Ouajih
With the new vendor boot image introduced in versions 3 and 4
of boot image header, the header check must be done for both boot
image and vendor boot image. Thus, android_image_check_header() is
being replaced by is_android_boot_image_header() to only refer to
boot image header check.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c  | 8 
 boot/image-board.c| 2 +-
 cmd/abootimg.c| 4 ++--
 drivers/fastboot/fb_mmc.c | 3 +--
 include/image.h   | 2 +-
 5 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index 8c0a304cc0..ed51e8b47e 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -122,9 +122,9 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0 *hdr, int verify,
return 0;
 }
 
-int android_image_check_header(const struct andr_boot_img_hdr_v0 *hdr)
+bool is_android_boot_image_header(const struct andr_boot_img_hdr_v0 *hdr)
 {
-   return memcmp(ANDR_BOOT_MAGIC, hdr->magic, ANDR_BOOT_MAGIC_SIZE);
+   return !memcmp(ANDR_BOOT_MAGIC, hdr, ANDR_BOOT_MAGIC_SIZE);
 }
 
 ulong android_image_get_end(const struct andr_boot_img_hdr_v0 *hdr)
@@ -231,7 +231,7 @@ bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, 
u32 *size)
bool ret = true;
 
hdr = map_sysmem(hdr_addr, sizeof(*hdr));
-   if (android_image_check_header(hdr)) {
+   if (!is_android_boot_image_header(hdr)) {
printf("Error: Boot Image header is incorrect\n");
ret = false;
goto exit;
@@ -280,7 +280,7 @@ static bool android_image_get_dtb_img_addr(ulong hdr_addr, 
ulong *addr)
bool ret = true;
 
hdr = map_sysmem(hdr_addr, sizeof(*hdr));
-   if (android_image_check_header(hdr)) {
+   if (!is_android_boot_image_header(hdr)) {
printf("Error: Boot Image header is incorrect\n");
ret = false;
goto exit;
diff --git a/boot/image-board.c b/boot/image-board.c
index e5d71a3d54..9295b6d0c8 100644
--- a/boot/image-board.c
+++ b/boot/image-board.c
@@ -284,7 +284,7 @@ int genimg_get_format(const void *img_addr)
return IMAGE_FORMAT_FIT;
}
if (IS_ENABLED(CONFIG_ANDROID_BOOT_IMAGE) &&
-   !android_image_check_header(img_addr))
+   is_android_boot_image_header(img_addr))
return IMAGE_FORMAT_ANDROID;
 
return IMAGE_FORMAT_INVALID;
diff --git a/cmd/abootimg.c b/cmd/abootimg.c
index 026c03f91c..b5cfb141ef 100644
--- a/cmd/abootimg.c
+++ b/cmd/abootimg.c
@@ -26,7 +26,7 @@ static int abootimg_get_ver(int argc, char *const argv[])
return CMD_RET_USAGE;
 
hdr = map_sysmem(abootimg_addr(), sizeof(*hdr));
-   if (android_image_check_header(hdr)) {
+   if (!is_android_boot_image_header(hdr)) {
printf("Error: Boot Image header is incorrect\n");
res = CMD_RET_FAILURE;
goto exit;
@@ -73,7 +73,7 @@ static int abootimg_get_dtb_load_addr(int argc, char *const 
argv[])
return CMD_RET_USAGE;
 
hdr = map_sysmem(abootimg_addr(), sizeof(*hdr));
-   if (android_image_check_header(hdr)) {
+   if (!is_android_boot_image_header(hdr)) {
printf("Error: Boot Image header is incorrect\n");
res = CMD_RET_FAILURE;
goto exit;
diff --git a/drivers/fastboot/fb_mmc.c b/drivers/fastboot/fb_mmc.c
index 6d0112fdf4..086e5f7843 100644
--- a/drivers/fastboot/fb_mmc.c
+++ b/drivers/fastboot/fb_mmc.c
@@ -313,8 +313,7 @@ static lbaint_t fb_mmc_get_boot_header(struct blk_desc 
*dev_desc,
}
 
/* Check boot header magic string */
-   res = android_image_check_header(hdr);
-   if (res != 0) {
+   if (!is_android_boot_image_header(hdr)) {
pr_err("bad boot image magic\n");
fastboot_fail("boot partition not initialized", response);
return 0;
diff --git a/include/image.h b/include/image.h
index bcb24d92de..c1594ee169 100644
--- a/include/image.h
+++ b/include/image.h
@@ -1735,7 +1735,6 @@ int fit_image_cipher_get_algo(const void *fit, int 
noffset, char **algo);
 struct cipher_algo *image_get_cipher_algo(const char *full_name);
 
 struct andr_boot_img_hdr_v0;
-int android_image_check_header(const struct andr_boot_img_hdr_v0 *hdr);
 int android_image_get_kernel(const struct andr_boot_img_hdr_v0 *hdr, int 
verify,
 ulong *os_data, ulong *os_len);
 int android_image_get_ramdisk(const struct andr_boot_img_hdr_v0 *hdr,
@@ -1750,6 +1749,7 @@ ulong android_image_get_kload(const struct 
andr_boot_img_hdr_v0 *hdr);
 ulong android_image_get_kcomp(const struct andr_boot_img_hdr_v0 *hdr);
 void android_print_contents(const struct andr_boot_img_hdr_v0 *hdr);
 bool android_image_print_dtb_contents(ulong hdr_addr);
+b

[PATCH v2 05/17] android: boot: kcomp: support andr_image_data

2023-01-26 Thread Safae Ouajih
andr_image_data structure is used as a global representation of
boot image header structure. This new structure is introduced to
support all boot header versions : v0,v1.v2.v3.v4 and will be used
to support v3 and v4 while maitaining support for v0,v1,v2. The need
of using andr_image_data comes from the change of header structure in
both version 3 and 4.

android_image_get_kcomp() is reworked to support this new struct.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c| 75 -
 include/android_image.h | 27 +++
 include/image.h |  2 ++
 3 files changed, 103 insertions(+), 1 deletion(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index ed51e8b47e..487223d850 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -18,6 +18,74 @@
 
 static char andr_tmp_str[ANDR_BOOT_ARGS_SIZE + 1];
 
+static void android_boot_image_v0_v1_v2_parse_hdr(const struct 
andr_boot_img_hdr_v0 *hdr,
+ struct andr_image_data *data)
+{
+   ulong end;
+
+   data->image_name = hdr->name;
+   data->kcmdline = hdr->cmdline;
+   data->kernel_addr = hdr->kernel_addr;
+   data->ramdisk_addr = hdr->ramdisk_addr;
+   data->header_version = hdr->header_version;
+   data->dtb_load_addr = hdr->dtb_addr;
+
+   end = (ulong)hdr;
+
+   /*
+* The header takes a full page, the remaining components are aligned
+* on page boundary
+*/
+
+   end += hdr->page_size;
+
+   data->kernel_ptr = end;
+   data->kernel_size = hdr->kernel_size;
+   end += ALIGN(hdr->kernel_size, hdr->page_size);
+
+   data->ramdisk_ptr = end;
+   data->ramdisk_size = hdr->ramdisk_size;
+   end += ALIGN(hdr->ramdisk_size, hdr->page_size);
+
+   data->second_ptr = end;
+   data->second_size = hdr->second_size;
+   end += ALIGN(hdr->second_size, hdr->page_size);
+
+   if (hdr->header_version >= 1) {
+   data->recovery_dtbo_ptr = end;
+   data->recovery_dtbo_size = hdr->recovery_dtbo_size;
+   end += ALIGN(hdr->recovery_dtbo_size, hdr->page_size);
+   }
+
+   if (hdr->header_version >= 2) {
+   data->dtb_ptr = end;
+   data->dtb_size = hdr->dtb_size;
+   end += ALIGN(hdr->dtb_size, hdr->page_size);
+   }
+
+   data->boot_img_total_size = end - (ulong)hdr;
+}
+
+bool android_image_get_data(const void *boot_hdr, struct andr_image_data *data)
+{
+   if (!boot_hdr || !data) {
+   printf("boot_hdr or data params can't be NULL\n");
+   return false;
+   }
+
+   if (!is_android_boot_image_header(boot_hdr)) {
+   printf("Incorrect boot image header\n");
+   return false;
+   }
+
+   if (((struct andr_boot_img_hdr_v0 *)boot_hdr)->header_version > 2)
+   printf("Only boot image header version 2 and below are 
supported\n");
+   else
+   android_boot_image_v0_v1_v2_parse_hdr(boot_hdr, data);
+
+   return true;
+}
+
 static ulong android_image_get_kernel_addr(const struct andr_boot_img_hdr_v0 
*hdr)
 {
/*
@@ -157,8 +225,13 @@ ulong android_image_get_kload(const struct 
andr_boot_img_hdr_v0 *hdr)
 
 ulong android_image_get_kcomp(const struct andr_boot_img_hdr_v0 *hdr)
 {
-   const void *p = (void *)((uintptr_t)hdr + hdr->page_size);
+   struct andr_image_data img_data;
+   const void *p;
+
+   if (!android_image_get_data(hdr, _data))
+   return -EINVAL;
 
+   p = (const void *)img_data.kernel_ptr;
if (image_get_magic((struct legacy_img_hdr *)p) == IH_MAGIC)
return image_get_comp((struct legacy_img_hdr *)p);
else if (get_unaligned_le32(p) == LZ4F_MAGIC)
diff --git a/include/android_image.h b/include/android_image.h
index 4fce363ff7..5b36f96d7b 100644
--- a/include/android_image.h
+++ b/include/android_image.h
@@ -317,4 +317,31 @@ struct andr_boot_img_hdr_v0 {
  *contained outside boot and vendor boot partitions), otherwise
  *jump to kernel_addr
  */
+
+/* Private struct */
+struct andr_image_data {
+   ulong kernel_ptr;
+   u32 kernel_size;
+   u32 ramdisk_size;
+   u32 boot_ramdisk_size;
+   ulong second_ptr;
+   u32 second_size;
+   ulong dtb_ptr;
+   u32 dtb_size;
+   ulong recovery_dtbo_ptr;
+   u32 recovery_dtbo_size;
+
+   const char *kcmdline;
+   const char *kcmdline_extra;
+   const char *image_name;
+
+   u32 kernel_addr;
+   ulong ramdisk_addr;
+   ulong ramdisk_ptr;
+   ulong dtb_load_addr;
+   ulong tags_addr;
+   u32 header_version;
+   u32 boot_img_total_size;
+};
+
 #endif
diff --git a/include/image.h b/include/image.h
index c1594ee1

[PATCH v2 01/17] android: boot: rename andr_img_hdr -> andr_boot_img_hdr_v0

2023-01-26 Thread Safae Ouajih
Android introduced boot header version 3 or 4.
The header structure change with version 3 and 4 to support
the new updates such as:
- Introducing Vendor boot image: with a vendor ramdisk
- Bootconfig feature (v4)

To maintain support for version v0, v1 and v2 while introducing
version 3 and 4, this struct name must change to refer to the header
structure before v3.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c  | 26 +-
 boot/image-fdt.c  |  2 +-
 cmd/abootimg.c|  4 ++--
 drivers/fastboot/fb_mmc.c |  8 
 include/android_image.h   |  4 ++--
 include/image.h   | 18 +-
 6 files changed, 31 insertions(+), 31 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index 2628db3741..8c0a304cc0 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -18,7 +18,7 @@
 
 static char andr_tmp_str[ANDR_BOOT_ARGS_SIZE + 1];
 
-static ulong android_image_get_kernel_addr(const struct andr_img_hdr *hdr)
+static ulong android_image_get_kernel_addr(const struct andr_boot_img_hdr_v0 
*hdr)
 {
/*
 * All the Android tools that generate a boot.img use this
@@ -59,7 +59,7 @@ static ulong android_image_get_kernel_addr(const struct 
andr_img_hdr *hdr)
  * Return: Zero, os start address and length on success,
  * otherwise on failure.
  */
-int android_image_get_kernel(const struct andr_img_hdr *hdr, int verify,
+int android_image_get_kernel(const struct andr_boot_img_hdr_v0 *hdr, int 
verify,
 ulong *os_data, ulong *os_len)
 {
u32 kernel_addr = android_image_get_kernel_addr(hdr);
@@ -122,12 +122,12 @@ int android_image_get_kernel(const struct andr_img_hdr 
*hdr, int verify,
return 0;
 }
 
-int android_image_check_header(const struct andr_img_hdr *hdr)
+int android_image_check_header(const struct andr_boot_img_hdr_v0 *hdr)
 {
return memcmp(ANDR_BOOT_MAGIC, hdr->magic, ANDR_BOOT_MAGIC_SIZE);
 }
 
-ulong android_image_get_end(const struct andr_img_hdr *hdr)
+ulong android_image_get_end(const struct andr_boot_img_hdr_v0 *hdr)
 {
ulong end;
 
@@ -150,12 +150,12 @@ ulong android_image_get_end(const struct andr_img_hdr 
*hdr)
return end;
 }
 
-ulong android_image_get_kload(const struct andr_img_hdr *hdr)
+ulong android_image_get_kload(const struct andr_boot_img_hdr_v0 *hdr)
 {
return android_image_get_kernel_addr(hdr);
 }
 
-ulong android_image_get_kcomp(const struct andr_img_hdr *hdr)
+ulong android_image_get_kcomp(const struct andr_boot_img_hdr_v0 *hdr)
 {
const void *p = (void *)((uintptr_t)hdr + hdr->page_size);
 
@@ -167,7 +167,7 @@ ulong android_image_get_kcomp(const struct andr_img_hdr 
*hdr)
return image_decomp_type(p, sizeof(u32));
 }
 
-int android_image_get_ramdisk(const struct andr_img_hdr *hdr,
+int android_image_get_ramdisk(const struct andr_boot_img_hdr_v0 *hdr,
  ulong *rd_data, ulong *rd_len)
 {
if (!hdr->ramdisk_size) {
@@ -186,7 +186,7 @@ int android_image_get_ramdisk(const struct andr_img_hdr 
*hdr,
return 0;
 }
 
-int android_image_get_second(const struct andr_img_hdr *hdr,
+int android_image_get_second(const struct andr_boot_img_hdr_v0 *hdr,
  ulong *second_data, ulong *second_len)
 {
if (!hdr->second_size) {
@@ -226,7 +226,7 @@ int android_image_get_second(const struct andr_img_hdr *hdr,
  */
 bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, u32 *size)
 {
-   const struct andr_img_hdr *hdr;
+   const struct andr_boot_img_hdr_v0 *hdr;
ulong dtbo_img_addr;
bool ret = true;
 
@@ -275,7 +275,7 @@ exit:
  */
 static bool android_image_get_dtb_img_addr(ulong hdr_addr, ulong *addr)
 {
-   const struct andr_img_hdr *hdr;
+   const struct andr_boot_img_hdr_v0 *hdr;
ulong dtb_img_addr;
bool ret = true;
 
@@ -328,7 +328,7 @@ exit:
 bool android_image_get_dtb_by_index(ulong hdr_addr, u32 index, ulong *addr,
u32 *size)
 {
-   const struct andr_img_hdr *hdr;
+   const struct andr_boot_img_hdr_v0 *hdr;
bool res;
ulong dtb_img_addr; /* address of DTB part in boot image */
u32 dtb_img_size;   /* size of DTB payload in boot image */
@@ -393,7 +393,7 @@ bool android_image_get_dtb_by_index(ulong hdr_addr, u32 
index, ulong *addr,
  * returns:
  * no returned results
  */
-void android_print_contents(const struct andr_img_hdr *hdr)
+void android_print_contents(const struct andr_boot_img_hdr_v0 *hdr)
 {
const char * const p = IMAGE_INDENT_STRING;
/* os_version = ver << 11 | lvl */
@@ -485,7 +485,7 @@ static bool android_image_print_dtb_info(const struct 
fdt_header *fdt,
  */
 bool android_image_print_dtb_contents(ulong hdr_addr)
 {
-   const struct andr_img_hdr *hdr;
+   const struct andr_boot_img_hdr_v0 *hdr;
bool res;

[PATCH v2 00/17] Support android boot image v3/v4

2023-01-26 Thread Safae Ouajih
Hello everyone,

* This is based on Roman Stratiienko's work to support boot image header 
version 3 and 4.

* This supports the new boot image headers v3, v4 and bootconfig feature.
https://source.android.com/docs/core/architecture/bootloader/boot-image-header
https://source.android.com/docs/core/architecture/bootloader/implementing-bootconfig

- Tested on Amlogic Khadas vim3l, a reference board for Android Open Source 
Project
  https://www.khadas.com/vim3l

  And on AM625 Texas Instruments board with 5.10 linux kernel

Main changes :
- New partition : vendor boot, with a specific vendor ramdisk
- DTB is stored in the vendor boot partition
- The generic ramdisk is placed after the vendor ramdisk
- Bootconfig feature support


Here is a link to see the related android boot flow changes on KHADAS vim3l as 
an example:
https://gitlab.baylibre.com/baylibre/amlogic/atv/u-boot/-/commits/souajih/BootImagev4/

Changes in v2:
- Rework parts of the code to fix the abootimg test: test_abootimg
- Update test_abootimg to support boot image header v4
- Remove LIBXBC library, import and adapt the functions to support bootconfig 
feature
- Rename the used structures :
andr_boot_img_hdr_v0_v1_v2 -> andr_boot_img_hdr_v0
andr_boot_img_hdr_v3_v4 -> andr_boot_img_hdr_v3
andr_vendor_boot_img_hdr_v3_v4 -> andr_vendor_img_hdr

Safae Ouajih (17):
  android: boot: rename andr_img_hdr -> andr_boot_img_hdr_v0
  android: boot: support vendor boot image in abootimg
  android: boot: replace android_image_check_header
  android: boot: add boot image header v3 and v4 structures
  android: boot: kcomp: support andr_image_data
  android: boot: move to andr_image_data structure
  android: boot: content print is not supported for v3,v4 header version
  android: boot: boot image header v3,v4 do not support recovery DTBO
  android: boot: add vendor boot image to prepare for v3,v4 support
  android: boot: update android_image_get_data to support v3,v4
  android: boot: ramdisk: support vendor ramdisk
  android: boot: support extra command line
  android: boot: update android_image_get_dtb_img_addr to support v3,v4
  drivers: fastboot: zImage flashing is not supported for v3,v4
  android: boot: support boot image header version 3 and 4
  android: boot: support bootconfig
  test/py: android: extend abootimg test

 boot/bootm.c|  29 +-
 boot/image-android.c| 467 
 boot/image-board.c  |  15 +-
 boot/image-fdt.c|   5 +-
 cmd/abootimg.c  |  75 +++-
 drivers/fastboot/fb_mmc.c   |  19 +-
 include/android_image.h | 228 +-
 include/image.h |  37 +-
 test/py/tests/test_android/test_abootimg.py | 135 +-
 9 files changed, 850 insertions(+), 160 deletions(-)

--
2.34.1



Re: [PATCH 00/17] Support android boot image v3/v4

2023-01-06 Thread safae ouajih




On 04/01/2023 21:01, Simon Glass wrote:

Hi Safae,

On Wed, 4 Jan 2023 at 02:02, safae ouajih  wrote:


On 30/12/2022 02:48, Tom Rini wrote:

On Sat, 26 Nov 2022 17:59:14 +0100, Safae Ouajih wrote:


* This is based on Roman Stratiienko's work to support boot image header 
version 3 and 4.

* This supports the new boot image headers v3, v4 and bootconfig feature.
https://source.android.com/docs/core/architecture/bootloader/boot-image-header
https://source.android.com/docs/core/architecture/bootloader/implementing-bootconfig

- Tested on Amlogic Khadas vim3l, a reference board for Android Open Source 
Project
https://www.khadas.com/vim3l

[...]


This series causes the test/py/tests/test_android/test_abootimg.py tests to
fail:
FAILED test/py/tests/test_android/test_abootimg.py::test_abootimg - ValueError: 
U-Boot exite...
and likely that test needs to be expanded for these new formats too.



Hello Tom,

Thank you for reporting the failure. This will be fixed in a v2.


Please also update the test as requested.

Regards,
Simon


Hello Simon,

I am working on the test update. This will be in a v2.

Thank you.

Best Regards,

--
Safae



Re: [PATCH 00/17] Support android boot image v3/v4

2023-01-04 Thread safae ouajih

On 30/12/2022 02:48, Tom Rini wrote:

On Sat, 26 Nov 2022 17:59:14 +0100, Safae Ouajih wrote:


* This is based on Roman Stratiienko's work to support boot image header 
version 3 and 4.

* This supports the new boot image headers v3, v4 and bootconfig feature.
https://source.android.com/docs/core/architecture/bootloader/boot-image-header
https://source.android.com/docs/core/architecture/bootloader/implementing-bootconfig

- Tested on Amlogic Khadas vim3l, a reference board for Android Open Source 
Project
   https://www.khadas.com/vim3l

[...]


This series causes the test/py/tests/test_android/test_abootimg.py tests to
fail:
FAILED test/py/tests/test_android/test_abootimg.py::test_abootimg - ValueError: 
U-Boot exite...
and likely that test needs to be expanded for these new formats too.



Hello Tom,

Thank you for reporting the failure. This will be fixed in a v2.

Best Regards,

--
Safae




Re: [PATCH 01/17] android: boot: rename andr_img_hdr -> andr_boot_img_hdr_v0_v1_v2

2022-11-29 Thread Safae Ouajih
On Mon, 28 Nov 2022 11:08:20 -0500
Sean Anderson  wrote:

> On 11/26/22 11:59, Safae Ouajih wrote:
> > [You don't often get email from soua...@baylibre.com. Learn why this is 
> > important at https://aka.ms/LearnAboutSenderIdentification ]
> > 
> > Android introduced boot header version 3 or 4.
> > The header structure change with version 3 and 4 to support
> > the new updates such as:
> > - Introducing Vendor boot image: with a vendor ramdisk
> > - Bootconfig feature (v4)
> > 
> > To maintain support for version v0, v1 and v2 while introducing
> > version 3 and 4, this struct name must change to refer to the header
> > structure before v3.
> > 
> > Signed-off-by: Safae Ouajih 
> > ---
> >  boot/image-android.c  | 26 +-
> >  boot/image-fdt.c  |  2 +-
> >  cmd/abootimg.c|  4 ++--
> >  drivers/fastboot/fb_mmc.c |  8 
> >  include/android_image.h   |  4 ++--
> >  include/image.h   | 18 +-
> >  6 files changed, 31 insertions(+), 31 deletions(-)
> > 
> > diff --git a/boot/image-android.c b/boot/image-android.c
> > index 2628db374121..926d94ecbe8e 100644
> > --- a/boot/image-android.c
> > +++ b/boot/image-android.c
> > @@ -18,7 +18,7 @@
> > 
> >  static char andr_tmp_str[ANDR_BOOT_ARGS_SIZE + 1];
> > 
> > -static ulong android_image_get_kernel_addr(const struct andr_img_hdr *hdr)
> > +static ulong android_image_get_kernel_addr(const struct 
> > andr_boot_img_hdr_v0_v1_v2 *hdr)
> 
> This line is too long. You will have to break it like
> 
> static ulong 
> android_image_get_kernel_addr(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
> 
> But really, this is because your struct name is too long. Can we use
> something like andr_img_hdr_v0 instead? I would like to have only one
> version in the struct name because then there is no urge to update the
> name when e.g. v5 comes out with mostly the same format. And _boot adds
> nothing.
> 
> --Sean
> 

Hello Sean,

Thank you for your review.

Since vendor boot image is introduced, we need to differentiate it from the 
boot image. Thus,
I suggest to use :
andr_boot_img_hdr_v0 and andr_boot_img_hdr_v3 for the boot image
andr_vendor_img_hdr for the vendor boot image

--Safae

> >  {
> > /*
> >  * All the Android tools that generate a boot.img use this
> > @@ -59,7 +59,7 @@ static ulong android_image_get_kernel_addr(const struct 
> > andr_img_hdr *hdr)
> >   * Return: Zero, os start address and length on success,
> >   * otherwise on failure.
> >   */
> > -int android_image_get_kernel(const struct andr_img_hdr *hdr, int verify,
> > +int android_image_get_kernel(const struct andr_boot_img_hdr_v0_v1_v2 *hdr, 
> > int verify,
> >  ulong *os_data, ulong *os_len)
> >  {
> > u32 kernel_addr = android_image_get_kernel_addr(hdr);
> > @@ -122,12 +122,12 @@ int android_image_get_kernel(const struct 
> > andr_img_hdr *hdr, int verify,
> > return 0;
> >  }
> > 
> > -int android_image_check_header(const struct andr_img_hdr *hdr)
> > +int android_image_check_header(const struct andr_boot_img_hdr_v0_v1_v2 
> > *hdr)
> >  {
> > return memcmp(ANDR_BOOT_MAGIC, hdr->magic, ANDR_BOOT_MAGIC_SIZE);
> >  }
> > 
> > -ulong android_image_get_end(const struct andr_img_hdr *hdr)
> > +ulong android_image_get_end(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
> >  {
> > ulong end;
> > 
> > @@ -150,12 +150,12 @@ ulong android_image_get_end(const struct andr_img_hdr 
> > *hdr)
> > return end;
> >  }
> > 
> > -ulong android_image_get_kload(const struct andr_img_hdr *hdr)
> > +ulong android_image_get_kload(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
> >  {
> > return android_image_get_kernel_addr(hdr);
> >  }
> > 
> > -ulong android_image_get_kcomp(const struct andr_img_hdr *hdr)
> > +ulong android_image_get_kcomp(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
> >  {
> > const void *p = (void *)((uintptr_t)hdr + hdr->page_size);
> > 
> > @@ -167,7 +167,7 @@ ulong android_image_get_kcomp(const struct andr_img_hdr 
> > *hdr)
> > return image_decomp_type(p, sizeof(u32));
> >  }
> > 
> > -int android_image_get_ramdisk(const struct andr_img_hdr *hdr,
> > +int android_image_get_ramdisk(const struct andr_boot_img_hdr_v0_v1_v2 *hdr,
> >   ulong *rd_data, ulong *rd_len)
> >  {
> 

[PATCH 16/17] lib: support libxbc

2022-11-26 Thread Safae Ouajih
This adds support for libxbc used to support Bootconfig feature.
Bootconfig documentation : [1]
This was imported from [2], commit [3]

[1] 
https://source.android.com/docs/core/architecture/bootloader/implementing-bootconfig
[2] https://android.googlesource.com/platform/external/u-boot/
[3] `7af0a0506d4de6f5ea147d10fb0664a8af07d326`

Signed-off-by: Safae Ouajih 
---
 include/xbc.h   |   1 +
 lib/Kconfig |  12 +
 lib/Makefile|   1 +
 lib/libxbc/Makefile |   1 +
 lib/libxbc/libxbc.c | 112 
 lib/libxbc/libxbc.h |  54 +
 6 files changed, 181 insertions(+)
 create mode 100644 include/xbc.h
 create mode 100644 lib/libxbc/Makefile
 create mode 100644 lib/libxbc/libxbc.c
 create mode 100644 lib/libxbc/libxbc.h

diff --git a/include/xbc.h b/include/xbc.h
new file mode 100644
index ..725e65ff6ad8
--- /dev/null
+++ b/include/xbc.h
@@ -0,0 +1 @@
+#include <../lib/libxbc/libxbc.h>
diff --git a/lib/Kconfig b/lib/Kconfig
index 6abe1d0a863b..eca752b7db79 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -417,6 +417,18 @@ config LIBAVB
 
 endmenu
 
+menu "Android Boot Configuration"
+config LIBXBC
+   bool "Android Boot Configuration support"
+   depends on ANDROID_BOOT_IMAGE
+   default n
+   help
+ This enables support of Boot Configuration which can be used
+ to pass boot configuration parameters to user space. These
+ parameters will show up in /proc/bootconfig similar to the kernel
+ parameters that show up in /proc/cmdline
+endmenu
+
 menu "Hashing Support"
 
 config BLAKE2
diff --git a/lib/Makefile b/lib/Makefile
index f2cfd1e42892..b0ad522ac116 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -87,6 +87,7 @@ obj-$(CONFIG_$(SPL_)LZ4) += lz4_wrapper.o
 obj-$(CONFIG_$(SPL_)LIB_RATIONAL) += rational.o
 
 obj-$(CONFIG_LIBAVB) += libavb/
+obj-$(CONFIG_LIBXBC) += libxbc/
 
 obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += libfdt/
 obj-$(CONFIG_$(SPL_TPL_)OF_REAL) += fdtdec_common.o fdtdec.o
diff --git a/lib/libxbc/Makefile b/lib/libxbc/Makefile
new file mode 100644
index ..7ac4cde05666
--- /dev/null
+++ b/lib/libxbc/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_LIBXBC) += libxbc.o
diff --git a/lib/libxbc/libxbc.c b/lib/libxbc/libxbc.c
new file mode 100644
index ..129bffc7c628
--- /dev/null
+++ b/lib/libxbc/libxbc.c
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "libxbc.h"
+#define BOOTCONFIG_MAGIC "#BOOTCONFIG\n"
+#define BOOTCONFIG_MAGIC_SIZE 12
+#define BOOTCONFIG_SIZE_SIZE 4
+#define BOOTCONFIG_CHECKSUM_SIZE 4
+#define BOOTCONFIG_TRAILER_SIZE BOOTCONFIG_MAGIC_SIZE + \
+BOOTCONFIG_SIZE_SIZE + \
+BOOTCONFIG_CHECKSUM_SIZE
+
+/*
+ * Simple checksum for a buffer.
+ *
+ * @param addr pointer to the start of the buffer.
+ * @param size size of the buffer in bytes.
+ * @return check sum result.
+ */
+static uint32_t checksum(const unsigned char* const buffer, uint32_t size) {
+uint32_t sum = 0;
+for (uint32_t i = 0; i < size; i++) {
+sum += buffer[i];
+}
+return sum;
+}
+
+/*
+ * Check if the bootconfig trailer is present within the bootconfig section.
+ *
+ * @param bootconfig_end_addr address of the end of the bootconfig section. If
+ *the trailer is present, it will be directly preceding this address.
+ * @return true if the trailer is present, false if not.
+ */
+static bool isTrailerPresent(uint64_t bootconfig_end_addr) {
+return !strncmp((char*)(bootconfig_end_addr - BOOTCONFIG_MAGIC_SIZE),
+BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_SIZE);
+}
+
+/*
+ * Add a string of boot config parameters to memory appended by the trailer.
+ */
+int32_t addBootConfigParameters(char* params, uint32_t params_size,
+uint64_t bootconfig_start_addr, uint32_t bootconfig_size) {
+if (!params || !bootconfig_start_addr) {
+return -1;
+}
+if (params_size == 0) {
+return 0;
+}
+int32_t applied_bytes = 0;
+int32_t new_size = 0;
+uint64_t end = bootconfig_start_addr + bootconfig_size;
+if (isTrailerPresent(end)) {
+  end -= BOOTCONFIG_TRAILER_SIZE;
+  applied_bytes -= BOOTCONFIG_TRAILER_SIZE;
+  memcpy(_size, (void *)end, BOOTCONFIG_SIZE_SIZE);
+  

[PATCH 17/17] android: boot: support bootconfig

2022-11-26 Thread Safae Ouajih
This adds support for Bootconfig feature.
- The bootconfig feature replaces the androidboot.*
  kernel cmdline options.
- CONFIG_LIBXBC must be enabled

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c| 22 +-
 include/android_image.h |  3 +++
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index 557047660bc3..1c4d21e945a1 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -14,6 +14,10 @@
 #include 
 #include 
 
+#ifdef CONFIG_LIBXB
+#include 
+#endif
+
 #define ANDROID_IMAGE_DEFAULT_KERNEL_ADDR  0x10008000
 
 static char andr_tmp_str[ANDR_BOOT_ARGS_SIZE + 1];
@@ -60,6 +64,7 @@ static void android_vendor_boot_image_v3_v4_parse_hdr(const 
struct andr_vendor_b
data->image_name = hdr->name;
data->kernel_addr = hdr->kernel_addr;
data->ramdisk_addr = hdr->ramdisk_addr;
+   data->bootconfig_size = hdr->bootconfig_size;
end = (ulong)hdr;
end += hdr->page_size;
if (hdr->vendor_ramdisk_size) {
@@ -74,7 +79,15 @@ static void android_vendor_boot_image_v3_v4_parse_hdr(const 
struct andr_vendor_b
 
end += ALIGN(hdr->dtb_size, hdr->page_size);
end += ALIGN(hdr->vendor_ramdisk_table_size, hdr->page_size);
-   end += ALIGN(hdr->bootconfig_size, hdr->page_size);
+#ifdef CONFIG_LIBXB
+   data->bootconfig_addr = end;
+   if (hdr->bootconfig_size) {
+   data->bootconfig_size += 
addBootConfigTrailer(data->bootconfig_addr,
+ 
data->bootconfig_size);
+   data->ramdisk_size += data->bootconfig_size;
+   }
+#endif
+   end += ALIGN(data->bootconfig_size, hdr->page_size);
data->vendor_boot_img_total_size = end - (ulong)hdr;
 }
 
@@ -351,6 +364,13 @@ int android_image_get_ramdisk(const void *hdr, const void 
*vendor_boot_img,
   img_data.vendor_ramdisk_size);
memcpy((void *)(ramdisk_ptr + img_data.vendor_ramdisk_size),
   (void *)img_data.ramdisk_ptr, 
img_data.boot_ramdisk_size);
+#ifdef CONFIG_LIBXB
+   if (img_data.bootconfig_size) {
+   memcpy((void *)(ramdisk_ptr + 
img_data.vendor_ramdisk_size +
+  img_data.boot_ramdisk_size), (void 
*)img_data.bootconfig_addr,
+  img_data.bootconfig_size);
+   }
+#endif
}
 
printf("RAM disk load addr 0x%08lx size %u KiB\n",
diff --git a/include/android_image.h b/include/android_image.h
index b9591633c9f7..17412a609320 100644
--- a/include/android_image.h
+++ b/include/android_image.h
@@ -333,6 +333,9 @@ struct andr_image_data {
ulong recovery_dtbo_ptr;
u32 recovery_dtbo_size;
 
+   ulong bootconfig_addr;
+   ulong bootconfig_size;
+
const char *kcmdline;
const char *kcmdline_extra;
const char *image_name;
-- 
2.25.1



[PATCH 15/17] android: boot: support boot image header version 3 and 4

2022-11-26 Thread Safae Ouajih
This enables the support for boot image header version 3 and 4
using abootimg command.

In order to use version 3 or 4:

1- Vendor boot image address should be given to abootimg cmd.

abootimg addr $1 $vendor_boot_load_addr

2- "ramdisk_addr_r" env variable (ramdisk address) should be set to host
the ramdisk : generic ramdisk + vendor ramdisk

"struct andr_boot_img_hdr_v0_v1_v2*" is replaced by "void *" in
some functions since v3 and v4 are now supported as well.

Signed-off-by: Safae Ouajih 
---
 boot/bootm.c | 29 -
 boot/image-android.c | 16 ++--
 boot/image-board.c   | 14 +++---
 boot/image-fdt.c |  2 +-
 cmd/abootimg.c   | 16 ++--
 include/image.h  | 14 --
 6 files changed, 68 insertions(+), 23 deletions(-)

diff --git a/boot/bootm.c b/boot/bootm.c
index e44dc550077d..c0f9b2722d1f 100644
--- a/boot/bootm.c
+++ b/boot/bootm.c
@@ -113,6 +113,10 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, 
int argc,
 char *const argv[])
 {
const void *os_hdr;
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+   const void *vendor_boot_img;
+   const void *boot_img;
+#endif
bool ep_found = false;
int ret;
 
@@ -181,12 +185,17 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, 
int argc,
 #endif
 #ifdef CONFIG_ANDROID_BOOT_IMAGE
case IMAGE_FORMAT_ANDROID:
+   boot_img = os_hdr;
+   vendor_boot_img = NULL;
+   if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) {
+   boot_img = (void *)get_abootimg_addr();
+   vendor_boot_img = (void *)get_avendor_bootimg_addr();
+   }
images.os.type = IH_TYPE_KERNEL;
-   images.os.comp = android_image_get_kcomp(os_hdr, NULL);
+   images.os.comp = android_image_get_kcomp(boot_img, 
vendor_boot_img);
images.os.os = IH_OS_LINUX;
-
-   images.os.end = android_image_get_end(os_hdr, NULL);
-   images.os.load = android_image_get_kload(os_hdr, NULL);
+   images.os.end = android_image_get_end(boot_img, 
vendor_boot_img);
+   images.os.load = android_image_get_kload(boot_img, 
vendor_boot_img);
images.ep = images.os.load;
ep_found = true;
break;
@@ -892,6 +901,10 @@ static const void *boot_get_kernel(struct cmd_tbl *cmdtp, 
int flag, int argc,
int os_noffset;
 #endif
 
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+   const void *boot_img;
+   const void *vendor_boot_img;
+#endif
img_addr = genimg_get_kernel_addr_fit(argc < 1 ? NULL : argv[0],
  _uname_config,
  _uname_kernel);
@@ -967,8 +980,14 @@ static const void *boot_get_kernel(struct cmd_tbl *cmdtp, 
int flag, int argc,
 #endif
 #ifdef CONFIG_ANDROID_BOOT_IMAGE
case IMAGE_FORMAT_ANDROID:
+   boot_img = buf;
+   vendor_boot_img = NULL;
+   if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) {
+   boot_img = (void *)get_abootimg_addr();
+   vendor_boot_img = (void *)get_avendor_bootimg_addr();
+   }
printf("## Booting Android Image at 0x%08lx ...\n", img_addr);
-   if (android_image_get_kernel(buf, NULL, images->verify,
+   if (android_image_get_kernel(boot_img, vendor_boot_img, 
images->verify,
 os_data, os_len))
return NULL;
break;
diff --git a/boot/image-android.c b/boot/image-android.c
index 291911ea1852..557047660bc3 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -199,7 +199,7 @@ static ulong android_image_get_kernel_addr(struct 
andr_image_data *img_data)
  * Return: Zero, os start address and length on success,
  * otherwise on failure.
  */
-int android_image_get_kernel(const struct andr_boot_img_hdr_v0_v1_v2 *hdr,
+int android_image_get_kernel(const void *hdr,
 const void *vendor_boot_img, int verify,
 ulong *os_data, ulong *os_len)
 {
@@ -284,7 +284,7 @@ bool is_android_vendor_boot_image_header(const void 
*vendor_boot_img)
return !memcmp(VENDOR_BOOT_MAGIC, vendor_boot_img, 
ANDR_VENDOR_BOOT_MAGIC_SIZE);
 }
 
-bool is_android_boot_image_header(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
+bool is_android_boot_image_header(const void *hdr)
 {
return !memcmp(ANDR_BOOT_MAGIC, hdr, ANDR_BOOT_MAGIC_SIZE);
 }
@@ -303,7 +303,7 @@ ulong android_image_get_end(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr,
return img_data.boot_img_total_size;
 }
 
-ulong android_image_get_kload(const struct andr_boot_img_hdr_v0_v1_v2 *hdr,
+ulong android_image_get_kload(const void *hdr,

[PATCH 14/17] drivers: fastboot: zImage flashing is not supported for v3, v4

2022-11-26 Thread Safae Ouajih
Print an error message when the boot image header version is
greater than 2 as this is not supported for v3 and v4.

Signed-off-by: Safae Ouajih 
---
 drivers/fastboot/fb_mmc.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/drivers/fastboot/fb_mmc.c b/drivers/fastboot/fb_mmc.c
index 4cfdc108e8f7..0f0a5d93cbb4 100644
--- a/drivers/fastboot/fb_mmc.c
+++ b/drivers/fastboot/fb_mmc.c
@@ -370,6 +370,14 @@ static int fb_mmc_update_zimage(struct blk_desc *dev_desc,
return -1;
}
 
+   /* Check if boot image header version is 2 or less */
+   if (hdr->header_version > 2) {
+   pr_err("zImage flashing supported only for boot images v2 and 
less\n");
+   fastboot_fail("zImage flashing supported only for boot images 
v2 and less",
+ response);
+   return -1;
+   }
+
/* Check if boot image has second stage in it (we don't support it) */
if (hdr->second_size > 0) {
pr_err("moving second stage is not supported yet\n");
-- 
2.25.1



[PATCH 13/17] android: boot: support extra command line

2022-11-26 Thread Safae Ouajih
In version 3 and 4 of boot image header, the vendor specific
command line are located in vendor boot image. Thus, using
extra command line to add those cmd to bootargs.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/boot/image-android.c b/boot/image-android.c
index 78bf708fed9f..291911ea1852 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -55,6 +55,7 @@ static void android_vendor_boot_image_v3_v4_parse_hdr(const 
struct andr_vendor_b
 * The header takes a full page, the remaining components are aligned
 * on page boundary.
 */
+   data->kcmdline_extra = hdr->cmdline;
data->tags_addr = hdr->tags_addr;
data->image_name = hdr->name;
data->kernel_addr = hdr->kernel_addr;
@@ -231,6 +232,11 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr,
len += strlen(img_data.kcmdline);
}
 
+   if (img_data.kcmdline_extra) {
+   printf("Kernel extra command line: %s\n", 
img_data.kcmdline_extra);
+   len += strlen(img_data.kcmdline_extra);
+   }
+
char *bootargs = env_get("bootargs");
if (bootargs)
len += strlen(bootargs);
@@ -250,6 +256,11 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr,
if (*img_data.kcmdline)
strcat(newbootargs, img_data.kcmdline);
 
+   if (img_data.kcmdline_extra) {
+   strcat(newbootargs, " ");
+   strcat(newbootargs, img_data.kcmdline_extra);
+   }
+
env_set("bootargs", newbootargs);
 
if (os_data) {
-- 
2.25.1



[PATCH 12/17] android: boot: ramdisk: support vendor ramdisk

2022-11-26 Thread Safae Ouajih
Version 3 and 4 of boot image header introduced
vendor boot ramdisk: Please check include/android_image.h
for details.

The ramdisk is now split into a generic ramdisk in boot image
and a vendor ramdisk in vendor boot image.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c | 13 +++--
 include/image.h  |  4 ++--
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index 5001b088f0fb..78bf708fed9f 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -25,6 +25,7 @@ static void android_boot_image_v3_v4_parse_hdr(const struct 
andr_boot_img_hdr_v3
 
data->kcmdline = hdr->cmdline;
data->header_version = hdr->header_version;
+   data->ramdisk_ptr = env_get_ulong("ramdisk_addr_r", 16, 0);
 
/*
 * The header takes a full page, the remaining components are aligned
@@ -320,10 +321,11 @@ ulong android_image_get_kcomp(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr,
return image_decomp_type(p, sizeof(u32));
 }
 
-int android_image_get_ramdisk(const struct andr_boot_img_hdr_v0_v1_v2 *hdr,
- const void *vendor_boot_img, ulong *rd_data, 
ulong *rd_len)
+int android_image_get_ramdisk(const void *hdr, const void *vendor_boot_img,
+ ulong *rd_data, ulong *rd_len)
 {
struct andr_image_data img_data = {0};
+   ulong ramdisk_ptr;
 
if (!android_image_get_data(hdr, vendor_boot_img, _data))
return -EINVAL;
@@ -332,6 +334,13 @@ int android_image_get_ramdisk(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr,
*rd_data = *rd_len = 0;
return -1;
}
+   if (img_data.header_version > 2) {
+   ramdisk_ptr = img_data.ramdisk_ptr;
+   memcpy((void *)(ramdisk_ptr), (void 
*)img_data.vendor_ramdisk_ptr,
+  img_data.vendor_ramdisk_size);
+   memcpy((void *)(ramdisk_ptr + img_data.vendor_ramdisk_size),
+  (void *)img_data.ramdisk_ptr, 
img_data.boot_ramdisk_size);
+   }
 
printf("RAM disk load addr 0x%08lx size %u KiB\n",
   img_data.ramdisk_ptr, DIV_ROUND_UP(img_data.ramdisk_size, 1024));
diff --git a/include/image.h b/include/image.h
index c91502011500..461e30ae2ac8 100644
--- a/include/image.h
+++ b/include/image.h
@@ -1731,8 +1731,8 @@ struct andr_boot_img_hdr_v0_v1_v2;
 int android_image_get_kernel(const struct andr_boot_img_hdr_v0_v1_v2 *hdr,
 const void *vendor_boot_img, int verify,
 ulong *os_data, ulong *os_len);
-int android_image_get_ramdisk(const struct andr_boot_img_hdr_v0_v1_v2 *hdr,
- const void *vendor_boot_img, ulong *rd_data, 
ulong *rd_len);
+int android_image_get_ramdisk(const void *hdr, const void *vendor_boot_img,
+ ulong *rd_data, ulong *rd_len);
 int android_image_get_second(const struct andr_boot_img_hdr_v0_v1_v2 *hdr,
  ulong *second_data, ulong *second_len);
 bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, u32 *size);
-- 
2.25.1



[PATCH 11/17] android: boot: update android_image_get_data to support v3, v4

2022-11-26 Thread Safae Ouajih
Since boot image header version 3 and 4 introduced vendor boot image,
the following functions are used to fill the generic android
structure : andr_image_data:

 - android_boot_image_v3_v4_parse_hdr()
 - android_vendor_boot_image_v3_v4_parse_hdr()

android_image_get_data() is then updated to support v3 and v4

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c| 79 +++--
 include/android_image.h |  3 ++
 include/image.h |  1 +
 3 files changed, 80 insertions(+), 3 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index eb821b08ccf4..5001b088f0fb 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -18,6 +18,64 @@
 
 static char andr_tmp_str[ANDR_BOOT_ARGS_SIZE + 1];
 
+static void android_boot_image_v3_v4_parse_hdr(const struct 
andr_boot_img_hdr_v3_v4 *hdr,
+  struct andr_image_data *data)
+{
+   ulong end;
+
+   data->kcmdline = hdr->cmdline;
+   data->header_version = hdr->header_version;
+
+   /*
+* The header takes a full page, the remaining components are aligned
+* on page boundary.
+*/
+   end = (ulong)hdr;
+   end += ANDR_GKI_PAGE_SIZE;
+   data->kernel_ptr = end;
+   data->kernel_size = hdr->kernel_size;
+   end += ALIGN(hdr->kernel_size, ANDR_GKI_PAGE_SIZE);
+   data->ramdisk_size = hdr->ramdisk_size;
+   data->boot_ramdisk_size = hdr->ramdisk_size;
+   end += ALIGN(hdr->ramdisk_size, ANDR_GKI_PAGE_SIZE);
+
+   if (hdr->header_version > 3)
+   end += ALIGN(hdr->signature_size, ANDR_GKI_PAGE_SIZE);
+
+   data->boot_img_total_size = end - (ulong)hdr;
+}
+
+static void android_vendor_boot_image_v3_v4_parse_hdr(const struct 
andr_vendor_boot_img_hdr_v3_v4
+ *hdr, struct 
andr_image_data *data)
+{
+   ulong end;
+
+   /*
+* The header takes a full page, the remaining components are aligned
+* on page boundary.
+*/
+   data->tags_addr = hdr->tags_addr;
+   data->image_name = hdr->name;
+   data->kernel_addr = hdr->kernel_addr;
+   data->ramdisk_addr = hdr->ramdisk_addr;
+   end = (ulong)hdr;
+   end += hdr->page_size;
+   if (hdr->vendor_ramdisk_size) {
+   data->vendor_ramdisk_ptr = end;
+   data->vendor_ramdisk_size = hdr->vendor_ramdisk_size;
+   data->ramdisk_size += hdr->vendor_ramdisk_size;
+   end += ALIGN(hdr->vendor_ramdisk_size, hdr->page_size);
+   }
+
+   data->dtb_ptr = end;
+   data->dtb_size = hdr->dtb_size;
+
+   end += ALIGN(hdr->dtb_size, hdr->page_size);
+   end += ALIGN(hdr->vendor_ramdisk_table_size, hdr->page_size);
+   end += ALIGN(hdr->bootconfig_size, hdr->page_size);
+   data->vendor_boot_img_total_size = end - (ulong)hdr;
+}
+
 static void android_boot_image_v0_v1_v2_parse_hdr(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr,
  struct andr_image_data *data)
 {
@@ -78,10 +136,20 @@ bool android_image_get_data(const void *boot_hdr, const 
void *vendor_boot_hdr,
return false;
}
 
-   if (((struct andr_boot_img_hdr_v0_v1_v2 *)boot_hdr)->header_version > 2)
-   printf("Only boot image header version 2 and below are 
supported\n");
-   else
+   if (((struct andr_boot_img_hdr_v0_v1_v2 *)boot_hdr)->header_version > 
2) {
+   if (!vendor_boot_hdr) {
+   printf("For boot header v3+ vendor boot image has to be 
provided\n");
+   return false;
+   }
+   if (!is_android_vendor_boot_image_header(vendor_boot_hdr)) {
+   printf("Incorrect vendor boot image header\n");
+   return false;
+   }
+   android_boot_image_v3_v4_parse_hdr(boot_hdr, data);
+   android_vendor_boot_image_v3_v4_parse_hdr(vendor_boot_hdr, 
data);
+   } else {
android_boot_image_v0_v1_v2_parse_hdr(boot_hdr, data);
+   }
 
return true;
 }
@@ -199,6 +267,11 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr,
return 0;
 }
 
+bool is_android_vendor_boot_image_header(const void *vendor_boot_img)
+{
+   return !memcmp(VENDOR_BOOT_MAGIC, vendor_boot_img, 
ANDR_VENDOR_BOOT_MAGIC_SIZE);
+}
+
 bool is_android_boot_image_header(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
 {
return !memcmp(ANDR_BOOT_MAGIC, hdr, ANDR_BOOT_MAGIC_SIZE);
diff --git a/include/android_image.h b/include/android_image.h
index 98a91cbf2f9c..b9591633c9f7 100644
--- a/include/android_image.h
+++ b/include/android_image.h
@@ -323,6 +323,8 @@ struct andr_image_data {

[PATCH 10/17] android: boot: add vendor boot image to prepare for v3, v4 support

2022-11-26 Thread Safae Ouajih
This is done to prepare for boot image version 3 and 4 support.

Signed-off-by: Safae Ouajih 
---
 boot/bootm.c |  8 
 boot/image-android.c | 40 
 boot/image-board.c   |  3 +--
 boot/image-fdt.c |  3 ++-
 cmd/abootimg.c   |  4 ++--
 include/image.h  | 22 ++
 6 files changed, 47 insertions(+), 33 deletions(-)

diff --git a/boot/bootm.c b/boot/bootm.c
index a4c0870c0fea..e44dc550077d 100644
--- a/boot/bootm.c
+++ b/boot/bootm.c
@@ -182,11 +182,11 @@ static int bootm_find_os(struct cmd_tbl *cmdtp, int flag, 
int argc,
 #ifdef CONFIG_ANDROID_BOOT_IMAGE
case IMAGE_FORMAT_ANDROID:
images.os.type = IH_TYPE_KERNEL;
-   images.os.comp = android_image_get_kcomp(os_hdr);
+   images.os.comp = android_image_get_kcomp(os_hdr, NULL);
images.os.os = IH_OS_LINUX;
 
-   images.os.end = android_image_get_end(os_hdr);
-   images.os.load = android_image_get_kload(os_hdr);
+   images.os.end = android_image_get_end(os_hdr, NULL);
+   images.os.load = android_image_get_kload(os_hdr, NULL);
images.ep = images.os.load;
ep_found = true;
break;
@@ -968,7 +968,7 @@ static const void *boot_get_kernel(struct cmd_tbl *cmdtp, 
int flag, int argc,
 #ifdef CONFIG_ANDROID_BOOT_IMAGE
case IMAGE_FORMAT_ANDROID:
printf("## Booting Android Image at 0x%08lx ...\n", img_addr);
-   if (android_image_get_kernel(buf, images->verify,
+   if (android_image_get_kernel(buf, NULL, images->verify,
 os_data, os_len))
return NULL;
break;
diff --git a/boot/image-android.c b/boot/image-android.c
index daf51a7e3b8b..eb821b08ccf4 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -65,7 +65,8 @@ static void android_boot_image_v0_v1_v2_parse_hdr(const 
struct andr_boot_img_hdr
data->boot_img_total_size = end - (ulong)hdr;
 }
 
-bool android_image_get_data(const void *boot_hdr, struct andr_image_data *data)
+bool android_image_get_data(const void *boot_hdr, const void *vendor_boot_hdr,
+   struct andr_image_data *data)
 {
if (!boot_hdr || !data) {
printf("boot_hdr or data params can't be NULL\n");
@@ -113,8 +114,10 @@ static ulong android_image_get_kernel_addr(struct 
andr_image_data *img_data)
 
 /**
  * android_image_get_kernel() - processes kernel part of Android boot images
- * @hdr:   Pointer to image header, which is at the start
+ * @hdr:   Pointer to boot image header, which is at the start
  * of the image.
+ * @vendor_boot_img:   Pointer to vendor boot image header, which is at the
+ * start of the image.
  * @verify:Checksum verification flag. Currently unimplemented.
  * @os_data:   Pointer to a ulong variable, will hold os data start
  * address.
@@ -126,14 +129,15 @@ static ulong android_image_get_kernel_addr(struct 
andr_image_data *img_data)
  * Return: Zero, os start address and length on success,
  * otherwise on failure.
  */
-int android_image_get_kernel(const struct andr_boot_img_hdr_v0_v1_v2 *hdr, int 
verify,
+int android_image_get_kernel(const struct andr_boot_img_hdr_v0_v1_v2 *hdr,
+const void *vendor_boot_img, int verify,
 ulong *os_data, ulong *os_len)
 {
struct andr_image_data img_data = {0};
u32 kernel_addr;
const struct legacy_img_hdr *ihdr;
 
-   if (!android_image_get_data(hdr, _data))
+   if (!android_image_get_data(hdr, vendor_boot_img, _data))
return -EINVAL;
 
kernel_addr = android_image_get_kernel_addr(_data);
@@ -200,11 +204,12 @@ bool is_android_boot_image_header(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr)
return !memcmp(ANDR_BOOT_MAGIC, hdr, ANDR_BOOT_MAGIC_SIZE);
 }
 
-ulong android_image_get_end(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
+ulong android_image_get_end(const struct andr_boot_img_hdr_v0_v1_v2 *hdr,
+   const void *vendor_boot_img)
 {
struct andr_image_data img_data;
 
-   if (!android_image_get_data(hdr, _data))
+   if (!android_image_get_data(hdr, vendor_boot_img, _data))
return -EINVAL;
 
if (img_data.header_version > 2)
@@ -213,22 +218,24 @@ ulong android_image_get_end(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr)
return img_data.boot_img_total_size;
 }
 
-ulong android_image_get_kload(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
+ulong android_image_get_kload(const struct andr_boot_img_hdr_v0_v1_v2 *hdr,
+ const void *vendor_boot_img)
 {
struct andr_image_data img_data;
 
-   if (!a

[PATCH 09/17] android: boot: boot image header v3, v4 do not support recovery DTBO

2022-11-26 Thread Safae Ouajih
android_image_get_dtbo() is used to get recovery DTBO via abootimg cmd.
This is not supported in boot image header v3 and v4. Thus, we print an
error message when v1,v2 header version are not used.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index d6476904f35e..daf51a7e3b8b 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -315,8 +315,8 @@ bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, 
u32 *size)
goto exit;
}
 
-   if (hdr->header_version < 1) {
-   printf("Error: header_version must be >= 1 to get dtbo\n");
+   if (hdr->header_version != 1 && hdr->header_version != 2) {
+   printf("Error: header version must be >= 1 and <= 2 to get 
dtbo\n");
ret = false;
goto exit;
}
-- 
2.25.1



[PATCH 08/17] android: boot: content print is not supported for v3, v4 header version

2022-11-26 Thread Safae Ouajih
Content print is not supported for version 3 and 4 of boot image header.
Thus, only print that content when v2 is used.

Update android_print_contents() to print an error message
when trying to print boot image header version 3 or 4 content.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c | 6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index d0cb8615c28c..d6476904f35e 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -475,6 +475,10 @@ bool android_image_get_dtb_by_index(ulong hdr_addr, u32 
index, ulong *addr,
  */
 void android_print_contents(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
 {
+   if (hdr->header_version >= 3) {
+   printf("Content print is not supported for boot image header 
version > 2");
+   return;
+   }
const char * const p = IMAGE_INDENT_STRING;
/* os_version = ver << 11 | lvl */
u32 os_ver = hdr->os_version >> 11;
@@ -507,7 +511,7 @@ void android_print_contents(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr)
   hdr->header_size);
}
 
-   if (hdr->header_version >= 2) {
+   if (hdr->header_version == 2) {
printf("%sdtb size: %x\n", p, hdr->dtb_size);
printf("%sdtb addr: %llx\n", p, hdr->dtb_addr);
}
-- 
2.25.1



[PATCH 07/17] android: boot: move to andr_image_data structure

2022-11-26 Thread Safae Ouajih
Move from andr_boot_img_hdr_v0_v1_v2 to andr_image_data
structure to prepare for boot image header
version 3 and 4.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c | 124 +++
 cmd/abootimg.c   |  30 +--
 include/image.h  |   2 +
 3 files changed, 82 insertions(+), 74 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index 79d987a3b044..d0cb8615c28c 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -85,7 +85,7 @@ bool android_image_get_data(const void *boot_hdr, struct 
andr_image_data *data)
return true;
 }
 
-static ulong android_image_get_kernel_addr(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr)
+static ulong android_image_get_kernel_addr(struct andr_image_data *img_data)
 {
/*
 * All the Android tools that generate a boot.img use this
@@ -98,17 +98,17 @@ static ulong android_image_get_kernel_addr(const struct 
andr_boot_img_hdr_v0_v1_
 *
 * Otherwise, we will return the actual value set by the user.
 */
-   if (hdr->kernel_addr == ANDROID_IMAGE_DEFAULT_KERNEL_ADDR)
-   return (ulong)hdr + hdr->page_size;
+   if (img_data->kernel_addr  == ANDROID_IMAGE_DEFAULT_KERNEL_ADDR)
+   return img_data->kernel_ptr;
 
/*
 * abootimg creates images where all load addresses are 0
 * and we need to fix them.
 */
-   if (hdr->kernel_addr == 0 && hdr->ramdisk_addr == 0)
+   if (img_data->kernel_addr == 0 && img_data->ramdisk_addr == 0)
return env_get_ulong("kernel_addr_r", 16, 0);
 
-   return hdr->kernel_addr;
+   return img_data->kernel_addr;
 }
 
 /**
@@ -129,27 +129,33 @@ static ulong android_image_get_kernel_addr(const struct 
andr_boot_img_hdr_v0_v1_
 int android_image_get_kernel(const struct andr_boot_img_hdr_v0_v1_v2 *hdr, int 
verify,
 ulong *os_data, ulong *os_len)
 {
-   u32 kernel_addr = android_image_get_kernel_addr(hdr);
-   const struct legacy_img_hdr *ihdr = (const struct legacy_img_hdr *)
-   ((uintptr_t)hdr + hdr->page_size);
+   struct andr_image_data img_data = {0};
+   u32 kernel_addr;
+   const struct legacy_img_hdr *ihdr;
+
+   if (!android_image_get_data(hdr, _data))
+   return -EINVAL;
+
+   kernel_addr = android_image_get_kernel_addr(_data);
+   ihdr = (const struct legacy_img_hdr *)img_data.kernel_ptr;
 
/*
 * Not all Android tools use the id field for signing the image with
 * sha1 (or anything) so we don't check it. It is not obvious that the
 * string is null terminated so we take care of this.
 */
-   strncpy(andr_tmp_str, hdr->name, ANDR_BOOT_NAME_SIZE);
+   strncpy(andr_tmp_str, img_data.image_name, ANDR_BOOT_NAME_SIZE);
andr_tmp_str[ANDR_BOOT_NAME_SIZE] = '\0';
if (strlen(andr_tmp_str))
printf("Android's image name: %s\n", andr_tmp_str);
 
printf("Kernel load addr 0x%08x size %u KiB\n",
-  kernel_addr, DIV_ROUND_UP(hdr->kernel_size, 1024));
+  kernel_addr, DIV_ROUND_UP(img_data.kernel_size, 1024));
 
int len = 0;
-   if (*hdr->cmdline) {
-   printf("Kernel command line: %s\n", hdr->cmdline);
-   len += strlen(hdr->cmdline);
+   if (*img_data.kcmdline) {
+   printf("Kernel command line: %s\n", img_data.kcmdline);
+   len += strlen(img_data.kcmdline);
}
 
char *bootargs = env_get("bootargs");
@@ -167,8 +173,9 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr, int v
strcpy(newbootargs, bootargs);
strcat(newbootargs, " ");
}
-   if (*hdr->cmdline)
-   strcat(newbootargs, hdr->cmdline);
+
+   if (*img_data.kcmdline)
+   strcat(newbootargs, img_data.kcmdline);
 
env_set("bootargs", newbootargs);
 
@@ -176,15 +183,14 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr, int v
if (image_get_magic(ihdr) == IH_MAGIC) {
*os_data = image_get_data(ihdr);
} else {
-   *os_data = (ulong)hdr;
-   *os_data += hdr->page_size;
+   *os_data = img_data.kernel_ptr;
}
}
if (os_len) {
if (image_get_magic(ihdr) == IH_MAGIC)
*os_len = image_get_data_size(ihdr);
else
-   *os_len = hdr->kernel_size;
+   *os_len = img_data.kernel_size;
}
return 0;
 }
@@ -196,30 +202,25 @@ bool is_android_boot_image_header(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr)
 
 ulong a

[PATCH 06/17] android: boot: kcomp: support andr_image_data

2022-11-26 Thread Safae Ouajih
andr_image_data structure is used as a global representation of
boot image header structure. This new structure is introduced to
support all boot header versions : v0,v1.v2.v3.v4 and will be used
to support v3 and v4 while maitaining support for v0,v1,v2. The need
of using andr_image_data comes from the change of header structure in
both version 3 and 4.

android_image_get_kcomp() is reworked to support this new struct.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c| 74 -
 include/android_image.h | 27 +++
 include/image.h |  2 ++
 3 files changed, 102 insertions(+), 1 deletion(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index c67949b8b563..79d987a3b044 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -18,6 +18,73 @@
 
 static char andr_tmp_str[ANDR_BOOT_ARGS_SIZE + 1];
 
+static void android_boot_image_v0_v1_v2_parse_hdr(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr,
+ struct andr_image_data *data)
+{
+   ulong end;
+
+   data->image_name = hdr->name;
+   data->kcmdline = hdr->cmdline;
+   data->kernel_addr = hdr->kernel_addr;
+   data->ramdisk_addr = hdr->ramdisk_addr;
+   data->header_version = hdr->header_version;
+
+   end = (ulong)hdr;
+
+   /*
+* The header takes a full page, the remaining components are aligned
+* on page boundary
+*/
+
+   end += hdr->page_size;
+
+   data->kernel_ptr = end;
+   data->kernel_size = hdr->kernel_size;
+   end += ALIGN(hdr->kernel_size, hdr->page_size);
+
+   data->ramdisk_ptr = end;
+   data->ramdisk_size = hdr->ramdisk_size;
+   end += ALIGN(hdr->ramdisk_size, hdr->page_size);
+
+   data->second_ptr = end;
+   data->second_size = hdr->second_size;
+   end += ALIGN(hdr->second_size, hdr->page_size);
+
+   if (hdr->header_version >= 1) {
+   data->recovery_dtbo_ptr = end;
+   data->recovery_dtbo_size = hdr->recovery_dtbo_size;
+   end += ALIGN(hdr->recovery_dtbo_size, hdr->page_size);
+   }
+
+   if (hdr->header_version >= 2) {
+   data->dtb_ptr = end;
+   data->dtb_size = hdr->dtb_size;
+   end += ALIGN(hdr->dtb_size, hdr->page_size);
+   }
+
+   data->boot_img_total_size = end - (ulong)hdr;
+}
+
+bool android_image_get_data(const void *boot_hdr, struct andr_image_data *data)
+{
+   if (!boot_hdr || !data) {
+   printf("boot_hdr or data params can't be NULL\n");
+   return false;
+   }
+
+   if (!is_android_boot_image_header(boot_hdr)) {
+   printf("Incorrect boot image header\n");
+   return false;
+   }
+
+   if (((struct andr_boot_img_hdr_v0_v1_v2 *)boot_hdr)->header_version > 2)
+   printf("Only boot image header version 2 and below are 
supported\n");
+   else
+   android_boot_image_v0_v1_v2_parse_hdr(boot_hdr, data);
+
+   return true;
+}
+
 static ulong android_image_get_kernel_addr(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr)
 {
/*
@@ -157,8 +224,13 @@ ulong android_image_get_kload(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr)
 
 ulong android_image_get_kcomp(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
 {
-   const void *p = (void *)((uintptr_t)hdr + hdr->page_size);
+   struct andr_image_data img_data;
+   const void *p;
+
+   if (!android_image_get_data(hdr, _data))
+   return -EINVAL;
 
+   p = (const void *)img_data.kernel_ptr;
if (image_get_magic((struct legacy_img_hdr *)p) == IH_MAGIC)
return image_get_comp((struct legacy_img_hdr *)p);
else if (get_unaligned_le32(p) == LZ4F_MAGIC)
diff --git a/include/android_image.h b/include/android_image.h
index 62121e2a109b..98a91cbf2f9c 100644
--- a/include/android_image.h
+++ b/include/android_image.h
@@ -317,4 +317,31 @@ struct andr_boot_img_hdr_v0_v1_v2 {
  *contained outside boot and vendor boot partitions), otherwise
  *jump to kernel_addr
  */
+
+/* Private struct */
+struct andr_image_data {
+   ulong kernel_ptr;
+   u32 kernel_size;
+   u32 ramdisk_size;
+   u32 boot_ramdisk_size;
+   ulong second_ptr;
+   u32 second_size;
+   ulong dtb_ptr;
+   u32 dtb_size;
+   ulong recovery_dtbo_ptr;
+   u32 recovery_dtbo_size;
+
+   const char *kcmdline;
+   const char *kcmdline_extra;
+   const char *image_name;
+
+   u32 kernel_addr;
+   ulong ramdisk_addr;
+   ulong ramdisk_ptr;
+   ulong dtb_load_addr;
+   ulong tags_addr;
+   u32 header_version;
+   u32 boot_img_total_size;
+};
+
 #endif
diff --git a/include/image.h b/include/image.h
index e175c920d3fb..738e

[PATCH 05/17] android: boot: add documentation for boot image header v3/v4 structure

2022-11-26 Thread Safae Ouajih
This was imported from [1], commit [2], file: include/bootimg/bootimg.h
[1] https://android.googlesource.com/platform/system/tools/mkbootimg
[2] cce5b1923e3cd2fcb765b512610bdc5c42bc501d

Signed-off-by: Safae Ouajih 
---
 include/android_image.h | 136 +++-
 1 file changed, 135 insertions(+), 1 deletion(-)

diff --git a/include/android_image.h b/include/android_image.h
index ec36e6512ad6..62121e2a109b 100644
--- a/include/android_image.h
+++ b/include/android_image.h
@@ -3,7 +3,7 @@
  * This is from the Android Project,
  * Repository: https://android.googlesource.com/platform/system/tools/mkbootimg
  * File: include/bootimg/bootimg.h
- * Commit: e55998a0f2b61b685d5eb4a486ca3a0c680b1a2f
+ * Commit: cce5b1923e3cd2fcb765b512610bdc5c42bc501d
  *
  * Copyright (C) 2007 The Android Open Source Project
  */
@@ -183,4 +183,138 @@ struct andr_boot_img_hdr_v0_v1_v2 {
  *else: jump to kernel_addr
  */
 
+/* When the boot image header has a version of 3, the structure of the boot
+ * image is as follows:
+ *
+ * +-+
+ * | boot header | 4096 bytes
+ * +-+
+ * | kernel  | m pages
+ * +-+
+ * | ramdisk | n pages
+ * +-+
+ *
+ * m = (kernel_size + 4096 - 1) / 4096
+ * n = (ramdisk_size + 4096 - 1) / 4096
+ *
+ * Note that in version 3 of the boot image header, page size is fixed at 4096 
bytes.
+ *
+ * The structure of the vendor boot image (introduced with version 3 and
+ * required to be present when a v3 boot image is used) is as follows:
+ *
+ * +-+
+ * | vendor boot header  | o pages
+ * +-+
+ * | vendor ramdisk  | p pages
+ * +-+
+ * | dtb | q pages
+ * +-+
+ * o = (2112 + page_size - 1) / page_size
+ * p = (vendor_ramdisk_size + page_size - 1) / page_size
+ * q = (dtb_size + page_size - 1) / page_size
+ *
+ * 0. all entities in the boot image are 4096-byte aligned in flash, all
+ *entities in the vendor boot image are page_size (determined by the vendor
+ *and specified in the vendor boot image header) aligned in flash
+ * 1. kernel, ramdisk, vendor ramdisk, and DTB are required (size != 0)
+ * 2. load the kernel and DTB at the specified physical address (kernel_addr,
+ *dtb_addr)
+ * 3. load the vendor ramdisk at ramdisk_addr
+ * 4. load the generic ramdisk immediately following the vendor ramdisk in
+ *memory
+ * 5. set up registers for kernel entry as required by your architecture
+ * 6. if the platform has a second stage bootloader jump to it (must be
+ *contained outside boot and vendor boot partitions), otherwise
+ *jump to kernel_addr
+ */
+
+/* When the boot image header has a version of 4, the structure of the boot
+ * image is as follows:
+ *
+ * +-+
+ * | boot header | 4096 bytes
+ * +-+
+ * | kernel  | m pages
+ * +-+
+ * | ramdisk | n pages
+ * +-+
+ * | boot signature  | g pages
+ * +-+
+ *
+ * m = (kernel_size + 4096 - 1) / 4096
+ * n = (ramdisk_size + 4096 - 1) / 4096
+ * g = (signature_size + 4096 - 1) / 4096
+ *
+ * Note that in version 4 of the boot image header, page size is fixed at 4096
+ * bytes.
+ *
+ * The structure of the vendor boot image version 4, which is required to be
+ * present when a version 4 boot image is used, is as follows:
+ *
+ * ++
+ * | vendor boot header | o pages
+ * ++
+ * | vendor ramdisk section | p pages
+ * ++
+ * | dtb| q pages
+ * ++
+ * | vendor ramdisk table   | r pages
+ * ++
+ * | bootconfig | s pages
+ * ++
+ *
+ * o = (2128 + page_size - 1) / page_size
+ * p = (vendor_ramdisk_size + page_size - 1) / page_size
+ * q = (dtb_size + page_size - 1) / page_size
+ * r = (vendor_ramdisk_table_size + page_size - 1) / page_size
+ * s = (vendor_bootconfig_size + page_size - 1) / page_size
+ *
+ * Note that in version 4 of the vendor boot image, multiple vendor ramdisks 
can
+ * be included in the vendor boot image. The bootloader can select a subset of
+ * ramdisks to load at runtime. To help the bootloader select the ramdisks, 
each
+ * ramdisk is tagged with a type tag and a set of hardware identifiers
+ * describing the board, soc or platform that this ramdisk is intended for.
+ *
+ * The vendor ramdisk section is consist of multiple ramdisk images 
concatenated
+ * one after another, and vendor_ramdisk_size is the size of the section, which
+ * is the total size of all the ramdisks included in the vendor boot image.
+ *
+ * The vendor ramdisk table holds the size, offset, type, name and hardware
+ * identifiers of each ramdisk. The type field denotes the type of its content

[PATCH 04/17] android: boot: add boot image header v3 and v4 structures

2022-11-26 Thread Safae Ouajih
This adds support for v3/v4 boot image format by adding
the following structures:

- andr_boot_img_hdr_v3_v4 : describes boot image header
- andr_vendor_boot_img_hdr_v3_v4 : describes vendor boot image header

These definitions have been copied over from the AOSP documentation at
[1] and [2]

Boot arg sizes are taken from [3]:
`35fb6262bc3fe2280c37047a92d79953789760e5`

[1] 
https://source.android.com/docs/core/architecture/bootloader/boot-image-header
[2] 
https://source.android.com/docs/core/architecture/bootloader/partitions/vendor-boot-partitions#vendor-boot-header
[3] https://android.googlesource.com/platform/external/u-boot

Signed-off-by: Safae Ouajih 
---
 include/android_image.h | 47 +
 1 file changed, 47 insertions(+)

diff --git a/include/android_image.h b/include/android_image.h
index bf9b8c6f0955..ec36e6512ad6 100644
--- a/include/android_image.h
+++ b/include/android_image.h
@@ -14,11 +14,58 @@
 #include 
 #include 
 
+#define ANDR_GKI_PAGE_SIZE 4096
 #define ANDR_BOOT_MAGIC "ANDROID!"
 #define ANDR_BOOT_MAGIC_SIZE 8
 #define ANDR_BOOT_NAME_SIZE 16
 #define ANDR_BOOT_ARGS_SIZE 512
 #define ANDR_BOOT_EXTRA_ARGS_SIZE 1024
+#define VENDOR_BOOT_MAGIC "VNDRBOOT"
+#define ANDR_VENDOR_BOOT_MAGIC_SIZE 8
+#define ANDR_VENDOR_BOOT_ARGS_SIZE 2048
+#define ANDR_VENDOR_BOOT_NAME_SIZE 16
+
+struct andr_boot_img_hdr_v3_v4 {
+   u8 magic[ANDR_BOOT_MAGIC_SIZE];
+
+   u32 kernel_size;/* size in bytes */
+   u32 ramdisk_size;   /* size in bytes */
+
+   u32 os_version;
+
+   u32 header_size;/* size of boot image header in bytes */
+   u32 reserved[4];
+   u32 header_version; /* offset remains constant for version check */
+
+   u8 cmdline[ANDR_BOOT_ARGS_SIZE + ANDR_BOOT_EXTRA_ARGS_SIZE];
+   /* for boot image header v4 only */
+   u32 signature_size; /* size in bytes */
+};
+
+struct andr_vendor_boot_img_hdr_v3_v4 {
+   u8 magic[ANDR_VENDOR_BOOT_MAGIC_SIZE];
+   u32 header_version;
+   u32 page_size;   /* flash page size we assume */
+
+   u32 kernel_addr; /* physical load addr */
+   u32 ramdisk_addr;/* physical load addr */
+
+   u32 vendor_ramdisk_size; /* size in bytes */
+
+   u8 cmdline[ANDR_VENDOR_BOOT_ARGS_SIZE];
+
+   u32 tags_addr;   /* physical addr for kernel tags */
+
+   u8 name[ANDR_VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */
+   u32 header_size; /* size of vendor boot image header in bytes */
+   u32 dtb_size;/* size of dtb image */
+   u64 dtb_addr;/* physical load address */
+   /* for boot image header v4 only */
+   u32 vendor_ramdisk_table_size; /* size in bytes for the vendor ramdisk 
table */
+   u32 vendor_ramdisk_table_entry_num; /* number of entries in the vendor 
ramdisk table */
+   u32 vendor_ramdisk_table_entry_size; /* size in bytes for a vendor 
ramdisk table entry */
+   u32 bootconfig_size; /* size in bytes for the bootconfig section */
+};
 
 /* The bootloader expects the structure of andr_boot_img_hdr_v0_v1_v2 with 
header
  * version 0 to be as follows: */
-- 
2.25.1



[PATCH 03/17] android: boot: replace android_image_check_header

2022-11-26 Thread Safae Ouajih
With the new vendor boot image introduced in versions 3 and 4
of boot image header, the header check must be done for both boot
image and vendor boot image. Thus, android_image_check_header() is
being replaced by is_android_boot_image_header() to only refer to
boot image header check.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c  | 8 
 boot/image-board.c| 2 +-
 cmd/abootimg.c| 4 ++--
 drivers/fastboot/fb_mmc.c | 3 +--
 include/image.h   | 2 +-
 5 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index 926d94ecbe8e..c67949b8b563 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -122,9 +122,9 @@ int android_image_get_kernel(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr, int v
return 0;
 }
 
-int android_image_check_header(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
+bool is_android_boot_image_header(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
 {
-   return memcmp(ANDR_BOOT_MAGIC, hdr->magic, ANDR_BOOT_MAGIC_SIZE);
+   return !memcmp(ANDR_BOOT_MAGIC, hdr, ANDR_BOOT_MAGIC_SIZE);
 }
 
 ulong android_image_get_end(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
@@ -231,7 +231,7 @@ bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, 
u32 *size)
bool ret = true;
 
hdr = map_sysmem(hdr_addr, sizeof(*hdr));
-   if (android_image_check_header(hdr)) {
+   if (!is_android_boot_image_header(hdr)) {
printf("Error: Boot Image header is incorrect\n");
ret = false;
goto exit;
@@ -280,7 +280,7 @@ static bool android_image_get_dtb_img_addr(ulong hdr_addr, 
ulong *addr)
bool ret = true;
 
hdr = map_sysmem(hdr_addr, sizeof(*hdr));
-   if (android_image_check_header(hdr)) {
+   if (!is_android_boot_image_header(hdr)) {
printf("Error: Boot Image header is incorrect\n");
ret = false;
goto exit;
diff --git a/boot/image-board.c b/boot/image-board.c
index 34d1e5f18bef..acbaafc1b12e 100644
--- a/boot/image-board.c
+++ b/boot/image-board.c
@@ -284,7 +284,7 @@ int genimg_get_format(const void *img_addr)
return IMAGE_FORMAT_FIT;
}
if (IS_ENABLED(CONFIG_ANDROID_BOOT_IMAGE) &&
-   !android_image_check_header(img_addr))
+   is_android_boot_image_header(img_addr))
return IMAGE_FORMAT_ANDROID;
 
return IMAGE_FORMAT_INVALID;
diff --git a/cmd/abootimg.c b/cmd/abootimg.c
index ad61cce7588d..3c344b6c0367 100644
--- a/cmd/abootimg.c
+++ b/cmd/abootimg.c
@@ -26,7 +26,7 @@ static int abootimg_get_ver(int argc, char *const argv[])
return CMD_RET_USAGE;
 
hdr = map_sysmem(abootimg_addr(), sizeof(*hdr));
-   if (android_image_check_header(hdr)) {
+   if (!is_android_boot_image_header(hdr)) {
printf("Error: Boot Image header is incorrect\n");
res = CMD_RET_FAILURE;
goto exit;
@@ -73,7 +73,7 @@ static int abootimg_get_dtb_load_addr(int argc, char *const 
argv[])
return CMD_RET_USAGE;
 
hdr = map_sysmem(abootimg_addr(), sizeof(*hdr));
-   if (android_image_check_header(hdr)) {
+   if (!is_android_boot_image_header(hdr)) {
printf("Error: Boot Image header is incorrect\n");
res = CMD_RET_FAILURE;
goto exit;
diff --git a/drivers/fastboot/fb_mmc.c b/drivers/fastboot/fb_mmc.c
index 7b2f964b4c72..4cfdc108e8f7 100644
--- a/drivers/fastboot/fb_mmc.c
+++ b/drivers/fastboot/fb_mmc.c
@@ -313,8 +313,7 @@ static lbaint_t fb_mmc_get_boot_header(struct blk_desc 
*dev_desc,
}
 
/* Check boot header magic string */
-   res = android_image_check_header(hdr);
-   if (res != 0) {
+   if (!is_android_boot_image_header(hdr)) {
pr_err("bad boot image magic\n");
fastboot_fail("boot partition not initialized", response);
return 0;
diff --git a/include/image.h b/include/image.h
index 931cf18c7e82..e175c920d3fb 100644
--- a/include/image.h
+++ b/include/image.h
@@ -1724,7 +1724,6 @@ int fit_image_cipher_get_algo(const void *fit, int 
noffset, char **algo);
 struct cipher_algo *image_get_cipher_algo(const char *full_name);
 
 struct andr_boot_img_hdr_v0_v1_v2;
-int android_image_check_header(const struct andr_boot_img_hdr_v0_v1_v2 *hdr);
 int android_image_get_kernel(const struct andr_boot_img_hdr_v0_v1_v2 *hdr, int 
verify,
 ulong *os_data, ulong *os_len);
 int android_image_get_ramdisk(const struct andr_boot_img_hdr_v0_v1_v2 *hdr,
@@ -1739,6 +1738,7 @@ ulong android_image_get_kload(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr);
 ulong android_image_get_kcomp(const struct andr_boot_img_hdr_v0_v1_v2 *hdr);
 void android_print_contents(const struct andr_boot_img_hdr_v0_v1_

[PATCH 02/17] android: boot: support vendor boot image in abootimg

2022-11-26 Thread Safae Ouajih
Vendor boot image is introduced in boot image header
version 3 and 4. Please check [1] for more details.

To prepare for boot image v3/v4 support, allow the abootimg command
to store the vendor_boot image address.

Full support for this new format will be done in a future patch.

[1] 
https://source.android.com/docs/core/architecture/bootloader/partitions/vendor-boot-partitions

Signed-off-by: Safae Ouajih 
---
 cmd/abootimg.c | 18 +++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/cmd/abootimg.c b/cmd/abootimg.c
index de2aa3307d9a..ad61cce7588d 100644
--- a/cmd/abootimg.c
+++ b/cmd/abootimg.c
@@ -15,6 +15,7 @@
 
 /* Please use abootimg_addr() macro to obtain the boot image address */
 static ulong _abootimg_addr = -1;
+static ulong _avendor_bootimg_addr = -1;
 
 static int abootimg_get_ver(int argc, char *const argv[])
 {
@@ -158,7 +159,7 @@ static int do_abootimg_addr(struct cmd_tbl *cmdtp, int 
flag, int argc,
char *endp;
ulong img_addr;
 
-   if (argc != 2)
+   if (argc < 2 || argc > 3)
return CMD_RET_USAGE;
 
img_addr = hextoul(argv[1], );
@@ -168,6 +169,17 @@ static int do_abootimg_addr(struct cmd_tbl *cmdtp, int 
flag, int argc,
}
 
_abootimg_addr = img_addr;
+
+   if (argc == 3) {
+   img_addr = simple_strtoul(argv[2], , 16);
+   if (*endp != '\0') {
+   printf("Error: Wrong vendor image address\n");
+   return CMD_RET_FAILURE;
+   }
+
+   _avendor_bootimg_addr = img_addr;
+   }
+
return CMD_RET_SUCCESS;
 }
 
@@ -211,7 +223,7 @@ static int do_abootimg_dump(struct cmd_tbl *cmdtp, int 
flag, int argc,
 }
 
 static struct cmd_tbl cmd_abootimg_sub[] = {
-   U_BOOT_CMD_MKENT(addr, 2, 1, do_abootimg_addr, "", ""),
+   U_BOOT_CMD_MKENT(addr, 3, 1, do_abootimg_addr, "", ""),
U_BOOT_CMD_MKENT(dump, 2, 1, do_abootimg_dump, "", ""),
U_BOOT_CMD_MKENT(get, 5, 1, do_abootimg_get, "", ""),
 };
@@ -239,7 +251,7 @@ static int do_abootimg(struct cmd_tbl *cmdtp, int flag, int 
argc,
 U_BOOT_CMD(
abootimg, CONFIG_SYS_MAXARGS, 0, do_abootimg,
"manipulate Android Boot Image",
-   "addr \n"
+   "addr  []>\n"
"- set the address in RAM where boot image is located\n"
"  ($loadaddr is used by default)\n"
"abootimg dump dtb\n"
-- 
2.25.1



[PATCH 01/17] android: boot: rename andr_img_hdr -> andr_boot_img_hdr_v0_v1_v2

2022-11-26 Thread Safae Ouajih
Android introduced boot header version 3 or 4.
The header structure change with version 3 and 4 to support
the new updates such as:
- Introducing Vendor boot image: with a vendor ramdisk
- Bootconfig feature (v4)

To maintain support for version v0, v1 and v2 while introducing
version 3 and 4, this struct name must change to refer to the header
structure before v3.

Signed-off-by: Safae Ouajih 
---
 boot/image-android.c  | 26 +-
 boot/image-fdt.c  |  2 +-
 cmd/abootimg.c|  4 ++--
 drivers/fastboot/fb_mmc.c |  8 
 include/android_image.h   |  4 ++--
 include/image.h   | 18 +-
 6 files changed, 31 insertions(+), 31 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index 2628db374121..926d94ecbe8e 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -18,7 +18,7 @@
 
 static char andr_tmp_str[ANDR_BOOT_ARGS_SIZE + 1];
 
-static ulong android_image_get_kernel_addr(const struct andr_img_hdr *hdr)
+static ulong android_image_get_kernel_addr(const struct 
andr_boot_img_hdr_v0_v1_v2 *hdr)
 {
/*
 * All the Android tools that generate a boot.img use this
@@ -59,7 +59,7 @@ static ulong android_image_get_kernel_addr(const struct 
andr_img_hdr *hdr)
  * Return: Zero, os start address and length on success,
  * otherwise on failure.
  */
-int android_image_get_kernel(const struct andr_img_hdr *hdr, int verify,
+int android_image_get_kernel(const struct andr_boot_img_hdr_v0_v1_v2 *hdr, int 
verify,
 ulong *os_data, ulong *os_len)
 {
u32 kernel_addr = android_image_get_kernel_addr(hdr);
@@ -122,12 +122,12 @@ int android_image_get_kernel(const struct andr_img_hdr 
*hdr, int verify,
return 0;
 }
 
-int android_image_check_header(const struct andr_img_hdr *hdr)
+int android_image_check_header(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
 {
return memcmp(ANDR_BOOT_MAGIC, hdr->magic, ANDR_BOOT_MAGIC_SIZE);
 }
 
-ulong android_image_get_end(const struct andr_img_hdr *hdr)
+ulong android_image_get_end(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
 {
ulong end;
 
@@ -150,12 +150,12 @@ ulong android_image_get_end(const struct andr_img_hdr 
*hdr)
return end;
 }
 
-ulong android_image_get_kload(const struct andr_img_hdr *hdr)
+ulong android_image_get_kload(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
 {
return android_image_get_kernel_addr(hdr);
 }
 
-ulong android_image_get_kcomp(const struct andr_img_hdr *hdr)
+ulong android_image_get_kcomp(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
 {
const void *p = (void *)((uintptr_t)hdr + hdr->page_size);
 
@@ -167,7 +167,7 @@ ulong android_image_get_kcomp(const struct andr_img_hdr 
*hdr)
return image_decomp_type(p, sizeof(u32));
 }
 
-int android_image_get_ramdisk(const struct andr_img_hdr *hdr,
+int android_image_get_ramdisk(const struct andr_boot_img_hdr_v0_v1_v2 *hdr,
  ulong *rd_data, ulong *rd_len)
 {
if (!hdr->ramdisk_size) {
@@ -186,7 +186,7 @@ int android_image_get_ramdisk(const struct andr_img_hdr 
*hdr,
return 0;
 }
 
-int android_image_get_second(const struct andr_img_hdr *hdr,
+int android_image_get_second(const struct andr_boot_img_hdr_v0_v1_v2 *hdr,
  ulong *second_data, ulong *second_len)
 {
if (!hdr->second_size) {
@@ -226,7 +226,7 @@ int android_image_get_second(const struct andr_img_hdr *hdr,
  */
 bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, u32 *size)
 {
-   const struct andr_img_hdr *hdr;
+   const struct andr_boot_img_hdr_v0_v1_v2 *hdr;
ulong dtbo_img_addr;
bool ret = true;
 
@@ -275,7 +275,7 @@ exit:
  */
 static bool android_image_get_dtb_img_addr(ulong hdr_addr, ulong *addr)
 {
-   const struct andr_img_hdr *hdr;
+   const struct andr_boot_img_hdr_v0_v1_v2 *hdr;
ulong dtb_img_addr;
bool ret = true;
 
@@ -328,7 +328,7 @@ exit:
 bool android_image_get_dtb_by_index(ulong hdr_addr, u32 index, ulong *addr,
u32 *size)
 {
-   const struct andr_img_hdr *hdr;
+   const struct andr_boot_img_hdr_v0_v1_v2 *hdr;
bool res;
ulong dtb_img_addr; /* address of DTB part in boot image */
u32 dtb_img_size;   /* size of DTB payload in boot image */
@@ -393,7 +393,7 @@ bool android_image_get_dtb_by_index(ulong hdr_addr, u32 
index, ulong *addr,
  * returns:
  * no returned results
  */
-void android_print_contents(const struct andr_img_hdr *hdr)
+void android_print_contents(const struct andr_boot_img_hdr_v0_v1_v2 *hdr)
 {
const char * const p = IMAGE_INDENT_STRING;
/* os_version = ver << 11 | lvl */
@@ -485,7 +485,7 @@ static bool android_image_print_dtb_info(const struct 
fdt_header *fdt,
  */
 bool android_image_print_dtb_contents(ulong hdr_addr)
 {
-   const struct andr_img_hdr *hdr;
+ 

[PATCH 00/17] Support android boot image v3/v4

2022-11-26 Thread Safae Ouajih
Hello everyone,

* This is based on Roman Stratiienko's work to support boot image header 
version 3 and 4.

* This supports the new boot image headers v3, v4 and bootconfig feature.
https://source.android.com/docs/core/architecture/bootloader/boot-image-header
https://source.android.com/docs/core/architecture/bootloader/implementing-bootconfig

- Tested on Amlogic Khadas vim3l, a reference board for Android Open Source 
Project
  https://www.khadas.com/vim3l

  And on AM625 Texas Instruments board with 5.10 linux kernel

Main changes :
- New partition : vendor boot, with a specific vendor ramdisk
- DTB is stored in the vendor boot partition
- The generic ramdisk is placed after the vendor ramdisk
- Bootconfig feature support


Here is a link to see the related android boot flow changes on KHADAS vim3l as 
an example:
https://gitlab.baylibre.com/baylibre/amlogic/atv/u-boot/-/commits/souajih/BootImagev4/

Safae Ouajih (17):
  android: boot: rename andr_img_hdr -> andr_boot_img_hdr_v0_v1_v2
  android: boot: support vendor boot image in abootimg
  android: boot: replace android_image_check_header
  android: boot: add boot image header v3 and v4 structures
  android: boot: add documentation for boot image header v3/v4 structure
  android: boot: kcomp: support andr_image_data
  android: boot: move to andr_image_data structure
  android: boot: content print is not supported for v3,v4 header version
  android: boot: boot image header v3,v4 do not support recovery DTBO
  android: boot: add vendor boot image to prepare for v3,v4 support
  android: boot: update android_image_get_data to support v3,v4
  android: boot: ramdisk: support vendor ramdisk
  android: boot: support extra command line
  drivers: fastboot: zImage flashing is not supported for v3,v4
  android: boot: support boot image header version 3 and 4
  lib: support libxbc
  android: boot: support bootconfig

 boot/bootm.c  |  29 ++-
 boot/image-android.c  | 367 ++
 boot/image-board.c|  15 +-
 boot/image-fdt.c  |   5 +-
 cmd/abootimg.c|  66 ---
 drivers/fastboot/fb_mmc.c |  19 +-
 include/android_image.h   | 220 ++-
 include/image.h   |  37 ++--
 include/xbc.h |   1 +
 lib/Kconfig   |  12 ++
 lib/Makefile  |   1 +
 lib/libxbc/Makefile   |   1 +
 lib/libxbc/libxbc.c   | 112 
 lib/libxbc/libxbc.h   |  54 ++
 14 files changed, 806 insertions(+), 133 deletions(-)
 create mode 100644 include/xbc.h
 create mode 100644 lib/libxbc/Makefile
 create mode 100644 lib/libxbc/libxbc.c
 create mode 100644 lib/libxbc/libxbc.h

--
2.25.1