mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 01:33:56 -06:00
s390x/cpu: expose the guest crash information
This patch is the s390 implementation of guest crash information,
similar to commit d187e08dc4
("i386/cpu: add crash-information QOM
property") and the related commits. We will detect several crash
reasons, with the "disabled wait" being the most important one, since
this is used by all s390 guests as a "panic like" notification.
Demonstrate these ways with examples as follows.
1. crash-information QOM property;
Run qemu with -qmp unix:qmp-sock,server, then use utility "qmp-shell"
to execute "qom-get" command, and might get the result like,
(QEMU) (QEMU) qom-get path=/machine/unattached/device[0] \
property=crash-information
{"return": {"core": 0, "reason": "disabled-wait", "psw-mask": 562956395872256, \
"type": "s390", "psw-addr": 1102832}}
2. GUEST_PANICKED event reporting;
Run qemu with a socket option, and telnet or nc to that,
-chardev socket,id=qmp,port=4444,host=localhost,server \
-mon chardev=qmp,mode=control,pretty=on \
Negotiating the mode by { "execute": "qmp_capabilities" }, and the crash
information will be reported on a guest crash event like,
{
"timestamp": {
"seconds": 1518004739,
"microseconds": 552563
},
"event": "GUEST_PANICKED",
"data": {
"action": "pause",
"info": {
"core": 0,
"psw-addr": 1102832,
"reason": "disabled-wait",
"psw-mask": 562956395872256,
"type": "s390"
}
}
}
3. log;
Run qemu with the parameters: -D <logfile> -d guest_errors, to
specify the logfile and log item. The results might be,
Guest crashed on cpu 0: disabled-wait
PSW: 0x0002000180000000 0x000000000010d3f0
Co-authored-by: Jing Liu <liujbjl@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Message-Id: <20180209122543.25755-1-borntraeger@de.ibm.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
[CH: tweaked qapi comment]
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
This commit is contained in:
parent
0a773d55ac
commit
4ada99ade2
6 changed files with 120 additions and 13 deletions
|
@ -35,6 +35,8 @@
|
|||
#include "qemu/error-report.h"
|
||||
#include "trace.h"
|
||||
#include "qapi/visitor.h"
|
||||
#include "qapi-visit.h"
|
||||
#include "sysemu/hw_accel.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
|
@ -228,6 +230,46 @@ out:
|
|||
error_propagate(errp, err);
|
||||
}
|
||||
|
||||
static GuestPanicInformation *s390_cpu_get_crash_info(CPUState *cs)
|
||||
{
|
||||
GuestPanicInformation *panic_info;
|
||||
S390CPU *cpu = S390_CPU(cs);
|
||||
|
||||
cpu_synchronize_state(cs);
|
||||
panic_info = g_malloc0(sizeof(GuestPanicInformation));
|
||||
|
||||
panic_info->type = GUEST_PANIC_INFORMATION_TYPE_S390;
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
panic_info->u.s390.core = cpu->env.core_id;
|
||||
#else
|
||||
panic_info->u.s390.core = 0; /* sane default for non system emulation */
|
||||
#endif
|
||||
panic_info->u.s390.psw_mask = cpu->env.psw.mask;
|
||||
panic_info->u.s390.psw_addr = cpu->env.psw.addr;
|
||||
panic_info->u.s390.reason = cpu->env.crash_reason;
|
||||
|
||||
return panic_info;
|
||||
}
|
||||
|
||||
static void s390_cpu_get_crash_info_qom(Object *obj, Visitor *v,
|
||||
const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
CPUState *cs = CPU(obj);
|
||||
GuestPanicInformation *panic_info;
|
||||
|
||||
if (!cs->crash_occurred) {
|
||||
error_setg(errp, "No crash occurred");
|
||||
return;
|
||||
}
|
||||
|
||||
panic_info = s390_cpu_get_crash_info(cs);
|
||||
|
||||
visit_type_GuestPanicInformation(v, "crash-information", &panic_info,
|
||||
errp);
|
||||
qapi_free_GuestPanicInformation(panic_info);
|
||||
}
|
||||
|
||||
static void s390_cpu_initfn(Object *obj)
|
||||
{
|
||||
CPUState *cs = CPU(obj);
|
||||
|
@ -240,6 +282,8 @@ static void s390_cpu_initfn(Object *obj)
|
|||
cs->env_ptr = env;
|
||||
cs->halted = 1;
|
||||
cs->exception_index = EXCP_HLT;
|
||||
object_property_add(obj, "crash-information", "GuestPanicInformation",
|
||||
s390_cpu_get_crash_info_qom, NULL, NULL, NULL, NULL);
|
||||
s390_cpu_model_register_props(obj);
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
qemu_get_timedate(&tm, 0);
|
||||
|
@ -473,6 +517,7 @@ static void s390_cpu_class_init(ObjectClass *oc, void *data)
|
|||
cc->do_interrupt = s390_cpu_do_interrupt;
|
||||
#endif
|
||||
cc->dump_state = s390_cpu_dump_state;
|
||||
cc->get_crash_info = s390_cpu_get_crash_info;
|
||||
cc->set_pc = s390_cpu_set_pc;
|
||||
cc->gdb_read_register = s390_cpu_gdb_read_register;
|
||||
cc->gdb_write_register = s390_cpu_gdb_write_register;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue