55 lines
2.4 KiB
Diff
55 lines
2.4 KiB
Diff
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||
|
Date: Wed, 6 Jun 2018 20:51:05 +0200
|
||
|
Subject: ar71xx: lzma-loader: move padding workaround to gzip step
|
||
|
|
||
|
Some devices (TP-Link TL-WR1043ND v1) don't boot reliably when the
|
||
|
uncompressed loader is too small. This was workarounded in the loader by
|
||
|
adding 512KB of padding to the .data section of the loader binary.
|
||
|
|
||
|
This approach had two issues:
|
||
|
|
||
|
- The padding was only working when .data was non-empty (otherwise the
|
||
|
section would become NOBITS, omitting it in the binary). .data was only
|
||
|
empty when no CMDLINE was set, leading to further workarounds like
|
||
|
fe594bf90d09 ("ath79: fix loader-okli, lzma-loader"), and this
|
||
|
workaround was only effective because a missing "const" led to the kernel
|
||
|
argv being stored in .data instead of .rodata
|
||
|
- The padding was not only added to the compressed .gz loader, but also
|
||
|
uncompressed .bin and .elf loaders. The prevented embedding the kernel
|
||
|
cmdline in the loader for non-gz loader types.
|
||
|
|
||
|
To fix both issues, move the creation of the padding from the linker script
|
||
|
to the gzip step.
|
||
|
|
||
|
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||
|
|
||
|
diff --git a/target/linux/ar71xx/image/lzma-loader/Makefile b/target/linux/ar71xx/image/lzma-loader/Makefile
|
||
|
index 9b81e87306f235d1e7284401828240b9b9787011..738093a958013624abb8f84a3874e1c795da349d 100644
|
||
|
--- a/target/linux/ar71xx/image/lzma-loader/Makefile
|
||
|
+++ b/target/linux/ar71xx/image/lzma-loader/Makefile
|
||
|
@@ -47,7 +47,11 @@ loader-compile: $(PKG_BUILD_DIR)/.prepared
|
||
|
clean all
|
||
|
|
||
|
loader.gz: $(PKG_BUILD_DIR)/loader.bin
|
||
|
- gzip -nc9 $< > $(LOADER_GZ)
|
||
|
+ # Workaround for buggy bootloaders: Some devices
|
||
|
+ # (TP-Link TL-WR1043ND v1) don't work correctly when
|
||
|
+ # the uncompressed loader is too small (probably a cache
|
||
|
+ # invalidation issue)
|
||
|
+ dd if=$< bs=512K conv=sync | gzip -nc9 > $(LOADER_GZ)
|
||
|
|
||
|
loader.elf: $(PKG_BUILD_DIR)/loader.elf
|
||
|
$(CP) $< $(LOADER_ELF)
|
||
|
diff --git a/target/linux/ar71xx/image/lzma-loader/src/loader.lds b/target/linux/ar71xx/image/lzma-loader/src/loader.lds
|
||
|
index 80cc7ca3ecf53a747fc139560b89c233f4343293..01ff85236147dc62bae480b191a44005171b1561 100644
|
||
|
--- a/target/linux/ar71xx/image/lzma-loader/src/loader.lds
|
||
|
+++ b/target/linux/ar71xx/image/lzma-loader/src/loader.lds
|
||
|
@@ -13,7 +13,6 @@ SECTIONS {
|
||
|
.data : {
|
||
|
*(.data)
|
||
|
*(.data.*)
|
||
|
- . = . + 524288; /* workaround for buggy bootloaders */
|
||
|
}
|
||
|
|
||
|
. = ALIGN(32);
|