xref: /openbmc/qemu/include/exec/icount.h (revision 161f5bc8e965fa8255db435683e6b52042037bb7)
1*161f5bc8SRichard Henderson /*
2*161f5bc8SRichard Henderson  * icount - Instruction Counter API
3*161f5bc8SRichard Henderson  * CPU timers state API
4*161f5bc8SRichard Henderson  *
5*161f5bc8SRichard Henderson  * Copyright 2020 SUSE LLC
6*161f5bc8SRichard Henderson  * SPDX-License-Identifier: GPL-2.0-or-later
7*161f5bc8SRichard Henderson  */
8*161f5bc8SRichard Henderson 
9*161f5bc8SRichard Henderson #ifndef EXEC_ICOUNT_H
10*161f5bc8SRichard Henderson #define EXEC_ICOUNT_H
11*161f5bc8SRichard Henderson 
12*161f5bc8SRichard Henderson /**
13*161f5bc8SRichard Henderson  * ICountMode: icount enablement state:
14*161f5bc8SRichard Henderson  *
15*161f5bc8SRichard Henderson  * @ICOUNT_DISABLED: Disabled - Do not count executed instructions.
16*161f5bc8SRichard Henderson  * @ICOUNT_PRECISE: Enabled - Fixed conversion of insn to ns via "shift" option
17*161f5bc8SRichard Henderson  * @ICOUNT_ADAPTATIVE: Enabled - Runtime adaptive algorithm to compute shift
18*161f5bc8SRichard Henderson  */
19*161f5bc8SRichard Henderson typedef enum {
20*161f5bc8SRichard Henderson     ICOUNT_DISABLED = 0,
21*161f5bc8SRichard Henderson     ICOUNT_PRECISE,
22*161f5bc8SRichard Henderson     ICOUNT_ADAPTATIVE,
23*161f5bc8SRichard Henderson } ICountMode;
24*161f5bc8SRichard Henderson 
25*161f5bc8SRichard Henderson #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
26*161f5bc8SRichard Henderson extern ICountMode use_icount;
27*161f5bc8SRichard Henderson #define icount_enabled() (use_icount)
28*161f5bc8SRichard Henderson #else
29*161f5bc8SRichard Henderson #define icount_enabled() ICOUNT_DISABLED
30*161f5bc8SRichard Henderson #endif
31*161f5bc8SRichard Henderson 
32*161f5bc8SRichard Henderson /*
33*161f5bc8SRichard Henderson  * Update the icount with the executed instructions. Called by
34*161f5bc8SRichard Henderson  * cpus-tcg vCPU thread so the main-loop can see time has moved forward.
35*161f5bc8SRichard Henderson  */
36*161f5bc8SRichard Henderson void icount_update(CPUState *cpu);
37*161f5bc8SRichard Henderson 
38*161f5bc8SRichard Henderson /* get raw icount value */
39*161f5bc8SRichard Henderson int64_t icount_get_raw(void);
40*161f5bc8SRichard Henderson 
41*161f5bc8SRichard Henderson /* return the virtual CPU time in ns, based on the instruction counter. */
42*161f5bc8SRichard Henderson int64_t icount_get(void);
43*161f5bc8SRichard Henderson /*
44*161f5bc8SRichard Henderson  * convert an instruction counter value to ns, based on the icount shift.
45*161f5bc8SRichard Henderson  * This shift is set as a fixed value with the icount "shift" option
46*161f5bc8SRichard Henderson  * (precise mode), or it is constantly approximated and corrected at
47*161f5bc8SRichard Henderson  * runtime in adaptive mode.
48*161f5bc8SRichard Henderson  */
49*161f5bc8SRichard Henderson int64_t icount_to_ns(int64_t icount);
50*161f5bc8SRichard Henderson 
51*161f5bc8SRichard Henderson /**
52*161f5bc8SRichard Henderson  * icount_configure: configure the icount options, including "shift"
53*161f5bc8SRichard Henderson  * @opts: Options to parse
54*161f5bc8SRichard Henderson  * @errp: pointer to a NULL-initialized error object
55*161f5bc8SRichard Henderson  *
56*161f5bc8SRichard Henderson  * Return: true on success, else false setting @errp with error
57*161f5bc8SRichard Henderson  */
58*161f5bc8SRichard Henderson bool icount_configure(QemuOpts *opts, Error **errp);
59*161f5bc8SRichard Henderson 
60*161f5bc8SRichard Henderson /* used by tcg vcpu thread to calc icount budget */
61*161f5bc8SRichard Henderson int64_t icount_round(int64_t count);
62*161f5bc8SRichard Henderson 
63*161f5bc8SRichard Henderson /* if the CPUs are idle, start accounting real time to virtual clock. */
64*161f5bc8SRichard Henderson void icount_start_warp_timer(void);
65*161f5bc8SRichard Henderson void icount_account_warp_timer(void);
66*161f5bc8SRichard Henderson void icount_notify_exit(void);
67*161f5bc8SRichard Henderson 
68*161f5bc8SRichard Henderson #endif /* EXEC_ICOUNT_H */
69