[RFC PATCH 0/2] Add support for Linux kernel image header
Vivian Wang
dramforever at live.com
Fri Mar 15 10:34:48 PDT 2024
It is very convenient to use M-mode U-Boot during development to load M-mode
software for testing. This series makes it easy to load OpenSBI and an S-mode
operating system while passing it an initramfs, an FDT, and a command line from
U-Boot with the existing "booti" command. Any other bootloader supporting
M-mode Linux should work analogously.
To achieve this, a header compatible with that of Linux is added at the
beginning of fw_payload and fw_jump. Since the header starts with a jump to the
actual start of code, this is not a problem if no such bootloader is used. A
config option is also added so users can opt out of this header.
Patch 1 makes the byteorder macros available in assembly code so that patch 2
can use them.
To test this, you will need:
- QEMU (qemu-system-riscv64), tested with 8.1.3
- M-mode U-Boot with config qemu-riscv64_defconfig (u-boot.bin), tested with
version 2023.07.02
- Linux for riscv64 (Image)
- An initramfs image for testing (init.cpio)
Some assumptions are made about the memory layout used by QEMU.
Build OpenSBI:
make PLATFORM=generic FW_PAYLOAD_PATH=Image
Firstly, test that the firmware images still work as before:
qemu-system-riscv64 -M virt -smp 2 -m 1G -nographic \
-bios fw_payload.bin
This one should eventually panic at "VFS: Unable to mount root fs on
unknown-block(0,0)" because it does not have an initramfs.
qemu-system-riscv64 -M virt -smp 2 -m 1G -nographic \
-bios fw_jump.bin \
-kernel Image \
-initrd init.cpio \
-append "earlycon"
This one should work just fine.
Then, test that the firmwares are now loadable by U-Boot:
qemu-system-riscv64 -M virt -smp 2 -m 1G -nographic \
-bios u-boot.bin \
-device loader,addr=0x90000000,file=fw_payload.bin \
-device loader,addr=0xa0000000,file=init.cpio
qemu-system-riscv64 -M virt -smp 2 -m 1G -nographic \
-bios u-boot.bin \
-device loader,addr=0x80200000,file=Image \
-device loader,addr=0x90000000,file=fw_jump.bin \
-device loader,addr=0xa0000000,file=init.cpio
Run these command in U-Boot, making changes as needed:
=> fdt addr -c
Control fdt: bf730af0
=> # Change source address to match control fdt
=> fdt move bf730af0 b0000000
Working FDT set to b0000000
=> setenv bootargs "earlycon"
=> # Change initramfs size to match actual size
=> booti 0x90000000 0xa0000000:0x12d400 0xb0000000
Once in Linux:
$ cat /proc/cmdline # Check that the kernel command line is correct
$ cat /proc/cpuinfo # Check that SMP boot works
Vivian Wang (2):
include: sbi: Support byteorder macros in assembly
firmware: Add support for Linux kernel image header
firmware/Kconfig | 17 +++++++++
firmware/fw_base.ldS | 5 +++
firmware/fw_header_linux.S | 34 ++++++++++++++++++
firmware/fw_jump.S | 1 +
firmware/fw_payload.S | 1 +
include/sbi/sbi_byteorder.h | 55 ++++++++++++++++--------------
platform/generic/configs/defconfig | 1 +
7 files changed, 89 insertions(+), 25 deletions(-)
create mode 100644 firmware/fw_header_linux.S
--
2.42.0
More information about the opensbi
mailing list