emulator: RVVM type: libretro core_classification: official_port source: "https://github.com/LekKit/RVVM" upstream: "https://github.com/LekKit/RVVM" profiled_date: "2026-03-25" core_version: "0.6-git" display_name: "RVVM" cores: [rvvm] systems: [riscv] # RVVM emulates a RISC-V machine (rv64imafdcb or rv32ima). The libretro core # loads a .rvvm plain-text config file specifying bootrom, kernel, nvme drives, # memory, CPU mode, cmdline, and framebuffer resolution. # # The core does NOT use the RetroArch system directory. All firmware paths are # specified in the .rvvm config file and resolved relative to its directory. # The core chdir()s to the .rvvm file's parent before initializing the VM. # # The .rvvm config format (parsed by retro_load_game): # bootrom=/path/to/fw_payload.bin # kernel=/path/to/Image # nvme=/path/to/rootfs.img # mem=512 # smp=2 # rv64 # cmdline=root=/dev/nvme0n1 rootflags=discard rw console=tty0 # # The libretro binding uses an older RVVM API (rvvm_load_bootrom, 4-param # rvvm_create_machine) that has been renamed in the current upstream # (rvvm_load_firmware, 3-param rvvm_create_machine). The binding may not # compile against RVVM HEAD without updates. # Source references: # libretro binding: src/bindings/libretro/libretro.c # config parsing: libretro.c:332-421 (retro_load_game) # VM init + loading: libretro.c:288-330 (vm_init) # firmware loading: rvvm.c:621-628 (rvvm_load_firmware) # kernel loading: rvvm.c:630-638 (rvvm_load_kernel) # FDT loading: rvvm.c:641-648 (rvvm_load_fdt, standalone only) # standalone CLI: main.c:213-282 (rvvm_cli_configure) files: - name: "fw_payload.bin" path: "rvvm/fw_payload.bin" required: true source_ref: "libretro.c:309-314, rvvm.c:621-628" note: > M-mode firmware loaded at 0x80000000. Typically OpenSBI with U-Boot payload (fw_payload.bin) or standalone (fw_jump.bin). Referenced by the bootrom= key in the .rvvm config. - name: "Image" path: "rvvm/Image" required: false source_ref: "libretro.c:316-318, rvvm.c:630-638" note: > S-mode kernel payload loaded at offset 0x200000 (rv64) or 0x400000 (rv32) from RAM base. Only needed with fw_jump.bin as bootrom. Referenced by the kernel= key in the .rvvm config. - name: "machine.dtb" path: "rvvm/machine.dtb" required: false mode: standalone source_ref: "main.c:230, rvvm.c:641-648" note: > Custom Flattened Device Tree. The core auto-generates a DTB based on machine configuration. The libretro binding does not parse a dtb= key in the .rvvm config, so this is only usable via the standalone CLI (-dtb flag). notes: firmware_sources: > OpenSBI: https://github.com/riscv-software-src/opensbi/releases. Pre-built images for RVVM: https://github.com/LekKit/RVVM/wiki/Running info_firmware_count: > .info declares 0 firmware. Correct: the core loads firmware via user-specified paths in the .rvvm config, not from system_dir.