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