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 208e98c27dSPhilippe Mathieu-Daudé /** 218e98c27dSPhilippe Mathieu-Daudé * ICountMode: icount enablement state: 22740b1759SClaudio Fontana * 238e98c27dSPhilippe Mathieu-Daudé * @ICOUNT_DISABLED: Disabled - Do not count executed instructions. 248e98c27dSPhilippe Mathieu-Daudé * @ICOUNT_PRECISE: Enabled - Fixed conversion of insn to ns via "shift" option 258e98c27dSPhilippe Mathieu-Daudé * @ICOUNT_ADAPTATIVE: Enabled - Runtime adaptive algorithm to compute shift 26740b1759SClaudio Fontana */ 278e98c27dSPhilippe Mathieu-Daudé typedef enum { 288e98c27dSPhilippe Mathieu-Daudé ICOUNT_DISABLED = 0, 298e98c27dSPhilippe Mathieu-Daudé ICOUNT_PRECISE, 308e98c27dSPhilippe Mathieu-Daudé ICOUNT_ADAPTATIVE, 318e98c27dSPhilippe Mathieu-Daudé } ICountMode; 328e98c27dSPhilippe Mathieu-Daudé 3316ad9788SPhilippe Mathieu-Daudé #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY) 348e98c27dSPhilippe Mathieu-Daudé extern ICountMode use_icount; 35740b1759SClaudio Fontana #define icount_enabled() (use_icount) 36740b1759SClaudio Fontana #else 378e98c27dSPhilippe Mathieu-Daudé #define icount_enabled() ICOUNT_DISABLED 38740b1759SClaudio Fontana #endif 39740b1759SClaudio Fontana 40740b1759SClaudio Fontana /* 41740b1759SClaudio Fontana * Update the icount with the executed instructions. Called by 42740b1759SClaudio Fontana * cpus-tcg vCPU thread so the main-loop can see time has moved forward. 43740b1759SClaudio Fontana */ 448191d368SClaudio Fontana void icount_update(CPUState *cpu); 45740b1759SClaudio Fontana 46740b1759SClaudio Fontana /* get raw icount value */ 478191d368SClaudio Fontana int64_t icount_get_raw(void); 48740b1759SClaudio Fontana 49740b1759SClaudio Fontana /* return the virtual CPU time in ns, based on the instruction counter. */ 508191d368SClaudio Fontana int64_t icount_get(void); 51740b1759SClaudio Fontana /* 52740b1759SClaudio Fontana * convert an instruction counter value to ns, based on the icount shift. 53740b1759SClaudio Fontana * This shift is set as a fixed value with the icount "shift" option 54740b1759SClaudio Fontana * (precise mode), or it is constantly approximated and corrected at 55740b1759SClaudio Fontana * runtime in adaptive mode. 56740b1759SClaudio Fontana */ 578191d368SClaudio Fontana int64_t icount_to_ns(int64_t icount); 58740b1759SClaudio Fontana 59f07f2467SPhilippe Mathieu-Daudé /** 60f07f2467SPhilippe Mathieu-Daudé * icount_configure: configure the icount options, including "shift" 61f07f2467SPhilippe Mathieu-Daudé * @opts: Options to parse 62f07f2467SPhilippe Mathieu-Daudé * @errp: pointer to a NULL-initialized error object 63f07f2467SPhilippe Mathieu-Daudé * 64f07f2467SPhilippe Mathieu-Daudé * Return: true on success, else false setting @errp with error 65f07f2467SPhilippe Mathieu-Daudé */ 66f07f2467SPhilippe Mathieu-Daudé bool icount_configure(QemuOpts *opts, Error **errp); 67740b1759SClaudio Fontana 68740b1759SClaudio Fontana /* used by tcg vcpu thread to calc icount budget */ 698191d368SClaudio Fontana int64_t icount_round(int64_t count); 70740b1759SClaudio Fontana 71740b1759SClaudio Fontana /* if the CPUs are idle, start accounting real time to virtual clock. */ 728191d368SClaudio Fontana void icount_start_warp_timer(void); 738191d368SClaudio Fontana void icount_account_warp_timer(void); 7475bbe5e5SPavel Dovgalyuk void icount_notify_exit(void); 75740b1759SClaudio Fontana 76740b1759SClaudio Fontana /* 77740b1759SClaudio Fontana * CPU Ticks and Clock 78740b1759SClaudio Fontana */ 79740b1759SClaudio Fontana 80740b1759SClaudio Fontana /* Caller must hold BQL */ 81740b1759SClaudio Fontana void cpu_enable_ticks(void); 82740b1759SClaudio Fontana /* Caller must hold BQL */ 83740b1759SClaudio Fontana void cpu_disable_ticks(void); 84740b1759SClaudio Fontana 85740b1759SClaudio Fontana /* 86430065daSClaudio Fontana * return the time elapsed in VM between vm_start and vm_stop. 87430065daSClaudio Fontana * cpu_get_ticks() uses units of the host CPU cycle counter. 88740b1759SClaudio Fontana */ 89740b1759SClaudio Fontana int64_t cpu_get_ticks(void); 90740b1759SClaudio Fontana 91740b1759SClaudio Fontana /* 92740b1759SClaudio Fontana * Returns the monotonic time elapsed in VM, i.e., 93740b1759SClaudio Fontana * the time between vm_start and vm_stop 94740b1759SClaudio Fontana */ 95740b1759SClaudio Fontana int64_t cpu_get_clock(void); 96740b1759SClaudio Fontana 97740b1759SClaudio Fontana void qemu_timer_notify_cb(void *opaque, QEMUClockType type); 98740b1759SClaudio Fontana 99*113ac1d2SAlex Bennée /* get/set VIRTUAL clock and VM elapsed ticks via the cpus accel interface */ 100430065daSClaudio Fontana int64_t cpus_get_virtual_clock(void); 101*113ac1d2SAlex Bennée void cpus_set_virtual_clock(int64_t new_time); 102430065daSClaudio Fontana int64_t cpus_get_elapsed_ticks(void); 103430065daSClaudio Fontana 104740b1759SClaudio Fontana #endif /* SYSEMU_CPU_TIMERS_H */ 105