RustInQemu: Difference between revisions
(Update the hpet device status) |
No edit summary |
||
(12 intermediate revisions by the same user 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 == | ||
* [Current state|ChangeLog/9.2#Rust] | |||
* [https://lore.kernel.org/all/cc40943e-dec1-4890-a1d9-579350ce296f@pbonzini.local/ December 2024 Roadmap] | |||
<!-- | |||
* <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] | * <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] | ||
* ARM PL011 UART device model in Rust<br /><code>Subject: [RFC PATCH v1 0/6] Implement ARM PL011 in Rust</code><br /><code>Date: Mon, 10 Jun 2024 21:22:35 +0300</code><br />[https://lore.kernel.org/qemu-devel/cover.rust-pl011-rfc-v1.git.manos.pitsidianakis@linaro.org/ RFC v1] [https://lore.kernel.org/qemu-devel/rust-pl011-rfc-v6.git.manos.pitsidianakis@linaro.org/ v6] | * ARM PL011 UART device model in Rust<br /><code>Subject: [RFC PATCH v1 0/6] Implement ARM PL011 in Rust</code><br /><code>Date: Mon, 10 Jun 2024 21:22:35 +0300</code><br />[https://lore.kernel.org/qemu-devel/cover.rust-pl011-rfc-v1.git.manos.pitsidianakis@linaro.org/ RFC v1] [https://lore.kernel.org/qemu-devel/rust-pl011-rfc-v6.git.manos.pitsidianakis@linaro.org/ v6] | ||
Line 11: | Line 14: | ||
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. | 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 == | == Past efforts == | ||
Line 17: | Line 21: | ||
== Minimum supported versions == | == Minimum supported versions == | ||
1.59.0 has const <tt>CStr::from_bytes_with_nul_unchecked</tt>, not really possible to go below that. | Required versions: | ||
* 1.59.0 has const <tt>CStr::from_bytes_with_nul_unchecked</tt>, 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. Ubuntu 22.04 has 0.59.x | Bindgen 0.60.x has --allowlist-file. Of the supported distributions only Ubuntu 22.04 has an older version (0.59.x). | ||
== Work in progress == | == Work in progress == | ||
=== Paolo === | === Paolo === | ||
* | * In progress: interior mutability for PL011 | ||
* | * Planned: errno, chardev, pinned_init, vmstate, MemoryRegion | ||
* Upstream Meson support for clippy, rustfmt, rustdoc | * Upstream Meson support for clippy, rustfmt, rustdoc | ||
=== Manos === | === Manos === | ||
* Documentation | * Documentation | ||
=== Kevin === | === Kevin === | ||
* Executing async code | * Executing async code | ||
* Block driver implementations | * Block driver implementations | ||
== Work in progress == | == Work in progress == | ||
Line 82: | Line 47: | ||
== 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/14026 meson seems to be buggy and does not allow using link_with instead?] | |||
** probably best to require meson 1.7.0 anyway as it has nicer integration with clippy and rustfmt | |||
* Add BQL abstraction for tests - avoid running them with "--test-threads 1" | |||
* vmstate is not type safe | |||
=== 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 87: | Line 61: | ||
* 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? | ||
* more QOM procedural macros (currently <tt>#[derive(Object)]</tt>) | * more QOM procedural macros (currently <tt>#[derive(Object)]</tt>) | ||
** generate qdev properties? | ** generate qdev properties? | ||
** generate parts of TypeInfo? | ** generate parts of TypeInfo? | ||
* | |||
** | === New code to write=== | ||
* [https://docs.google.com/presentation/d/12quXHIUtnjEZy0fwR2Fuka7KDKwW94oyJqXHfOd6hfg/edit#slide=id.g313dc2156a5_0_5 Roadmap] | |||
** feature parity for pl011 | |||
** safe object creation with [https://docs.rs/pinned-init/ pinned_init, originating from Linux]) | |||
** bindings for MemoryRegion, Chardev | |||
** DMA (investigate vm-memory?) | |||
** https://github.com/bonzini/rust-qemu (Generic Rust<->C interop, Error) | |||
** Trace/log | |||
* HPET device | |||
** includes error/timer/gpio bindings. | |||
== Ideas for lints without breaking CI == | == Ideas for lints without breaking CI == |
Latest revision as of 00:01, 20 December 2024
For the old RustInQemu page, see RustInQemu/2022
Active effort
- [Current state|ChangeLog/9.2#Rust]
- December 2024 Roadmap
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).
Work in progress
Paolo
- In progress: 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
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.7.0 anyway as it has nicer integration with clippy and rustfmt
- Add BQL abstraction for tests - avoid running them with "--test-threads 1"
- vmstate is not type safe
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?
- more QOM procedural macros (currently #[derive(Object)])
- generate qdev properties?
- generate parts of TypeInfo?
New code to write
- Roadmap
- feature parity for pl011
- safe object creation with pinned_init, originating from Linux)
- bindings for MemoryRegion, Chardev
- DMA (investigate vm-memory?)
- https://github.com/bonzini/rust-qemu (Generic Rust<->C interop, Error)
- Trace/log
- HPET device
- includes error/timer/gpio 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)