This repository serves to my later self as reference to document some
#[no_std] and inline assembly features as well as cargo configurations.
It builds a riscv64i Linux user space binary which invokes some syscalls
according to the Linux syscall(2)
ABI for riscv.
Arch/ABI Instruction System Ret Ret Error Notes
call # val val2
───────────────────────────────────────────────────────────────────
riscv ecall a7 a0 a1 -
Arch/ABI arg1 arg2 arg3 arg4 arg5 arg6 arg7 Notes
──────────────────────────────────────────────────────────────
riscv a0 a1 a2 a3 a4 a5 -The syscalls are implemented in lib.rs.
When building, cargo runs the build.rs script before building the crate itself, which in this case generates some rust code for the syscall numbers from the riscv C headers.
Looking into .cargo/config we actually build for the
riscv64imac-unknown-none-elf rather than the riscv64gc-unknown-linux-gnu
target, as our goal is to build a risv64*i* binary and that way we just have
to disable a few more extensions :^).
The binary can be automatically run in the QEMU user space emulator with cargo run, this is because the runner is specified in
.cargo/config.
riscv64-linux-gnu-gcctoolchain for parsing syscall numbers in build.rsriscv64imac-unknown-none-elfrustc target to generate riscv target code (rustup target add riscv64imac-unknown-none-elf)qemu-riscv64QEMU userspace emulator