qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v3 0/3] kvm: report available guest crash parameters
@ 2017-02-13  7:08 Denis V. Lunev
  2017-02-13  7:09 ` [Qemu-devel] [PATCH v3 1/3] i386/cpu: add crash-information QOM property Denis V. Lunev
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Denis V. Lunev @ 2017-02-13  7:08 UTC (permalink / raw)
  To: qemu-devel
  Cc: Denis V. Lunev, Anton Nefedov, Paolo Bonzini, Marcelo Tosatti,
	Richard Henderson, Eduardo Habkost, Eric Blake, Markus Armbruster

Windows reports BSOD parameters through Hyper-V crash MSRs. This
information is very useful for initial crash analysis and thus
it would be nice to see it in the QEMU log file. There is suitable
log mask for the purpose.

Linux guest does not provide this information, but still it would
be nice to log that we have crashed.

Changes from v2:
- fixed PPC compilation

Changes since v1:
- patches resplit
- created property to query crash parameters
- crash parameters added to panic event

Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com>
Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Paolo Bonzini <pbonzini@redhat.com>
CC: Marcelo Tosatti <mtosatti@redhat.com>
CC: Richard Henderson <rth@twiddle.net>
CC: Eduardo Habkost <ehabkost@redhat.com>
CC: Eric Blake <eblake@redhat.com>
CC: Markus Armbruster <armbru@redhat.com>

Anton Nefedov (3):
  i386/cpu: add crash-information QOM property
  report guest crash information in GUEST_PANICKED event
  vl: log available guest crash information

 hw/misc/pvpanic.c       |  2 +-
 hw/ppc/spapr_rtas.c     |  3 ++-
 include/qom/cpu.h       | 10 +++++++++
 include/sysemu/kvm.h    |  2 ++
 include/sysemu/sysemu.h |  2 +-
 kvm-all.c               |  3 ++-
 qapi-schema.json        | 24 +++++++++++++++++++++
 qapi/event.json         |  6 ++++--
 qom/cpu.c               | 11 ++++++++++
 stubs/Makefile.objs     |  1 +
 stubs/kvm-crash.c       |  8 +++++++
 target/i386/cpu.c       | 55 +++++++++++++++++++++++++++++++++++++++++++++++++
 target/i386/cpu.h       |  3 +++
 target/i386/kvm.c       | 41 ++++++++++++++++++++++++++++++++++++
 target/s390x/kvm.c      |  4 ++--
 vl.c                    | 23 ++++++++++++++++++---
 16 files changed, 187 insertions(+), 11 deletions(-)
 create mode 100644 stubs/kvm-crash.c

-- 
2.7.4

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH v3 1/3] i386/cpu: add crash-information QOM property
  2017-02-13  7:08 [Qemu-devel] [PATCH v3 0/3] kvm: report available guest crash parameters Denis V. Lunev
@ 2017-02-13  7:09 ` Denis V. Lunev
  2017-02-13 12:11   ` Paolo Bonzini
  2017-02-13  7:09 ` [Qemu-devel] [PATCH v3 2/3] report guest crash information in GUEST_PANICKED event Denis V. Lunev
  2017-02-13  7:09 ` [Qemu-devel] [PATCH v3 3/3] vl: log available guest crash information Denis V. Lunev
  2 siblings, 1 reply; 8+ messages in thread
From: Denis V. Lunev @ 2017-02-13  7:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: Anton Nefedov, Denis V . Lunev

From: Anton Nefedov <anton.nefedov@virtuozzo.com>

Windows reports BSOD parameters through Hyper-V crash MSRs. This
information is very useful for initial crash analysis and thus
it would be nice to have a way to fetch it.

Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com>
Signed-off-by: Denis V. Lunev <den@openvz.org>
---
 include/sysemu/kvm.h |  2 ++
 kvm-all.c            |  1 +
 qapi-schema.json     | 24 +++++++++++++++++++++++
 stubs/Makefile.objs  |  1 +
 stubs/kvm-crash.c    |  8 ++++++++
 target/i386/cpu.c    | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 target/i386/cpu.h    |  3 +++
 target/i386/kvm.c    | 41 +++++++++++++++++++++++++++++++++++++++
 8 files changed, 134 insertions(+)
 create mode 100644 stubs/kvm-crash.c

diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
index 3045ee7..02a363d 100644
--- a/include/sysemu/kvm.h
+++ b/include/sysemu/kvm.h
@@ -527,4 +527,6 @@ int kvm_set_one_reg(CPUState *cs, uint64_t id, void *source);
  */
 int kvm_get_one_reg(CPUState *cs, uint64_t id, void *target);
 int kvm_get_max_memslots(void);
+
+void kvm_arch_save_crash_info(CPUState *cpu);
 #endif
diff --git a/kvm-all.c b/kvm-all.c
index a27c880..abfe92d 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -2000,6 +2000,7 @@ int kvm_cpu_exec(CPUState *cpu)
                 ret = EXCP_INTERRUPT;
                 break;
             case KVM_SYSTEM_EVENT_CRASH:
+                kvm_arch_save_crash_info(cpu);
                 qemu_mutex_lock_iothread();
                 qemu_system_guest_panicked();
                 qemu_mutex_unlock_iothread();
diff --git a/qapi-schema.json b/qapi-schema.json
index cbdffdd..9cb6ac5 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -5846,6 +5846,30 @@
   'data': [ 'pause', 'poweroff' ] }
 
 ##
+# @GuestPanicInformation:
+#
+# Information about a guest panic
+#
+# Since: 2.9
+##
+{'union': 'GuestPanicInformation',
+ 'data': { 'hyper-v': 'GuestPanicInformationHyperV' } }
+
+##
+# @GuestPanicInformationHyperV:
+#
+# Hyper-V specific guest panic information (HV crash MSRs)
+#
+# Since: 2.9
+##
+{'struct': 'GuestPanicInformationHyperV',
+ 'data': { 'arg1': 'uint64',
+           'arg2': 'uint64',
+           'arg3': 'uint64',
+           'arg4': 'uint64',
+           'arg5': 'uint64' } }
+
+##
 # @rtc-reset-reinjection:
 #
 # This command will reset the RTC interrupt reinjection backlog.
diff --git a/stubs/Makefile.objs b/stubs/Makefile.objs
index a187295..3b1632a 100644
--- a/stubs/Makefile.objs
+++ b/stubs/Makefile.objs
@@ -35,3 +35,4 @@ stub-obj-y += qmp_pc_dimm_device_list.o
 stub-obj-y += target-monitor-defs.o
 stub-obj-y += target-get-monitor-def.o
 stub-obj-y += pc_madt_cpu_entry.o
+stub-obj-y += kvm-crash.o
diff --git a/stubs/kvm-crash.c b/stubs/kvm-crash.c
new file mode 100644
index 0000000..b2f502d
--- /dev/null
+++ b/stubs/kvm-crash.c
@@ -0,0 +1,8 @@
+#include "qemu/osdep.h"
+#include "qemu-common.h"
+#include "sysemu/kvm.h"
+
+void kvm_arch_save_crash_info(CPUState *cs)
+{
+    return;
+}
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index eb49980..275e236 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -3495,6 +3495,57 @@ static void x86_cpu_register_feature_bit_props(X86CPU *cpu,
     x86_cpu_register_bit_prop(cpu, name, &cpu->env.features[w], bitnr);
 }
 
+static GuestPanicInformation *x86_cpu_get_crash_info(CPUState *cs)
+{
+    X86CPU *cpu = X86_CPU(cs);
+    CPUX86State *env = &cpu->env;
+    GuestPanicInformation *panic_info = NULL;
+
+    if (env->features[FEAT_HYPERV_EDX] & HV_X64_GUEST_CRASH_MSR_AVAILABLE) {
+        GuestPanicInformationHyperV *panic_info_hv =
+            g_malloc0(sizeof(GuestPanicInformationHyperV));
+        panic_info = g_malloc0(sizeof(GuestPanicInformation));
+
+        panic_info->type = GUEST_PANIC_INFORMATION_KIND_HYPER_V;
+        panic_info->u.hyper_v.data = panic_info_hv;
+
+        assert(HV_X64_MSR_CRASH_PARAMS >= 5);
+        panic_info_hv->arg1 = cpu->hv_msr_crash_params[0];
+        panic_info_hv->arg2 = cpu->hv_msr_crash_params[1];
+        panic_info_hv->arg3 = cpu->hv_msr_crash_params[2];
+        panic_info_hv->arg4 = cpu->hv_msr_crash_params[3];
+        panic_info_hv->arg5 = cpu->hv_msr_crash_params[4];
+    }
+
+    return panic_info;
+}
+static void x86_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 occured");
+        return;
+    }
+
+    panic_info = x86_cpu_get_crash_info(cs);
+    if (panic_info == NULL) {
+        error_setg(errp, "No crash information");
+        return;
+    }
+
+    visit_type_GuestPanicInformation(v, "crash-information", &panic_info,
+                                     errp);
+
+    if (panic_info->type == GUEST_PANIC_INFORMATION_KIND_HYPER_V) {
+        g_free(panic_info->u.hyper_v.data);
+    }
+    g_free(panic_info);
+}
+
 static void x86_cpu_initfn(Object *obj)
 {
     CPUState *cs = CPU(obj);
@@ -3530,6 +3581,9 @@ static void x86_cpu_initfn(Object *obj)
                         x86_cpu_get_feature_words,
                         NULL, NULL, (void *)cpu->filtered_features, NULL);
 
+    object_property_add(obj, "crash-information", "GuestPanicInformation",
+                        x86_cpu_get_crash_info_qom, NULL, NULL, NULL, NULL);
+
     cpu->hyperv_spinlock_attempts = HYPERV_SPINLOCK_NEVER_RETRY;
 
     for (w = 0; w < FEATURE_WORDS; w++) {
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
index 4d788d5..38c8da9 100644
--- a/target/i386/cpu.h
+++ b/target/i386/cpu.h
@@ -1258,6 +1258,9 @@ struct X86CPU {
     /* Number of physical address bits supported */
     uint32_t phys_bits;
 
+    /* Hyper-V crash MSRs */
+    uint64_t hv_msr_crash_params[HV_X64_MSR_CRASH_PARAMS];
+
     /* in order to simplify APIC support, we leave this pointer to the
        user */
     struct DeviceState *apic_state;
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
index 27fd050..2427c4a 100644
--- a/target/i386/kvm.c
+++ b/target/i386/kvm.c
@@ -2054,6 +2054,36 @@ static int kvm_get_sregs(X86CPU *cpu)
     return 0;
 }
 
+static int kvm_read_msr_hv_crash(X86CPU *cpu, uint64_t *buf)
+{
+    int i, ret;
+    struct {
+        struct kvm_msrs info;
+        struct kvm_msr_entry entries[HV_X64_MSR_CRASH_PARAMS];
+    } msr_data;
+
+    if (!has_msr_hv_crash) {
+        return -ENOSYS;
+    }
+
+    for (i = 0; i < HV_X64_MSR_CRASH_PARAMS; i++) {
+        msr_data.entries[i].index = HV_X64_MSR_CRASH_P0 + i;
+    }
+    msr_data.info.nmsrs = HV_X64_MSR_CRASH_PARAMS;
+
+    ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_MSRS, &msr_data);
+    if (ret < 0) {
+        return ret;
+    }
+
+    for (i = 0; i < ret; i++) {
+        const struct kvm_msr_entry *msr = msr_data.entries + i;
+        buf[msr->index - HV_X64_MSR_CRASH_P0] = msr->data;
+    }
+
+    return 0;
+}
+
 static int kvm_get_msrs(X86CPU *cpu)
 {
     CPUX86State *env = &cpu->env;
@@ -2801,6 +2831,17 @@ int kvm_arch_get_registers(CPUState *cs)
     return ret;
 }
 
+void kvm_arch_save_crash_info(CPUState *cs)
+{
+    if (has_msr_hv_crash) {
+        X86CPU *cpu = X86_CPU(cs);
+        int ret = kvm_read_msr_hv_crash(cpu, cpu->hv_msr_crash_params);
+        if (ret < 0) {
+            fprintf(stderr, "Failed to get HV crash parameters\n");
+        }
+    }
+}
+
 void kvm_arch_pre_run(CPUState *cpu, struct kvm_run *run)
 {
     X86CPU *x86_cpu = X86_CPU(cpu);
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH v3 2/3] report guest crash information in GUEST_PANICKED event
  2017-02-13  7:08 [Qemu-devel] [PATCH v3 0/3] kvm: report available guest crash parameters Denis V. Lunev
  2017-02-13  7:09 ` [Qemu-devel] [PATCH v3 1/3] i386/cpu: add crash-information QOM property Denis V. Lunev
