|
@@ -27,6 +27,7 @@
|
|
|
#include "sysemu/sysemu.h"
|
|
|
#include "sysemu/watchdog.h"
|
|
|
#include "qapi-event.h"
|
|
|
+#include "hw/nmi.h"
|
|
|
|
|
|
/* Possible values for action parameter. */
|
|
|
#define WDT_RESET 1 /* Hard reset. */
|
|
@@ -35,6 +36,7 @@
|
|
|
#define WDT_PAUSE 4 /* Pause. */
|
|
|
#define WDT_DEBUG 5 /* Prints a message and continues running. */
|
|
|
#define WDT_NONE 6 /* Do nothing. */
|
|
|
+#define WDT_NMI 7 /* Inject nmi into the guest */
|
|
|
|
|
|
static int watchdog_action = WDT_RESET;
|
|
|
static QLIST_HEAD(watchdog_list, WatchdogTimerModel) watchdog_list;
|
|
@@ -95,6 +97,8 @@ int select_watchdog_action(const char *p)
|
|
|
watchdog_action = WDT_DEBUG;
|
|
|
else if (strcasecmp(p, "none") == 0)
|
|
|
watchdog_action = WDT_NONE;
|
|
|
+ else if (strcasecmp(p, "inject-nmi") == 0)
|
|
|
+ watchdog_action = WDT_NMI;
|
|
|
else
|
|
|
return -1;
|
|
|
|
|
@@ -138,5 +142,11 @@ void watchdog_perform_action(void)
|
|
|
case WDT_NONE:
|
|
|
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_NONE, &error_abort);
|
|
|
break;
|
|
|
+
|
|
|
+ case WDT_NMI:
|
|
|
+ qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_INJECT_NMI,
|
|
|
+ &error_abort);
|
|
|
+ inject_nmi();
|
|
|
+ break;
|
|
|
}
|
|
|
}
|