/* * 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 */