1 /* 2 * CPU timers state API 3 * 4 * Copyright 2020 SUSE LLC 5 * 6 * This work is licensed under the terms of the GNU GPL, version 2 or later. 7 * See the COPYING file in the top-level directory. 8 * 9 */ 10 #ifndef SYSEMU_CPU_TIMERS_H 11 #define SYSEMU_CPU_TIMERS_H 12 13 #include "qemu/timer.h" 14 15 /* init the whole cpu timers API, including icount, ticks, and cpu_throttle */ 16 void cpu_timers_init(void); 17 18 /* icount - Instruction Counter API */ 19 20 /** 21 * ICountMode: icount enablement state: 22 * 23 * @ICOUNT_DISABLED: Disabled - Do not count executed instructions. 24 * @ICOUNT_PRECISE: Enabled - Fixed conversion of insn to ns via "shift" option 25 * @ICOUNT_ADAPTATIVE: Enabled - Runtime adaptive algorithm to compute shift 26 */ 27 typedef enum { 28 ICOUNT_DISABLED = 0, 29 ICOUNT_PRECISE, 30 ICOUNT_ADAPTATIVE, 31 } ICountMode; 32 33 #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY) 34 extern ICountMode use_icount; 35 #define icount_enabled() (use_icount) 36 #else 37 #define icount_enabled() ICOUNT_DISABLED 38 #endif 39 40 /* 41 * Update the icount with the executed instructions. Called by 42 * cpus-tcg vCPU thread so the main-loop can see time has moved forward. 43 */ 44 void icount_update(CPUState *cpu); 45 46 /* get raw icount value */ 47 int64_t icount_get_raw(void); 48 49 /* return the virtual CPU time in ns, based on the instruction counter. */ 50 int64_t icount_get(void); 51 /* 52 * convert an instruction counter value to ns, based on the icount shift. 53 * This shift is set as a fixed value with the icount "shift" option 54 * (precise mode), or it is constantly approximated and corrected at 55 * runtime in adaptive mode. 56 */ 57 int64_t icount_to_ns(int64_t icount); 58 59 /** 60 * icount_configure: configure the icount options, including "shift" 61 * @opts: Options to parse 62 * @errp: pointer to a NULL-initialized error object 63 * 64 * Return: true on success, else false setting @errp with error 65 */ 66 bool icount_configure(QemuOpts *opts, Error **errp); 67 68 /* used by tcg vcpu thread to calc icount budget */ 69 int64_t icount_round(int64_t count); 70 71 /* if the CPUs are idle, start accounting real time to virtual clock. */ 72 void icount_start_warp_timer(void); 73 void icount_account_warp_timer(void); 74 void icount_notify_exit(void); 75 76 /* 77 * CPU Ticks and Clock 78 */ 79 80 /* Caller must hold BQL */ 81 void cpu_enable_ticks(void); 82 /* Caller must hold BQL */ 83 void cpu_disable_ticks(void); 84 85 /* 86 * return the time elapsed in VM between vm_start and vm_stop. 87 * cpu_get_ticks() uses units of the host CPU cycle counter. 88 */ 89 int64_t cpu_get_ticks(void); 90 91 /* 92 * Returns the monotonic time elapsed in VM, i.e., 93 * the time between vm_start and vm_stop 94 */ 95 int64_t cpu_get_clock(void); 96 97 void qemu_timer_notify_cb(void *opaque, QEMUClockType type); 98 99 /* get/set VIRTUAL clock and VM elapsed ticks via the cpus accel interface */ 100 int64_t cpus_get_virtual_clock(void); 101 void cpus_set_virtual_clock(int64_t new_time); 102 int64_t cpus_get_elapsed_ticks(void); 103 104 #endif /* SYSEMU_CPU_TIMERS_H */ 105