-z without -R has no effect: the dump format remains @elf. Fix the logic error so it becomes @kdump-zlib. Fixes: e6549197f7ed (dump: Add command interface for kdump-raw formats) Fixes: CID 1523841 Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Stephen Brennan <stephen.s.brennan@oracle.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
		
			
				
	
	
		
			102 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Windows crashdump (Human Monitor Interface commands)
 | 
						|
 *
 | 
						|
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
 | 
						|
 * See the COPYING file in the top-level directory.
 | 
						|
 */
 | 
						|
 | 
						|
#include "qemu/osdep.h"
 | 
						|
#include "monitor/hmp.h"
 | 
						|
#include "monitor/monitor.h"
 | 
						|
#include "qapi/error.h"
 | 
						|
#include "qapi/qapi-commands-dump.h"
 | 
						|
#include "qapi/qmp/qdict.h"
 | 
						|
 | 
						|
void hmp_dump_guest_memory(Monitor *mon, const QDict *qdict)
 | 
						|
{
 | 
						|
    Error *err = NULL;
 | 
						|
    bool win_dmp = qdict_get_try_bool(qdict, "windmp", false);
 | 
						|
    bool paging = qdict_get_try_bool(qdict, "paging", false);
 | 
						|
    bool zlib = qdict_get_try_bool(qdict, "zlib", false);
 | 
						|
    bool lzo = qdict_get_try_bool(qdict, "lzo", false);
 | 
						|
    bool raw = qdict_get_try_bool(qdict, "raw", false);
 | 
						|
    bool snappy = qdict_get_try_bool(qdict, "snappy", false);
 | 
						|
    const char *file = qdict_get_str(qdict, "filename");
 | 
						|
    bool has_begin = qdict_haskey(qdict, "begin");
 | 
						|
    bool has_length = qdict_haskey(qdict, "length");
 | 
						|
    bool has_detach = qdict_haskey(qdict, "detach");
 | 
						|
    int64_t begin = 0;
 | 
						|
    int64_t length = 0;
 | 
						|
    bool detach = false;
 | 
						|
    enum DumpGuestMemoryFormat dump_format = DUMP_GUEST_MEMORY_FORMAT_ELF;
 | 
						|
    char *prot;
 | 
						|
 | 
						|
    if (zlib + lzo + snappy + win_dmp > 1) {
 | 
						|
        error_setg(&err, "only one of '-z|-l|-s|-w' can be set");
 | 
						|
        hmp_handle_error(mon, err);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    if (win_dmp) {
 | 
						|
        dump_format = DUMP_GUEST_MEMORY_FORMAT_WIN_DMP;
 | 
						|
    }
 | 
						|
 | 
						|
    if (zlib) {
 | 
						|
        if (raw) {
 | 
						|
            dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_RAW_ZLIB;
 | 
						|
        } else {
 | 
						|
            dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_ZLIB;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    if (lzo) {
 | 
						|
        if (raw) {
 | 
						|
            dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_RAW_LZO;
 | 
						|
        } else {
 | 
						|
            dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_LZO;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    if (snappy) {
 | 
						|
        if (raw) {
 | 
						|
            dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_RAW_SNAPPY;
 | 
						|
        } else {
 | 
						|
            dump_format = DUMP_GUEST_MEMORY_FORMAT_KDUMP_SNAPPY;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    if (has_begin) {
 | 
						|
        begin = qdict_get_int(qdict, "begin");
 | 
						|
    }
 | 
						|
    if (has_length) {
 | 
						|
        length = qdict_get_int(qdict, "length");
 | 
						|
    }
 | 
						|
    if (has_detach) {
 | 
						|
        detach = qdict_get_bool(qdict, "detach");
 | 
						|
    }
 | 
						|
 | 
						|
    prot = g_strconcat("file:", file, NULL);
 | 
						|
 | 
						|
    qmp_dump_guest_memory(paging, prot, true, detach, has_begin, begin,
 | 
						|
                          has_length, length, true, dump_format, &err);
 | 
						|
    hmp_handle_error(mon, err);
 | 
						|
    g_free(prot);
 | 
						|
}
 | 
						|
 | 
						|
void hmp_info_dump(Monitor *mon, const QDict *qdict)
 | 
						|
{
 | 
						|
    DumpQueryResult *result = qmp_query_dump(NULL);
 | 
						|
 | 
						|
    assert(result && result->status < DUMP_STATUS__MAX);
 | 
						|
    monitor_printf(mon, "Status: %s\n", DumpStatus_str(result->status));
 | 
						|
 | 
						|
    if (result->status == DUMP_STATUS_ACTIVE) {
 | 
						|
        float percent = 0;
 | 
						|
        assert(result->total != 0);
 | 
						|
        percent = 100.0 * result->completed / result->total;
 | 
						|
        monitor_printf(mon, "Finished: %.2f %%\n", percent);
 | 
						|
    }
 | 
						|
 | 
						|
    qapi_free_DumpQueryResult(result);
 | 
						|
}
 |