These are some useful links and notes pertaining to the RISC-V port of Mono.
- RISC-V User-Level ISA Specification
- RISC-V Privileged ISA Specification
- RISC-V Debug Specification
- RISC-V ELF psABI Specification
- RISC-V C API Specification
- RISC-V Toolchain Conventions
- RISC-V Assembly Programmer's Manual
This is the most painless way of getting a functional toolchain installed. Note that these packages may not be available on older distributions; this is tested on Ubuntu 19.04.
First, add this to your $HOME/.bashrc
(or some other script that you run):
export RISCV=$HOME/riscv
export PATH=$RISCV/bin:$PATH
export QEMU_LD_PREFIX=/usr/riscv64-linux-gnu
Next, install the toolchain packages like so:
# apt install autoconf automake binutils-riscv64-linux-gnu build-essential gcc-riscv64-linux-gnu gdb-multiarch g++-riscv64-linux-gnu libtool qemu qemu-system-misc qemu-user qemu-user-static
You will now have all the toolchain binaries in /usr/bin
.
This approach may be somewhat unstable since you will be using the latest versions of the various parts of the toolchain.
First, add this to your $HOME/.bashrc
(or some other script that you run):
export RISCV=$HOME/riscv
export PATH=$RISCV/bin:$PATH
export QEMU_LD_PREFIX=$RISCV/sysroot
Next, install some dependencies needed to build the toolchain:
# apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev
Finally, build the toolchain:
$ git clone --recursive [email protected]:riscv/riscv-gnu-toolchain.git
$ cd riscv-gnu-toolchain
$ ./configure --prefix=$RISCV --enable-linux --enable-multilib --with-arch=rv64imafdc --with-abi=lp64d
$ make linux
This will install the built toolchain binaries in $RISCV/bin
.
Building Mono is quite straightforward:
$ ./autogen.sh --prefix=$RISCV/sysroot --host=riscv64-linux-gnu
$ make
$ make install
(Note: You may need to use --host=riscv64-unknown-linux-gnu
instead if you
built the toolchain manually.)
You can set CFLAGS
as appropriate to change the RISC-V options, such as which
standard extensions and ABI to use. For example, to use the 64-bit soft float
ABI:
$ CFLAGS="-mabi=lp64" ./autogen.sh --prefix=$RISCV/sysroot --host=riscv64-linux-gnu
Note that, since this is a cross build, the mcs
directory won't be built. You
will have to build the managed libraries and tools through a native build of
Mono and copy them into $RISCV/sysroot
.
You can run Mono with QEMU like this:
$ qemu-riscv64 ./mono/mini/mono hello.exe
Debugging with GDB currently requires a manually built toolchain.
It can be done like so:
$ qemu-riscv64 -g 12345 ./mono/mini/mono --interp basic.exe &
$ riscv64-unknown-elf-gdb -ex 'target remote localhost:12345' -ex 'b main' -ex 'c' ./mono/mini/mono
Things that need to be done beyond the basic 64-bit port, in no particular order:
- Complete the soft float port.
- Complete the 32-bit port.
- Add unwind info to trampolines.
- Implement AOT support.
- Implement interpreter support.
- Implement LLVM support.
- Implement SDB support.
- Implement
dyn_call
support. - Ensure all runtime tests pass.
- Ensure all corlib tests pass.
- Set up CI on Jenkins.