]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: rt-loader: allow piggy-backed uimage 21332/head
authorMarkus Stockhausen <markus.stockhausen@gmx.de>
Tue, 30 Dec 2025 16:34:41 +0000 (17:34 +0100)
committerRobert Marko <robimarko@gmail.com>
Fri, 2 Jan 2026 17:03:45 +0000 (18:03 +0100)
Until now rt-loader expects a piggy-backed lzma compressed data
stream. Be more flexible and allow a piggy-backed uimage as well.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/21332
Signed-off-by: Robert Marko <robimarko@gmail.com>
target/linux/realtek/image/rt-loader/src/main.c

index e8ac501607e1af9a1a9c6558eac2ef674ad446dd..80c8ba85d0915a12bbaf2741858b32561fba9299 100644 (file)
@@ -170,6 +170,27 @@ void load_uimage_from_flash(void *flash_start)
        memcpy(_kernel_data_addr, flash_addr + UIMAGE_HDR_SIZE, _kernel_data_size);
 }
 
+bool search_piggy_backed_uimage(void)
+{
+       void *addr = _kernel_data_addr;
+
+       /*
+        * Piggy-backed data might be an uImage or not. Run a lazy uImage check.
+        * In case it fails it should be safe to assume an lzma data stream.
+        */
+       search_image(&addr, &_kernel_data_size, &_kernel_load_addr);
+
+       if (!addr)
+               return false;
+
+       printf("piggy-backed uImage '%s' found at 0x%08x with load address 0x%08x\n",
+              (char *)(addr + 32), addr, _kernel_load_addr);
+
+       _kernel_data_addr = addr + UIMAGE_HDR_SIZE;
+
+       return true;
+}
+
 void main(unsigned long reg_a0, unsigned long reg_a1,
          unsigned long reg_a2, unsigned long reg_a3)
 {
@@ -195,7 +216,7 @@ void main(unsigned long reg_a0, unsigned long reg_a1,
         */
        if (flash_start)
                load_uimage_from_flash(flash_start);
-       else if (kernel_addr)
+       else if (!search_piggy_backed_uimage() && kernel_addr)
                _kernel_load_addr = kernel_addr;
 
        /*