12608b3dfSMarkus Armbruster /* 22608b3dfSMarkus Armbruster * Human Monitor Interface commands 32608b3dfSMarkus Armbruster * 42608b3dfSMarkus Armbruster * This work is licensed under the terms of the GNU GPL, version 2 or later. 52608b3dfSMarkus Armbruster * See the COPYING file in the top-level directory. 62608b3dfSMarkus Armbruster */ 72608b3dfSMarkus Armbruster 82608b3dfSMarkus Armbruster #include "qemu/osdep.h" 92608b3dfSMarkus Armbruster #include "monitor/hmp.h" 102608b3dfSMarkus Armbruster #include "monitor/monitor.h" 112608b3dfSMarkus Armbruster #include "qapi/error.h" 122608b3dfSMarkus Armbruster #include "qapi/qapi-commands-dump.h" 132608b3dfSMarkus Armbruster #include "qapi/qmp/qdict.h" 142608b3dfSMarkus Armbruster 152608b3dfSMarkus Armbruster void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict) 162608b3dfSMarkus Armbruster { 172608b3dfSMarkus Armbruster Error *err = NULL; 182608b3dfSMarkus Armbruster bool win_dmp = qdict_get_try_bool(qdict, "windmp", false); 192608b3dfSMarkus Armbruster bool paging = qdict_get_try_bool(qdict, "paging", false); 202608b3dfSMarkus Armbruster bool zlib = qdict_get_try_bool(qdict, "zlib", false); 212608b3dfSMarkus Armbruster bool lzo = qdict_get_try_bool(qdict, "lzo", false); 222608b3dfSMarkus Armbruster bool snappy = qdict_get_try_bool(qdict, "snappy", false); 232608b3dfSMarkus Armbruster const char *file = qdict_get_str(qdict, "filename"); 242608b3dfSMarkus Armbruster bool has_begin = qdict_haskey(qdict, "begin"); 252608b3dfSMarkus Armbruster bool has_length = qdict_haskey(qdict, "length"); 262608b3dfSMarkus Armbruster bool has_detach = qdict_haskey(qdict, "detach"); 272608b3dfSMarkus Armbruster int64_t begin = 0; 282608b3dfSMarkus Armbruster int64_t length = 0; 292608b3dfSMarkus Armbruster bool detach = false; 302608b3dfSMarkus Armbruster enum DumpGuestMemoryFormat dump_format = DUMP_GUEST_MEMORY_FORMAT_ELF; 312608b3dfSMarkus Armbruster char *prot; 322608b3dfSMarkus Armbruster 332608b3dfSMarkus Armbruster if (zlib + lzo + snappy + win_dmp > 1) { 342608b3dfSMarkus Armbruster error_setg(&err, "only one of '-z|-l|-s|-w' can be set"); 35*187c6147SVladimir Sementsov-Ogievskiy hmp_handle_error(mon, err); 362608b3dfSMarkus Armbruster return; 372608b3dfSMarkus Armbruster } 382608b3dfSMarkus Armbruster 392608b3dfSMarkus Armbruster if (win_dmp) { 402608b3dfSMarkus Armbruster dump_format = DUMP_GUEST_MEMORY_FORMAT_WIN_DMP; 412608b3dfSMarkus Armbruster } 422608b3dfSMarkus Armbruster 432608b3dfSMarkus Armbruster if (zlib) { 442608b3dfSMarkus Armbruster dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_ZLIB; 452608b3dfSMarkus Armbruster } 462608b3dfSMarkus Armbruster 472608b3dfSMarkus Armbruster if (lzo) { 482608b3dfSMarkus Armbruster dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_LZO; 492608b3dfSMarkus Armbruster } 502608b3dfSMarkus Armbruster 512608b3dfSMarkus Armbruster if (snappy) { 522608b3dfSMarkus Armbruster dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_SNAPPY; 532608b3dfSMarkus Armbruster } 542608b3dfSMarkus Armbruster 552608b3dfSMarkus Armbruster if (has_begin) { 562608b3dfSMarkus Armbruster begin = qdict_get_int(qdict, "begin"); 572608b3dfSMarkus Armbruster } 582608b3dfSMarkus Armbruster if (has_length) { 592608b3dfSMarkus Armbruster length = qdict_get_int(qdict, "length"); 602608b3dfSMarkus Armbruster } 612608b3dfSMarkus Armbruster if (has_detach) { 622608b3dfSMarkus Armbruster detach = qdict_get_bool(qdict, "detach"); 632608b3dfSMarkus Armbruster } 642608b3dfSMarkus Armbruster 652608b3dfSMarkus Armbruster prot = g_strconcat("file:", file, NULL); 662608b3dfSMarkus Armbruster 672608b3dfSMarkus Armbruster qmp_dump_guest_memory(paging, prot, true, detach, has_begin, begin, 682608b3dfSMarkus Armbruster has_length, length, true, dump_format, &err); 69*187c6147SVladimir Sementsov-Ogievskiy hmp_handle_error(mon, err); 702608b3dfSMarkus Armbruster g_free(prot); 712608b3dfSMarkus Armbruster } 722608b3dfSMarkus Armbruster 732608b3dfSMarkus Armbruster void hmp_info_dump(Monitor *mon, const QDict *qdict) 742608b3dfSMarkus Armbruster { 752608b3dfSMarkus Armbruster DumpQueryResult *result = qmp_query_dump(NULL); 762608b3dfSMarkus Armbruster 772608b3dfSMarkus Armbruster assert(result && result->status < DUMP_STATUS__MAX); 782608b3dfSMarkus Armbruster monitor_printf(mon, "Status: %s\n", DumpStatus_str(result->status)); 792608b3dfSMarkus Armbruster 802608b3dfSMarkus Armbruster if (result->status == DUMP_STATUS_ACTIVE) { 812608b3dfSMarkus Armbruster float percent = 0; 822608b3dfSMarkus Armbruster assert(result->total != 0); 832608b3dfSMarkus Armbruster percent = 100.0 * result->completed / result->total; 842608b3dfSMarkus Armbruster monitor_printf(mon, "Finished: %.2f %%\n", percent); 852608b3dfSMarkus Armbruster } 862608b3dfSMarkus Armbruster 872608b3dfSMarkus Armbruster qapi_free_DumpQueryResult(result); 882608b3dfSMarkus Armbruster } 89