@@ -933,7 +933,11 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
}
if (qdev_get_vmsd(dev)) {
- vmstate_register_with_alias_id(dev, -1, qdev_get_vmsd(dev), dev,
+ int instance_id = DEVICE_GET_CLASS(dev)->dev_get_instance_id
+ ? DEVICE_GET_CLASS(dev)->dev_get_instance_id(dev)
+ : -1;
+
+ vmstate_register_with_alias_id(dev, instance_id, qdev_get_vmsd(dev), dev,
dev->instance_id_alias,
dev->alias_required_for_version);
}
@@ -139,6 +139,12 @@ typedef struct DeviceClass {
qdev_initfn init; /* TODO remove, once users are converted to realize */
qdev_event exit; /* TODO remove, once users are converted to unrealize */
const char *bus_type;
+
+ /* When this field is set, qemu will use it to get an unique instance_id
+ * instead of calculating an auto idstr and instanc_id for the relevant
+ * SaveStateEntry
+ */
+ int (*dev_get_instance_id)(DeviceState *dev);
} DeviceClass;
typedef struct NamedGPIOList NamedGPIOList;
@@ -556,7 +556,7 @@ int register_savevm_live(DeviceState *dev,
se->is_ram = 1;
}
- if (dev) {
+ if (dev && instance_id == -1) {
char *id = qdev_get_dev_path(dev);
if (id) {
pstrcpy(se->idstr, sizeof(se->idstr), id);
@@ -640,7 +640,7 @@ int vmstate_register_with_alias_id(DeviceState *dev, int instance_id,
se->vmsd = vmsd;
se->alias_id = alias_id;
- if (dev) {
+ if (dev && instance_id == -1) {
char *id = qdev_get_dev_path(dev);
if (id) {
pstrcpy(se->idstr, sizeof(se->idstr), id);