@ 2017-02-13  7:09 ` Denis V. Lunev
  2017-02-13 12:08   ` Paolo Bonzini
  2017-02-13  7:09 ` [Qemu-devel] [PATCH v3 3/3] vl: log available guest crash information Denis V. Lunev
  2 siblings, 1 reply; 8+ messages in thread
From: Denis V. Lunev @ 2017-02-13  7:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: Anton Nefedov, Denis V . Lunev

From: Anton Nefedov <anton.nefedov@virtuozzo.com>

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>
---
 hw/misc/pvpanic.c       |  2 +-
 hw/ppc/spapr_rtas.c     |  3 ++-
 include/qom/cpu.h       | 10 ++++++++++
 include/sysemu/sysemu.h |  2 +-
 kvm-all.c               |  2 +-
 qapi/event.json         |  6 ++++--
 qom/cpu.c               | 11 +++++++++++
 target/i386/cpu.c       |  1 +
 target/s390x/kvm.c      |  4 ++--
 vl.c                    | 14 +++++++++++---
 10 files changed, 44 insertions(+), 11 deletions(-)

diff --git a/hw/misc/pvpanic.c b/hw/misc/pvpanic.c
index 0ac1e6a..57da7f2 100644
--- a/hw/misc/pvpanic.c
+++ b/hw/misc/pvpanic.c
@@ -42,7 +42,7 @@ static void handle_event(int event)
     }
 
     if (event & PVPANIC_PANICKED) {
-        qemu_system_guest_panicked();
+        qemu_system_guest_panicked(NULL);
         return;
     }
 }
diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
index bb19944..619f32c 100644
--- a/hw/ppc/spapr_rtas.c
+++ b/hw/ppc/spapr_rtas.c
@@ -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);
 }
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index ca4d0fb..f95a6c3 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -156,6 +156,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);
@@ -469,6 +470,15 @@ 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:
  * @CPU_DUMP_FPU: dump FPU register state, not just integer
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index 4d50694..2c39bed 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -64,7 +64,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);
diff --git a/kvm-all.c b/kvm-all.c
index abfe92d..8fe69bb 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -2002,7 +2002,7 @@ int kvm_cpu_exec(CPUState *cpu)
             case KVM_SYSTEM_EVENT_CRASH:
                 kvm_arch_save_crash_info(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;
diff --git a/qapi/event.json b/qapi/event.json
index 7bf539b..970ff02 100644
--- a/qapi/event.json
+++ b/qapi/event.json
@@ -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:
diff --git a/qom/cpu.c b/qom/cpu.c
index d57faf3..5158f31 100644
--- a/qom/cpu.c
+++ b/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)
 {
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 275e236..8bed688 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -3738,6 +3738,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;
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
index 6ed3876..2536780 100644
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -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;
diff --git a/vl.c b/vl.c
index b4eaf03..d5a183f 100644
--- a/vl.c
+++ b/vl.c
@@ -1707,18 +1707,26 @@ 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) {
+        if (info->type == GUEST_PANIC_INFORMATION_KIND_HYPER_V) {
+            g_free(info->u.hyper_v.data);
+        }
+        g_free(info);
+    }
 }
 
 void qemu_system_reset_request(void)
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH v3 3/3] vl: log available guest crash information
  2017-02-13  7:08 [Qemu-devel] [PATCH v3 0/3] kvm: report available guest crash parameters Denis V. Lunev
  2017-02-13  7:09 ` [Qemu-devel] [PATCH v3 1/3] i386/cpu: add crash-information QOM property Denis V. Lunev
  2017-02-13  7:09 ` [Qemu-devel] [PATCH v3 2/3] report guest crash information in GUEST_PANICKED event Denis V. Lunev
@ 2017-02-13  7:09 ` Denis V. Lunev
  2 siblings, 0 replies; 8+ messages in thread
