mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
sysemu: add set_virtual_time to accel ops
We are about to remove direct calls to individual accelerators for this information and will need a central point for plugins to hook into time changes. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20240530220610.1245424-2-pierrick.bouvier@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20240620152220.2192768-5-alex.bennee@linaro.org>
This commit is contained in:
parent
ad59d5caee
commit
113ac1d212
5 changed files with 36 additions and 3 deletions
|
@ -20,7 +20,12 @@
|
|||
typedef struct AccelOpsClass AccelOpsClass;
|
||||
DECLARE_CLASS_CHECKERS(AccelOpsClass, ACCEL_OPS, TYPE_ACCEL_OPS)
|
||||
|
||||
/* cpus.c operations interface */
|
||||
/**
|
||||
* struct AccelOpsClass - accelerator interfaces
|
||||
*
|
||||
* This structure is used to abstract accelerator differences from the
|
||||
* core CPU code. Not all have to be implemented.
|
||||
*/
|
||||
struct AccelOpsClass {
|
||||
/*< private >*/
|
||||
ObjectClass parent_class;
|
||||
|
@ -44,7 +49,18 @@ struct AccelOpsClass {
|
|||
|
||||
void (*handle_interrupt)(CPUState *cpu, int mask);
|
||||
|
||||
/**
|
||||
* @get_virtual_clock: fetch virtual clock
|
||||
* @set_virtual_clock: set virtual clock
|
||||
*
|
||||
* These allow the timer subsystem to defer to the accelerator to
|
||||
* fetch time. The set function is needed if the accelerator wants
|
||||
* to track the changes to time as the timer is warped through
|
||||
* various timer events.
|
||||
*/
|
||||
int64_t (*get_virtual_clock)(void);
|
||||
void (*set_virtual_clock)(int64_t time);
|
||||
|
||||
int64_t (*get_elapsed_ticks)(void);
|
||||
|
||||
/* gdbstub hooks */
|
||||
|
|
|
@ -96,8 +96,9 @@ int64_t cpu_get_clock(void);
|
|||
|
||||
void qemu_timer_notify_cb(void *opaque, QEMUClockType type);
|
||||
|
||||
/* get the VIRTUAL clock and VM elapsed ticks via the cpus accel interface */
|
||||
/* 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 /* SYSEMU_CPU_TIMERS_H */
|
||||
|
|
|
@ -6,3 +6,8 @@ int64_t cpus_get_virtual_clock(void)
|
|||
{
|
||||
return cpu_get_clock();
|
||||
}
|
||||
|
||||
void cpus_set_virtual_clock(int64_t new_time)
|
||||
{
|
||||
/* do nothing */
|
||||
}
|
|
@ -29,7 +29,7 @@ endif
|
|||
if have_block or have_ga
|
||||
stub_ss.add(files('replay-tools.c'))
|
||||
# stubs for hooks in util/main-loop.c, util/async.c etc.
|
||||
stub_ss.add(files('cpus-get-virtual-clock.c'))
|
||||
stub_ss.add(files('cpus-virtual-clock.c'))
|
||||
stub_ss.add(files('icount.c'))
|
||||
stub_ss.add(files('graph-lock.c'))
|
||||
if linux_io_uring.found()
|
||||
|
|
|
@ -229,6 +229,17 @@ int64_t cpus_get_virtual_clock(void)
|
|||
return cpu_get_clock();
|
||||
}
|
||||
|
||||
/*
|
||||
* Signal the new virtual time to the accelerator. This is only needed
|
||||
* by accelerators that need to track the changes as we warp time.
|
||||
*/
|
||||
void cpus_set_virtual_clock(int64_t new_time)
|
||||
{
|
||||
if (cpus_accel && cpus_accel->set_virtual_clock) {
|
||||
cpus_accel->set_virtual_clock(new_time);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* return the time elapsed in VM between vm_start and vm_stop. Unless
|
||||
* icount is active, cpus_get_elapsed_ticks() uses units of the host CPU cycle
|
||||
|
|
Loading…
Reference in a new issue