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" 408d7f2e76SPhilippe 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 528e98c27dSPhilippe Mathieu-Daudé /* Do not count executed instructions */ 538e98c27dSPhilippe Mathieu-Daudé ICountMode use_icount = ICOUNT_DISABLED; 54740b1759SClaudio Fontana 55740b1759SClaudio Fontana static void icount_enable_precise(void) 56740b1759SClaudio Fontana { 578e98c27dSPhilippe Mathieu-Daudé /* Fixed conversion of insn to ns via "shift" option */ 588e98c27dSPhilippe Mathieu-Daudé use_icount = ICOUNT_PRECISE; 59740b1759SClaudio Fontana } 60740b1759SClaudio Fontana 61740b1759SClaudio Fontana static void icount_enable_adaptive(void) 62740b1759SClaudio Fontana { 638e98c27dSPhilippe Mathieu-Daudé /* Runtime adaptive algorithm to compute shift */ 648e98c27dSPhilippe Mathieu-Daudé use_icount = ICOUNT_ADAPTATIVE; 65740b1759SClaudio Fontana } 66740b1759SClaudio Fontana 67740b1759SClaudio Fontana /* 68740b1759SClaudio Fontana * The current number of executed instructions is based on what we 69740b1759SClaudio Fontana * originally budgeted minus the current state of the decrementing 70740b1759SClaudio Fontana * icount counters in extra/u16.low. 71740b1759SClaudio Fontana */ 728191d368SClaudio Fontana static int64_t icount_get_executed(CPUState *cpu) 73740b1759SClaudio Fontana { 74740b1759SClaudio Fontana return (cpu->icount_budget - 75a953b5faSRichard Henderson (cpu->neg.icount_decr.u16.low + cpu->icount_extra)); 76740b1759SClaudio Fontana } 77740b1759SClaudio Fontana 78740b1759SClaudio Fontana /* 79740b1759SClaudio Fontana * Update the global shared timer_state.qemu_icount to take into 80740b1759SClaudio Fontana * account executed instructions. This is done by the TCG vCPU 81740b1759SClaudio Fontana * thread so the main-loop can see time has moved forward. 82740b1759SClaudio Fontana */ 838191d368SClaudio Fontana static void icount_update_locked(CPUState *cpu) 84740b1759SClaudio Fontana { 858191d368SClaudio Fontana int64_t executed = icount_get_executed(cpu); 86740b1759SClaudio Fontana cpu->icount_budget -= executed; 87740b1759SClaudio Fontana 88740b1759SClaudio Fontana qatomic_set_i64(&timers_state.qemu_icount, 89740b1759SClaudio Fontana timers_state.qemu_icount + executed); 90740b1759SClaudio Fontana } 91740b1759SClaudio Fontana 92740b1759SClaudio Fontana /* 93740b1759SClaudio Fontana * Update the global shared timer_state.qemu_icount to take into 94740b1759SClaudio Fontana * account executed instructions. This is done by the TCG vCPU 95740b1759SClaudio Fontana * thread so the main-loop can see time has moved forward. 96740b1759SClaudio Fontana */ 978191d368SClaudio Fontana void icount_update(CPUState *cpu) 98740b1759SClaudio Fontana { 99740b1759SClaudio Fontana seqlock_write_lock(&timers_state.vm_clock_seqlock, 100740b1759SClaudio Fontana &timers_state.vm_clock_lock); 1018191d368SClaudio Fontana icount_update_locked(cpu); 102740b1759SClaudio Fontana seqlock_write_unlock(&timers_state.vm_clock_seqlock, 103740b1759SClaudio Fontana &timers_state.vm_clock_lock); 104740b1759SClaudio Fontana } 105740b1759SClaudio Fontana 1068191d368SClaudio Fontana static int64_t icount_get_raw_locked(void) 107740b1759SClaudio Fontana { 108740b1759SClaudio Fontana CPUState *cpu = current_cpu; 109740b1759SClaudio Fontana 110740b1759SClaudio Fontana if (cpu && cpu->running) { 111464dacf6SRichard Henderson if (!cpu->neg.can_do_io) { 112740b1759SClaudio Fontana error_report("Bad icount read"); 113740b1759SClaudio Fontana exit(1); 114740b1759SClaudio Fontana } 115740b1759SClaudio Fontana /* Take into account what has run */ 1168191d368SClaudio Fontana icount_update_locked(cpu); 117740b1759SClaudio Fontana } 118740b1759SClaudio Fontana /* The read is protected by the seqlock, but needs atomic64 to avoid UB */ 119740b1759SClaudio Fontana return qatomic_read_i64(&timers_state.qemu_icount); 120740b1759SClaudio Fontana } 121740b1759SClaudio Fontana 1228191d368SClaudio Fontana static int64_t icount_get_locked(void) 123740b1759SClaudio Fontana { 1248191d368SClaudio Fontana int64_t icount = icount_get_raw_locked(); 125740b1759SClaudio Fontana return qatomic_read_i64(&timers_state.qemu_icount_bias) + 1268191d368SClaudio Fontana icount_to_ns(icount); 127740b1759SClaudio Fontana } 128740b1759SClaudio Fontana 1298191d368SClaudio Fontana int64_t icount_get_raw(void) 130740b1759SClaudio Fontana { 131740b1759SClaudio Fontana int64_t icount; 132740b1759SClaudio Fontana unsigned start; 133740b1759SClaudio Fontana 134740b1759SClaudio Fontana do { 135740b1759SClaudio Fontana start = seqlock_read_begin(&timers_state.vm_clock_seqlock); 1368191d368SClaudio Fontana icount = icount_get_raw_locked(); 137740b1759SClaudio Fontana } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start)); 138740b1759SClaudio Fontana 139740b1759SClaudio Fontana return icount; 140740b1759SClaudio Fontana } 141740b1759SClaudio Fontana 142740b1759SClaudio Fontana /* Return the virtual CPU time, based on the instruction counter. */ 1438191d368SClaudio Fontana int64_t icount_get(void) 144740b1759SClaudio Fontana { 145740b1759SClaudio Fontana int64_t icount; 146740b1759SClaudio Fontana unsigned start; 147740b1759SClaudio Fontana 148740b1759SClaudio Fontana do { 149740b1759SClaudio Fontana start = seqlock_read_begin(&timers_state.vm_clock_seqlock); 1508191d368SClaudio Fontana icount = icount_get_locked(); 151740b1759SClaudio Fontana } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, start)); 152740b1759SClaudio Fontana 153740b1759SClaudio Fontana return icount; 154740b1759SClaudio Fontana } 155740b1759SClaudio Fontana 1568191d368SClaudio Fontana int64_t icount_to_ns(int64_t icount) 157740b1759SClaudio Fontana { 158740b1759SClaudio Fontana return icount << qatomic_read(&timers_state.icount_time_shift); 159740b1759SClaudio Fontana } 160740b1759SClaudio Fontana 161740b1759SClaudio Fontana /* 162740b1759SClaudio Fontana * Correlation between real and virtual time is always going to be 163740b1759SClaudio Fontana * fairly approximate, so ignore small variation. 164740b1759SClaudio Fontana * When the guest is idle real and virtual time will be aligned in 165740b1759SClaudio Fontana * the IO wait loop. 166740b1759SClaudio Fontana */ 167740b1759SClaudio Fontana #define ICOUNT_WOBBLE (NANOSECONDS_PER_SECOND / 10) 168740b1759SClaudio Fontana 169740b1759SClaudio Fontana static void icount_adjust(void) 170740b1759SClaudio Fontana { 171740b1759SClaudio Fontana int64_t cur_time; 172740b1759SClaudio Fontana int64_t cur_icount; 173740b1759SClaudio Fontana int64_t delta; 174740b1759SClaudio Fontana 175740b1759SClaudio Fontana /* If the VM is not running, then do nothing. */ 176740b1759SClaudio Fontana if (!runstate_is_running()) { 177740b1759SClaudio Fontana return; 178740b1759SClaudio Fontana } 179740b1759SClaudio Fontana 180740b1759SClaudio Fontana seqlock_write_lock(&timers_state.vm_clock_seqlock, 181740b1759SClaudio Fontana &timers_state.vm_clock_lock); 182740b1759SClaudio Fontana cur_time = REPLAY_CLOCK_LOCKED(REPLAY_CLOCK_VIRTUAL_RT, 183740b1759SClaudio Fontana cpu_get_clock_locked()); 1848191d368SClaudio Fontana cur_icount = icount_get_locked(); 185740b1759SClaudio Fontana 186740b1759SClaudio Fontana delta = cur_icount - cur_time; 187740b1759SClaudio Fontana /* FIXME: This is a very crude algorithm, somewhat prone to oscillation. */ 188740b1759SClaudio Fontana if (delta > 0 189fe852ac2SPavel Dovgalyuk && timers_state.last_delta + ICOUNT_WOBBLE < delta * 2 190740b1759SClaudio Fontana && timers_state.icount_time_shift > 0) { 191740b1759SClaudio Fontana /* The guest is getting too far ahead. Slow time down. */ 192740b1759SClaudio Fontana qatomic_set(&timers_state.icount_time_shift, 193740b1759SClaudio Fontana timers_state.icount_time_shift - 1); 194740b1759SClaudio Fontana } 195740b1759SClaudio Fontana if (delta < 0 196fe852ac2SPavel Dovgalyuk && timers_state.last_delta - ICOUNT_WOBBLE > delta * 2 197740b1759SClaudio Fontana && timers_state.icount_time_shift < MAX_ICOUNT_SHIFT) { 198740b1759SClaudio Fontana /* The guest is getting too far behind. Speed time up. */ 199740b1759SClaudio Fontana qatomic_set(&timers_state.icount_time_shift, 200740b1759SClaudio Fontana timers_state.icount_time_shift + 1); 201740b1759SClaudio Fontana } 202fe852ac2SPavel Dovgalyuk timers_state.last_delta = delta; 203740b1759SClaudio Fontana qatomic_set_i64(&timers_state.qemu_icount_bias, 204740b1759SClaudio Fontana cur_icount - (timers_state.qemu_icount 205740b1759SClaudio Fontana << timers_state.icount_time_shift)); 206740b1759SClaudio Fontana seqlock_write_unlock(&timers_state.vm_clock_seqlock, 207740b1759SClaudio Fontana &timers_state.vm_clock_lock); 208740b1759SClaudio Fontana } 209740b1759SClaudio Fontana 210740b1759SClaudio Fontana static void icount_adjust_rt(void *opaque) 211740b1759SClaudio Fontana { 212740b1759SClaudio Fontana timer_mod(timers_state.icount_rt_timer, 213740b1759SClaudio Fontana qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT) + 1000); 214740b1759SClaudio Fontana icount_adjust(); 215740b1759SClaudio Fontana } 216740b1759SClaudio Fontana 217740b1759SClaudio Fontana static void icount_adjust_vm(void *opaque) 218740b1759SClaudio Fontana { 219740b1759SClaudio Fontana timer_mod(timers_state.icount_vm_timer, 220740b1759SClaudio Fontana qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 221740b1759SClaudio Fontana NANOSECONDS_PER_SECOND / 10); 222740b1759SClaudio Fontana icount_adjust(); 223740b1759SClaudio Fontana } 224740b1759SClaudio Fontana 2258191d368SClaudio Fontana int64_t icount_round(int64_t count) 226740b1759SClaudio Fontana { 227740b1759SClaudio Fontana int shift = qatomic_read(&timers_state.icount_time_shift); 228740b1759SClaudio Fontana return (count + (1 << shift) - 1) >> shift; 229740b1759SClaudio Fontana } 230740b1759SClaudio Fontana 231740b1759SClaudio Fontana static void icount_warp_rt(void) 232740b1759SClaudio Fontana { 233740b1759SClaudio Fontana unsigned seq; 234740b1759SClaudio Fontana int64_t warp_start; 235740b1759SClaudio Fontana 236740b1759SClaudio Fontana /* 237740b1759SClaudio Fontana * The icount_warp_timer is rescheduled soon after vm_clock_warp_start 238740b1759SClaudio Fontana * changes from -1 to another value, so the race here is okay. 239740b1759SClaudio Fontana */ 240740b1759SClaudio Fontana do { 241740b1759SClaudio Fontana seq = seqlock_read_begin(&timers_state.vm_clock_seqlock); 242740b1759SClaudio Fontana warp_start = timers_state.vm_clock_warp_start; 243740b1759SClaudio Fontana } while (seqlock_read_retry(&timers_state.vm_clock_seqlock, seq)); 244740b1759SClaudio Fontana 245740b1759SClaudio Fontana if (warp_start == -1) { 246740b1759SClaudio Fontana return; 247740b1759SClaudio Fontana } 248740b1759SClaudio Fontana 249740b1759SClaudio Fontana seqlock_write_lock(&timers_state.vm_clock_seqlock, 250740b1759SClaudio Fontana &timers_state.vm_clock_lock); 251740b1759SClaudio Fontana if (runstate_is_running()) { 252740b1759SClaudio Fontana int64_t clock = REPLAY_CLOCK_LOCKED(REPLAY_CLOCK_VIRTUAL_RT, 253740b1759SClaudio Fontana cpu_get_clock_locked()); 254740b1759SClaudio Fontana int64_t warp_delta; 255740b1759SClaudio Fontana 256740b1759SClaudio Fontana warp_delta = clock - timers_state.vm_clock_warp_start; 2578e98c27dSPhilippe Mathieu-Daudé if (icount_enabled() == ICOUNT_ADAPTATIVE) { 258740b1759SClaudio Fontana /* 25967f85346SNicholas Piggin * In adaptive mode, do not let QEMU_CLOCK_VIRTUAL run too far 26067f85346SNicholas Piggin * ahead of real time (it might already be ahead so careful not 26167f85346SNicholas Piggin * to go backwards). 262740b1759SClaudio Fontana */ 2638191d368SClaudio Fontana int64_t cur_icount = icount_get_locked(); 264740b1759SClaudio Fontana int64_t delta = clock - cur_icount; 26567f85346SNicholas Piggin 26667f85346SNicholas Piggin if (delta < 0) { 26767f85346SNicholas Piggin delta = 0; 26867f85346SNicholas Piggin } 269740b1759SClaudio Fontana warp_delta = MIN(warp_delta, delta); 270740b1759SClaudio Fontana } 271740b1759SClaudio Fontana qatomic_set_i64(&timers_state.qemu_icount_bias, 272740b1759SClaudio Fontana timers_state.qemu_icount_bias + warp_delta); 273740b1759SClaudio Fontana } 274740b1759SClaudio Fontana timers_state.vm_clock_warp_start = -1; 275740b1759SClaudio Fontana seqlock_write_unlock(&timers_state.vm_clock_seqlock, 276740b1759SClaudio Fontana &timers_state.vm_clock_lock); 277740b1759SClaudio Fontana 278740b1759SClaudio Fontana if (qemu_clock_expired(QEMU_CLOCK_VIRTUAL)) { 279740b1759SClaudio Fontana qemu_clock_notify(QEMU_CLOCK_VIRTUAL); 280740b1759SClaudio Fontana } 281740b1759SClaudio Fontana } 282740b1759SClaudio Fontana 283740b1759SClaudio Fontana static void icount_timer_cb(void *opaque) 284740b1759SClaudio Fontana { 285740b1759SClaudio Fontana /* 286740b1759SClaudio Fontana * No need for a checkpoint because the timer already synchronizes 287740b1759SClaudio Fontana * with CHECKPOINT_CLOCK_VIRTUAL_RT. 288740b1759SClaudio Fontana */ 289740b1759SClaudio Fontana icount_warp_rt(); 290740b1759SClaudio Fontana } 291740b1759SClaudio Fontana 2928191d368SClaudio Fontana void icount_start_warp_timer(void) 293740b1759SClaudio Fontana { 294740b1759SClaudio Fontana int64_t clock; 295740b1759SClaudio Fontana int64_t deadline; 296740b1759SClaudio Fontana 297740b1759SClaudio Fontana assert(icount_enabled()); 298740b1759SClaudio Fontana 299740b1759SClaudio Fontana /* 300740b1759SClaudio Fontana * Nothing to do if the VM is stopped: QEMU_CLOCK_VIRTUAL timers 301740b1759SClaudio Fontana * do not fire, so computing the deadline does not make sense. 302740b1759SClaudio Fontana */ 303740b1759SClaudio Fontana if (!runstate_is_running()) { 304740b1759SClaudio Fontana return; 305740b1759SClaudio Fontana } 306740b1759SClaudio Fontana 307740b1759SClaudio Fontana if (replay_mode != REPLAY_MODE_PLAY) { 308740b1759SClaudio Fontana if (!all_cpu_threads_idle()) { 309740b1759SClaudio Fontana return; 310740b1759SClaudio Fontana } 311740b1759SClaudio Fontana 312740b1759SClaudio Fontana if (qtest_enabled()) { 313740b1759SClaudio Fontana /* When testing, qtest commands advance icount. */ 314740b1759SClaudio Fontana return; 315740b1759SClaudio Fontana } 316740b1759SClaudio Fontana 317740b1759SClaudio Fontana replay_checkpoint(CHECKPOINT_CLOCK_WARP_START); 318740b1759SClaudio Fontana } else { 319740b1759SClaudio Fontana /* warp clock deterministically in record/replay mode */ 320740b1759SClaudio Fontana if (!replay_checkpoint(CHECKPOINT_CLOCK_WARP_START)) { 321740b1759SClaudio Fontana /* 322740b1759SClaudio Fontana * vCPU is sleeping and warp can't be started. 323740b1759SClaudio Fontana * It is probably a race condition: notification sent 324740b1759SClaudio Fontana * to vCPU was processed in advance and vCPU went to sleep. 325669dcb60SMichael Tokarev * Therefore we have to wake it up for doing something. 326740b1759SClaudio Fontana */ 32760618e2dSPavel Dovgalyuk if (replay_has_event()) { 328740b1759SClaudio Fontana qemu_clock_notify(QEMU_CLOCK_VIRTUAL); 329740b1759SClaudio Fontana } 330740b1759SClaudio Fontana return; 331740b1759SClaudio Fontana } 332740b1759SClaudio Fontana } 333740b1759SClaudio Fontana 334740b1759SClaudio Fontana /* We want to use the earliest deadline from ALL vm_clocks */ 335740b1759SClaudio Fontana clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL_RT); 336740b1759SClaudio Fontana deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL, 337740b1759SClaudio Fontana ~QEMU_TIMER_ATTR_EXTERNAL); 338740b1759SClaudio Fontana if (deadline < 0) { 339740b1759SClaudio Fontana static bool notified; 340740b1759SClaudio Fontana if (!icount_sleep && !notified) { 341740b1759SClaudio Fontana warn_report("icount sleep disabled and no active timers"); 342740b1759SClaudio Fontana notified = true; 343740b1759SClaudio Fontana } 344740b1759SClaudio Fontana return; 345740b1759SClaudio Fontana } 346740b1759SClaudio Fontana 347740b1759SClaudio Fontana if (deadline > 0) { 348740b1759SClaudio Fontana /* 349740b1759SClaudio Fontana * Ensure QEMU_CLOCK_VIRTUAL proceeds even when the virtual CPU goes to 350740b1759SClaudio Fontana * sleep. Otherwise, the CPU might be waiting for a future timer 351740b1759SClaudio Fontana * interrupt to wake it up, but the interrupt never comes because 352740b1759SClaudio Fontana * the vCPU isn't running any insns and thus doesn't advance the 353740b1759SClaudio Fontana * QEMU_CLOCK_VIRTUAL. 354740b1759SClaudio Fontana */ 355740b1759SClaudio Fontana if (!icount_sleep) { 356740b1759SClaudio Fontana /* 357740b1759SClaudio Fontana * We never let VCPUs sleep in no sleep icount mode. 358740b1759SClaudio Fontana * If there is a pending QEMU_CLOCK_VIRTUAL timer we just advance 359740b1759SClaudio Fontana * to the next QEMU_CLOCK_VIRTUAL event and notify it. 360740b1759SClaudio Fontana * It is useful when we want a deterministic execution time, 361740b1759SClaudio Fontana * isolated from host latencies. 362740b1759SClaudio Fontana */ 363740b1759SClaudio Fontana seqlock_write_lock(&timers_state.vm_clock_seqlock, 364740b1759SClaudio Fontana &timers_state.vm_clock_lock); 365740b1759SClaudio Fontana qatomic_set_i64(&timers_state.qemu_icount_bias, 366740b1759SClaudio Fontana timers_state.qemu_icount_bias + deadline); 367740b1759SClaudio Fontana seqlock_write_unlock(&timers_state.vm_clock_seqlock, 368740b1759SClaudio Fontana &timers_state.vm_clock_lock); 369740b1759SClaudio Fontana qemu_clock_notify(QEMU_CLOCK_VIRTUAL); 370740b1759SClaudio Fontana } else { 371740b1759SClaudio Fontana /* 372740b1759SClaudio Fontana * We do stop VCPUs and only advance QEMU_CLOCK_VIRTUAL after some 373740b1759SClaudio Fontana * "real" time, (related to the time left until the next event) has 374740b1759SClaudio Fontana * passed. The QEMU_CLOCK_VIRTUAL_RT clock will do this. 375740b1759SClaudio Fontana * This avoids that the warps are visible externally; for example, 376740b1759SClaudio Fontana * you will not be sending network packets continuously instead of 377740b1759SClaudio Fontana * every 100ms. 378740b1759SClaudio Fontana */ 379740b1759SClaudio Fontana seqlock_write_lock(&timers_state.vm_clock_seqlock, 380740b1759SClaudio Fontana &timers_state.vm_clock_lock); 381740b1759SClaudio Fontana if (timers_state.vm_clock_warp_start == -1 382740b1759SClaudio Fontana || timers_state.vm_clock_warp_start > clock) { 383740b1759SClaudio Fontana timers_state.vm_clock_warp_start = clock; 384740b1759SClaudio Fontana } 385740b1759SClaudio Fontana seqlock_write_unlock(&timers_state.vm_clock_seqlock, 386740b1759SClaudio Fontana &timers_state.vm_clock_lock); 387740b1759SClaudio Fontana timer_mod_anticipate(timers_state.icount_warp_timer, 388740b1759SClaudio Fontana clock + deadline); 389740b1759SClaudio Fontana } 390740b1759SClaudio Fontana } else if (deadline == 0) { 391740b1759SClaudio Fontana qemu_clock_notify(QEMU_CLOCK_VIRTUAL); 392740b1759SClaudio Fontana } 393740b1759SClaudio Fontana } 394740b1759SClaudio Fontana 3958191d368SClaudio Fontana void icount_account_warp_timer(void) 396740b1759SClaudio Fontana { 39745e077d7SClaudio Fontana if (!icount_sleep) { 398740b1759SClaudio Fontana return; 399740b1759SClaudio Fontana } 400740b1759SClaudio Fontana 401740b1759SClaudio Fontana /* 402740b1759SClaudio Fontana * Nothing to do if the VM is stopped: QEMU_CLOCK_VIRTUAL timers 403740b1759SClaudio Fontana * do not fire, so computing the deadline does not make sense. 404740b1759SClaudio Fontana */ 405740b1759SClaudio Fontana if (!runstate_is_running()) { 406740b1759SClaudio Fontana return; 407740b1759SClaudio Fontana } 408740b1759SClaudio Fontana 40960618e2dSPavel Dovgalyuk replay_async_events(); 41060618e2dSPavel Dovgalyuk 411740b1759SClaudio Fontana /* warp clock deterministically in record/replay mode */ 412740b1759SClaudio Fontana if (!replay_checkpoint(CHECKPOINT_CLOCK_WARP_ACCOUNT)) { 413740b1759SClaudio Fontana return; 414740b1759SClaudio Fontana } 415740b1759SClaudio Fontana 416740b1759SClaudio Fontana timer_del(timers_state.icount_warp_timer); 417740b1759SClaudio Fontana icount_warp_rt(); 418740b1759SClaudio Fontana } 419740b1759SClaudio Fontana 420f07f2467SPhilippe Mathieu-Daudé bool icount_configure(QemuOpts *opts, Error **errp) 421740b1759SClaudio Fontana { 422740b1759SClaudio Fontana const char *option = qemu_opt_get(opts, "shift"); 423740b1759SClaudio Fontana bool sleep = qemu_opt_get_bool(opts, "sleep", true); 424740b1759SClaudio Fontana bool align = qemu_opt_get_bool(opts, "align", false); 425740b1759SClaudio Fontana long time_shift = -1; 426740b1759SClaudio Fontana 427740b1759SClaudio Fontana if (!option) { 428740b1759SClaudio Fontana if (qemu_opt_get(opts, "align") != NULL) { 429740b1759SClaudio Fontana error_setg(errp, "Please specify shift option when using align"); 430f07f2467SPhilippe Mathieu-Daudé return false; 431740b1759SClaudio Fontana } 432f07f2467SPhilippe Mathieu-Daudé return true; 433740b1759SClaudio Fontana } 434740b1759SClaudio Fontana 435740b1759SClaudio Fontana if (align && !sleep) { 436740b1759SClaudio Fontana error_setg(errp, "align=on and sleep=off are incompatible"); 437f07f2467SPhilippe Mathieu-Daudé return false; 438740b1759SClaudio Fontana } 439740b1759SClaudio Fontana 440740b1759SClaudio Fontana if (strcmp(option, "auto") != 0) { 441740b1759SClaudio Fontana if (qemu_strtol(option, NULL, 0, &time_shift) < 0 442740b1759SClaudio Fontana || time_shift < 0 || time_shift > MAX_ICOUNT_SHIFT) { 443740b1759SClaudio Fontana error_setg(errp, "icount: Invalid shift value"); 444f07f2467SPhilippe Mathieu-Daudé return false; 445740b1759SClaudio Fontana } 446740b1759SClaudio Fontana } else if (icount_align_option) { 447740b1759SClaudio Fontana error_setg(errp, "shift=auto and align=on are incompatible"); 448f07f2467SPhilippe Mathieu-Daudé return false; 449740b1759SClaudio Fontana } else if (!icount_sleep) { 450740b1759SClaudio Fontana error_setg(errp, "shift=auto and sleep=off are incompatible"); 451f07f2467SPhilippe Mathieu-Daudé return false; 452740b1759SClaudio Fontana } 453740b1759SClaudio Fontana 454740b1759SClaudio Fontana icount_sleep = sleep; 455740b1759SClaudio Fontana if (icount_sleep) { 456740b1759SClaudio Fontana timers_state.icount_warp_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL_RT, 457740b1759SClaudio Fontana icount_timer_cb, NULL); 458740b1759SClaudio Fontana } 459740b1759SClaudio Fontana 460740b1759SClaudio Fontana icount_align_option = align; 461740b1759SClaudio Fontana 462740b1759SClaudio Fontana if (time_shift >= 0) { 463740b1759SClaudio Fontana timers_state.icount_time_shift = time_shift; 464740b1759SClaudio Fontana icount_enable_precise(); 465f07f2467SPhilippe Mathieu-Daudé return true; 466740b1759SClaudio Fontana } 467740b1759SClaudio Fontana 468740b1759SClaudio Fontana icount_enable_adaptive(); 469740b1759SClaudio Fontana 470740b1759SClaudio Fontana /* 471740b1759SClaudio Fontana * 125MIPS seems a reasonable initial guess at the guest speed. 472740b1759SClaudio Fontana * It will be corrected fairly quickly anyway. 473740b1759SClaudio Fontana */ 474740b1759SClaudio Fontana timers_state.icount_time_shift = 3; 475740b1759SClaudio Fontana 476740b1759SClaudio Fontana /* 477740b1759SClaudio Fontana * Have both realtime and virtual time triggers for speed adjustment. 478740b1759SClaudio Fontana * The realtime trigger catches emulated time passing too slowly, 479740b1759SClaudio Fontana * the virtual time trigger catches emulated time passing too fast. 480740b1759SClaudio Fontana * Realtime triggers occur even when idle, so use them less frequently 481740b1759SClaudio Fontana * than VM triggers. 482740b1759SClaudio Fontana */ 483740b1759SClaudio Fontana timers_state.vm_clock_warp_start = -1; 484740b1759SClaudio Fontana timers_state.icount_rt_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL_RT, 485740b1759SClaudio Fontana icount_adjust_rt, NULL); 486740b1759SClaudio Fontana timer_mod(timers_state.icount_rt_timer, 487740b1759SClaudio Fontana qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_RT) + 1000); 488740b1759SClaudio Fontana timers_state.icount_vm_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, 489740b1759SClaudio Fontana icount_adjust_vm, NULL); 490740b1759SClaudio Fontana timer_mod(timers_state.icount_vm_timer, 491740b1759SClaudio Fontana qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 492740b1759SClaudio Fontana NANOSECONDS_PER_SECOND / 10); 493f07f2467SPhilippe Mathieu-Daudé return true; 494740b1759SClaudio Fontana } 49575bbe5e5SPavel Dovgalyuk 49675bbe5e5SPavel Dovgalyuk void icount_notify_exit(void) 49775bbe5e5SPavel Dovgalyuk { 498*72c603f8SPhilippe Mathieu-Daudé assert(icount_enabled()); 499*72c603f8SPhilippe Mathieu-Daudé 500*72c603f8SPhilippe Mathieu-Daudé if (current_cpu) { 50175bbe5e5SPavel Dovgalyuk qemu_cpu_kick(current_cpu); 50275bbe5e5SPavel Dovgalyuk qemu_clock_notify(QEMU_CLOCK_VIRTUAL); 50375bbe5e5SPavel Dovgalyuk } 50475bbe5e5SPavel Dovgalyuk } 505