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