plugins/api: split out time control helpers

These are only usable in system mode where we control the timer. For
user-mode make them NOPs.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20250304222439.2035603-29-alex.bennee@linaro.org>
This commit is contained in:
Alex Bennée 2025-03-04 22:24:35 +00:00
parent 455a2d265c
commit 1d3e745f7a
3 changed files with 51 additions and 41 deletions

View file

@ -95,3 +95,37 @@ const char *qemu_plugin_hwaddr_device_name(const struct qemu_plugin_hwaddr *h)
return g_intern_static_string("RAM");
}
}
/*
* Time control
*/
static bool has_control;
static Error *migration_blocker;
const void *qemu_plugin_request_time_control(void)
{
if (!has_control) {
has_control = true;
error_setg(&migration_blocker,
"TCG plugin time control does not support migration");
migrate_add_blocker(&migration_blocker, NULL);
return &has_control;
}
return NULL;
}
static void advance_virtual_time__async(CPUState *cpu, run_on_cpu_data data)
{
int64_t new_time = data.host_ulong;
qemu_clock_advance_virtual_time(new_time);
}
void qemu_plugin_update_ns(const void *handle, int64_t new_time)
{
if (handle == &has_control) {
/* Need to execute out of cpu_exec, so bql can be locked. */
async_run_on_cpu(current_cpu,
advance_virtual_time__async,
RUN_ON_CPU_HOST_ULONG(new_time));
}
}

View file

@ -12,6 +12,7 @@
#include "qemu/osdep.h"
#include "qemu/plugin.h"
#include "exec/log.h"
/*
* Virtual Memory queries - these are all NOPs for user-mode which
@ -38,3 +39,19 @@ const char *qemu_plugin_hwaddr_device_name(const struct qemu_plugin_hwaddr *h)
{
return g_intern_static_string("Invalid");
}
/*
* Time control - for user mode the only real time is wall clock time
* so realistically all you can do in user mode is slow down execution
* which doesn't require the ability to mess with the clock.
*/
const void *qemu_plugin_request_time_control(void)
{
return NULL;
}
void qemu_plugin_update_ns(const void *handle, int64_t new_time)
{
qemu_log_mask(LOG_UNIMP, "user-mode can't control time");
}

View file

@ -526,44 +526,3 @@ uint64_t qemu_plugin_u64_sum(qemu_plugin_u64 entry)
return total;
}
/*
* Time control
*/
static bool has_control;
#ifdef CONFIG_SOFTMMU
static Error *migration_blocker;
#endif
const void *qemu_plugin_request_time_control(void)
{
if (!has_control) {
has_control = true;
#ifdef CONFIG_SOFTMMU
error_setg(&migration_blocker,
"TCG plugin time control does not support migration");
migrate_add_blocker(&migration_blocker, NULL);
#endif
return &has_control;
}
return NULL;
}
#ifdef CONFIG_SOFTMMU
static void advance_virtual_time__async(CPUState *cpu, run_on_cpu_data data)
{
int64_t new_time = data.host_ulong;
qemu_clock_advance_virtual_time(new_time);
}
#endif
void qemu_plugin_update_ns(const void *handle, int64_t new_time)
{
#ifdef CONFIG_SOFTMMU
if (handle == &has_control) {
/* Need to execute out of cpu_exec, so bql can be locked. */
async_run_on_cpu(current_cpu,
advance_virtual_time__async,
RUN_ON_CPU_HOST_ULONG(new_time));
}
#endif
}