The Sail model implements a very simple platform based on the one implemented by the Spike reference simulator. It implements a console output port similar to Spike's HTIF (host-target interface) mechanism, and an interrupt controller based on Spike's CLINT (core-local interrupt controller). Console input is not currently supported.
32-bit OS boots require a workaround for the 64-bit HTIF interface, which is currently not supported.
OS boots use device-tree binary blobs generated by the dtc compiler,
installable on Ubuntu and Debian machines with
sudo apt install device-tree-compiler
The C model needs an ELF-version of the BBL (Berkeley-Boot-Loader)
that contains the Linux kernel as an embedded payload. It also needs
a DTB (device-tree blob) file describing the platform (say in the file
spike.dtb). Once those are available (see below for suggestions),
the model should be run as:
$ ./c_emulator/riscv_sim_<arch> -t console.log -b spike.dtb bbl > execution-trace.log 2>&1 &
$ tail -f console.log
The console.log file contains the console boot messages. For maximum
performance and benchmarking a model without any execution tracing is
available on the optimize branch (git checkout optimize) of this
repository. This currently requires the latest Sail built from source.
The OCaml model only needs the ELF-version of the BBL, since it can generate its own DTB.
$ ./ocaml_emulator/riscv_ocaml_sim_<arch> bbl > execution-trace.log 2> console.log
-
Some OS toolchains generate obsolete LR/SC instructions with now illegal combinations of
.aqand.rlflags. You can work-around this by changingriscv_mem.sailto accept these flags. -
One needs to manually ensure that the DTB used for the C model accurately describes the physical memory map implemented in the C platform. This will not be needed once the C model can generate its own DTB.
rv64-linux-4.15.0-gcc-7.2.0-64mb.bbl contains a sample Linux RV64
image that can be booted as follows, after first generating the
device-tree blob for a 64MB RV64 machine using dtc:
dtc < os-boot/rv64-64mb.dts > os-boot/rv64-64mb.dtb
./c_emulator/riscv_sim_RV64 -b os-boot/rv64-64mb.dtb -t /tmp/console.log os-boot/rv64-linux-4.15.0-gcc-7.2.0-64mb.bbl > >(gzip -c > execution-trace.log.gz) 2>&1
tail -f /tmp/console.log