提交 9eedeb3b 编写于 作者: L Luiz Capitulino 提交者: Anthony Liguori

QMP: Introduce WATCHDOG event

It's emitted whenever the watchdog device's timer expires. The action
taken is provided in the 'data' member.
Signed-off-by: NLuiz Capitulino <lcapitulino@redhat.com>
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 2d753894
......@@ -169,3 +169,22 @@ Example:
"client": { "family": "ipv4", "service": "46089",
"host": "127.0.0.1", "sasl_username": "luiz" } },
"timestamp": { "seconds": 1263475302, "microseconds": 150772 } }
WATCHDOG
--------
Emitted when the watchdog device's timer is expired.
Data:
- "action": Action that has been taken, it's one of the following (json-string):
"reset", "shutdown", "poweroff", "pause", "debug", or "none"
Example:
{ "event": "WATCHDOG",
"data": { "action": "reset" },
"timestamp": { "seconds": 1267061043, "microseconds": 959568 } }
Note: If action is "reset", "shutdown", or "pause" the WATCHDOG event is
followed respectively by the RESET, SHUTDOWN, or STOP events.
......@@ -23,6 +23,8 @@
#include "qemu-option.h"
#include "qemu-config.h"
#include "qemu-queue.h"
#include "qemu-objects.h"
#include "monitor.h"
#include "sysemu.h"
#include "hw/watchdog.h"
......@@ -98,6 +100,15 @@ int select_watchdog_action(const char *p)
return 0;
}
static void watchdog_mon_event(const char *action)
{
QObject *data;
data = qobject_from_jsonf("{ 'action': %s }", action);
monitor_protocol_event(QEVENT_WATCHDOG, data);
qobject_decref(data);
}
/* This actually performs the "action" once a watchdog has expired,
* ie. reboot, shutdown, exit, etc.
*/
......@@ -105,26 +116,32 @@ void watchdog_perform_action(void)
{
switch(watchdog_action) {
case WDT_RESET: /* same as 'system_reset' in monitor */
watchdog_mon_event("reset");
qemu_system_reset_request();
break;
case WDT_SHUTDOWN: /* same as 'system_powerdown' in monitor */
watchdog_mon_event("shutdown");
qemu_system_powerdown_request();
break;
case WDT_POWEROFF: /* same as 'quit' command in monitor */
watchdog_mon_event("poweroff");
exit(0);
break;
case WDT_PAUSE: /* same as 'stop' command in monitor */
watchdog_mon_event("pause");
vm_stop(0);
break;
case WDT_DEBUG:
watchdog_mon_event("debug");
fprintf(stderr, "watchdog: timer fired\n");
break;
case WDT_NONE:
watchdog_mon_event("none");
break;
}
}
......@@ -426,6 +426,9 @@ void monitor_protocol_event(MonitorEvent event, QObject *data)
case QEVENT_RTC_CHANGE:
event_name = "RTC_CHANGE";
break;
case QEVENT_WATCHDOG:
event_name = "WATCHDOG";
break;
default:
abort();
break;
......
......@@ -24,6 +24,7 @@ typedef enum MonitorEvent {
QEVENT_VNC_DISCONNECTED,
QEVENT_BLOCK_IO_ERROR,
QEVENT_RTC_CHANGE,
QEVENT_WATCHDOG,
QEVENT_MAX,
} MonitorEvent;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册