From: Denis V. Lunev @ 2017-02-13  7:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: Anton Nefedov, Denis V . Lunev

From: Anton Nefedov <anton.nefedov@virtuozzo.com>

There is a suitable log mask for the purpose.

Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com>
Signed-off-by: Denis V. Lunev <den@openvz.org>
---
 vl.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/vl.c b/vl.c
index d5a183f..873aa4e 100644
--- a/vl.c
+++ b/vl.c
@@ -1709,6 +1709,8 @@ void qemu_system_reset(bool report)
 
 void qemu_system_guest_panicked(GuestPanicInformation *info)
 {
+    qemu_log_mask(LOG_GUEST_ERROR, "Guest crashed\n");
+
     if (current_cpu) {
         current_cpu->crash_occurred = true;
     }
@@ -1723,6 +1725,13 @@ void qemu_system_guest_panicked(GuestPanicInformation *info)
 
     if (info) {
         if (info->type == GUEST_PANIC_INFORMATION_KIND_HYPER_V) {
+            qemu_log_mask(LOG_GUEST_ERROR, "HV crash parameters: (%#"PRIx64
+                          " %#"PRIx64" %#"PRIx64" %#"PRIx64" %#"PRIx64")\n",
+                          info->u.hyper_v.data->arg1,
+                          info->u.hyper_v.data->arg2,
+                          info->u.hyper_v.data->arg3,
+                          info->u.hyper_v.data->arg4,
+                          info->u.hyper_v.data->arg5);
             g_free(info->u.hyper_v.data);
         }
         g_free(info);
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH v3 2/3] report guest crash information in GUEST_PANICKED event
  2017-02-13  7:09 ` [Qemu-devel] [PATCH v3 2/3] report guest crash information in GUEST_PANICKED event Denis V. Lunev
@ 2017-02-13 12:08   ` Paolo Bonzini
  0 siblings, 0 replies; 8+ messages in thread
From: Paolo Bonzini @ 2017-02-13 12:08 UTC (permalink / raw)
  To: Denis V. Lunev, qemu-devel; +Cc: Anton Nefedov



On 13/02/2017 08:09, Denis V. Lunev wrote:
> From: Anton Nefedov <anton.nefedov@virtuozzo.com>
> 
> 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>
> ---
>  hw/misc/pvpanic.c       |  2 +-
>  hw/ppc/spapr_rtas.c     |  3 ++-
>  include/qom/cpu.h       | 10 ++++++++++
>  include/sysemu/sysemu.h |  2 +-
>  kvm-all.c               |  2 +-
>  qapi/event.json         |  6 ++++--
>  qom/cpu.c               | 11 +++++++++++
>  target/i386/cpu.c       |  1 +
>  target/s390x/kvm.c      |  4 ++--
>  vl.c                    | 14 +++++++++++---
>  10 files changed, 44 insertions(+), 11 deletions(-)
> 
> diff --git a/hw/misc/pvpanic.c b/hw/misc/pvpanic.c
> index 0ac1e6a..57da7f2 100644
> --- a/hw/misc/pvpanic.c
> +++ b/hw/misc/pvpanic.c
> @@ -42,7 +42,7 @@ static void handle_event(int event)
>      }
>  
>      if (event & PVPANIC_PANICKED) {
> -        qemu_system_guest_panicked();
> +        qemu_system_guest_panicked(NULL);
>          return;
>      }
>  }
> diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
> index bb19944..619f32c 100644
> --- a/hw/ppc/spapr_rtas.c
> +++ b/hw/ppc/spapr_rtas.c
> @@ -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);
>  }
> diff --git a/include/qom/cpu.h b/include/qom/cpu.h
> index ca4d0fb..f95a6c3 100644
> --- a/include/qom/cpu.h
> +++ b/include/qom/cpu.h
> @@ -156,6 +156,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);
> @@ -469,6 +470,15 @@ 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:
>   * @CPU_DUMP_FPU: dump FPU register state, not just integer
> diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
> index 4d50694..2c39bed 100644
> --- a/include/sysemu/sysemu.h
> +++ b/include/sysemu/sysemu.h
> @@ -64,7 +64,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);
> diff --git a/kvm-all.c b/kvm-all.c
> index abfe92d..8fe69bb 100644
> --- a/kvm-all.c
> +++ b/kvm-all.c
> @@ -2002,7 +2002,7 @@ int kvm_cpu_exec(CPUState *cpu)
>              case KVM_SYSTEM_EVENT_CRASH:
>                  kvm_arch_save_crash_info(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;
> diff --git a/qapi/event.json b/qapi/event.json
> index 7bf539b..970ff02 100644
> --- a/qapi/event.json
> +++ b/qapi/event.json
> @@ -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:
> diff --git a/qom/cpu.c b/qom/cpu.c
> index d57faf3..5158f31 100644
> --- a/qom/cpu.c
> +++ b/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)
>  {
> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
> index 275e236..8bed688 100644
> --- a/target/i386/cpu.c
> +++ b/target/i386/cpu.c
> @@ -3738,6 +3738,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;
> diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
> index 6ed3876..2536780 100644
> --- a/target/s390x/kvm.c
> +++ b/target/s390x/kvm.c
> @@ -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;
> diff --git a/vl.c b/vl.c
> index b4eaf03..d5a183f 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -1707,18 +1707,26 @@ 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) {
> +        if (info->type == GUEST_PANIC_INFORMATION_KIND_HYPER_V) {
> +            g_free(info->u.hyper_v.data);
> +        }
> +        g_free(info);

if (info) {
    qapi_free_GuestPanicInformation(info);
}

Paolo

> +    }
>  }
>  
>  void qemu_system_reset_request(void)
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH v3 1/3] i386/cpu: add crash-information QOM property
  2017-02-13  7:09 ` [Qemu-devel] [PATCH v3 1/3] i386/cpu: add crash-information QOM property Denis V. Lunev
@ 2017-02-13 12:11   ` Paolo Bonzini
  0 siblings, 0 replies; 8+ messages in thread
