xref: /openbmc/qemu/include/exec/icount.h (revision fc524567087c2537b5103cdfc1d41e4f442892b6)
1161f5bc8SRichard Henderson /*
2161f5bc8SRichard Henderson  * icount - Instruction Counter API
3161f5bc8SRichard Henderson  * CPU timers state API
4161f5bc8SRichard Henderson  *
5161f5bc8SRichard Henderson  * Copyright 2020 SUSE LLC
6161f5bc8SRichard Henderson  * SPDX-License-Identifier: GPL-2.0-or-later
7161f5bc8SRichard Henderson  */
8161f5bc8SRichard Henderson 
9161f5bc8SRichard Henderson #ifndef EXEC_ICOUNT_H
10161f5bc8SRichard Henderson #define EXEC_ICOUNT_H
11161f5bc8SRichard Henderson 
12161f5bc8SRichard Henderson /**
13161f5bc8SRichard Henderson  * ICountMode: icount enablement state:
14161f5bc8SRichard Henderson  *
15161f5bc8SRichard Henderson  * @ICOUNT_DISABLED: Disabled - Do not count executed instructions.
16161f5bc8SRichard Henderson  * @ICOUNT_PRECISE: Enabled - Fixed conversion of insn to ns via "shift" option
17161f5bc8SRichard Henderson  * @ICOUNT_ADAPTATIVE: Enabled - Runtime adaptive algorithm to compute shift
18161f5bc8SRichard Henderson  */
19161f5bc8SRichard Henderson typedef enum {
20161f5bc8SRichard Henderson     ICOUNT_DISABLED = 0,
21161f5bc8SRichard Henderson     ICOUNT_PRECISE,
22161f5bc8SRichard Henderson     ICOUNT_ADAPTATIVE,
23161f5bc8SRichard Henderson } ICountMode;
24161f5bc8SRichard Henderson 
25*1751889bSRichard Henderson #ifdef CONFIG_TCG
26161f5bc8SRichard Henderson extern ICountMode use_icount;
27161f5bc8SRichard Henderson #define icount_enabled() (use_icount)
28161f5bc8SRichard Henderson #else
29161f5bc8SRichard Henderson #define icount_enabled() ICOUNT_DISABLED
30161f5bc8SRichard Henderson #endif
31161f5bc8SRichard Henderson 
32*1751889bSRichard Henderson /* Protect the CONFIG_USER_ONLY test vs poisoning. */
33*1751889bSRichard Henderson #if defined(COMPILING_PER_TARGET) || defined(COMPILING_SYSTEM_VS_USER)
34*1751889bSRichard Henderson # ifdef CONFIG_USER_ONLY
35*1751889bSRichard Henderson #  undef  icount_enabled
36*1751889bSRichard Henderson #  define icount_enabled() ICOUNT_DISABLED
37*1751889bSRichard Henderson # endif
38*1751889bSRichard Henderson #endif
39*1751889bSRichard Henderson 
40161f5bc8SRichard Henderson /*
41161f5bc8SRichard Henderson  * Update the icount with the executed instructions. Called by
42161f5bc8SRichard Henderson  * cpus-tcg vCPU thread so the main-loop can see time has moved forward.
43161f5bc8SRichard Henderson  */
44161f5bc8SRichard Henderson void icount_update(CPUState *cpu);
45161f5bc8SRichard Henderson 
46161f5bc8SRichard Henderson /* get raw icount value */
47161f5bc8SRichard Henderson int64_t icount_get_raw(void);
48161f5bc8SRichard Henderson 
49161f5bc8SRichard Henderson /* return the virtual CPU time in ns, based on the instruction counter. */
50161f5bc8SRichard Henderson int64_t icount_get(void);
51161f5bc8SRichard Henderson /*
52161f5bc8SRichard Henderson  * convert an instruction counter value to ns, based on the icount shift.
53161f5bc8SRichard Henderson  * This shift is set as a fixed value with the icount "shift" option
54161f5bc8SRichard Henderson  * (precise mode), or it is constantly approximated and corrected at
55161f5bc8SRichard Henderson  * runtime in adaptive mode.
56161f5bc8SRichard Henderson  */
57161f5bc8SRichard Henderson int64_t icount_to_ns(int64_t icount);
58161f5bc8SRichard Henderson 
59161f5bc8SRichard Henderson /**
60161f5bc8SRichard Henderson  * icount_configure: configure the icount options, including "shift"
61161f5bc8SRichard Henderson  * @opts: Options to parse
62161f5bc8SRichard Henderson  * @errp: pointer to a NULL-initialized error object
63161f5bc8SRichard Henderson  *
64161f5bc8SRichard Henderson  * Return: true on success, else false setting @errp with error
65161f5bc8SRichard Henderson  */
66161f5bc8SRichard Henderson bool icount_configure(QemuOpts *opts, Error **errp);
67161f5bc8SRichard Henderson 
68161f5bc8SRichard Henderson /* used by tcg vcpu thread to calc icount budget */
69161f5bc8SRichard Henderson int64_t icount_round(int64_t count);
70161f5bc8SRichard Henderson 
71161f5bc8SRichard Henderson /* if the CPUs are idle, start accounting real time to virtual clock. */
72161f5bc8SRichard Henderson void icount_start_warp_timer(void);
73161f5bc8SRichard Henderson void icount_account_warp_timer(void);
74161f5bc8SRichard Henderson void icount_notify_exit(void);
75161f5bc8SRichard Henderson 
76161f5bc8SRichard Henderson #endif /* EXEC_ICOUNT_H */
77