qemu/dump/dump-hmp-cmds.c
<<
>>
Prefs
   1/*
   2 * Human Monitor Interface commands
   3 *
   4 * This work is licensed under the terms of the GNU GPL, version 2 or later.
   5 * See the COPYING file in the top-level directory.
   6 */
   7
   8#include "qemu/osdep.h"
   9#include "monitor/hmp.h"
  10#include "monitor/monitor.h"
  11#include "qapi/error.h"
  12#include "qapi/qapi-commands-dump.h"
  13#include "qapi/qmp/qdict.h"
  14
  15void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict)
  16{
  17    Error *err = NULL;
  18    bool win_dmp = qdict_get_try_bool(qdict, "windmp", false);
  19    bool paging = qdict_get_try_bool(qdict, "paging", false);
  20    bool zlib = qdict_get_try_bool(qdict, "zlib", false);
  21    bool lzo = qdict_get_try_bool(qdict, "lzo", false);
  22    bool snappy = qdict_get_try_bool(qdict, "snappy", false);
  23    const char *file = qdict_get_str(qdict, "filename");
  24    bool has_begin = qdict_haskey(qdict, "begin");
  25    bool has_length = qdict_haskey(qdict, "length");
  26    bool has_detach = qdict_haskey(qdict, "detach");
  27    int64_t begin = 0;
  28    int64_t length = 0;
  29    bool detach = false;
  30    enum DumpGuestMemoryFormat dump_format = DUMP_GUEST_MEMORY_FORMAT_ELF;
  31    char *prot;
  32
  33    if (zlib + lzo + snappy + win_dmp > 1) {
  34        error_setg(&err, "only one of '-z|-l|-s|-w' can be set");
  35        hmp_handle_error(mon, &err);
  36        return;
  37    }
  38
  39    if (win_dmp) {
  40        dump_format = DUMP_GUEST_MEMORY_FORMAT_WIN_DMP;
  41    }
  42
  43    if (zlib) {
  44        dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_ZLIB;
  45    }
  46
  47    if (lzo) {
  48        dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_LZO;
  49    }
  50
  51    if (snappy) {
  52        dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_SNAPPY;
  53    }
  54
  55    if (has_begin) {
  56        begin = qdict_get_int(qdict, "begin");
  57    }
  58    if (has_length) {
  59        length = qdict_get_int(qdict, "length");
  60    }
  61    if (has_detach) {
  62        detach = qdict_get_bool(qdict, "detach");
  63    }
  64
  65    prot = g_strconcat("file:", file, NULL);
  66
  67    qmp_dump_guest_memory(paging, prot, true, detach, has_begin, begin,
  68                          has_length, length, true, dump_format, &err);
  69    hmp_handle_error(mon, &err);
  70    g_free(prot);
  71}
  72
  73void hmp_info_dump(Monitor *mon, const QDict *qdict)
  74{
  75    DumpQueryResult *result = qmp_query_dump(NULL);
  76
  77    assert(result && result->status < DUMP_STATUS__MAX);
  78    monitor_printf(mon, "Status: %s\n", DumpStatus_str(result->status));
  79
  80    if (result->status == DUMP_STATUS_ACTIVE) {
  81        float percent = 0;
  82        assert(result->total != 0);
  83        percent = 100.0 * result->completed / result->total;
  84        monitor_printf(mon, "Finished: %.2f %%\n", percent);
  85    }
  86
  87    qapi_free_DumpQueryResult(result);
  88}
  89