1*161f5bc8SRichard Henderson /* 2*161f5bc8SRichard Henderson * icount - Instruction Counter API 3*161f5bc8SRichard Henderson * CPU timers state API 4*161f5bc8SRichard Henderson * 5*161f5bc8SRichard Henderson * Copyright 2020 SUSE LLC 6*161f5bc8SRichard Henderson * SPDX-License-Identifier: GPL-2.0-or-later 7*161f5bc8SRichard Henderson */ 8*161f5bc8SRichard Henderson 9*161f5bc8SRichard Henderson #ifndef EXEC_ICOUNT_H 10*161f5bc8SRichard Henderson #define EXEC_ICOUNT_H 11*161f5bc8SRichard Henderson 12*161f5bc8SRichard Henderson /** 13*161f5bc8SRichard Henderson * ICountMode: icount enablement state: 14*161f5bc8SRichard Henderson * 15*161f5bc8SRichard Henderson * @ICOUNT_DISABLED: Disabled - Do not count executed instructions. 16*161f5bc8SRichard Henderson * @ICOUNT_PRECISE: Enabled - Fixed conversion of insn to ns via "shift" option 17*161f5bc8SRichard Henderson * @ICOUNT_ADAPTATIVE: Enabled - Runtime adaptive algorithm to compute shift 18*161f5bc8SRichard Henderson */ 19*161f5bc8SRichard Henderson typedef enum { 20*161f5bc8SRichard Henderson ICOUNT_DISABLED = 0, 21*161f5bc8SRichard Henderson ICOUNT_PRECISE, 22*161f5bc8SRichard Henderson ICOUNT_ADAPTATIVE, 23*161f5bc8SRichard Henderson } ICountMode; 24*161f5bc8SRichard Henderson 25*161f5bc8SRichard Henderson #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY) 26*161f5bc8SRichard Henderson extern ICountMode use_icount; 27*161f5bc8SRichard Henderson #define icount_enabled() (use_icount) 28*161f5bc8SRichard Henderson #else 29*161f5bc8SRichard Henderson #define icount_enabled() ICOUNT_DISABLED 30*161f5bc8SRichard Henderson #endif 31*161f5bc8SRichard Henderson 32*161f5bc8SRichard Henderson /* 33*161f5bc8SRichard Henderson * Update the icount with the executed instructions. Called by 34*161f5bc8SRichard Henderson * cpus-tcg vCPU thread so the main-loop can see time has moved forward. 35*161f5bc8SRichard Henderson */ 36*161f5bc8SRichard Henderson void icount_update(CPUState *cpu); 37*161f5bc8SRichard Henderson 38*161f5bc8SRichard Henderson /* get raw icount value */ 39*161f5bc8SRichard Henderson int64_t icount_get_raw(void); 40*161f5bc8SRichard Henderson 41*161f5bc8SRichard Henderson /* return the virtual CPU time in ns, based on the instruction counter. */ 42*161f5bc8SRichard Henderson int64_t icount_get(void); 43*161f5bc8SRichard Henderson /* 44*161f5bc8SRichard Henderson * convert an instruction counter value to ns, based on the icount shift. 45*161f5bc8SRichard Henderson * This shift is set as a fixed value with the icount "shift" option 46*161f5bc8SRichard Henderson * (precise mode), or it is constantly approximated and corrected at 47*161f5bc8SRichard Henderson * runtime in adaptive mode. 48*161f5bc8SRichard Henderson */ 49*161f5bc8SRichard Henderson int64_t icount_to_ns(int64_t icount); 50*161f5bc8SRichard Henderson 51*161f5bc8SRichard Henderson /** 52*161f5bc8SRichard Henderson * icount_configure: configure the icount options, including "shift" 53*161f5bc8SRichard Henderson * @opts: Options to parse 54*161f5bc8SRichard Henderson * @errp: pointer to a NULL-initialized error object 55*161f5bc8SRichard Henderson * 56*161f5bc8SRichard Henderson * Return: true on success, else false setting @errp with error 57*161f5bc8SRichard Henderson */ 58*161f5bc8SRichard Henderson bool icount_configure(QemuOpts *opts, Error **errp); 59*161f5bc8SRichard Henderson 60*161f5bc8SRichard Henderson /* used by tcg vcpu thread to calc icount budget */ 61*161f5bc8SRichard Henderson int64_t icount_round(int64_t count); 62*161f5bc8SRichard Henderson 63*161f5bc8SRichard Henderson /* if the CPUs are idle, start accounting real time to virtual clock. */ 64*161f5bc8SRichard Henderson void icount_start_warp_timer(void); 65*161f5bc8SRichard Henderson void icount_account_warp_timer(void); 66*161f5bc8SRichard Henderson void icount_notify_exit(void); 67*161f5bc8SRichard Henderson 68*161f5bc8SRichard Henderson #endif /* EXEC_ICOUNT_H */ 69