| 7ee5875d | 19-Sep-2025 |
Paolo Bonzini <pbonzini@redhat.com> |
rust: migration: implement ToMigrationState as part of impl_vmstate_bitsized
This is most likely desirable, and is the easiest way to migrate a bit-sized value without peeking at the innards of the
rust: migration: implement ToMigrationState as part of impl_vmstate_bitsized
This is most likely desirable, and is the easiest way to migrate a bit-sized value without peeking at the innards of the bilge crate.
Reviewed-by: Zhao Liu <zhao1.liu@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
show more ...
|
| 44a9d1b8 | 15-Sep-2025 |
Paolo Bonzini <pbonzini@redhat.com> |
rust: migration: add high-level migration wrappers
Instead of dealing with pre/post callbacks, allow devices to implement a snapshot/restore mechanism; this has two main advantages:
- it can be eas
rust: migration: add high-level migration wrappers
Instead of dealing with pre/post callbacks, allow devices to implement a snapshot/restore mechanism; this has two main advantages:
- it can be easily implemented via procedural macros
- there can be generic implementations to deal with various kinds of interior-mutable containers, from BqlRefCell to Mutex, so that C code does not see Rust concepts such as Mutex<>.
Using it is easy; you can implement the snapshot/restore trait ToMigrationState and declare your state like:
regs: Migratable<Mutex<MyDeviceRegisters>>
Migratable<> allows dereferencing to the underlying object with no run-time cost.
Note that Migratable<> actually does not accept ToMigrationState, only the similar ToMigrationStateShared trait that the user will mostly not care about. This is required by the fact that pre/post callbacks take a &self, and ensures that the argument is a Mutex or BqlRefCell (including an array or Arc<> thereof).
Reviewed-by: Zhao Liu <zhao1.liu@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
show more ...
|
| 4526418a | 09-Oct-2025 |
Paolo Bonzini <pbonzini@redhat.com> |
rust: move VMState from bql to migration
The high-level wrapper Migratable<T> will contain a BqlCell, which would introduce a circular dependency betwen the bql and migration crates. Move the imple
rust: move VMState from bql to migration
The high-level wrapper Migratable<T> will contain a BqlCell, which would introduce a circular dependency betwen the bql and migration crates. Move the implementation of VMState for cells to "migration", together with the implementation for std types.
Reviewed-by: Zhao Liu <zhao1.liu@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
show more ...
|
| 8999ca00 | 17-Sep-2025 |
Paolo Bonzini <pbonzini@redhat.com> |
rust: migration: extract vmstate_fields_ref
This is useful when building a VMState for generic structs, because you have to avoid nested statics. Using vmstate_fields! will fail in the likely case
rust: migration: extract vmstate_fields_ref
This is useful when building a VMState for generic structs, because you have to avoid nested statics. Using vmstate_fields! will fail in the likely case where the _FIELDS static uses Self from an outer item, because that is forbidden.
The separate macros are needed because you cannot just do
.fields(vmstate_fields_ref! { vmstate_of!(PL011State, clock), })
The value returned by vmstate_fields_ref! is not promoted to static, which is unfortunate but intentional (https://github.com/rust-lang/rust/issues/60502):
error[E0716]: temporary value dropped while borrowed --> rust/hw/char/pl011/libpl011.rlib.p/structured/device.rs:743:17 | 738 | / VMStateDescriptionBuilder::<PL011State>::new() 739 | | .name(c"pl011/clock") 740 | | .version_id(1) 741 | | .minimum_version_id(1) 742 | | .needed(&PL011State::clock_needed) 743 | | .fields(vmstate_fields_ref! { | | _________________^ 744 | || vmstate_of!(PL011State, clock), 745 | || }) | ||_________^- argument requires that borrow lasts for `'static` | |_________| | creates a temporary value which is freed while still in use 746 | .build(); | - temporary value is freed at the end of this statement
Thus it is necessary to use the "static", whether explicitly or hidden by vmstate_fields.
Reviewed-by: Zhao Liu <zhao1.liu@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
show more ...
|
| 5b4fa978 | 25-Sep-2025 |
Paolo Bonzini <pbonzini@redhat.com> |
rust: migration: validate termination of subsection arrays
For consistency with fields(), validate the value (at least to some extent) before passing it to C.
Reviewed-by: Zhao Liu <zhao1.liu@intel
rust: migration: validate termination of subsection arrays
For consistency with fields(), validate the value (at least to some extent) before passing it to C.
Reviewed-by: Zhao Liu <zhao1.liu@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
show more ...
|
| 64bce66d | 25-Sep-2025 |
Paolo Bonzini <pbonzini@redhat.com> |
rust: migration: do not store raw pointers into VMStateSubsectionsWrapper
Raw pointers were used to insert a NULL one at the end of the array. However, Option<&...> has the same layout and does not
rust: migration: do not store raw pointers into VMStateSubsectionsWrapper
Raw pointers were used to insert a NULL one at the end of the array. However, Option<&...> has the same layout and does not remove Sync from the type of the array.
As an extra benefit, this enables validation of the terminator of the subsection array, because is_null() in const context would not be stable until Rust 1.84.
Reviewed-by: Zhao Liu <zhao1.liu@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
show more ...
|