LekKit / RVVM

The RISC-V Virtual Machine
GNU General Public License v3.0
868 stars 60 forks source link
c emulation emulator emulators instruction-decoding jit linux risc risc-v riscv riscv-emulator riscv-linux riscv-simulator riscv32 riscv64 rvvm tracing-jit translation virtual-machine vm

RVVM - The RISC-V Virtual Machine

version Build Codacy grade RISC-V Logo

RISC-V CPU & System software implementation written in Π‘

What's working

Demo

πŸ’‘ Tell me more...

πŸ“¦ Installing

Release Artifacts AUR Build

πŸ›  Building

Currently builds using GNU Make (recommended) or CMake and is extremely portable.

git clone https://github.com/LekKit/RVVM
cd RVVM
make
cd release.linux.x86_64
./rvvm_x86_64 -h

You can configure the build with USE flags. To cross-compile, pass CC=target-gcc to make. If it fails to detect features, pass ARCH/OS variables explicitly.

Examples:

make lib CC=aarch64-linux-android21-clang USE_FB=0
make lib all CC=x86_64-w64-mingw32-gcc USE_NET=1
make CFLAGS=-m32 ARCH=i386 USE_RV64=0 BUILDDIR=build BINARY=rvvm
make CC=mipseb-linux-gnu-gcc USE_JIT=0 USE_SDL=2

Alternatively, you can use CMake:

git clone https://github.com/LekKit/RVVM
cd RVVM
cmake -S. -Bbuild
cmake --build build --target all
cd build
./rvvm -h

πŸš€ Running

rvvm fw_payload.bin -i drive.img -m 2G -smp 2 -res 1280x720

Recommended working firmware, distro images are found in Release section

Argument explanation:

[fw_payload.bin]       Initial M-mode firmware, OpenSBI + U-Boot in this case
-k, -kernel u-boot.bin Optional S-mode kernel payload (Linux Image, U-Boot, etc)
-i, -image drive.img   Attach storage image (Raw format, NVMe as of now)
-m, -mem 2G            Memory amount (may be suffixed by k/M/G), default 256M
-s, -smp 2             Amount of cores, single-core machine by default
-res 1280x720          Changes framebuffer & VM window resolution
-rv32                  Enable 32-bit RISC-V, 64-bit by default
 . . .
-cmdline, -append ...  Override/append default kernel command line
-nogui, -nojit         Disable GUI (Use only UART), Disable JIT (for debugging)
-v                     Verbose mode

Invoke rvvm -h to see extended help.

Tested environments (Likely works elsewhere as well)

OS JIT GUI
Linux Works X11, SDL
Windows Works Win32, SDL
MacOS X Works, need signing for M1 SDL, XQuartz
FreeBSD Works X11, SDL
Haiku Works Haiku, SDL
Serenity Works SDL
Windows CE Broken (?) Win32
Emscripten - SDL

βš–οΈ License

This work is dual-licensed under GPL 3.0 and MPL 2.0. You can choose between one of them if you use this work.

If you wish to use this work as a component of a larger, non-GPL compliant project, you are free to do so in any form (Static linkage, binary distribution, modules) as long as you comply with the MPL 2.0 license.

For any form of software distribution, changes made precisely to this work should be made public to comply with either licenses.

Source file headers should be gradually transitioned to reflect their reusability.

πŸŽ‰ Contributions

PRs are welcome Achievements Working on
LekKit RVVM API & infrastructure
RV64IMAFDC interpreter, MMU/IRQs/Priv/etc
RVJIT Compiler, X86/RISC-V backends
NVMe, RTL8169, VFIO, many tiny devices
Userspace network
Rework of PCIe, PLIC, etc
Networking, Userspace emulation
COW blk-dedup image format
New CPU features & JIT optimizations
cerg2010cerg2010 Important fixes, RV64 groundwork, FPU
Initial PLIC & PCI, PS2 HID, ATA, OC Ethernet
ARM/ARM64 RVJIT backends
Testing, Assistance
Mr0maks Initial C/M/Zicsr extensions, initial UART, VM debugger
ARM32 mul/div JIT intrinsics
-
0xCatPKG Userspace network & API improvements
Extended testing & portability fixes
HD Audio
X547 Haiku GUI, I2C HID, Userland API assistance Guest Haiku support, UserlandVM
iyzsong OpenBSD & PLIC fixes, Chardev API
nebulka1 Relative input mode

πŸ” TODO

The RISC-V trade name is a registered trade mark of RISC-V International.