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 <[email protected]>
> ---
> 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;
>