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 188eda206eSPavel Dovgalyuk int64_t replay_save_clock(ReplayClockKind kind, int64_t clock) 198eda206eSPavel Dovgalyuk { 208eda206eSPavel Dovgalyuk replay_save_instructions(); 218eda206eSPavel Dovgalyuk 228eda206eSPavel Dovgalyuk if (replay_file) { 238eda206eSPavel Dovgalyuk replay_mutex_lock(); 248eda206eSPavel Dovgalyuk replay_put_event(EVENT_CLOCK + kind); 258eda206eSPavel Dovgalyuk replay_put_qword(clock); 268eda206eSPavel Dovgalyuk replay_mutex_unlock(); 278eda206eSPavel Dovgalyuk } 288eda206eSPavel Dovgalyuk 298eda206eSPavel Dovgalyuk return clock; 308eda206eSPavel Dovgalyuk } 318eda206eSPavel Dovgalyuk 328eda206eSPavel Dovgalyuk void replay_read_next_clock(ReplayClockKind kind) 338eda206eSPavel Dovgalyuk { 34*f186d64dSPavel Dovgalyuk unsigned int read_kind = replay_state.data_kind - EVENT_CLOCK; 358eda206eSPavel Dovgalyuk 368eda206eSPavel Dovgalyuk assert(read_kind == kind); 378eda206eSPavel Dovgalyuk 388eda206eSPavel Dovgalyuk int64_t clock = replay_get_qword(); 398eda206eSPavel Dovgalyuk 408eda206eSPavel Dovgalyuk replay_check_error(); 418eda206eSPavel Dovgalyuk replay_finish_event(); 428eda206eSPavel Dovgalyuk 438eda206eSPavel Dovgalyuk replay_state.cached_clock[read_kind] = clock; 448eda206eSPavel Dovgalyuk } 458eda206eSPavel Dovgalyuk 468eda206eSPavel Dovgalyuk /*! Reads next clock event from the input. */ 478eda206eSPavel Dovgalyuk int64_t replay_read_clock(ReplayClockKind kind) 488eda206eSPavel Dovgalyuk { 498eda206eSPavel Dovgalyuk replay_account_executed_instructions(); 508eda206eSPavel Dovgalyuk 518eda206eSPavel Dovgalyuk if (replay_file) { 528eda206eSPavel Dovgalyuk int64_t ret; 538eda206eSPavel Dovgalyuk replay_mutex_lock(); 548eda206eSPavel Dovgalyuk if (replay_next_event_is(EVENT_CLOCK + kind)) { 558eda206eSPavel Dovgalyuk replay_read_next_clock(kind); 568eda206eSPavel Dovgalyuk } 578eda206eSPavel Dovgalyuk ret = replay_state.cached_clock[kind]; 588eda206eSPavel Dovgalyuk replay_mutex_unlock(); 598eda206eSPavel Dovgalyuk 608eda206eSPavel Dovgalyuk return ret; 618eda206eSPavel Dovgalyuk } 628eda206eSPavel Dovgalyuk 638eda206eSPavel Dovgalyuk error_report("REPLAY INTERNAL ERROR %d", __LINE__); 648eda206eSPavel Dovgalyuk exit(1); 658eda206eSPavel Dovgalyuk } 66