Skip to content

Releases: tamnd/ruvm

ruvm 0.5.7

Choose a tag to compare

@tamnd tamnd released this 13 Oct 09:10
v0.5.7
1c9de64

This patch starts M8 with virtio-iommu and intel-iommu, adds -global, and keeps moving the qtest work on the arm and riscv virt boards.

For M8: virtio-iommu is in on q35 (#264) and arm virt (#266). intel-iommu is in with legacy DMA remapping and the DMAR table (#270) and interrupt remapping (#274). Both were compared against QEMU 11.1 with Linux guests on server2.

For M6: -global is in with QEMU's qdev global property semantics and errors (#271). The QMP system_reset command (#261), null-co drives and QMP block_resize (#265) are in. The QOM types of the virtio-rng and virtio-blk devices are listed as QEMU lists them (#262, #267). The arm and riscv virt boards now take virtio-balloon (#268), -netdev with virtio-net (#269) and announce-self (#272). virtio-sound-device works on microvm with QEMU's bus placement and errors, and the ac97 alias is accepted (#263). Two flaky net tests are fixed: the passt test no longer hits ETXTBSY when it runs its scripts (#273), and the two queue tap test uses its own device name (#275).

What's Changed

  • system: add the QMP system_reset command by @tamnd in #261
  • system: list the QOM types of the virtio-rng devices by @tamnd in #262
  • system: add virtio-sound-device on microvm by @tamnd in #263
  • Add virtio-iommu on q35 by @tamnd in #264
  • system: add null-co drives and the QMP block_resize command by @tamnd in #265
  • Add virtio-iommu on arm virt by @tamnd in #266
  • system: list the QOM types of virtio-blk by @tamnd in #267
  • system: plug virtio-balloon on the arm and riscv boards by @tamnd in #268
  • system: take -netdev and virtio-net on the arm and riscv boards by @tamnd in #269
  • Add intel-iommu with legacy DMA remapping and the DMAR table by @tamnd in #270
  • system: add -global with qdev global property semantics by @tamnd in #271
  • net: add announce-self and list virtio-net on the arm and riscv boards by @tamnd in #272
  • net: write the passt test scripts from a child to avoid ETXTBSY by @tamnd in #273
  • Add interrupt remapping to intel-iommu by @tamnd in #274
  • net: give the two queue tap test device its own name by @tamnd in #275
  • Release 0.5.7 by @tamnd in #276

Full Changelog: v0.5.6...v0.5.7

ruvm 0.5.6

Choose a tag to compare

@tamnd tamnd released this 13 Oct 06:02
v0.5.6
7f9d340

This patch runs the Arm virt board on KVM, brings in virtio-sound and puts both riscv64 and aarch64 virt under the qtest accelerator.

For M6: the virt board now runs on KVM on Arm Linux hosts (#244) with -accel kvm, -enable-kvm and -machine accel=kvm and QEMU's errors (#248). The VM's IPA space is sized from KVM_CAP_ARM_VM_IPA_SIZE and the memory map follows it (#249, #255). Arm KVM guests get a steal time record per vCPU (#257), and -cpu host gets SVE and pointer authentication when the host has them (#258). None of the Arm KVM work has run on an Arm host with /dev/kvm yet, which #227 tracks. virtio-sound is in on q35 (#246), and in a Linux guest its playback into the wav backend matched QEMU 11.1 byte for byte. riscv64 virt (#251) and aarch64 virt (#256) now run under the qtest accelerator, and riscv64 virt takes the aclint property (#253). -nic none and -net none are accepted (#259), and the firmware and kernel load errors on x86 read as QEMU's do (#250). ruvm builds and passes clippy on macOS and Windows again, and tests that wait on a guest now time out instead of hanging (#254). The root tap test accepts EIO from a tap that is down (#247).

For M7: mremap of part of a merged mapping and failed host moves now behave as on Linux (#245).

What's Changed

  • machine-arm: run the virt board on KVM by @tamnd in #244
  • linux-user: mremap of part of a merged mapping and failed host moves by @tamnd in #245
  • hw-audio: add virtio-sound by @tamnd in #246
  • net: accept EIO from a tap that is down in the root test by @tamnd in #247
  • system: -accel kvm for the virt board on Arm hosts by @tamnd in #248
  • system: lay the virt memory map out for a 40-bit IPA under KVM by @tamnd in #249
  • machine-x86: print the firmware and kernel load errors as QEMU does by @tamnd in #250
  • system: run riscv64 virt under the qtest accelerator by @tamnd in #251
  • machine-riscv: add the aclint property to virt by @tamnd in #253
  • net, cli: build on macOS and Windows again and stop tests that hang by @tamnd in #254
  • machine-arm: size the Arm KVM VM's IPA space from KVM_CAP_ARM_VM_IPA_SIZE by @tamnd in #255
  • system: run aarch64 virt under the qtest accelerator by @tamnd in #256
  • machine-arm: give Arm KVM guests a steal time record per vCPU by @tamnd in #257
  • machine-arm: SVE and pointer authentication for -cpu host under KVM by @tamnd in #258
  • system: accept -nic none and -net none by @tamnd in #259
  • Release 0.5.6 by @tamnd in #260

Full Changelog: v0.5.5...v0.5.6

ruvm 0.5.5

Choose a tag to compare

@tamnd tamnd released this 10 Oct 03:58
v0.5.5
799b72f

This patch brings the riscv64 guest to user mode for M7, and for M6 adds Arm KVM, the emulated GICv2, the macOS, Windows and PipeWire audio backends and a large step in the qtest work.

For M7: qemu-riscv64 runs riscv64 Linux programs on an x86_64 host (#228). On QEMU's tests/tcg riscv64 linux-user programs it passes 26 of 34, against 31 of 34 for qemu-riscv64 8.2.2. The 128-bit atomic loads and stores are now inlined as one vector access in the x86_64 backend (#238).

For M6: KVM builds on AArch64 Linux with the in-kernel vGIC (#226), plus Arm vCPU setup, ONE_REG sync, the virtual timer and cpreg migration (#232). The emulated GICv2 and the GICv2m MSI frame are in (#236), and arm virt takes gic-version=2 (#241). The pipewire (#229), coreaudio (#233) and dsound (#235) audiodevs are in behind their features. Like HVF and WHPX, the Arm KVM, coreaudio and dsound pieces are cross checked only until we have the hardware to run them on, which #227 tracks. On the qtest side, human-monitor-command gives QEMU's text replies (#231), -netdev works on machine none with HMP info network (#234), the stream netdev sends the connect and disconnect events (#239) and takes Linux abstract socket names (#242). docs/qtest-status.md now records the aarch64 and riscv64 qtest and tests/tcg results against QEMU (#230, #240). On aarch64 and riscv64, ruvm now passes 47 of the qtest programs, against 447 and 241 for QEMU, and the main gap left is virt under the qtest accelerator. Clippy is clean on macOS and Windows again and cargo deny accepts target-lexicon (#237).

ruvm 0.5.4

Choose a tag to compare

@tamnd tamnd released this 10 Oct 01:29
v0.5.4
3504690

This patch adds the aarch64 guest to user mode for M7, and for M6 brings in the virtio input devices, the first host audio backends, the HVF and WHPX accelerators and the start of the qtest work.

For M7: qemu-aarch64 runs static and dynamic aarch64 Linux programs on an x86_64 host (#216), with the rt_sigframe and its FPSIMD, ESR and SVE records, AT_HWCAP and AT_HWCAP2 from the ID registers, and the generic syscall table mapped onto the host's. Counting online CPUs no longer needs unsafe (#218).

For M6: virtio-keyboard, virtio-mouse, virtio-tablet and virtio-multitouch are in on q35, arm virt and microvm (#217). In an Alpine guest on q35 the PCI ids, the capability bitmaps and every input event the guest read match QEMU 11.1. The alsa audiodev is in behind audio-alsa (#215) and the pa audiodev behind audio-pa (#220), both with QEMU's buffer defaults and error messages. The Hypervisor.framework accelerator for Apple silicon (#221) and the Windows Hypervisor Platform accelerator (#223) are ported. Neither has run on real hardware yet, because we have no macOS or Windows build host, so they are only cross checked and unit tested for now. QEMU's qmp-cmd-test now gets through every query on machine none for aarch64 and riscv64, with query-command-line-options, query-memdev, query-kvm, query-target and the other queries it runs answered the way QEMU does (#222, #224). A stale note in virtio-gpu is gone (#219).

What's Changed

  • audio: alsa audiodev behind the audio-alsa feature by @tamnd in #215
  • linux-user: aarch64 guest by @tamnd in #216
  • hw-input: virtio keyboard, mouse, tablet and multitouch by @tamnd in #217
  • linux-user: count online CPUs without unsafe by @tamnd in #218
  • hw-display: drop the stale virtio-gpu-device config notifier note by @tamnd in #219
  • audio: pa audiodev behind the audio-pa feature by @tamnd in #220
  • accel-hvf: port the Hypervisor.framework accelerator by @tamnd in #221
  • system: answer the queries qmp-cmd-test runs on machine none by @tamnd in #222
  • accel-whpx: port the Windows Hypervisor Platform accelerator by @tamnd in #223
  • system: answer query-command-line-options and the other queries left in qmp-cmd-test by @tamnd in #224
  • Release 0.5.4 by @tamnd in #225

Full Changelog: v0.5.3...v0.5.4

ruvm 0.5.3

Choose a tag to compare

@tamnd tamnd released this 09 Oct 23:01
v0.5.3
0b8401c

This patch finishes threads and /proc for M7 and brings in two more sound cards and two more displays for M6.

For M7: qemu-x86_64 now runs threaded programs (#207). clone with CLONE_VM gives each guest thread its own vCPU and host thread, with set_tid_address, the futex wake on thread exit and exit against exit_group as in QEMU, and mmap and brk flush the other threads' TLBs. /proc/self/maps, smaps, stat, auxv and cmdline are written the way QEMU writes them (#209), and shared anonymous memory stays shared across fork (#211). A pthread test, coreutils sort --parallel with up to 8 threads and the /proc test all match QEMU 11.1's qemu-x86_64. Guest code is still about 3 times slower than QEMU here because user mode goes through the softmmu TLB, and a direct guest memory path is planned.

For M6: the PC speaker plays through -machine pcspk-audiodev= (#208), and the Sound Blaster 16 is in with -device sb16 and -audio model=sb16, together with the two i8257 DMA controllers (#212). -display dbus is in behind the ui-dbus cargo feature over zbus (#210), and -display cocoa behind ui-cocoa over the objc2 crates (#213). The Cocoa display has only been cross checked for aarch64-apple-darwin from Linux and has not run on a Mac yet.

What's Changed

  • linux-user: guest threads for x86_64 by @tamnd in #207
  • hw-audio: PC speaker sound with -machine pcspk-audiodev by @tamnd in #208
  • linux-user: /proc/self emulation for x86_64 guests by @tamnd in #209
  • ui: -display dbus behind the ui-dbus feature by @tamnd in #210
  • user-common: shared anonymous memory stays shared across fork by @tamnd in #211
  • hw-audio: Sound Blaster 16 and the i8257 DMA controllers by @tamnd in #212
  • ui: -display cocoa behind the ui-cocoa feature by @tamnd in #213
  • Release 0.5.3 by @tamnd in #214

Full Changelog: v0.5.2...v0.5.3

ruvm 0.5.2

Choose a tag to compare

@tamnd tamnd released this 09 Oct 20:12
v0.5.2
bfce05c

This patch is mostly M6, with the first sound cards and two local display windows, plus signal delivery for M7.

For M6: AC97 is in with -device AC97 and -audio model=ac97 (#201), and so is Intel HD Audio as intel-hda and ich9-intel-hda with the hda-duplex, hda-output and hda-micro codecs and -audio model=hda (#204). A small guest that drives the HDA controller and plays a fixed PCM gives the same serial output and a byte for byte identical wav file under ruvm and QEMU 11.1, across 19 setups covering every codec, five stream formats, resampling, ich9 and MSI. 8 bit streams are left out of that check because QEMU's own output changes from run to run there. The audio backends now run on the machine's virtual clock and stop with the VM. -display sdl is in behind the ui-sdl cargo feature (#202), and -display gtk on GTK 4 behind ui-gtk (#205). Under Xvfb the window shows the same pixels as a QMP screendump, the captions and window sizes follow QEMU's, and keys, pointer moves, clicks, the wheel and the hotkeys reach the guest as the same bytes QEMU gives it. GTK 4 can't grab or warp the pointer, and there is no GL, VTE console or clipboard yet.

For M7: qemu-x86_64 now delivers signals the way QEMU's linux-user does (#203), with the kernel's rt_sigframe and the FXSAVE or XSAVE image, rt_sigreturn, sigaltstack, signalfd, the rt_sig* calls, and QEMU's safe_syscall so a signal that arrives right before a blocking call is never slept through. CPU faults turn into SIGSEGV, SIGBUS, SIGFPE, SIGILL and SIGTRAP with QEMU's si_code and address. Threads and the /proc emulation are next.

What's Changed

  • hw-audio: AC97 with -device AC97 and -audio model=ac97 by @tamnd in #201
  • ui: -display sdl behind the ui-sdl feature by @tamnd in #202
  • linux-user: signal delivery for x86_64 guests by @tamnd in #203
  • audio: Intel HD Audio and the hda codecs by @tamnd in #204
  • ui: -display gtk behind the ui-gtk feature by @tamnd in #205
  • Release 0.5.2 by @tamnd in #206

Full Changelog: v0.5.1...v0.5.2

ruvm 0.5.1

Choose a tag to compare

@tamnd tamnd released this 09 Oct 18:42
v0.5.1
5732630

This patch starts M7 with a working qemu-x86_64, and moves M6 along with virtio-gpu, a VNC server, the input layer and the audio core.

For M7: qemu-x86_64 now runs static and dynamic x86_64 Linux programs on an x86_64 Linux host, with the ELF loader, the guest address space and mmap engine from QEMU's mmap.c, the cpu loop and the common syscalls (#197). On 46 programs, including static and dynamic hello, about 30 busybox applets with sh doing fork, exec and pipes, coreutils, dash and the segfault, abort and ud2 crash paths, stdout, stderr and the exit status match QEMU 11.1's qemu-x86_64. Signal handlers are recorded but not run yet, threads are refused, there is no vDSO, and -g, -strace and the other guest debug options are refused with a message.

For M6: there is virtio-gpu 2D as virtio-gpu-pci and virtio-gpu-device, and a VNC server with -vnc, -display vnc=, RFB 3.3 to 3.8, VNC auth and the raw, hextile, zlib and tight encodings (#196). On x86, 30 of 30 virtio-gpu screendumps and 112 of 112 VNC frames are byte for byte the same as QEMU's. The input layer from ui/input.c is in, with send-key, input-send-event, query-mice and -k, and the PS/2 keyboard and mouse and the VNC server are wired into it (#199). All 38 input checks against QEMU, over QMP and two VNC clients, match on the serial bytes the guest saw and every byte the clients got. The audio core from QEMU's audio/ is in with the mixing engine and resampler, -audiodev and -audio, query-audiodevs and the none and wav backends (#198). There are no sound cards yet, those come next.

ruvm 0.5.0

Choose a tag to compare

@tamnd tamnd released this 09 Oct 16:10
v0.5.0
55e4b4c

This release closes M5, migration interop. Live migration between ruvm and QEMU 11.1 now works in both directions on q35 and microvm at machine versions 10.2, 11.0 and 11.1, with a memory dirtying guest and an I/O guest, and the guest's checksummed state checks out after every hop. That is all 16 runs of the matrix.

For M5: the last failures in that matrix were not in virtio-net as they first looked. ruvm's TCG TSC counted host nanoseconds where QEMU counts host TSC ticks, so a guest that calibrated its TSC on QEMU ran at about a third of its speed once it came back to ruvm. The TSC now counts host ticks, stops while the guest is stopped and carries its value across migration as QEMU's does (#192). Loading RAM on the destination is much faster, since pages are read, written and checked for zero a word at a time and guest RAM uses transparent huge pages as on QEMU (#193). The pause for an idle 1 GiB guest from QEMU to ruvm went from 929 ms to 73 ms on the same host, against 4 ms for QEMU to QEMU, and docs/migration-performance.md records downtime and total time for every direction (#191). QEMU's tests/functional/test_migration.py passes 3 of 3 against ruvm, and the broader migration-test --full qtest passes 40 of 64 (#190). The rest of that one needs postcopy blocktime, COLO, zstd, x-ignore-shared and guest suspend, which are not in yet. #190 also fixes a hang in migration cancel, adds switchover-ack, and makes fd: and /dev/fdset/N channels work with getfd and add-fd. -accel kvm,dirty-ring-size= now harvests the dirty ring the way QEMU does (#189). That code has only run in unit tests because none of our hosts has /dev/kvm, and running it on a real KVM host is tracked in #194.

For M6: the first display slice is in, with the ui console, QMP screendump in ppm and png, the standard VGA, bochs-display and ramfb on q35 and arm virt (#188). 51 screendumps taken under QEMU and ruvm with the same guests are identical pixel for pixel.

What's Changed

  • ui, hw-display: console, screendump, VGA, bochs-display and ramfb by @tamnd in #188
  • accel-kvm: harvest the KVM dirty ring by @tamnd in #189
  • migration: pass more of QEMU's migration tests by @tamnd in #190
  • docs: migration downtime and total time against QEMU by @tamnd in #191
  • machine-x86: count the TCG TSC in host ticks and stop it with the guest by @tamnd in #192
  • mem, migration: load RAM a word at a time and back it with huge pages by @tamnd in #193
  • Release 0.5.0 by @tamnd in #195

Full Changelog: v0.4.6...v0.5.0

ruvm 0.4.6

Choose a tag to compare

@tamnd tamnd released this 08 Oct 17:02
v0.4.6
39f4c7a

This patch is all M6 and finishes the Arm boards. arm virt gets ACPI and the SMMUv3, and there is a new sbsa-ref board.

For M6: arm virt builds QEMU's ACPI tables, so EDK2 can boot Linux from pflash with tables that are byte for byte the same as QEMU 11.1's, with acpi=, spcr=, x-oem-id and x-oem-table-id (#182). On the way this fixed a hang where EDK2 put a legacy virtio I/O BAR at port 0, which QEMU allows on virt and ruvm didn't. riscv virt needed the same fix (#183). arm virt also has the SMMUv3 with -M virt,iommu=smmuv3, with stage 1, stage 2 and nested walks, the command and event queues and the IOTLB, and PCI DMA and MSIs go through it as on QEMU (#184). The device tree and the IORT match QEMU's. The new -M sbsa-ref board ports hw/arm/sbsa-ref.c with its flashes, GICv3 and ITS, SMMUv3, PCIe, sysbus AHCI, PL061 GPIO with the power button, generic watchdog and sbsa-ec (#185). Trusted Firmware and EDK2 boot on it, and the serial log matches QEMU's line for line apart from the Tianocore banner. The GICv3 gains its virtual CPU interface and target-arm gains the PMUv3 registers, so arm virt now has a PMU node in its device tree like QEMU (#186). There is no xHCI, e1000e or bochs-display on sbsa-ref yet, and the default CPU is neoverse-n1 because neoverse-n2 isn't modelled.

ruvm 0.4.5

Choose a tag to compare

@tamnd tamnd released this 08 Oct 07:09
v0.4.5
1ae94e5

This patch brings in most of M5, the migration modes beyond plain precopy, and moves M6 along with a riscv64 host backend and the ITS on arm virt.

For M5: ruvm now does postcopy, multifd with no compression or zlib, XBZRLE, mapped-ram over the file channel with direct-io, savevm and loadvm to qcow2, background snapshots, and the cpr-reboot and cpr-transfer modes, all interoperating with QEMU 11.1 (#178, #179, #180). Every mode passed hops between QEMU and ruvm with a guest that checksums its memory, with no bad output. query-migrate reports downtime, expected-downtime and the byte counters the way QEMU does, -incoming takes JSON and keyval channels, and -machine memory-backend= works on x86. -accel kvm,dirty-ring-size= is accepted but ruvm doesn't collect from the ring yet. Postcopy recovery, zstd and the other multifd compressors, TLS and -loadvm are not in yet.

For M6: there is a riscv64 host backend for the JIT, covering RV64GC, Zba, Zbb, Zbs, Zicond and RVV (#173, #176). Under qemu-riscv64, a riscv virt guest and an x86 q35 guest both boot Linux to a shell on it. arm virt has the GICv3 ITS and LPIs, with msi-map on the PCIe node, the second redistributor region for more than 123 CPUs, and the msi= and its= options (#175). A Debian guest takes its virtio-pci interrupts through the ITS with the same numbers as on QEMU. On riscv virt, virtio-blk-pci now gets one queue per vCPU as on QEMU (#174).

Also, two files that the pinned rustfmt formats differently are now formatted (#177).

What's Changed

  • jit-riscv64: a riscv64 host backend for the JIT by @tamnd in #173
  • system: one virtio-blk-pci queue per vCPU on riscv virt by @tamnd in #174
  • hw-intc: the GICv3 ITS and LPIs, with msi-map on arm virt by @tamnd in #175
  • jit-riscv64: RVV codegen, and guests boot on a riscv64 host by @tamnd in #176
  • Format decode and softfloat with the pinned rustfmt by @tamnd in #177
  • sys, mem, hostmem: userfaultfd, direct I/O and shared RAM for migration by @tamnd in #178
  • block: snapshots across every drive, for savevm and loadvm by @tamnd in #179
  • migration: postcopy, multifd, XBZRLE, mapped-ram, snapshots and CPR by @tamnd in #180
  • Release 0.4.5 by @tamnd in #181

Full Changelog: v0.4.4...v0.4.5