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