> +/// Use QEMU's event loops to run a Rust [`Future`] to completion and return > its result. > +/// > +/// This function must be called in coroutine context. If the future isn't > ready yet, it yields. > +pub fn qemu_co_run_future<F: Future>(future: F) -> F::Output { > + let waker = Waker::from(Arc::new(RunFutureWaker { > + co: unsafe { bindings::qemu_coroutine_self() }, > + })); > + let mut cx = Context::from_waker(&waker); > + > + let mut pinned_future = std::pin::pin!(future);
pin macro stabilized in v1.68.0, but currently the minimum rustc supported by QEMU is v1.63. I found there's a workaround [*], so we can add a temporary pin.rs in qemu_api until QEMU bumps up rustc to >= v1.68? [*]: https://github.com/rust-lang/rust/issues/93178#issuecomment-1386177439 > + loop { > + match pinned_future.as_mut().poll(&mut cx) { > + Poll::Ready(res) => return res, > + Poll::Pending => unsafe { > + bindings::qemu_coroutine_yield(); > + }, > + } > + } > +} > +