emulators/rvvm: RISC-V Virtual Machine

RVVM is a virtual machine / emulator for RISC-V guests, which emphasizes
on performance, security, lean code and portability. It already runs a
lot of guest operating systems, including Linux, Haiku, FreeBSD,
OpenBSD, etc. It also aims to run RISC-V applications on a foreign-arch
host without full OS guest & isolation (Userland emulation).

WWW: https://github.com/LekKit/RVVM
This commit is contained in:
Robert Clausecker 2025-01-23 00:29:49 +01:00
parent 5bf2f84176
commit 5912458941
7 changed files with 210 additions and 0 deletions

View file

@ -128,6 +128,7 @@
SUBDIR += riscv-isa-sim
SUBDIR += rpcs3
SUBDIR += rubygem-fission
SUBDIR += rvvm
SUBDIR += sameboy
SUBDIR += simh
SUBDIR += simh-hp2100

79
emulators/rvvm/Makefile Normal file
View file

@ -0,0 +1,79 @@
PORTNAME= RVVM
DISTVERSIONPREFIX= v
DISTVERSION= 0.6
CATEGORIES= emulators
MASTER_SITES= https://github.com/LekKit/patches-misc/releases/download/rvvm-uboot-2024.7/:fw \
https://github.com/LekKit/riscv-tests/releases/download/rvvm-tests/:tests
DISTFILES= ${FWFILES:.bin=.bin:fw} riscv-tests.tar.gz:tests
DIST_SUBDIR= rvvm-${DISTVERSION}
EXTRACT_ONLY= ${DISTFILE_DEFAULT}
MAINTAINER= fuz@FreeBSD.org
COMMENT= RISC-V Virtual Machine
LICENSE= GPLv2 GPLv3 MPL20
LICENSE_COMB= multi
LICENSE_FILE_GPLv3= ${WRKSRC}/LICENSE-GPL
LICENSE_FILE_MPL20= ${WRKSRC}/LICENSE-MPL
LICENSE_DISTFILES_GPLv2= ${FWFILES}
LICENSE_DISTFILES_GPLv3= ${DISTFILE_DEFAULT}
LICENSE_DISTFILES_MPL20= ${DISTFILE_DEFAULT}
FLAVORS= x11 nox11
FLAVOR?= ${FLAVORS:[1]}
nox11_PKGNAMESUFFIX= -nox11
USES= gmake localbase:ldflags
USE_GITHUB= yes
GH_ACCOUNT= LekKit
USE_LDCONFIG= yes
BUILDDIR= ${WRKDIR}/.build
MAKE_ENV+= BUILDDIR=${BUILDDIR}
TEST_TARGET= test
SUB_FILES= pkg-message
OPTIONS_DEFINE= FDT FPU JIT JNI SPINLOCK_DEBUG NET PCI RV64
OPTIONS_DEFAULT= FDT FPU JIT JNI SPINLOCK_DEBUG NET PCI RV64
FDT_DESC= enable automatic FDT generation
FPU_DESC= enable floating point (F/D) CPU extension
JIT_DESC= enable RVJIT accelerator
JNI_DESC= include native JNI bindings in shared librvvm
NET_DESC= enable unprivileged userland networking stack
PCI_DESC= enable PCI support in ATA, etc devices
RV64_DESC= enable riscv64 CPU support
SPINLOCK_DEBUG_DESC= enable deadlock debugging (minimal runtime overhead)
FWFILES= fw_jump.bin fw_payload.bin
.for o in ${OPTIONS_DEFINE}
$o_MAKE_ENV= USE_$o=1
$o_MAKE_ENV_OFF= USE_$o=0
.endfor
.if ${FLAVOR} == x11
MAKE_ENV+= USE_FB=1 USE_XSHM=1
USES+= xorg
USE_XORG+= x11 xext
.else
MAKE_ENV+= USE_FB=0 USE_XSHM=0
.endif
.include <bsd.port.pre.mk>
.if defined(WITH_DEBUG)
MAKE_ENV+= USE_DEBUG=1
.endif
post-install:
${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/rvvm
${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/librvvm.so
${MKDIR} ${STAGEDIR}${DATADIR}
.for f in ${FWFILES}
${INSTALL_DATA} ${_DISTDIR}/$f ${STAGEDIR}${DATADIR}/
.endfor
pre-test:
${LN} -sf ${_DISTDIR}/riscv-tests.tar.gz ${BUILDDIR}/
.include <bsd.port.post.mk>

9
emulators/rvvm/distinfo Normal file
View file

@ -0,0 +1,9 @@
TIMESTAMP = 1737591303
SHA256 (rvvm-0.6/fw_jump.bin) = 60f5aedaf90be271eef9e4f1a479171c183987f97f86208811e9212b121d5b45
SIZE (rvvm-0.6/fw_jump.bin) = 136776
SHA256 (rvvm-0.6/fw_payload.bin) = d97321ca71be85a98dcc1757b721616d6ed68304afe853336273cb19b424da6c
SIZE (rvvm-0.6/fw_payload.bin) = 2958016
SHA256 (rvvm-0.6/riscv-tests.tar.gz) = f0e888a8db158b1e82ac09cebd01d8e1d5913477d1515c41286fae5e309e5322
SIZE (rvvm-0.6/riscv-tests.tar.gz) = 87062
SHA256 (rvvm-0.6/LekKit-RVVM-v0.6_GH0.tar.gz) = 97e98c95d8785438758b81fb5c695b8eafb564502c6af7f52555b056e3bb7d7a
SIZE (rvvm-0.6/LekKit-RVVM-v0.6_GH0.tar.gz) = 313342

View file

@ -0,0 +1,75 @@
--- Makefile.orig 2024-03-18 16:11:18 UTC
+++ Makefile
@@ -33,7 +33,7 @@ BOLD := $(shell tput md $(NULL_STDERR) || tput bo
SPACE :=
ifneq (,$(TERM))
BOLD := $(shell tput md $(NULL_STDERR) || tput bold $(NULL_STDERR) || printf "\033[1m" $(NULL_STDERR))
-RESET := $(shell tput me $(NULL_STDERR) || tput sgr0 $(NULL_STDERR) || printf "\033[0m" $(NULL_STDERR))$(BOLD)
+RESET := $(shell tput me $(NULL_STDERR) || tput sgr0 $(NULL_STDERR) || printf "\033[0m" $(NULL_STDERR))
RED := $(shell tput AF 1 $(NULL_STDERR) || tput setaf 1 $(NULL_STDERR) || printf "\033[31m" $(NULL_STDERR))$(BOLD)
GREEN := $(shell tput AF 2 $(NULL_STDERR) || tput setaf 2 $(NULL_STDERR) || printf "\033[32m" $(NULL_STDERR))$(BOLD)
YELLOW := $(shell tput AF 3 $(NULL_STDERR) || tput setaf 3 $(NULL_STDERR) || printf "\033[33m" $(NULL_STDERR))$(BOLD)
@@ -231,8 +231,8 @@ endif
# Warning options (Strict safety/portability, stack/object size limits)
# -Wbad-function-cast, -Wcast-align, -Wdouble-promotion need fixes in codebase
-WARN_OPTS := -Wall -Wextra -Wshadow -Wvla -Wpointer-arith -Walloca -Wduplicated-cond \
--Wtrampolines -Wlarger-than=1048576 -Wframe-larger-than=32768 -Werror=return-type
+WARN_OPTS := -Wall -Wextra -Wshadow -Wvla -Wpointer-arith -Walloca \
+-Wlarger-than=1048576 -Wframe-larger-than=32768 -Werror=return-type
# Compiler-specific options
ifeq ($(CC_TYPE),gcc)
@@ -467,13 +467,11 @@ endif
endif
# Do not pass lib-related flags for dev/cli/test builds (Faster)
-ifneq (,$(findstring lib, $(MAKECMDGOALS))$(findstring install, $(MAKECMDGOALS)))
override CFLAGS += -DUSE_LIB -fPIC -ffat-lto-objects
# Build JNI bindings inside librvvm dynlib
ifeq ($(USE_JNI),1)
SRC += $(SRCDIR)/bindings/jni/rvvm_jni.c
endif
-endif
# CPU interpreter sources
SRC += $(wildcard $(SRCDIR)/cpu/riscv_*.c)
@@ -583,10 +581,10 @@ test: $(BINARY)
@echo
@echo "[$(YELLOW)INFO$(RESET)] Running RISC-V Tests (RV32)"
@echo
- @for file in $(BUILDDIR)/riscv-tests/rv32*.bin; do \
+ @for file in $(BUILDDIR)/riscv-tests/rv32*; do \
result=$$($(BINARY) $$file -nogui -rv32 | tr -d '\0'); \
result="$${result##* }"; \
- if [[ "$$result" == "0" ]]; then \
+ if [ "$$result" -eq "0" ]; then \
echo "[$(GREEN)PASS$(RESET)] $$file"; \
else \
echo "[$(RED)FAIL: $$result$(RESET)] $$file"; \
@@ -596,10 +594,10 @@ ifeq ($(USE_RV64),1)
@echo
@echo "[$(YELLOW)INFO$(RESET)] Running RISC-V Tests (RV64)"
@echo
- @for file in $(BUILDDIR)/riscv-tests/rv64*.bin; do \
+ @for file in $(BUILDDIR)/riscv-tests/rv64*; do \
result=$$($(BINARY) $$file -nogui -rv64 | tr -d '\0'); \
result="$${result##* }"; \
- if [[ "$$result" == "0" ]]; then \
+ if [ "$$result" -eq "0" ]; then \
echo "[$(GREEN)PASS$(RESET)] $$file"; \
else \
echo "[$(RED)FAIL: $$result$(RESET)] $$file"; \
@@ -647,11 +645,10 @@ ifeq ($(HOST_POSIX),1)
@install -Dm755 $(BINARY) $(DESTDIR)$(bindir)/rvvm
@install -Dm755 $(SHARED) $(DESTDIR)$(libdir)/librvvm$(LIB_EXT)
@install -Dm644 $(STATIC) $(DESTDIR)$(libdir)/librvvm_static.a
+ @install -d $(DESTDIR)$(includedir)/rvvm
@install -Dm644 $(SRCDIR)/rvvmlib.h $(DESTDIR)$(includedir)/rvvm/rvvmlib.h
@install -Dm644 $(SRCDIR)/fdtlib.h $(DESTDIR)$(includedir)/rvvm/fdtlib.h
@install -Dm644 $(SRCDIR)/devices/*.h $(DESTDIR)$(includedir)/rvvm/
- @install -d $(DESTDIR)$(datadir)/licenses/rvvm/
- @install -Dm644 LICENSE* $(DESTDIR)$(datadir)/licenses/rvvm/
else
@echo "[$(RED)WARN$(RESET)] Unsupported on non-POSIX!"
endif

View file

@ -0,0 +1,11 @@
RVVM has been installed.
To execute a disk image, run
rvvm %%DATADIR%%/fw_payload.bin [flags] -i $disk.img
To execute a custom kernel payload, run
rvvm %%DATADIR%%/fw_jump.bin [flags] -k $kernel.bin
For further details, execute rvvm --help.

5
emulators/rvvm/pkg-descr Normal file
View file

@ -0,0 +1,5 @@
RVVM is a virtual machine / emulator for RISC-V guests, which emphasizes
on performance, security, lean code and portability. It already runs a
lot of guest operating systems, including Linux, Haiku, FreeBSD,
OpenBSD, etc. It also aims to run RISC-V applications on a foreign-arch
host without full OS guest & isolation (Userland emulation).

30
emulators/rvvm/pkg-plist Normal file
View file

@ -0,0 +1,30 @@
bin/rvvm
include/rvvm/ata.h
include/rvvm/chardev.h
include/rvvm/clint.h
include/rvvm/eth-oc.h
include/rvvm/fb_window.h
include/rvvm/fdtlib.h
include/rvvm/framebuffer.h
include/rvvm/gpio-sifive.h
include/rvvm/gpio_api.h
include/rvvm/hid_api.h
include/rvvm/hid_dev.h
include/rvvm/i2c-hid.h
include/rvvm/i2c-oc.h
include/rvvm/mtd-physmap.h
include/rvvm/ns16550a.h
include/rvvm/nvme.h
include/rvvm/pci-bus.h
include/rvvm/plic.h
include/rvvm/ps2-altera.h
include/rvvm/rtc-ds1742.h
include/rvvm/rtc-goldfish.h
include/rvvm/rtl8169.h
include/rvvm/rvvmlib.h
include/rvvm/syscon.h
include/rvvm/tap_api.h
lib/librvvm.so
lib/librvvm_static.a
%%DATADIR%%/fw_jump.bin
%%DATADIR%%/fw_payload.bin