2 * Windows crashdump (Human Monitor Interface commands)
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.
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"
15 void hmp_dump_guest_memory(Monitor
*mon
, const QDict
*qdict
)
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 raw
= qdict_get_try_bool(qdict
, "raw", false);
23 bool snappy
= qdict_get_try_bool(qdict
, "snappy", false);
24 const char *file
= qdict_get_str(qdict
, "filename");
25 bool has_begin
= qdict_haskey(qdict
, "begin");
26 bool has_length
= qdict_haskey(qdict
, "length");
27 bool has_detach
= qdict_haskey(qdict
, "detach");
31 enum DumpGuestMemoryFormat dump_format
= DUMP_GUEST_MEMORY_FORMAT_ELF
;
34 if (zlib
+ lzo
+ snappy
+ win_dmp
> 1) {
35 error_setg(&err
, "only one of '-z|-l|-s|-w' can be set");
36 hmp_handle_error(mon
, err
);
41 dump_format
= DUMP_GUEST_MEMORY_FORMAT_WIN_DMP
;
46 dump_format
= DUMP_GUEST_MEMORY_FORMAT_KDUMP_RAW_ZLIB
;
48 dump_format
= DUMP_GUEST_MEMORY_FORMAT_KDUMP_ZLIB
;
54 dump_format
= DUMP_GUEST_MEMORY_FORMAT_KDUMP_RAW_LZO
;
56 dump_format
= DUMP_GUEST_MEMORY_FORMAT_KDUMP_LZO
;
62 dump_format
= DUMP_GUEST_MEMORY_FORMAT_KDUMP_RAW_SNAPPY
;
64 dump_format
= DUMP_GUEST_MEMORY_FORMAT_KDUMP_SNAPPY
;
69 begin
= qdict_get_int(qdict
, "begin");
72 length
= qdict_get_int(qdict
, "length");
75 detach
= qdict_get_bool(qdict
, "detach");
78 prot
= g_strconcat("file:", file
, NULL
);
80 qmp_dump_guest_memory(paging
, prot
, true, detach
, has_begin
, begin
,
81 has_length
, length
, true, dump_format
, &err
);
82 hmp_handle_error(mon
, err
);
86 void hmp_info_dump(Monitor
*mon
, const QDict
*qdict
)
88 DumpQueryResult
*result
= qmp_query_dump(NULL
);
90 assert(result
&& result
->status
< DUMP_STATUS__MAX
);
91 monitor_printf(mon
, "Status: %s\n", DumpStatus_str(result
->status
));
93 if (result
->status
== DUMP_STATUS_ACTIVE
) {
95 assert(result
->total
!= 0);
96 percent
= 100.0 * result
->completed
/ result
->total
;
97 monitor_printf(mon
, "Finished: %.2f %%\n", percent
);
100 qapi_free_DumpQueryResult(result
);