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;


Reply via email to