]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: rt-loader: enhance is_uimage()
authorMarkus Stockhausen <markus.stockhausen@gmx.de>
Tue, 30 Dec 2025 15:43:37 +0000 (16:43 +0100)
committerRobert Marko <robimarko@gmail.com>
Fri, 2 Jan 2026 17:03:45 +0000 (18:03 +0100)
Until now is_uimage() is only a crc check and the caller
still needs to check other bits of the uimage header. Make
this function what it is meant to be.

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 6ea301159f86bab31af47145679cd88f89b0003b..697ee6723a0242cc44a4fb657a2cb20cd0f1d4f1 100644 (file)
@@ -41,11 +41,20 @@ typedef void (*entry_func_t)(unsigned long reg_a0, unsigned long reg_a1,
                             unsigned long reg_a2, unsigned long reg_a3);
 
 
-static bool is_uimage(void *m)
+static bool is_uimage(unsigned char *m)
 {
        unsigned int data[UIMAGE_HDR_SIZE / sizeof(int)];
        unsigned int image_crc;
 
+       /*
+        * The most basic way to find a uImage is to lookup the operating system
+        * opcode (for Linux it is 5). Then verify the header checksum. This is
+        * reasonably fast and all other magic value or constants can be avoided.
+        */
+
+       if (m[28] != UIMAGE_OS_LINUX)
+               return false;
+
        memcpy(data, m, UIMAGE_HDR_SIZE);
        image_crc = data[1];
        data[1] = 0;
@@ -127,14 +136,9 @@ void search_image(void **flash_addr, int *flash_size, void **load_addr)
 
        printf("Searching for uImage starting at 0x%08x ...\n", addr);
 
-       /*
-        * The most basic way to find a uImage is to lookup the operating system
-        * opcode (for Linux it is 5). Then verify the header checksum. This is
-        * reasonably fast and all other magic value or constants can be avoided.
-        */
        *flash_addr = NULL;
        for (int i = 0; i < 256 * 1024; i += 4, addr += 4) {
-               if ((addr[28] == UIMAGE_OS_LINUX) && is_uimage(addr)) {
+               if (is_uimage(addr)) {
                        *flash_addr = addr;
                        *flash_size = *(int *)(addr + 12);
                        *load_addr = *(void **)(addr + 16);