18eda206eSPavel Dovgalyuk /* 28eda206eSPavel Dovgalyuk * replay-time.c 38eda206eSPavel Dovgalyuk * 48eda206eSPavel Dovgalyuk * Copyright (c) 2010-2015 Institute for System Programming 58eda206eSPavel Dovgalyuk * of the Russian Academy of Sciences. 68eda206eSPavel Dovgalyuk * 78eda206eSPavel Dovgalyuk * This work is licensed under the terms of the GNU GPL, version 2 or later. 88eda206eSPavel Dovgalyuk * See the COPYING file in the top-level directory. 98eda206eSPavel Dovgalyuk * 108eda206eSPavel Dovgalyuk */ 118eda206eSPavel Dovgalyuk 12d38ea87aSPeter Maydell #include "qemu/osdep.h" 138eda206eSPavel Dovgalyuk #include "sysemu/replay.h" 148eda206eSPavel Dovgalyuk #include "replay-internal.h" 158eda206eSPavel Dovgalyuk #include "qemu/error-report.h" 168eda206eSPavel Dovgalyuk 1782f49156SPavel Dovgalyuk int64_t replay_save_clock(ReplayClockKind kind, int64_t clock, 1882f49156SPavel Dovgalyuk int64_t raw_icount) 198eda206eSPavel Dovgalyuk { 2082f49156SPavel Dovgalyuk g_assert(replay_file); 21d759c951SAlex Bennée g_assert(replay_mutex_locked()); 22d759c951SAlex Bennée 2382f49156SPavel Dovgalyuk /* 2482f49156SPavel Dovgalyuk * Due to the caller's locking requirements we get the icount from it 2574c0b816SPaolo Bonzini * instead of using replay_save_instructions(). 2674c0b816SPaolo Bonzini */ 27*13f26713SPavel Dovgalyuk replay_advance_current_icount(raw_icount); 288eda206eSPavel Dovgalyuk replay_put_event(EVENT_CLOCK + kind); 298eda206eSPavel Dovgalyuk replay_put_qword(clock); 308eda206eSPavel Dovgalyuk 318eda206eSPavel Dovgalyuk return clock; 328eda206eSPavel Dovgalyuk } 338eda206eSPavel Dovgalyuk 348eda206eSPavel Dovgalyuk void replay_read_next_clock(ReplayClockKind kind) 358eda206eSPavel Dovgalyuk { 36f186d64dSPavel Dovgalyuk unsigned int read_kind = replay_state.data_kind - EVENT_CLOCK; 378eda206eSPavel Dovgalyuk 388eda206eSPavel Dovgalyuk assert(read_kind == kind); 398eda206eSPavel Dovgalyuk 408eda206eSPavel Dovgalyuk int64_t clock = replay_get_qword(); 418eda206eSPavel Dovgalyuk 428eda206eSPavel Dovgalyuk replay_check_error(); 438eda206eSPavel Dovgalyuk replay_finish_event(); 448eda206eSPavel Dovgalyuk 458eda206eSPavel Dovgalyuk replay_state.cached_clock[read_kind] = clock; 468eda206eSPavel Dovgalyuk } 478eda206eSPavel Dovgalyuk 488eda206eSPavel Dovgalyuk /*! Reads next clock event from the input. */ 498eda206eSPavel Dovgalyuk int64_t replay_read_clock(ReplayClockKind kind) 508eda206eSPavel Dovgalyuk { 5182f49156SPavel Dovgalyuk int64_t ret; 52d759c951SAlex Bennée g_assert(replay_file && replay_mutex_locked()); 53d759c951SAlex Bennée 548eda206eSPavel Dovgalyuk replay_account_executed_instructions(); 558eda206eSPavel Dovgalyuk 568eda206eSPavel Dovgalyuk if (replay_next_event_is(EVENT_CLOCK + kind)) { 578eda206eSPavel Dovgalyuk replay_read_next_clock(kind); 588eda206eSPavel Dovgalyuk } 598eda206eSPavel Dovgalyuk ret = replay_state.cached_clock[kind]; 608eda206eSPavel Dovgalyuk 618eda206eSPavel Dovgalyuk return ret; 628eda206eSPavel Dovgalyuk } 63