xref: /openbmc/qemu/include/sysemu/cpu-timers.h (revision e2bc7787c8dcc38f0f788d68764ffb6b756f7ea6)
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