summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Stockhausen2025-12-30 15:43:37 +0000
committerRobert Marko2026-01-02 17:03:45 +0000
commit8f66b335036f762ad0d4b97afd5a25ce75104f5c (patch)
treed95aafd9b3e1d38c7b6f6ccfc9e959847a7c3d2f
parent7a78dc4a5d1edc63116b100ffe6c374913d128a8 (diff)
downloadopenwrt-8f66b335036f762ad0d4b97afd5a25ce75104f5c.tar.gz
realtek: rt-loader: enhance is_uimage()
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>
-rw-r--r--target/linux/realtek/image/rt-loader/src/main.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/target/linux/realtek/image/rt-loader/src/main.c b/target/linux/realtek/image/rt-loader/src/main.c
index 6ea301159f..697ee6723a 100644
--- a/target/linux/realtek/image/rt-loader/src/main.c
+++ b/target/linux/realtek/image/rt-loader/src/main.c
@@ -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);