1740b1759SClaudio Fontana /* 2740b1759SClaudio Fontana * QEMU System Emulator 3740b1759SClaudio Fontana * 4740b1759SClaudio Fontana * Copyright (c) 2003-2008 Fabrice Bellard 5740b1759SClaudio Fontana * 6740b1759SClaudio Fontana * Permission is hereby granted, free of charge, to any person obtaining a copy 7740b1759SClaudio Fontana * of this software and associated documentation files (the "Software"), to deal 8740b1759SClaudio Fontana * in the Software without restriction, including without limitation the rights 9740b1759SClaudio Fontana * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10740b1759SClaudio Fontana * copies of the Software, and to permit persons to whom the Software is 11740b1759SClaudio Fontana * furnished to do so, subject to the following conditions: 12740b1759SClaudio Fontana * 13740b1759SClaudio Fontana * The above copyright notice and this permission notice shall be included in 14740b1759SClaudio Fontana * all copies or substantial portions of the Software. 15740b1759SClaudio Fontana * 16740b1759SClaudio Fontana * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17740b1759SClaudio Fontana * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18740b1759SClaudio Fontana * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19740b1759SClaudio Fontana * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20740b1759SClaudio Fontana * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21740b1759SClaudio Fontana * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22740b1759SClaudio Fontana * THE SOFTWARE. 23740b1759SClaudio Fontana */ 24740b1759SClaudio Fontana 25740b1759SClaudio Fontana #include "qemu/osdep.h" 26740b1759SClaudio Fontana #include "qemu/cutils.h" 27740b1759SClaudio Fontana #include "migration/vmstate.h" 28740b1759SClaudio Fontana #include "qapi/error.h" 29740b1759SClaudio Fontana #include "qemu/error-report.h" 30740b1759SClaudio Fontana #include "sysemu/cpus.h" 31740b1759SClaudio Fontana #include "sysemu/qtest.h" 32740b1759SClaudio Fontana #include "qemu/main-loop.h" 33740b1759SClaudio Fontana #include "qemu/option.h" 34740b1759SClaudio Fontana #include "qemu/seqlock.h" 35740b1759SClaudio Fontana #include "sysemu/replay.h" 36740b1759SClaudio Fontana #include "sysemu/runstate.h" 37740b1759SClaudio Fontana #include "hw/core/cpu.h" 38740b1759SClaudio Fontana #include "sysemu/cpu-timers.h" 39740b1759SClaudio Fontana #include "sysemu/cpu-throttle.h" 40*8d7f2e76SPhilippe Mathieu-Daudé #include "sysemu/cpu-timers-internal.h" 41740b1759SClaudio Fontana 42740b1759SClaudio Fontana /* 43740b1759SClaudio Fontana * ICOUNT: Instruction Counter 44740b1759SClaudio Fontana * 45740b1759SClaudio Fontana * this module is split off from cpu-timers because the icount part 46740b1759SClaudio Fontana * is TCG-specific, and does not need to be built for other accels. 47740b1759SClaudio Fontana */ 48740b1759SClaudio Fontana static bool icount_sleep = true; 49740b1759SClaudio Fontana /* Arbitrarily pick 1MIPS as the minimum allowable speed. */ 50740b1759SClaudio Fontana #define MAX_ICOUNT_SHIFT 10 51740b1759SClaudio Fontana 52740b1759SClaudio Fontana /* 53740b1759SClaudio Fontana * 0 = Do not count executed instructions. 54740b1759SClaudio Fontana * 1 = Fixed conversion of insn to ns via "shift" option 55740b1759SClaudio Fontana * 2 = Runtime adaptive algorithm to compute shift 56740b1759SClaudio Fontana */ 57740b1759SClaudio Fontana int use_icount; 58740b1759SClaudio Fontana 59740b1759SClaudio Fontana static void icount_enable_precise(void) 60740b1759SClaudio Fontana { 61740b1759SClaudio Fontana use_icount = 1; 62740b1759SClaudio Fontana } 63740b1759SClaudio Fontana 64740b1759SClaudio Fontana static void icount_enable_adaptive(void) 65740b1759SClaudio Fontana { 66740b1759SClaudio Fontana use_icount = 2; 67740b1759SClaudio Fontana } 68740b1759SClaudio Fontana 69740b1759SClaudio Fontana /* 70740b1759SClaudio Fontana * The current number of executed instructions is based on what we 71740b1759SClaudio Fontana * originally budgeted minus the current state of the decrementing 72740b1759SClaudio Fontana * icount counters in extra/u16.low. 73740b1759SClaudio Fontana */ 748191d368SClaudio Fontana static int64_t icount_get_executed(CPUState *cpu) 75740b1759SClaudio Fontana { 76740b1759SClaudio Fontana return (cpu->icount_budget - 77a953b5faSRichard Henderson (cpu->neg.icount_decr.u16.low + cpu->icount_extra)); 78740b1759SClaudio Fontana } 79740b1759SClaudio Fontana 80740b1759SClaudio Fontana /* 81740b1759SClaudio Fontana * Update the global shared timer_state.qemu_icount to take into 82740b1759SClaudio Fontana * account executed instructions. This is done by the TCG vCPU 83740b1759SClaudio Fontana * thread so the main-loop can see time has moved forward. 84740b1759SClaudio Fontana */ 858191d368SClaudio Fontana static void icount_update_locked(CPUState *cpu) 86740b1759SClaudio Fontana { 878191d368SClaudio Fontana int64_t executed = icount_get_executed(cpu); 88740b1759SClaudio Fontana cpu->icount_budget -= executed; 89740b1759SClaudio Fontana 90740b1759SClaudio Fontana qatomic_set_i64(&timers_state.qemu_icount, 91740b1759SClaudio Fontana timers_state.qemu_icount + executed); 92740b1759SClaudio Fontana } 93740b1759SClaudio Fontana 94740b1759SClaudio Fontana /* 95740b1759SClaudio Fontana * Update the global shared timer_state.qemu_icount to take into 96740b1759SClaudio Fontana * account executed instructions. This is done by the TCG vCPU 97740b1759SClaudio Fontana * thread so the main-loop can see time has moved forward. 98740b1759SClaudio Fontana */ 998191d368SClaudio Fontana void icount_update(CPUState *cpu) 100740b1759SClaudio Fontana { 101740b1759SClaudio Fontana seqlock_write_lock(&timers_state.vm_clock_seqlock, 102740b1759SClaudio Fontana &timers_state.vm_clock_lock); 1038191d368SClaudio Fontana icount_update_locked(cpu); 104740b1759SClaudio Fontana seqlock_write_unlock(&timers_state.vm_clock_seqlock, 105740b1759SClaudio Fontana &timers_state.vm_clock_lock); 106740b1759SClaudio Fontana } 107740b1759SClaudio Fontana 1088191d368SClaudio Fontana static int64_t icount_get_raw_locked(void) 109740b1759SClaudio Fontana { 110740b1759SClaudio Fontana CPUState *cpu = current_cpu; 111740b1759SClaudio Fontana 112740b1759SClaudio Fontana if (cpu && cpu->running) { 113464dacf6SRichard Henderson if (!cpu->neg.can_do_io) { 114740b1759SClaudio Fontana error_report("Bad icount read"); 115740b1759SClaudio Fontana exit(1); 116740b1759SClaudio Fontana } 117740b1759SClaudio Fontana /* Take into account what has run */ 1188191d368SClaudio Fontana icount_update_locked(cpu); 119740b1759SClaudio Fontana } 120740b1759SClaudio Fontana /* The read is protected by the seqlock, but needs atomic64 to avoid UB */ 121740b1759SClaudio Fontana return qatomic_read_i64(&timers_state.qemu_icount); 122740b1759SClaudio Fontana } 123740b1759SClaudio Fontana 1248191d368SClaudio Fontana static int64_t icount_get_locked(void) 125740b1759SClaudio Fontana { 1268191d368SClaudio Fontana int64_t icount = icount_get_raw_locked(); 127740b1759SClaudio Fontana return qatomic_read_i64(&timers_state.qemu_icount_bias) + 1288191d368SClaudio Fontana icount_to_ns(icount); 129740b1759SClaudio Fontana } 130740b1759SClaudio Fontana 1318191d368SClaudio Fontana int64_t icount_get_raw(void) 132740b1759SClaudio Fontana { 133740b1759SClaudio Fontana int64_t icount; 134740b1759SClaudio Fontana unsigned start; 135740b1759SClaudio Fontana 136740b1759SClaudio Fontana do { 137740b1759SClaudio Fontana start = seqlock_read_begin(&timers_state.vm_clock_seqlock); 1388191d368SClaudio Fontana icount = icount_get_raw_locked(); 139740b1759SClaudio Fontana } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start)); 140740b1759SClaudio Fontana 141740b1759SClaudio Fontana return icount; 142740b1759SClaudio Fontana } 143740b1759SClaudio Fontana 144740b1759SClaudio Fontana /* Return the virtual CPU time, based on the instruction counter. */ 1458191d368SClaudio Fontana int64_t icount_get(void) 146740b1759SClaudio Fontana { 147740b1759SClaudio Fontana int64_t icount; 148740b1759SClaudio Fontana unsigned start; 149740b1759SClaudio Fontana 150740b1759SClaudio Fontana do { 151740b1759SClaudio Fontana start = seqlock_read_begin(&timers_state.vm_clock_seqlock); 1528191d368SClaudio Fontana icount = icount_get_locked(); 153740b1759SClaudio Fontana } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start)); 154740b1759SClaudio Fontana 155740b1759SClaudio Fontana return icount; 156740b1759SClaudio Fontana } 157740b1759SClaudio Fontana 1588191d368SClaudio Fontana int64_t icount_to_ns(int64_t icount) 159740b1759SClaudio Fontana { 160740b1759SClaudio Fontana return icount << qatomic_read(&timers_state.icount_time_shift); 161740b1759SClaudio Fontana } 162740b1759SClaudio Fontana 163740b1759SClaudio Fontana /* 164740b1759SClaudio Fontana * Correlation between real and virtual time is always going to be 165740b1759SClaudio Fontana * fairly approximate, so ignore small variation. 166740b1759SClaudio Fontana * When the guest is idle real and virtual time will be aligned in 167740b1759SClaudio Fontana * the IO wait loop. 168740b1759SClaudio Fontana */ 169740b1759SClaudio Fontana #define ICOUNT_WOBBLE (NANOSECONDS_PER_SECOND / 10) 170740b1759SClaudio Fontana 171740b1759SClaudio Fontana static void icount_adjust(void) 172740b1759SClaudio Fontana { 173740b1759SClaudio Fontana int64_t cur_time; 174740b1759SClaudio Fontana int64_t cur_icount; 175740b1759SClaudio Fontana int64_t delta; 176740b1759SClaudio Fontana 177740b1759SClaudio Fontana /* If the VM is not running, then do nothing. */ 178740b1759SClaudio Fontana if (!runstate_is_running()) { 179740b1759SClaudio Fontana return; 180740b1759SClaudio Fontana } 181740b1759SClaudio Fontana 182740b1759SClaudio Fontana seqlock_write_lock(&timers_state.vm_clock_seqlock, 183740b1759SClaudio Fontana &timers_state.vm_clock_lock); 184740b1759SClaudio Fontana cur_time = REPLAY_CLOCK_LOCKED(REPLAY_CLOCK_VIRTUAL_RT, 185740b1759SClaudio Fontana cpu_get_clock_locked()); 1868191d368SClaudio Fontana cur_icount = icount_get_locked(); 187740b1759SClaudio Fontana 188740b1759SClaudio Fontana delta = cur_icount - cur_time; 189740b1759SClaudio Fontana /* FIXME: This is a very crude algorithm, somewhat prone to oscillation. */ 190740b1759SClaudio Fontana if (delta > 0 191fe852ac2SPavel Dovgalyuk && timers_state.last_delta + ICOUNT_WOBBLE < delta * 2 192740b1759SClaudio Fontana && timers_state.icount_time_shift > 0) { 193740b1759SClaudio Fontana /* The guest is getting too far ahead. Slow time down. */ 194740b1759SClaudio Fontana qatomic_set(&timers_state.icount_time_shift, 195740b1759SClaudio Fontana timers_state.icount_time_shift - 1); 196740b1759SClaudio Fontana } 197740b1759SClaudio Fontana if (delta < 0 198fe852ac2SPavel Dovgalyuk && timers_state.last_delta - ICOUNT_WOBBLE > delta * 2 199740b1759SClaudio Fontana && timers_state.icount_time_shift < MAX_ICOUNT_SHIFT) { 200740b1759SClaudio Fontana /* The guest is getting too far behind. Speed time up. */ 201740b1759SClaudio Fontana qatomic_set(&timers_state.icount_time_shift, 202740b1759SClaudio Fontana timers_state.icount_time_shift + 1); 203740b1759SClaudio Fontana } 204fe852ac2SPavel Dovgalyuk timers_state.last_delta = delta; 205740b1759SClaudio Fontana qatomic_set_i64(&timers_state.qemu_icount_bias, 206740b1759SClaudio Fontana cur_icount - (timers_state.qemu_icount 207740b1759SClaudio Fontana << timers_state.icount_time_shift)); 208740b1759SClaudio Fontana seqlock_write_unlock(&timers_state.vm_clock_seqlock, 209740b1759SClaudio Fontana &timers_state.vm_clock_lock); 210740b1759SClaudio Fontana } 211740b1759SClaudio Fontana 212740b1759SClaudio Fontana static void icount_adjust_rt(void *opaque) 213740b1759SClaudio Fontana { 214740b1759SClaudio Fontana timer_mod(timers_state.icount_rt_timer, 215740b1759SClaudio Fontana qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT) + 1000); 216740b1759SClaudio Fontana icount_adjust(); 217740b1759SClaudio Fontana } 218740b1759SClaudio Fontana 219740b1759SClaudio Fontana static void icount_adjust_vm(void *opaque) 220740b1759SClaudio Fontana { 221740b1759SClaudio Fontana timer_mod(timers_state.icount_vm_timer, 222740b1759SClaudio Fontana qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 223740b1759SClaudio Fontana NANOSECONDS_PER_SECOND / 10); 224740b1759SClaudio Fontana icount_adjust(); 225740b1759SClaudio Fontana } 226740b1759SClaudio Fontana 2278191d368SClaudio Fontana int64_t icount_round(int64_t count) 228740b1759SClaudio Fontana { 229740b1759SClaudio Fontana int shift = qatomic_read(&timers_state.icount_time_shift); 230740b1759SClaudio Fontana return (count + (1 << shift) - 1) >> shift; 231740b1759SClaudio Fontana } 232740b1759SClaudio Fontana 233740b1759SClaudio Fontana static void icount_warp_rt(void) 234740b1759SClaudio Fontana { 235740b1759SClaudio Fontana unsigned seq; 236740b1759SClaudio Fontana int64_t warp_start; 237740b1759SClaudio Fontana 238740b1759SClaudio Fontana /* 239740b1759SClaudio Fontana * The icount_warp_timer is rescheduled soon after vm_clock_warp_start 240740b1759SClaudio Fontana * changes from -1 to another value, so the race here is okay. 241740b1759SClaudio Fontana */ 242740b1759SClaudio Fontana do { 243740b1759SClaudio Fontana seq = seqlock_read_begin(&timers_state.vm_clock_seqlock); 244740b1759SClaudio Fontana warp_start = timers_state.vm_clock_warp_start; 245740b1759SClaudio Fontana } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, seq)); 246740b1759SClaudio Fontana 247740b1759SClaudio Fontana if (warp_start == -1) { 248740b1759SClaudio Fontana return; 249740b1759SClaudio Fontana } 250740b1759SClaudio Fontana 251740b1759SClaudio Fontana seqlock_write_lock(&timers_state.vm_clock_seqlock, 252740b1759SClaudio Fontana &timers_state.vm_clock_lock); 253740b1759SClaudio Fontana if (runstate_is_running()) { 254740b1759SClaudio Fontana int64_t clock = REPLAY_CLOCK_LOCKED(REPLAY_CLOCK_VIRTUAL_RT, 255740b1759SClaudio Fontana cpu_get_clock_locked()); 256740b1759SClaudio Fontana int64_t warp_delta; 257740b1759SClaudio Fontana 258740b1759SClaudio Fontana warp_delta = clock - timers_state.vm_clock_warp_start; 259740b1759SClaudio Fontana if (icount_enabled() == 2) { 260740b1759SClaudio Fontana /* 26167f85346SNicholas Piggin * In adaptive mode, do not let QEMU_CLOCK_VIRTUAL run too far 26267f85346SNicholas Piggin * ahead of real time (it might already be ahead so careful not 26367f85346SNicholas Piggin * to go backwards). 264740b1759SClaudio Fontana */ 2658191d368SClaudio Fontana int64_t cur_icount = icount_get_locked(); 266740b1759SClaudio Fontana int64_t delta = clock - cur_icount; 26767f85346SNicholas Piggin 26867f85346SNicholas Piggin if (delta < 0) { 26967f85346SNicholas Piggin delta = 0; 27067f85346SNicholas Piggin } 271740b1759SClaudio Fontana warp_delta = MIN(warp_delta, delta); 272740b1759SClaudio Fontana } 273740b1759SClaudio Fontana qatomic_set_i64(&timers_state.qemu_icount_bias, 274740b1759SClaudio Fontana timers_state.qemu_icount_bias + warp_delta); 275740b1759SClaudio Fontana } 276740b1759SClaudio Fontana timers_state.vm_clock_warp_start = -1; 277740b1759SClaudio Fontana seqlock_write_unlock(&timers_state.vm_clock_seqlock, 278740b1759SClaudio Fontana &timers_state.vm_clock_lock); 279740b1759SClaudio Fontana 280740b1759SClaudio Fontana if (qemu_clock_expired(QEMU_CLOCK_VIRTUAL)) { 281740b1759SClaudio Fontana qemu_clock_notify(QEMU_CLOCK_VIRTUAL); 282740b1759SClaudio Fontana } 283740b1759SClaudio Fontana } 284740b1759SClaudio Fontana 285740b1759SClaudio Fontana static void icount_timer_cb(void *opaque) 286740b1759SClaudio Fontana { 287740b1759SClaudio Fontana /* 288740b1759SClaudio Fontana * No need for a checkpoint because the timer already synchronizes 289740b1759SClaudio Fontana * with CHECKPOINT_CLOCK_VIRTUAL_RT. 290740b1759SClaudio Fontana */ 291740b1759SClaudio Fontana icount_warp_rt(); 292740b1759SClaudio Fontana } 293740b1759SClaudio Fontana 2948191d368SClaudio Fontana void icount_start_warp_timer(void) 295740b1759SClaudio Fontana { 296740b1759SClaudio Fontana int64_t clock; 297740b1759SClaudio Fontana int64_t deadline; 298740b1759SClaudio Fontana 299740b1759SClaudio Fontana assert(icount_enabled()); 300740b1759SClaudio Fontana 301740b1759SClaudio Fontana /* 302740b1759SClaudio Fontana * Nothing to do if the VM is stopped: QEMU_CLOCK_VIRTUAL timers 303740b1759SClaudio Fontana * do not fire, so computing the deadline does not make sense. 304740b1759SClaudio Fontana */ 305740b1759SClaudio Fontana if (!runstate_is_running()) { 306740b1759SClaudio Fontana return; 307740b1759SClaudio Fontana } 308740b1759SClaudio Fontana 309740b1759SClaudio Fontana if (replay_mode != REPLAY_MODE_PLAY) { 310740b1759SClaudio Fontana if (!all_cpu_threads_idle()) { 311740b1759SClaudio Fontana return; 312740b1759SClaudio Fontana } 313740b1759SClaudio Fontana 314740b1759SClaudio Fontana if (qtest_enabled()) { 315740b1759SClaudio Fontana /* When testing, qtest commands advance icount. */ 316740b1759SClaudio Fontana return; 317740b1759SClaudio Fontana } 318740b1759SClaudio Fontana 319740b1759SClaudio Fontana replay_checkpoint(CHECKPOINT_CLOCK_WARP_START); 320740b1759SClaudio Fontana } else { 321740b1759SClaudio Fontana /* warp clock deterministically in record/replay mode */ 322740b1759SClaudio Fontana if (!replay_checkpoint(CHECKPOINT_CLOCK_WARP_START)) { 323740b1759SClaudio Fontana /* 324740b1759SClaudio Fontana * vCPU is sleeping and warp can't be started. 325740b1759SClaudio Fontana * It is probably a race condition: notification sent 326740b1759SClaudio Fontana * to vCPU was processed in advance and vCPU went to sleep. 327669dcb60SMichael Tokarev * Therefore we have to wake it up for doing something. 328740b1759SClaudio Fontana */ 32960618e2dSPavel Dovgalyuk if (replay_has_event()) { 330740b1759SClaudio Fontana qemu_clock_notify(QEMU_CLOCK_VIRTUAL); 331740b1759SClaudio Fontana } 332740b1759SClaudio Fontana return; 333740b1759SClaudio Fontana } 334740b1759SClaudio Fontana } 335740b1759SClaudio Fontana 336740b1759SClaudio Fontana /* We want to use the earliest deadline from ALL vm_clocks */ 337740b1759SClaudio Fontana clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT); 338740b1759SClaudio Fontana deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL, 339740b1759SClaudio Fontana ~QEMU_TIMER_ATTR_EXTERNAL); 340740b1759SClaudio Fontana if (deadline < 0) { 341740b1759SClaudio Fontana static bool notified; 342740b1759SClaudio Fontana if (!icount_sleep && !notified) { 343740b1759SClaudio Fontana warn_report("icount sleep disabled and no active timers"); 344740b1759SClaudio Fontana notified = true; 345740b1759SClaudio Fontana } 346740b1759SClaudio Fontana return; 347740b1759SClaudio Fontana } 348740b1759SClaudio Fontana 349740b1759SClaudio Fontana if (deadline > 0) { 350740b1759SClaudio Fontana /* 351740b1759SClaudio Fontana * Ensure QEMU_CLOCK_VIRTUAL proceeds even when the virtual CPU goes to 352740b1759SClaudio Fontana * sleep. Otherwise, the CPU might be waiting for a future timer 353740b1759SClaudio Fontana * interrupt to wake it up, but the interrupt never comes because 354740b1759SClaudio Fontana * the vCPU isn't running any insns and thus doesn't advance the 355740b1759SClaudio Fontana * QEMU_CLOCK_VIRTUAL. 356740b1759SClaudio Fontana */ 357740b1759SClaudio Fontana if (!icount_sleep) { 358740b1759SClaudio Fontana /* 359740b1759SClaudio Fontana * We never let VCPUs sleep in no sleep icount mode. 360740b1759SClaudio Fontana * If there is a pending QEMU_CLOCK_VIRTUAL timer we just advance 361740b1759SClaudio Fontana * to the next QEMU_CLOCK_VIRTUAL event and notify it. 362740b1759SClaudio Fontana * It is useful when we want a deterministic execution time, 363740b1759SClaudio Fontana * isolated from host latencies. 364740b1759SClaudio Fontana */ 365740b1759SClaudio Fontana seqlock_write_lock(&timers_state.vm_clock_seqlock, 366740b1759SClaudio Fontana &timers_state.vm_clock_lock); 367740b1759SClaudio Fontana qatomic_set_i64(&timers_state.qemu_icount_bias, 368740b1759SClaudio Fontana timers_state.qemu_icount_bias + deadline); 369740b1759SClaudio Fontana seqlock_write_unlock(&timers_state.vm_clock_seqlock, 370740b1759SClaudio Fontana &timers_state.vm_clock_lock); 371740b1759SClaudio Fontana qemu_clock_notify(QEMU_CLOCK_VIRTUAL); 372740b1759SClaudio Fontana } else { 373740b1759SClaudio Fontana /* 374740b1759SClaudio Fontana * We do stop VCPUs and only advance QEMU_CLOCK_VIRTUAL after some 375740b1759SClaudio Fontana * "real" time, (related to the time left until the next event) has 376740b1759SClaudio Fontana * passed. The QEMU_CLOCK_VIRTUAL_RT clock will do this. 377740b1759SClaudio Fontana * This avoids that the warps are visible externally; for example, 378740b1759SClaudio Fontana * you will not be sending network packets continuously instead of 379740b1759SClaudio Fontana * every 100ms. 380740b1759SClaudio Fontana */ 381740b1759SClaudio Fontana seqlock_write_lock(&timers_state.vm_clock_seqlock, 382740b1759SClaudio Fontana &timers_state.vm_clock_lock); 383740b1759SClaudio Fontana if (timers_state.vm_clock_warp_start == -1 384740b1759SClaudio Fontana || timers_state.vm_clock_warp_start > clock) { 385740b1759SClaudio Fontana timers_state.vm_clock_warp_start = clock; 386740b1759SClaudio Fontana } 387740b1759SClaudio Fontana seqlock_write_unlock(&timers_state.vm_clock_seqlock, 388740b1759SClaudio Fontana &timers_state.vm_clock_lock); 389740b1759SClaudio Fontana timer_mod_anticipate(timers_state.icount_warp_timer, 390740b1759SClaudio Fontana clock + deadline); 391740b1759SClaudio Fontana } 392740b1759SClaudio Fontana } else if (deadline == 0) { 393740b1759SClaudio Fontana qemu_clock_notify(QEMU_CLOCK_VIRTUAL); 394740b1759SClaudio Fontana } 395740b1759SClaudio Fontana } 396740b1759SClaudio Fontana 3978191d368SClaudio Fontana void icount_account_warp_timer(void) 398740b1759SClaudio Fontana { 39945e077d7SClaudio Fontana if (!icount_sleep) { 400740b1759SClaudio Fontana return; 401740b1759SClaudio Fontana } 402740b1759SClaudio Fontana 403740b1759SClaudio Fontana /* 404740b1759SClaudio Fontana * Nothing to do if the VM is stopped: QEMU_CLOCK_VIRTUAL timers 405740b1759SClaudio Fontana * do not fire, so computing the deadline does not make sense. 406740b1759SClaudio Fontana */ 407740b1759SClaudio Fontana if (!runstate_is_running()) { 408740b1759SClaudio Fontana return; 409740b1759SClaudio Fontana } 410740b1759SClaudio Fontana 41160618e2dSPavel Dovgalyuk replay_async_events(); 41260618e2dSPavel Dovgalyuk 413740b1759SClaudio Fontana /* warp clock deterministically in record/replay mode */ 414740b1759SClaudio Fontana if (!replay_checkpoint(CHECKPOINT_CLOCK_WARP_ACCOUNT)) { 415740b1759SClaudio Fontana return; 416740b1759SClaudio Fontana } 417740b1759SClaudio Fontana 418740b1759SClaudio Fontana timer_del(timers_state.icount_warp_timer); 419740b1759SClaudio Fontana icount_warp_rt(); 420740b1759SClaudio Fontana } 421740b1759SClaudio Fontana 4228191d368SClaudio Fontana void icount_configure(QemuOpts *opts, Error **errp) 423740b1759SClaudio Fontana { 424740b1759SClaudio Fontana const char *option = qemu_opt_get(opts, "shift"); 425740b1759SClaudio Fontana bool sleep = qemu_opt_get_bool(opts, "sleep", true); 426740b1759SClaudio Fontana bool align = qemu_opt_get_bool(opts, "align", false); 427740b1759SClaudio Fontana long time_shift = -1; 428740b1759SClaudio Fontana 429740b1759SClaudio Fontana if (!option) { 430740b1759SClaudio Fontana if (qemu_opt_get(opts, "align") != NULL) { 431740b1759SClaudio Fontana error_setg(errp, "Please specify shift option when using align"); 432740b1759SClaudio Fontana } 433740b1759SClaudio Fontana return; 434740b1759SClaudio Fontana } 435740b1759SClaudio Fontana 436740b1759SClaudio Fontana if (align && !sleep) { 437740b1759SClaudio Fontana error_setg(errp, "align=on and sleep=off are incompatible"); 438740b1759SClaudio Fontana return; 439740b1759SClaudio Fontana } 440740b1759SClaudio Fontana 441740b1759SClaudio Fontana if (strcmp(option, "auto") != 0) { 442740b1759SClaudio Fontana if (qemu_strtol(option, NULL, 0, &time_shift) < 0 443740b1759SClaudio Fontana || time_shift < 0 || time_shift > MAX_ICOUNT_SHIFT) { 444740b1759SClaudio Fontana error_setg(errp, "icount: Invalid shift value"); 445740b1759SClaudio Fontana return; 446740b1759SClaudio Fontana } 447740b1759SClaudio Fontana } else if (icount_align_option) { 448740b1759SClaudio Fontana error_setg(errp, "shift=auto and align=on are incompatible"); 449740b1759SClaudio Fontana return; 450740b1759SClaudio Fontana } else if (!icount_sleep) { 451740b1759SClaudio Fontana error_setg(errp, "shift=auto and sleep=off are incompatible"); 452740b1759SClaudio Fontana return; 453740b1759SClaudio Fontana } 454740b1759SClaudio Fontana 455740b1759SClaudio Fontana icount_sleep = sleep; 456740b1759SClaudio Fontana if (icount_sleep) { 457740b1759SClaudio Fontana timers_state.icount_warp_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL_RT, 458740b1759SClaudio Fontana icount_timer_cb, NULL); 459740b1759SClaudio Fontana } 460740b1759SClaudio Fontana 461740b1759SClaudio Fontana icount_align_option = align; 462740b1759SClaudio Fontana 463740b1759SClaudio Fontana if (time_shift >= 0) { 464740b1759SClaudio Fontana timers_state.icount_time_shift = time_shift; 465740b1759SClaudio Fontana icount_enable_precise(); 466740b1759SClaudio Fontana return; 467740b1759SClaudio Fontana } 468740b1759SClaudio Fontana 469740b1759SClaudio Fontana icount_enable_adaptive(); 470740b1759SClaudio Fontana 471740b1759SClaudio Fontana /* 472740b1759SClaudio Fontana * 125MIPS seems a reasonable initial guess at the guest speed. 473740b1759SClaudio Fontana * It will be corrected fairly quickly anyway. 474740b1759SClaudio Fontana */ 475740b1759SClaudio Fontana timers_state.icount_time_shift = 3; 476740b1759SClaudio Fontana 477740b1759SClaudio Fontana /* 478740b1759SClaudio Fontana * Have both realtime and virtual time triggers for speed adjustment. 479740b1759SClaudio Fontana * The realtime trigger catches emulated time passing too slowly, 480740b1759SClaudio Fontana * the virtual time trigger catches emulated time passing too fast. 481740b1759SClaudio Fontana * Realtime triggers occur even when idle, so use them less frequently 482740b1759SClaudio Fontana * than VM triggers. 483740b1759SClaudio Fontana */ 484740b1759SClaudio Fontana timers_state.vm_clock_warp_start = -1; 485740b1759SClaudio Fontana timers_state.icount_rt_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL_RT, 486740b1759SClaudio Fontana icount_adjust_rt, NULL); 487740b1759SClaudio Fontana timer_mod(timers_state.icount_rt_timer, 488740b1759SClaudio Fontana qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT) + 1000); 489740b1759SClaudio Fontana timers_state.icount_vm_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, 490740b1759SClaudio Fontana icount_adjust_vm, NULL); 491740b1759SClaudio Fontana timer_mod(timers_state.icount_vm_timer, 492740b1759SClaudio Fontana qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 493740b1759SClaudio Fontana NANOSECONDS_PER_SECOND / 10); 494740b1759SClaudio Fontana } 49575bbe5e5SPavel Dovgalyuk 49675bbe5e5SPavel Dovgalyuk void icount_notify_exit(void) 49775bbe5e5SPavel Dovgalyuk { 49875bbe5e5SPavel Dovgalyuk if (icount_enabled() && current_cpu) { 49975bbe5e5SPavel Dovgalyuk qemu_cpu_kick(current_cpu); 50075bbe5e5SPavel Dovgalyuk qemu_clock_notify(QEMU_CLOCK_VIRTUAL); 50175bbe5e5SPavel Dovgalyuk } 50275bbe5e5SPavel Dovgalyuk } 503