aboutsummaryrefslogtreecommitdiff
path: root/softmmu
diff options
context:
space:
mode:
authorIlya Leoshkevich <iii@linux.ibm.com>2022-07-26 00:37:45 +0200
committerAlex Bennée <alex.bennee@linaro.org>2022-07-29 09:48:01 +0100
commit0882caf4d607bcfb1efa99034f5f045f30eb43d7 (patch)
treecddc59ef1f87b6d6c6346423dddd81a02966d119 /softmmu
parent9b1268f55ceb0d9390a051cad299b3021dfa9896 (diff)
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>
Diffstat (limited to 'softmmu')
-rw-r--r--softmmu/main.c6
-rw-r--r--softmmu/runstate.c17
2 files changed, 17 insertions, 6 deletions
diff --git a/softmmu/main.c b/softmmu/main.c
index c00432ff09..1b675a8c03 100644
--- a/softmmu/main.c
+++ b/softmmu/main.c
@@ -32,11 +32,13 @@
int qemu_main(int argc, char **argv, char **envp)
{
+ int status;
+
qemu_init(argc, argv, envp);
- qemu_main_loop();
+ status = qemu_main_loop();
qemu_cleanup();
- return 0;
+ return status;
}
#ifndef CONFIG_COCOA
diff --git a/softmmu/runstate.c b/softmmu/runstate.c
index 168e1b78a0..1e68680b9d 100644
--- a/softmmu/runstate.c
+++ b/softmmu/runstate.c
@@ -482,7 +482,8 @@ void qemu_system_guest_panicked(GuestPanicInformation *info)
qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_PAUSE,
!!info, info);
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,
!!info, info);
vm_stop(RUN_STATE_GUEST_PANICKED);
@@ -662,7 +663,7 @@ void qemu_system_debug_request(void)
qemu_notify_event();
}
-static bool main_loop_should_exit(void)
+static bool main_loop_should_exit(int *status)
{
RunState r;
ShutdownCause request;
@@ -680,6 +681,10 @@ static bool main_loop_should_exit(void)
if (shutdown_action == SHUTDOWN_ACTION_PAUSE) {
vm_stop(RUN_STATE_SHUTDOWN);
} else {
+ if (request == SHUTDOWN_CAUSE_GUEST_PANIC &&
+ panic_action == PANIC_ACTION_EXIT_FAILURE) {
+ *status = EXIT_FAILURE;
+ }
return true;
}
}
@@ -715,12 +720,14 @@ static bool main_loop_should_exit(void)
return false;
}
-void qemu_main_loop(void)
+int qemu_main_loop(void)
{
+ int status = EXIT_SUCCESS;
#ifdef CONFIG_PROFILER
int64_t ti;
#endif
- while (!main_loop_should_exit()) {
+
+ while (!main_loop_should_exit(&status)) {
#ifdef CONFIG_PROFILER
ti = profile_getclock();
#endif
@@ -729,6 +736,8 @@ void qemu_main_loop(void)
dev_time += profile_getclock() - ti;
#endif
}
+
+ return status;
}
void qemu_add_exit_notifier(Notifier *notify)