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