mirror of https://gitee.com/openkylin/qemu.git
replay: introduce info hmp/qmp command
This patch introduces 'info replay' monitor command and corresponding qmp request. These commands request the current record/replay mode, replay log file name, and the instruction count (number of recorded/replayed instructions). The instruction count can be used with the replay_seek/replay_break commands added in the next two patches. Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgalyuk@ispras.ru> Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Acked-by: Markus Armbruster <armbru@redhat.com> Message-Id: <160174520026.12451.13112161947433306561.stgit@pasha-ThinkPad-X280> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
43d7e1d782
commit
e3b09ad2b6
|
@ -881,4 +881,15 @@ SRST
|
|||
Show SEV information.
|
||||
ERST
|
||||
|
||||
{
|
||||
.name = "replay",
|
||||
.args_type = "",
|
||||
.params = "",
|
||||
.help = "show record/replay information",
|
||||
.cmd = hmp_info_replay,
|
||||
},
|
||||
|
||||
SRST
|
||||
``info replay``
|
||||
Display the record/replay information: mode and the current icount.
|
||||
ERST
|
||||
|
|
|
@ -129,5 +129,6 @@ void hmp_hotpluggable_cpus(Monitor *mon, const QDict *qdict);
|
|||
void hmp_info_vm_generation_id(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_memory_size_summary(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_sev(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_replay(Monitor *mon, const QDict *qdict);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -29,7 +29,8 @@
|
|||
#
|
||||
# @icount: Current instruction count. Appears when execution record/replay
|
||||
# is enabled. Used for "time-traveling" to match the moment
|
||||
# in the recorded execution with the snapshots. (since 5.2)
|
||||
# in the recorded execution with the snapshots. This counter may
|
||||
# be obtained through @query-replay command (since 5.2)
|
||||
#
|
||||
# Since: 1.3
|
||||
#
|
||||
|
|
|
@ -24,3 +24,42 @@
|
|||
##
|
||||
{ 'enum': 'ReplayMode',
|
||||
'data': [ 'none', 'record', 'play' ] }
|
||||
|
||||
##
|
||||
# @ReplayInfo:
|
||||
#
|
||||
# Record/replay information.
|
||||
#
|
||||
# @mode: current mode.
|
||||
#
|
||||
# @filename: name of the record/replay log file.
|
||||
# It is present only in record or replay modes, when the log
|
||||
# is recorded or replayed.
|
||||
#
|
||||
# @icount: current number of executed instructions.
|
||||
#
|
||||
# Since: 5.2
|
||||
#
|
||||
##
|
||||
{ 'struct': 'ReplayInfo',
|
||||
'data': { 'mode': 'ReplayMode', '*filename': 'str', 'icount': 'int' } }
|
||||
|
||||
##
|
||||
# @query-replay:
|
||||
#
|
||||
# Retrieve the record/replay information.
|
||||
# It includes current instruction count which may be used for
|
||||
# @replay-break and @replay-seek commands.
|
||||
#
|
||||
# Returns: record/replay information.
|
||||
#
|
||||
# Since: 5.2
|
||||
#
|
||||
# Example:
|
||||
#
|
||||
# -> { "execute": "query-replay" }
|
||||
# <- { "return": { "mode": "play", "filename": "log.rr", "icount": 220414 } }
|
||||
#
|
||||
##
|
||||
{ 'command': 'query-replay',
|
||||
'returns': 'ReplayInfo' }
|
||||
|
|
|
@ -9,4 +9,5 @@ softmmu_ss.add(files(
|
|||
'replay-net.c',
|
||||
'replay-audio.c',
|
||||
'replay-random.c',
|
||||
'replay-debugging.c',
|
||||
))
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* replay-debugging.c
|
||||
*
|
||||
* Copyright (c) 2010-2020 Institute for System Programming
|
||||
* of the Russian Academy of Sciences.
|
||||
*
|
||||
* 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 "qapi/error.h"
|
||||
#include "sysemu/replay.h"
|
||||
#include "replay-internal.h"
|
||||
#include "monitor/hmp.h"
|
||||
#include "monitor/monitor.h"
|
||||
#include "qapi/qapi-commands-replay.h"
|
||||
|
||||
void hmp_info_replay(Monitor *mon, const QDict *qdict)
|
||||
{
|
||||
if (replay_mode == REPLAY_MODE_NONE) {
|
||||
monitor_printf(mon, "Record/replay is not active\n");
|
||||
} else {
|
||||
monitor_printf(mon,
|
||||
"%s execution '%s': instruction count = %"PRId64"\n",
|
||||
replay_mode == REPLAY_MODE_RECORD ? "Recording" : "Replaying",
|
||||
replay_get_filename(), replay_get_current_icount());
|
||||
}
|
||||
}
|
||||
|
||||
ReplayInfo *qmp_query_replay(Error **errp)
|
||||
{
|
||||
ReplayInfo *retval = g_new0(ReplayInfo, 1);
|
||||
|
||||
retval->mode = replay_mode;
|
||||
if (replay_get_filename()) {
|
||||
retval->filename = g_strdup(replay_get_filename());
|
||||
retval->has_filename = true;
|
||||
}
|
||||
retval->icount = replay_get_current_icount();
|
||||
return retval;
|
||||
}
|
Loading…
Reference in New Issue