1740b1759SClaudio Fontana /* 2740b1759SClaudio Fontana * CPU timers state API 3740b1759SClaudio Fontana * 4740b1759SClaudio Fontana * Copyright 2020 SUSE LLC 5740b1759SClaudio Fontana * 6740b1759SClaudio Fontana * This work is licensed under the terms of the GNU GPL, version 2 or later. 7740b1759SClaudio Fontana * See the COPYING file in the top-level directory. 8740b1759SClaudio Fontana * 9740b1759SClaudio Fontana */ 10740b1759SClaudio Fontana #ifndef SYSEMU_CPU_TIMERS_H 11740b1759SClaudio Fontana #define SYSEMU_CPU_TIMERS_H 12740b1759SClaudio Fontana 13740b1759SClaudio Fontana #include "qemu/timer.h" 14740b1759SClaudio Fontana 15740b1759SClaudio Fontana /* init the whole cpu timers API, including icount, ticks, and cpu_throttle */ 16740b1759SClaudio Fontana void cpu_timers_init(void); 17740b1759SClaudio Fontana 18740b1759SClaudio Fontana /* icount - Instruction Counter API */ 19740b1759SClaudio Fontana 20740b1759SClaudio Fontana /* 21740b1759SClaudio Fontana * icount enablement state: 22740b1759SClaudio Fontana * 23740b1759SClaudio Fontana * 0 = Disabled - Do not count executed instructions. 24740b1759SClaudio Fontana * 1 = Enabled - Fixed conversion of insn to ns via "shift" option 25740b1759SClaudio Fontana * 2 = Enabled - Runtime adaptive algorithm to compute shift 26740b1759SClaudio Fontana */ 27740b1759SClaudio Fontana #ifdef CONFIG_TCG 28740b1759SClaudio Fontana extern int use_icount; 29740b1759SClaudio Fontana #define icount_enabled() (use_icount) 30740b1759SClaudio Fontana #else 31740b1759SClaudio Fontana #define icount_enabled() 0 32740b1759SClaudio Fontana #endif 33740b1759SClaudio Fontana 34740b1759SClaudio Fontana /* 35740b1759SClaudio Fontana * Update the icount with the executed instructions. Called by 36740b1759SClaudio Fontana * cpus-tcg vCPU thread so the main-loop can see time has moved forward. 37740b1759SClaudio Fontana */ 388191d368SClaudio Fontana void icount_update(CPUState *cpu); 39740b1759SClaudio Fontana 40740b1759SClaudio Fontana /* get raw icount value */ 418191d368SClaudio Fontana int64_t icount_get_raw(void); 42740b1759SClaudio Fontana 43740b1759SClaudio Fontana /* return the virtual CPU time in ns, based on the instruction counter. */ 448191d368SClaudio Fontana int64_t icount_get(void); 45740b1759SClaudio Fontana /* 46740b1759SClaudio Fontana * convert an instruction counter value to ns, based on the icount shift. 47740b1759SClaudio Fontana * This shift is set as a fixed value with the icount "shift" option 48740b1759SClaudio Fontana * (precise mode), or it is constantly approximated and corrected at 49740b1759SClaudio Fontana * runtime in adaptive mode. 50740b1759SClaudio Fontana */ 518191d368SClaudio Fontana int64_t icount_to_ns(int64_t icount); 52740b1759SClaudio Fontana 53740b1759SClaudio Fontana /* configure the icount options, including "shift" */ 548191d368SClaudio Fontana void icount_configure(QemuOpts *opts, Error **errp); 55740b1759SClaudio Fontana 56740b1759SClaudio Fontana /* used by tcg vcpu thread to calc icount budget */ 578191d368SClaudio Fontana int64_t icount_round(int64_t count); 58740b1759SClaudio Fontana 59740b1759SClaudio Fontana /* if the CPUs are idle, start accounting real time to virtual clock. */ 608191d368SClaudio Fontana void icount_start_warp_timer(void); 618191d368SClaudio Fontana void icount_account_warp_timer(void); 62*75bbe5e5SPavel Dovgalyuk void icount_notify_exit(void); 63740b1759SClaudio Fontana 64740b1759SClaudio Fontana /* 65740b1759SClaudio Fontana * CPU Ticks and Clock 66740b1759SClaudio Fontana */ 67740b1759SClaudio Fontana 68740b1759SClaudio Fontana /* Caller must hold BQL */ 69740b1759SClaudio Fontana void cpu_enable_ticks(void); 70740b1759SClaudio Fontana /* Caller must hold BQL */ 71740b1759SClaudio Fontana void cpu_disable_ticks(void); 72740b1759SClaudio Fontana 73740b1759SClaudio Fontana /* 74430065daSClaudio Fontana * return the time elapsed in VM between vm_start and vm_stop. 75430065daSClaudio Fontana * cpu_get_ticks() uses units of the host CPU cycle counter. 76740b1759SClaudio Fontana */ 77740b1759SClaudio Fontana int64_t cpu_get_ticks(void); 78740b1759SClaudio Fontana 79740b1759SClaudio Fontana /* 80740b1759SClaudio Fontana * Returns the monotonic time elapsed in VM, i.e., 81740b1759SClaudio Fontana * the time between vm_start and vm_stop 82740b1759SClaudio Fontana */ 83740b1759SClaudio Fontana int64_t cpu_get_clock(void); 84740b1759SClaudio Fontana 85740b1759SClaudio Fontana void qemu_timer_notify_cb(void *opaque, QEMUClockType type); 86740b1759SClaudio Fontana 87430065daSClaudio Fontana /* get the VIRTUAL clock and VM elapsed ticks via the cpus accel interface */ 88430065daSClaudio Fontana int64_t cpus_get_virtual_clock(void); 89430065daSClaudio Fontana int64_t cpus_get_elapsed_ticks(void); 90430065daSClaudio Fontana 91740b1759SClaudio Fontana #endif /* SYSEMU_CPU_TIMERS_H */ 92