qemu_system_guest_panicked was already using current_cpu implicitly, so it makes sense for it to receive a CPUState. This lets the function call cpu_get_crash_info and free the result.
Reviewed-by: Eric Blake <ebl...@redhat.com> Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> --- include/sysemu/sysemu.h | 2 +- kvm-all.c | 2 +- vl.c | 13 ++++++++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h index 576c7ce..a02f53a 100644 --- a/include/sysemu/sysemu.h +++ b/include/sysemu/sysemu.h @@ -66,7 +66,7 @@ int qemu_shutdown_requested_get(void); int qemu_reset_requested_get(void); void qemu_system_killed(int signal, pid_t pid); void qemu_system_reset(bool report); -void qemu_system_guest_panicked(GuestPanicInformation *info); +void qemu_system_guest_panicked(CPUState *cpu); size_t qemu_target_page_bits(void); void qemu_add_exit_notifier(Notifier *notify); diff --git a/kvm-all.c b/kvm-all.c index 7ad20b7..edecef0 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -2071,7 +2071,7 @@ int kvm_cpu_exec(CPUState *cpu) case KVM_SYSTEM_EVENT_CRASH: kvm_cpu_synchronize_state(cpu); qemu_mutex_lock_iothread(); - qemu_system_guest_panicked(cpu_get_crash_info(cpu)); + qemu_system_guest_panicked(cpu); qemu_mutex_unlock_iothread(); ret = 0; break; diff --git a/vl.c b/vl.c index e307ae0..7f5159d 100644 --- a/vl.c +++ b/vl.c @@ -1680,13 +1680,20 @@ void qemu_system_reset(bool report) cpu_synchronize_all_post_reset(); } -void qemu_system_guest_panicked(GuestPanicInformation *info) +void qemu_system_guest_panicked(CPUState *cpu) { + GuestPanicInformation *info = NULL; + qemu_log_mask(LOG_GUEST_ERROR, "Guest crashed\n"); - if (current_cpu) { - current_cpu->crash_occurred = true; + if (!cpu) { + cpu = current_cpu; + } + if (cpu) { + cpu->crash_occurred = true; + info = cpu_get_crash_info(cpu); } + qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_PAUSE, !!info, info, &error_abort); vm_stop(RUN_STATE_GUEST_PANICKED); -- 2.9.3