RustInQemu: Difference between revisions
(→TODO) |
(→TODO) |
||
Line 49: | Line 49: | ||
** [https://lore.kernel.org/qemu-devel/CAFEAcA9X5iBFMEw3dxsgBPZo7FBuNYp3dK5gf7v+cEyVa+pErA@mail.gmail.com/T/ support pl011-luminary] | ** [https://lore.kernel.org/qemu-devel/CAFEAcA9X5iBFMEw3dxsgBPZo7FBuNYp3dK5gf7v+cEyVa+pErA@mail.gmail.com/T/ support pl011-luminary] | ||
** migration | ** migration | ||
== To be posted == | |||
* qemu_irq (https://gitlab.com/bonzini/qemu/-/commit/b04e20648568f7b73de8af2bc5c6b0dadca3dbaf) | |||
* QOM (https://gitlab.com/bonzini/qemu/-/commits/rust-qom (defining QOM classes entirely without macros, QOM casts and reference counting) | |||
** also adds documentation for public APIs in qemu-api and qemu-api-macros | |||
== TODO == | == TODO == | ||
* Remove need for manual "meson subprojects update --reset" when updating packagefiles/ | * Remove need for manual "meson subprojects update --reset" when updating packagefiles/ | ||
Line 58: | Line 62: | ||
** Rustfmt checks? | ** Rustfmt checks? | ||
** Run nightly clippy | ** Run nightly clippy | ||
* | ** Rustdoc | ||
* | |||
* feature parity for pl011 | * feature parity for pl011 | ||
** check for new commits | ** check for new commits | ||
* bindings | * bindings | ||
** MemoryRegion (callbacks) | ** MemoryRegion (callbacks) | ||
** Chardev (callbacks, functions) | ** Chardev (callbacks, functions) | ||
** DMA (investigate vm-memory?) | ** DMA (investigate vm-memory?) | ||
* other experiments: https://github.com/bonzini/rust-qemu (Generic Rust<->C interop, Error) | |||
* other experiments: | ** safe object creation: use MaybeUninit in instance_init? (long-term investigate [https://docs.rs/pinned-init/ pinned_init crate, originating from Linux]) | ||
** https:// | |||
* more QOM procedural macros (currently <tt>#[derive(Object)]</tt>) | * more QOM procedural macros (currently <tt>#[derive(Object)]</tt>) | ||
** generate qdev properties? | ** generate qdev properties? |
Revision as of 11:14, 31 October 2024
For the old RustInQemu page, see RustInQemu/2022
Active efforts in 2024
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
1.59.0 has const CStr::from_bytes_with_nul_unchecked, not really possible to go below that.
Bindgen 0.60.x has --allowlist-file. Ubuntu 22.04 has 0.59.x which is a problem.
In the future 1.83.0 would allow nested offset_of.
Done
- only generate bindings.rs.inc once
- disabling the cast_ptr_alignment lint is too broad
- update bundled meson to 1.5.0
- add support for --rustc and RUSTC environment variables
- remove --no-include-path-detection from bindgen invocation
- rename subprojects to use Meson 1.5.0+ convention and add meson.override_dependency() call
- add support for cross compilation of Rust subprojects (native: true for deps of procedural macro crates)
- fix licenses for Rust subprojects
Posted
- Enable use of rustc 1.63.0
- fix cfgs for proc-macro2
- core::ffi (stable in 1.64.0)
- "if let" usage in bilge-impl needs to be patched out (stable in 1.65.0)
- std::sync::OnceLock (stable in 1.70.0)
- MaybeUninit::zeroed() (stable in 1.75.0 in const context)
- c"" literals (stable in 1.77.0)
- offset_of! (stable in 1.77.0)
- Enable use of older bindgen
- What to do about Ubuntu 22.04? Bindgen 0.59.x does not have --allowlist-file
- Install rustc/bindgen in all containers
- feature parity for pl011
- support pl011-luminary
- migration
To be posted
- qemu_irq (https://gitlab.com/bonzini/qemu/-/commit/b04e20648568f7b73de8af2bc5c6b0dadca3dbaf)
- QOM (https://gitlab.com/bonzini/qemu/-/commits/rust-qom (defining QOM classes entirely without macros, QOM casts and reference counting)
- also adds documentation for public APIs in qemu-api and qemu-api-macros
TODO
- Remove need for manual "meson subprojects update --reset" when updating packagefiles/
- Remove remaining uses of Cargo, or clean up. Either all this should be driven entirely by Meson (for example via compile_commands.json, similar to scripts/check_sparse.py), or it should use a Cargo workspace so that a single invocation of "cargo clippy" will handle all crates.
- Perform clippy checks ("ninja clippy"? Maybe "meson test --suite codecheck"?)
- Reformat code ("ninja rustfmt"? Maybe also include it in the same suite as clippy?)
- Generate documentation ("ninja rustdoc"? Maybe check how Linux runs doctests?)
- More CI
- Rustfmt checks?
- Run nightly clippy
- Rustdoc
- 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?
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/i8254.c
(claimed, WIP)- needs timer bindgings
hw/mem/nvdimm.c
(suggested by Manos)