report guest crash information in GUEST_PANICKED event
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>
This commit is contained in:
parent
d187e08dc4
commit
c86f106b85
@ -42,7 +42,7 @@ static void handle_event(int event)
|
||||
}
|
||||
|
||||
if (event & PVPANIC_PANICKED) {
|
||||
qemu_system_guest_panicked();
|
||||
qemu_system_guest_panicked(NULL);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
@ -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:
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
#
|
||||
@ -497,7 +499,7 @@
|
||||
#
|
||||
##
|
||||
{ 'event': 'GUEST_PANICKED',
|
||||
'data': { 'action': 'GuestPanicAction' } }
|
||||
'data': { 'action': 'GuestPanicAction', '*info': 'GuestPanicInformation' } }
|
||||
|
||||
##
|
||||
# @QUORUM_FAILURE:
|
||||
|
11
qom/cpu.c
11
qom/cpu.c
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
@ -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;
|
||||
|
11
vl.c
11
vl.c
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user