mirror of https://github.com/xemu-project/xemu.git
sysemu: generalise qtest_warp_clock as qemu_clock_advance_virtual_time
Move the key functionality of moving time forward into the clock sub-system itself. This will allow us to plumb in time control into plugins. Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20240620152220.2192768-7-alex.bennee@linaro.org>
This commit is contained in:
parent
e83e386200
commit
ffbc394946
|
@ -245,6 +245,21 @@ bool qemu_clock_run_timers(QEMUClockType type);
|
||||||
*/
|
*/
|
||||||
bool qemu_clock_run_all_timers(void);
|
bool qemu_clock_run_all_timers(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qemu_clock_advance_virtual_time(): advance the virtual time tick
|
||||||
|
* @target_ns: target time in nanoseconds
|
||||||
|
*
|
||||||
|
* This function is used where the control of the flow of time has
|
||||||
|
* been delegated to outside the clock subsystem (be it qtest, icount
|
||||||
|
* or some other external source). You can ask the clock system to
|
||||||
|
* return @early at the first expired timer.
|
||||||
|
*
|
||||||
|
* Time can only move forward, attempts to reverse time would lead to
|
||||||
|
* an error.
|
||||||
|
*
|
||||||
|
* Returns: new virtual time.
|
||||||
|
*/
|
||||||
|
int64_t qemu_clock_advance_virtual_time(int64_t target_ns);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* QEMUTimerList
|
* QEMUTimerList
|
||||||
|
|
|
@ -337,26 +337,6 @@ void qtest_set_virtual_clock(int64_t count)
|
||||||
qatomic_set_i64(&qtest_clock_counter, count);
|
qatomic_set_i64(&qtest_clock_counter, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qtest_clock_warp(int64_t dest)
|
|
||||||
{
|
|
||||||
int64_t clock = cpus_get_virtual_clock();
|
|
||||||
AioContext *aio_context;
|
|
||||||
assert(qtest_enabled());
|
|
||||||
aio_context = qemu_get_aio_context();
|
|
||||||
while (clock < dest) {
|
|
||||||
int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL,
|
|
||||||
QEMU_TIMER_ATTR_ALL);
|
|
||||||
int64_t warp = qemu_soonest_timeout(dest - clock, deadline);
|
|
||||||
|
|
||||||
cpus_set_virtual_clock(cpus_get_virtual_clock() + warp);
|
|
||||||
|
|
||||||
qemu_clock_run_timers(QEMU_CLOCK_VIRTUAL);
|
|
||||||
timerlist_run_timers(aio_context->tlg.tl[QEMU_CLOCK_VIRTUAL]);
|
|
||||||
clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
|
|
||||||
}
|
|
||||||
qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool (*process_command_cb)(CharBackend *chr, gchar **words);
|
static bool (*process_command_cb)(CharBackend *chr, gchar **words);
|
||||||
|
|
||||||
void qtest_set_command_cb(bool (*pc_cb)(CharBackend *chr, gchar **words))
|
void qtest_set_command_cb(bool (*pc_cb)(CharBackend *chr, gchar **words))
|
||||||
|
@ -751,7 +731,8 @@ static void qtest_process_command(CharBackend *chr, gchar **words)
|
||||||
ns = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL,
|
ns = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL,
|
||||||
QEMU_TIMER_ATTR_ALL);
|
QEMU_TIMER_ATTR_ALL);
|
||||||
}
|
}
|
||||||
qtest_clock_warp(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + ns);
|
qemu_clock_advance_virtual_time(
|
||||||
|
qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + ns);
|
||||||
qtest_send_prefix(chr);
|
qtest_send_prefix(chr);
|
||||||
qtest_sendf(chr, "OK %"PRIi64"\n",
|
qtest_sendf(chr, "OK %"PRIi64"\n",
|
||||||
(int64_t)qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL));
|
(int64_t)qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL));
|
||||||
|
@ -777,7 +758,7 @@ static void qtest_process_command(CharBackend *chr, gchar **words)
|
||||||
g_assert(words[1]);
|
g_assert(words[1]);
|
||||||
ret = qemu_strtoi64(words[1], NULL, 0, &ns);
|
ret = qemu_strtoi64(words[1], NULL, 0, &ns);
|
||||||
g_assert(ret == 0);
|
g_assert(ret == 0);
|
||||||
qtest_clock_warp(ns);
|
qemu_clock_advance_virtual_time(ns);
|
||||||
qtest_send_prefix(chr);
|
qtest_send_prefix(chr);
|
||||||
qtest_sendf(chr, "OK %"PRIi64"\n",
|
qtest_sendf(chr, "OK %"PRIi64"\n",
|
||||||
(int64_t)qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL));
|
(int64_t)qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL));
|
||||||
|
|
|
@ -645,6 +645,11 @@ int64_t qemu_clock_get_ns(QEMUClockType type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void qemu_virtual_clock_set_ns(int64_t time)
|
||||||
|
{
|
||||||
|
return cpus_set_virtual_clock(time);
|
||||||
|
}
|
||||||
|
|
||||||
void init_clocks(QEMUTimerListNotifyCB *notify_cb)
|
void init_clocks(QEMUTimerListNotifyCB *notify_cb)
|
||||||
{
|
{
|
||||||
QEMUClockType type;
|
QEMUClockType type;
|
||||||
|
@ -675,3 +680,24 @@ bool qemu_clock_run_all_timers(void)
|
||||||
|
|
||||||
return progress;
|
return progress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t qemu_clock_advance_virtual_time(int64_t dest)
|
||||||
|
{
|
||||||
|
int64_t clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
|
||||||
|
AioContext *aio_context;
|
||||||
|
aio_context = qemu_get_aio_context();
|
||||||
|
while (clock < dest) {
|
||||||
|
int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL,
|
||||||
|
QEMU_TIMER_ATTR_ALL);
|
||||||
|
int64_t warp = qemu_soonest_timeout(dest - clock, deadline);
|
||||||
|
|
||||||
|
qemu_virtual_clock_set_ns(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + warp);
|
||||||
|
|
||||||
|
qemu_clock_run_timers(QEMU_CLOCK_VIRTUAL);
|
||||||
|
timerlist_run_timers(aio_context->tlg.tl[QEMU_CLOCK_VIRTUAL]);
|
||||||
|
clock = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
|
||||||
|
}
|
||||||
|
qemu_clock_notify(QEMU_CLOCK_VIRTUAL);
|
||||||
|
|
||||||
|
return clock;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue