typedef struct VMStateInfo VMStateInfo;
typedef struct VMStateField VMStateField;
-/* VMStateInfo allows customized migration of objects that don't fit in
+/*
+ * VMStateInfo allows customized migration of objects that don't fit in
* any category in VMStateFlags. Additional information is always passed
- * into get and put in terms of field and vmdesc parameters. However
+ * into load and save in terms of field and vmdesc parameters. However
* these two parameters should only be used in cases when customized
* handling is needed, such as QTAILQ. For primitive data types such as
- * integer, field and vmdesc parameters should be ignored inside get/put.
+ * integer, field and vmdesc parameters should be ignored inside load/save.
+ *
+ * @get and @put are deprecated copies of @load and @save. For new interfaces
+ * use @load and @save.
*/
struct VMStateInfo {
const char *name;
int coroutine_mixed_fn (*put)(QEMUFile *f, void *pv, size_t size,
const VMStateField *field,
JSONWriter *vmdesc);
+ bool coroutine_mixed_fn (*load)(QEMUFile *f, void *pv, size_t size,
+ const VMStateField *field,
+ Error **errp);
+ bool coroutine_mixed_fn (*save)(QEMUFile *f, void *pv, size_t size,
+ const VMStateField *field,
+ JSONWriter *vmdesc,
+ Error **errp);
};
enum VMStateFlags {
} else if (field->flags & VMS_VSTRUCT) {
return vmstate_load_state(f, field->vmsd, pv, field->struct_version_id,
errp) >= 0;
+ } else if (field->info->load) {
+ return field->info->load(f, pv, size, field, errp);
}
if (field->info->get(f, pv, size, field) < 0) {
return vmstate_save_state_v(f, field->vmsd, pv, vmdesc,
field->struct_version_id,
errp) >= 0;
+ } else if (field->info->save) {
+ return field->info->save(f, pv, size, field, vmdesc, errp);
}
if (field->info->put(f, pv, size, field, vmdesc) < 0) {