From: "Alex Bennée" <alex.bennee@linaro.org>
To: qemu-devel@nongnu.org
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
kvm@vger.kernel.org, qemu-ppc@nongnu.org,
"Christian Borntraeger" <borntraeger@linux.ibm.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Jamie Iles" <quic_jiles@quicinc.com>,
"David Hildenbrand" <david@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Pierrick Bouvier" <pierrick.bouvier@linaro.org>,
"Mark Burton" <mburton@qti.qualcomm.com>,
"Daniel Henrique Barboza" <danielhb413@gmail.com>,
qemu-arm@nongnu.org, "Laurent Vivier" <lvivier@redhat.com>,
"Alexander Graf" <agraf@csgraf.de>,
"Ilya Leoshkevich" <iii@linux.ibm.com>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Marco Liebel" <mliebel@qti.qualcomm.com>,
"Halil Pasic" <pasic@linux.ibm.com>,
"Thomas Huth" <thuth@redhat.com>,
qemu-s390x@nongnu.org, "Cameron Esfahani" <dirty@apple.com>,
"Alexandre Iooss" <erdnaxe@crans.org>,
"Nicholas Piggin" <npiggin@gmail.com>,
"Roman Bolshakov" <rbolshakov@ddn.com>,
"Dr. David Alan Gilbert" <dave@treblig.org>,
"Marcelo Tosatti" <mtosatti@redhat.com>,
"Mahmoud Mandour" <ma.mandourr@gmail.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>
Subject: [PATCH v2 08/12] plugins: add time control API
Date: Thu, 20 Jun 2024 16:22:16 +0100 [thread overview]
Message-ID: <20240620152220.2192768-9-alex.bennee@linaro.org> (raw)
In-Reply-To: <20240620152220.2192768-1-alex.bennee@linaro.org>
Expose the ability to control time through the plugin API. Only one
plugin can control time so it has to request control when loaded.
There are probably more corner cases to catch here.
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
[AJB: tweaked user-mode handling, merged QEMU_PLUGIN_API fix]
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20240530220610.1245424-6-pierrick.bouvier@linaro.org>
---
plugins/next
- make qemu_plugin_update_ns a NOP in user-mode
v2
- remove From: header
- merged in plugins: missing QEMU_PLUGIN_API for time control
---
include/qemu/qemu-plugin.h | 27 +++++++++++++++++++++++++++
plugins/api.c | 35 +++++++++++++++++++++++++++++++++++
plugins/qemu-plugins.symbols | 2 ++
3 files changed, 64 insertions(+)
diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h
index 95703d8fec..c71c705b69 100644
--- a/include/qemu/qemu-plugin.h
+++ b/include/qemu/qemu-plugin.h
@@ -661,6 +661,33 @@ void qemu_plugin_register_vcpu_mem_inline_per_vcpu(
qemu_plugin_u64 entry,
uint64_t imm);
+/**
+ * qemu_plugin_request_time_control() - request the ability to control time
+ *
+ * This grants the plugin the ability to control system time. Only one
+ * plugin can control time so if multiple plugins request the ability
+ * all but the first will fail.
+ *
+ * Returns an opaque handle or NULL if fails
+ */
+QEMU_PLUGIN_API
+const void *qemu_plugin_request_time_control(void);
+
+/**
+ * qemu_plugin_update_ns() - update system emulation time
+ * @handle: opaque handle returned by qemu_plugin_request_time_control()
+ * @time: time in nanoseconds
+ *
+ * This allows an appropriately authorised plugin (i.e. holding the
+ * time control handle) to move system time forward to @time. For
+ * user-mode emulation the time is not changed by this as all reported
+ * time comes from the host kernel.
+ *
+ * Start time is 0.
+ */
+QEMU_PLUGIN_API
+void qemu_plugin_update_ns(const void *handle, int64_t time);
+
typedef void
(*qemu_plugin_vcpu_syscall_cb_t)(qemu_plugin_id_t id, unsigned int vcpu_index,
int64_t num, uint64_t a1, uint64_t a2,
diff --git a/plugins/api.c b/plugins/api.c
index 6bdb26bbe3..4431a0ea7e 100644
--- a/plugins/api.c
+++ b/plugins/api.c
@@ -39,6 +39,7 @@
#include "qemu/main-loop.h"
#include "qemu/plugin.h"
#include "qemu/log.h"
+#include "qemu/timer.h"
#include "tcg/tcg.h"
#include "exec/exec-all.h"
#include "exec/gdbstub.h"
@@ -583,3 +584,37 @@ uint64_t qemu_plugin_u64_sum(qemu_plugin_u64 entry)
}
return total;
}
+
+/*
+ * Time control
+ */
+static bool has_control;
+
+const void *qemu_plugin_request_time_control(void)
+{
+ if (!has_control) {
+ has_control = true;
+ 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
+}
diff --git a/plugins/qemu-plugins.symbols b/plugins/qemu-plugins.symbols
index aa0a77a319..ca773d8d9f 100644
--- a/plugins/qemu-plugins.symbols
+++ b/plugins/qemu-plugins.symbols
@@ -38,6 +38,7 @@
qemu_plugin_register_vcpu_tb_exec_cond_cb;
qemu_plugin_register_vcpu_tb_exec_inline_per_vcpu;
qemu_plugin_register_vcpu_tb_trans_cb;
+ qemu_plugin_request_time_control;
qemu_plugin_reset;
qemu_plugin_scoreboard_free;
qemu_plugin_scoreboard_find;
@@ -51,5 +52,6 @@
qemu_plugin_u64_set;
qemu_plugin_u64_sum;
qemu_plugin_uninstall;
+ qemu_plugin_update_ns;
qemu_plugin_vcpu_for_each;
};
--
2.39.2
next prev parent reply other threads:[~2024-06-20 15:24 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-20 15:22 [PATCH v2 00/12] maintainer updates pre-PR (gdbstub, plugins, time control) Alex Bennée
2024-06-20 15:22 ` [PATCH v2 01/12] include/exec: add missing include guard comment Alex Bennée
2024-06-20 15:22 ` [PATCH v2 02/12] gdbstub: move enums into separate header Alex Bennée
2024-06-20 15:22 ` [PATCH v2 03/12] plugins: Ensure register handles are not NULL Alex Bennée
2024-06-20 15:22 ` [PATCH v2 04/12] sysemu: add set_virtual_time to accel ops Alex Bennée
2024-06-20 15:22 ` [PATCH v2 05/12] qtest: use cpu interface in qtest_clock_warp Alex Bennée
2024-06-20 15:22 ` [PATCH v2 06/12] sysemu: generalise qtest_warp_clock as qemu_clock_advance_virtual_time Alex Bennée
2024-06-27 11:08 ` Philippe Mathieu-Daudé
2024-06-20 15:22 ` [PATCH v2 07/12] qtest: move qtest_{get, set}_virtual_clock to accel/qtest/qtest.c Alex Bennée
2024-06-20 15:22 ` Alex Bennée [this message]
2024-06-27 9:05 ` [PATCH v2 08/12] plugins: add time control API Alwalid Salama
2024-06-20 15:22 ` [PATCH v2 09/12] plugins: add migration blocker Alex Bennée
2024-06-20 17:15 ` Thomas Huth
2024-06-20 19:42 ` Richard Henderson
2024-06-27 9:06 ` Alwalid Salama
2024-06-20 15:22 ` [PATCH v2 10/12] contrib/plugins: add Instructions Per Second (IPS) example for cost modeling Alex Bennée
2024-06-27 9:07 ` Alwalid Salama
2024-06-20 15:22 ` [PATCH v2 11/12] plugins: fix inject_mem_cb rw masking Alex Bennée
2024-06-27 9:07 ` Alwalid Salama
2024-06-20 15:22 ` [PATCH v2 12/12] accel/tcg: Avoid unnecessary call overhead from qemu_plugin_vcpu_mem_cb Alex Bennée
2024-06-20 15:36 ` Philippe Mathieu-Daudé
2024-06-20 18:40 ` Pierrick Bouvier
2024-06-27 9:08 ` Alwalid Salama
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240620152220.2192768-9-alex.bennee@linaro.org \
--to=alex.bennee@linaro.org \
--cc=agraf@csgraf.de \
--cc=borntraeger@linux.ibm.com \
--cc=danielhb413@gmail.com \
--cc=dave@treblig.org \
--cc=david@redhat.com \
--cc=dirty@apple.com \
--cc=erdnaxe@crans.org \
--cc=iii@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=lvivier@redhat.com \
--cc=ma.mandourr@gmail.com \
--cc=mburton@qti.qualcomm.com \
--cc=mliebel@qti.qualcomm.com \
--cc=mtosatti@redhat.com \
--cc=npiggin@gmail.com \
--cc=pasic@linux.ibm.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@linaro.org \
--cc=pierrick.bouvier@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=qemu-s390x@nongnu.org \
--cc=quic_jiles@quicinc.com \
--cc=rbolshakov@ddn.com \
--cc=richard.henderson@linaro.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).