diff --git a/Ports/AvailablePorts.md b/Ports/AvailablePorts.md index 55b038588a74d22..dd17508b6d55ad8 100644 --- a/Ports/AvailablePorts.md +++ b/Ports/AvailablePorts.md @@ -280,7 +280,7 @@ This list is also available at [ports.serenityos.net](https://ports.serenityos.n | [`rsync`](rsync/) | rsync | 3.2.7 | https://rsync.samba.org/ | | [`rubberband`](rubberband/) | Rubberband | 3.3.0 | https://breakfastquay.com/rubberband/ | | [`ruby`](ruby/) | Ruby | 3.2.2 | https://www.ruby-lang.org/ | -| [`rvvm`](rvvm/) | RVVM - The RISC-V Virtual Machine | 0.5 | https://github.com/LekKit/RVVM | +| [`rvvm`](rvvm/) | RVVM - The RISC-V Virtual Machine | 0.6 | https://github.com/LekKit/RVVM | | [`sam`](sam/) | Software Automatic Mouth (SAM) | c86ea39 | https://github.com/vidarh/SAM | | [`scummvm`](scummvm/) | ScummVM | 2.8.0 | https://www.scummvm.org/ | | [`sdl12-compat`](sdl12-compat/) | SDL2 compatibility layer for SDL 1.2 games | 1.2.64 | https://github.com/libsdl-org/sdl12-compat/ | diff --git a/Ports/rvvm/package.sh b/Ports/rvvm/package.sh index 9cfabd1c809c5cd..66021772e63674a 100755 --- a/Ports/rvvm/package.sh +++ b/Ports/rvvm/package.sh @@ -1,18 +1,19 @@ #!/usr/bin/env -S bash ../.port_include.sh +# Maintainer: LekKit + port='rvvm' -version='0.5' -archive_hash='3a1dbb91ad04f068078bc6c6c27cc5792eebc111907cb5a14bde158fe6e757c9' +version='0.6' +archive_hash='97e98c95d8785438758b81fb5c695b8eafb564502c6af7f52555b056e3bb7d7a' files=( "https://github.com/LekKit/RVVM/archive/v${version}.tar.gz#${archive_hash}" ) workdir="RVVM-${version}" -depends=('sdl12-compat') +depends=('SDL2') build_opts=( - 'GIT_COMMIT=76796ba' + 'GIT_COMMIT=f937fd8' 'OS=SerenityOS' - 'USE_NET=1' - 'USE_SDL=1' + 'USE_SDL=2' ) makeopts+=("${build_opts[@]}" 'all' 'lib') installopts+=("${build_opts[@]}") diff --git a/Ports/rvvm/patches/ReadMe.md b/Ports/rvvm/patches/ReadMe.md new file mode 100644 index 000000000000000..6264c1cef3dbab4 --- /dev/null +++ b/Ports/rvvm/patches/ReadMe.md @@ -0,0 +1,11 @@ +# Patches for RVVM on SerenityOS + +## `disable-threaded-io.patch` + +Due to sloppy scheduler/threading behavior on Serenity, threaded IO is disabled in this port for now. +Otherwise U-Boot randomly fails to read data from NVMe, or fails to initialize NVMe altogether, +along with other IO issues in guests - all due to threaded tasks being randomly delayed for very long. + +I am not an expert on how scheduler works in Serenity, so I am unable to fix it yet. +This problem was also visible in previous v0.5 version of this port, but back then I thought it's some kind of a temporary problem. +Couldn't reproduce this on any other host OS. diff --git a/Ports/rvvm/patches/disable-threaded-io.patch b/Ports/rvvm/patches/disable-threaded-io.patch new file mode 100644 index 000000000000000..77b780abf6aebdb --- /dev/null +++ b/Ports/rvvm/patches/disable-threaded-io.patch @@ -0,0 +1,45 @@ +commit f897929a4616f0b0a88bab36c7fc2a9c5bbb3365 +Author: LekKit <50500857+LekKit@users.noreply.github.com> +Date: Fri Mar 22 10:05:07 2024 +0200 + + Disable threaded IO on Serenity + +diff --git a/src/threading.c b/src/threading.c +index 98883ed..705749c 100644 +--- a/src/threading.c ++++ b/src/threading.c +@@ -318,6 +318,12 @@ void condvar_free(cond_var_t* cond) + + // Threadpool task offloading + ++// Serenity has serious scheduler issues that cause threadpool to ++// perform very poorly when vCPU is not sleeping. ++// Basically a thread that uses 100% of CPU on Serenity somehow ++// monopolizes host CPU so threadpool/eventloop tasks are timing out. ++ ++#ifndef __serenity__ + #define WORKER_THREADS 4 + #define WORKQUEUE_SIZE 2048 + #define WORKQUEUE_MASK (WORKQUEUE_SIZE - 1) +@@ -440,8 +446,11 @@ static void* threadpool_worker(void* ptr) + return ptr; + } + ++#endif ++ + static bool thread_queue_task(thread_func_t func, void** arg, unsigned arg_count, bool va) + { ++#ifndef __serenity__ + DO_ONCE ({ + atomic_store_uint32_ex(&pool_run, 1, ATOMIC_RELAXED); + workqueue_init(&pool_wq); +@@ -461,6 +470,9 @@ static bool thread_queue_task(thread_func_t func, void** arg, unsigned arg_count + // Still not queued! + // Assuming entire threadpool is busy, just do a blocking task + DO_ONCE(rvvm_warn("Blocking on workqueue task %p", func)); ++#else ++ UNUSED(func); UNUSED(arg); UNUSED(arg_count); UNUSED(va); ++#endif + return false; + } +