blob: a2433febfcd3f4816341462b4cce5a6a32a9b6bc [file] [view]
# Bare-metal RISC-V 64 sample
Runs a single-op IREE workload (elementwise `arith.mulf` on `4xf32`) on
bare-metal riscv64 under `qemu-system-riscv64` (`-machine virt`, no OS,
semihosted I/O), using the inline HAL. Two runners are built:
- `runner_llvmcpu`: kernels compiled to RISC-V machine code by the `llvm-cpu`
backend (`--iree-execution-model=inline-dynamic`), loaded at runtime with
the embedded-ELF loader via the `hal_loader` VM module.
- `runner_vmvx`: kernels as portable VM bytecode (`vmvx-inline`,
`--iree-execution-model=inline-static`); no loader involved.
The full-HAL path used by `samples/simple_embedding` is not used here because
its synchronous device creation currently requires a proactor, which
`IREE_PLATFORM_GENERIC` does not provide. The inline HAL runs the module
without a HAL device, threads, or a filesystem.
## Building and running
Requires a `riscv-none-elf` GCC toolchain that provides `semihost.specs` and
uses a newlib built with `-mcmodel=medany`, such as
[xPack riscv-none-elf-gcc](https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack),
along with prebuilt IREE host tools and `qemu-system-riscv64`. From the repository
root:
```sh
RISCV_TOOLCHAIN_ROOT=/path/to/xpack-gcc \
IREE_HOST_BIN_DIR=/path/to/host/tools \
./build_tools/cmake/build_riscv_baremetal.sh
./samples/baremetal_riscv64/run_qemu.sh
```
## Boot and memory layout
QEMU's `virt` machine places RAM at `0x80000000`, requiring
`-mcmodel=medany` throughout, including for newlib. QEMU's generic loader
loads the ELF and sets CPU 0's PC to its entry point, but does not initialize
a stack. `start.S` sets `sp` to `__stack_top`—128 MiB above the RAM base—and
enables the FPU before tailing into newlib's `crt0`. Semihosting provides
console output and process exit.