[sw-dev] Booting Linux from U-Boot in qemu-system-riscv64?

Anup Patel anup at brainfault.org
Wed Dec 2 15:28:38 CET 2020


Hi Michael,

Set bootargs to "root=/dev/vda2 rootwait console=ttyS0 earlycon=sbi" in
U-Boot before doing bootm

Regards,
Anup

On Wed, 2 Dec, 2020, 12:51 Michael Opdenacker, <
michael.opdenacker at bootlin.com> wrote:

> Greetings,
>
> To prepare an embedded Linux demo (on RiscV), I'm trying to boot Linux
> from U-Boot in qemu-system-riscv64, using the "virt" emulated machine...
> Note that I'm using QEMU 5.0.
>
> The well documented way to boot Linux works:
>
> In Linux master:
> CROSS_COMPILE=riscv64-linux-gnu- (toolchain built by Buildroot)
> ARCH=riscv
> make defconfig
> make
>
> In opensbi:
> make PLATFORM=generic FW_PAYLOAD_PATH=../linux/arch/riscv/boot/Image
>
> Running QEMU:
> qemu-system-riscv64 -nographic  -machine virt -kernel
> opensbi/build/platform/generic/firmware/fw_payload.elf -append
> "console=ttyS0"
>
> I can also boot U-Boot, but cannot manage to boot the Linux kernel with it:
>
> In U-Boot mainline:
>
> CROSS_COMPILE=riscv64-linux-gnu-
> make qemu-riscv64_smode_defconfig
> Modify the environment:
> - Unset CONFIG_ENV_IS_NOWHERE
> - CONFIG_ENV_IS_IN_FAT=y
> - CONFIG_ENV_FAT_INTERFACE="virtio"
> - CONFIG_ENV_FAT_DEVICE_AND_PART="0:1"
> - CONFIG_ENV_FAT_FILE="uboot.env"
> make
>
> Note that having U-Boot in "S" mode seems to be required to boot Linux.
> If U-Boot is in "M" mode, it works, but there are faults (as expected)
> when trying to execute Linux.
>
> In opensbi:
> make PLATFORM=generic FW_PAYLOAD_PATH=../u-boot/u-boot.bin
>
> I then prepared a disk.img image with a first FAT partition containing:
> - A "dtb" file captured from the first Linux boot (from /sys/firmware/fdt)
> - A "uImage" file made from the command:
> mkimage -A riscv -O linux -C none  -T kernel -a 80200000 -e 80200000 -n
> "Linux" -d arch/riscv/boot/Image uImage
>
> Then I'm starting QEMU as follows:
>
> qemu-system-riscv64 -m 1G -nographic  -machine virt -bios
> opensbi/build/platform/generic/firmware/fw_payload.bin -device
> virtio-blk-device,drive=hd0 -drive file=disk.img,format=raw,id=hd0
>
> OpenSBI v0.8-58-g781cafd
>    ____                    _____ ____ _____
>   / __ \                  / ____|  _ \_   _|
>  | |  | |_ __   ___ _ __ | (___ | |_) || |
>  | |  | | '_ \ / _ \ '_ \ \___ \|  _ < | |
>  | |__| | |_) |  __/ | | |____) | |_) || |_
>   \____/| .__/ \___|_| |_|_____/|____/_____|
>         | |
>         |_|
>
> Platform Name             : riscv-virtio,qemu
> Platform Features         : timer,mfdeleg
> Platform HART Count       : 1
> Firmware Base             : 0x80000000
> Firmware Size             : 104 KB
> Runtime SBI Version       : 0.2
>
> Domain0 Name              : root
> Domain0 Boot HART         : 0
> Domain0 HARTs             : 0*
> Domain0 Region00          : 0x0000000080000000-0x000000008001ffff ()
> Domain0 Region01          : 0x0000000000000000-0xffffffffffffffff (R,W,X)
> Domain0 Next Address      : 0x0000000080200000
> Domain0 Next Arg1         : 0x0000000082200000
> Domain0 Next Mode         : S-mode
> Domain0 SysReset          : yes
>
> Boot HART ID              : 0
> Boot HART Domain          : root
> Boot HART ISA             : rv64imafdcsu
> Boot HART Features        : scounteren,mcounteren,time
> Boot HART PMP Count       : 16
> Boot HART PMP Granularity : 4
> Boot HART PMP Address Bits: 54
> Boot HART MHPM Count      : 0
> Boot HART MHPM Count      : 0
> Boot HART MIDELEG         : 0x0000000000000222
> Boot HART MEDELEG         : 0x000000000000b109
>
>
> U-Boot 2021.01-rc2-00161-gf6cf78dc6a (Dec 02 2020 - 07:05:39 +0100)
>
> CPU:   rv64imafdcsu
> Model: riscv-virtio,qemu
> DRAM:  1 GiB
> Loading Environment from FAT... OK
> In:    uart at 10000000
> Out:   uart at 10000000
> Err:   uart at 10000000
> Net:   No ethernet found.
> Hit any key to stop autoboot:  0
> bootcmd=printenv bootcmd; fatload virtio 0:1 0x84000000 uImage; fatload
> virtio 0:1 0x88000000 dtb; bootm 0x84000000 - 0x88000000
> 17704512 bytes read in 39 ms (432.9 MiB/s)
> 3618 bytes read in 1 ms (3.5 MiB/s)
> ## Booting kernel from Legacy Image at 84000000 ...
>    Image Name:   Linux
>    Image Type:   RISC-V Linux Kernel Image (uncompressed)
>    Data Size:    17704448 Bytes = 16.9 MiB
>    Load Address: 80200000
>    Entry Point:  80200000
>    Verifying Checksum ... OK
> ## Flattened Device Tree blob at 88000000
>    Booting using the fdt blob at 0x88000000
>    Loading Kernel Image
>    Using Device Tree in place at 0000000088000000, end 0000000088003e21
>
> Starting kernel ...
>
>
> ... and that's all I get, no further output. I'm not sure my dtb file is
> suitable though. I'm surprised there is no DTS file for the riscv64
> "virt" board emulated by QEMU in the Linux kernel sources, as U-Boot
> will refuse to boot Linux without one.
>
> Note that in U-Boot, the bootargs environment is set to:
> bootargs=console=ttyS0
>
> I'll be interested in your advise, if you already managed to do
> something like this.
>
> Cheers,
>
> Michael.
>
> --
> Michael Opdenacker, CEO, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
>
> --
> You received this message because you are subscribed to the Google Groups
> "RISC-V SW Dev" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to sw-dev+unsubscribe at groups.riscv.org.
> To view this discussion on the web visit
> https://groups.google.com/a/groups.riscv.org/d/msgid/sw-dev/6071db20-58af-55d3-5bec-8561d18a1707%40bootlin.com
> .
>


More information about the U-Boot mailing list