mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-09-28 23:34:00 +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
|
@ -20,7 +20,12 @@
|
||||||
typedef struct AccelOpsClass AccelOpsClass;
|
typedef struct AccelOpsClass AccelOpsClass;
|
||||||
DECLARE_CLASS_CHECKERS(AccelOpsClass, ACCEL_OPS, TYPE_ACCEL_OPS)
|
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 {
|
struct AccelOpsClass {
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
ObjectClass parent_class;
|
ObjectClass parent_class;
|
||||||
|
@ -44,7 +49,18 @@ struct AccelOpsClass {
|
||||||
|
|
||||||
void (*handle_interrupt)(CPUState *cpu, int mask);
|
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);
|
int64_t (*get_virtual_clock)(void);
|
||||||
|
void (*set_virtual_clock)(int64_t time);
|
||||||
|
|
||||||
int64_t (*get_elapsed_ticks)(void);
|
int64_t (*get_elapsed_ticks)(void);
|
||||||
|
|
||||||
/* gdbstub hooks */
|
/* gdbstub hooks */
|
||||||
|
|
|
@ -96,8 +96,9 @@ int64_t cpu_get_clock(void);
|
||||||
|
|
||||||
void qemu_timer_notify_cb(void *opaque, QEMUClockType type);
|
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);
|
int64_t cpus_get_virtual_clock(void);
|
||||||
|
void cpus_set_virtual_clock(int64_t new_time);
|
||||||
int64_t cpus_get_elapsed_ticks(void);
|
int64_t cpus_get_elapsed_ticks(void);
|
||||||
|
|
||||||
#endif /* SYSEMU_CPU_TIMERS_H */
|
#endif /* SYSEMU_CPU_TIMERS_H */
|
||||||
|
|
|
@ -6,3 +6,8 @@ int64_t cpus_get_virtual_clock(void)
|
||||||
{
|
{
|
||||||
return cpu_get_clock();
|
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
|
if have_block or have_ga
|
||||||
stub_ss.add(files('replay-tools.c'))
|
stub_ss.add(files('replay-tools.c'))
|
||||||
# stubs for hooks in util/main-loop.c, util/async.c etc.
|
# 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('icount.c'))
|
||||||
stub_ss.add(files('graph-lock.c'))
|
stub_ss.add(files('graph-lock.c'))
|
||||||
if linux_io_uring.found()
|
if linux_io_uring.found()
|
||||||
|
|
|
@ -229,6 +229,17 @@ int64_t cpus_get_virtual_clock(void)
|
||||||
return cpu_get_clock();
|
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
|
* 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
|
* icount is active, cpus_get_elapsed_ticks() uses units of the host CPU cycle
|
||||||
|
|
Loading…
Reference in a new issue