xref: /openbmc/qemu/dump/dump-hmp-cmds.c (revision 187c614767cdb3407bc67acf77b9b1a0d985a39d)
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