From: Paolo Bonzini @ 2017-02-13 12:11 UTC (permalink / raw)
  To: Denis V. Lunev, qemu-devel; +Cc: Anton Nefedov



On 13/02/2017 08:09, Denis V. Lunev wrote:
> +void kvm_arch_save_crash_info(CPUState *cpu);
>  #endif
> diff --git a/kvm-all.c b/kvm-all.c
> index a27c880..abfe92d 100644
> --- a/kvm-all.c
> +++ b/kvm-all.c
> @@ -2000,6 +2000,7 @@ int kvm_cpu_exec(CPUState *cpu)
>                  ret = EXCP_INTERRUPT;
>                  break;
>              case KVM_SYSTEM_EVENT_CRASH:
> +                kvm_arch_save_crash_info(cpu);

Would it work to use

    kvm_cpu_synchronize_state(cpu);

instead?

Thanks,

Paolo

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH v3 0/3] kvm: report available guest crash parameters
@ 2017-02-14  6:25 Denis V. Lunev
  2017-02-15 16:47 ` Paolo Bonzini
  0 siblings, 1 reply; 8+ messages in thread
From: Denis V. Lunev @ 2017-02-14  6:25 UTC (permalink / raw)
  To: qemu-devel
  Cc: Denis V. Lunev, Anton Nefedov, Paolo Bonzini, Marcelo Tosatti,
	Richard Henderson, Eduardo Habkost, Eric Blake, Markus Armbruster

Windows reports BSOD parameters through Hyper-V crash MSRs. This
information is very useful for initial crash analysis and thus
it would be nice to see it in the QEMU log file. There is suitable
log mask for the purpose.

Linux guest does not provide this information, but still it would
be nice to log that we have crashed.

Changes from v3:
- existing kvm_cpu_synchronize_state() used to fetch HV crash MSRs
  (hence, no separate storage for these MSRs in struct X86CPU anymore)
- qapi_free_GuestPanicInformation() used to release memory

Changes from v2:
- fixed PPC compilation

Changes since v1:
- patches resplit
- created property to query crash parameters
- crash parameters added to panic event

Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com>
Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Paolo Bonzini <pbonzini@redhat.com>
CC: Marcelo Tosatti <mtosatti@redhat.com>
CC: Richard Henderson <rth@twiddle.net>
CC: Eduardo Habkost <ehabkost@redhat.com>
CC: Eric Blake <eblake@redhat.com>
CC: Markus Armbruster <armbru@redhat.com>

Anton Nefedov (3):
  i386/cpu: add crash-information QOM property
  report guest crash information in GUEST_PANICKED event
  vl: log available guest crash information

 hw/misc/pvpanic.c       |  2 +-
 hw/ppc/spapr_rtas.c     |  3 ++-
 include/qom/cpu.h       | 10 +++++++++
 include/sysemu/kvm.h    |  2 ++
 include/sysemu/sysemu.h |  2 +-
 kvm-all.c               |  3 ++-
 qapi-schema.json        | 24 +++++++++++++++++++++
 qapi/event.json         |  6 ++++--
 qom/cpu.c               | 11 ++++++++++
 stubs/Makefile.objs     |  1 +
 stubs/kvm-crash.c       |  8 +++++++
 target/i386/cpu.c       | 55 +++++++++++++++++++++++++++++++++++++++++++++++++
 target/i386/cpu.h       |  3 +++
 target/i386/kvm.c       | 41 ++++++++++++++++++++++++++++++++++++
 target/s390x/kvm.c      |  4 ++--
 vl.c                    | 23 ++++++++++++++++++---
 16 files changed, 187 insertions(+), 11 deletions(-)
 create mode 100644 stubs/kvm-crash.c

-- 
2.7.4

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH v3 0/3] kvm: report available guest crash parameters
  2017-02-14  6:25 [Qemu-devel] [PATCH v3 0/3] kvm: report available guest crash parameters Denis V. Lunev
@ 2017-02-15 16:47 ` Paolo Bonzini
  0 siblings, 0 replies; 8+ messages in thread
