mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-27 04:13:53 -06:00
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:
parent
455a2d265c
commit
1d3e745f7a
3 changed files with 51 additions and 41 deletions
|
@ -95,3 +95,37 @@ const char *qemu_plugin_hwaddr_device_name(const struct qemu_plugin_hwaddr *h)
|
||||||
return g_intern_static_string("RAM");
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qemu/plugin.h"
|
#include "qemu/plugin.h"
|
||||||
|
#include "exec/log.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Virtual Memory queries - these are all NOPs for user-mode which
|
* 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");
|
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");
|
||||||
|
}
|
||||||
|
|
|
@ -526,44 +526,3 @@ uint64_t qemu_plugin_u64_sum(qemu_plugin_u64 entry)
|
||||||
return total;
|
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
|
|
||||||
}
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue