Hi,

Le 31/10/2025 à 16:58, Mattijs Korpershoek a écrit :
Hi Guillaume,

Thank you for the patch.

On Fri, Oct 17, 2025 at 15:19, "Guillaume La Roque 
(TI.com)"<[email protected]> wrote:

For android vendor boot image version 4 bootconfig is mandatory.[1]
There seems to be a link "[1]" here but it's not part of the commit
message.
Can you add it please?
yes of course ,
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.

Signed-off-by: Guillaume La Roque (TI.com)<[email protected]>
---
  boot/image-android.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++----
  1 file changed, 93 insertions(+), 8 deletions(-)

diff --git a/boot/image-android.c b/boot/image-android.c
index 613f2aa4b9e..cf038a4a62f 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -534,17 +534,102 @@ 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,
+
+               /* Extract androidboot.* parameters from bootargs */
+               const char *bootargs = env_get("bootargs");
+               char *androidboot_params = NULL;
+               char *new_bootargs = NULL;
+               size_t androidboot_params_len = 0;
+
+               if (bootargs && img_data.bootconfig_size) {
+                       size_t len = strlen(bootargs);
+
+                       androidboot_params = malloc(len + 1);
+                       new_bootargs = malloc(len + 1);
+                       if (!androidboot_params || !new_bootargs) {
+                               free(androidboot_params);
+                               free(new_bootargs);
+                               printf("Error: malloc failed\n");
+                               return -ENOMEM;
+                       }
+
+                       /* Extract androidboot.* and build new bootargs in one 
pass */
+                       const char *src = bootargs;
+                       char *bc_dst = androidboot_params;
+                       char *args_dst = new_bootargs;
+
+                       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 != androidboot_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';
+                       androidboot_params_len = bc_dst - androidboot_params;
+
+                       /* Update bootargs if we extracted any androidboot 
params */
+                       if (androidboot_params_len > 1)
+                               env_set("bootargs", new_bootargs);
+               }
+
+               /* Map addresses for memcpy operations */
+               void *ramdisk_dest = map_sysmem(ramdisk_ptr, 
img_data.ramdisk_size);
+               void *vendor_ramdisk_src = 
map_sysmem(img_data.vendor_ramdisk_ptr,
+                                                     
img_data.vendor_ramdisk_size);
+               void *boot_ramdisk_src = map_sysmem(img_data.ramdisk_ptr,
+                                                   img_data.boot_ramdisk_size);
+
+               memcpy(ramdisk_dest, vendor_ramdisk_src,
                       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;
+               memcpy((char *)ramdisk_dest + img_data.vendor_ramdisk_size,
+                      boot_ramdisk_src, img_data.boot_ramdisk_size);
+
                if (img_data.bootconfig_size) {
-                       memcpy((void *)
-                              (ramdisk_ptr), (void *)img_data.bootconfig_addr,
-                              img_data.bootconfig_size);
+                       void *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);
+
+                       /* Add androidboot.* parameters to bootconfig */
+                       if (androidboot_params && androidboot_params_len > 1) {
+                               ulong bootconfig_ptr = (ulong)ramdisk_dest +
+                                                      
img_data.vendor_ramdisk_size +
+                                                      
img_data.boot_ramdisk_size;
+                               img_data.ramdisk_size +=
+                                       
add_bootconfig_parameters(androidboot_params,
+                                                                 
androidboot_params_len,
+                                                                 
bootconfig_ptr,
+                                                                 
img_data.bootconfig_size);
+                       }
                }
+
+               free(androidboot_params);
+               free(new_bootargs);
+
+               unmap_sysmem(boot_ramdisk_src);
+               unmap_sysmem(vendor_ramdisk_src);
+               unmap_sysmem(ramdisk_dest);
We are here in the "if (img_data.header_version > 2) {" block.
What about boot image v3? Why are we forcing bootconfig upon them?

our right it's not good bootconfig come with version 4 i will fix it in v3.


Also, please move this to a seperate function. It makes
android_image_get_ramdisk() quite long and difficult to read otherwise.
i will.

Finally, what happens if a kernel does not have bootconfig enabled ?
I imagine that everything will crash due to this change. Even if
bootconfig is mandatory for boot image v4, I believe we should make this
behaviour optional to avoid breaking existing kernels.

it's enable in android kernel since android-12-5.4.xx so if you enable boot image version 4 and move androidboot.x in booconfig instead of kernelcmdline it's because you decide to enable it with BOARD_KERNEL_CMDLINE += bootconfig and you support android boot image version 4. it's explained in aosp doc :https://source.android.com/docs/core/architecture/bootloader/implementing-bootconfig


        } else {
                /* Ramdisk can be used in-place, use current ptr */
                if (img_data.ramdisk_addr == 0 ||

--
2.34.1

Reply via email to