Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/riscv.md116
1 files changed, 116 insertions, 0 deletions
diff --git a/docs/riscv.md b/docs/riscv.md
new file mode 100644
index 00000000000..53e42761514
--- /dev/null
+++ b/docs/riscv.md
@@ -0,0 +1,116 @@
+# Mono RISC-V Port
+
+These are some useful links and notes pertaining to the RISC-V port of Mono.
+
+## Useful RISC-V documents
+
+* [RISC-V User-Level ISA Specification](https://riscv.org/specifications/)
+* [RISC-V Privileged ISA Specification](https://riscv.org/specifications/privileged-isa/)
+* [RISC-V Debug Specification Standard](https://github.com/riscv/riscv-debug-spec/blob/master/riscv-debug-spec.pdf)
+* [RISC-V Assembly Programmer's Manual](https://github.com/riscv/riscv-asm-manual/blob/master/riscv-asm.md)
+* [RISC-V ELF psABI Specification](https://github.com/riscv/riscv-elf-psabi-doc/blob/master/riscv-elf.md)
+
+## Useful RISC-V repositories
+
+* [RISC-V Organization](https://github.com/riscv)
+ * [RISC-V Linux](https://github.com/riscv/riscv-linux)
+ * [RISC-V LLD](https://github.com/riscv/riscv-lld)
+ * [RISC-V Tools](https://github.com/riscv/riscv-tools)
+ * [RISC-V GNU Toolchain](https://github.com/riscv/riscv-gnu-toolchain)
+ * [RISC-V Binutils](https://github.com/riscv/riscv-binutils-gdb)
+ * [RISC-V GCC](https://github.com/riscv/riscv-gcc)
+ * [RISC-V Glibc](https://github.com/riscv/riscv-glibc)
+ * [RISC-V Newlib](https://github.com/riscv/riscv-newlib)
+ * [RISC-V QEMU](https://github.com/riscv/riscv-qemu)
+ * [RISC-V Opcodes](https://github.com/riscv/riscv-opcodes)
+ * [RISC-V Tests](https://github.com/riscv/riscv-tests)
+* [lowRISC Organization](https://github.com/lowrisc)
+ * [RISC-V LLVM](https://github.com/lowrisc/riscv-llvm)
+
+## Setting up a cross environment
+
+Setting up a cross environment with a Linux toolchain and QEMU is quite easy.
+
+First, add these to your `.bashrc` (or some other script that you run):
+
+```bash
+export RISCV=$HOME/riscv
+export PATH=$RISCV/bin:$PATH
+export QEMU_LD_PREFIX=$RISCV/sysroot
+```
+
+Install some dependencies needed to build the toolchain:
+
+```console
+# apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev libusb-1.0-0-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev device-tree-compiler pkg-config libexpat-dev libglib2.0-dev libpixman-1-dev
+```
+
+Now you can build the toolchain:
+
+```console
+$ git clone --recursive git@github.com:riscv/riscv-tools.git
+$ cd riscv-tools
+$ ./build.sh
+$ cd riscv-gnu-toolchain
+$ ./configure --prefix=$RISCV --enable-multilib
+$ make linux
+$ cd ../..
+$ git clone --recursive git@github.com:riscv/riscv-qemu.git
+$ cd riscv-qemu
+$ mkdir build
+$ cd build
+$ ../configure --prefix=$RISCV --disable-werror
+$ make
+$ make install
+```
+
+## Building Mono with a cross toolchain
+
+Building Mono is quite straightforward:
+
+```console
+$ ./autogen.sh --prefix=$RISCV/sysroot --host=riscv64-unknown-linux-gnu
+$ make
+$ make install
+```
+
+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:
+
+```console
+$ CFLAGS="-mabi=lp64" ./autogen.sh --prefix=$RISCV/sysroot --host=riscv64-unknown-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:
+
+```console
+$ qemu-riscv64 $RISCV/sysroot/bin/mono hello.exe
+```
+
+## Debugging
+
+```console
+$ qemu-riscv64 -g 12345 ./mono/mini/mono-sgen --interp basic.exe &
+$ riscv64-unknown-elf-gdb -ex 'target remote localhost:12345' -ex 'b main' -ex 'c' ./mono/mini/mono-sgen
+```
+
+## Things to be done
+
+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.