
When using `PLATFORM=generic` defaults, the kernel is loaded at `FW_JUMP_ADDR`, and the FDT is loaded at `FW_JUMP_FDT_ADDR. Therefore, the maximum kernel size before `FW_JUMP_FDT_ADDR` must be increased is `$(( FW_JUMP_FDT_ADDR - FW_JUMP_ADDR ))`. The example calculation assumes `rv64`, and is wrong to boot (off by 0x200000). Fix it and update it for the general case. Signed-off-by: Gabriel Somlo <gsomlo@gmail.com> Reviewed-by: Andrew Jones <ajones@ventanamicro.com> Reviewed-by: Xiang W <wxjstz@126.com>
3.0 KiB
OpenSBI Firmware with Jump Address (FW_JUMP)
OpenSBI firmware with Jump Address (FW_JUMP) is a firmware which only handles the address of the next booting stage entry, e.g. a bootloader or an OS kernel, without directly including the binary code for this next stage.
A FW_JUMP firmware is particularly useful when the booting stage executed prior to the OpenSBI firmware is capable of loading both the OpenSBI firmware and the booting stage binary to follow the OpenSBI firmware.
FW_JUMP Compilation
A platform FW_JUMP firmware can be enabled by any of the following methods:
- Specifying
FW_JUMP=y
on the top levelmake
command line. - Specifying
FW_JUMP=y
in the target platform objects.mk configuration file.
The compiled FW_JUMP firmware ELF file is named fw_jump.elf. Its expanded image file is fw_jump.bin. Both files are created in the platform-specific build directory under the build/platform/<platform_subdir>/firmware directory.
FW_JUMP Firmware Configuration Options
To operate correctly, a FW_JUMP firmware requires some configuration
parameters to be defined using either the top level make
command line or the
target platform objects.mk configuration file. The possible parameters are as
follows:
-
FW_JUMP_ADDR - Address of the entry point of the booting stage to be executed following OpenSBI firmware. This address generally corresponds exactly to the address where this next booting stage was loaded. This is a mandatory parameter. Compilation errors will result from not defining this address.
-
FW_JUMP_FDT_ADDR - Address where the flattened device tree (FDT file) passed by the prior booting stage will be placed in memory before executing the booting stage following the OpenSBI firmware. If this option is not provided, then the OpenSBI firmware will pass the FDT address passed by the previous booting stage to the next booting stage.
When using the default FW_JUMP_FDT_ADDR with PLATFORM=generic, you must ensure FW_JUMP_FDT_ADDR is set high enough to avoid overwriting the kernel. You can use the following method (e.g., using bash or zsh):
${CROSS_COMPILE}objdump -h $KERNEL_ELF | sort -k 5,5 | awk -n ' /^ +[0-9]+ / {addr="0x"$3; size="0x"$5; printf "0x""%x\n",addr+size}' | (( `tail -1` > (FW_JUMP_FDT_ADDR - FW_JUMP_ADDR) )) && echo fdt overlaps kernel, increase FW_JUMP_FDT_ADDR ${LLVM}objdump -h --show-lma $KERNEL_ELF | sort -k 5,5 | awk -n ' /^ +[0-9]+ / {addr="0x"$3; size="0x"$5; printf "0x""%x\n",addr+size}' | (( `tail -1` > (FW_JUMP_FDT_ADDR - FW_JUMP_ADDR) )) && echo fdt overlaps kernel, increase FW_JUMP_FDT_ADDR
FW_JUMP Example
The qemu/virt platform illustrates how to configure and use a FW_JUMP firmware. Detailed information regarding these platforms can be found in the platform documentation files.