Message ID | 1429257161-29597-7-git-send-email-cornelia.huck@de.ibm.com |
---|---|
State | New |
Headers | show |
On 04/17/2015 01:52 AM, Cornelia Huck wrote: > From: Mao Chuan Li <maochuan@linux.vnet.ibm.com> > > 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> > Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> > --- > hw/watchdog/watchdog.c | 10 ++++++++++ > qapi-schema.json | 6 +++++- > 2 files changed, 15 insertions(+), 1 deletion(-) > > +++ b/qapi-schema.json > @@ -3606,10 +3606,14 @@ > # > # @none: nothing is done > # > +# @inject-nmi: a non-maskable interrupt is injected into the first VCPU (all > +# VCPUS on x86) Needs a '(since 2.4)' designation.
On Fri, 17 Apr 2015 06:28:10 -0600 Eric Blake <eblake@redhat.com> wrote: > On 04/17/2015 01:52 AM, Cornelia Huck wrote: > > From: Mao Chuan Li <maochuan@linux.vnet.ibm.com> > > > > 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> > > Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> > > --- > > hw/watchdog/watchdog.c | 10 ++++++++++ > > qapi-schema.json | 6 +++++- > > 2 files changed, 15 insertions(+), 1 deletion(-) > > > > > +++ b/qapi-schema.json > > @@ -3606,10 +3606,14 @@ > > # > > # @none: nothing is done > > # > > +# @inject-nmi: a non-maskable interrupt is injected into the first VCPU (all > > +# VCPUS on x86) > > Needs a '(since 2.4)' designation. > Will add.
diff --git a/hw/watchdog/watchdog.c b/hw/watchdog/watchdog.c index 54440c9..8d4b0ee 100644 --- a/hw/watchdog/watchdog.c +++ b/hw/watchdog/watchdog.c @@ -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; } } diff --git a/qapi-schema.json b/qapi-schema.json index ac9594d..2d3bce2 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -3606,10 +3606,14 @@ # # @none: nothing is done # +# @inject-nmi: a non-maskable interrupt is injected into the first VCPU (all +# VCPUS on x86) +# # Since: 2.1 ## { 'enum': 'WatchdogExpirationAction', - 'data': [ 'reset', 'shutdown', 'poweroff', 'pause', 'debug', 'none' ] } + 'data': [ 'reset', 'shutdown', 'poweroff', 'pause', 'debug', 'none', + 'inject-nmi' ] } ## # @IoOperationType