| /* | 
 |  * icount - Instruction Counter API | 
 |  * CPU timers state API | 
 |  * | 
 |  * Copyright 2020 SUSE LLC | 
 |  * SPDX-License-Identifier: GPL-2.0-or-later | 
 |  */ | 
 |  | 
 | #ifndef EXEC_ICOUNT_H | 
 | #define EXEC_ICOUNT_H | 
 |  | 
 | /** | 
 |  * ICountMode: icount enablement state: | 
 |  * | 
 |  * @ICOUNT_DISABLED: Disabled - Do not count executed instructions. | 
 |  * @ICOUNT_PRECISE: Enabled - Fixed conversion of insn to ns via "shift" option | 
 |  * @ICOUNT_ADAPTATIVE: Enabled - Runtime adaptive algorithm to compute shift | 
 |  */ | 
 | typedef enum { | 
 |     ICOUNT_DISABLED = 0, | 
 |     ICOUNT_PRECISE, | 
 |     ICOUNT_ADAPTATIVE, | 
 | } ICountMode; | 
 |  | 
 | #ifdef CONFIG_TCG | 
 | extern ICountMode use_icount; | 
 | #define icount_enabled() (use_icount) | 
 | #else | 
 | #define icount_enabled() ICOUNT_DISABLED | 
 | #endif | 
 |  | 
 | /* Protect the CONFIG_USER_ONLY test vs poisoning. */ | 
 | #if defined(COMPILING_PER_TARGET) || defined(COMPILING_SYSTEM_VS_USER) | 
 | # ifdef CONFIG_USER_ONLY | 
 | #  undef  icount_enabled | 
 | #  define icount_enabled() ICOUNT_DISABLED | 
 | # endif | 
 | #endif | 
 |  | 
 | /* | 
 |  * Update the icount with the executed instructions. Called by | 
 |  * cpus-tcg vCPU thread so the main-loop can see time has moved forward. | 
 |  */ | 
 | void icount_update(CPUState *cpu); | 
 |  | 
 | /* get raw icount value */ | 
 | int64_t icount_get_raw(void); | 
 |  | 
 | /* return the virtual CPU time in ns, based on the instruction counter. */ | 
 | int64_t icount_get(void); | 
 | /* | 
 |  * convert an instruction counter value to ns, based on the icount shift. | 
 |  * This shift is set as a fixed value with the icount "shift" option | 
 |  * (precise mode), or it is constantly approximated and corrected at | 
 |  * runtime in adaptive mode. | 
 |  */ | 
 | int64_t icount_to_ns(int64_t icount); | 
 |  | 
 | /** | 
 |  * icount_configure: configure the icount options, including "shift" | 
 |  * @opts: Options to parse | 
 |  * @errp: pointer to a NULL-initialized error object | 
 |  * | 
 |  * Return: true on success, else false setting @errp with error | 
 |  */ | 
 | bool icount_configure(QemuOpts *opts, Error **errp); | 
 |  | 
 | /* used by tcg vcpu thread to calc icount budget */ | 
 | int64_t icount_round(int64_t count); | 
 |  | 
 | /* if the CPUs are idle, start accounting real time to virtual clock. */ | 
 | void icount_start_warp_timer(void); | 
 | void icount_account_warp_timer(void); | 
 | void icount_notify_exit(void); | 
 |  | 
 | #endif /* EXEC_ICOUNT_H */ |