* [PATCH v4 1/5] boot: android: import addBootConfigParameters() from AOSP
2025-12-18 11:16 [PATCH v4 0/5] android: add bootconfig support Guillaume La Roque (TI.com)
@ 2025-12-18 11:16 ` Guillaume La Roque (TI.com)
2025-12-18 11:16 ` [PATCH v4 2/5] boot: android: Add sandbox memory mapping support Guillaume La Roque (TI.com)
` (3 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Guillaume La Roque (TI.com) @ 2025-12-18 11:16 UTC (permalink / raw)
To: Tom Rini, Mattijs Korpershoek
Cc: Julien Masson, Guillaume La Roque, u-boot, Simon Glass,
Nicolas Belin, Neil Armstrong, Andrew Goodbody, Aaron Kling,
George Chan, Sam Day, Jerome Forissier, Maxime Fournier,
Eddie Kovsky, Casey Connolly, Guillaume Ranquet
From: "Mattijs Korpershoek (TI.com)" <mkorpershoek@kernel.org>
To properly implement Android boot image v4, U-Boot must be able to
add additional entries to the bootconfig.
Add `add_bootconfig_parameters()` to do so.
This has been imported from Google's U-Boot source[1]
The variables/function names have been reworked to be
compliant with U-Boot's coding style.
[1] https://android.googlesource.com/platform/external/u-boot/+/7af0a0506d4de6f5ea147d10fb0664a8af07d326
Signed-off-by: Mattijs Korpershoek (TI.com) <mkorpershoek@kernel.org>
Reviewed-by: Mattijs Korpershoek <mkorpershoek@kernel.org>
Signed-off-by: Guillaume La Roque (TI.com) <glaroque@baylibre.com>
---
boot/image-android.c | 40 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git a/boot/image-android.c b/boot/image-android.c
index e46dee0d9b3..877cd39fbef 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -57,6 +57,46 @@ static ulong add_trailer(ulong bootconfig_start_addr, ulong bootconfig_size)
return BOOTCONFIG_TRAILER_SIZE;
}
+/*
+ * Add a string of boot config parameters to memory appended by the trailer.
+ * NOTE: This function expects bootconfig_start_addr to be already mapped.
+ * It works directly with the mapped pointer, not a physical address.
+ */
+static long add_bootconfig_parameters(char *params, long params_len,
+ ulong bootconfig_start_addr, u32 bootconfig_size)
+{
+ long applied_bytes = 0;
+ long new_size = 0;
+ ulong end;
+
+ if (!params || !bootconfig_start_addr)
+ return -EINVAL;
+
+ if (params_len == 0)
+ return 0;
+
+ end = bootconfig_start_addr + bootconfig_size;
+
+ if (is_trailer_present(end)) {
+ end -= BOOTCONFIG_TRAILER_SIZE;
+ applied_bytes -= BOOTCONFIG_TRAILER_SIZE;
+ memcpy(&new_size, (void *)end, BOOTCONFIG_SIZE_SIZE);
+ } else {
+ /*
+ * When no trailer is present, the bootconfig_size includes the actual content.
+ * We should write new parameters right after the existing content.
+ */
+ end = bootconfig_start_addr + bootconfig_size;
+ new_size = bootconfig_size;
+ }
+
+ memcpy((void *)end, params, params_len);
+ applied_bytes += params_len;
+ applied_bytes += add_trailer(bootconfig_start_addr,
+ bootconfig_size + applied_bytes);
+ return applied_bytes;
+}
+
__weak ulong get_avendor_bootimg_addr(void)
{
return -1;
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v4 2/5] boot: android: Add sandbox memory mapping support
2025-12-18 11:16 [PATCH v4 0/5] android: add bootconfig support Guillaume La Roque (TI.com)
2025-12-18 11:16 ` [PATCH v4 1/5] boot: android: import addBootConfigParameters() from AOSP Guillaume La Roque (TI.com)
@ 2025-12-18 11:16 ` Guillaume La Roque (TI.com)
2025-12-18 11:16 ` [PATCH v4 3/5] boot: android: Add bootconfig support Guillaume La Roque (TI.com)
` (2 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Guillaume La Roque (TI.com) @ 2025-12-18 11:16 UTC (permalink / raw)
To: Tom Rini, Mattijs Korpershoek
Cc: Julien Masson, Guillaume La Roque, u-boot, Simon Glass,
Nicolas Belin, Neil Armstrong, Andrew Goodbody, Aaron Kling,
George Chan, Sam Day, Jerome Forissier, Maxime Fournier,
Eddie Kovsky, Casey Connolly, Guillaume Ranquet
Use map_to_sysmem() to convert header pointers to physical addresses
in parse_hdr functions, and add proper map_sysmem()/unmap_sysmem()
calls in android_image_get_data() for sandbox compatibility.
Reviewed-by: Mattijs Korpershoek <mkorpershoek@kernel.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Guillaume La Roque (TI.com) <glaroque@baylibre.com>
---
boot/image-android.c | 41 ++++++++++++++++++++++++++++-------------
1 file changed, 28 insertions(+), 13 deletions(-)
diff --git a/boot/image-android.c b/boot/image-android.c
index 877cd39fbef..48886f39e4c 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -114,7 +114,7 @@ static void android_boot_image_v3_v4_parse_hdr(const struct andr_boot_img_hdr_v3
* The header takes a full page, the remaining components are aligned
* on page boundary.
*/
- end = (ulong)hdr;
+ end = map_to_sysmem(hdr);
end += ANDR_GKI_PAGE_SIZE;
data->kernel_ptr = end;
data->kernel_size = hdr->kernel_size;
@@ -127,7 +127,7 @@ static void android_boot_image_v3_v4_parse_hdr(const struct andr_boot_img_hdr_v3
if (hdr->header_version > 3)
end += ALIGN(hdr->signature_size, ANDR_GKI_PAGE_SIZE);
- data->boot_img_total_size = end - (ulong)hdr;
+ data->boot_img_total_size = end - map_to_sysmem(hdr);
}
static void android_vendor_boot_image_v3_v4_parse_hdr(const struct andr_vnd_boot_img_hdr
@@ -146,7 +146,7 @@ static void android_vendor_boot_image_v3_v4_parse_hdr(const struct andr_vnd_boot
data->ramdisk_addr = hdr->ramdisk_addr;
data->dtb_load_addr = hdr->dtb_addr;
data->bootconfig_size = hdr->bootconfig_size;
- end = (ulong)hdr;
+ end = map_to_sysmem(hdr);
if (hdr->header_version > 3)
end += ALIGN(ANDR_VENDOR_BOOT_V4_SIZE, hdr->page_size);
@@ -167,12 +167,16 @@ static void android_vendor_boot_image_v3_v4_parse_hdr(const struct andr_vnd_boot
end += ALIGN(hdr->vendor_ramdisk_table_size, hdr->page_size);
data->bootconfig_addr = end;
if (hdr->bootconfig_size) {
- data->bootconfig_size += add_trailer(data->bootconfig_addr,
+ void *bootconfig_ptr = map_sysmem(data->bootconfig_addr,
+ data->bootconfig_size +
+ BOOTCONFIG_TRAILER_SIZE);
+ data->bootconfig_size += add_trailer((ulong)bootconfig_ptr,
data->bootconfig_size);
+ unmap_sysmem(bootconfig_ptr);
data->ramdisk_size += data->bootconfig_size;
}
end += ALIGN(data->bootconfig_size, hdr->page_size);
- data->vendor_boot_img_total_size = end - (ulong)hdr;
+ data->vendor_boot_img_total_size = end - map_to_sysmem(hdr);
}
static void android_boot_image_v0_v1_v2_parse_hdr(const struct andr_boot_img_hdr_v0 *hdr,
@@ -187,7 +191,7 @@ static void android_boot_image_v0_v1_v2_parse_hdr(const struct andr_boot_img_hdr
data->header_version = hdr->header_version;
data->dtb_load_addr = hdr->dtb_addr;
- end = (ulong)hdr;
+ end = map_to_sysmem(hdr);
/*
* The header takes a full page, the remaining components are aligned
@@ -220,7 +224,7 @@ static void android_boot_image_v0_v1_v2_parse_hdr(const struct andr_boot_img_hdr
end += ALIGN(hdr->dtb_size, hdr->page_size);
}
- data->boot_img_total_size = end - (ulong)hdr;
+ data->boot_img_total_size = end - map_to_sysmem(hdr);
}
bool android_image_get_bootimg_size(const void *hdr, u32 *boot_img_size)
@@ -271,31 +275,42 @@ bool android_image_get_vendor_bootimg_size(const void *hdr, u32 *vendor_boot_img
bool android_image_get_data(const void *boot_hdr, const void *vendor_boot_hdr,
struct andr_image_data *data)
{
+ const struct andr_boot_img_hdr_v0 *bhdr;
+ const struct andr_vnd_boot_img_hdr *vhdr;
+
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)) {
+ bhdr = map_sysmem((ulong)boot_hdr, sizeof(*bhdr));
+ if (!is_android_boot_image_header(bhdr)) {
printf("Incorrect boot image header\n");
+ unmap_sysmem(bhdr);
return false;
}
- if (((struct andr_boot_img_hdr_v0 *)boot_hdr)->header_version > 2) {
+ if (bhdr->header_version > 2) {
if (!vendor_boot_hdr) {
printf("For boot header v3+ vendor boot image has to be provided\n");
+ unmap_sysmem(bhdr);
return false;
}
- if (!is_android_vendor_boot_image_header(vendor_boot_hdr)) {
+ vhdr = map_sysmem((ulong)vendor_boot_hdr, sizeof(*vhdr));
+ if (!is_android_vendor_boot_image_header(vhdr)) {
printf("Incorrect vendor boot image header\n");
+ unmap_sysmem(vhdr);
+ unmap_sysmem(bhdr);
return false;
}
- android_boot_image_v3_v4_parse_hdr(boot_hdr, data);
- android_vendor_boot_image_v3_v4_parse_hdr(vendor_boot_hdr, data);
+ android_boot_image_v3_v4_parse_hdr((const struct andr_boot_img_hdr_v3 *)bhdr, data);
+ android_vendor_boot_image_v3_v4_parse_hdr(vhdr, data);
+ unmap_sysmem(vhdr);
} else {
- android_boot_image_v0_v1_v2_parse_hdr(boot_hdr, data);
+ android_boot_image_v0_v1_v2_parse_hdr(bhdr, data);
}
+ unmap_sysmem(bhdr);
return true;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v4 3/5] boot: android: Add bootconfig support
2025-12-18 11:16 [PATCH v4 0/5] android: add bootconfig support Guillaume La Roque (TI.com)
2025-12-18 11:16 ` [PATCH v4 1/5] boot: android: import addBootConfigParameters() from AOSP Guillaume La Roque (TI.com)
2025-12-18 11:16 ` [PATCH v4 2/5] boot: android: Add sandbox memory mapping support Guillaume La Roque (TI.com)
@ 2025-12-18 11:16 ` Guillaume La Roque (TI.com)
2025-12-18 11:16 ` [PATCH v4 4/5] cmd: abootimg: Add 'get ramdisk' command Guillaume La Roque (TI.com)
2025-12-18 11:17 ` [PATCH v4 5/5] test: abootimg: Add test for bootconfig handling Guillaume La Roque (TI.com)
4 siblings, 0 replies; 8+ messages in thread
From: Guillaume La Roque (TI.com) @ 2025-12-18 11:16 UTC (permalink / raw)
To: Tom Rini, Mattijs Korpershoek
Cc: Julien Masson, Guillaume La Roque, u-boot, Simon Glass,
Nicolas Belin, Neil Armstrong, Andrew Goodbody, Aaron Kling,
George Chan, Sam Day, Jerome Forissier, Maxime Fournier,
Eddie Kovsky, Casey Connolly, Guillaume Ranquet
For android vendor boot image version 4 bootconfig is mandatory.[1]
In the android_image_get_ramdisk function, after copying both vendor and
boot ramdisks, we extract all androidboot.* entries from the kernel
command line. These entries are added to the bootconfig section.
We then update the sizes of the ramdisk and bootconfig.
Finally, all androidboot.* entries are removed from the kernel command
line.
[1] https://source.android.com/docs/core/architecture/partitions/vendor-boot-partitions#bootloader-support
Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Guillaume La Roque (TI.com) <glaroque@baylibre.com>
---
boot/image-android.c | 174 +++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 163 insertions(+), 11 deletions(-)
diff --git a/boot/image-android.c b/boot/image-android.c
index 48886f39e4c..76600aec863 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -505,6 +505,166 @@ ulong android_image_get_kcomp(const void *hdr,
return image_decomp_type(p, sizeof(u32));
}
+/**
+ * android_boot_append_bootconfig() - Append bootconfig parameters to ramdisk
+ * @img_data: Pointer to Android image data
+ * @params: Pointer to boot config parameters to append
+ * @params_len: Length of boot config parameters
+ * @ramdisk_dest: Destination address for the merged ramdisk
+ *
+ * This function copies the vendor ramdisk, boot ramdisk, and bootconfig to
+ * the destination. It then appends the provided bootconfig parameters.
+ *
+ * Return: Bytes added to the bootconfig on success, negative on error.
+ */
+static long android_boot_append_bootconfig(const struct andr_image_data *img_data,
+ char *params, long params_len,
+ void *ramdisk_dest)
+{
+ void *vendor_ramdisk_src;
+ void *boot_ramdisk_src;
+ void *bootconfig_src;
+ long bytes_added = 0;
+
+ /* Map sources */
+ vendor_ramdisk_src = map_sysmem(img_data->vendor_ramdisk_ptr,
+ img_data->vendor_ramdisk_size);
+ boot_ramdisk_src = map_sysmem(img_data->ramdisk_ptr,
+ img_data->boot_ramdisk_size);
+
+ /* Copy Vendor Ramdisk */
+ memcpy(ramdisk_dest, vendor_ramdisk_src, img_data->vendor_ramdisk_size);
+
+ /* Copy Boot Ramdisk */
+ memcpy((char *)ramdisk_dest + img_data->vendor_ramdisk_size,
+ boot_ramdisk_src, img_data->boot_ramdisk_size);
+
+ /* Copy Bootconfig and Append Params */
+ if (img_data->bootconfig_size) {
+ bootconfig_src = map_sysmem(img_data->bootconfig_addr,
+ img_data->bootconfig_size);
+ memcpy((char *)ramdisk_dest + img_data->vendor_ramdisk_size +
+ img_data->boot_ramdisk_size,
+ bootconfig_src, img_data->bootconfig_size);
+ unmap_sysmem(bootconfig_src);
+
+ if (params && params_len > 1) {
+ void *bootconfig_ptr = (char *)ramdisk_dest +
+ img_data->vendor_ramdisk_size +
+ img_data->boot_ramdisk_size;
+ bytes_added = add_bootconfig_parameters(params, params_len,
+ (ulong)bootconfig_ptr,
+ img_data->bootconfig_size);
+ }
+ }
+
+ unmap_sysmem(boot_ramdisk_src);
+ unmap_sysmem(vendor_ramdisk_src);
+
+ if (bytes_added < 0)
+ return bytes_added;
+
+ return bytes_added;
+}
+
+/**
+ * android_image_set_bootconfig() - Extract androidboot.* args and append to bootconfig
+ * @hdr: Pointer to boot image header
+ * @vendor_boot_img: Pointer to vendor boot image header
+ * @ramdisk_addr: Destination address for the merged ramdisk
+ *
+ * Return: Size of the bootconfig section (including new params) on success, negative on error.
+ */
+static long android_image_set_bootconfig(const void *hdr,
+ const void *vendor_boot_img,
+ ulong ramdisk_addr)
+{
+ const char *bootargs = env_get("bootargs");
+ char *params = NULL;
+ char *new_bootargs = NULL;
+ long params_len = 0; /* Renamed from androidboot_params_len */
+ struct andr_image_data img_data;
+ long ret;
+ size_t len;
+ const char *src;
+ char *bc_dst;
+ char *args_dst;
+ ulong total_size;
+ void *ramdisk_dest;
+
+ if (!android_image_get_data(hdr, vendor_boot_img, &img_data))
+ return -EINVAL; /* Use errno */
+
+ /* Extract androidboot.* parameters from bootargs */
+ if (bootargs && img_data.bootconfig_size) {
+ len = strlen(bootargs);
+ src = bootargs;
+
+ params = malloc(len + 1);
+ new_bootargs = malloc(len + 1);
+ if (!params || !new_bootargs) {
+ free(params);
+ free(new_bootargs);
+ printf("Error: malloc failed\n");
+ return -ENOMEM;
+ }
+
+ bc_dst = params;
+ args_dst = new_bootargs;
+
+ /* Extract androidboot.* and build new bootargs in one pass */
+ while (*src) {
+ /* Skip leading spaces */
+ while (*src == ' ')
+ src++;
+ if (!*src)
+ break;
+
+ /* Check if this param starts with androidboot. */
+ if (strncmp(src, "androidboot.", 12) == 0) {
+ /* Copy to bootconfig (add newline if not first) */
+ if (bc_dst != params)
+ *bc_dst++ = '\n';
+ while (*src && *src != ' ')
+ *bc_dst++ = *src++;
+ } else {
+ /* Copy to new bootargs (add space if not first) */
+ if (args_dst != new_bootargs)
+ *args_dst++ = ' ';
+ while (*src && *src != ' ')
+ *args_dst++ = *src++;
+ }
+ }
+
+ *bc_dst++ = '\n'; /* Final newline for bootconfig */
+ *bc_dst = '\0';
+ *args_dst = '\0';
+ params_len = bc_dst - params;
+
+ /* Update bootargs if we extracted any androidboot params */
+ if (params_len > 1)
+ env_set("bootargs", new_bootargs);
+ }
+
+ /* Calculate total size for mapping */
+ total_size = img_data.ramdisk_size + img_data.bootconfig_size;
+ if (params_len > 1)
+ total_size += params_len + BOOTCONFIG_TRAILER_SIZE;
+
+ /* Map Dest */
+ ramdisk_dest = map_sysmem(ramdisk_addr, total_size);
+
+ /* Copy data */
+ ret = android_boot_append_bootconfig(&img_data, params, params_len,
+ ramdisk_dest);
+
+ unmap_sysmem(ramdisk_dest);
+ free(params);
+ free(new_bootargs);
+
+ return ret;
+}
+
int android_image_get_ramdisk(const void *hdr, const void *vendor_boot_img,
ulong *rd_data, ulong *rd_len)
{
@@ -536,17 +696,9 @@ int android_image_get_ramdisk(const void *hdr, const void *vendor_boot_img,
ramdisk_ptr = img_data.ramdisk_addr;
}
*rd_data = ramdisk_ptr;
- memcpy((void *)(ramdisk_ptr), (void *)img_data.vendor_ramdisk_ptr,
- img_data.vendor_ramdisk_size);
- ramdisk_ptr += img_data.vendor_ramdisk_size;
- memcpy((void *)(ramdisk_ptr), (void *)img_data.ramdisk_ptr,
- img_data.boot_ramdisk_size);
- ramdisk_ptr += img_data.boot_ramdisk_size;
- if (img_data.bootconfig_size) {
- memcpy((void *)
- (ramdisk_ptr), (void *)img_data.bootconfig_addr,
- img_data.bootconfig_size);
- }
+ if (img_data.header_version > 3)
+ img_data.ramdisk_size +=
+ android_image_set_bootconfig(hdr, vendor_boot_img, ramdisk_ptr);
} else {
/* Ramdisk can be used in-place, use current ptr */
if (img_data.ramdisk_addr == 0 ||
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v4 4/5] cmd: abootimg: Add 'get ramdisk' command
2025-12-18 11:16 [PATCH v4 0/5] android: add bootconfig support Guillaume La Roque (TI.com)
` (2 preceding siblings ...)
2025-12-18 11:16 ` [PATCH v4 3/5] boot: android: Add bootconfig support Guillaume La Roque (TI.com)
@ 2025-12-18 11:16 ` Guillaume La Roque (TI.com)
2025-12-18 11:17 ` [PATCH v4 5/5] test: abootimg: Add test for bootconfig handling Guillaume La Roque (TI.com)
4 siblings, 0 replies; 8+ messages in thread
From: Guillaume La Roque (TI.com) @ 2025-12-18 11:16 UTC (permalink / raw)
To: Tom Rini, Mattijs Korpershoek
Cc: Julien Masson, Guillaume La Roque, u-boot, Simon Glass,
Nicolas Belin, Neil Armstrong, Andrew Goodbody, Aaron Kling,
George Chan, Sam Day, Jerome Forissier, Maxime Fournier,
Eddie Kovsky, Casey Connolly, Guillaume Ranquet
Add support for retrieving ramdisk address and size from Android boot
images. This command allows users to extract the ramdisk information
for boot image v3+ which combines vendor ramdisk, boot ramdisk and
bootconfig sections.
Reviewed-by: Mattijs Korpershoek <mkorpershoek@kernel.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Guillaume La Roque (TI.com) <glaroque@baylibre.com>
---
cmd/abootimg.c | 35 ++++++++++++++++++++++++++++++++++-
1 file changed, 34 insertions(+), 1 deletion(-)
diff --git a/cmd/abootimg.c b/cmd/abootimg.c
index 6fb52153786..2a8e2c20941 100644
--- a/cmd/abootimg.c
+++ b/cmd/abootimg.c
@@ -230,6 +230,33 @@ static int do_abootimg_addr(struct cmd_tbl *cmdtp, int flag, int argc,
return CMD_RET_SUCCESS;
}
+static int abootimg_get_ramdisk(int argc, char *const argv[])
+{
+ ulong rd_data, rd_len;
+
+ if (argc > 2)
+ return CMD_RET_USAGE;
+
+ /*
+ * Call android_image_get_ramdisk with UNMAPPED addresses
+ * The function will do its own mapping internally as needed
+ */
+ if (android_image_get_ramdisk((void *)abootimg_addr(),
+ (void *)get_avendor_bootimg_addr(),
+ &rd_data, &rd_len))
+ return CMD_RET_FAILURE;
+
+ if (argc == 0) {
+ printf("%lx\n", rd_data);
+ } else {
+ env_set_hex(argv[0], rd_data);
+ if (argc == 2)
+ env_set_hex(argv[1], rd_len);
+ }
+
+ return CMD_RET_SUCCESS;
+}
+
static int do_abootimg_get(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
@@ -249,6 +276,8 @@ static int do_abootimg_get(struct cmd_tbl *cmdtp, int flag, int argc,
return abootimg_get_dtb_load_addr(argc, argv);
else if (!strcmp(param, "dtb"))
return abootimg_get_dtb(argc, argv);
+ else if (!strcmp(param, "ramdisk"))
+ return abootimg_get_ramdisk(argc, argv);
return CMD_RET_USAGE;
}
@@ -315,5 +344,9 @@ U_BOOT_CMD(
" - get address and size (hex) of DT blob in the image by index\n"
" <num>: index number of desired DT blob in DTB area\n"
" [addr_var]: variable name to contain DT blob address\n"
- " [size_var]: variable name to contain DT blob size"
+ " [size_var]: variable name to contain DT blob size\n"
+ "abootimg get ramdisk [addr_var [size_var]]\n"
+ " - get address and size (hex) of ramdisk in the image\n"
+ " [addr_var]: variable name to contain ramdisk address\n"
+ " [size_var]: variable name to contain ramdisk size"
);
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v4 5/5] test: abootimg: Add test for bootconfig handling
2025-12-18 11:16 [PATCH v4 0/5] android: add bootconfig support Guillaume La Roque (TI.com)
` (3 preceding siblings ...)
2025-12-18 11:16 ` [PATCH v4 4/5] cmd: abootimg: Add 'get ramdisk' command Guillaume La Roque (TI.com)
@ 2025-12-18 11:17 ` Guillaume La Roque (TI.com)
2026-01-09 9:07 ` Mattijs Korpershoek
4 siblings, 1 reply; 8+ messages in thread
From: Guillaume La Roque (TI.com) @ 2025-12-18 11:17 UTC (permalink / raw)
To: Tom Rini, Mattijs Korpershoek
Cc: Julien Masson, Guillaume La Roque, u-boot, Simon Glass,
Nicolas Belin, Neil Armstrong, Andrew Goodbody, Aaron Kling,
George Chan, Sam Day, Jerome Forissier, Maxime Fournier,
Eddie Kovsky, Casey Connolly, Guillaume Ranquet
Add test to verify that androidboot.* parameters are correctly extracted
from bootargs and appended to the bootconfig section when using
'abootimg get ramdisk' with boot image v4 and vendor_boot image.
The test verifies:
- androidboot.* parameters are removed from bootargs
- They are appended to the bootconfig section in the ramdisk
- Non-androidboot parameters remain in bootargs
- The bootconfig trailer is properly updated
Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Guillaume La Roque (TI.com) <glaroque@baylibre.com>
---
test/py/tests/test_android/test_abootimg.py | 108 +++++++++++++++++++++++++---
1 file changed, 99 insertions(+), 9 deletions(-)
diff --git a/test/py/tests/test_android/test_abootimg.py b/test/py/tests/test_android/test_abootimg.py
index 2aadb692b30..bd5fb992a7d 100644
--- a/test/py/tests/test_android/test_abootimg.py
+++ b/test/py/tests/test_android/test_abootimg.py
@@ -69,15 +69,33 @@ e5bddc8a7b792d8e8788c896ce9b88d32ebe6c971e7ddd3543cae734cd01
c0ffc84c0000b0766d1a87d4e5afeadd3dab7a6f10000000f84163d5d7cd
d43a000000000000000060c53e7544995700400000"""
-# vendor boot image v4 hex dump
-vboot_img_hex = """1f8b0808baaecd63020376626f6f742e696d6700edd8310b824018c6f1b3
-222a08f41b3436b4280dcdd19c11d16ee9109d18d59042d047ec8b04cd0d
-d19d5a4345534bf6ffc173ef29272f38e93b1d0ec67dd79d548462aa1cd2
-d5d20b0000f8438678f90c18d584b8a4bbb3a557991ecb2a0000f80d6b2f
-f4179b656be5c532f2fc066f040000000080e23936af2755f62a3d918df1
-db2a7ab67f9ffdeb7df7cda3465ecb79c4ce7e5c577562bb9364b74449a5
-1e467e20c53c0a57de763193c1779b3b4fcd9d4ee27c6a0e00000000c0ff
-309ffea7010000000040f1dc004129855400400000"""
+# vendor boot image v4 hex dump (contains initial bootconfig: androidboot.hardware=test)
+vboot_img_hex = """1f8b08000000000002ffeddb316a02411806d009a49040606d3d84374823a9a348b095
+915951b2c9caee8690ce237a91406a0b497603e215dcbc577cf3334cf5350303b3787a
+9c4fa6d3e7dbf02b6b63dfc6b01b0180ffe726644d5e37975bb34108c76efa1eb65974
+c7fed691c600e02a64e7ab3e8494afe37bd128050000007ae6707ffad202000000f45b
+155fd3b67e59eee26751c674a711000000e89ff896aa729b5665d98c37b14a1fb1ca1f
+da4f7f5e02000000a0377e0040ab5ba000500000"""
+
+# bootable boot image v4 hex dump (contains actual bootable kernel)
+boot_bootable_img_hex = """1f8b08081663ee6802ff626f6f745f626f6f7461626c655f76342e696d67
+00edd1c14ac3401485e159b80a083ec24dba4f117c81d8140c6dad24ee25
+4da6e9d07452321305dfca37d4d4ec5cb954fe6f37ccb967606ef298e6db
+2c0d3f94526feae25adda81fae140000000000f8ab66e17c67ecdc1d025d
+1d3a89125bf79da9e5beebbc64a7b2d1f27a27cfda7959e9deea369a8263
+a0eaecde34e2c75b375495766e3fb46114cca430a7a12dbd96e3654a7663
+dfb9f4feeb383514beecbdb1cd1489e3380a5cabf5596ea7c4f78b62acf1
+a66ccdbbaea380950100000000f06b79b249b362f5f2b44e16cb87ed3a5d
+e67c0a0000000000ffcc27ba944c7e00300000"""
+
+# bootable vendor boot image v4 hex dump (contains actual bootable ramdisk)
+vendor_boot_bootable_img_hex = """1f8b08081663ee6802ff76656e646f725f626f6f745f626f6f7461626c65
+5f76342e696d6700edd8b10a02310cc6f10c0e7220f8080737b8b93ab9a8
+282e571171959e0d787058a84557f5c96ddd7d80c3ff0f92217c5396408e
+f56abf30e63090649c9b3c53bd050000fcab57d45b3c35de47db749a06bb
+e1eff08c7d0100d00bf6ea826f5dbef0d38b0dee618396f3f27bf69ddedb
+b316558a4d462255fe132c4dbdde6e0a160700000000408f7c0027597569
+00200000"""
# Expected response for "abootimg dtb_dump" command
dtb_dump_resp="""## DTB area contents (concat format):
@@ -179,6 +197,24 @@ def abootimgv4_disk_image_boot(ubman):
gtdi3 = AbootimgTestDiskImage(ubman, 'bootv4.img', boot_img_hex)
return gtdi3
+gtdi4 = None
+@pytest.fixture(scope='function')
+def abootimgv4_bootable_disk_image_boot(ubman):
+ """pytest fixture to provide bootable boot image v4."""
+ global gtdi4
+ if not gtdi4:
+ gtdi4 = AbootimgTestDiskImage(ubman, 'boot_bootable_v4.img', boot_bootable_img_hex)
+ return gtdi4
+
+gtdi5 = None
+@pytest.fixture(scope='function')
+def abootimgv4_bootable_disk_image_vboot(ubman):
+ """pytest fixture to provide bootable vendor boot image v4."""
+ global gtdi5
+ if not gtdi5:
+ gtdi5 = AbootimgTestDiskImage(ubman, 'vendor_boot_bootable_v4.img', vendor_boot_bootable_img_hex)
+ return gtdi5
+
@pytest.mark.boardspec('sandbox')
@pytest.mark.buildconfigspec('android_boot_image')
@pytest.mark.buildconfigspec('cmd_abootimg')
@@ -266,3 +302,57 @@ def test_abootimgv4(abootimgv4_disk_image_vboot, abootimgv4_disk_image_boot, ubm
ubman.run_command('fdt get value v / model')
response = ubman.run_command('env print v')
assert response == 'v=x2'
+
+@pytest.mark.boardspec('sandbox')
+@pytest.mark.buildconfigspec('android_boot_image')
+@pytest.mark.buildconfigspec('cmd_abootimg')
+@pytest.mark.requiredtool('xxd')
+@pytest.mark.requiredtool('gunzip')
+def test_abootimg_bootconfig(abootimgv4_disk_image_vboot,
+ abootimgv4_disk_image_boot,
+ ubman):
+ """Test bootconfig handling with boot image v4.
+
+ Verifies that androidboot.* parameters from bootargs are appended to the
+ bootconfig section in vendor_boot image in memory, and that non-androidboot
+ parameters remain in bootargs.
+ """
+
+ # Setup addresses
+ ram_base = utils.find_ram_base(ubman)
+ ramdisk_addr_r = ram_base + 0x4000000
+ ubman.run_command('setenv ramdisk_addr_r 0x%x' % ramdisk_addr_r)
+ ubman.run_command('setenv loadaddr 0x%x' % loadaddr)
+ ubman.run_command('setenv vloadaddr 0x%x' % vloadaddr)
+
+ # Set bootargs with androidboot.* parameters
+ ubman.run_command('setenv bootargs "androidboot.serialno=ABC123 androidboot.mode=recovery console=ttyS0"')
+
+ # Load images
+ ubman.run_command('host load hostfs - 0x%x %s' % (vloadaddr,
+ abootimgv4_disk_image_vboot.path))
+ ubman.run_command('host load hostfs - 0x%x %s' % (loadaddr,
+ abootimgv4_disk_image_boot.path))
+ ubman.run_command('abootimg addr 0x%x 0x%x' % (loadaddr, vloadaddr))
+
+ # Extract ramdisk (triggers bootconfig append)
+ ubman.run_command('abootimg get ramdisk ramdisk_addr ramdisk_size')
+
+ # Get ramdisk address
+ response = ubman.run_command('env print ramdisk_addr')
+ ramdisk_start = int(response.split('=')[1], 16)
+
+ # Verify androidboot.* parameters were removed from bootargs
+ response = ubman.run_command('env print bootargs')
+ assert 'androidboot.' not in response
+ assert 'console=ttyS0' in response
+
+ # Get ramdisk size and verify BOOTCONFIG magic at the end
+ response = ubman.run_command('env print ramdisk_size')
+ ramdisk_size = int(response.split('=')[1], 16)
+
+ # Dump the end of the ramdisk where BOOTCONFIG trailer should be
+ response = ubman.run_command('md.b 0x%x 96' % (ramdisk_start))
+
+ # Verify BOOTCONFIG magic is present
+ assert 'BOOTCONFIG' in response or 'BOOTCON' in response
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH v4 5/5] test: abootimg: Add test for bootconfig handling
2025-12-18 11:17 ` [PATCH v4 5/5] test: abootimg: Add test for bootconfig handling Guillaume La Roque (TI.com)
@ 2026-01-09 9:07 ` Mattijs Korpershoek
2026-01-09 9:57 ` Guillaume La Roque
0 siblings, 1 reply; 8+ messages in thread
From: Mattijs Korpershoek @ 2026-01-09 9:07 UTC (permalink / raw)
To: Guillaume La Roque (TI.com), Tom Rini, Mattijs Korpershoek
Cc: Julien Masson, Guillaume La Roque, u-boot, Simon Glass,
Nicolas Belin, Neil Armstrong, Andrew Goodbody, Aaron Kling,
George Chan, Sam Day, Jerome Forissier, Maxime Fournier,
Eddie Kovsky, Casey Connolly, Guillaume Ranquet
Hi Guillaume,
Thank you for the patch.
On Thu, Dec 18, 2025 at 12:17, "Guillaume La Roque (TI.com)" <glaroque@baylibre.com> wrote:
> Add test to verify that androidboot.* parameters are correctly extracted
> from bootargs and appended to the bootconfig section when using
> 'abootimg get ramdisk' with boot image v4 and vendor_boot image.
>
> The test verifies:
> - androidboot.* parameters are removed from bootargs
> - They are appended to the bootconfig section in the ramdisk
> - Non-androidboot parameters remain in bootargs
> - The bootconfig trailer is properly updated
>
> Reviewed-by: Simon Glass <sjg@chromium.org>
> Signed-off-by: Guillaume La Roque (TI.com) <glaroque@baylibre.com>
I've tested this on top of master
commit c05dba22f1f2 ("Merge branch 'master' of git://source.denx.de/u-boot-usb")
with:
$ ./test/py/test.py --bd sandbox --build -k ut
$ ./test/py/test.py --bd sandbox --build -k android
And I see:
FAILED test/py/tests/test_android/test_abootimg.py::test_abootimg - ValueError: U-Boot exited with signal 6 (SIGABRT)
FAILED test/py/tests/test_android/test_abootimg.py::test_abootimgv4 - ValueError: U-Boot exited with signal 6 (SIGABRT)
Also, see below for some review comments
> ---
> test/py/tests/test_android/test_abootimg.py | 108 +++++++++++++++++++++++++---
> 1 file changed, 99 insertions(+), 9 deletions(-)
>
> diff --git a/test/py/tests/test_android/test_abootimg.py b/test/py/tests/test_android/test_abootimg.py
> index 2aadb692b30..bd5fb992a7d 100644
> --- a/test/py/tests/test_android/test_abootimg.py
> +++ b/test/py/tests/test_android/test_abootimg.py
> @@ -69,15 +69,33 @@ e5bddc8a7b792d8e8788c896ce9b88d32ebe6c971e7ddd3543cae734cd01
> c0ffc84c0000b0766d1a87d4e5afeadd3dab7a6f10000000f84163d5d7cd
> d43a000000000000000060c53e7544995700400000"""
>
> -# vendor boot image v4 hex dump
> -vboot_img_hex = """1f8b0808baaecd63020376626f6f742e696d6700edd8310b824018c6f1b3
> -222a08f41b3436b4280dcdd19c11d16ee9109d18d59042d047ec8b04cd0d
> -d19d5a4345534bf6ffc173ef29272f38e93b1d0ec67dd79d548462aa1cd2
> -d5d20b0000f8438678f90c18d584b8a4bbb3a557991ecb2a0000f80d6b2f
> -f4179b656be5c532f2fc066f040000000080e23936af2755f62a3d918df1
> -db2a7ab67f9ffdeb7df7cda3465ecb79c4ce7e5c577562bb9364b74449a5
> -1e467e20c53c0a57de763193c1779b3b4fcd9d4ee27c6a0e00000000c0ff
> -309ffea7010000000040f1dc004129855400400000"""
> +# vendor boot image v4 hex dump (contains initial bootconfig: androidboot.hardware=test)
> +vboot_img_hex = """1f8b08000000000002ffeddb316a02411806d009a49040606d3d84374823a9a348b095
> +915951b2c9caee8690ce237a91406a0b497603e215dcbc577cf3334cf5350303b3787a
> +9c4fa6d3e7dbf02b6b63dfc6b01b0180ffe726644d5e37975bb34108c76efa1eb65974
> +c7fed691c600e02a64e7ab3e8494afe37bd128050000007ae6707ffad202000000f45b
> +155fd3b67e59eee26751c674a711000000e89ff896aa729b5665d98c37b14a1fb1ca1f
> +da4f7f5e02000000a0377e0040ab5ba000500000"""
> +
> +# bootable boot image v4 hex dump (contains actual bootable kernel)
> +boot_bootable_img_hex = """1f8b08081663ee6802ff626f6f745f626f6f7461626c655f76342e696d67
> +00edd1c14ac3401485e159b80a083ec24dba4f117c81d8140c6dad24ee25
> +4da6e9d07452321305dfca37d4d4ec5cb954fe6f37ccb967606ef298e6db
> +2c0d3f94526feae25adda81fae140000000000f8ab66e17c67ecdc1d025d
> +1d3a89125bf79da9e5beebbc64a7b2d1f27a27cfda7959e9deea369a8263
> +a0eaecde34e2c75b375495766e3fb46114cca430a7a12dbd96e3654a7663
> +dfb9f4feeb383514beecbdb1cd1489e3380a5cabf5596ea7c4f78b62acf1
> +a66ccdbbaea380950100000000f06b79b249b362f5f2b44e16cb87ed3a5d
> +e67c0a0000000000ffcc27ba944c7e00300000"""
> +
> +# bootable vendor boot image v4 hex dump (contains actual bootable ramdisk)
> +vendor_boot_bootable_img_hex = """1f8b08081663ee6802ff76656e646f725f626f6f745f626f6f7461626c65
> +5f76342e696d6700edd8b10a02310cc6f10c0e7220f8080737b8b93ab9a8
> +282e571171959e0d787058a84557f5c96ddd7d80c3ff0f92217c5396408e
> +f56abf30e63090649c9b3c53bd050000fcab57d45b3c35de47db749a06bb
> +e1eff08c7d0100d00bf6ea826f5dbef0d38b0dee618396f3f27bf69ddedb
> +b316558a4d462255fe132c4dbdde6e0a160700000000408f7c0027597569
> +00200000"""
Can we use boot_bootable and vendor_boot_bootable images for the other tests
as well? (for example for testing bootmeth_android)
This would reduce the amount of images we need.
>
> # Expected response for "abootimg dtb_dump" command
> dtb_dump_resp="""## DTB area contents (concat format):
> @@ -179,6 +197,24 @@ def abootimgv4_disk_image_boot(ubman):
> gtdi3 = AbootimgTestDiskImage(ubman, 'bootv4.img', boot_img_hex)
> return gtdi3
>
> +gtdi4 = None
> +@pytest.fixture(scope='function')
> +def abootimgv4_bootable_disk_image_boot(ubman):
> + """pytest fixture to provide bootable boot image v4."""
> + global gtdi4
> + if not gtdi4:
> + gtdi4 = AbootimgTestDiskImage(ubman, 'boot_bootable_v4.img', boot_bootable_img_hex)
> + return gtdi4
> +
> +gtdi5 = None
> +@pytest.fixture(scope='function')
> +def abootimgv4_bootable_disk_image_vboot(ubman):
> + """pytest fixture to provide bootable vendor boot image v4."""
> + global gtdi5
> + if not gtdi5:
> + gtdi5 = AbootimgTestDiskImage(ubman, 'vendor_boot_bootable_v4.img', vendor_boot_bootable_img_hex)
> + return gtdi5
> +
> @pytest.mark.boardspec('sandbox')
> @pytest.mark.buildconfigspec('android_boot_image')
> @pytest.mark.buildconfigspec('cmd_abootimg')
> @@ -266,3 +302,57 @@ def test_abootimgv4(abootimgv4_disk_image_vboot, abootimgv4_disk_image_boot, ubm
> ubman.run_command('fdt get value v / model')
> response = ubman.run_command('env print v')
> assert response == 'v=x2'
> +
> +@pytest.mark.boardspec('sandbox')
> +@pytest.mark.buildconfigspec('android_boot_image')
> +@pytest.mark.buildconfigspec('cmd_abootimg')
> +@pytest.mark.requiredtool('xxd')
> +@pytest.mark.requiredtool('gunzip')
> +def test_abootimg_bootconfig(abootimgv4_disk_image_vboot,
> + abootimgv4_disk_image_boot,
> + ubman):
> + """Test bootconfig handling with boot image v4.
> +
> + Verifies that androidboot.* parameters from bootargs are appended to the
> + bootconfig section in vendor_boot image in memory, and that non-androidboot
> + parameters remain in bootargs.
> + """
> +
> + # Setup addresses
> + ram_base = utils.find_ram_base(ubman)
> + ramdisk_addr_r = ram_base + 0x4000000
> + ubman.run_command('setenv ramdisk_addr_r 0x%x' % ramdisk_addr_r)
> + ubman.run_command('setenv loadaddr 0x%x' % loadaddr)
> + ubman.run_command('setenv vloadaddr 0x%x' % vloadaddr)
> +
> + # Set bootargs with androidboot.* parameters
> + ubman.run_command('setenv bootargs "androidboot.serialno=ABC123 androidboot.mode=recovery console=ttyS0"')
> +
> + # Load images
> + ubman.run_command('host load hostfs - 0x%x %s' % (vloadaddr,
> + abootimgv4_disk_image_vboot.path))
> + ubman.run_command('host load hostfs - 0x%x %s' % (loadaddr,
> + abootimgv4_disk_image_boot.path))
> + ubman.run_command('abootimg addr 0x%x 0x%x' % (loadaddr, vloadaddr))
> +
> + # Extract ramdisk (triggers bootconfig append)
> + ubman.run_command('abootimg get ramdisk ramdisk_addr ramdisk_size')
> +
> + # Get ramdisk address
> + response = ubman.run_command('env print ramdisk_addr')
> + ramdisk_start = int(response.split('=')[1], 16)
> +
> + # Verify androidboot.* parameters were removed from bootargs
> + response = ubman.run_command('env print bootargs')
> + assert 'androidboot.' not in response
> + assert 'console=ttyS0' in response
> +
> + # Get ramdisk size and verify BOOTCONFIG magic at the end
> + response = ubman.run_command('env print ramdisk_size')
> + ramdisk_size = int(response.split('=')[1], 16)
> +
> + # Dump the end of the ramdisk where BOOTCONFIG trailer should be
> + response = ubman.run_command('md.b 0x%x 96' % (ramdisk_start))
> +
> + # Verify BOOTCONFIG magic is present
> + assert 'BOOTCONFIG' in response or 'BOOTCON' in response
Why verifying both BOOTCONFIG and BOOTCON ?
According to [1], the magic is BOOTCONFIG. So this makes checking for
BOOTCON irrelevant.
[1] https://source.android.com/docs/core/architecture/bootloader/implementing-bootconfig#bootloader-changes
>
> --
> 2.34.1
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH v4 5/5] test: abootimg: Add test for bootconfig handling
2026-01-09 9:07 ` Mattijs Korpershoek
@ 2026-01-09 9:57 ` Guillaume La Roque
0 siblings, 0 replies; 8+ messages in thread
From: Guillaume La Roque @ 2026-01-09 9:57 UTC (permalink / raw)
To: Mattijs Korpershoek, Tom Rini
Cc: Julien Masson, u-boot, Simon Glass, Nicolas Belin, Neil Armstrong,
Andrew Goodbody, Aaron Kling, George Chan, Sam Day,
Jerome Forissier, Maxime Fournier, Eddie Kovsky, Casey Connolly,
Guillaume Ranquet
Hi Mattijs,
Le 09/01/2026 à 10:07, Mattijs Korpershoek a écrit :
> Hi Guillaume,
>
> Thank you for the patch.
>
> On Thu, Dec 18, 2025 at 12:17, "Guillaume La Roque (TI.com)" <glaroque@baylibre.com> wrote:
>
>> Add test to verify that androidboot.* parameters are correctly extracted
>> from bootargs and appended to the bootconfig section when using
>> 'abootimg get ramdisk' with boot image v4 and vendor_boot image.
>>
>> The test verifies:
>> - androidboot.* parameters are removed from bootargs
>> - They are appended to the bootconfig section in the ramdisk
>> - Non-androidboot parameters remain in bootargs
>> - The bootconfig trailer is properly updated
>>
>> Reviewed-by: Simon Glass <sjg@chromium.org>
>> Signed-off-by: Guillaume La Roque (TI.com) <glaroque@baylibre.com>
> I've tested this on top of master
> commit c05dba22f1f2 ("Merge branch 'master' of git://source.denx.de/u-boot-usb")
>
> with:
> $ ./test/py/test.py --bd sandbox --build -k ut
> $ ./test/py/test.py --bd sandbox --build -k android
>
> And I see:
> FAILED test/py/tests/test_android/test_abootimg.py::test_abootimg - ValueError: U-Boot exited with signal 6 (SIGABRT)
> FAILED test/py/tests/test_android/test_abootimg.py::test_abootimgv4 - ValueError: U-Boot exited with signal 6 (SIGABRT)
thanks for testing i will check, in december i don't see this issue i
investigate and fix it.
>
> Also, see below for some review comments
>
>> ---
>> test/py/tests/test_android/test_abootimg.py | 108 +++++++++++++++++++++++++---
>> 1 file changed, 99 insertions(+), 9 deletions(-)
>>
>> diff --git a/test/py/tests/test_android/test_abootimg.py b/test/py/tests/test_android/test_abootimg.py
>> index 2aadb692b30..bd5fb992a7d 100644
>> --- a/test/py/tests/test_android/test_abootimg.py
>> +++ b/test/py/tests/test_android/test_abootimg.py
>> @@ -69,15 +69,33 @@ e5bddc8a7b792d8e8788c896ce9b88d32ebe6c971e7ddd3543cae734cd01
>> c0ffc84c0000b0766d1a87d4e5afeadd3dab7a6f10000000f84163d5d7cd
>> d43a000000000000000060c53e7544995700400000"""
>>
>> -# vendor boot image v4 hex dump
>> -vboot_img_hex = """1f8b0808baaecd63020376626f6f742e696d6700edd8310b824018c6f1b3
>> -222a08f41b3436b4280dcdd19c11d16ee9109d18d59042d047ec8b04cd0d
>> -d19d5a4345534bf6ffc173ef29272f38e93b1d0ec67dd79d548462aa1cd2
>> -d5d20b0000f8438678f90c18d584b8a4bbb3a557991ecb2a0000f80d6b2f
>> -f4179b656be5c532f2fc066f040000000080e23936af2755f62a3d918df1
>> -db2a7ab67f9ffdeb7df7cda3465ecb79c4ce7e5c577562bb9364b74449a5
>> -1e467e20c53c0a57de763193c1779b3b4fcd9d4ee27c6a0e00000000c0ff
>> -309ffea7010000000040f1dc004129855400400000"""
>> +# vendor boot image v4 hex dump (contains initial bootconfig: androidboot.hardware=test)
>> +vboot_img_hex = """1f8b08000000000002ffeddb316a02411806d009a49040606d3d84374823a9a348b095
>> +915951b2c9caee8690ce237a91406a0b497603e215dcbc577cf3334cf5350303b3787a
>> +9c4fa6d3e7dbf02b6b63dfc6b01b0180ffe726644d5e37975bb34108c76efa1eb65974
>> +c7fed691c600e02a64e7ab3e8494afe37bd128050000007ae6707ffad202000000f45b
>> +155fd3b67e59eee26751c674a711000000e89ff896aa729b5665d98c37b14a1fb1ca1f
>> +da4f7f5e02000000a0377e0040ab5ba000500000"""
>> +
>> +# bootable boot image v4 hex dump (contains actual bootable kernel)
>> +boot_bootable_img_hex = """1f8b08081663ee6802ff626f6f745f626f6f7461626c655f76342e696d67
>> +00edd1c14ac3401485e159b80a083ec24dba4f117c81d8140c6dad24ee25
>> +4da6e9d07452321305dfca37d4d4ec5cb954fe6f37ccb967606ef298e6db
>> +2c0d3f94526feae25adda81fae140000000000f8ab66e17c67ecdc1d025d
>> +1d3a89125bf79da9e5beebbc64a7b2d1f27a27cfda7959e9deea369a8263
>> +a0eaecde34e2c75b375495766e3fb46114cca430a7a12dbd96e3654a7663
>> +dfb9f4feeb383514beecbdb1cd1489e3380a5cabf5596ea7c4f78b62acf1
>> +a66ccdbbaea380950100000000f06b79b249b362f5f2b44e16cb87ed3a5d
>> +e67c0a0000000000ffcc27ba944c7e00300000"""
>> +
>> +# bootable vendor boot image v4 hex dump (contains actual bootable ramdisk)
>> +vendor_boot_bootable_img_hex = """1f8b08081663ee6802ff76656e646f725f626f6f745f626f6f7461626c65
>> +5f76342e696d6700edd8b10a02310cc6f10c0e7220f8080737b8b93ab9a8
>> +282e571171959e0d787058a84557f5c96ddd7d80c3ff0f92217c5396408e
>> +f56abf30e63090649c9b3c53bd050000fcab57d45b3c35de47db749a06bb
>> +e1eff08c7d0100d00bf6ea826f5dbef0d38b0dee618396f3f27bf69ddedb
>> +b316558a4d462255fe132c4dbdde6e0a160700000000408f7c0027597569
>> +00200000"""
> Can we use boot_bootable and vendor_boot_bootable images for the other tests
> as well? (for example for testing bootmeth_android)
>
> This would reduce the amount of images we need.
image image was not complete so i recreate new one to have possibility
to load ramdisk without issue.
i will probably need to move bootmeth android test on this new image and
remove initial . i will check
>
>>
>> # Expected response for "abootimg dtb_dump" command
>> dtb_dump_resp="""## DTB area contents (concat format):
>> @@ -179,6 +197,24 @@ def abootimgv4_disk_image_boot(ubman):
>> gtdi3 = AbootimgTestDiskImage(ubman, 'bootv4.img', boot_img_hex)
>> return gtdi3
>>
>> +gtdi4 = None
>> +@pytest.fixture(scope='function')
>> +def abootimgv4_bootable_disk_image_boot(ubman):
>> + """pytest fixture to provide bootable boot image v4."""
>> + global gtdi4
>> + if not gtdi4:
>> + gtdi4 = AbootimgTestDiskImage(ubman, 'boot_bootable_v4.img', boot_bootable_img_hex)
>> + return gtdi4
>> +
>> +gtdi5 = None
>> +@pytest.fixture(scope='function')
>> +def abootimgv4_bootable_disk_image_vboot(ubman):
>> + """pytest fixture to provide bootable vendor boot image v4."""
>> + global gtdi5
>> + if not gtdi5:
>> + gtdi5 = AbootimgTestDiskImage(ubman, 'vendor_boot_bootable_v4.img', vendor_boot_bootable_img_hex)
>> + return gtdi5
>> +
>> @pytest.mark.boardspec('sandbox')
>> @pytest.mark.buildconfigspec('android_boot_image')
>> @pytest.mark.buildconfigspec('cmd_abootimg')
>> @@ -266,3 +302,57 @@ def test_abootimgv4(abootimgv4_disk_image_vboot, abootimgv4_disk_image_boot, ubm
>> ubman.run_command('fdt get value v / model')
>> response = ubman.run_command('env print v')
>> assert response == 'v=x2'
>> +
>> +@pytest.mark.boardspec('sandbox')
>> +@pytest.mark.buildconfigspec('android_boot_image')
>> +@pytest.mark.buildconfigspec('cmd_abootimg')
>> +@pytest.mark.requiredtool('xxd')
>> +@pytest.mark.requiredtool('gunzip')
>> +def test_abootimg_bootconfig(abootimgv4_disk_image_vboot,
>> + abootimgv4_disk_image_boot,
>> + ubman):
>> + """Test bootconfig handling with boot image v4.
>> +
>> + Verifies that androidboot.* parameters from bootargs are appended to the
>> + bootconfig section in vendor_boot image in memory, and that non-androidboot
>> + parameters remain in bootargs.
>> + """
>> +
>> + # Setup addresses
>> + ram_base = utils.find_ram_base(ubman)
>> + ramdisk_addr_r = ram_base + 0x4000000
>> + ubman.run_command('setenv ramdisk_addr_r 0x%x' % ramdisk_addr_r)
>> + ubman.run_command('setenv loadaddr 0x%x' % loadaddr)
>> + ubman.run_command('setenv vloadaddr 0x%x' % vloadaddr)
>> +
>> + # Set bootargs with androidboot.* parameters
>> + ubman.run_command('setenv bootargs "androidboot.serialno=ABC123 androidboot.mode=recovery console=ttyS0"')
>> +
>> + # Load images
>> + ubman.run_command('host load hostfs - 0x%x %s' % (vloadaddr,
>> + abootimgv4_disk_image_vboot.path))
>> + ubman.run_command('host load hostfs - 0x%x %s' % (loadaddr,
>> + abootimgv4_disk_image_boot.path))
>> + ubman.run_command('abootimg addr 0x%x 0x%x' % (loadaddr, vloadaddr))
>> +
>> + # Extract ramdisk (triggers bootconfig append)
>> + ubman.run_command('abootimg get ramdisk ramdisk_addr ramdisk_size')
>> +
>> + # Get ramdisk address
>> + response = ubman.run_command('env print ramdisk_addr')
>> + ramdisk_start = int(response.split('=')[1], 16)
>> +
>> + # Verify androidboot.* parameters were removed from bootargs
>> + response = ubman.run_command('env print bootargs')
>> + assert 'androidboot.' not in response
>> + assert 'console=ttyS0' in response
>> +
>> + # Get ramdisk size and verify BOOTCONFIG magic at the end
>> + response = ubman.run_command('env print ramdisk_size')
>> + ramdisk_size = int(response.split('=')[1], 16)
>> +
>> + # Dump the end of the ramdisk where BOOTCONFIG trailer should be
>> + response = ubman.run_command('md.b 0x%x 96' % (ramdisk_start))
>> +
>> + # Verify BOOTCONFIG magic is present
>> + assert 'BOOTCONFIG' in response or 'BOOTCON' in response
> Why verifying both BOOTCONFIG and BOOTCON ?
> According to [1], the magic is BOOTCONFIG. So this makes checking for
> BOOTCON irrelevant.
error from me i will fix
>
> [1] https://source.android.com/docs/core/architecture/bootloader/implementing-bootconfig#bootloader-changes
>
>> --
>> 2.34.1
^ permalink raw reply [flat|nested] 8+ messages in thread