xref: /qemu/dump/dump-hmp-cmds.c (revision 370ed600)
1 /*
2  * Windows crashdump (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 
15 void 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 
73 void 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