Hi Paolo,
> /// # use std::sync::Mutex;
> -/// # use migration::Migratable;
> +/// # use migration::{Migratable, ToMigrationState, VMState, VMStateField};
> ///
> +/// #[derive(ToMigrationState)]
> /// pub struct DeviceRegs {
> /// status: u32,
> /// }
> +/// # unsafe impl VMState for DeviceRegsMigration {
> +/// # const BASE: VMStateField = ::common::Zeroable::ZERO;
> +/// # }
did you miss something like the following?
diff --git a/rust/qemu-macros/src/migration_state.rs
b/rust/qemu-macros/src/migration_state.rs
index 5edf0efe687f..2064bb73a6f0 100644
--- a/rust/qemu-macros/src/migration_state.rs
+++ b/rust/qemu-macros/src/migration_state.rs
@@ -236,6 +236,16 @@ pub struct #name {
}
}
+ fn generate_vmstate_impl(&self) -> TokenStream {
+ let name = self.migration_state_name();
+
+ quote! {
+ unsafe impl ::migration::VMState for #name {
+ const BASE: ::migration::VMStateField =
::common::Zeroable::ZERO;
+ }
+ }
+ }
+
fn generate_snapshot_migration_state(&self) -> TokenStream {
let fields = self
.fields
@@ -275,12 +285,15 @@ fn generate(&self) -> TokenStream {
let (impl_generics, ty_generics, where_clause) =
generics.split_for_impl();
let name = self.migration_state_name();
let migration_state_struct = self.generate_migration_state_struct();
+ let vmstate_impl = self.generate_vmstate_impl();
let snapshot_impl = self.generate_snapshot_migration_state();
let restore_impl = self.generate_restore_migrated_state();
quote! {
#migration_state_struct
+ #vmstate_impl
+
impl #impl_generics ToMigrationState for #struct_name #ty_generics
#where_clause {
type Migrated = #name;