RustInQemu: Difference between revisions
(→Paolo) |
|||
(34 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
For the old RustInQemu page, see [[RustInQemu/2022]] | For the old RustInQemu page, see [[RustInQemu/2022]] | ||
== Active | == Active effort == | ||
* | * [[ChangeLog/10.0#Rust|Current state]] | ||
* | * [https://www.qemu.org/docs/master/devel/rust.html Documentation] | ||
* Roadmap: [https://lore.kernel.org/all/cc40943e-dec1-4890-a1d9-579350ce296f@pbonzini.local/ November 2024] | [https://lore.kernel.org/qemu-devel/17ad81c3-98fc-44c2-8f65-f5e2cc07030b@gnu.org/ January 2025] | |||
<!-- | |||
* <code>Subject: [RFC 0/6] scripts: Rewrite simpletrace printer in Rust</code><br /><code>Date: Mon, 27 May 2024 16:14:15 +0800</code><br />[https://lore.kernel.org/qemu-devel/20240527081421.2258624-1-zhao1.liu@intel.com/ RFC v1] | |||
--> | |||
== Past efforts == | == Past efforts == | ||
Line 16: | Line 16: | ||
* <code>[RFC v3 00/32] Rust binding for QAPI and qemu-ga QMP handler examples</code><br />[https://patchew.org/QEMU/20210907121943.3498701-1-marcandre.lureau@redhat.com/ on patchew] [https://lore.kernel.org/qemu-devel/20210907121943.3498701-1-marcandre.lureau@redhat.com/ on lore] | * <code>[RFC v3 00/32] Rust binding for QAPI and qemu-ga QMP handler examples</code><br />[https://patchew.org/QEMU/20210907121943.3498701-1-marcandre.lureau@redhat.com/ on patchew] [https://lore.kernel.org/qemu-devel/20210907121943.3498701-1-marcandre.lureau@redhat.com/ on lore] | ||
== Work in progress == | == Work in progress == | ||
=== Paolo === | === Paolo === | ||
* | * Posted: Opaque<> (to split crates and also first step for annotated pinning) | ||
* Planned: chardev | |||
** | * Later: pinned_init... maybe use MaybeUninit as a first step? | ||
* Upstream Meson | * Upstream Meson: "objects:", rustdoc, <tt>-C prefer-dynamic</tt> | ||
=== Manos === | === Manos === | ||
* Documentation | * Documentation | ||
=== | === Zhao === | ||
* HPET live migration. | |||
=== Kevin === | |||
* Executing async code, block driver implementations | |||
** https://lore.kernel.org/qemu-devel/20250211214328.640374-1-kwolf@redhat.com/ | |||
== TODO == | == TODO == | ||
=== Bugs === | |||
* Integration tests are linked with libqemuutil as link_whole, which does not work when modules are enabled | |||
** [https://github.com/mesonbuild/meson/pull/14031 meson seems to be buggy and does not allow using link_with instead?] | |||
** probably best to require meson 1.8.0 anyway as it has nicer integration with clippy, and possibly rustdoc | |||
* Add BQL abstraction for tests - avoid running them with "--test-threads 1" | |||
* [https://github.com/mesonbuild/meson/issues/8828 Distros would prefer to link libstd dynamically]; Rust-enabled QEMU binaries are huge | |||
=== Nice things to have === | |||
* [https://github.com/mesonbuild/meson/pull/13933 run doctests with meson test] | |||
* Remove need for manual "meson subprojects update --reset" when updating packagefiles/ | * Remove need for manual "meson subprojects update --reset" when updating packagefiles/ | ||
* Improve tool integration | * Improve tool integration | ||
Line 83: | Line 48: | ||
* rustfmt currently requires nightly, decide what to do about it | * rustfmt currently requires nightly, decide what to do about it | ||
* Place rustdoc output for master somewhere? | * Place rustdoc output for master somewhere? | ||
* split qemu_api into multiple crates | |||
* more QOM procedural macros | |||
** generate qdev properties | |||
** generate parts of TypeInfo? | |||
** monomorphization of <tt>T: IsA<Class></tt> to <tt>&T</tt> (like the momo crate) | |||
* distros need dynamically linked libstd | |||
** rewrite all main()s in Rust and use [https://github.com/mesonbuild/meson/issues/14224 -C prefer-dynamic]? | |||
** or should Meson be able to link C programs with rlibs? | |||
=== New code to write=== | |||
* feature parity for pl011 | * feature parity for pl011 | ||
* safe object creation with [https://docs.rs/pinned-init/ pinned_init, originating from Linux]) | |||
* complete vmstate bindings | |||
* Generic Rust<->C interop, Error (https://github.com/bonzini/rust-qemu) | |||
* DMA (investigate vm-memory?) | |||
* Trace/log | |||
* | |||
* | |||
* | |||
== Ideas for lints without breaking CI == | == Ideas for lints without breaking CI == | ||
Line 106: | Line 75: | ||
=== Miscellanea === | === Miscellanea === | ||
* <code>qemu-bridge-helper.c</code> Re-write SUID C executable with useful features. | |||
=== Bindings === | |||
* visitors/QOM properties, could be interesting for <code>hw/sensor/tmp105.c</code>... | |||
=== Devices === | === Devices === | ||
Line 113: | Line 85: | ||
** needs block bindings | ** needs block bindings | ||
* <code>hw/timer/i8254.c</code> (claimed, WIP) | * <code>hw/timer/i8254.c</code> (claimed, WIP) | ||
* <code>hw/mem/nvdimm.c</code> (suggested by [[User:Manos|Manos]]) | * <code>hw/mem/nvdimm.c</code> (suggested by [[User:Manos|Manos]]) | ||
[[Category:RustInQemu]] | [[Category:RustInQemu]] |
Latest revision as of 14:12, 27 February 2025
For the old RustInQemu page, see RustInQemu/2022
Active effort
- Current state
- Documentation
- Roadmap: November 2024 | January 2025
Past efforts
[RFC v3 00/32] Rust binding for QAPI and qemu-ga QMP handler examples
on patchew on lore
Work in progress
Paolo
- Posted: Opaque<> (to split crates and also first step for annotated pinning)
- Planned: chardev
- Later: pinned_init... maybe use MaybeUninit as a first step?
- Upstream Meson: "objects:", rustdoc, -C prefer-dynamic
Manos
- Documentation
Zhao
- HPET live migration.
Kevin
- Executing async code, block driver implementations
TODO
Bugs
- Integration tests are linked with libqemuutil as link_whole, which does not work when modules are enabled
- meson seems to be buggy and does not allow using link_with instead?
- probably best to require meson 1.8.0 anyway as it has nicer integration with clippy, and possibly rustdoc
- Add BQL abstraction for tests - avoid running them with "--test-threads 1"
- Distros would prefer to link libstd dynamically; Rust-enabled QEMU binaries are huge
Nice things to have
- run doctests with meson test
- 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?
- split qemu_api into multiple crates
- more QOM procedural macros
- generate qdev properties
- generate parts of TypeInfo?
- monomorphization of T: IsA<Class> to &T (like the momo crate)
- distros need dynamically linked libstd
- rewrite all main()s in Rust and use -C prefer-dynamic?
- or should Meson be able to link C programs with rlibs?
New code to write
- feature parity for pl011
- safe object creation with pinned_init, originating from Linux)
- complete vmstate bindings
- Generic Rust<->C interop, Error (https://github.com/bonzini/rust-qemu)
- DMA (investigate vm-memory?)
- Trace/log
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.
Bindings
- visitors/QOM properties, could be interesting for
hw/sensor/tmp105.c
...
Devices
hw/block/pflash_cfi01.c
,hw/block/pflash_cfi02.c
(claimed, WIP)- needs block bindings
hw/timer/i8254.c
(claimed, WIP)hw/mem/nvdimm.c
(suggested by Manos)