[RFC PATCH 2/2] firmware: Add support for Linux kernel image header
dramforever
dramforever at live.com
Fri Apr 5 05:43:03 PDT 2024
On 4/5/24 20:00, Anup Patel wrote:
> 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.
That's fair, we'll do it the "clean" way and make FIT images for U-Boot.
This patch is abandoned.
Vivian "dram"
> 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