mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-29 10:08:59 +00:00
a28e46b7cc
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
fe594bf90d
("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>
71 lines
1.6 KiB
Makefile
71 lines
1.6 KiB
Makefile
#
|
|
# Copyright (C) 2011 OpenWrt.org
|
|
# Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>
|
|
#
|
|
# This is free software, licensed under the GNU General Public License v2.
|
|
# See /LICENSE for more information.
|
|
#
|
|
|
|
include $(TOPDIR)/rules.mk
|
|
|
|
LZMA_TEXT_START := 0x80a00000
|
|
LOADADDR := 0x80060000
|
|
LOADER := loader.bin
|
|
LOADER_NAME := $(basename $(notdir $(LOADER)))
|
|
LOADER_DATA :=
|
|
TARGET_DIR :=
|
|
FLASH_OFFS :=
|
|
FLASH_MAX :=
|
|
BOARD :=
|
|
|
|
ifeq ($(TARGET_DIR),)
|
|
TARGET_DIR := $(KDIR)
|
|
endif
|
|
|
|
LOADER_BIN := $(TARGET_DIR)/$(LOADER_NAME).bin
|
|
LOADER_GZ := $(TARGET_DIR)/$(LOADER_NAME).gz
|
|
LOADER_ELF := $(TARGET_DIR)/$(LOADER_NAME).elf
|
|
|
|
PKG_NAME := lzma-loader
|
|
PKG_BUILD_DIR := $(KDIR)/$(PKG_NAME)
|
|
|
|
.PHONY : loader-compile loader.bin loader.elf loader.gz
|
|
|
|
$(PKG_BUILD_DIR)/.prepared:
|
|
mkdir $(PKG_BUILD_DIR)
|
|
$(CP) ./src/* $(PKG_BUILD_DIR)/
|
|
touch $@
|
|
|
|
loader-compile: $(PKG_BUILD_DIR)/.prepared
|
|
$(MAKE) -C $(PKG_BUILD_DIR) CROSS_COMPILE="$(TARGET_CROSS)" \
|
|
LZMA_TEXT_START=$(LZMA_TEXT_START) \
|
|
LOADADDR=$(LOADADDR) \
|
|
LOADER_DATA=$(LOADER_DATA) \
|
|
FLASH_OFFS=$(FLASH_OFFS) \
|
|
FLASH_MAX=$(FLASH_MAX) \
|
|
BOARD="$(BOARD)" \
|
|
clean all
|
|
|
|
loader.gz: $(PKG_BUILD_DIR)/loader.bin
|
|
# 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)
|
|
|
|
loader.bin: $(PKG_BUILD_DIR)/loader.bin
|
|
$(CP) $< $(LOADER_BIN)
|
|
|
|
download:
|
|
prepare: $(PKG_BUILD_DIR)/.prepared
|
|
compile: loader-compile
|
|
|
|
install:
|
|
|
|
clean:
|
|
rm -rf $(PKG_BUILD_DIR)
|
|
|