mirror of https://github.com/xemu-project/xemu.git
qapi: Add exit-failure PanicAction
Currently QEMU exits with code 0 on both panic an shutdown. For tests it is useful to return 1 on panic, so that it counts as a test failure. Introduce a new exit-failure PanicAction that makes main() return EXIT_FAILURE. Tests can use -action panic=exit-failure option to activate this behavior. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: David Hildenbrand <david@redhat.com> Message-Id: <20220725223746.227063-2-iii@linux.ibm.com> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
This commit is contained in:
parent
9b1268f55c
commit
0882caf4d6
|
@ -103,7 +103,7 @@ void qemu_boot_set(const char *boot_order, Error **errp);
|
||||||
bool defaults_enabled(void);
|
bool defaults_enabled(void);
|
||||||
|
|
||||||
void qemu_init(int argc, char **argv, char **envp);
|
void qemu_init(int argc, char **argv, char **envp);
|
||||||
void qemu_main_loop(void);
|
int qemu_main_loop(void);
|
||||||
void qemu_cleanup(void);
|
void qemu_cleanup(void);
|
||||||
|
|
||||||
extern QemuOptsList qemu_legacy_drive_opts;
|
extern QemuOptsList qemu_legacy_drive_opts;
|
||||||
|
|
|
@ -364,10 +364,13 @@
|
||||||
#
|
#
|
||||||
# @shutdown: Shutdown the VM and exit, according to the shutdown action
|
# @shutdown: Shutdown the VM and exit, according to the shutdown action
|
||||||
#
|
#
|
||||||
|
# @exit-failure: Shutdown the VM and exit with nonzero status
|
||||||
|
# (since 7.1)
|
||||||
|
#
|
||||||
# Since: 6.0
|
# Since: 6.0
|
||||||
##
|
##
|
||||||
{ 'enum': 'PanicAction',
|
{ 'enum': 'PanicAction',
|
||||||
'data': [ 'pause', 'shutdown', 'none' ] }
|
'data': [ 'pause', 'shutdown', 'exit-failure', 'none' ] }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @watchdog-set-action:
|
# @watchdog-set-action:
|
||||||
|
|
|
@ -4239,7 +4239,7 @@ DEF("action", HAS_ARG, QEMU_OPTION_action,
|
||||||
" action when guest reboots [default=reset]\n"
|
" action when guest reboots [default=reset]\n"
|
||||||
"-action shutdown=poweroff|pause\n"
|
"-action shutdown=poweroff|pause\n"
|
||||||
" action when guest shuts down [default=poweroff]\n"
|
" action when guest shuts down [default=poweroff]\n"
|
||||||
"-action panic=pause|shutdown|none\n"
|
"-action panic=pause|shutdown|exit-failure|none\n"
|
||||||
" action when guest panics [default=shutdown]\n"
|
" action when guest panics [default=shutdown]\n"
|
||||||
"-action watchdog=reset|shutdown|poweroff|inject-nmi|pause|debug|none\n"
|
"-action watchdog=reset|shutdown|poweroff|inject-nmi|pause|debug|none\n"
|
||||||
" action when watchdog fires [default=reset]\n",
|
" action when watchdog fires [default=reset]\n",
|
||||||
|
|
|
@ -32,11 +32,13 @@
|
||||||
|
|
||||||
int qemu_main(int argc, char **argv, char **envp)
|
int qemu_main(int argc, char **argv, char **envp)
|
||||||
{
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
qemu_init(argc, argv, envp);
|
qemu_init(argc, argv, envp);
|
||||||
qemu_main_loop();
|
status = qemu_main_loop();
|
||||||
qemu_cleanup();
|
qemu_cleanup();
|
||||||
|
|
||||||
return 0;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_COCOA
|
#ifndef CONFIG_COCOA
|
||||||
|
|
|
@ -482,7 +482,8 @@ void qemu_system_guest_panicked(GuestPanicInformation *info)
|
||||||
qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_PAUSE,
|
qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_PAUSE,
|
||||||
!!info, info);
|
!!info, info);
|
||||||
vm_stop(RUN_STATE_GUEST_PANICKED);
|
vm_stop(RUN_STATE_GUEST_PANICKED);
|
||||||
} else if (panic_action == PANIC_ACTION_SHUTDOWN) {
|
} else if (panic_action == PANIC_ACTION_SHUTDOWN ||
|
||||||
|
panic_action == PANIC_ACTION_EXIT_FAILURE) {
|
||||||
qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_POWEROFF,
|
qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_POWEROFF,
|
||||||
!!info, info);
|
!!info, info);
|
||||||
vm_stop(RUN_STATE_GUEST_PANICKED);
|
vm_stop(RUN_STATE_GUEST_PANICKED);
|
||||||
|
@ -662,7 +663,7 @@ void qemu_system_debug_request(void)
|
||||||
qemu_notify_event();
|
qemu_notify_event();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool main_loop_should_exit(void)
|
static bool main_loop_should_exit(int *status)
|
||||||
{
|
{
|
||||||
RunState r;
|
RunState r;
|
||||||
ShutdownCause request;
|
ShutdownCause request;
|
||||||
|
@ -680,6 +681,10 @@ static bool main_loop_should_exit(void)
|
||||||
if (shutdown_action == SHUTDOWN_ACTION_PAUSE) {
|
if (shutdown_action == SHUTDOWN_ACTION_PAUSE) {
|
||||||
vm_stop(RUN_STATE_SHUTDOWN);
|
vm_stop(RUN_STATE_SHUTDOWN);
|
||||||
} else {
|
} else {
|
||||||
|
if (request == SHUTDOWN_CAUSE_GUEST_PANIC &&
|
||||||
|
panic_action == PANIC_ACTION_EXIT_FAILURE) {
|
||||||
|
*status = EXIT_FAILURE;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -715,12 +720,14 @@ static bool main_loop_should_exit(void)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_main_loop(void)
|
int qemu_main_loop(void)
|
||||||
{
|
{
|
||||||
|
int status = EXIT_SUCCESS;
|
||||||
#ifdef CONFIG_PROFILER
|
#ifdef CONFIG_PROFILER
|
||||||
int64_t ti;
|
int64_t ti;
|
||||||
#endif
|
#endif
|
||||||
while (!main_loop_should_exit()) {
|
|
||||||
|
while (!main_loop_should_exit(&status)) {
|
||||||
#ifdef CONFIG_PROFILER
|
#ifdef CONFIG_PROFILER
|
||||||
ti = profile_getclock();
|
ti = profile_getclock();
|
||||||
#endif
|
#endif
|
||||||
|
@ -729,6 +736,8 @@ void qemu_main_loop(void)
|
||||||
dev_time += profile_getclock() - ti;
|
dev_time += profile_getclock() - ti;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_add_exit_notifier(Notifier *notify)
|
void qemu_add_exit_notifier(Notifier *notify)
|
||||||
|
|
Loading…
Reference in New Issue