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