mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2026-01-28 03:37:17 +01:00
rt-loader currently has two operation modes, piggy-backed and standalone. In standalone mode, the kernel load address is read from the uImage in flash. In piggy-backed mode, rt-loader instead uses its initial run address (aka run address during first run) as the kernel load address. This is safe and works fine for all devices either using U-boot or having no issue uploading an image to the default kernel load address 0x80100000. To extend usecases, allow to specify a kernel load address when building rt-loader. In this case, rt-loader uses this address instead of the address inferred at runtime. On certain Zyxel devices, this allows to upload and boot an rt-loader piggy-backed image to an alternate address but keep the default kernel load address of 0x80100000. BootExt on these devices occupies memory above and will crash during transfer when this address is used as upload location. Using this extension, the image can be uploaded to e.g. 0x80300000 and rt-loader will use 0x80100000 as the final load address. This avoid taking the pain the adjust the load address of the kernel itself. Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com> Link: https://github.com/openwrt/openwrt/pull/21248 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
140 lines
4.5 KiB
Makefile
140 lines
4.5 KiB
Makefile
# rt-loader make file
|
|
# (c) 2025 Markus Stockhausen
|
|
#
|
|
# This is the make file for the rt-loader (aka runtime or realtek loader). It tries to
|
|
# avoid copying files around where possible. Therefore it is controlled by the following
|
|
# input parameters
|
|
#
|
|
# KERNEL_IMG_IN: The filename of an LZMA compressed kernel. If given the loader
|
|
# and the kernel will be concatenated (piggy back loading).
|
|
# FLASH_ADDR: The kernel address in the ROM. If given, the loader will be
|
|
# created standalone and search a LZMA compressed uImage on the
|
|
# target device starting from this address.
|
|
# KERNEL_ADDR: The to-be-used kernel load address to which rt-loader will load
|
|
# the kernel and execute it. If not given, rt-loader will use its
|
|
# initial run address for this (which is the uImage load address
|
|
# when using U-boot images) For non-uImage, this uses an arbitrary
|
|
# load address which is independent of rt-loader's initial run
|
|
# address.
|
|
# KERNEL_IMG_OUT: The filename of the kernel image with the rt-loader prepended.
|
|
# If not given it will be created as image.bin into the BUILD_DIR.
|
|
# BUILD_DIR: The temporary build dir. If not given it will be set to "build".
|
|
#
|
|
# To add it into the OpenWrt toolchain just create the following new build commands
|
|
#
|
|
# define Build/rt-compress
|
|
# $(STAGING_DIR_HOST)/bin/xz --format=lzma -9 --stdout "$@" > "$@.new"
|
|
# mv "$@.new" "$@"
|
|
# endef
|
|
#
|
|
# define Build/rt-loader-piggy-back
|
|
# $(MAKE) all clean -C rt-loader CROSS_COMPILE="$(TARGET_CROSS)" \
|
|
# KERNEL_IMG_IN="$@" KERNEL_IMG_OUT="$@.new" BUILD_DIR="$@.build"
|
|
# mv "$@.new" "$@"
|
|
# endef
|
|
#
|
|
# define Build/rt-loader-non-uImage
|
|
# $(MAKE) all clean -C rt-loader CROSS_COMPILE="$(TARGET_CROSS)" \
|
|
# KERNEL_ADDR="$(KERNEL_LOADADDR)" KERNEL_IMG_IN="$@" \
|
|
# KERNEL_IMG_OUT="$@.new" BUILD_DIR="$@.build"
|
|
# mv "$@.new" "$@"
|
|
#
|
|
# define Build/rt-loader-standalone
|
|
# $(MAKE) all clean -C rt-loader CROSS_COMPILE="$(TARGET_CROSS)" \
|
|
# FLASH_ADDR=$(FLASH_ADDR) KERNEL_IMG_OUT="$@.new" BUILD_DIR="$@.build"
|
|
# mv "$@.new" "$@"
|
|
# endef
|
|
#
|
|
# Finally use them in new kernel build recipes. E.g. as all-in-one self extracting uImage.
|
|
#
|
|
# define Device/uimage-rt-loader
|
|
# KERNEL/rt-loader := kernel-bin | append-dtb | rt-compress | rt-loader-piggy-back
|
|
# KERNEL := $$(KERNEL/rt-loader) | uImage none
|
|
# KERNEL_INITRAMFS := $$(KERNEL/rt-loader) | uImage none
|
|
# endef
|
|
#
|
|
# Or as direct startable standlone version plus a kernel uImage
|
|
#
|
|
# define Device/rt-loader-uimage
|
|
# FLASH_ADDR := 0xb4000000
|
|
# KERNEL/rt-loader := rt-loader-standalone
|
|
# KERNEL := kernel-bin | append-dtb | rt-compress | uImage lzma
|
|
# endef
|
|
#
|
|
|
|
FLASH_ADDR_NONE := 0x0
|
|
FLASH_ADDR ?= $(FLASH_ADDR_NONE)
|
|
|
|
KERNEL_ADDR_NONE := 0x0
|
|
KERNEL_ADDR ?= $(KERNEL_ADDR_NONE)
|
|
|
|
CC := $(CROSS_COMPILE)gcc
|
|
LD := $(CROSS_COMPILE)ld
|
|
OBJCOPY := $(CROSS_COMPILE)objcopy
|
|
OBJDUMP := $(CROSS_COMPILE)objdump
|
|
|
|
CFLAGS = -fpic -mabicalls -O2 -fno-builtin-printf -Iinclude
|
|
CFLAGS += -DFLASH_ADDR=$(FLASH_ADDR)
|
|
CFLAGS += -DKERNEL_ADDR=$(KERNEL_ADDR)
|
|
|
|
ASFLAGS = -fpic -msoft-float -Iinclude
|
|
|
|
LDFLAGS = -static -nostdlib -T linker/linker.ld --no-warn-mismatch
|
|
|
|
O_FORMAT = $(shell $(OBJDUMP) -i | head -2 | grep elf32)
|
|
|
|
SOURCES = src/startup.S src/main.c src/board.c src/memory.c src/unlzma.c
|
|
|
|
BUILD_DIR ?= build
|
|
|
|
IMAGE_OBJ := $(BUILD_DIR)/image.o
|
|
IMAGE_ELF := $(BUILD_DIR)/image.elf
|
|
|
|
KERNEL_IMG_NONE := $(BUILD_DIR)/empty_kernel.bin
|
|
KERNEL_IMG_IN ?= $(KERNEL_IMG_NONE)
|
|
KERNEL_IMG_OUT ?= $(BUILD_DIR)/image.bin
|
|
|
|
OBJECTS_C = $(filter %.c,$(SOURCES))
|
|
OBJECTS_S = $(filter %.S,$(SOURCES))
|
|
|
|
OBJECTS := $(OBJECTS_S:.S=.o) $(OBJECTS_C:.c=.o)
|
|
OBJECTS := $(patsubst %.o, $(BUILD_DIR)/%.o, $(OBJECTS)) $(IMAGE_OBJ)
|
|
|
|
ifneq ($(MAKECMDGOALS),clean)
|
|
ifeq ($(KERNEL_IMG_IN)$(FLASH_ADDR),$(KERNEL_IMG_NONE)$(FLASH_ADDR_NONE))
|
|
$(error Set either KERNEL_IMG_IN or FLASH_ADDR)
|
|
else ifneq ($(FLASH_ADDR),$(FLASH_ADDR_NONE))
|
|
$(info Create standalone rt-loader, loading uimage from address $(FLASH_ADDR))
|
|
else
|
|
$(info Create piggy backed rt-loader, loading appended kernel binary "$(KERNEL_IMG_IN)")
|
|
endif
|
|
endif
|
|
|
|
all: $(KERNEL_IMG_OUT)
|
|
|
|
install:
|
|
|
|
$(BUILD_DIR)/%.o : %.c
|
|
@mkdir -p $(dir $@)
|
|
$(CC) $(CFLAGS) -c -o $@ $<
|
|
|
|
$(BUILD_DIR)/%.o : %.S
|
|
@mkdir -p $(dir $@)
|
|
$(CC) $(ASFLAGS) -c -o $@ $<
|
|
|
|
$(IMAGE_OBJ): $(KERNEL_IMG_IN)
|
|
$(OBJCOPY) -I binary -O $(O_FORMAT) --rename-section .data=.kernel $< $@
|
|
|
|
$(IMAGE_ELF): $(OBJECTS)
|
|
$(LD) $(LDFLAGS) -o $@ $(OBJECTS)
|
|
|
|
$(KERNEL_IMG_OUT): $(IMAGE_ELF)
|
|
$(OBJCOPY) -O binary $< $@
|
|
|
|
$(KERNEL_IMG_IN):
|
|
@mkdir -p $(dir $@)
|
|
@echo "DUMMY-KERNEL-IMAGE" > $@
|
|
|
|
clean:
|
|
rm -rf $(BUILD_DIR)/
|
|
|