|
@@ -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));
|
|
|
+ }
|
|
|
+}
|