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 "qemu-common.h" 148eda206eSPavel Dovgalyuk #include "sysemu/replay.h" 158eda206eSPavel Dovgalyuk #include "replay-internal.h" 168eda206eSPavel Dovgalyuk #include "qemu/error-report.h" 178eda206eSPavel Dovgalyuk 18*74c0b816SPaolo Bonzini int64_t replay_save_clock(ReplayClockKind kind, int64_t clock, int64_t raw_icount) 198eda206eSPavel Dovgalyuk { 208eda206eSPavel Dovgalyuk if (replay_file) { 21d759c951SAlex Bennée g_assert(replay_mutex_locked()); 22d759c951SAlex Bennée 23*74c0b816SPaolo Bonzini /* Due to the caller's locking requirements we get the icount from it 24*74c0b816SPaolo Bonzini * instead of using replay_save_instructions(). 25*74c0b816SPaolo Bonzini */ 26*74c0b816SPaolo Bonzini replay_advance_current_step(raw_icount); 278eda206eSPavel Dovgalyuk replay_put_event(EVENT_CLOCK + kind); 288eda206eSPavel Dovgalyuk replay_put_qword(clock); 298eda206eSPavel Dovgalyuk } 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 { 51d759c951SAlex Bennée g_assert(replay_file && replay_mutex_locked()); 52d759c951SAlex Bennée 538eda206eSPavel Dovgalyuk replay_account_executed_instructions(); 548eda206eSPavel Dovgalyuk 558eda206eSPavel Dovgalyuk if (replay_file) { 568eda206eSPavel Dovgalyuk int64_t ret; 578eda206eSPavel Dovgalyuk if (replay_next_event_is(EVENT_CLOCK + kind)) { 588eda206eSPavel Dovgalyuk replay_read_next_clock(kind); 598eda206eSPavel Dovgalyuk } 608eda206eSPavel Dovgalyuk ret = replay_state.cached_clock[kind]; 618eda206eSPavel Dovgalyuk 628eda206eSPavel Dovgalyuk return ret; 638eda206eSPavel Dovgalyuk } 648eda206eSPavel Dovgalyuk 658eda206eSPavel Dovgalyuk error_report("REPLAY INTERNAL ERROR %d", __LINE__); 668eda206eSPavel Dovgalyuk exit(1); 678eda206eSPavel Dovgalyuk } 68