1*740b1759SClaudio Fontana /* 2*740b1759SClaudio Fontana * QEMU System Emulator 3*740b1759SClaudio Fontana * 4*740b1759SClaudio Fontana * Copyright (c) 2003-2008 Fabrice Bellard 5*740b1759SClaudio Fontana * 6*740b1759SClaudio Fontana * Permission is hereby granted, free of charge, to any person obtaining a copy 7*740b1759SClaudio Fontana * of this software and associated documentation files (the "Software"), to deal 8*740b1759SClaudio Fontana * in the Software without restriction, including without limitation the rights 9*740b1759SClaudio Fontana * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10*740b1759SClaudio Fontana * copies of the Software, and to permit persons to whom the Software is 11*740b1759SClaudio Fontana * furnished to do so, subject to the following conditions: 12*740b1759SClaudio Fontana * 13*740b1759SClaudio Fontana * The above copyright notice and this permission notice shall be included in 14*740b1759SClaudio Fontana * all copies or substantial portions of the Software. 15*740b1759SClaudio Fontana * 16*740b1759SClaudio Fontana * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17*740b1759SClaudio Fontana * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18*740b1759SClaudio Fontana * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19*740b1759SClaudio Fontana * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20*740b1759SClaudio Fontana * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21*740b1759SClaudio Fontana * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22*740b1759SClaudio Fontana * THE SOFTWARE. 23*740b1759SClaudio Fontana */ 24*740b1759SClaudio Fontana 25*740b1759SClaudio Fontana #include "qemu/osdep.h" 26*740b1759SClaudio Fontana #include "qemu-common.h" 27*740b1759SClaudio Fontana #include "qemu/cutils.h" 28*740b1759SClaudio Fontana #include "migration/vmstate.h" 29*740b1759SClaudio Fontana #include "qapi/error.h" 30*740b1759SClaudio Fontana #include "qemu/error-report.h" 31*740b1759SClaudio Fontana #include "exec/exec-all.h" 32*740b1759SClaudio Fontana #include "sysemu/cpus.h" 33*740b1759SClaudio Fontana #include "sysemu/qtest.h" 34*740b1759SClaudio Fontana #include "qemu/main-loop.h" 35*740b1759SClaudio Fontana #include "qemu/option.h" 36*740b1759SClaudio Fontana #include "qemu/seqlock.h" 37*740b1759SClaudio Fontana #include "sysemu/replay.h" 38*740b1759SClaudio Fontana #include "sysemu/runstate.h" 39*740b1759SClaudio Fontana #include "hw/core/cpu.h" 40*740b1759SClaudio Fontana #include "sysemu/cpu-timers.h" 41*740b1759SClaudio Fontana #include "sysemu/cpu-throttle.h" 42*740b1759SClaudio Fontana #include "timers-state.h" 43*740b1759SClaudio Fontana 44*740b1759SClaudio Fontana /* 45*740b1759SClaudio Fontana * ICOUNT: Instruction Counter 46*740b1759SClaudio Fontana * 47*740b1759SClaudio Fontana * this module is split off from cpu-timers because the icount part 48*740b1759SClaudio Fontana * is TCG-specific, and does not need to be built for other accels. 49*740b1759SClaudio Fontana */ 50*740b1759SClaudio Fontana static bool icount_sleep = true; 51*740b1759SClaudio Fontana /* Arbitrarily pick 1MIPS as the minimum allowable speed. */ 52*740b1759SClaudio Fontana #define MAX_ICOUNT_SHIFT 10 53*740b1759SClaudio Fontana 54*740b1759SClaudio Fontana /* 55*740b1759SClaudio Fontana * 0 = Do not count executed instructions. 56*740b1759SClaudio Fontana * 1 = Fixed conversion of insn to ns via "shift" option 57*740b1759SClaudio Fontana * 2 = Runtime adaptive algorithm to compute shift 58*740b1759SClaudio Fontana */ 59*740b1759SClaudio Fontana int use_icount; 60*740b1759SClaudio Fontana 61*740b1759SClaudio Fontana static void icount_enable_precise(void) 62*740b1759SClaudio Fontana { 63*740b1759SClaudio Fontana use_icount = 1; 64*740b1759SClaudio Fontana } 65*740b1759SClaudio Fontana 66*740b1759SClaudio Fontana static void icount_enable_adaptive(void) 67*740b1759SClaudio Fontana { 68*740b1759SClaudio Fontana use_icount = 2; 69*740b1759SClaudio Fontana } 70*740b1759SClaudio Fontana 71*740b1759SClaudio Fontana /* 72*740b1759SClaudio Fontana * The current number of executed instructions is based on what we 73*740b1759SClaudio Fontana * originally budgeted minus the current state of the decrementing 74*740b1759SClaudio Fontana * icount counters in extra/u16.low. 75*740b1759SClaudio Fontana */ 76*740b1759SClaudio Fontana static int64_t cpu_get_icount_executed(CPUState *cpu) 77*740b1759SClaudio Fontana { 78*740b1759SClaudio Fontana return (cpu->icount_budget - 79*740b1759SClaudio Fontana (cpu_neg(cpu)->icount_decr.u16.low + cpu->icount_extra)); 80*740b1759SClaudio Fontana } 81*740b1759SClaudio Fontana 82*740b1759SClaudio Fontana /* 83*740b1759SClaudio Fontana * Update the global shared timer_state.qemu_icount to take into 84*740b1759SClaudio Fontana * account executed instructions. This is done by the TCG vCPU 85*740b1759SClaudio Fontana * thread so the main-loop can see time has moved forward. 86*740b1759SClaudio Fontana */ 87*740b1759SClaudio Fontana static void cpu_update_icount_locked(CPUState *cpu) 88*740b1759SClaudio Fontana { 89*740b1759SClaudio Fontana int64_t executed = cpu_get_icount_executed(cpu); 90*740b1759SClaudio Fontana cpu->icount_budget -= executed; 91*740b1759SClaudio Fontana 92*740b1759SClaudio Fontana qatomic_set_i64(&timers_state.qemu_icount, 93*740b1759SClaudio Fontana timers_state.qemu_icount + executed); 94*740b1759SClaudio Fontana } 95*740b1759SClaudio Fontana 96*740b1759SClaudio Fontana /* 97*740b1759SClaudio Fontana * Update the global shared timer_state.qemu_icount to take into 98*740b1759SClaudio Fontana * account executed instructions. This is done by the TCG vCPU 99*740b1759SClaudio Fontana * thread so the main-loop can see time has moved forward. 100*740b1759SClaudio Fontana */ 101*740b1759SClaudio Fontana void cpu_update_icount(CPUState *cpu) 102*740b1759SClaudio Fontana { 103*740b1759SClaudio Fontana seqlock_write_lock(&timers_state.vm_clock_seqlock, 104*740b1759SClaudio Fontana &timers_state.vm_clock_lock); 105*740b1759SClaudio Fontana cpu_update_icount_locked(cpu); 106*740b1759SClaudio Fontana seqlock_write_unlock(&timers_state.vm_clock_seqlock, 107*740b1759SClaudio Fontana &timers_state.vm_clock_lock); 108*740b1759SClaudio Fontana } 109*740b1759SClaudio Fontana 110*740b1759SClaudio Fontana static int64_t cpu_get_icount_raw_locked(void) 111*740b1759SClaudio Fontana { 112*740b1759SClaudio Fontana CPUState *cpu = current_cpu; 113*740b1759SClaudio Fontana 114*740b1759SClaudio Fontana if (cpu && cpu->running) { 115*740b1759SClaudio Fontana if (!cpu->can_do_io) { 116*740b1759SClaudio Fontana error_report("Bad icount read"); 117*740b1759SClaudio Fontana exit(1); 118*740b1759SClaudio Fontana } 119*740b1759SClaudio Fontana /* Take into account what has run */ 120*740b1759SClaudio Fontana cpu_update_icount_locked(cpu); 121*740b1759SClaudio Fontana } 122*740b1759SClaudio Fontana /* The read is protected by the seqlock, but needs atomic64 to avoid UB */ 123*740b1759SClaudio Fontana return qatomic_read_i64(&timers_state.qemu_icount); 124*740b1759SClaudio Fontana } 125*740b1759SClaudio Fontana 126*740b1759SClaudio Fontana static int64_t cpu_get_icount_locked(void) 127*740b1759SClaudio Fontana { 128*740b1759SClaudio Fontana int64_t icount = cpu_get_icount_raw_locked(); 129*740b1759SClaudio Fontana return qatomic_read_i64(&timers_state.qemu_icount_bias) + 130*740b1759SClaudio Fontana cpu_icount_to_ns(icount); 131*740b1759SClaudio Fontana } 132*740b1759SClaudio Fontana 133*740b1759SClaudio Fontana int64_t cpu_get_icount_raw(void) 134*740b1759SClaudio Fontana { 135*740b1759SClaudio Fontana int64_t icount; 136*740b1759SClaudio Fontana unsigned start; 137*740b1759SClaudio Fontana 138*740b1759SClaudio Fontana do { 139*740b1759SClaudio Fontana start = seqlock_read_begin(&timers_state.vm_clock_seqlock); 140*740b1759SClaudio Fontana icount = cpu_get_icount_raw_locked(); 141*740b1759SClaudio Fontana } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start)); 142*740b1759SClaudio Fontana 143*740b1759SClaudio Fontana return icount; 144*740b1759SClaudio Fontana } 145*740b1759SClaudio Fontana 146*740b1759SClaudio Fontana /* Return the virtual CPU time, based on the instruction counter. */ 147*740b1759SClaudio Fontana int64_t cpu_get_icount(void) 148*740b1759SClaudio Fontana { 149*740b1759SClaudio Fontana int64_t icount; 150*740b1759SClaudio Fontana unsigned start; 151*740b1759SClaudio Fontana 152*740b1759SClaudio Fontana do { 153*740b1759SClaudio Fontana start = seqlock_read_begin(&timers_state.vm_clock_seqlock); 154*740b1759SClaudio Fontana icount = cpu_get_icount_locked(); 155*740b1759SClaudio Fontana } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start)); 156*740b1759SClaudio Fontana 157*740b1759SClaudio Fontana return icount; 158*740b1759SClaudio Fontana } 159*740b1759SClaudio Fontana 160*740b1759SClaudio Fontana int64_t cpu_icount_to_ns(int64_t icount) 161*740b1759SClaudio Fontana { 162*740b1759SClaudio Fontana return icount << qatomic_read(&timers_state.icount_time_shift); 163*740b1759SClaudio Fontana } 164*740b1759SClaudio Fontana 165*740b1759SClaudio Fontana /* 166*740b1759SClaudio Fontana * Correlation between real and virtual time is always going to be 167*740b1759SClaudio Fontana * fairly approximate, so ignore small variation. 168*740b1759SClaudio Fontana * When the guest is idle real and virtual time will be aligned in 169*740b1759SClaudio Fontana * the IO wait loop. 170*740b1759SClaudio Fontana */ 171*740b1759SClaudio Fontana #define ICOUNT_WOBBLE (NANOSECONDS_PER_SECOND / 10) 172*740b1759SClaudio Fontana 173*740b1759SClaudio Fontana static void icount_adjust(void) 174*740b1759SClaudio Fontana { 175*740b1759SClaudio Fontana int64_t cur_time; 176*740b1759SClaudio Fontana int64_t cur_icount; 177*740b1759SClaudio Fontana int64_t delta; 178*740b1759SClaudio Fontana 179*740b1759SClaudio Fontana /* Protected by TimersState mutex. */ 180*740b1759SClaudio Fontana static int64_t last_delta; 181*740b1759SClaudio Fontana 182*740b1759SClaudio Fontana /* If the VM is not running, then do nothing. */ 183*740b1759SClaudio Fontana if (!runstate_is_running()) { 184*740b1759SClaudio Fontana return; 185*740b1759SClaudio Fontana } 186*740b1759SClaudio Fontana 187*740b1759SClaudio Fontana seqlock_write_lock(&timers_state.vm_clock_seqlock, 188*740b1759SClaudio Fontana &timers_state.vm_clock_lock); 189*740b1759SClaudio Fontana cur_time = REPLAY_CLOCK_LOCKED(REPLAY_CLOCK_VIRTUAL_RT, 190*740b1759SClaudio Fontana cpu_get_clock_locked()); 191*740b1759SClaudio Fontana cur_icount = cpu_get_icount_locked(); 192*740b1759SClaudio Fontana 193*740b1759SClaudio Fontana delta = cur_icount - cur_time; 194*740b1759SClaudio Fontana /* FIXME: This is a very crude algorithm, somewhat prone to oscillation. */ 195*740b1759SClaudio Fontana if (delta > 0 196*740b1759SClaudio Fontana && last_delta + ICOUNT_WOBBLE < delta * 2 197*740b1759SClaudio Fontana && timers_state.icount_time_shift > 0) { 198*740b1759SClaudio Fontana /* The guest is getting too far ahead. Slow time down. */ 199*740b1759SClaudio Fontana qatomic_set(&timers_state.icount_time_shift, 200*740b1759SClaudio Fontana timers_state.icount_time_shift - 1); 201*740b1759SClaudio Fontana } 202*740b1759SClaudio Fontana if (delta < 0 203*740b1759SClaudio Fontana && last_delta - ICOUNT_WOBBLE > delta * 2 204*740b1759SClaudio Fontana && timers_state.icount_time_shift < MAX_ICOUNT_SHIFT) { 205*740b1759SClaudio Fontana /* The guest is getting too far behind. Speed time up. */ 206*740b1759SClaudio Fontana qatomic_set(&timers_state.icount_time_shift, 207*740b1759SClaudio Fontana timers_state.icount_time_shift + 1); 208*740b1759SClaudio Fontana } 209*740b1759SClaudio Fontana last_delta = delta; 210*740b1759SClaudio Fontana qatomic_set_i64(&timers_state.qemu_icount_bias, 211*740b1759SClaudio Fontana cur_icount - (timers_state.qemu_icount 212*740b1759SClaudio Fontana << timers_state.icount_time_shift)); 213*740b1759SClaudio Fontana seqlock_write_unlock(&timers_state.vm_clock_seqlock, 214*740b1759SClaudio Fontana &timers_state.vm_clock_lock); 215*740b1759SClaudio Fontana } 216*740b1759SClaudio Fontana 217*740b1759SClaudio Fontana static void icount_adjust_rt(void *opaque) 218*740b1759SClaudio Fontana { 219*740b1759SClaudio Fontana timer_mod(timers_state.icount_rt_timer, 220*740b1759SClaudio Fontana qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT) + 1000); 221*740b1759SClaudio Fontana icount_adjust(); 222*740b1759SClaudio Fontana } 223*740b1759SClaudio Fontana 224*740b1759SClaudio Fontana static void icount_adjust_vm(void *opaque) 225*740b1759SClaudio Fontana { 226*740b1759SClaudio Fontana timer_mod(timers_state.icount_vm_timer, 227*740b1759SClaudio Fontana qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 228*740b1759SClaudio Fontana NANOSECONDS_PER_SECOND / 10); 229*740b1759SClaudio Fontana icount_adjust(); 230*740b1759SClaudio Fontana } 231*740b1759SClaudio Fontana 232*740b1759SClaudio Fontana int64_t qemu_icount_round(int64_t count) 233*740b1759SClaudio Fontana { 234*740b1759SClaudio Fontana int shift = qatomic_read(&timers_state.icount_time_shift); 235*740b1759SClaudio Fontana return (count + (1 << shift) - 1) >> shift; 236*740b1759SClaudio Fontana } 237*740b1759SClaudio Fontana 238*740b1759SClaudio Fontana static void icount_warp_rt(void) 239*740b1759SClaudio Fontana { 240*740b1759SClaudio Fontana unsigned seq; 241*740b1759SClaudio Fontana int64_t warp_start; 242*740b1759SClaudio Fontana 243*740b1759SClaudio Fontana /* 244*740b1759SClaudio Fontana * The icount_warp_timer is rescheduled soon after vm_clock_warp_start 245*740b1759SClaudio Fontana * changes from -1 to another value, so the race here is okay. 246*740b1759SClaudio Fontana */ 247*740b1759SClaudio Fontana do { 248*740b1759SClaudio Fontana seq = seqlock_read_begin(&timers_state.vm_clock_seqlock); 249*740b1759SClaudio Fontana warp_start = timers_state.vm_clock_warp_start; 250*740b1759SClaudio Fontana } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, seq)); 251*740b1759SClaudio Fontana 252*740b1759SClaudio Fontana if (warp_start == -1) { 253*740b1759SClaudio Fontana return; 254*740b1759SClaudio Fontana } 255*740b1759SClaudio Fontana 256*740b1759SClaudio Fontana seqlock_write_lock(&timers_state.vm_clock_seqlock, 257*740b1759SClaudio Fontana &timers_state.vm_clock_lock); 258*740b1759SClaudio Fontana if (runstate_is_running()) { 259*740b1759SClaudio Fontana int64_t clock = REPLAY_CLOCK_LOCKED(REPLAY_CLOCK_VIRTUAL_RT, 260*740b1759SClaudio Fontana cpu_get_clock_locked()); 261*740b1759SClaudio Fontana int64_t warp_delta; 262*740b1759SClaudio Fontana 263*740b1759SClaudio Fontana warp_delta = clock - timers_state.vm_clock_warp_start; 264*740b1759SClaudio Fontana if (icount_enabled() == 2) { 265*740b1759SClaudio Fontana /* 266*740b1759SClaudio Fontana * In adaptive mode, do not let QEMU_CLOCK_VIRTUAL run too 267*740b1759SClaudio Fontana * far ahead of real time. 268*740b1759SClaudio Fontana */ 269*740b1759SClaudio Fontana int64_t cur_icount = cpu_get_icount_locked(); 270*740b1759SClaudio Fontana int64_t delta = clock - cur_icount; 271*740b1759SClaudio Fontana warp_delta = MIN(warp_delta, delta); 272*740b1759SClaudio Fontana } 273*740b1759SClaudio Fontana qatomic_set_i64(&timers_state.qemu_icount_bias, 274*740b1759SClaudio Fontana timers_state.qemu_icount_bias + warp_delta); 275*740b1759SClaudio Fontana } 276*740b1759SClaudio Fontana timers_state.vm_clock_warp_start = -1; 277*740b1759SClaudio Fontana seqlock_write_unlock(&timers_state.vm_clock_seqlock, 278*740b1759SClaudio Fontana &timers_state.vm_clock_lock); 279*740b1759SClaudio Fontana 280*740b1759SClaudio Fontana if (qemu_clock_expired(QEMU_CLOCK_VIRTUAL)) { 281*740b1759SClaudio Fontana qemu_clock_notify(QEMU_CLOCK_VIRTUAL); 282*740b1759SClaudio Fontana } 283*740b1759SClaudio Fontana } 284*740b1759SClaudio Fontana 285*740b1759SClaudio Fontana static void icount_timer_cb(void *opaque) 286*740b1759SClaudio Fontana { 287*740b1759SClaudio Fontana /* 288*740b1759SClaudio Fontana * No need for a checkpoint because the timer already synchronizes 289*740b1759SClaudio Fontana * with CHECKPOINT_CLOCK_VIRTUAL_RT. 290*740b1759SClaudio Fontana */ 291*740b1759SClaudio Fontana icount_warp_rt(); 292*740b1759SClaudio Fontana } 293*740b1759SClaudio Fontana 294*740b1759SClaudio Fontana void qemu_start_warp_timer(void) 295*740b1759SClaudio Fontana { 296*740b1759SClaudio Fontana int64_t clock; 297*740b1759SClaudio Fontana int64_t deadline; 298*740b1759SClaudio Fontana 299*740b1759SClaudio Fontana assert(icount_enabled()); 300*740b1759SClaudio Fontana 301*740b1759SClaudio Fontana /* 302*740b1759SClaudio Fontana * Nothing to do if the VM is stopped: QEMU_CLOCK_VIRTUAL timers 303*740b1759SClaudio Fontana * do not fire, so computing the deadline does not make sense. 304*740b1759SClaudio Fontana */ 305*740b1759SClaudio Fontana if (!runstate_is_running()) { 306*740b1759SClaudio Fontana return; 307*740b1759SClaudio Fontana } 308*740b1759SClaudio Fontana 309*740b1759SClaudio Fontana if (replay_mode != REPLAY_MODE_PLAY) { 310*740b1759SClaudio Fontana if (!all_cpu_threads_idle()) { 311*740b1759SClaudio Fontana return; 312*740b1759SClaudio Fontana } 313*740b1759SClaudio Fontana 314*740b1759SClaudio Fontana if (qtest_enabled()) { 315*740b1759SClaudio Fontana /* When testing, qtest commands advance icount. */ 316*740b1759SClaudio Fontana return; 317*740b1759SClaudio Fontana } 318*740b1759SClaudio Fontana 319*740b1759SClaudio Fontana replay_checkpoint(CHECKPOINT_CLOCK_WARP_START); 320*740b1759SClaudio Fontana } else { 321*740b1759SClaudio Fontana /* warp clock deterministically in record/replay mode */ 322*740b1759SClaudio Fontana if (!replay_checkpoint(CHECKPOINT_CLOCK_WARP_START)) { 323*740b1759SClaudio Fontana /* 324*740b1759SClaudio Fontana * vCPU is sleeping and warp can't be started. 325*740b1759SClaudio Fontana * It is probably a race condition: notification sent 326*740b1759SClaudio Fontana * to vCPU was processed in advance and vCPU went to sleep. 327*740b1759SClaudio Fontana * Therefore we have to wake it up for doing someting. 328*740b1759SClaudio Fontana */ 329*740b1759SClaudio Fontana if (replay_has_checkpoint()) { 330*740b1759SClaudio Fontana qemu_clock_notify(QEMU_CLOCK_VIRTUAL); 331*740b1759SClaudio Fontana } 332*740b1759SClaudio Fontana return; 333*740b1759SClaudio Fontana } 334*740b1759SClaudio Fontana } 335*740b1759SClaudio Fontana 336*740b1759SClaudio Fontana /* We want to use the earliest deadline from ALL vm_clocks */ 337*740b1759SClaudio Fontana clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT); 338*740b1759SClaudio Fontana deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL, 339*740b1759SClaudio Fontana ~QEMU_TIMER_ATTR_EXTERNAL); 340*740b1759SClaudio Fontana if (deadline < 0) { 341*740b1759SClaudio Fontana static bool notified; 342*740b1759SClaudio Fontana if (!icount_sleep && !notified) { 343*740b1759SClaudio Fontana warn_report("icount sleep disabled and no active timers"); 344*740b1759SClaudio Fontana notified = true; 345*740b1759SClaudio Fontana } 346*740b1759SClaudio Fontana return; 347*740b1759SClaudio Fontana } 348*740b1759SClaudio Fontana 349*740b1759SClaudio Fontana if (deadline > 0) { 350*740b1759SClaudio Fontana /* 351*740b1759SClaudio Fontana * Ensure QEMU_CLOCK_VIRTUAL proceeds even when the virtual CPU goes to 352*740b1759SClaudio Fontana * sleep. Otherwise, the CPU might be waiting for a future timer 353*740b1759SClaudio Fontana * interrupt to wake it up, but the interrupt never comes because 354*740b1759SClaudio Fontana * the vCPU isn't running any insns and thus doesn't advance the 355*740b1759SClaudio Fontana * QEMU_CLOCK_VIRTUAL. 356*740b1759SClaudio Fontana */ 357*740b1759SClaudio Fontana if (!icount_sleep) { 358*740b1759SClaudio Fontana /* 359*740b1759SClaudio Fontana * We never let VCPUs sleep in no sleep icount mode. 360*740b1759SClaudio Fontana * If there is a pending QEMU_CLOCK_VIRTUAL timer we just advance 361*740b1759SClaudio Fontana * to the next QEMU_CLOCK_VIRTUAL event and notify it. 362*740b1759SClaudio Fontana * It is useful when we want a deterministic execution time, 363*740b1759SClaudio Fontana * isolated from host latencies. 364*740b1759SClaudio Fontana */ 365*740b1759SClaudio Fontana seqlock_write_lock(&timers_state.vm_clock_seqlock, 366*740b1759SClaudio Fontana &timers_state.vm_clock_lock); 367*740b1759SClaudio Fontana qatomic_set_i64(&timers_state.qemu_icount_bias, 368*740b1759SClaudio Fontana timers_state.qemu_icount_bias + deadline); 369*740b1759SClaudio Fontana seqlock_write_unlock(&timers_state.vm_clock_seqlock, 370*740b1759SClaudio Fontana &timers_state.vm_clock_lock); 371*740b1759SClaudio Fontana qemu_clock_notify(QEMU_CLOCK_VIRTUAL); 372*740b1759SClaudio Fontana } else { 373*740b1759SClaudio Fontana /* 374*740b1759SClaudio Fontana * We do stop VCPUs and only advance QEMU_CLOCK_VIRTUAL after some 375*740b1759SClaudio Fontana * "real" time, (related to the time left until the next event) has 376*740b1759SClaudio Fontana * passed. The QEMU_CLOCK_VIRTUAL_RT clock will do this. 377*740b1759SClaudio Fontana * This avoids that the warps are visible externally; for example, 378*740b1759SClaudio Fontana * you will not be sending network packets continuously instead of 379*740b1759SClaudio Fontana * every 100ms. 380*740b1759SClaudio Fontana */ 381*740b1759SClaudio Fontana seqlock_write_lock(&timers_state.vm_clock_seqlock, 382*740b1759SClaudio Fontana &timers_state.vm_clock_lock); 383*740b1759SClaudio Fontana if (timers_state.vm_clock_warp_start == -1 384*740b1759SClaudio Fontana || timers_state.vm_clock_warp_start > clock) { 385*740b1759SClaudio Fontana timers_state.vm_clock_warp_start = clock; 386*740b1759SClaudio Fontana } 387*740b1759SClaudio Fontana seqlock_write_unlock(&timers_state.vm_clock_seqlock, 388*740b1759SClaudio Fontana &timers_state.vm_clock_lock); 389*740b1759SClaudio Fontana timer_mod_anticipate(timers_state.icount_warp_timer, 390*740b1759SClaudio Fontana clock + deadline); 391*740b1759SClaudio Fontana } 392*740b1759SClaudio Fontana } else if (deadline == 0) { 393*740b1759SClaudio Fontana qemu_clock_notify(QEMU_CLOCK_VIRTUAL); 394*740b1759SClaudio Fontana } 395*740b1759SClaudio Fontana } 396*740b1759SClaudio Fontana 397*740b1759SClaudio Fontana void qemu_account_warp_timer(void) 398*740b1759SClaudio Fontana { 399*740b1759SClaudio Fontana if (!icount_enabled() || !icount_sleep) { 400*740b1759SClaudio Fontana return; 401*740b1759SClaudio Fontana } 402*740b1759SClaudio Fontana 403*740b1759SClaudio Fontana /* 404*740b1759SClaudio Fontana * Nothing to do if the VM is stopped: QEMU_CLOCK_VIRTUAL timers 405*740b1759SClaudio Fontana * do not fire, so computing the deadline does not make sense. 406*740b1759SClaudio Fontana */ 407*740b1759SClaudio Fontana if (!runstate_is_running()) { 408*740b1759SClaudio Fontana return; 409*740b1759SClaudio Fontana } 410*740b1759SClaudio Fontana 411*740b1759SClaudio Fontana /* warp clock deterministically in record/replay mode */ 412*740b1759SClaudio Fontana if (!replay_checkpoint(CHECKPOINT_CLOCK_WARP_ACCOUNT)) { 413*740b1759SClaudio Fontana return; 414*740b1759SClaudio Fontana } 415*740b1759SClaudio Fontana 416*740b1759SClaudio Fontana timer_del(timers_state.icount_warp_timer); 417*740b1759SClaudio Fontana icount_warp_rt(); 418*740b1759SClaudio Fontana } 419*740b1759SClaudio Fontana 420*740b1759SClaudio Fontana void configure_icount(QemuOpts *opts, Error **errp) 421*740b1759SClaudio Fontana { 422*740b1759SClaudio Fontana const char *option = qemu_opt_get(opts, "shift"); 423*740b1759SClaudio Fontana bool sleep = qemu_opt_get_bool(opts, "sleep", true); 424*740b1759SClaudio Fontana bool align = qemu_opt_get_bool(opts, "align", false); 425*740b1759SClaudio Fontana long time_shift = -1; 426*740b1759SClaudio Fontana 427*740b1759SClaudio Fontana if (!option) { 428*740b1759SClaudio Fontana if (qemu_opt_get(opts, "align") != NULL) { 429*740b1759SClaudio Fontana error_setg(errp, "Please specify shift option when using align"); 430*740b1759SClaudio Fontana } 431*740b1759SClaudio Fontana return; 432*740b1759SClaudio Fontana } 433*740b1759SClaudio Fontana 434*740b1759SClaudio Fontana if (align && !sleep) { 435*740b1759SClaudio Fontana error_setg(errp, "align=on and sleep=off are incompatible"); 436*740b1759SClaudio Fontana return; 437*740b1759SClaudio Fontana } 438*740b1759SClaudio Fontana 439*740b1759SClaudio Fontana if (strcmp(option, "auto") != 0) { 440*740b1759SClaudio Fontana if (qemu_strtol(option, NULL, 0, &time_shift) < 0 441*740b1759SClaudio Fontana || time_shift < 0 || time_shift > MAX_ICOUNT_SHIFT) { 442*740b1759SClaudio Fontana error_setg(errp, "icount: Invalid shift value"); 443*740b1759SClaudio Fontana return; 444*740b1759SClaudio Fontana } 445*740b1759SClaudio Fontana } else if (icount_align_option) { 446*740b1759SClaudio Fontana error_setg(errp, "shift=auto and align=on are incompatible"); 447*740b1759SClaudio Fontana return; 448*740b1759SClaudio Fontana } else if (!icount_sleep) { 449*740b1759SClaudio Fontana error_setg(errp, "shift=auto and sleep=off are incompatible"); 450*740b1759SClaudio Fontana return; 451*740b1759SClaudio Fontana } 452*740b1759SClaudio Fontana 453*740b1759SClaudio Fontana icount_sleep = sleep; 454*740b1759SClaudio Fontana if (icount_sleep) { 455*740b1759SClaudio Fontana timers_state.icount_warp_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL_RT, 456*740b1759SClaudio Fontana icount_timer_cb, NULL); 457*740b1759SClaudio Fontana } 458*740b1759SClaudio Fontana 459*740b1759SClaudio Fontana icount_align_option = align; 460*740b1759SClaudio Fontana 461*740b1759SClaudio Fontana if (time_shift >= 0) { 462*740b1759SClaudio Fontana timers_state.icount_time_shift = time_shift; 463*740b1759SClaudio Fontana icount_enable_precise(); 464*740b1759SClaudio Fontana return; 465*740b1759SClaudio Fontana } 466*740b1759SClaudio Fontana 467*740b1759SClaudio Fontana icount_enable_adaptive(); 468*740b1759SClaudio Fontana 469*740b1759SClaudio Fontana /* 470*740b1759SClaudio Fontana * 125MIPS seems a reasonable initial guess at the guest speed. 471*740b1759SClaudio Fontana * It will be corrected fairly quickly anyway. 472*740b1759SClaudio Fontana */ 473*740b1759SClaudio Fontana timers_state.icount_time_shift = 3; 474*740b1759SClaudio Fontana 475*740b1759SClaudio Fontana /* 476*740b1759SClaudio Fontana * Have both realtime and virtual time triggers for speed adjustment. 477*740b1759SClaudio Fontana * The realtime trigger catches emulated time passing too slowly, 478*740b1759SClaudio Fontana * the virtual time trigger catches emulated time passing too fast. 479*740b1759SClaudio Fontana * Realtime triggers occur even when idle, so use them less frequently 480*740b1759SClaudio Fontana * than VM triggers. 481*740b1759SClaudio Fontana */ 482*740b1759SClaudio Fontana timers_state.vm_clock_warp_start = -1; 483*740b1759SClaudio Fontana timers_state.icount_rt_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL_RT, 484*740b1759SClaudio Fontana icount_adjust_rt, NULL); 485*740b1759SClaudio Fontana timer_mod(timers_state.icount_rt_timer, 486*740b1759SClaudio Fontana qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT) + 1000); 487*740b1759SClaudio Fontana timers_state.icount_vm_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, 488*740b1759SClaudio Fontana icount_adjust_vm, NULL); 489*740b1759SClaudio Fontana timer_mod(timers_state.icount_vm_timer, 490*740b1759SClaudio Fontana qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 491*740b1759SClaudio Fontana NANOSECONDS_PER_SECOND / 10); 492*740b1759SClaudio Fontana } 493