If the guest crash and the crash/panic handler calls the KVM panic hypercall the KVM API notifies this with KVM_EXIT_PANIC. The VM status gets extended with "panic" to obtain this status via the QEMU monitor. --- kvm-all.c | 4 ++++ kvm/include/linux/kvm.h | 1 + monitor.c | 8 ++++++-- sysemu.h | 1 + vl.c | 2 ++ 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/kvm-all.c b/kvm-all.c index 629f727..9771f91 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -1029,6 +1029,10 @@ int kvm_cpu_exec(CPUState *env) qemu_system_reset_request(); ret = EXCP_INTERRUPT; break; + case KVM_EXIT_PANIC: + panic = 1; + ret = 1; + break; case KVM_EXIT_UNKNOWN: fprintf(stderr, "KVM: unknown exit, hardware reason %" PRIx64 "\n", (uint64_t)run->hw.hardware_exit_reason); diff --git a/kvm/include/linux/kvm.h b/kvm/include/linux/kvm.h index e46729e..207871c 100644 --- a/kvm/include/linux/kvm.h +++ b/kvm/include/linux/kvm.h @@ -161,6 +161,7 @@ struct kvm_pit_config { #define KVM_EXIT_NMI 16 #define KVM_EXIT_INTERNAL_ERROR 17 #define KVM_EXIT_OSI 18 +#define KVM_EXIT_PANIC 19 /* For KVM_EXIT_INTERNAL_ERROR */ #define KVM_INTERNAL_ERROR_EMULATION 1 diff --git a/monitor.c b/monitor.c index 59a3e76..fd6a881 100644 --- a/monitor.c +++ b/monitor.c @@ -2599,13 +2599,17 @@ static void do_info_status_print(Monitor *mon, const QObject *data) monitor_printf(mon, "paused"); } + if (qdict_get_bool(qdict, "panic")) { + monitor_printf(mon, " (panic)"); + } + monitor_printf(mon, "\n"); } static void do_info_status(Monitor *mon, QObject **ret_data) { - *ret_data = qobject_from_jsonf("{ 'running': %i, 'singlestep': %i }", - vm_running, singlestep); + *ret_data = qobject_from_jsonf("{ 'running': %i, 'singlestep': %i, 'panic': %i }", + vm_running, singlestep, panic); } static qemu_acl *find_acl(Monitor *mon, const char *name) diff --git a/sysemu.h b/sysemu.h index a42d83f..8ab0168 100644 --- a/sysemu.h +++ b/sysemu.h @@ -12,6 +12,7 @@ extern const char *bios_name; extern int vm_running; +extern int panic; extern const char *qemu_name; extern uint8_t qemu_uuid[]; int qemu_uuid_parse(const char *str, uint8_t *uuid); diff --git a/vl.c b/vl.c index e0191e1..1d9a068 100644 --- a/vl.c +++ b/vl.c @@ -185,6 +185,7 @@ int mem_prealloc = 0; /* force preallocation of physical target memory */ int nb_nics; NICInfo nd_table[MAX_NICS]; int vm_running; +int panic = 0; int autostart; int incoming_expected; /* Started with -incoming and waiting for incoming */ static int rtc_utc = 1; @@ -1407,6 +1408,7 @@ static void main_loop(void) pause_all_vcpus(); cpu_synchronize_all_states(); qemu_system_reset(); + panic = 0; resume_all_vcpus(); } if (qemu_powerdown_requested()) { -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html