From: Pavel Dovgalyuk Date: Wed, 12 Sep 2018 08:19:39 +0000 (+0300) Subject: replay: allow loading any snapshots before recording X-Git-Tag: v3.1.0-rc0~71^2~39 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bb3d7702e8dd0fd84c9496e226b46ce964b76e13;p=thirdparty%2Fqemu.git replay: allow loading any snapshots before recording This patch enables using -loadvm in recording mode to allow starting the execution recording from any of the available snapshots. It also fixes loading of the record/replay state, therefore snapshots created in replay mode may also be used for starting the new recording. Signed-off-by: Pavel Dovgalyuk Message-Id: <20180912081939.3228.56131.stgit@pasha-VirtualBox> Signed-off-by: Paolo Bonzini --- diff --git a/replay/replay-snapshot.c b/replay/replay-snapshot.c index 2ab85cfc608..16bacc98bc2 100644 --- a/replay/replay-snapshot.c +++ b/replay/replay-snapshot.c @@ -33,11 +33,18 @@ static int replay_pre_save(void *opaque) static int replay_post_load(void *opaque, int version_id) { ReplayState *state = opaque; - fseek(replay_file, state->file_offset, SEEK_SET); - qemu_clock_set_last(QEMU_CLOCK_HOST, state->host_clock_last); - /* If this was a vmstate, saved in recording mode, - we need to initialize replay data fields. */ - replay_fetch_data_kind(); + if (replay_mode == REPLAY_MODE_PLAY) { + fseek(replay_file, state->file_offset, SEEK_SET); + qemu_clock_set_last(QEMU_CLOCK_HOST, state->host_clock_last); + /* If this was a vmstate, saved in recording mode, + we need to initialize replay data fields. */ + replay_fetch_data_kind(); + } else if (replay_mode == REPLAY_MODE_RECORD) { + /* This is only useful for loading the initial state. + Therefore reset all the counters. */ + state->instructions_count = 0; + state->block_request_id = 0; + } return 0; } diff --git a/vl.c b/vl.c index f2964d9e43d..0388852deb9 100644 --- a/vl.c +++ b/vl.c @@ -4535,9 +4535,7 @@ int main(int argc, char **argv, char **envp) replay_checkpoint(CHECKPOINT_RESET); qemu_system_reset(SHUTDOWN_CAUSE_NONE); register_global_state(); - if (replay_mode != REPLAY_MODE_NONE) { - replay_vmstate_init(); - } else if (loadvm) { + if (loadvm) { Error *local_err = NULL; if (load_snapshot(loadvm, &local_err) < 0) { error_report_err(local_err); @@ -4545,6 +4543,9 @@ int main(int argc, char **argv, char **envp) exit(1); } } + if (replay_mode != REPLAY_MODE_NONE) { + replay_vmstate_init(); + } qdev_prop_check_globals(); if (vmstate_dump_file) {