[RFC PATCH 2/2] firmware: Add support for Linux kernel image header
Anup Patel
anup at brainfault.org
Fri Apr 5 05:00:55 PDT 2024
On Fri, Mar 15, 2024 at 11:07 PM Vivian Wang <dramforever at live.com> wrote:
>
> The firmwares fw_payload and fw_jump support the same entrypoint ABI as
> M-mode Linux. To support booting theses firmware images from bootloaders
> already supporting M-mode Linux, add a compatible header to the firmware
> image.
>
> The header starts with a jump to skip to the actual code, so including
> it does not affect operation without a bootloader.
>
> Signed-off-by: Vivian Wang <dramforever at live.com>
This won't fly because OpenSBI FW_DYNAMIC expects three parameters
instead of just two expected by Linux flat image:
a0 -> HART ID
a1 - > DTB address
a2 -> FW_DYNAMIC_INFO address
Both QEMU and U-Boot SPL already provide FW_DYNAMIC_INFO to
FW_DYNAMIC in an OpenSBI specific way. Unfortunately, booti or other
U-Boot booting commands don't provide FW_DYAMIC_INFO address
hence no point in making OpenSBI binary look like Linux binary for using
booti from U-Boot M-mode.
Regards,
Anup
> ---
> firmware/Kconfig | 17 +++++++++++++++
> firmware/fw_base.ldS | 5 +++++
> firmware/fw_header_linux.S | 34 ++++++++++++++++++++++++++++++
> firmware/fw_jump.S | 1 +
> firmware/fw_payload.S | 1 +
> platform/generic/configs/defconfig | 1 +
> 6 files changed, 59 insertions(+)
> create mode 100644 firmware/fw_header_linux.S
>
> diff --git a/firmware/Kconfig b/firmware/Kconfig
> index d6e0506..50ec340 100644
> --- a/firmware/Kconfig
> +++ b/firmware/Kconfig
> @@ -1 +1,18 @@
> # SPDX-License-Identifier: BSD-2-Clause
> +
> +menu "Firmware Configuration"
> +
> +choice FW_HEADER
> + bool "Include Firmware Header"
> + optional
> +
> +config FW_HEADER_LINUX
> + bool "Linux Kernel Image"
> + help
> + Compatibility with Linux kernel image header, for fw_jump and fw_payload
> +
> + See: https://www.kernel.org/doc/html/v6.8/arch/riscv/boot-image-header.html
> +
> +endchoice
> +
> +endmenu
> diff --git a/firmware/fw_base.ldS b/firmware/fw_base.ldS
> index fb47984..6a3b21b 100644
> --- a/firmware/fw_base.ldS
> +++ b/firmware/fw_base.ldS
> @@ -15,6 +15,11 @@
>
> /* Beginning of the code section */
>
> + .header :
> + {
> + *(.header)
> + }
> +
> .text :
> {
> PROVIDE(_text_start = .);
> diff --git a/firmware/fw_header_linux.S b/firmware/fw_header_linux.S
> new file mode 100644
> index 0000000..fbd0cf9
> --- /dev/null
> +++ b/firmware/fw_header_linux.S
> @@ -0,0 +1,34 @@
> +/* SPDX-License-Identifier: BSD-2-Clause */
> +
> +#include <sbi/sbi_byteorder.h>
> +
> +#ifdef CONFIG_FW_HEADER_LINUX
> +
> + /*
> + * Compatibility with Linux kernel image header, for fw_jump and fw_payload
> + *
> + * See: https://www.kernel.org/doc/html/v6.8/arch/riscv/boot-image-header.html
> + */
> +
> + .section .header, "a", %progbits
> +
> + /* 8 bytes at beginning reserved for code */
> + j _start
> + .align 3
> +
> + /* We want to be loaded at start of RAM, so text_offset is 0 */
> + .dword 0 /* text_offset */
> + .dword cpu_to_le64(_fw_reloc_end - _fw_start) /* image_size */
> +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
> + .dword 0 /* flags: Not big-endian */
> +#else
> + .dword 1 /* flags: Big-endian */
> +#endif
> + .word cpu_to_le16(0x0002) /* version (0.2) */
> + .word 0 /* res1 */
> + .dword 0 /* res2 */
> + .ascii "RISCV\0\0\0" /* magic */
> + .ascii "RSC\x05" /* magic2 */
> + .word 0 /* res3 */
> +
> +#endif /* CONFIG_FW_HEADER_LINUX */
> diff --git a/firmware/fw_jump.S b/firmware/fw_jump.S
> index ebf297f..9b2ddda 100644
> --- a/firmware/fw_jump.S
> +++ b/firmware/fw_jump.S
> @@ -8,6 +8,7 @@
> */
>
> #include "fw_base.S"
> +#include "fw_header_linux.S"
>
> .section .entry, "ax", %progbits
> .align 3
> diff --git a/firmware/fw_payload.S b/firmware/fw_payload.S
> index 3c8433e..e324f6d 100644
> --- a/firmware/fw_payload.S
> +++ b/firmware/fw_payload.S
> @@ -8,6 +8,7 @@
> */
>
> #include "fw_base.S"
> +#include "fw_header_linux.S"
>
> .section .entry, "ax", %progbits
> .align 3
> diff --git a/platform/generic/configs/defconfig b/platform/generic/configs/defconfig
> index 1ce6a12..4f7217b 100644
> --- a/platform/generic/configs/defconfig
> +++ b/platform/generic/configs/defconfig
> @@ -42,3 +42,4 @@ CONFIG_SERIAL_SEMIHOSTING=y
> CONFIG_FDT_TIMER=y
> CONFIG_FDT_TIMER_MTIMER=y
> CONFIG_FDT_TIMER_PLMT=y
> +CONFIG_FW_HEADER_LINUX=y
> --
> 2.42.0
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
More information about the opensbi
mailing list