mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
replay: introduce icount event
This patch adds icount event to the replay subsystem. This event corresponds to execution of several instructions and used to synchronize input events in the replay phase. Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru> Message-Id: <20150917162354.8676.31351.stgit@PASHA-ISP.def.inno> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
c16861ef1b
commit
26bc60ac82
4 changed files with 85 additions and 0 deletions
|
@ -10,6 +10,7 @@
|
|||
*/
|
||||
|
||||
#include "qemu-common.h"
|
||||
#include "sysemu/replay.h"
|
||||
#include "replay-internal.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
|
@ -36,6 +37,7 @@ void replay_put_byte(uint8_t byte)
|
|||
|
||||
void replay_put_event(uint8_t event)
|
||||
{
|
||||
assert(event < EVENT_COUNT);
|
||||
replay_put_byte(event);
|
||||
}
|
||||
|
||||
|
@ -149,8 +151,15 @@ void replay_fetch_data_kind(void)
|
|||
if (replay_file) {
|
||||
if (!replay_has_unread_data) {
|
||||
replay_data_kind = replay_get_byte();
|
||||
if (replay_data_kind == EVENT_INSTRUCTION) {
|
||||
replay_state.instructions_count = replay_get_dword();
|
||||
}
|
||||
replay_check_error();
|
||||
replay_has_unread_data = 1;
|
||||
if (replay_data_kind >= EVENT_COUNT) {
|
||||
error_report("Replay: unknown event kind %d", replay_data_kind);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -180,3 +189,18 @@ void replay_mutex_unlock(void)
|
|||
{
|
||||
qemu_mutex_unlock(&lock);
|
||||
}
|
||||
|
||||
/*! Saves cached instructions. */
|
||||
void replay_save_instructions(void)
|
||||
{
|
||||
if (replay_file && replay_mode == REPLAY_MODE_RECORD) {
|
||||
replay_mutex_lock();
|
||||
int diff = (int)(replay_get_current_step() - replay_state.current_step);
|
||||
if (diff > 0) {
|
||||
replay_put_event(EVENT_INSTRUCTION);
|
||||
replay_put_dword(diff);
|
||||
replay_state.current_step += diff;
|
||||
}
|
||||
replay_mutex_unlock();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue