From a28e46b7cc3da7f7b0f8c20e23fe4563bb8fcc52 Mon Sep 17 00:00:00 2001
From: Matthias Schiffer <mschiffer@universe-factory.net>
Date: Wed, 6 Jun 2018 20:51:05 +0200
Subject: [PATCH] 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>
---
 target/linux/ar71xx/image/lzma-loader/Makefile       | 6 +++++-
 target/linux/ar71xx/image/lzma-loader/src/loader.lds | 1 -
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/target/linux/ar71xx/image/lzma-loader/Makefile b/target/linux/ar71xx/image/lzma-loader/Makefile
index 9b81e87306f..738093a9580 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 80cc7ca3ecf..01ff8523614 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);
-- 
GitLab