master
h 76 lines 2.09 KB
Raw
1 /*
2 * icount - Instruction Counter API
3 * CPU timers state API
4 *
5 * Copyright 2020 SUSE LLC
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9 #ifndef EXEC_ICOUNT_H
10 #define EXEC_ICOUNT_H
11
12 /**
13 * ICountMode: icount enablement state:
14 *
15 * @ICOUNT_DISABLED: Disabled - Do not count executed instructions.
16 * @ICOUNT_PRECISE: Enabled - Fixed conversion of insn to ns via "shift" option
17 * @ICOUNT_ADAPTATIVE: Enabled - Runtime adaptive algorithm to compute shift
18 */
19 typedef enum {
20 ICOUNT_DISABLED = 0,
21 ICOUNT_PRECISE,
22 ICOUNT_ADAPTATIVE,
23 } ICountMode;
24
25 #ifdef CONFIG_TCG
26 extern ICountMode use_icount;
27 #define icount_enabled() (use_icount)
28 #else
29 #define icount_enabled() ICOUNT_DISABLED
30 #endif
31
32 /* Protect the CONFIG_USER_ONLY test vs poisoning. */
33 #if defined(COMPILING_PER_TARGET) || defined(COMPILING_SYSTEM_VS_USER)
34 # ifdef CONFIG_USER_ONLY
35 # undef icount_enabled
36 # define icount_enabled() ICOUNT_DISABLED
37 # endif
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 #endif /* EXEC_ICOUNT_H */