From: Paolo Bonzini @ 2017-02-15 16:47 UTC (permalink / raw)
  To: Denis V. Lunev, qemu-devel
  Cc: Anton Nefedov, Eduardo Habkost, Marcelo Tosatti,
	Markus Armbruster, Richard Henderson

On 14/02/2017 07:25, Denis V. Lunev wrote:
> Windows reports BSOD parameters through Hyper-V crash MSRs. This
> information is very useful for initial crash analysis and thus
> it would be nice to see it in the QEMU log file. There is suitable
> log mask for the purpose.
> 
> Linux guest does not provide this information, but still it would
> be nice to log that we have crashed.
> 
> Changes from v3:
> - existing kvm_cpu_synchronize_state() used to fetch HV crash MSRs
>   (hence, no separate storage for these MSRs in struct X86CPU anymore)

Nice. :)

> - qapi_free_GuestPanicInformation() used to release memory
> 
> Changes from v2:
> - fixed PPC compilation
> 
> Changes since v1:
> - patches resplit
> - created property to query crash parameters
> - crash parameters added to panic event
> 
> Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com>
> Signed-off-by: Denis V. Lunev <den@openvz.org>
> CC: Paolo Bonzini <pbonzini@redhat.com>
> CC: Marcelo Tosatti <mtosatti@redhat.com>
> CC: Richard Henderson <rth@twiddle.net>
> CC: Eduardo Habkost <ehabkost@redhat.com>
> CC: Eric Blake <eblake@redhat.com>
> CC: Markus Armbruster <armbru@redhat.com>
> 
> Anton Nefedov (3):
>   i386/cpu: add crash-information QOM property
>   report guest crash information in GUEST_PANICKED event
>   vl: log available guest crash information
> 
>  hw/misc/pvpanic.c       |  2 +-
>  hw/ppc/spapr_rtas.c     |  3 ++-
>  include/qom/cpu.h       | 10 +++++++++
>  include/sysemu/kvm.h    |  2 ++
>  include/sysemu/sysemu.h |  2 +-
>  kvm-all.c               |  3 ++-
>  qapi-schema.json        | 24 +++++++++++++++++++++
>  qapi/event.json         |  6 ++++--
>  qom/cpu.c               | 11 ++++++++++
>  stubs/Makefile.objs     |  1 +
>  stubs/kvm-crash.c       |  8 +++++++
>  target/i386/cpu.c       | 55 +++++++++++++++++++++++++++++++++++++++++++++++++
>  target/i386/cpu.h       |  3 +++
>  target/i386/kvm.c       | 41 ++++++++++++++++++++++++++++++++++++
>  target/s390x/kvm.c      |  4 ++--
>  vl.c                    | 23 ++++++++++++++++++---
>  16 files changed, 187 insertions(+), 11 deletions(-)
>  create mode 100644 stubs/kvm-crash.c
> 

Queued for 2.9, thanks!

Paolo

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2017-02-15 16:47 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-02-13  7:08 [Qemu-devel] [PATCH v3 0/3] kvm: report available guest crash parameters Denis V. Lunev
2017-02-13  7:09 ` [Qemu-devel] [PATCH v3 1/3] i386/cpu: add crash-information QOM property Denis V. Lunev
2017-02-13 12:11   ` Paolo Bonzini
2017-02-13  7:09 ` [Qemu-devel] [PATCH v3 2/3] report guest crash information in GUEST_PANICKED event Denis V. Lunev
2017-02-13 12:08   ` Paolo Bonzini
2017-02-13  7:09 ` [Qemu-devel] [PATCH v3 3/3] vl: log available guest crash information Denis V. Lunev
  -- strict thread matches above, loose matches on Subject: below --
2017-02-14  6:25 [Qemu-devel] [PATCH v3 0/3] kvm: report available guest crash parameters Denis V. Lunev
2017-02-15 16:47 ` Paolo Bonzini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).