Files
LithosAnanke/boards/milkv
…
..
…
…

Milk-V Mars boot media

make boot_image TARGET=MILKV builds build/boards/milkv/lithos-milkv.img: a GPT disk with one FAT32 EFI System Partition. Write it to an SD card with dd. The partition holds:

  • EFI/BOOT/BOOTRISCV64.EFI: the riscv64 monolithic loader, the same one QEMU boots.
  • startup.nsh: for a UEFI shell, if one is used.
  • starforth.cfg: only present when KERNEL_ARGS="..." is given.

The board's own SPI-flash U-Boot, with OpenSBI underneath, finds the loader through its standard bootefi scan of the removable-media path. U-Boot passes its devicetree to the loader through the EFI configuration table.

Status: booted in QEMU through the same chain the board uses: OpenSBI, then U-Boot qemu-riscv64_smode, then bootefi from this image's ESP, then the loader and the kernel. POST passed, Stadium conservation was exact (resident 43691 + reservoir 21845 = 65536 = Q48_ONE), and Hestia and Artemis came up. Not yet booted on the Mars itself. The JH7110 peripherals (framebuffer, RNG) have only been checked by compiling.

To repeat the QEMU boot (qemu-system-riscv64 is in Ubuntu 26.04's qemu-system-riscv package; OpenSBI and U-Boot come from opensbi and u-boot-qemu). Use a copy, because the kernel writes to its disk:

cp build/boards/milkv/lithos-milkv.img /tmp/mv.img
qemu-system-riscv64 -machine virt -cpu rv64 -m 2048 -nographic \
    -bios /usr/lib/riscv64-linux-gnu/opensbi/generic/fw_dynamic.bin \
    -kernel /usr/lib/u-boot/qemu-riscv64_smode/u-boot.bin \
    -drive if=none,format=raw,file=/tmp/mv.img,id=d0 -device virtio-blk-device,drive=d0