watchdog: Add new Virtual Watchdog action INJECT-NMI
authorMao Chuan Li <maochuan@linux.vnet.ibm.com>
Thu, 5 Feb 2015 10:28:36 +0000 (18:28 +0800)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Thu, 11 Jun 2015 15:45:50 +0000 (17:45 +0200)
This patch allows QEMU to inject a NMI into a guest when the
watchdog expires.

Signed-off-by: Mao Chuan Li <maochuan@linux.vnet.ibm.com>
Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
CC: Eric Blake <eblake@redhat.com>
CC: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
hw/watchdog/watchdog.c
qapi-schema.json

index 54440c91c5d3cf5c52c6edb497cad971f3202c9e..8d4b0eeeb086b812437d18e5092f6a86baf4bdc3 100644 (file)
@@ -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;
     }
 }
index 6e17a5c36cf18b770f15f32ebeb5941a6219470f..c4ee3ead488307f1c1b5785824e4c9066b45913d 100644 (file)
 #
 # @none: nothing is done
 #
+# @inject-nmi: a non-maskable interrupt is injected into the first VCPU (all
+#              VCPUS on x86) (since 2.4)
+#
 # Since: 2.1
 ##
 { 'enum': 'WatchdogExpirationAction',
-  'data': [ 'reset', 'shutdown', 'poweroff', 'pause', 'debug', 'none' ] }
+  'data': [ 'reset', 'shutdown', 'poweroff', 'pause', 'debug', 'none',
+            'inject-nmi' ] }
 
 ##
 # @IoOperationType