diff options
Diffstat (limited to 'replay/replay.c')
-rw-r--r-- | replay/replay.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/replay/replay.c b/replay/replay.c index 62e8abaadf..b2c67501a5 100644 --- a/replay/replay.c +++ b/replay/replay.c @@ -13,6 +13,7 @@ #include "sysemu/replay.h" #include "replay-internal.h" #include "qemu/timer.h" +#include "qemu/main-loop.h" ReplayMode replay_mode = REPLAY_MODE_NONE; @@ -45,3 +46,36 @@ uint64_t replay_get_current_step(void) { return cpu_get_icount_raw(); } + +int replay_get_instructions(void) +{ + int res = 0; + replay_mutex_lock(); + if (replay_next_event_is(EVENT_INSTRUCTION)) { + res = replay_state.instructions_count; + } + replay_mutex_unlock(); + return res; +} + +void replay_account_executed_instructions(void) +{ + if (replay_mode == REPLAY_MODE_PLAY) { + replay_mutex_lock(); + if (replay_state.instructions_count > 0) { + int count = (int)(replay_get_current_step() + - replay_state.current_step); + replay_state.instructions_count -= count; + replay_state.current_step += count; + if (replay_state.instructions_count == 0) { + assert(replay_data_kind == EVENT_INSTRUCTION); + replay_finish_event(); + /* Wake up iothread. This is required because + timers will not expire until clock counters + will be read from the log. */ + qemu_notify_event(); + } + } + replay_mutex_unlock(); + } +} |