On Fri, Jun 14, 2024 at 9:04 AM Manos Pitsidianakis <manos.pitsidiana...@linaro.org> wrote: > > On Thu, 13 Jun 2024 23:57, Paolo Bonzini <pbonz...@redhat.com> wrote: > >On Thu, Jun 13, 2024 at 11:16 AM Daniel P. Berrangé <berra...@redhat.com> > >wrote: > >> I guess there's a balance to be had somewhere on the spectrum between doing > >> everything against the raw C binding, vs everything against a perfectly > >> idiomatic Rust API wrapping the C bniding. The latter might be the ideal, > >> but from a pragmmatic POV I doubt we want the barrier to entry to be that > >> high. > > > >Yes, I agree. I guess we could make things work step by step, even > >committing something that only focuses on the build system like > >Manos's work (I'll review it). > > > >I can try to look at the basic QOM interface. > > > >Manos, can you create a page on the wiki? Something like > >https://wiki.qemu.org/Features/Meson. > > > Certainly! Just to make sure I understood correctly, you mean a wiki > page describing how things work and tracking the progress? > > I added https://wiki.qemu.org/Features/Meson/Rust
I moved it to https://wiki.qemu.org/Features/Rust/Meson :) and wrote https://wiki.qemu.org/Features/Rust/QOM. I got to the point where at least this compiles: qdev_define_type!(c"test-device", TestDevice); impl ObjectImpl for TestDevice {} impl DeviceImpl for TestDevice {} fn main() { let d = TestDevice::new(); d.cold_reset(); } Of course the code makes no sense but it's a start. One thing that would be very useful is to have an Error implementation. Looking at what Marc-André did for Error* (https://patchew.org/QEMU/20210907121943.3498701-1-marcandre.lur...@redhat.com/20210907121943.3498701-13-marcandre.lur...@redhat.com/), his precise implementation relies on his code to go back and forth between Rust representation, borrowed C object with Rust bindings and owned C object with Rust bindings. But I think we can at least have something like this: // qemu::Error pub struct Error { msg: String, /// Appends the print string of the error to the msg if not None cause: Option<Box<dyn std::error::Error>>, location: Option<(String, u32)> } impl std::error::Error for Error { ... } impl Error { ... fn into_c_error(self) -> *const bindings::Error { ... } } // qemu::Result<T> type Result<T> = Result<T, Error>; which can be implemented without too much code. This way any "bool f(..., Error *)" function (example: realize :)) could be implemented as returning qemu::Result<()>. Paolo