ar71xx: fix boot with increased kernel size on CPE/WBS 210/510
Fixes: d139a13563
("Add various patches to deal with bigger kernels")
Fixes #1417
This commit is contained in:
parent
c840a588b9
commit
0563473abb
@ -0,0 +1,54 @@
|
|||||||
|
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);
|
@ -0,0 +1,23 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Wed, 6 Jun 2018 00:27:42 +0200
|
||||||
|
Subject: ar71xx: lzma-loader: set page size to 4KB
|
||||||
|
|
||||||
|
The text section in the ELF loader is aligned to the maximum page size,
|
||||||
|
which defaults to 64KB. Reduce it to the actual page size to avoid wasting
|
||||||
|
flash space for this alignment.
|
||||||
|
|
||||||
|
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
|
||||||
|
diff --git a/target/linux/ar71xx/image/lzma-loader/src/Makefile b/target/linux/ar71xx/image/lzma-loader/src/Makefile
|
||||||
|
index 5f10bdb8f1499f24f00a8bf4d53f370fef88bd1e..fadb7e6206070c07aab3e8b323324976c6998eea 100644
|
||||||
|
--- a/target/linux/ar71xx/image/lzma-loader/src/Makefile
|
||||||
|
+++ b/target/linux/ar71xx/image/lzma-loader/src/Makefile
|
||||||
|
@@ -95,7 +95,7 @@ loader2.o: loader.bin
|
||||||
|
$(LD) -r -b binary --oformat $(O_FORMAT) -o $@ $<
|
||||||
|
|
||||||
|
loader.elf: loader2.o
|
||||||
|
- $(LD) -e startup -T loader2.lds -Ttext $(LOADADDR) -o $@ $<
|
||||||
|
+ $(LD) -z max-page-size=0x1000 -e startup -T loader2.lds -Ttext $(LOADADDR) -o $@ $<
|
||||||
|
|
||||||
|
mrproper: clean
|
||||||
|
|
@ -0,0 +1,22 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Wed, 6 Jun 2018 00:30:57 +0200
|
||||||
|
Subject: ar71xx: lzma-loader: constify kernel argv array
|
||||||
|
|
||||||
|
By making the kernel argv array const, the .data section can always be
|
||||||
|
omitted from the laoder binary.
|
||||||
|
|
||||||
|
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
|
||||||
|
diff --git a/target/linux/ar71xx/image/lzma-loader/src/loader.c b/target/linux/ar71xx/image/lzma-loader/src/loader.c
|
||||||
|
index cc73eb1721cbfbf2ad1bb94e8e6d3ab006983c5d..794c4b6285a7fa0423c22d172828415e6f2be93b 100644
|
||||||
|
--- a/target/linux/ar71xx/image/lzma-loader/src/loader.c
|
||||||
|
+++ b/target/linux/ar71xx/image/lzma-loader/src/loader.c
|
||||||
|
@@ -75,7 +75,7 @@ static unsigned long kernel_la;
|
||||||
|
#ifdef CONFIG_KERNEL_CMDLINE
|
||||||
|
#define kernel_argc 2
|
||||||
|
static const char kernel_cmdline[] = CONFIG_KERNEL_CMDLINE;
|
||||||
|
-static const char *kernel_argv[] = {
|
||||||
|
+static const char *const kernel_argv[] = {
|
||||||
|
NULL,
|
||||||
|
kernel_cmdline,
|
||||||
|
NULL,
|
@ -0,0 +1,36 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Wed, 6 Jun 2018 00:34:25 +0200
|
||||||
|
Subject: ar71xx: make loader-okli build step more generic
|
||||||
|
|
||||||
|
Add support for different loader types.
|
||||||
|
|
||||||
|
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
|
||||||
|
diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile
|
||||||
|
index 8eac5fc997cab0203718fb0558e6f5aaaeec9c38..de27f5d7c5ce6dbd31305c139afc128edaed15ee 100644
|
||||||
|
--- a/target/linux/ar71xx/image/Makefile
|
||||||
|
+++ b/target/linux/ar71xx/image/Makefile
|
||||||
|
@@ -73,8 +73,9 @@ define Build/loader-kernel-cmdline
|
||||||
|
$(call Build/loader-common,LOADER_DATA="$@" KERNEL_CMDLINE="$(CMDLINE)")
|
||||||
|
endef
|
||||||
|
|
||||||
|
+# Arguments: <output name> <kernel offset>
|
||||||
|
define Build/loader-okli
|
||||||
|
- dd if=$(KDIR)/loader-$(1).gz bs=7680 conv=sync of="$@.new"
|
||||||
|
+ dd if=$(KDIR)/loader-$(word 1,$(1)).$(LOADER_TYPE) bs=$(word 2,$(1)) conv=sync of="$@.new"
|
||||||
|
cat "$@" >> "$@.new"
|
||||||
|
mv "$@.new" "$@"
|
||||||
|
endef
|
||||||
|
diff --git a/target/linux/ar71xx/image/tp-link.mk b/target/linux/ar71xx/image/tp-link.mk
|
||||||
|
index 1e40d943ac2aa43aea670fd86268708aea39a46c..18e2c73737f477f4d00020893878cbdfb81a735b 100644
|
||||||
|
--- a/target/linux/ar71xx/image/tp-link.mk
|
||||||
|
+++ b/target/linux/ar71xx/image/tp-link.mk
|
||||||
|
@@ -69,7 +69,7 @@ $(Device/tplink)
|
||||||
|
LOADER_FLASH_OFFS := 0x22000
|
||||||
|
COMPILE := loader-$(1).gz
|
||||||
|
COMPILE/loader-$(1).gz := loader-okli-compile
|
||||||
|
- KERNEL := copy-file $(KDIR)/vmlinux.bin.lzma | uImage lzma -M 0x4f4b4c49 | loader-okli $(1)
|
||||||
|
+ KERNEL := copy-file $(KDIR)/vmlinux.bin.lzma | uImage lzma -M 0x4f4b4c49 | loader-okli $(1) 7680
|
||||||
|
KERNEL_INITRAMFS := copy-file $(KDIR)/vmlinux-initramfs.bin.lzma | loader-kernel-cmdline | mktplinkfw-combined
|
||||||
|
endef
|
||||||
|
|
@ -0,0 +1,39 @@
|
|||||||
|
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
Date: Wed, 6 Jun 2018 00:35:17 +0200
|
||||||
|
Subject: ar71xx: switch CPE/WBS 210/510 to okli-loader
|
||||||
|
|
||||||
|
We recently increased the kernel partition size of the CPE/WBS 210/510.
|
||||||
|
This works fine for new installations of the factory image, but on
|
||||||
|
sysupgrades, the partition table read by the bootloader is not adjusted.
|
||||||
|
This limits the maximum size of the kernel loaded by the bootloader to the
|
||||||
|
old partition size.
|
||||||
|
|
||||||
|
While adjusting the partition table would be a cleanest solution, such a
|
||||||
|
migration would have to happen before an upgrade to a new version with a
|
||||||
|
newer kernel. This is error-prone and would require a two-step upgrade, as
|
||||||
|
we mark the partition table partition read-only.
|
||||||
|
|
||||||
|
Instead, switch from the lzma-loader with embedded kernel to the
|
||||||
|
okli-loader, so only the tiny lzma-loader is loaded by the bootloader as
|
||||||
|
"kernel", and the lzma-loader will then load the rest of the kernel by
|
||||||
|
itself.
|
||||||
|
|
||||||
|
Fixes: e39847ea2f70 ("ar71xx: increase kernel partition size for CPE/WBS 210/510")
|
||||||
|
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
|
||||||
|
diff --git a/target/linux/ar71xx/image/tp-link.mk b/target/linux/ar71xx/image/tp-link.mk
|
||||||
|
index 18e2c73737f477f4d00020893878cbdfb81a735b..709b1558a5f8487c50e922ec4d27b643f080cbcc 100644
|
||||||
|
--- a/target/linux/ar71xx/image/tp-link.mk
|
||||||
|
+++ b/target/linux/ar71xx/image/tp-link.mk
|
||||||
|
@@ -173,7 +173,10 @@ define Device/cpe510-520
|
||||||
|
TPLINK_BOARD_NAME := CPE510
|
||||||
|
DEVICE_PROFILE := CPE510
|
||||||
|
LOADER_TYPE := elf
|
||||||
|
- KERNEL := kernel-bin | patch-cmdline | lzma | loader-kernel
|
||||||
|
+ LOADER_FLASH_OFFS := 0x43000
|
||||||
|
+ COMPILE := loader-$(1).elf
|
||||||
|
+ COMPILE/loader-$(1).elf := loader-okli-compile
|
||||||
|
+ KERNEL := kernel-bin | lzma | uImage lzma -M 0x4f4b4c49 | loader-okli $(1) 12288
|
||||||
|
IMAGES := sysupgrade.bin factory.bin
|
||||||
|
IMAGE/sysupgrade.bin := append-rootfs | tplink-safeloader sysupgrade
|
||||||
|
IMAGE/factory.bin := append-rootfs | tplink-safeloader factory
|
Loading…
Reference in New Issue
Block a user