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