On 26/06/2022 00:34, Simon Sapin wrote:
+On startup, the dtb is memory-mapped and its address is passed to the guest
+in a target-specific way:
+
+* Arm: :ref:`arm-baremetal`
+* **TODO**: document other targets

Hello,

My current interest is playing with bare-metal / freestanding RISC-V, using QEMU as a reference emulator. Based on various blog posts, reading QEMU source code, and lots of trial-and-error I’ve managed to get something running[1] but it wasn’t easy.

In comparison, the docs for Arm virt have a very helpful section[2] for this scenario. I would like to contribute similar docs for RISC-V virt but I’d need confirmation of the information to put in it:

* Through `dumpdtb` I see that flash memory starts at address 0x2_000_0000, and RAM at 0x8_000_0000. Is this information that guest code can rely on and hard-code? What details can or cannot be similarly relied on?

* With `qemu-system-riscv32 -machine virt -bios none -kernel something.elf -s -S`, GDB shows that execution starts at the lowest address of RAM, not of flash like I expected. Then what is emulated flash for?

* What’s the difference between a bios and a kernel? The previous command is based on a blog post but I don’t fully quite the details.

* I see in source code[3] that QEMU passes some arguments to the firmware. Register a0 gets the hart ID, a1 is the dtb address, but what’s in a2?

* To what extent is the above calling convention standardized? I found similar things in coreboot[4] and in OpenSBI[5]


[1] https://github.com/SimonSapin/riscv-qemu-demo

[2] https://www.qemu.org/docs/master/system/arm/virt.html#hardware-configuration-information-for-bare-metal-programming

[3] https://gitlab.com/qemu-project/qemu/-/blob/v7.0.0/hw/riscv/boot.c#L297-317

[4] https://doc.coreboot.org/arch/riscv/index.html#stage-handoff-protocol

[5] https://github.com/riscv-software-src/opensbi/blob/v1.1/platform/generic/platform.c#L59-L75


Thanks!
--
Simon Sapin

Reply via email to