cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

dump-hmp-cmds.c (2602B)


      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}