mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 02:24:58 -06:00
cpu-timers, icount: new modules
refactoring of cpus.c continues with cpu timer state extraction. cpu-timers: responsible for the softmmu cpu timers state, including cpu clocks and ticks. icount: counts the TCG instructions executed. As such it is specific to the TCG accelerator. Therefore, it is built only under CONFIG_TCG. One complication is due to qtest, which uses an icount field to warp time as part of qtest (qtest_clock_warp). In order to solve this problem, provide a separate counter for qtest. This requires fixing assumptions scattered in the code that qtest_enabled() implies icount_enabled(), checking each specific case. Signed-off-by: Claudio Fontana <cfontana@suse.de> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> [remove redundant initialization with qemu_spice_init] Reviewed-by: Alex Bennée <alex.bennee@linaro.org> [fix lingering calls to icount_get] Signed-off-by: Claudio Fontana <cfontana@suse.de> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
0ac0b47c44
commit
740b175973
37 changed files with 1128 additions and 843 deletions
87
include/sysemu/cpu-timers.h
Normal file
87
include/sysemu/cpu-timers.h
Normal file
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
* 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 SYSEMU_CPU_TIMERS_H
|
||||
#define SYSEMU_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 */
|
||||
|
||||
/*
|
||||
* icount enablement state:
|
||||
*
|
||||
* 0 = Disabled - Do not count executed instructions.
|
||||
* 1 = Enabled - Fixed conversion of insn to ns via "shift" option
|
||||
* 2 = Enabled - Runtime adaptive algorithm to compute shift
|
||||
*/
|
||||
#ifdef CONFIG_TCG
|
||||
extern int use_icount;
|
||||
#define icount_enabled() (use_icount)
|
||||
#else
|
||||
#define icount_enabled() 0
|
||||
#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 cpu_update_icount(CPUState *cpu);
|
||||
|
||||
/* get raw icount value */
|
||||
int64_t cpu_get_icount_raw(void);
|
||||
|
||||
/* return the virtual CPU time in ns, based on the instruction counter. */
|
||||
int64_t cpu_get_icount(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 cpu_icount_to_ns(int64_t icount);
|
||||
|
||||
/* configure the icount options, including "shift" */
|
||||
void configure_icount(QemuOpts *opts, Error **errp);
|
||||
|
||||
/* used by tcg vcpu thread to calc icount budget */
|
||||
int64_t qemu_icount_round(int64_t count);
|
||||
|
||||
/* if the CPUs are idle, start accounting real time to virtual clock. */
|
||||
void qemu_start_warp_timer(void);
|
||||
void qemu_account_warp_timer(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. Unless
|
||||
* icount is active, 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);
|
||||
|
||||
#endif /* SYSEMU_CPU_TIMERS_H */
|
|
@ -4,33 +4,23 @@
|
|||
#include "qemu/timer.h"
|
||||
|
||||
/* cpus.c */
|
||||
bool all_cpu_threads_idle(void);
|
||||
bool qemu_in_vcpu_thread(void);
|
||||
void qemu_init_cpu_loop(void);
|
||||
void resume_all_vcpus(void);
|
||||
void pause_all_vcpus(void);
|
||||
void cpu_stop_current(void);
|
||||
void cpu_ticks_init(void);
|
||||
|
||||
void configure_icount(QemuOpts *opts, Error **errp);
|
||||
extern int use_icount;
|
||||
extern int icount_align_option;
|
||||
|
||||
/* drift information for info jit command */
|
||||
extern int64_t max_delay;
|
||||
extern int64_t max_advance;
|
||||
void dump_drift_info(void);
|
||||
|
||||
/* Unblock cpu */
|
||||
void qemu_cpu_kick_self(void);
|
||||
void qemu_timer_notify_cb(void *opaque, QEMUClockType type);
|
||||
|
||||
void cpu_synchronize_all_states(void);
|
||||
void cpu_synchronize_all_post_reset(void);
|
||||
void cpu_synchronize_all_post_init(void);
|
||||
void cpu_synchronize_all_pre_loadvm(void);
|
||||
|
||||
void qtest_clock_warp(int64_t dest);
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
/* vl.c */
|
||||
/* *-user doesn't have configurable SMP topology */
|
||||
|
|
|
@ -30,4 +30,6 @@ void qtest_server_set_send_handler(void (*send)(void *, const char *),
|
|||
void *opaque);
|
||||
void qtest_server_inproc_recv(void *opaque, const char *buf);
|
||||
|
||||
int64_t qtest_get_virtual_clock(void);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue