| 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: |
| |
| 1. Specifying `FW_JUMP=y` on the top level `make` command line. |
| 2. 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. |
| |
| [qemu/virt]: ../platform/qemu_virt.md |