criscv/README.md
Minecon724 25efda4fc7
Some checks failed
/ deploy (push) Has been cancelled
Make it more clear
2024-10-19 20:42:52 +02:00

1.5 KiB

RISC-V (rv32i) emulator in C
This is just for me to understand how all this works, and to learn something new.
So don't use it.

Example programs:

  • return.bin returns -1094647826 (puts it to register 10)
  • return2.elf returns a different value with more steps. if it returns DADD, something's wrong

Emulator exit codes:

  • -1 - reached end of address space
  • 0 - never happens
  • 1 - invalid opcode
  • 2 - illegal instruction argument (like funct3)

Compile:

  1. Dependencies: libelf
  2. make # should display no warnings
    
  3. Executable is build/criscv

Note: Prebuilts for x86_64 & aarch64 Linux are available here, pick the top one, download the artifact, and unpack the one for your architecture.
Those are dynamic, meaning you still need the dependencies! See compile step 0 above.

Compile programs:

  1. Get the toolchain obviously
  2. riscv32-unknown-elf-gcc -ffreestanding -nostdlib -Ttext=0x0 -e main -O0 -o program.elf program.c
    
  3. program.bin is the binary file with the program, pass it as an argument

rv32i, ilp32 compatible toolchain for 64bit Linux: download adaa74f263dcba430da588b1109bc3b90bd90a84c67b06213bd03a7bbacd1a2a
Or just the stuff necessary to make a binary file: download 55e79dff7ba4093dedb8151461508fc157525ad89615d49d737845af03d1643f
Those were compiled with ./configure --prefix=$(pwd)/../toolchain --with-arch=rv32i --with-abi=ilp32 and make