qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v4] dump: add Windows dump format to dump-guest-


From: Viktor Prutyanov
Subject: Re: [Qemu-devel] [PATCH v4] dump: add Windows dump format to dump-guest-memory
Date: Fri, 15 Jun 2018 12:43:56 +0300

On Mon, 11 Jun 2018 16:31:42 +0200
Markus Armbruster <address@hidden> wrote:

> Looks stuck.  Paolo, would you be willing to take this through your
> tree?
> 
> Viktor Prutyanov <address@hidden> writes:
> 
> > This patch adds Windows crashdumping feature. Now QEMU can produce
> > ELF-dump containing Windows crashdump header, which can help to
> > convert to a valid WinDbg-understandable crashdump file, or
> > immediately create such file. The crashdump will be obtained by
> > joining physical memory dump and 8K header exposed through
> > vmcoreinfo/fw_cfg device by guest driver at BSOD time. Option '-w'
> > was added to dump-guest-memory command. At the moment, only x64
> > configuration is supported. Suitable driver can be found at
> > https://github.com/virtio-win/kvm-guest-drivers-windows/tree/master/fwcfg64
> >
> > Signed-off-by: Viktor Prutyanov <address@hidden>
> > Reviewed-by: Marc-André Lureau <address@hidden>
> > ---
> >
> >  v1: documentation updated
> >  v2: qapi/misc.json updated with version info
> >  v3: qapi/misc.json codestyle fixed
> >  v4: make error processing more quality
> >
> >  Makefile.target |   1 +
> >  dump.c          |  24 ++++++-
> >  hmp-commands.hx |  13 ++--
> >  hmp.c           |   9 ++-
> >  qapi/misc.json  |   5 +-
> >  win_dump.c      | 209
> > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> > win_dump.h      |  87 +++++++++++++++++++++++ 7 files changed, 339
> > insertions(+), 9 deletions(-) create mode 100644 win_dump.c
> >  create mode 100644 win_dump.h
> >
> > diff --git a/Makefile.target b/Makefile.target
> > index d0ec77a307..6ae2609597 100644
> > --- a/Makefile.target
> > +++ b/Makefile.target
> > @@ -138,6 +138,7 @@ obj-y += hw/
> >  obj-y += memory.o
> >  obj-y += memory_mapping.o
> >  obj-y += dump.o
> > +obj-y += win_dump.o
> >  obj-y += migration/ram.o
> >  LIBS := $(libs_softmmu) $(LIBS)
> >  
> > diff --git a/dump.c b/dump.c
> > index b54cd42b21..04467b353e 100644
> > --- a/dump.c
> > +++ b/dump.c
> > @@ -29,6 +29,10 @@
> >  #include "qemu/error-report.h"
> >  #include "hw/misc/vmcoreinfo.h"
> >  
> > +#ifdef TARGET_X86_64
> > +#include "win_dump.h"
> > +#endif
> > +
> >  #include <zlib.h>
> >  #ifdef CONFIG_LZO
> >  #include <lzo/lzo1x.h>
> > @@ -1866,7 +1870,11 @@ static void dump_process(DumpState *s, Error
> > **errp) Error *local_err = NULL;
> >      DumpQueryResult *result = NULL;
> >  
> > -    if (s->has_format && s->format !=
> > DUMP_GUEST_MEMORY_FORMAT_ELF) {
> > +    if (s->has_format && s->format ==
> > DUMP_GUEST_MEMORY_FORMAT_WIN_DMP) { +#ifdef TARGET_X86_64
> > +        create_win_dump(s, &local_err);
> > +#endif
> > +    } else if (s->has_format && s->format !=
> > DUMP_GUEST_MEMORY_FORMAT_ELF) { create_kdump_vmcore(s, &local_err);
> >      } else {
> >          create_vmcore(s, &local_err);
> > @@ -1970,6 +1978,13 @@ void qmp_dump_guest_memory(bool paging,
> > const char *file, }
> >  #endif
> >  
> > +#ifndef TARGET_X86_64
> > +    if (has_format && format == DUMP_GUEST_MEMORY_FORMAT_WIN_DMP) {
> > +        error_setg(errp, "Windows dump is only available for
> > x86-64");
> > +        return;
> > +    }
> > +#endif
> > +
> >  #if !defined(WIN32)
> >      if (strstart(file, "fd:", &p)) {
> >          fd = monitor_get_fd(cur_mon, p, errp);
> > @@ -2044,5 +2059,12 @@ DumpGuestMemoryCapability
> > *qmp_query_dump_guest_memory_capability(Error **errp) item->value =
> > DUMP_GUEST_MEMORY_FORMAT_KDUMP_SNAPPY; #endif
> >  
> > +    /* Windows dump is available only if target is x86_64 */
> > +#ifdef TARGET_X86_64
> > +    item->next = g_malloc0(sizeof(DumpGuestMemoryFormatList));
> > +    item = item->next;
> > +    item->value = DUMP_GUEST_MEMORY_FORMAT_WIN_DMP;
> > +#endif
> > +
> >      return cap;
> >  }
> > diff --git a/hmp-commands.hx b/hmp-commands.hx
> > index 35d862a5d2..6f35e4f5d0 100644
> > --- a/hmp-commands.hx
> > +++ b/hmp-commands.hx
> > @@ -1088,30 +1088,33 @@ ETEXI
> >  
> >      {
> >          .name       = "dump-guest-memory",
> > -        .args_type  =
> > "paging:-p,detach:-d,zlib:-z,lzo:-l,snappy:-s,filename:F,begin:i?,length:i?",
> > -        .params     = "[-p] [-d] [-z|-l|-s] filename [begin
> > length]",
> > +        .args_type  =
> > "paging:-p,detach:-d,windmp:-w,zlib:-z,lzo:-l,snappy:-s,filename:F,begin:i?,length:i?",
> > +        .params     = "[-p] [-d] [-z|-l|-s|-w] filename [begin
> > length]", .help       = "dump guest memory into file
> > 'filename'.\n\t\t\t" "-p: do paging to get guest's memory
> > mapping.\n\t\t\t" "-d: return immediately (do not wait for
> > completion).\n\t\t\t" "-z: dump in kdump-compressed format, with
> > zlib compression.\n\t\t\t" "-l: dump in kdump-compressed format,
> > with lzo compression.\n\t\t\t" "-s: dump in kdump-compressed
> > format, with snappy compression.\n\t\t\t"
> > +                      "-w: dump in Windows crashdump format (can
> > be used instead of ELF-dump converting),\n\t\t\t"
> > +                      "    for Windows x64 guests with vmcoreinfo
> > driver only.\n\t\t\t"  
> 
> Whatever "ELF-dump converting" is.  Do we need that part of the help
> text?
> 
> >                        "begin: the starting physical
> > address.\n\t\t\t" "length: the memory size, in bytes.",
> >          .cmd        = hmp_dump_guest_memory,
> >      },
> >  
> > -
> >  STEXI
> >  @item dump-guest-memory [-p] @var{filename} @var{begin}
> > @var{length} address@hidden dump-guest-memory [-z|-l|-s] @var{filename}
> > address@hidden dump-guest-memory [-z|-l|-s|-w] @var{filename}
> >  @findex dump-guest-memory
> >  Dump guest memory to @var{protocol}. The file can be processed
> > with crash or -gdb. Without -z|-l|-s, the dump format is ELF.
> > +gdb. Without -z|-l|-s|-w, the dump format is ELF.
> >          -p: do paging to get guest's memory mapping.
> >          -z: dump in kdump-compressed format, with zlib compression.
> >          -l: dump in kdump-compressed format, with lzo compression.
> >          -s: dump in kdump-compressed format, with snappy
> > compression.
> > +        -w: dump in Windows crashdump format (can be used instead
> > of ELF-dump converting),  
> 
> Likewise.
> 
> > +            for Windows x64 guests with vmcoreinfo driver only
> >    filename: dump file name.
> >       begin: the starting physical address. It's optional, and
> > should be specified together with length.
> > diff --git a/hmp.c b/hmp.c
> > index a25c7bd9a8..bb6a6eaf00 100644
> > --- a/hmp.c
> > +++ b/hmp.c
> > @@ -1951,6 +1951,7 @@ void hmp_device_del(Monitor *mon, const QDict
> > *qdict) void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict)
> >  {
> >      Error *err = NULL;
> > +    bool win_dmp = qdict_get_try_bool(qdict, "windmp", false);
> >      bool paging = qdict_get_try_bool(qdict, "paging", false);
> >      bool zlib = qdict_get_try_bool(qdict, "zlib", false);
> >      bool lzo = qdict_get_try_bool(qdict, "lzo", false);
> > @@ -1965,12 +1966,16 @@ void hmp_dump_guest_memory(Monitor *mon,
> > const QDict *qdict) enum DumpGuestMemoryFormat dump_format =
> > DUMP_GUEST_MEMORY_FORMAT_ELF; char *prot;
> >  
> > -    if (zlib + lzo + snappy > 1) {
> > -        error_setg(&err, "only one of '-z|-l|-s' can be set");
> > +    if (zlib + lzo + snappy + win_dmp > 1) {
> > +        error_setg(&err, "only one of '-z|-l|-s|-w' can be set");
> >          hmp_handle_error(mon, &err);
> >          return;
> >      }
> >  
> > +    if (win_dmp) {
> > +        dump_format = DUMP_GUEST_MEMORY_FORMAT_WIN_DMP;
> > +    }
> > +
> >      if (zlib) {
> >          dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_ZLIB;
> >      }
> > diff --git a/qapi/misc.json b/qapi/misc.json
> > index 5636f4a149..83f2df6b41 100644
> > --- a/qapi/misc.json
> > +++ b/qapi/misc.json
> > @@ -1645,10 +1645,13 @@
> >  #
> >  # @kdump-snappy: kdump-compressed format with snappy-compressed
> >  #
> > +# @win-dmp: Windows full crashdump format,
> > +#           can be used instead of ELF converting (since 2.13)  
> 
> Whatever "ELF converting" is.  Do we need that part of the comment?

That part of the help text means that this new way to create dump is
the opposite to generating ELF-dump and converting it to DMP.
This part is probably excessive.

>
> The 2.13 needs to be fixed up to 3.0 now.
> 
> > +#
> >  # Since: 2.0
> >  ##
> >  { 'enum': 'DumpGuestMemoryFormat',
> > -  'data': [ 'elf', 'kdump-zlib', 'kdump-lzo', 'kdump-snappy' ] }
> > +  'data': [ 'elf', 'kdump-zlib', 'kdump-lzo', 'kdump-snappy',
> > 'win-dmp' ] } 
> >  ##
> >  # @dump-guest-memory:  
> [...]
> 
> Acked-by: Markus Armbruster <address@hidden>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]