qemu/replay/replay-time.c
<<
>>
Prefs
   1/*
   2 * replay-time.c
   3 *
   4 * Copyright (c) 2010-2015 Institute for System Programming
   5 *                         of the Russian Academy of Sciences.
   6 *
   7 * This work is licensed under the terms of the GNU GPL, version 2 or later.
   8 * See the COPYING file in the top-level directory.
   9 *
  10 */
  11
  12#include "qemu/osdep.h"
  13#include "qemu-common.h"
  14#include "sysemu/replay.h"
  15#include "replay-internal.h"
  16#include "qemu/error-report.h"
  17
  18int64_t replay_save_clock(ReplayClockKind kind, int64_t clock, int64_t raw_icount)
  19{
  20    if (replay_file) {
  21        g_assert(replay_mutex_locked());
  22
  23        /* Due to the caller's locking requirements we get the icount from it
  24         * instead of using replay_save_instructions().
  25         */
  26        replay_advance_current_step(raw_icount);
  27        replay_put_event(EVENT_CLOCK + kind);
  28        replay_put_qword(clock);
  29    }
  30
  31    return clock;
  32}
  33
  34void replay_read_next_clock(ReplayClockKind kind)
  35{
  36    unsigned int read_kind = replay_state.data_kind - EVENT_CLOCK;
  37
  38    assert(read_kind == kind);
  39
  40    int64_t clock = replay_get_qword();
  41
  42    replay_check_error();
  43    replay_finish_event();
  44
  45    replay_state.cached_clock[read_kind] = clock;
  46}
  47
  48/*! Reads next clock event from the input. */
  49int64_t replay_read_clock(ReplayClockKind kind)
  50{
  51    g_assert(replay_file && replay_mutex_locked());
  52
  53    replay_account_executed_instructions();
  54
  55    if (replay_file) {
  56        int64_t ret;
  57        if (replay_next_event_is(EVENT_CLOCK + kind)) {
  58            replay_read_next_clock(kind);
  59        }
  60        ret = replay_state.cached_clock[kind];
  61
  62        return ret;
  63    }
  64
  65    error_report("REPLAY INTERNAL ERROR %d", __LINE__);
  66    exit(1);
  67}
  68