RustInQemu: Difference between revisions
(→Paolo) |
|||
Line 40: | Line 40: | ||
* Posted: [https://gitlab.com/bonzini/qemu/-/commits/rust-next irq + QOM + callbacks + documentation for public APIs] | * Posted: [https://gitlab.com/bonzini/qemu/-/commits/rust-next irq + QOM + callbacks + documentation for public APIs] | ||
* In progress: bugfixes and interior mutability for PL011 | * In progress: bugfixes and interior mutability for PL011 | ||
* Planned: errno, chardev, pinned_init, vmstate | * Planned: errno, chardev, pinned_init, vmstate, MemoryRegion | ||
* Upstream Meson support for clippy, rustfmt, rustdoc | * Upstream Meson support for clippy, rustfmt, rustdoc | ||
Revision as of 12:45, 9 December 2024
For the old RustInQemu page, see RustInQemu/2022
Active effort
- [Current state|ChangeLog/9.2#Rust]
- December 2024 Roadmap
!--
Subject: [RFC 0/6] scripts: Rewrite simpletrace printer in Rust
Date: Mon, 27 May 2024 16:14:15 +0800
RFC v1- ARM PL011 UART device model in Rust
Subject: [RFC PATCH v1 0/6] Implement ARM PL011 in Rust
Date: Mon, 10 Jun 2024 21:22:35 +0300
RFC v1 v6- Meson and configure integration
- Bindings generation
After some discussion we decided to use rustc directly without going through cargo and each external crate becomes a Meson subproject. Meson 1.5.0+'s support for method = cargo is pretty good for host-compiled packages, but it doesn't work for dependencies of build-compiled packages (i.e. dependencies of procedural macros). This is tracked by https://github.com/mesonbuild/meson/issues/11121. Until then, meson.build files for procedural macros and their dependencies have to be written by hand. (Currently _all_ dependencies use hand-written meson.build).
While cargo would be fine as an interim solution, using Meson to compile the Rust code removes some moving parts. The extra cost of writing meson.build files for dependencies is expected to be small and will mostly happen upfront. -->
Past efforts
[RFC v3 00/32] Rust binding for QAPI and qemu-ga QMP handler examples
on patchew on lore
Minimum supported versions
Required versions:
- 1.59.0 has const CStr::from_bytes_with_nul_unchecked, not really possible to go below that. Of the supported distributions only Debian bullseye has an older version.
- 1.63.0 is available on Debian bookworm (though it also rustc-web, which is 1.70.0 on mips64el and 1.78.0 on all other platforms).
- 1.75.0 is available on Ubuntu 22.04 and 24.04. It can return "impl Trait" in traits. This is important when using the pinned_init crate in traits (e.g. to implement QOM instance_init).
- 1.83.0 will allow const_refs_statics and nested offset_of (useful to make vmstate type-safe).
Bindgen 0.60.x has --allowlist-file. Of the supported distributions only Ubuntu 22.04 has an older version (0.59.x).
Posted
- improved integration with cargo
- automatically generate rustc flags from Cargo.toml
- Perform clippy checks and reformat code ("ninja clippy", "ninja rustfmt") - TODO: rustfmt configuration currently requires nightly due to use of unstable features
- Rustfmt, clippy, rustdoc in CI
Work in progress
Paolo
- Posted: irq + QOM + callbacks + documentation for public APIs
- In progress: bugfixes and interior mutability for PL011
- Planned: errno, chardev, pinned_init, vmstate, MemoryRegion
- Upstream Meson support for clippy, rustfmt, rustdoc
Manos
- Documentation
Kevin
- Executing async code
- Block driver implementations
Work in progress
- hpet timer device
- timer/bitops/memattrs bindings
TODO
- Remove need for manual "meson subprojects update --reset" when updating packagefiles/
- Improve tool integration
- Run code checks a la "meson test --suite codecheck"? (clippy and rustfmt)
- rustfmt currently requires nightly, decide what to do about it
- Place rustdoc output for master somewhere?
- feature parity for pl011
- check for new commits
- bindings
- MemoryRegion (callbacks)
- Chardev (callbacks, functions)
- DMA (investigate vm-memory?)
- other experiments
- https://github.com/bonzini/rust-qemu (Generic Rust<->C interop, Error)
- safe object creation: use MaybeUninit in instance_init? (long-term investigate pinned_init crate, originating from Linux)
- more QOM procedural macros (currently #[derive(Object)])
- generate qdev properties?
- generate parts of TypeInfo?
- For hpet device
- need error/irq/trace bindings.
Ideas for lints without breaking CI
See https://github.com/bonzini/rust-qemu/commit/95b25f7c5f4e2694a85a5503050cc98da7562c7c
- run clippy as part of "make check", possibly only if Rust is newer than some version (1.74.0 so that clippy can be configured in Cargo.toml?)
- deny many individual lints, do not deny groups (complexity, perf, style, suspicious) on regular builds. allow unknown_lints.
- add to CI a fallible job that runs on nightly clippy with -Dclippy::complexity -Dclippy::perf -Dclippy::suspicious -Dclippy::style -Dunknown_lints. the job should generally pass, and if a new lint triggers it probably should be added to Cargo.toml as either "allow" (rare) or "deny" (possibly after adding #[allow()] to the source).
Possible project targets
Miscellanea
- qemu-bridge-helper.c
Re-write SUID C executable with useful features.
Devices
hw/block/pflash_cfi01.c
,hw/block/pflash_cfi02.c
(claimed, WIP)- needs block bindings
hw/timer/hpet.c, hw/timer/i8254.c
(claimed, WIP)- needs timer/memattrs/bitops/error/irq/trace bindgings
hw/mem/nvdimm.c
(suggested by Manos)