]>
Commit | Line | Data |
---|---|---|
740b1759 CF |
1 | /* |
2 | * CPU timers state API | |
3 | * | |
4 | * Copyright 2020 SUSE LLC | |
5 | * | |
6 | * This work is licensed under the terms of the GNU GPL, version 2 or later. | |
7 | * See the COPYING file in the top-level directory. | |
8 | * | |
9 | */ | |
10 | #ifndef SYSEMU_CPU_TIMERS_H | |
11 | #define SYSEMU_CPU_TIMERS_H | |
12 | ||
13 | #include "qemu/timer.h" | |
14 | ||
15 | /* init the whole cpu timers API, including icount, ticks, and cpu_throttle */ | |
16 | void cpu_timers_init(void); | |
17 | ||
18 | /* icount - Instruction Counter API */ | |
19 | ||
20 | /* | |
21 | * icount enablement state: | |
22 | * | |
23 | * 0 = Disabled - Do not count executed instructions. | |
24 | * 1 = Enabled - Fixed conversion of insn to ns via "shift" option | |
25 | * 2 = Enabled - Runtime adaptive algorithm to compute shift | |
26 | */ | |
27 | #ifdef CONFIG_TCG | |
28 | extern int use_icount; | |
29 | #define icount_enabled() (use_icount) | |
30 | #else | |
31 | #define icount_enabled() 0 | |
32 | #endif | |
33 | ||
34 | /* | |
35 | * Update the icount with the executed instructions. Called by | |
36 | * cpus-tcg vCPU thread so the main-loop can see time has moved forward. | |
37 | */ | |
8191d368 | 38 | void icount_update(CPUState *cpu); |
740b1759 CF |
39 | |
40 | /* get raw icount value */ | |
8191d368 | 41 | int64_t icount_get_raw(void); |
740b1759 CF |
42 | |
43 | /* return the virtual CPU time in ns, based on the instruction counter. */ | |
8191d368 | 44 | int64_t icount_get(void); |
740b1759 CF |
45 | /* |
46 | * convert an instruction counter value to ns, based on the icount shift. | |
47 | * This shift is set as a fixed value with the icount "shift" option | |
48 | * (precise mode), or it is constantly approximated and corrected at | |
49 | * runtime in adaptive mode. | |
50 | */ | |
8191d368 | 51 | int64_t icount_to_ns(int64_t icount); |
740b1759 CF |
52 | |
53 | /* configure the icount options, including "shift" */ | |
8191d368 | 54 | void icount_configure(QemuOpts *opts, Error **errp); |
740b1759 CF |
55 | |
56 | /* used by tcg vcpu thread to calc icount budget */ | |
8191d368 | 57 | int64_t icount_round(int64_t count); |
740b1759 CF |
58 | |
59 | /* if the CPUs are idle, start accounting real time to virtual clock. */ | |
8191d368 CF |
60 | void icount_start_warp_timer(void); |
61 | void icount_account_warp_timer(void); | |
740b1759 CF |
62 | |
63 | /* | |
64 | * CPU Ticks and Clock | |
65 | */ | |
66 | ||
67 | /* Caller must hold BQL */ | |
68 | void cpu_enable_ticks(void); | |
69 | /* Caller must hold BQL */ | |
70 | void cpu_disable_ticks(void); | |
71 | ||
72 | /* | |
430065da CF |
73 | * return the time elapsed in VM between vm_start and vm_stop. |
74 | * cpu_get_ticks() uses units of the host CPU cycle counter. | |
740b1759 CF |
75 | */ |
76 | int64_t cpu_get_ticks(void); | |
77 | ||
78 | /* | |
79 | * Returns the monotonic time elapsed in VM, i.e., | |
80 | * the time between vm_start and vm_stop | |
81 | */ | |
82 | int64_t cpu_get_clock(void); | |
83 | ||
84 | void qemu_timer_notify_cb(void *opaque, QEMUClockType type); | |
85 | ||
430065da CF |
86 | /* get the VIRTUAL clock and VM elapsed ticks via the cpus accel interface */ |
87 | int64_t cpus_get_virtual_clock(void); | |
88 | int64_t cpus_get_elapsed_ticks(void); | |
89 | ||
740b1759 | 90 | #endif /* SYSEMU_CPU_TIMERS_H */ |