On 26/11/2014 11:40, Pavel Dovgalyuk wrote: > This patch introduces new QEMU_CLOCK_VIRTUAL_RT clock, which > should be used for icount warping. Separate timer is needed > for replaying the execution, because warping callbacks should > be deterministic. We cannot make realtime clock deterministic > because it is used for screen updates and other simulator-specific > actions. That is why we added new clock which is recorded and > replayed when needed. > > Signed-off-by: Pavel Dovgalyuk <pavel.dovga...@ispras.ru> > --- > include/qemu/timer.h | 7 +++++++ > qemu-timer.c | 2 ++ > replay/replay.h | 4 +++- > 3 files changed, 12 insertions(+), 1 deletions(-) > > diff --git a/include/qemu/timer.h b/include/qemu/timer.h > index 7b43331..df27157 100644 > --- a/include/qemu/timer.h > +++ b/include/qemu/timer.h > @@ -37,12 +37,19 @@ > * is suspended, and it will reflect system time changes the host may > * undergo (e.g. due to NTP). The host clock has the same precision as > * the virtual clock. > + * > + * @QEMU_CLOCK_VIRTUAL_RT: realtime clock used for icount warp > + * > + * This clock runs as a realtime clock, but is used for icount warp > + * and thus should be traced with record/replay to make warp function > + * behave deterministically. > */
I think it should also stop/restart across "stop" and "cont" commands, similar to QEMU_CLOCK_VIRTUAL. This is as simple as changing get_clock() to cpu_get_clock(). This way, QEMU_CLOCK_VIRTUAL_RT is "what QEMU_CLOCK_VIRTUAL does without -icount". This makes a lot of sense and can be merged in 2.3 independent of the rest of the series. Paolo > typedef enum { > QEMU_CLOCK_REALTIME = 0, > QEMU_CLOCK_VIRTUAL = 1, > QEMU_CLOCK_HOST = 2, > + QEMU_CLOCK_VIRTUAL_RT = 3, > QEMU_CLOCK_MAX > } QEMUClockType; > > diff --git a/qemu-timer.c b/qemu-timer.c > index 8307913..3f99af5 100644 > --- a/qemu-timer.c > +++ b/qemu-timer.c > @@ -567,6 +567,8 @@ int64_t qemu_clock_get_ns(QEMUClockType type) > notifier_list_notify(&clock->reset_notifiers, &now); > } > return now; > + case QEMU_CLOCK_VIRTUAL_RT: > + return REPLAY_CLOCK(REPLAY_CLOCK_VIRTUAL_RT, get_clock()); > } > } > > diff --git a/replay/replay.h b/replay/replay.h > index 143fe85..0c02e03 100755 > --- a/replay/replay.h > +++ b/replay/replay.h > @@ -22,8 +22,10 @@ > #define REPLAY_CLOCK_REAL_TICKS 0 > /* host_clock */ > #define REPLAY_CLOCK_HOST 1 > +/* virtual_rt_clock */ > +#define REPLAY_CLOCK_VIRTUAL_RT 2 > > -#define REPLAY_CLOCK_COUNT 2 > +#define REPLAY_CLOCK_COUNT 3 > > extern ReplayMode replay_mode; > extern char *replay_image_suffix; >