mirror of https://github.com/xqemu/xqemu.git
QAPI patches for 2017-10-02
-----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJZ0h5sAAoJEDhwtADrkYZTsSUP+QHtxqAxYEkN+5WwBV8AvXDO zzTsvfsxcI06wDTtor3sY5RpkOogL5cPLQQCwG0lbAJBXu1IQeRkHpsO9hW++Bhk rzdGiUP2Rb+x29Ex3pPxS+iAPftyTpSyTnFsYmPAyXEfnyyb6csvGOjoHrNaOgqO dBNH8DCmlbv2LC+jB7cxJhulFvjsXuNb+xVMjWOOrjeG6yIXOJUpr7IjuMcVt8ph VN1LHz8NmUsXwYpSHVINTm2owLeZeIDKguLgOfCl3I124GTnjCnpSbwggg8qhkSd yG8xQreWbJI5lee1ltor4LfVrh0G+6ZDkYA9ryqraXWZ1LpMNVEfrFvWsGq6daTG GnsmDFf3OHIVnBs0CfxS6OVuLd9qGj4616BerKn1QrCW50fErCWOBtrZXWtI9zhw 2NBCavwEguUUEBh3dhhUIY76nYV6xAdOU8c3fSqxvBYAGsJ0Cwkz5wCTdnTKMpr+ i6DRVbuVbbd+U0nk8yGh3oFDu42ArThHNE4n2QNBFEw19ucSp6HKXZagpLWLmq5E HGs+0TgjYxKMokvuKIfXZNjfnBKLripwAtA3gGIhlVEZZz7/mYd149OEdsjpPYC2 1M/cFUnGuMvP7CWevkXjQJxCJidM5ZMh3M716kwfPq3vlqCnvGVo+1obQrtXbVuo mZkLEO4Po3IjgNtHOtbw =dhsK -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/armbru/tags/pull-qapi-2017-10-02' into staging QAPI patches for 2017-10-02 # gpg: Signature made Mon 02 Oct 2017 12:09:32 BST # gpg: using RSA key 0x3870B400EB918653 # gpg: Good signature from "Markus Armbruster <armbru@redhat.com>" # gpg: aka "Markus Armbruster <armbru@pond.sub.org>" # Primary key fingerprint: 354B C8B3 D7EB 2A6B 6867 4E5F 3870 B400 EB91 8653 * remotes/armbru/tags/pull-qapi-2017-10-02: watchdog: Allow setting action on the fly watchdog.h: Drop local redefinition of actions enum qapi: Rename WatchdogExpirationAction enum Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
0b7fe5aed7
|
@ -29,8 +29,9 @@
|
||||||
#include "qapi-event.h"
|
#include "qapi-event.h"
|
||||||
#include "hw/nmi.h"
|
#include "hw/nmi.h"
|
||||||
#include "qemu/help_option.h"
|
#include "qemu/help_option.h"
|
||||||
|
#include "qmp-commands.h"
|
||||||
|
|
||||||
static int watchdog_action = WDT_RESET;
|
static WatchdogAction watchdog_action = WATCHDOG_ACTION_RESET;
|
||||||
static QLIST_HEAD(watchdog_list, WatchdogTimerModel) watchdog_list;
|
static QLIST_HEAD(watchdog_list, WatchdogTimerModel) watchdog_list;
|
||||||
|
|
||||||
void watchdog_add_model(WatchdogTimerModel *model)
|
void watchdog_add_model(WatchdogTimerModel *model)
|
||||||
|
@ -77,27 +78,19 @@ int select_watchdog(const char *p)
|
||||||
|
|
||||||
int select_watchdog_action(const char *p)
|
int select_watchdog_action(const char *p)
|
||||||
{
|
{
|
||||||
if (strcasecmp(p, "reset") == 0)
|
int action;
|
||||||
watchdog_action = WDT_RESET;
|
char *qapi_value;
|
||||||
else if (strcasecmp(p, "shutdown") == 0)
|
|
||||||
watchdog_action = WDT_SHUTDOWN;
|
|
||||||
else if (strcasecmp(p, "poweroff") == 0)
|
|
||||||
watchdog_action = WDT_POWEROFF;
|
|
||||||
else if (strcasecmp(p, "pause") == 0)
|
|
||||||
watchdog_action = WDT_PAUSE;
|
|
||||||
else if (strcasecmp(p, "debug") == 0)
|
|
||||||
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;
|
|
||||||
|
|
||||||
|
qapi_value = g_ascii_strdown(p, -1);
|
||||||
|
action = qapi_enum_parse(&WatchdogAction_lookup, qapi_value, -1, NULL);
|
||||||
|
g_free(qapi_value);
|
||||||
|
if (action < 0)
|
||||||
|
return -1;
|
||||||
|
qmp_watchdog_set_action(action, &error_abort);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_watchdog_action(void)
|
WatchdogAction get_watchdog_action(void)
|
||||||
{
|
{
|
||||||
return watchdog_action;
|
return watchdog_action;
|
||||||
}
|
}
|
||||||
|
@ -108,42 +101,50 @@ int get_watchdog_action(void)
|
||||||
void watchdog_perform_action(void)
|
void watchdog_perform_action(void)
|
||||||
{
|
{
|
||||||
switch (watchdog_action) {
|
switch (watchdog_action) {
|
||||||
case WDT_RESET: /* same as 'system_reset' in monitor */
|
case WATCHDOG_ACTION_RESET: /* same as 'system_reset' in monitor */
|
||||||
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_RESET, &error_abort);
|
qapi_event_send_watchdog(WATCHDOG_ACTION_RESET, &error_abort);
|
||||||
qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
|
qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WDT_SHUTDOWN: /* same as 'system_powerdown' in monitor */
|
case WATCHDOG_ACTION_SHUTDOWN: /* same as 'system_powerdown' in monitor */
|
||||||
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_SHUTDOWN, &error_abort);
|
qapi_event_send_watchdog(WATCHDOG_ACTION_SHUTDOWN, &error_abort);
|
||||||
qemu_system_powerdown_request();
|
qemu_system_powerdown_request();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WDT_POWEROFF: /* same as 'quit' command in monitor */
|
case WATCHDOG_ACTION_POWEROFF: /* same as 'quit' command in monitor */
|
||||||
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_POWEROFF, &error_abort);
|
qapi_event_send_watchdog(WATCHDOG_ACTION_POWEROFF, &error_abort);
|
||||||
exit(0);
|
exit(0);
|
||||||
|
|
||||||
case WDT_PAUSE: /* same as 'stop' command in monitor */
|
case WATCHDOG_ACTION_PAUSE: /* same as 'stop' command in monitor */
|
||||||
/* In a timer callback, when vm_stop calls qemu_clock_enable
|
/* In a timer callback, when vm_stop calls qemu_clock_enable
|
||||||
* you would get a deadlock. Bypass the problem.
|
* you would get a deadlock. Bypass the problem.
|
||||||
*/
|
*/
|
||||||
qemu_system_vmstop_request_prepare();
|
qemu_system_vmstop_request_prepare();
|
||||||
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_PAUSE, &error_abort);
|
qapi_event_send_watchdog(WATCHDOG_ACTION_PAUSE, &error_abort);
|
||||||
qemu_system_vmstop_request(RUN_STATE_WATCHDOG);
|
qemu_system_vmstop_request(RUN_STATE_WATCHDOG);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WDT_DEBUG:
|
case WATCHDOG_ACTION_DEBUG:
|
||||||
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_DEBUG, &error_abort);
|
qapi_event_send_watchdog(WATCHDOG_ACTION_DEBUG, &error_abort);
|
||||||
fprintf(stderr, "watchdog: timer fired\n");
|
fprintf(stderr, "watchdog: timer fired\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WDT_NONE:
|
case WATCHDOG_ACTION_NONE:
|
||||||
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_NONE, &error_abort);
|
qapi_event_send_watchdog(WATCHDOG_ACTION_NONE, &error_abort);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WDT_NMI:
|
case WATCHDOG_ACTION_INJECT_NMI:
|
||||||
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_INJECT_NMI,
|
qapi_event_send_watchdog(WATCHDOG_ACTION_INJECT_NMI,
|
||||||
&error_abort);
|
&error_abort);
|
||||||
nmi_monitor_handle(0, NULL);
|
nmi_monitor_handle(0, NULL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qmp_watchdog_set_action(WatchdogAction action, Error **errp)
|
||||||
|
{
|
||||||
|
watchdog_action = action;
|
||||||
|
}
|
||||||
|
|
|
@ -57,9 +57,9 @@ static void diag288_timer_expired(void *dev)
|
||||||
* the BQL; reset before triggering the action to avoid races with
|
* the BQL; reset before triggering the action to avoid races with
|
||||||
* diag288 instructions. */
|
* diag288 instructions. */
|
||||||
switch (get_watchdog_action()) {
|
switch (get_watchdog_action()) {
|
||||||
case WDT_DEBUG:
|
case WATCHDOG_ACTION_DEBUG:
|
||||||
case WDT_NONE:
|
case WATCHDOG_ACTION_NONE:
|
||||||
case WDT_PAUSE:
|
case WATCHDOG_ACTION_PAUSE:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
wdt_diag288_reset(dev);
|
wdt_diag288_reset(dev);
|
||||||
|
|
|
@ -23,15 +23,7 @@
|
||||||
#define QEMU_WATCHDOG_H
|
#define QEMU_WATCHDOG_H
|
||||||
|
|
||||||
#include "qemu/queue.h"
|
#include "qemu/queue.h"
|
||||||
|
#include "qapi-types.h"
|
||||||
/* Possible values for action parameter. */
|
|
||||||
#define WDT_RESET 1 /* Hard reset. */
|
|
||||||
#define WDT_SHUTDOWN 2 /* Shutdown. */
|
|
||||||
#define WDT_POWEROFF 3 /* Quit. */
|
|
||||||
#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. */
|
|
||||||
|
|
||||||
struct WatchdogTimerModel {
|
struct WatchdogTimerModel {
|
||||||
QLIST_ENTRY(WatchdogTimerModel) entry;
|
QLIST_ENTRY(WatchdogTimerModel) entry;
|
||||||
|
@ -46,7 +38,7 @@ typedef struct WatchdogTimerModel WatchdogTimerModel;
|
||||||
/* in hw/watchdog.c */
|
/* in hw/watchdog.c */
|
||||||
int select_watchdog(const char *p);
|
int select_watchdog(const char *p);
|
||||||
int select_watchdog_action(const char *action);
|
int select_watchdog_action(const char *action);
|
||||||
int get_watchdog_action(void);
|
WatchdogAction get_watchdog_action(void);
|
||||||
void watchdog_add_model(WatchdogTimerModel *model);
|
void watchdog_add_model(WatchdogTimerModel *model);
|
||||||
void watchdog_perform_action(void);
|
void watchdog_perform_action(void);
|
||||||
|
|
||||||
|
|
|
@ -3541,8 +3541,8 @@ void watchdog_action_completion(ReadLineState *rs, int nb_args, const char *str)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
readline_set_completion_index(rs, strlen(str));
|
readline_set_completion_index(rs, strlen(str));
|
||||||
for (i = 0; i < WATCHDOG_EXPIRATION_ACTION__MAX; i++) {
|
for (i = 0; i < WATCHDOG_ACTION__MAX; i++) {
|
||||||
add_completion_option(rs, str, WatchdogExpirationAction_str(i));
|
add_completion_option(rs, str, WatchdogAction_str(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3191,3 +3191,12 @@
|
||||||
# Since 2.9
|
# Since 2.9
|
||||||
##
|
##
|
||||||
{ 'command': 'query-vm-generation-id', 'returns': 'GuidInfo' }
|
{ 'command': 'query-vm-generation-id', 'returns': 'GuidInfo' }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @watchdog-set-action:
|
||||||
|
#
|
||||||
|
# Set watchdog action
|
||||||
|
#
|
||||||
|
# Since: 2.11
|
||||||
|
##
|
||||||
|
{ 'command': 'watchdog-set-action', 'data' : {'action': 'WatchdogAction'} }
|
||||||
|
|
|
@ -253,10 +253,10 @@
|
||||||
#
|
#
|
||||||
##
|
##
|
||||||
{ 'event': 'WATCHDOG',
|
{ 'event': 'WATCHDOG',
|
||||||
'data': { 'action': 'WatchdogExpirationAction' } }
|
'data': { 'action': 'WatchdogAction' } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @WatchdogExpirationAction:
|
# @WatchdogAction:
|
||||||
#
|
#
|
||||||
# An enumeration of the actions taken when the watchdog device's timer is
|
# An enumeration of the actions taken when the watchdog device's timer is
|
||||||
# expired
|
# expired
|
||||||
|
@ -279,7 +279,7 @@
|
||||||
#
|
#
|
||||||
# Since: 2.1
|
# Since: 2.1
|
||||||
##
|
##
|
||||||
{ 'enum': 'WatchdogExpirationAction',
|
{ 'enum': 'WatchdogAction',
|
||||||
'data': [ 'reset', 'shutdown', 'poweroff', 'pause', 'debug', 'none',
|
'data': [ 'reset', 'shutdown', 'poweroff', 'pause', 'debug', 'none',
|
||||||
'inject-nmi' ] }
|
'inject-nmi' ] }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue