diff options
| author | Markus Stockhausen | 2025-12-30 16:34:41 +0000 |
|---|---|---|
| committer | Robert Marko | 2026-01-02 17:03:45 +0000 |
| commit | cd13ed6fcfe7457e6c1539f1c0cf8e8ade33b4fb (patch) | |
| tree | 424a91845ddc317cbebbfab3f2862ac839ec98ad | |
| parent | 4491f1d233620e46b6b7ecdf5b4983f25266e4c8 (diff) | |
| download | openwrt-cd13ed6fcfe7457e6c1539f1c0cf8e8ade33b4fb.tar.gz | |
realtek: rt-loader: allow piggy-backed uimage
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>
| -rw-r--r-- | target/linux/realtek/image/rt-loader/src/main.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/target/linux/realtek/image/rt-loader/src/main.c b/target/linux/realtek/image/rt-loader/src/main.c index e8ac501607..80c8ba85d0 100644 --- a/target/linux/realtek/image/rt-loader/src/main.c +++ b/target/linux/realtek/image/rt-loader/src/main.c @@ -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; /* |