[PATCH 2/2] boot: android: Add bootconfig support

Guillaume La Roque glaroque at baylibre.com
Thu Nov 28 11:14:48 CET 2024


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#vendor-boot-partition-v4
Co-developed-by: Mattijs Korpershoek <mkorpershoek at baylibre.com>
Signed-off-by: Mattijs Korpershoek <mkorpershoek at baylibre.com>
Signed-off-by: Guillaume La Roque <glaroque at baylibre.com>
---
 boot/image-android.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/boot/image-android.c b/boot/image-android.c
index 05245a0ba918..66e4c58ab4eb 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -475,6 +475,9 @@ int android_image_get_ramdisk(const void *hdr, const void *vendor_boot_img,
 {
 	struct andr_image_data img_data = {0};
 	ulong ramdisk_ptr;
+	size_t ret, len = 0;
+	size_t bootconfig_size = 0;
+	char *bootargs, *androidbootarg, *end;
 
 	if (!android_image_get_data(hdr, vendor_boot_img, &img_data))
 		return -EINVAL;
@@ -510,6 +513,32 @@ int android_image_get_ramdisk(const void *hdr, const void *vendor_boot_img,
 			memcpy((void *)
 			       (ramdisk_ptr), (void *)img_data.bootconfig_addr,
 			       img_data.bootconfig_size);
+
+			bootargs = env_get("bootargs");
+			bootconfig_size = img_data.bootconfig_size;
+
+			while (1) {
+				androidbootarg = strstr(bootargs, "androidboot.");
+				if (!androidbootarg)
+					break;
+				end = strchr(androidbootarg, ' ');
+				*end = '\0';
+				len = strlen(androidbootarg);
+				*end = '\n'; // bootConfig are new-line terminated
+				ret = add_bootconfig_parameters(androidbootarg, len + 1,
+								ramdisk_ptr, bootconfig_size);
+				if (!ret)
+					return -EINVAL;
+				bootconfig_size += ret;
+				img_data.ramdisk_size += ret;
+				/* Erase the androidboot.* bootarg from bootargs */
+				*end = ' ';
+				memmove(androidbootarg, androidbootarg + len,
+					strlen(androidbootarg + len) + 1);
+			}
+
+			/* Save back the new commandline without androidboot. */
+			env_set("bootargs", bootargs);
 		}
 	} else {
 		/* Ramdisk can be used in-place, use current ptr */

-- 
2.34.1



More information about the U-Boot mailing list