 e999bea8e6
			
		
	
	
		e999bea8e6
		
	
	
	
	
		
			
			-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);
 | |
| }
 |