|
@@ -33,6 +33,7 @@ typedef struct QEMUResetEntry {
|
|
QTAILQ_ENTRY(QEMUResetEntry) entry;
|
|
QTAILQ_ENTRY(QEMUResetEntry) entry;
|
|
QEMUResetHandler *func;
|
|
QEMUResetHandler *func;
|
|
void *opaque;
|
|
void *opaque;
|
|
|
|
+ bool skip_on_snapshot_load;
|
|
} QEMUResetEntry;
|
|
} QEMUResetEntry;
|
|
|
|
|
|
static QTAILQ_HEAD(, QEMUResetEntry) reset_handlers =
|
|
static QTAILQ_HEAD(, QEMUResetEntry) reset_handlers =
|
|
@@ -47,6 +48,16 @@ void qemu_register_reset(QEMUResetHandler *func, void *opaque)
|
|
QTAILQ_INSERT_TAIL(&reset_handlers, re, entry);
|
|
QTAILQ_INSERT_TAIL(&reset_handlers, re, entry);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void qemu_register_reset_nosnapshotload(QEMUResetHandler *func, void *opaque)
|
|
|
|
+{
|
|
|
|
+ QEMUResetEntry *re = g_new0(QEMUResetEntry, 1);
|
|
|
|
+
|
|
|
|
+ re->func = func;
|
|
|
|
+ re->opaque = opaque;
|
|
|
|
+ re->skip_on_snapshot_load = true;
|
|
|
|
+ QTAILQ_INSERT_TAIL(&reset_handlers, re, entry);
|
|
|
|
+}
|
|
|
|
+
|
|
void qemu_unregister_reset(QEMUResetHandler *func, void *opaque)
|
|
void qemu_unregister_reset(QEMUResetHandler *func, void *opaque)
|
|
{
|
|
{
|
|
QEMUResetEntry *re;
|
|
QEMUResetEntry *re;
|
|
@@ -60,12 +71,16 @@ void qemu_unregister_reset(QEMUResetHandler *func, void *opaque)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-void qemu_devices_reset(void)
|
|
|
|
|
|
+void qemu_devices_reset(ShutdownCause reason)
|
|
{
|
|
{
|
|
QEMUResetEntry *re, *nre;
|
|
QEMUResetEntry *re, *nre;
|
|
|
|
|
|
/* reset all devices */
|
|
/* reset all devices */
|
|
QTAILQ_FOREACH_SAFE(re, &reset_handlers, entry, nre) {
|
|
QTAILQ_FOREACH_SAFE(re, &reset_handlers, entry, nre) {
|
|
|
|
+ if (reason == SHUTDOWN_CAUSE_SNAPSHOT_LOAD &&
|
|
|
|
+ re->skip_on_snapshot_load) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
re->func(re->opaque);
|
|
re->func(re->opaque);
|
|
}
|
|
}
|
|
}
|
|
}
|