123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- /*
- * CPU timers state API
- *
- * Copyright 2020 SUSE LLC
- *
- * This work is licensed under the terms of the GNU GPL, version 2 or later.
- * See the COPYING file in the top-level directory.
- *
- */
- #ifndef SYSTEM_CPU_TIMERS_H
- #define SYSTEM_CPU_TIMERS_H
- #include "qemu/timer.h"
- /* init the whole cpu timers API, including icount, ticks, and cpu_throttle */
- void cpu_timers_init(void);
- /* icount - Instruction Counter API */
- /**
- * 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;
- #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
- extern ICountMode use_icount;
- #define icount_enabled() (use_icount)
- #else
- #define icount_enabled() ICOUNT_DISABLED
- #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);
- /*
- * CPU Ticks and Clock
- */
- /* Caller must hold BQL */
- void cpu_enable_ticks(void);
- /* Caller must hold BQL */
- void cpu_disable_ticks(void);
- /*
- * return the time elapsed in VM between vm_start and vm_stop.
- * cpu_get_ticks() uses units of the host CPU cycle counter.
- */
- int64_t cpu_get_ticks(void);
- /*
- * Returns the monotonic time elapsed in VM, i.e.,
- * the time between vm_start and vm_stop
- */
- int64_t cpu_get_clock(void);
- void qemu_timer_notify_cb(void *opaque, QEMUClockType type);
- /* get/set VIRTUAL clock and VM elapsed ticks via the cpus accel interface */
- int64_t cpus_get_virtual_clock(void);
- void cpus_set_virtual_clock(int64_t new_time);
- int64_t cpus_get_elapsed_ticks(void);
- #endif /* SYSTEM_CPU_TIMERS_H */
|