Skip to content

Commit

Permalink
report guest crash information in GUEST_PANICKED event
Browse files Browse the repository at this point in the history
it's not very convenient to use the crash-information property interface,
so provide a CPU class callback to get the guest crash information, and pass
that information in the event

Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com>
Signed-off-by: Denis V. Lunev <den@openvz.org>
Message-Id: <1487053524-18674-3-git-send-email-den@openvz.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
xantnef authored and bonzini committed Feb 16, 2017
1 parent d187e08 commit c86f106
Show file tree
Hide file tree
Showing 10 changed files with 41 additions and 11 deletions.
2 changes: 1 addition & 1 deletion hw/misc/pvpanic.c
Expand Up @@ -42,7 +42,7 @@ static void handle_event(int event)
}

if (event & PVPANIC_PANICKED) {
qemu_system_guest_panicked();
qemu_system_guest_panicked(NULL);
return;
}
}
Expand Down
3 changes: 2 additions & 1 deletion hw/ppc/spapr_rtas.c
Expand Up @@ -334,7 +334,8 @@ static void rtas_ibm_os_term(PowerPCCPU *cpu,
{
target_ulong ret = 0;

qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_PAUSE, &error_abort);
qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_PAUSE, false, NULL,
&error_abort);

rtas_st(rets, 0, ret);
}
Expand Down
10 changes: 10 additions & 0 deletions include/qom/cpu.h
Expand Up @@ -158,6 +158,7 @@ typedef struct CPUClass {
uint8_t *buf, int len, bool is_write);
void (*dump_state)(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
int flags);
GuestPanicInformation* (*get_crash_info)(CPUState *cpu);
void (*dump_statistics)(CPUState *cpu, FILE *f,
fprintf_function cpu_fprintf, int flags);
int64_t (*get_arch_id)(CPUState *cpu);
Expand Down Expand Up @@ -471,6 +472,15 @@ int cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cpu,
int cpu_write_elf32_qemunote(WriteCoreDumpFunction f, CPUState *cpu,
void *opaque);

/**
* cpu_get_crash_info:
* @cpu: The CPU to get crash information for
*
* Gets the previously saved crash information.
* Caller is responsible for freeing the data.
*/
GuestPanicInformation *cpu_get_crash_info(CPUState *cpu);

/**
* CPUDumpFlags:
* @CPU_DUMP_CODE:
Expand Down
2 changes: 1 addition & 1 deletion include/sysemu/sysemu.h
Expand Up @@ -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(void);
void qemu_system_guest_panicked(GuestPanicInformation *info);
size_t qemu_target_page_bits(void);

void qemu_add_exit_notifier(Notifier *notify);
Expand Down
2 changes: 1 addition & 1 deletion kvm-all.c
Expand Up @@ -2002,7 +2002,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();
qemu_system_guest_panicked(cpu_get_crash_info(cpu));
qemu_mutex_unlock_iothread();
ret = 0;
break;
Expand Down
6 changes: 4 additions & 2 deletions qapi/event.json
Expand Up @@ -488,7 +488,9 @@
#
# @action: action that has been taken, currently always "pause"
#
# Since: 1.5
# @info: optional information about a panic
#
# Since: 1.5 (@info since 2.9)
#
# Example:
#
Expand All @@ -497,7 +499,7 @@
#
##
{ 'event': 'GUEST_PANICKED',
'data': { 'action': 'GuestPanicAction' } }
'data': { 'action': 'GuestPanicAction', '*info': 'GuestPanicInformation' } }

##
# @QUORUM_FAILURE:
Expand Down
11 changes: 11 additions & 0 deletions qom/cpu.c
Expand Up @@ -218,6 +218,17 @@ static bool cpu_common_exec_interrupt(CPUState *cpu, int int_req)
return false;
}

GuestPanicInformation *cpu_get_crash_info(CPUState *cpu)
{
CPUClass *cc = CPU_GET_CLASS(cpu);
GuestPanicInformation *res = NULL;

if (cc->get_crash_info) {
res = cc->get_crash_info(cpu);
}
return res;
}

void cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
int flags)
{
Expand Down
1 change: 1 addition & 0 deletions target/i386/cpu.c
Expand Up @@ -3734,6 +3734,7 @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
cc->do_interrupt = x86_cpu_do_interrupt;
cc->cpu_exec_interrupt = x86_cpu_exec_interrupt;
cc->dump_state = x86_cpu_dump_state;
cc->get_crash_info = x86_cpu_get_crash_info;
cc->set_pc = x86_cpu_set_pc;
cc->synchronize_from_tb = x86_cpu_synchronize_from_tb;
cc->gdb_read_register = x86_cpu_gdb_read_register;
Expand Down
4 changes: 2 additions & 2 deletions target/s390x/kvm.c
Expand Up @@ -1864,7 +1864,7 @@ static void unmanageable_intercept(S390CPU *cpu, const char *str, int pswoffset)
str, cs->cpu_index, ldq_phys(cs->as, cpu->env.psa + pswoffset),
ldq_phys(cs->as, cpu->env.psa + pswoffset + 8));
s390_cpu_halt(cpu);
qemu_system_guest_panicked();
qemu_system_guest_panicked(NULL);
}

static int handle_intercept(S390CPU *cpu)
Expand Down Expand Up @@ -1897,7 +1897,7 @@ static int handle_intercept(S390CPU *cpu)
if (is_special_wait_psw(cs)) {
qemu_system_shutdown_request();
} else {
qemu_system_guest_panicked();
qemu_system_guest_panicked(NULL);
}
}
r = EXCP_HALTED;
Expand Down
11 changes: 8 additions & 3 deletions vl.c
Expand Up @@ -1679,18 +1679,23 @@ void qemu_system_reset(bool report)
cpu_synchronize_all_post_reset();
}

void qemu_system_guest_panicked(void)
void qemu_system_guest_panicked(GuestPanicInformation *info)
{
if (current_cpu) {
current_cpu->crash_occurred = true;
}
qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_PAUSE, &error_abort);
qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_PAUSE,
!!info, info, &error_abort);
vm_stop(RUN_STATE_GUEST_PANICKED);
if (!no_shutdown) {
qapi_event_send_guest_panicked(GUEST_PANIC_ACTION_POWEROFF,
&error_abort);
!!info, info, &error_abort);
qemu_system_shutdown_request();
}

if (info) {
qapi_free_GuestPanicInformation(info);
}
}

void qemu_system_reset_request(void)
Expand Down

0 comments on commit c86f106

Please sign in to comment.