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 | |
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 | |