1*8d7f2e76SPhilippe Mathieu-Daudé /* 2*8d7f2e76SPhilippe Mathieu-Daudé * QEMU System Emulator 3*8d7f2e76SPhilippe Mathieu-Daudé * 4*8d7f2e76SPhilippe Mathieu-Daudé * Copyright (c) 2003-2008 Fabrice Bellard 5*8d7f2e76SPhilippe Mathieu-Daudé * 6*8d7f2e76SPhilippe Mathieu-Daudé * Permission is hereby granted, free of charge, to any person obtaining a copy 7*8d7f2e76SPhilippe Mathieu-Daudé * of this software and associated documentation files (the "Software"), to deal 8*8d7f2e76SPhilippe Mathieu-Daudé * in the Software without restriction, including without limitation the rights 9*8d7f2e76SPhilippe Mathieu-Daudé * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10*8d7f2e76SPhilippe Mathieu-Daudé * copies of the Software, and to permit persons to whom the Software is 11*8d7f2e76SPhilippe Mathieu-Daudé * furnished to do so, subject to the following conditions: 12*8d7f2e76SPhilippe Mathieu-Daudé * 13*8d7f2e76SPhilippe Mathieu-Daudé * The above copyright notice and this permission notice shall be included in 14*8d7f2e76SPhilippe Mathieu-Daudé * all copies or substantial portions of the Software. 15*8d7f2e76SPhilippe Mathieu-Daudé * 16*8d7f2e76SPhilippe Mathieu-Daudé * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17*8d7f2e76SPhilippe Mathieu-Daudé * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18*8d7f2e76SPhilippe Mathieu-Daudé * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19*8d7f2e76SPhilippe Mathieu-Daudé * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20*8d7f2e76SPhilippe Mathieu-Daudé * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21*8d7f2e76SPhilippe Mathieu-Daudé * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22*8d7f2e76SPhilippe Mathieu-Daudé * THE SOFTWARE. 23*8d7f2e76SPhilippe Mathieu-Daudé */ 24*8d7f2e76SPhilippe Mathieu-Daudé 25*8d7f2e76SPhilippe Mathieu-Daudé #ifndef TIMERS_STATE_H 26*8d7f2e76SPhilippe Mathieu-Daudé #define TIMERS_STATE_H 27*8d7f2e76SPhilippe Mathieu-Daudé 28*8d7f2e76SPhilippe Mathieu-Daudé /* timers state, for sharing between icount and cpu-timers */ 29*8d7f2e76SPhilippe Mathieu-Daudé 30*8d7f2e76SPhilippe Mathieu-Daudé typedef struct TimersState { 31*8d7f2e76SPhilippe Mathieu-Daudé /* Protected by BQL. */ 32*8d7f2e76SPhilippe Mathieu-Daudé int64_t cpu_ticks_prev; 33*8d7f2e76SPhilippe Mathieu-Daudé int64_t cpu_ticks_offset; 34*8d7f2e76SPhilippe Mathieu-Daudé 35*8d7f2e76SPhilippe Mathieu-Daudé /* 36*8d7f2e76SPhilippe Mathieu-Daudé * Protect fields that can be respectively read outside the 37*8d7f2e76SPhilippe Mathieu-Daudé * BQL, and written from multiple threads. 38*8d7f2e76SPhilippe Mathieu-Daudé */ 39*8d7f2e76SPhilippe Mathieu-Daudé QemuSeqLock vm_clock_seqlock; 40*8d7f2e76SPhilippe Mathieu-Daudé QemuSpin vm_clock_lock; 41*8d7f2e76SPhilippe Mathieu-Daudé 42*8d7f2e76SPhilippe Mathieu-Daudé int16_t cpu_ticks_enabled; 43*8d7f2e76SPhilippe Mathieu-Daudé 44*8d7f2e76SPhilippe Mathieu-Daudé /* Conversion factor from emulated instructions to virtual clock ticks. */ 45*8d7f2e76SPhilippe Mathieu-Daudé int16_t icount_time_shift; 46*8d7f2e76SPhilippe Mathieu-Daudé /* Icount delta used for shift auto adjust. */ 47*8d7f2e76SPhilippe Mathieu-Daudé int64_t last_delta; 48*8d7f2e76SPhilippe Mathieu-Daudé 49*8d7f2e76SPhilippe Mathieu-Daudé /* Compensate for varying guest execution speed. */ 50*8d7f2e76SPhilippe Mathieu-Daudé aligned_int64_t qemu_icount_bias; 51*8d7f2e76SPhilippe Mathieu-Daudé 52*8d7f2e76SPhilippe Mathieu-Daudé int64_t vm_clock_warp_start; 53*8d7f2e76SPhilippe Mathieu-Daudé int64_t cpu_clock_offset; 54*8d7f2e76SPhilippe Mathieu-Daudé 55*8d7f2e76SPhilippe Mathieu-Daudé /* Only written by TCG thread */ 56*8d7f2e76SPhilippe Mathieu-Daudé int64_t qemu_icount; 57*8d7f2e76SPhilippe Mathieu-Daudé 58*8d7f2e76SPhilippe Mathieu-Daudé /* for adjusting icount */ 59*8d7f2e76SPhilippe Mathieu-Daudé QEMUTimer *icount_rt_timer; 60*8d7f2e76SPhilippe Mathieu-Daudé QEMUTimer *icount_vm_timer; 61*8d7f2e76SPhilippe Mathieu-Daudé QEMUTimer *icount_warp_timer; 62*8d7f2e76SPhilippe Mathieu-Daudé } TimersState; 63*8d7f2e76SPhilippe Mathieu-Daudé 64*8d7f2e76SPhilippe Mathieu-Daudé extern TimersState timers_state; 65*8d7f2e76SPhilippe Mathieu-Daudé 66*8d7f2e76SPhilippe Mathieu-Daudé /* 67*8d7f2e76SPhilippe Mathieu-Daudé * icount needs this internal from cpu-timers when adjusting the icount shift. 68*8d7f2e76SPhilippe Mathieu-Daudé */ 69*8d7f2e76SPhilippe Mathieu-Daudé int64_t cpu_get_clock_locked(void); 70*8d7f2e76SPhilippe Mathieu-Daudé 71*8d7f2e76SPhilippe Mathieu-Daudé #endif /* TIMERS_STATE_H */ 72