---
monitor.c | 6 ++++++
monitor.h | 2 ++
vl.c | 15 +++++++++++++++
3 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/monitor.c b/monitor.c
index aadbdcb..e6f5fad 100644
--- a/monitor.c
+++ b/monitor.c
@@ -485,6 +485,12 @@ void monitor_protocol_event(MonitorEvent event, QObject
*data)
case QEVENT_BLOCK_JOB_CANCELLED:
event_name = "BLOCK_JOB_CANCELLED";
break;
+ case QEVENT_SUSPEND:
+ event_name = "SUSPEND";
+ break;
+ case QEVENT_WAKEUP:
+ event_name = "WAKEUP";
+ break;
default:
abort();
break;
diff --git a/monitor.h b/monitor.h
index b72ea07..9df3bab 100644
--- a/monitor.h
+++ b/monitor.h
@@ -38,6 +38,8 @@ typedef enum MonitorEvent {
QEVENT_SPICE_DISCONNECTED,
QEVENT_BLOCK_JOB_COMPLETED,
QEVENT_BLOCK_JOB_CANCELLED,
+ QEVENT_SUSPEND,
+ QEVENT_WAKEUP,
QEVENT_MAX,
} MonitorEvent;
diff --git a/vl.c b/vl.c
index bfdcb7c..570ea05 100644
--- a/vl.c
+++ b/vl.c
@@ -1416,6 +1416,7 @@ static void qemu_system_suspend(void)
{
pause_all_vcpus();
notifier_list_notify(&suspend_notifiers, NULL);
+ monitor_protocol_event(QEVENT_SUSPEND, NULL);
is_suspended = true;
}
@@ -1436,12 +1437,26 @@ void qemu_register_suspend_notifier(Notifier *notifier)
void qemu_system_wakeup_request(WakeupReason reason)
{
+ static const char *names[] = {
+ [QEMU_WAKEUP_REASON_OTHER] = "other",
+ [QEMU_WAKEUP_REASON_RTC] = "rtc",
+ [QEMU_WAKEUP_REASON_PMTIMER] = "pmtimer",
+ };
+ const char *name;
+ QObject *data;
+
if (!is_suspended) {
return;
}
if (!(wakeup_reason_mask& (1<< reason))) {
return;
}
+
+ name = (reason< ARRAY_SIZE(names)) ? names[reason] : "unknown";
+ data = qobject_from_jsonf("{ 'reason': %s }", name);
+ monitor_protocol_event(QEVENT_WAKEUP, data);
+ qobject_decref(data);
+
notifier_list_notify(&wakeup_notifiers,&reason);
reset_requested = 1;
qemu_notify_event();