* [PULL 00/26] Plugins update for 2026-06-16
@ 2026-06-16 18:42 Pierrick Bouvier
2026-06-16 18:42 ` [PULL 01/26] plugins: bump version Pierrick Bouvier
` (26 more replies)
0 siblings, 27 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
The following changes since commit b0df6e2f2c6c45df8d4d286933799c623e124d98:
Merge tag 'pull-riscv-to-apply-20260616' of https://github.com/alistair23/qemu into staging (2026-06-16 10:41:47 -0400)
are available in the Git repository at:
https://gitlab.com/p-b-o/qemu tags/pbouvier/pr/plugins-20260616
for you to fetch changes up to 76b70dcb8f425363cf4c767cd84761e219349bdd:
plugins/cpp: register callbacks using captureless lambda (2026-06-16 10:59:05 -0700)
----------------------------------------------------------------
Changes:
- [PATCH v2 00/26] plugins: refactor API to maintain state through (Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>)
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-1-pierrick.bouvier@oss.qualcomm.com
----------------------------------------------------------------
Pierrick Bouvier (26):
plugins: bump version
plugins: add userdata for qemu_plugin_{uninstall, reset}
plugins: add userdata to qemu_plugin_register_flush_cb
plugins: remove type qemu_plugin_simple_cb_t
plugins: remove qemu_plugin_id_t from qemu_plugin_udata_cb_t
plugins: remove qemu_plugin_id_t from qemu_plugin_vcpu_simple_cb_t
plugins: add userdata to qemu_plugin_register_vcpu_init_cb
plugins: add userdata to qemu_plugin_register_vcpu_exit_cb
plugins: add userdata to qemu_plugin_register_vcpu_idle_cb
plugins: add userdata to qemu_plugin_register_vcpu_resume_cb
plugins: add userdata to qemu_plugin_vcpu_for_each
plugins: remove type qemu_plugin_vcpu_simple_cb_t
plugins: add userdata to qemu_plugin_register_vcpu_discon_cb
plugins: remove qemu_plugin_id from qemu_plugin_vcpu_discon_cb_t
plugins: remove qemu_plugin_id from qemu_plugin_vcpu_tb_trans_cb_t
plugins: add userdata to qemu_plugin_vcpu_tb_trans_cb_t
plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_cb_t
plugins: add userdata to qemu_plugin_register_vcpu_syscall_cb
plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_filter_cb_t
plugins: add userdata to qemu_plugin_register_vcpu_syscall_filter_cb
plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_ret_cb_t
plugins: add userdata to qemu_plugin_register_vcpu_syscall_ret_cb
plugins: use consistent parameter documentation for userdata
scripts/checkpatch: ignore spaces required around some operators in C++
scripts/checkpatch: remove check on forbidden space before '[' in C++
plugins/cpp: register callbacks using captureless lambda
contrib/plugins/bbv.c | 10 ++--
contrib/plugins/cache.c | 6 +-
contrib/plugins/cflow.c | 6 +-
contrib/plugins/cpp.cpp | 90 +++++++++++++++++++++++++++-
contrib/plugins/drcov.c | 6 +-
contrib/plugins/execlog.c | 10 ++--
contrib/plugins/hotblocks.c | 6 +-
contrib/plugins/hotpages.c | 6 +-
contrib/plugins/howvec.c | 6 +-
contrib/plugins/hwprofile.c | 6 +-
contrib/plugins/ips.c | 14 ++---
contrib/plugins/lockstep.c | 18 +++---
contrib/plugins/stoptrigger.c | 6 +-
contrib/plugins/traps.c | 9 +--
contrib/plugins/uftrace.c | 10 ++--
include/plugins/qemu-plugin.h | 132 +++++++++++++++++++++++-------------------
include/qemu/plugin.h | 2 -
plugins/api.c | 40 ++++++++-----
plugins/core.c | 93 ++++++++++++-----------------
plugins/loader.c | 13 +++--
plugins/plugin.h | 5 +-
scripts/checkpatch.pl | 28 ++++++++-
tests/tcg/plugins/bb.c | 10 ++--
tests/tcg/plugins/discons.c | 10 ++--
tests/tcg/plugins/empty.c | 4 +-
tests/tcg/plugins/inline.c | 6 +-
tests/tcg/plugins/insn.c | 10 ++--
tests/tcg/plugins/mem.c | 6 +-
tests/tcg/plugins/patch.c | 4 +-
tests/tcg/plugins/registers.c | 4 +-
tests/tcg/plugins/reset.c | 17 +++---
tests/tcg/plugins/setpc.c | 10 ++--
tests/tcg/plugins/syscall.c | 22 +++----
33 files changed, 371 insertions(+), 254 deletions(-)
^ permalink raw reply [flat|nested] 28+ messages in thread
* [PULL 01/26] plugins: bump version
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 02/26] plugins: add userdata for qemu_plugin_{uninstall, reset} Pierrick Bouvier
` (25 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Next commits will be breaking changes, so bump min version and version
accordingly.
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-2-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
include/plugins/qemu-plugin.h | 6 +++++-
plugins/plugin.h | 2 +-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 4eb1d2cd85c..435a14f5a00 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -80,11 +80,15 @@ typedef uint64_t qemu_plugin_id_t;
* - added disconinuity callback API (for interrupts, exceptions, host calls)
* - added syscall filter callback API, which allows skipping syscalls and
* setting custom syscall return values
+ *
+ * version 7:
+ * - add userdata to all plugin callbacks, allowing maintenance of state
+ * externally, and easing interfacing with other languages.
*/
extern QEMU_PLUGIN_EXPORT int qemu_plugin_version;
-#define QEMU_PLUGIN_VERSION 6
+#define QEMU_PLUGIN_VERSION 7
/**
* struct qemu_info_t - system information for plugins
diff --git a/plugins/plugin.h b/plugins/plugin.h
index 6fbc443b96c..9179da43851 100644
--- a/plugins/plugin.h
+++ b/plugins/plugin.h
@@ -16,7 +16,7 @@
#include "qemu/queue.h"
#include "qemu/qht.h"
-#define QEMU_PLUGIN_MIN_VERSION 2
+#define QEMU_PLUGIN_MIN_VERSION 7
/* global state */
struct qemu_plugin_state {
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 02/26] plugins: add userdata for qemu_plugin_{uninstall, reset}
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
2026-06-16 18:42 ` [PULL 01/26] plugins: bump version Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 03/26] plugins: add userdata to qemu_plugin_register_flush_cb Pierrick Bouvier
` (24 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
We do both at the same time because they internally use the same
implementation.
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-3-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
contrib/plugins/lockstep.c | 10 +++++-----
include/plugins/qemu-plugin.h | 8 ++++++--
plugins/api.c | 10 ++++++----
plugins/loader.c | 13 ++++++++-----
plugins/plugin.h | 3 ++-
tests/tcg/plugins/reset.c | 8 ++++----
6 files changed, 31 insertions(+), 21 deletions(-)
diff --git a/contrib/plugins/lockstep.c b/contrib/plugins/lockstep.c
index 62981d4e098..36b003ead2d 100644
--- a/contrib/plugins/lockstep.c
+++ b/contrib/plugins/lockstep.c
@@ -77,7 +77,7 @@ static char *path_to_unlink;
static bool verbose;
-static void plugin_cleanup(qemu_plugin_id_t id)
+static void plugin_cleanup(qemu_plugin_id_t id, void *userdata)
{
/* Free our block data */
g_slist_free_full(blocks, &g_free);
@@ -98,7 +98,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
g_string_append_printf(out, "Executed ~%ld instructions\n", insn_count);
qemu_plugin_outs(out->str);
- plugin_cleanup(id);
+ plugin_cleanup(id, NULL);
}
/*
@@ -189,7 +189,7 @@ static void report_divergance(ExecState *us, ExecState *them)
}
qemu_plugin_outs(out->str);
qemu_plugin_outs("giving up\n");
- qemu_plugin_uninstall(our_id, plugin_cleanup);
+ qemu_plugin_uninstall(our_id, plugin_cleanup, NULL);
}
}
@@ -212,7 +212,7 @@ static void vcpu_tb_exec(unsigned int cpu_index, void *udata)
qemu_plugin_outs(bytes < 0 ?
"problem writing to socket" :
"wrote less than expected to socket");
- qemu_plugin_uninstall(our_id, plugin_cleanup);
+ qemu_plugin_uninstall(our_id, plugin_cleanup, NULL);
return;
}
@@ -225,7 +225,7 @@ static void vcpu_tb_exec(unsigned int cpu_index, void *udata)
qemu_plugin_outs(bytes < 0 ?
"problem reading from socket" :
"read less than expected");
- qemu_plugin_uninstall(our_id, plugin_cleanup);
+ qemu_plugin_uninstall(our_id, plugin_cleanup, NULL);
return;
}
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 435a14f5a00..11213c2ca3f 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -221,6 +221,7 @@ typedef void (*qemu_plugin_vcpu_discon_cb_t)(qemu_plugin_id_t id,
* qemu_plugin_uninstall() - Uninstall a plugin
* @id: this plugin's opaque ID
* @cb: callback to be called once the plugin has been removed
+ * @userdata: any plugin data to pass to the @cb
*
* Do NOT assume that the plugin has been uninstalled once this function
* returns. Plugins are uninstalled asynchronously, and therefore the given
@@ -229,12 +230,14 @@ typedef void (*qemu_plugin_vcpu_discon_cb_t)(qemu_plugin_id_t id,
* Note: Calling this function from qemu_plugin_install() is a bug.
*/
QEMU_PLUGIN_API
-void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb);
+void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_plugin_udata_cb_t cb,
+ void *userdata);
/**
* qemu_plugin_reset() - Reset a plugin
* @id: this plugin's opaque ID
* @cb: callback to be called once the plugin has been reset
+ * @userdata: any plugin data to pass to the @cb
*
* Unregisters all callbacks for the plugin given by @id.
*
@@ -243,7 +246,8 @@ void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb);
* callbacks until @cb is called.
*/
QEMU_PLUGIN_API
-void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb);
+void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_udata_cb_t cb,
+ void *userdata);
/**
* qemu_plugin_register_vcpu_init_cb() - register a vCPU initialization callback
diff --git a/plugins/api.c b/plugins/api.c
index 2d5fe9327f7..91c9a24a6b2 100644
--- a/plugins/api.c
+++ b/plugins/api.c
@@ -51,14 +51,16 @@
/* Uninstall and Reset handlers */
-void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb)
+void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_plugin_udata_cb_t cb,
+ void *userdata)
{
- plugin_reset_uninstall(id, cb, false);
+ plugin_reset_uninstall(id, cb, userdata, false);
}
-void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb)
+void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_udata_cb_t cb,
+ void *userdata)
{
- plugin_reset_uninstall(id, cb, true);
+ plugin_reset_uninstall(id, cb, userdata, true);
}
/*
diff --git a/plugins/loader.c b/plugins/loader.c
index 0dbe7bea263..0d587c344c4 100644
--- a/plugins/loader.c
+++ b/plugins/loader.c
@@ -253,7 +253,7 @@ static int plugin_load(struct qemu_plugin_desc *desc, const qemu_info_t *info, E
* call a full uninstall if the plugin did not yet call it.
*/
if (!ctx->uninstalling) {
- plugin_reset_uninstall(ctx->id, NULL, false);
+ plugin_reset_uninstall(ctx->id, NULL, NULL, false);
}
}
@@ -314,7 +314,8 @@ int qemu_plugin_load_list(QemuPluginList *head, Error **errp)
struct qemu_plugin_reset_data {
struct qemu_plugin_ctx *ctx;
- qemu_plugin_simple_cb_t cb;
+ qemu_plugin_udata_cb_t cb;
+ void *userdata;
bool reset;
};
@@ -338,7 +339,7 @@ static void plugin_reset_destroy__locked(struct qemu_plugin_reset_data *data)
if (data->reset) {
g_assert(ctx->resetting);
if (data->cb) {
- data->cb(ctx->id);
+ data->cb(ctx->id, data->userdata);
}
ctx->resetting = false;
g_free(data);
@@ -357,7 +358,7 @@ static void plugin_reset_destroy__locked(struct qemu_plugin_reset_data *data)
g_assert(success);
QTAILQ_REMOVE(&plugin.ctxs, ctx, entry);
if (data->cb) {
- data->cb(ctx->id);
+ data->cb(ctx->id, data->userdata);
}
if (!g_module_close(ctx->handle)) {
warn_report("%s: %s", __func__, g_module_error());
@@ -383,7 +384,8 @@ static void plugin_flush_destroy(CPUState *cpu, run_on_cpu_data arg)
}
void plugin_reset_uninstall(qemu_plugin_id_t id,
- qemu_plugin_simple_cb_t cb,
+ qemu_plugin_udata_cb_t cb,
+ void *userdata,
bool reset)
{
struct qemu_plugin_reset_data *data;
@@ -401,6 +403,7 @@ void plugin_reset_uninstall(qemu_plugin_id_t id,
data = g_new(struct qemu_plugin_reset_data, 1);
data->ctx = ctx;
data->cb = cb;
+ data->userdata = userdata;
data->reset = reset;
/*
* Only flush the code cache if the vCPUs have been created. If so,
diff --git a/plugins/plugin.h b/plugins/plugin.h
index 9179da43851..c901016b8c1 100644
--- a/plugins/plugin.h
+++ b/plugins/plugin.h
@@ -76,7 +76,8 @@ void plugin_register_inline_op_on_entry(GArray **arr,
uint64_t imm);
void plugin_reset_uninstall(qemu_plugin_id_t id,
- qemu_plugin_simple_cb_t cb,
+ qemu_plugin_udata_cb_t cb,
+ void *userdata,
bool reset);
void plugin_register_cb(qemu_plugin_id_t id, enum qemu_plugin_event ev,
diff --git a/tests/tcg/plugins/reset.c b/tests/tcg/plugins/reset.c
index 1be8be2a4b2..6ea675b8095 100644
--- a/tests/tcg/plugins/reset.c
+++ b/tests/tcg/plugins/reset.c
@@ -14,7 +14,7 @@ static qemu_plugin_id_t plugin_id;
static bool was_reset;
static bool was_uninstalled;
-static void after_uninstall(qemu_plugin_id_t id)
+static void after_uninstall(qemu_plugin_id_t id, void *userdata)
{
g_assert(was_reset && !was_uninstalled);
qemu_plugin_outs("uninstall done\n");
@@ -24,7 +24,7 @@ static void after_uninstall(qemu_plugin_id_t id)
static void tb_exec_after_reset(unsigned int vcpu_index, void *userdata)
{
g_assert(was_reset && !was_uninstalled);
- qemu_plugin_uninstall(plugin_id, after_uninstall);
+ qemu_plugin_uninstall(plugin_id, after_uninstall, NULL);
}
static void tb_trans_after_reset(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
@@ -34,7 +34,7 @@ static void tb_trans_after_reset(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
QEMU_PLUGIN_CB_NO_REGS, NULL);
}
-static void after_reset(qemu_plugin_id_t id)
+static void after_reset(qemu_plugin_id_t id, void *userdata)
{
g_assert(!was_reset && !was_uninstalled);
qemu_plugin_outs("reset done\n");
@@ -45,7 +45,7 @@ static void after_reset(qemu_plugin_id_t id)
static void tb_exec_before_reset(unsigned int vcpu_index, void *userdata)
{
g_assert(!was_reset && !was_uninstalled);
- qemu_plugin_reset(plugin_id, after_reset);
+ qemu_plugin_reset(plugin_id, after_reset, NULL);
}
static void tb_trans_before_reset(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 03/26] plugins: add userdata to qemu_plugin_register_flush_cb
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
2026-06-16 18:42 ` [PULL 01/26] plugins: bump version Pierrick Bouvier
2026-06-16 18:42 ` [PULL 02/26] plugins: add userdata for qemu_plugin_{uninstall, reset} Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 04/26] plugins: remove type qemu_plugin_simple_cb_t Pierrick Bouvier
` (23 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-4-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
include/plugins/qemu-plugin.h | 4 +++-
plugins/core.c | 31 +++++--------------------------
2 files changed, 8 insertions(+), 27 deletions(-)
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 11213c2ca3f..499441bde23 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -973,6 +973,7 @@ void qemu_plugin_vcpu_for_each(qemu_plugin_id_t id,
* qemu_plugin_register_flush_cb() - register code cache flush callback
* @id: plugin ID
* @cb: callback
+ * @userdata: user data for callback
*
* The @cb function is called every time the code cache is flushed.
* The callback can be used to free resources associated with existing
@@ -981,7 +982,8 @@ void qemu_plugin_vcpu_for_each(qemu_plugin_id_t id,
*/
QEMU_PLUGIN_API
void qemu_plugin_register_flush_cb(qemu_plugin_id_t id,
- qemu_plugin_simple_cb_t cb);
+ qemu_plugin_udata_cb_t cb,
+ void *userdata);
/**
* qemu_plugin_register_atexit_cb() - register exit callback
diff --git a/plugins/core.c b/plugins/core.c
index 2324bbffa3d..21a3c5b15cf 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -131,29 +131,6 @@ static void plugin_vcpu_cb__discon(CPUState *cpu,
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_NO_REGS);
}
-/*
- * Disable CFI checks.
- * The callback function has been loaded from an external library so we do not
- * have type information
- */
-QEMU_DISABLE_CFI
-static void plugin_cb__simple(enum qemu_plugin_event ev)
-{
- struct qemu_plugin_cb *cb, *next;
-
- switch (ev) {
- case QEMU_PLUGIN_EV_FLUSH:
- QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
- qemu_plugin_simple_cb_t func = cb->f.simple;
-
- func(cb->ctx->id);
- }
- break;
- default:
- g_assert_not_reached();
- }
-}
-
/*
* Disable CFI checks.
* The callback function has been loaded from an external library so we do not
@@ -166,6 +143,7 @@ static void plugin_cb__udata(enum qemu_plugin_event ev)
switch (ev) {
case QEMU_PLUGIN_EV_ATEXIT:
+ case QEMU_PLUGIN_EV_FLUSH:
QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
qemu_plugin_udata_cb_t func = cb->f.udata;
@@ -690,9 +668,10 @@ void qemu_plugin_register_vcpu_discon_cb(qemu_plugin_id_t id,
}
void qemu_plugin_register_flush_cb(qemu_plugin_id_t id,
- qemu_plugin_simple_cb_t cb)
+ qemu_plugin_udata_cb_t cb,
+ void *userdata)
{
- plugin_register_cb(id, QEMU_PLUGIN_EV_FLUSH, cb);
+ plugin_register_cb_udata(id, QEMU_PLUGIN_EV_FLUSH, cb, userdata);
}
static bool free_dyn_cb_arr(void *p, uint32_t h, void *userp)
@@ -706,7 +685,7 @@ void qemu_plugin_flush_cb(void)
qht_iter_remove(&plugin.dyn_cb_arr_ht, free_dyn_cb_arr, NULL);
qht_reset(&plugin.dyn_cb_arr_ht);
- plugin_cb__simple(QEMU_PLUGIN_EV_FLUSH);
+ plugin_cb__udata(QEMU_PLUGIN_EV_FLUSH);
}
void exec_inline_op(enum plugin_dyn_cb_type type,
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 04/26] plugins: remove type qemu_plugin_simple_cb_t
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (2 preceding siblings ...)
2026-06-16 18:42 ` [PULL 03/26] plugins: add userdata to qemu_plugin_register_flush_cb Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 05/26] plugins: remove qemu_plugin_id_t from qemu_plugin_udata_cb_t Pierrick Bouvier
` (22 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
We removed all usage of this type, it can now be removed.
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-5-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
include/plugins/qemu-plugin.h | 8 --------
include/qemu/plugin.h | 1 -
2 files changed, 9 deletions(-)
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 499441bde23..3c6f32bacfe 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -140,14 +140,6 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
const qemu_info_t *info,
int argc, char **argv);
-/**
- * typedef qemu_plugin_simple_cb_t - simple callback
- * @id: the unique qemu_plugin_id_t
- *
- * This callback passes no information aside from the unique @id.
- */
-typedef void (*qemu_plugin_simple_cb_t)(qemu_plugin_id_t id);
-
/**
* typedef qemu_plugin_udata_cb_t - callback with user data
* @id: the unique qemu_plugin_id_t
diff --git a/include/qemu/plugin.h b/include/qemu/plugin.h
index ddd77bd82c9..dac08cdc60c 100644
--- a/include/qemu/plugin.h
+++ b/include/qemu/plugin.h
@@ -55,7 +55,6 @@ void qemu_plugin_opt_parse(const char *optstr, QemuPluginList *head);
int qemu_plugin_load_list(QemuPluginList *head, Error **errp);
union qemu_plugin_cb_sig {
- qemu_plugin_simple_cb_t simple;
qemu_plugin_udata_cb_t udata;
qemu_plugin_vcpu_simple_cb_t vcpu_simple;
qemu_plugin_vcpu_udata_cb_t vcpu_udata;
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 05/26] plugins: remove qemu_plugin_id_t from qemu_plugin_udata_cb_t
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (3 preceding siblings ...)
2026-06-16 18:42 ` [PULL 04/26] plugins: remove type qemu_plugin_simple_cb_t Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 06/26] plugins: remove qemu_plugin_id_t from qemu_plugin_vcpu_simple_cb_t Pierrick Bouvier
` (21 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
We can now rely on userdata being always available to pass down this id
if needed.
In our plugins, only tests/tcg/plugins/reset.c was using it.
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-6-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
contrib/plugins/bbv.c | 2 +-
contrib/plugins/cache.c | 2 +-
contrib/plugins/cflow.c | 2 +-
contrib/plugins/drcov.c | 2 +-
contrib/plugins/execlog.c | 2 +-
contrib/plugins/hotblocks.c | 2 +-
contrib/plugins/hotpages.c | 2 +-
contrib/plugins/howvec.c | 2 +-
contrib/plugins/hwprofile.c | 2 +-
contrib/plugins/ips.c | 2 +-
contrib/plugins/lockstep.c | 8 ++++----
contrib/plugins/stoptrigger.c | 2 +-
contrib/plugins/traps.c | 2 +-
contrib/plugins/uftrace.c | 2 +-
include/plugins/qemu-plugin.h | 3 +--
plugins/core.c | 2 +-
plugins/loader.c | 4 ++--
tests/tcg/plugins/bb.c | 2 +-
tests/tcg/plugins/inline.c | 2 +-
tests/tcg/plugins/insn.c | 2 +-
tests/tcg/plugins/mem.c | 2 +-
tests/tcg/plugins/reset.c | 7 ++++---
tests/tcg/plugins/syscall.c | 2 +-
23 files changed, 30 insertions(+), 30 deletions(-)
diff --git a/contrib/plugins/bbv.c b/contrib/plugins/bbv.c
index 5913cc6c637..f2b1b258a90 100644
--- a/contrib/plugins/bbv.c
+++ b/contrib/plugins/bbv.c
@@ -28,7 +28,7 @@ static char *filename;
static struct qemu_plugin_scoreboard *vcpus;
static uint64_t interval = 100000000;
-static void plugin_exit(qemu_plugin_id_t id, void *p)
+static void plugin_exit(void *p)
{
Vcpu *vcpu;
diff --git a/contrib/plugins/cache.c b/contrib/plugins/cache.c
index 56508587d3a..f41ddb0aa43 100644
--- a/contrib/plugins/cache.c
+++ b/contrib/plugins/cache.c
@@ -694,7 +694,7 @@ finish:
g_list_free(miss_insns);
}
-static void plugin_exit(qemu_plugin_id_t id, void *p)
+static void plugin_exit(void *p)
{
log_stats();
log_top_insns();
diff --git a/contrib/plugins/cflow.c b/contrib/plugins/cflow.c
index b5e33f25f9b..4d00879ccad 100644
--- a/contrib/plugins/cflow.c
+++ b/contrib/plugins/cflow.c
@@ -134,7 +134,7 @@ static gboolean filter_non_branches(gpointer key, gpointer value,
return node->dest_count == 0;
}
-static void plugin_exit(qemu_plugin_id_t id, void *p)
+static void plugin_exit(void *p)
{
g_autoptr(GString) result = g_string_new("collected ");
GList *data;
diff --git a/contrib/plugins/drcov.c b/contrib/plugins/drcov.c
index 5edc94dcaf6..458c0d2084d 100644
--- a/contrib/plugins/drcov.c
+++ b/contrib/plugins/drcov.c
@@ -86,7 +86,7 @@ static void count_block(gpointer data, gpointer user_data)
}
}
-static void plugin_exit(qemu_plugin_id_t id, void *p)
+static void plugin_exit(void *p)
{
unsigned long count = 0;
g_mutex_lock(&lock);
diff --git a/contrib/plugins/execlog.c b/contrib/plugins/execlog.c
index d00d9c4ff39..d347ac25b6f 100644
--- a/contrib/plugins/execlog.c
+++ b/contrib/plugins/execlog.c
@@ -400,7 +400,7 @@ static void vcpu_init(qemu_plugin_id_t id, unsigned int vcpu_index)
/**
* On plugin exit, print last instruction in cache
*/
-static void plugin_exit(qemu_plugin_id_t id, void *p)
+static void plugin_exit(void *p)
{
guint i;
g_rw_lock_reader_lock(&expand_array_lock);
diff --git a/contrib/plugins/hotblocks.c b/contrib/plugins/hotblocks.c
index 8ecf0339974..92859872ac9 100644
--- a/contrib/plugins/hotblocks.c
+++ b/contrib/plugins/hotblocks.c
@@ -70,7 +70,7 @@ static void exec_count_free(gpointer key, gpointer value, gpointer user_data)
qemu_plugin_scoreboard_free(cnt->exec_count);
}
-static void plugin_exit(qemu_plugin_id_t id, void *p)
+static void plugin_exit(void *p)
{
g_autoptr(GString) report = g_string_new("collected ");
GList *counts, *sorted_counts, *it;
diff --git a/contrib/plugins/hotpages.c b/contrib/plugins/hotpages.c
index 9d48ac969eb..a6d83b06c75 100644
--- a/contrib/plugins/hotpages.c
+++ b/contrib/plugins/hotpages.c
@@ -73,7 +73,7 @@ static gint cmp_access_count(gconstpointer a, gconstpointer b, gpointer d)
}
-static void plugin_exit(qemu_plugin_id_t id, void *p)
+static void plugin_exit(void *p)
{
g_autoptr(GString) report = g_string_new("Addr, RCPUs, Reads, WCPUs, Writes\n");
int i;
diff --git a/contrib/plugins/howvec.c b/contrib/plugins/howvec.c
index 42bddb6566d..75728896198 100644
--- a/contrib/plugins/howvec.c
+++ b/contrib/plugins/howvec.c
@@ -172,7 +172,7 @@ static void free_record(gpointer data)
g_free(rec);
}
-static void plugin_exit(qemu_plugin_id_t id, void *p)
+static void plugin_exit(void *p)
{
g_autoptr(GString) report = g_string_new("Instruction Classes:\n");
int i;
diff --git a/contrib/plugins/hwprofile.c b/contrib/plugins/hwprofile.c
index a9838ccc879..b7f96117e94 100644
--- a/contrib/plugins/hwprofile.c
+++ b/contrib/plugins/hwprofile.c
@@ -106,7 +106,7 @@ static void fmt_dev_record(GString *s, DeviceCounts *rec)
g_string_append_c(s, '\n');
}
-static void plugin_exit(qemu_plugin_id_t id, void *p)
+static void plugin_exit(void *p)
{
g_autoptr(GString) report = g_string_new("");
GList *counts;
diff --git a/contrib/plugins/ips.c b/contrib/plugins/ips.c
index f110c565bc4..7614ae1eafd 100644
--- a/contrib/plugins/ips.c
+++ b/contrib/plugins/ips.c
@@ -124,7 +124,7 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
quantum_insn, max_insn_per_quantum, NULL);
}
-static void plugin_exit(qemu_plugin_id_t id, void *udata)
+static void plugin_exit(void *udata)
{
qemu_plugin_scoreboard_free(vcpus);
}
diff --git a/contrib/plugins/lockstep.c b/contrib/plugins/lockstep.c
index 36b003ead2d..c1c2b0aca8e 100644
--- a/contrib/plugins/lockstep.c
+++ b/contrib/plugins/lockstep.c
@@ -77,7 +77,7 @@ static char *path_to_unlink;
static bool verbose;
-static void plugin_cleanup(qemu_plugin_id_t id, void *userdata)
+static void plugin_cleanup(void *userdata)
{
/* Free our block data */
g_slist_free_full(blocks, &g_free);
@@ -90,7 +90,7 @@ static void plugin_cleanup(qemu_plugin_id_t id, void *userdata)
}
}
-static void plugin_exit(qemu_plugin_id_t id, void *p)
+static void plugin_exit(void *p)
{
g_autoptr(GString) out = g_string_new("No divergence :-)\n");
g_string_append_printf(out, "Executed %ld/%d blocks\n",
@@ -98,7 +98,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
g_string_append_printf(out, "Executed ~%ld instructions\n", insn_count);
qemu_plugin_outs(out->str);
- plugin_cleanup(id, NULL);
+ plugin_cleanup(NULL);
}
/*
@@ -393,6 +393,6 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
our_id = id;
qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
- qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
+ qemu_plugin_register_atexit_cb(id, plugin_exit, (void *)id);
return 0;
}
diff --git a/contrib/plugins/stoptrigger.c b/contrib/plugins/stoptrigger.c
index b3a6ed66a7b..40f8fd313d7 100644
--- a/contrib/plugins/stoptrigger.c
+++ b/contrib/plugins/stoptrigger.c
@@ -93,7 +93,7 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
}
}
-static void plugin_exit(qemu_plugin_id_t id, void *p)
+static void plugin_exit(void *p)
{
g_hash_table_destroy(addrs_ht);
qemu_plugin_scoreboard_free(insn_count_sb);
diff --git a/contrib/plugins/traps.c b/contrib/plugins/traps.c
index a741580fbf8..4b879a8212a 100644
--- a/contrib/plugins/traps.c
+++ b/contrib/plugins/traps.c
@@ -44,7 +44,7 @@ static void vcpu_discon(qemu_plugin_id_t id, unsigned int vcpu_index,
}
}
-static void plugin_exit(qemu_plugin_id_t id, void *p)
+static void plugin_exit(void *p)
{
g_autoptr(GString) report;
report = g_string_new("VCPU, interrupts, exceptions, hostcalls\n");
diff --git a/contrib/plugins/uftrace.c b/contrib/plugins/uftrace.c
index f974090e23e..a071a34ea75 100644
--- a/contrib/plugins/uftrace.c
+++ b/contrib/plugins/uftrace.c
@@ -928,7 +928,7 @@ static void vcpu_end(unsigned int vcpu_index)
memset(cpu, 0, sizeof(Cpu));
}
-static void at_exit(qemu_plugin_id_t id, void *data)
+static void at_exit(void *data)
{
bool system_emulation = (bool) data;
g_autoptr(GArray) traces = g_array_new(0, 0, sizeof(Trace *));
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 3c6f32bacfe..d7d972103cb 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -142,11 +142,10 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
/**
* typedef qemu_plugin_udata_cb_t - callback with user data
- * @id: the unique qemu_plugin_id_t
* @userdata: a pointer to some user data supplied when the callback
* was registered.
*/
-typedef void (*qemu_plugin_udata_cb_t)(qemu_plugin_id_t id, void *userdata);
+typedef void (*qemu_plugin_udata_cb_t)(void *userdata);
/**
* typedef qemu_plugin_vcpu_simple_cb_t - vcpu callback
diff --git a/plugins/core.c b/plugins/core.c
index 21a3c5b15cf..b0532e8d0de 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -147,7 +147,7 @@ static void plugin_cb__udata(enum qemu_plugin_event ev)
QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
qemu_plugin_udata_cb_t func = cb->f.udata;
- func(cb->ctx->id, cb->udata);
+ func(cb->udata);
}
break;
default:
diff --git a/plugins/loader.c b/plugins/loader.c
index 0d587c344c4..b10ebe8cc05 100644
--- a/plugins/loader.c
+++ b/plugins/loader.c
@@ -339,7 +339,7 @@ static void plugin_reset_destroy__locked(struct qemu_plugin_reset_data *data)
if (data->reset) {
g_assert(ctx->resetting);
if (data->cb) {
- data->cb(ctx->id, data->userdata);
+ data->cb(data->userdata);
}
ctx->resetting = false;
g_free(data);
@@ -358,7 +358,7 @@ static void plugin_reset_destroy__locked(struct qemu_plugin_reset_data *data)
g_assert(success);
QTAILQ_REMOVE(&plugin.ctxs, ctx, entry);
if (data->cb) {
- data->cb(ctx->id, data->userdata);
+ data->cb(data->userdata);
}
if (!g_module_close(ctx->handle)) {
warn_report("%s: %s", __func__, g_module_error());
diff --git a/tests/tcg/plugins/bb.c b/tests/tcg/plugins/bb.c
index 36776dee1e1..8a854408aaa 100644
--- a/tests/tcg/plugins/bb.c
+++ b/tests/tcg/plugins/bb.c
@@ -40,7 +40,7 @@ static void gen_one_cpu_report(CPUCount *count, GString *report,
}
}
-static void plugin_exit(qemu_plugin_id_t id, void *p)
+static void plugin_exit(void *p)
{
g_autoptr(GString) report = g_string_new("");
diff --git a/tests/tcg/plugins/inline.c b/tests/tcg/plugins/inline.c
index 73dde995781..1d17884b40b 100644
--- a/tests/tcg/plugins/inline.c
+++ b/tests/tcg/plugins/inline.c
@@ -121,7 +121,7 @@ static void stats_mem(void)
g_assert(inl_per_vcpu == expected);
}
-static void plugin_exit(qemu_plugin_id_t id, void *udata)
+static void plugin_exit(void *udata)
{
const unsigned int num_cpus = qemu_plugin_num_vcpus();
g_autoptr(GString) stats = g_string_new("");
diff --git a/tests/tcg/plugins/insn.c b/tests/tcg/plugins/insn.c
index e6c5207cd69..12421054f67 100644
--- a/tests/tcg/plugins/insn.c
+++ b/tests/tcg/plugins/insn.c
@@ -190,7 +190,7 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
}
}
-static void plugin_exit(qemu_plugin_id_t id, void *p)
+static void plugin_exit(void *p)
{
g_autoptr(GString) out = g_string_new(NULL);
int i;
diff --git a/tests/tcg/plugins/mem.c b/tests/tcg/plugins/mem.c
index 6b0732dc0fd..5cdf71c7e49 100644
--- a/tests/tcg/plugins/mem.c
+++ b/tests/tcg/plugins/mem.c
@@ -68,7 +68,7 @@ static gint addr_order(gconstpointer a, gconstpointer b, gpointer d)
}
-static void plugin_exit(qemu_plugin_id_t id, void *p)
+static void plugin_exit(void *p)
{
g_autoptr(GString) out = g_string_new("");
diff --git a/tests/tcg/plugins/reset.c b/tests/tcg/plugins/reset.c
index 6ea675b8095..ef5a32781b2 100644
--- a/tests/tcg/plugins/reset.c
+++ b/tests/tcg/plugins/reset.c
@@ -14,7 +14,7 @@ static qemu_plugin_id_t plugin_id;
static bool was_reset;
static bool was_uninstalled;
-static void after_uninstall(qemu_plugin_id_t id, void *userdata)
+static void after_uninstall(void *userdata)
{
g_assert(was_reset && !was_uninstalled);
qemu_plugin_outs("uninstall done\n");
@@ -34,8 +34,9 @@ static void tb_trans_after_reset(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
QEMU_PLUGIN_CB_NO_REGS, NULL);
}
-static void after_reset(qemu_plugin_id_t id, void *userdata)
+static void after_reset(void *userdata)
{
+ qemu_plugin_id_t id = (qemu_plugin_id_t) userdata;
g_assert(!was_reset && !was_uninstalled);
qemu_plugin_outs("reset done\n");
was_reset = true;
@@ -45,7 +46,7 @@ static void after_reset(qemu_plugin_id_t id, void *userdata)
static void tb_exec_before_reset(unsigned int vcpu_index, void *userdata)
{
g_assert(!was_reset && !was_uninstalled);
- qemu_plugin_reset(plugin_id, after_reset, NULL);
+ qemu_plugin_reset(plugin_id, after_reset, (void *) plugin_id);
}
static void tb_trans_before_reset(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
diff --git a/tests/tcg/plugins/syscall.c b/tests/tcg/plugins/syscall.c
index 5658f830879..938646f9359 100644
--- a/tests/tcg/plugins/syscall.c
+++ b/tests/tcg/plugins/syscall.c
@@ -207,7 +207,7 @@ static gint comp_func(gconstpointer ea, gconstpointer eb, gpointer d)
}
/* ************************************************************************* */
-static void plugin_exit(qemu_plugin_id_t id, void *p)
+static void plugin_exit(void *p)
{
if (!statistics) {
return;
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 06/26] plugins: remove qemu_plugin_id_t from qemu_plugin_vcpu_simple_cb_t
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (4 preceding siblings ...)
2026-06-16 18:42 ` [PULL 05/26] plugins: remove qemu_plugin_id_t from qemu_plugin_udata_cb_t Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 07/26] plugins: add userdata to qemu_plugin_register_vcpu_init_cb Pierrick Bouvier
` (20 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Not used in all our plugins.
Future commits will remove qemu_plugin_vcpu_simple_cb_t completely, and
replace it with qemu_plugin_vcpu_udata_cb_t, so id information can be
passed using userdata if needed.
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-7-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
contrib/plugins/bbv.c | 2 +-
contrib/plugins/execlog.c | 2 +-
contrib/plugins/ips.c | 4 ++--
contrib/plugins/uftrace.c | 2 +-
include/plugins/qemu-plugin.h | 4 +---
plugins/core.c | 6 ++----
tests/tcg/plugins/bb.c | 2 +-
tests/tcg/plugins/insn.c | 2 +-
tests/tcg/plugins/registers.c | 2 +-
9 files changed, 11 insertions(+), 15 deletions(-)
diff --git a/contrib/plugins/bbv.c b/contrib/plugins/bbv.c
index f2b1b258a90..72cc896a0a6 100644
--- a/contrib/plugins/bbv.c
+++ b/contrib/plugins/bbv.c
@@ -60,7 +60,7 @@ static qemu_plugin_u64 bb_count_u64(Bb *bb)
return qemu_plugin_scoreboard_u64(bb->count);
}
-static void vcpu_init(qemu_plugin_id_t id, unsigned int vcpu_index)
+static void vcpu_init(unsigned int vcpu_index)
{
g_autofree gchar *vcpu_filename = NULL;
Vcpu *vcpu = qemu_plugin_scoreboard_find(vcpus, vcpu_index);
diff --git a/contrib/plugins/execlog.c b/contrib/plugins/execlog.c
index d347ac25b6f..398aa4a1f3f 100644
--- a/contrib/plugins/execlog.c
+++ b/contrib/plugins/execlog.c
@@ -382,7 +382,7 @@ static GPtrArray *registers_init(int vcpu_index)
* As we could have multiple threads trying to do this we need to
* serialise the expansion under a lock.
*/
-static void vcpu_init(qemu_plugin_id_t id, unsigned int vcpu_index)
+static void vcpu_init(unsigned int vcpu_index)
{
CPU *c;
diff --git a/contrib/plugins/ips.c b/contrib/plugins/ips.c
index 7614ae1eafd..32fd86c87ac 100644
--- a/contrib/plugins/ips.c
+++ b/contrib/plugins/ips.c
@@ -89,7 +89,7 @@ static void update_system_time(vCPUTime *vcpu)
g_mutex_unlock(&global_state_lock);
}
-static void vcpu_init(qemu_plugin_id_t id, unsigned int cpu_index)
+static void vcpu_init(unsigned int cpu_index)
{
vCPUTime *vcpu = qemu_plugin_scoreboard_find(vcpus, cpu_index);
vcpu->total_insn = 0;
@@ -97,7 +97,7 @@ static void vcpu_init(qemu_plugin_id_t id, unsigned int cpu_index)
vcpu->last_quantum_time = now_ns();
}
-static void vcpu_exit(qemu_plugin_id_t id, unsigned int cpu_index)
+static void vcpu_exit(unsigned int cpu_index)
{
vCPUTime *vcpu = qemu_plugin_scoreboard_find(vcpus, cpu_index);
update_system_time(vcpu);
diff --git a/contrib/plugins/uftrace.c b/contrib/plugins/uftrace.c
index a071a34ea75..438cebf2831 100644
--- a/contrib/plugins/uftrace.c
+++ b/contrib/plugins/uftrace.c
@@ -874,7 +874,7 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
}
}
-static void vcpu_init(qemu_plugin_id_t id, unsigned int vcpu_index)
+static void vcpu_init(unsigned int vcpu_index)
{
Cpu *cpu = qemu_plugin_scoreboard_find(score, vcpu_index);
cpu->ops = arch_ops;
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index d7d972103cb..8aaf404504b 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -149,11 +149,9 @@ typedef void (*qemu_plugin_udata_cb_t)(void *userdata);
/**
* typedef qemu_plugin_vcpu_simple_cb_t - vcpu callback
- * @id: the unique qemu_plugin_id_t
* @vcpu_index: the current vcpu context
*/
-typedef void (*qemu_plugin_vcpu_simple_cb_t)(qemu_plugin_id_t id,
- unsigned int vcpu_index);
+typedef void (*qemu_plugin_vcpu_simple_cb_t)(unsigned int vcpu_index);
/**
* typedef qemu_plugin_vcpu_udata_cb_t - vcpu callback
diff --git a/plugins/core.c b/plugins/core.c
index b0532e8d0de..217d6608c1d 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -96,8 +96,7 @@ static void plugin_vcpu_cb__simple(CPUState *cpu, enum qemu_plugin_event ev)
/* iterate safely; plugins might uninstall themselves at any time */
QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
qemu_plugin_vcpu_simple_cb_t func = cb->f.vcpu_simple;
-
- func(cb->ctx->id, cpu->cpu_index);
+ func(cpu->cpu_index);
}
break;
default:
@@ -306,8 +305,7 @@ static void plugin_vcpu_for_each(gpointer k, gpointer v, gpointer udata)
{
struct plugin_for_each_args *args = udata;
int cpu_index = *(int *)k;
-
- args->cb(args->ctx->id, cpu_index);
+ args->cb(cpu_index);
}
void qemu_plugin_vcpu_for_each(qemu_plugin_id_t id,
diff --git a/tests/tcg/plugins/bb.c b/tests/tcg/plugins/bb.c
index 8a854408aaa..f29b466dab2 100644
--- a/tests/tcg/plugins/bb.c
+++ b/tests/tcg/plugins/bb.c
@@ -56,7 +56,7 @@ static void plugin_exit(void *p)
qemu_plugin_scoreboard_free(counts);
}
-static void vcpu_idle(qemu_plugin_id_t id, unsigned int cpu_index)
+static void vcpu_idle(unsigned int cpu_index)
{
CPUCount *count = qemu_plugin_scoreboard_find(counts, cpu_index);
g_autoptr(GString) report = g_string_new("");
diff --git a/tests/tcg/plugins/insn.c b/tests/tcg/plugins/insn.c
index 12421054f67..80f7cbb2967 100644
--- a/tests/tcg/plugins/insn.c
+++ b/tests/tcg/plugins/insn.c
@@ -84,7 +84,7 @@ static Instruction * get_insn_record(const char *disas, uint64_t vaddr, Match *m
/*
* Initialise a new vcpu with reading the register list
*/
-static void vcpu_init(qemu_plugin_id_t id, unsigned int vcpu_index)
+static void vcpu_init(unsigned int vcpu_index)
{
g_autoptr(GArray) reg_list = qemu_plugin_get_registers();
g_autoptr(GByteArray) reg_value = g_byte_array_new();
diff --git a/tests/tcg/plugins/registers.c b/tests/tcg/plugins/registers.c
index 6d627c70371..94776d887fe 100644
--- a/tests/tcg/plugins/registers.c
+++ b/tests/tcg/plugins/registers.c
@@ -21,7 +21,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
* registers that cannot be written to, which would fail the test.
* See: https://lists.gnu.org/archive/html/qemu-devel/2026-02/msg07025.html
*/
-static void vcpu_init_cb(qemu_plugin_id_t id, unsigned int vcpu_index)
+static void vcpu_init_cb(unsigned int vcpu_index)
{
g_autoptr(GArray) regs = qemu_plugin_get_registers();
g_assert(regs != NULL);
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 07/26] plugins: add userdata to qemu_plugin_register_vcpu_init_cb
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (5 preceding siblings ...)
2026-06-16 18:42 ` [PULL 06/26] plugins: remove qemu_plugin_id_t from qemu_plugin_vcpu_simple_cb_t Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 08/26] plugins: add userdata to qemu_plugin_register_vcpu_exit_cb Pierrick Bouvier
` (19 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-8-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
contrib/plugins/bbv.c | 4 ++--
contrib/plugins/execlog.c | 4 ++--
contrib/plugins/ips.c | 4 ++--
contrib/plugins/uftrace.c | 4 ++--
include/plugins/qemu-plugin.h | 4 +++-
plugins/api.c | 5 +++--
plugins/core.c | 25 +++++++++++++++++++++++--
tests/tcg/plugins/insn.c | 4 ++--
tests/tcg/plugins/registers.c | 4 ++--
9 files changed, 41 insertions(+), 17 deletions(-)
diff --git a/contrib/plugins/bbv.c b/contrib/plugins/bbv.c
index 72cc896a0a6..0ad1301a1de 100644
--- a/contrib/plugins/bbv.c
+++ b/contrib/plugins/bbv.c
@@ -60,7 +60,7 @@ static qemu_plugin_u64 bb_count_u64(Bb *bb)
return qemu_plugin_scoreboard_u64(bb->count);
}
-static void vcpu_init(unsigned int vcpu_index)
+static void vcpu_init(unsigned int vcpu_index, void *userdata)
{
g_autofree gchar *vcpu_filename = NULL;
Vcpu *vcpu = qemu_plugin_scoreboard_find(vcpus, vcpu_index);
@@ -156,7 +156,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
bbs = g_hash_table_new_full(g_int64_hash, g_int64_equal, NULL, free_bb);
vcpus = qemu_plugin_scoreboard_new(sizeof(Vcpu));
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
- qemu_plugin_register_vcpu_init_cb(id, vcpu_init);
+ qemu_plugin_register_vcpu_init_cb(id, vcpu_init, NULL);
qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
return 0;
diff --git a/contrib/plugins/execlog.c b/contrib/plugins/execlog.c
index 398aa4a1f3f..2d02816a184 100644
--- a/contrib/plugins/execlog.c
+++ b/contrib/plugins/execlog.c
@@ -382,7 +382,7 @@ static GPtrArray *registers_init(int vcpu_index)
* As we could have multiple threads trying to do this we need to
* serialise the expansion under a lock.
*/
-static void vcpu_init(unsigned int vcpu_index)
+static void vcpu_init(unsigned int vcpu_index, void *userdata)
{
CPU *c;
@@ -481,7 +481,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
}
/* Register init, translation block and exit callbacks */
- qemu_plugin_register_vcpu_init_cb(id, vcpu_init);
+ qemu_plugin_register_vcpu_init_cb(id, vcpu_init, NULL);
qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
diff --git a/contrib/plugins/ips.c b/contrib/plugins/ips.c
index 32fd86c87ac..1290a624489 100644
--- a/contrib/plugins/ips.c
+++ b/contrib/plugins/ips.c
@@ -89,7 +89,7 @@ static void update_system_time(vCPUTime *vcpu)
g_mutex_unlock(&global_state_lock);
}
-static void vcpu_init(unsigned int cpu_index)
+static void vcpu_init(unsigned int cpu_index, void *userdata)
{
vCPUTime *vcpu = qemu_plugin_scoreboard_find(vcpus, cpu_index);
vcpu->total_insn = 0;
@@ -207,7 +207,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
g_assert(time_handle);
qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
- qemu_plugin_register_vcpu_init_cb(id, vcpu_init);
+ qemu_plugin_register_vcpu_init_cb(id, vcpu_init, NULL);
qemu_plugin_register_vcpu_exit_cb(id, vcpu_exit);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
diff --git a/contrib/plugins/uftrace.c b/contrib/plugins/uftrace.c
index 438cebf2831..8be8409dce2 100644
--- a/contrib/plugins/uftrace.c
+++ b/contrib/plugins/uftrace.c
@@ -874,7 +874,7 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
}
}
-static void vcpu_init(unsigned int vcpu_index)
+static void vcpu_init(unsigned int vcpu_index, void *userdata)
{
Cpu *cpu = qemu_plugin_scoreboard_find(score, vcpu_index);
cpu->ops = arch_ops;
@@ -985,7 +985,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
}
score = qemu_plugin_scoreboard_new(sizeof(Cpu));
- qemu_plugin_register_vcpu_init_cb(id, vcpu_init);
+ qemu_plugin_register_vcpu_init_cb(id, vcpu_init, NULL);
qemu_plugin_register_atexit_cb(id, at_exit, (void *) info->system_emulation);
qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 8aaf404504b..bb4569a2291 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -242,6 +242,7 @@ void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_udata_cb_t cb,
* qemu_plugin_register_vcpu_init_cb() - register a vCPU initialization callback
* @id: plugin ID
* @cb: callback function
+ * @userdata: any plugin data to pass to the @cb
*
* The @cb function is called every time a vCPU is initialized.
*
@@ -249,7 +250,8 @@ void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_udata_cb_t cb,
*/
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_init_cb(qemu_plugin_id_t id,
- qemu_plugin_vcpu_simple_cb_t cb);
+ qemu_plugin_vcpu_udata_cb_t cb,
+ void *userdata);
/**
* qemu_plugin_register_vcpu_exit_cb() - register a vCPU exit callback
diff --git a/plugins/api.c b/plugins/api.c
index 91c9a24a6b2..68b564bb9c2 100644
--- a/plugins/api.c
+++ b/plugins/api.c
@@ -71,9 +71,10 @@ void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_udata_cb_t cb,
*/
void qemu_plugin_register_vcpu_init_cb(qemu_plugin_id_t id,
- qemu_plugin_vcpu_simple_cb_t cb)
+ qemu_plugin_vcpu_udata_cb_t cb,
+ void *userdata)
{
- plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_INIT, cb);
+ plugin_register_cb_udata(id, QEMU_PLUGIN_EV_VCPU_INIT, cb, userdata);
}
void qemu_plugin_register_vcpu_exit_cb(qemu_plugin_id_t id,
diff --git a/plugins/core.c b/plugins/core.c
index 217d6608c1d..48db38fe924 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -89,7 +89,6 @@ static void plugin_vcpu_cb__simple(CPUState *cpu, enum qemu_plugin_event ev)
struct qemu_plugin_cb *cb, *next;
switch (ev) {
- case QEMU_PLUGIN_EV_VCPU_INIT:
case QEMU_PLUGIN_EV_VCPU_EXIT:
case QEMU_PLUGIN_EV_VCPU_IDLE:
case QEMU_PLUGIN_EV_VCPU_RESUME:
@@ -104,6 +103,28 @@ static void plugin_vcpu_cb__simple(CPUState *cpu, enum qemu_plugin_event ev)
}
}
+/*
+ * Disable CFI checks.
+ * The callback function has been loaded from an external library so we do not
+ * have type information
+ */
+QEMU_DISABLE_CFI
+static void plugin_vcpu_cb__udata(CPUState *cpu, enum qemu_plugin_event ev)
+{
+ struct qemu_plugin_cb *cb, *next;
+
+ switch (ev) {
+ case QEMU_PLUGIN_EV_VCPU_INIT:
+ QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
+ qemu_plugin_vcpu_udata_cb_t func = cb->f.vcpu_udata;
+ func(cpu->cpu_index, cb->udata);
+ }
+ break;
+ default:
+ g_assert_not_reached();
+ }
+}
+
/*
* Disable CFI checks.
* The callback function has been loaded from an external library so we do not
@@ -271,7 +292,7 @@ static void qemu_plugin_vcpu_init__async(CPUState *cpu, run_on_cpu_data unused)
qemu_rec_mutex_unlock(&plugin.lock);
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_RW_REGS);
- plugin_vcpu_cb__simple(cpu, QEMU_PLUGIN_EV_VCPU_INIT);
+ plugin_vcpu_cb__udata(cpu, QEMU_PLUGIN_EV_VCPU_INIT);
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_NO_REGS);
}
diff --git a/tests/tcg/plugins/insn.c b/tests/tcg/plugins/insn.c
index 80f7cbb2967..d9f94888d6f 100644
--- a/tests/tcg/plugins/insn.c
+++ b/tests/tcg/plugins/insn.c
@@ -84,7 +84,7 @@ static Instruction * get_insn_record(const char *disas, uint64_t vaddr, Match *m
/*
* Initialise a new vcpu with reading the register list
*/
-static void vcpu_init(unsigned int vcpu_index)
+static void vcpu_init(unsigned int vcpu_index, void *userdata)
{
g_autoptr(GArray) reg_list = qemu_plugin_get_registers();
g_autoptr(GByteArray) reg_value = g_byte_array_new();
@@ -296,7 +296,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
qemu_plugin_scoreboard_new(sizeof(uint64_t)));
/* Register init, translation block and exit callbacks */
- qemu_plugin_register_vcpu_init_cb(id, vcpu_init);
+ qemu_plugin_register_vcpu_init_cb(id, vcpu_init, NULL);
qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
return 0;
diff --git a/tests/tcg/plugins/registers.c b/tests/tcg/plugins/registers.c
index 94776d887fe..0e41734435f 100644
--- a/tests/tcg/plugins/registers.c
+++ b/tests/tcg/plugins/registers.c
@@ -21,7 +21,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
* registers that cannot be written to, which would fail the test.
* See: https://lists.gnu.org/archive/html/qemu-devel/2026-02/msg07025.html
*/
-static void vcpu_init_cb(unsigned int vcpu_index)
+static void vcpu_init_cb(unsigned int vcpu_index, void *userdata)
{
g_autoptr(GArray) regs = qemu_plugin_get_registers();
g_assert(regs != NULL);
@@ -74,6 +74,6 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
const qemu_info_t *info,
int argc, char **argv)
{
- qemu_plugin_register_vcpu_init_cb(id, vcpu_init_cb);
+ qemu_plugin_register_vcpu_init_cb(id, vcpu_init_cb, NULL);
return 0;
}
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 08/26] plugins: add userdata to qemu_plugin_register_vcpu_exit_cb
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (6 preceding siblings ...)
2026-06-16 18:42 ` [PULL 07/26] plugins: add userdata to qemu_plugin_register_vcpu_init_cb Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 09/26] plugins: add userdata to qemu_plugin_register_vcpu_idle_cb Pierrick Bouvier
` (18 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-9-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
contrib/plugins/ips.c | 4 ++--
include/plugins/qemu-plugin.h | 4 +++-
plugins/api.c | 5 +++--
plugins/core.c | 4 ++--
4 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/contrib/plugins/ips.c b/contrib/plugins/ips.c
index 1290a624489..2c110906731 100644
--- a/contrib/plugins/ips.c
+++ b/contrib/plugins/ips.c
@@ -97,7 +97,7 @@ static void vcpu_init(unsigned int cpu_index, void *userdata)
vcpu->last_quantum_time = now_ns();
}
-static void vcpu_exit(unsigned int cpu_index)
+static void vcpu_exit(unsigned int cpu_index, void *userdata)
{
vCPUTime *vcpu = qemu_plugin_scoreboard_find(vcpus, cpu_index);
update_system_time(vcpu);
@@ -208,7 +208,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
qemu_plugin_register_vcpu_init_cb(id, vcpu_init, NULL);
- qemu_plugin_register_vcpu_exit_cb(id, vcpu_exit);
+ qemu_plugin_register_vcpu_exit_cb(id, vcpu_exit, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
return 0;
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index bb4569a2291..d4f8a99027e 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -257,6 +257,7 @@ void qemu_plugin_register_vcpu_init_cb(qemu_plugin_id_t id,
* qemu_plugin_register_vcpu_exit_cb() - register a vCPU exit callback
* @id: plugin ID
* @cb: callback function
+ * @userdata: any plugin data to pass to the @cb
*
* The @cb function is called every time a vCPU exits.
*
@@ -264,7 +265,8 @@ void qemu_plugin_register_vcpu_init_cb(qemu_plugin_id_t id,
*/
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_exit_cb(qemu_plugin_id_t id,
- qemu_plugin_vcpu_simple_cb_t cb);
+ qemu_plugin_vcpu_udata_cb_t cb,
+ void *userdata);
/**
* qemu_plugin_register_vcpu_idle_cb() - register a vCPU idle callback
diff --git a/plugins/api.c b/plugins/api.c
index 68b564bb9c2..849790fe13b 100644
--- a/plugins/api.c
+++ b/plugins/api.c
@@ -78,9 +78,10 @@ void qemu_plugin_register_vcpu_init_cb(qemu_plugin_id_t id,
}
void qemu_plugin_register_vcpu_exit_cb(qemu_plugin_id_t id,
- qemu_plugin_vcpu_simple_cb_t cb)
+ qemu_plugin_vcpu_udata_cb_t cb,
+ void *userdata)
{
- plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_EXIT, cb);
+ plugin_register_cb_udata(id, QEMU_PLUGIN_EV_VCPU_EXIT, cb, userdata);
}
static bool tb_is_mem_only(void)
diff --git a/plugins/core.c b/plugins/core.c
index 48db38fe924..c7dda9b2ff1 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -89,7 +89,6 @@ static void plugin_vcpu_cb__simple(CPUState *cpu, enum qemu_plugin_event ev)
struct qemu_plugin_cb *cb, *next;
switch (ev) {
- case QEMU_PLUGIN_EV_VCPU_EXIT:
case QEMU_PLUGIN_EV_VCPU_IDLE:
case QEMU_PLUGIN_EV_VCPU_RESUME:
/* iterate safely; plugins might uninstall themselves at any time */
@@ -115,6 +114,7 @@ static void plugin_vcpu_cb__udata(CPUState *cpu, enum qemu_plugin_event ev)
switch (ev) {
case QEMU_PLUGIN_EV_VCPU_INIT:
+ case QEMU_PLUGIN_EV_VCPU_EXIT:
QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
qemu_plugin_vcpu_udata_cb_t func = cb->f.vcpu_udata;
func(cpu->cpu_index, cb->udata);
@@ -307,7 +307,7 @@ void qemu_plugin_vcpu_exit_hook(CPUState *cpu)
bool success;
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_RW_REGS);
- plugin_vcpu_cb__simple(cpu, QEMU_PLUGIN_EV_VCPU_EXIT);
+ plugin_vcpu_cb__udata(cpu, QEMU_PLUGIN_EV_VCPU_EXIT);
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_NO_REGS);
assert(cpu->cpu_index != UNASSIGNED_CPU_INDEX);
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 09/26] plugins: add userdata to qemu_plugin_register_vcpu_idle_cb
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (7 preceding siblings ...)
2026-06-16 18:42 ` [PULL 08/26] plugins: add userdata to qemu_plugin_register_vcpu_exit_cb Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 10/26] plugins: add userdata to qemu_plugin_register_vcpu_resume_cb Pierrick Bouvier
` (17 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-10-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
include/plugins/qemu-plugin.h | 4 +++-
plugins/core.c | 9 +++++----
tests/tcg/plugins/bb.c | 4 ++--
3 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index d4f8a99027e..75d2a69a3bd 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -272,12 +272,14 @@ void qemu_plugin_register_vcpu_exit_cb(qemu_plugin_id_t id,
* qemu_plugin_register_vcpu_idle_cb() - register a vCPU idle callback
* @id: plugin ID
* @cb: callback function
+ * @userdata: any plugin data to pass to the @cb
*
* The @cb function is called every time a vCPU idles.
*/
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_idle_cb(qemu_plugin_id_t id,
- qemu_plugin_vcpu_simple_cb_t cb);
+ qemu_plugin_vcpu_udata_cb_t cb,
+ void *userdata);
/**
* qemu_plugin_register_vcpu_resume_cb() - register a vCPU resume callback
diff --git a/plugins/core.c b/plugins/core.c
index c7dda9b2ff1..47244603786 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -89,7 +89,6 @@ static void plugin_vcpu_cb__simple(CPUState *cpu, enum qemu_plugin_event ev)
struct qemu_plugin_cb *cb, *next;
switch (ev) {
- case QEMU_PLUGIN_EV_VCPU_IDLE:
case QEMU_PLUGIN_EV_VCPU_RESUME:
/* iterate safely; plugins might uninstall themselves at any time */
QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
@@ -114,6 +113,7 @@ static void plugin_vcpu_cb__udata(CPUState *cpu, enum qemu_plugin_event ev)
switch (ev) {
case QEMU_PLUGIN_EV_VCPU_INIT:
+ case QEMU_PLUGIN_EV_VCPU_IDLE:
case QEMU_PLUGIN_EV_VCPU_EXIT:
QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
qemu_plugin_vcpu_udata_cb_t func = cb->f.vcpu_udata;
@@ -627,7 +627,7 @@ void qemu_plugin_vcpu_idle_cb(CPUState *cpu)
/* idle and resume cb may be called before init, ignore in this case */
if (cpu->cpu_index < plugin.num_vcpus) {
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_RW_REGS_PC);
- plugin_vcpu_cb__simple(cpu, QEMU_PLUGIN_EV_VCPU_IDLE);
+ plugin_vcpu_cb__udata(cpu, QEMU_PLUGIN_EV_VCPU_IDLE);
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_NO_REGS);
}
}
@@ -660,9 +660,10 @@ void qemu_plugin_vcpu_hostcall_cb(CPUState *cpu, uint64_t from)
}
void qemu_plugin_register_vcpu_idle_cb(qemu_plugin_id_t id,
- qemu_plugin_vcpu_simple_cb_t cb)
+ qemu_plugin_vcpu_udata_cb_t cb,
+ void *userdata)
{
- plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_IDLE, cb);
+ plugin_register_cb_udata(id, QEMU_PLUGIN_EV_VCPU_IDLE, cb, userdata);
}
void qemu_plugin_register_vcpu_resume_cb(qemu_plugin_id_t id,
diff --git a/tests/tcg/plugins/bb.c b/tests/tcg/plugins/bb.c
index f29b466dab2..ba605246eb0 100644
--- a/tests/tcg/plugins/bb.c
+++ b/tests/tcg/plugins/bb.c
@@ -56,7 +56,7 @@ static void plugin_exit(void *p)
qemu_plugin_scoreboard_free(counts);
}
-static void vcpu_idle(unsigned int cpu_index)
+static void vcpu_idle(unsigned int cpu_index, void *userdata)
{
CPUCount *count = qemu_plugin_scoreboard_find(counts, cpu_index);
g_autoptr(GString) report = g_string_new("");
@@ -124,7 +124,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
counts, CPUCount, insn_count);
if (idle_report) {
- qemu_plugin_register_vcpu_idle_cb(id, vcpu_idle);
+ qemu_plugin_register_vcpu_idle_cb(id, vcpu_idle, NULL);
}
qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 10/26] plugins: add userdata to qemu_plugin_register_vcpu_resume_cb
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (8 preceding siblings ...)
2026-06-16 18:42 ` [PULL 09/26] plugins: add userdata to qemu_plugin_register_vcpu_idle_cb Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 11/26] plugins: add userdata to qemu_plugin_vcpu_for_each Pierrick Bouvier
` (16 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-11-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
include/plugins/qemu-plugin.h | 4 +++-
plugins/core.c | 31 +++++--------------------------
2 files changed, 8 insertions(+), 27 deletions(-)
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 75d2a69a3bd..8c146ea49c2 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -285,12 +285,14 @@ void qemu_plugin_register_vcpu_idle_cb(qemu_plugin_id_t id,
* qemu_plugin_register_vcpu_resume_cb() - register a vCPU resume callback
* @id: plugin ID
* @cb: callback function
+ * @userdata: any plugin data to pass to the @cb
*
* The @cb function is called every time a vCPU resumes execution.
*/
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_resume_cb(qemu_plugin_id_t id,
- qemu_plugin_vcpu_simple_cb_t cb);
+ qemu_plugin_vcpu_udata_cb_t cb,
+ void *userdata);
/**
* qemu_plugin_register_vcpu_discon_cb() - register a discontinuity callback
diff --git a/plugins/core.c b/plugins/core.c
index 47244603786..342357a7499 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -78,29 +78,6 @@ void plugin_unregister_cb__locked(struct qemu_plugin_ctx *ctx,
}
}
-/*
- * Disable CFI checks.
- * The callback function has been loaded from an external library so we do not
- * have type information
- */
-QEMU_DISABLE_CFI
-static void plugin_vcpu_cb__simple(CPUState *cpu, enum qemu_plugin_event ev)
-{
- struct qemu_plugin_cb *cb, *next;
-
- switch (ev) {
- case QEMU_PLUGIN_EV_VCPU_RESUME:
- /* iterate safely; plugins might uninstall themselves at any time */
- QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
- qemu_plugin_vcpu_simple_cb_t func = cb->f.vcpu_simple;
- func(cpu->cpu_index);
- }
- break;
- default:
- g_assert_not_reached();
- }
-}
-
/*
* Disable CFI checks.
* The callback function has been loaded from an external library so we do not
@@ -114,6 +91,7 @@ static void plugin_vcpu_cb__udata(CPUState *cpu, enum qemu_plugin_event ev)
switch (ev) {
case QEMU_PLUGIN_EV_VCPU_INIT:
case QEMU_PLUGIN_EV_VCPU_IDLE:
+ case QEMU_PLUGIN_EV_VCPU_RESUME:
case QEMU_PLUGIN_EV_VCPU_EXIT:
QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
qemu_plugin_vcpu_udata_cb_t func = cb->f.vcpu_udata;
@@ -636,7 +614,7 @@ void qemu_plugin_vcpu_resume_cb(CPUState *cpu)
{
if (cpu->cpu_index < plugin.num_vcpus) {
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_RW_REGS_PC);
- plugin_vcpu_cb__simple(cpu, QEMU_PLUGIN_EV_VCPU_RESUME);
+ plugin_vcpu_cb__udata(cpu, QEMU_PLUGIN_EV_VCPU_RESUME);
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_NO_REGS);
}
}
@@ -667,9 +645,10 @@ void qemu_plugin_register_vcpu_idle_cb(qemu_plugin_id_t id,
}
void qemu_plugin_register_vcpu_resume_cb(qemu_plugin_id_t id,
- qemu_plugin_vcpu_simple_cb_t cb)
+ qemu_plugin_vcpu_udata_cb_t cb,
+ void *userdata)
{
- plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_RESUME, cb);
+ plugin_register_cb_udata(id, QEMU_PLUGIN_EV_VCPU_RESUME, cb, userdata);
}
void qemu_plugin_register_vcpu_discon_cb(qemu_plugin_id_t id,
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 11/26] plugins: add userdata to qemu_plugin_vcpu_for_each
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (9 preceding siblings ...)
2026-06-16 18:42 ` [PULL 10/26] plugins: add userdata to qemu_plugin_register_vcpu_resume_cb Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 12/26] plugins: remove type qemu_plugin_vcpu_simple_cb_t Pierrick Bouvier
` (15 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-12-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
include/plugins/qemu-plugin.h | 4 +++-
plugins/core.c | 9 ++++++---
2 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 8c146ea49c2..320644a2f0a 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -957,6 +957,7 @@ const char *qemu_plugin_insn_symbol(const struct qemu_plugin_insn *insn);
* qemu_plugin_vcpu_for_each() - iterate over the existing vCPU
* @id: plugin ID
* @cb: callback function
+ * @userdata: user data for callback
*
* The @cb function is called once for each existing vCPU.
*
@@ -964,7 +965,8 @@ const char *qemu_plugin_insn_symbol(const struct qemu_plugin_insn *insn);
*/
QEMU_PLUGIN_API
void qemu_plugin_vcpu_for_each(qemu_plugin_id_t id,
- qemu_plugin_vcpu_simple_cb_t cb);
+ qemu_plugin_vcpu_udata_cb_t cb,
+ void *userdata);
/**
* qemu_plugin_register_flush_cb() - register code cache flush callback
diff --git a/plugins/core.c b/plugins/core.c
index 342357a7499..5b4ed0ce213 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -297,18 +297,20 @@ void qemu_plugin_vcpu_exit_hook(CPUState *cpu)
struct plugin_for_each_args {
struct qemu_plugin_ctx *ctx;
- qemu_plugin_vcpu_simple_cb_t cb;
+ qemu_plugin_vcpu_udata_cb_t cb;
+ void *userdata;
};
static void plugin_vcpu_for_each(gpointer k, gpointer v, gpointer udata)
{
struct plugin_for_each_args *args = udata;
int cpu_index = *(int *)k;
- args->cb(cpu_index);
+ args->cb(cpu_index, args->userdata);
}
void qemu_plugin_vcpu_for_each(qemu_plugin_id_t id,
- qemu_plugin_vcpu_simple_cb_t cb)
+ qemu_plugin_vcpu_udata_cb_t cb,
+ void *userdata)
{
struct plugin_for_each_args args;
@@ -318,6 +320,7 @@ void qemu_plugin_vcpu_for_each(qemu_plugin_id_t id,
qemu_rec_mutex_lock(&plugin.lock);
args.ctx = plugin_id_to_ctx_locked(id);
args.cb = cb;
+ args.userdata = userdata;
g_hash_table_foreach(plugin.cpu_ht, plugin_vcpu_for_each, &args);
qemu_rec_mutex_unlock(&plugin.lock);
}
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 12/26] plugins: remove type qemu_plugin_vcpu_simple_cb_t
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (10 preceding siblings ...)
2026-06-16 18:42 ` [PULL 11/26] plugins: add userdata to qemu_plugin_vcpu_for_each Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 13/26] plugins: add userdata to qemu_plugin_register_vcpu_discon_cb Pierrick Bouvier
` (14 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-13-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
include/plugins/qemu-plugin.h | 6 ------
include/qemu/plugin.h | 1 -
2 files changed, 7 deletions(-)
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 320644a2f0a..cf937c60ee7 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -147,12 +147,6 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
*/
typedef void (*qemu_plugin_udata_cb_t)(void *userdata);
-/**
- * typedef qemu_plugin_vcpu_simple_cb_t - vcpu callback
- * @vcpu_index: the current vcpu context
- */
-typedef void (*qemu_plugin_vcpu_simple_cb_t)(unsigned int vcpu_index);
-
/**
* typedef qemu_plugin_vcpu_udata_cb_t - vcpu callback
* @vcpu_index: the current vcpu context
diff --git a/include/qemu/plugin.h b/include/qemu/plugin.h
index dac08cdc60c..9356ee836ac 100644
--- a/include/qemu/plugin.h
+++ b/include/qemu/plugin.h
@@ -56,7 +56,6 @@ int qemu_plugin_load_list(QemuPluginList *head, Error **errp);
union qemu_plugin_cb_sig {
qemu_plugin_udata_cb_t udata;
- qemu_plugin_vcpu_simple_cb_t vcpu_simple;
qemu_plugin_vcpu_udata_cb_t vcpu_udata;
qemu_plugin_vcpu_discon_cb_t vcpu_discon;
qemu_plugin_vcpu_tb_trans_cb_t vcpu_tb_trans;
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 13/26] plugins: add userdata to qemu_plugin_register_vcpu_discon_cb
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (11 preceding siblings ...)
2026-06-16 18:42 ` [PULL 12/26] plugins: remove type qemu_plugin_vcpu_simple_cb_t Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 14/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_discon_cb_t Pierrick Bouvier
` (13 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-14-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
contrib/plugins/traps.c | 5 +++--
include/plugins/qemu-plugin.h | 8 ++++++--
plugins/core.c | 12 ++++++------
tests/tcg/plugins/discons.c | 4 ++--
4 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/contrib/plugins/traps.c b/contrib/plugins/traps.c
index 4b879a8212a..4d59aa3c09d 100644
--- a/contrib/plugins/traps.c
+++ b/contrib/plugins/traps.c
@@ -25,7 +25,7 @@ static struct qemu_plugin_scoreboard *traps;
static void vcpu_discon(qemu_plugin_id_t id, unsigned int vcpu_index,
enum qemu_plugin_discon_type type, uint64_t from_pc,
- uint64_t to_pc)
+ uint64_t to_pc, void *userdata)
{
TrapCounters *rec = qemu_plugin_scoreboard_find(traps, vcpu_index);
switch (type) {
@@ -75,7 +75,8 @@ int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info,
traps = qemu_plugin_scoreboard_new(sizeof(TrapCounters));
qemu_plugin_register_vcpu_discon_cb(id, QEMU_PLUGIN_DISCON_ALL,
- vcpu_discon);
+ vcpu_discon,
+ NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index cf937c60ee7..03e7b2b1fb8 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -186,6 +186,7 @@ enum qemu_plugin_discon_type {
* @from_pc: the source of the discontinuity, e.g. the PC before the
* transition
* @to_pc: the PC pointing to the next instruction to be executed
+ * @userdata: any plugin data to pass to the @cb
*
* The exact semantics of @from_pc depends on the @type of discontinuity. For
* interrupts, @from_pc will point to the next instruction which would have
@@ -198,7 +199,8 @@ enum qemu_plugin_discon_type {
typedef void (*qemu_plugin_vcpu_discon_cb_t)(qemu_plugin_id_t id,
unsigned int vcpu_index,
enum qemu_plugin_discon_type type,
- uint64_t from_pc, uint64_t to_pc);
+ uint64_t from_pc, uint64_t to_pc,
+ void *userdata);
/**
* qemu_plugin_uninstall() - Uninstall a plugin
@@ -293,6 +295,7 @@ void qemu_plugin_register_vcpu_resume_cb(qemu_plugin_id_t id,
* @id: plugin ID
* @type: types of discontinuities for which to call the callback
* @cb: callback function
+ * @userdata: any plugin data to pass to the @cb
*
* The @cb function is called every time a vCPU receives a discontinuity event
* of the specified type(s), after the vCPU was prepared to handle the event.
@@ -302,7 +305,8 @@ void qemu_plugin_register_vcpu_resume_cb(qemu_plugin_id_t id,
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_discon_cb(qemu_plugin_id_t id,
enum qemu_plugin_discon_type type,
- qemu_plugin_vcpu_discon_cb_t cb);
+ qemu_plugin_vcpu_discon_cb_t cb,
+ void *userdata);
/** struct qemu_plugin_tb - Opaque handle for a translation block */
struct qemu_plugin_tb;
diff --git a/plugins/core.c b/plugins/core.c
index 5b4ed0ce213..0da7fbf929b 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -122,8 +122,7 @@ static void plugin_vcpu_cb__discon(CPUState *cpu,
/* iterate safely; plugins might uninstall themselves at any time */
QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
qemu_plugin_vcpu_discon_cb_t func = cb->f.vcpu_discon;
-
- func(cb->ctx->id, cpu->cpu_index, type, from, to);
+ func(cb->ctx->id, cpu->cpu_index, type, from, to, cb->udata);
}
}
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_NO_REGS);
@@ -656,16 +655,17 @@ void qemu_plugin_register_vcpu_resume_cb(qemu_plugin_id_t id,
void qemu_plugin_register_vcpu_discon_cb(qemu_plugin_id_t id,
enum qemu_plugin_discon_type type,
- qemu_plugin_vcpu_discon_cb_t cb)
+ qemu_plugin_vcpu_discon_cb_t cb,
+ void *userdata)
{
if (type & QEMU_PLUGIN_DISCON_INTERRUPT) {
- plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_INTERRUPT, cb);
+ plugin_register_cb_udata(id, QEMU_PLUGIN_EV_VCPU_INTERRUPT, cb, userdata);
}
if (type & QEMU_PLUGIN_DISCON_EXCEPTION) {
- plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_EXCEPTION, cb);
+ plugin_register_cb_udata(id, QEMU_PLUGIN_EV_VCPU_EXCEPTION, cb, userdata);
}
if (type & QEMU_PLUGIN_DISCON_HOSTCALL) {
- plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_HOSTCALL, cb);
+ plugin_register_cb_udata(id, QEMU_PLUGIN_EV_VCPU_HOSTCALL, cb, userdata);
}
}
diff --git a/tests/tcg/plugins/discons.c b/tests/tcg/plugins/discons.c
index 2e0e664e823..22114830fdc 100644
--- a/tests/tcg/plugins/discons.c
+++ b/tests/tcg/plugins/discons.c
@@ -98,7 +98,7 @@ static void report_mismatch(const char *pc_name, unsigned int vcpu_index,
static void vcpu_discon(qemu_plugin_id_t id, unsigned int vcpu_index,
enum qemu_plugin_discon_type type, uint64_t from_pc,
- uint64_t to_pc)
+ uint64_t to_pc, void *userdata)
{
struct cpu_state *state = qemu_plugin_scoreboard_find(states, vcpu_index);
@@ -214,7 +214,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
has_from);
qemu_plugin_register_vcpu_discon_cb(id, QEMU_PLUGIN_DISCON_ALL,
- vcpu_discon);
+ vcpu_discon, NULL);
qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
return 0;
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 14/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_discon_cb_t
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (12 preceding siblings ...)
2026-06-16 18:42 ` [PULL 13/26] plugins: add userdata to qemu_plugin_register_vcpu_discon_cb Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 15/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_tb_trans_cb_t Pierrick Bouvier
` (12 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-15-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
contrib/plugins/traps.c | 2 +-
include/plugins/qemu-plugin.h | 4 +---
plugins/core.c | 2 +-
tests/tcg/plugins/discons.c | 2 +-
4 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/contrib/plugins/traps.c b/contrib/plugins/traps.c
index 4d59aa3c09d..b6df4455d63 100644
--- a/contrib/plugins/traps.c
+++ b/contrib/plugins/traps.c
@@ -23,7 +23,7 @@ typedef struct {
static struct qemu_plugin_scoreboard *traps;
-static void vcpu_discon(qemu_plugin_id_t id, unsigned int vcpu_index,
+static void vcpu_discon(unsigned int vcpu_index,
enum qemu_plugin_discon_type type, uint64_t from_pc,
uint64_t to_pc, void *userdata)
{
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 03e7b2b1fb8..60d27d8d9c1 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -180,7 +180,6 @@ enum qemu_plugin_discon_type {
/**
* typedef qemu_plugin_vcpu_discon_cb_t - vcpu discontinuity callback
- * @id: plugin ID
* @vcpu_index: the current vcpu context
* @type: the type of discontinuity
* @from_pc: the source of the discontinuity, e.g. the PC before the
@@ -196,8 +195,7 @@ enum qemu_plugin_discon_type {
* observable via general instruction exec callbacks. The same may be the case
* for some host calls such as hypervisor call "exceptions".
*/
-typedef void (*qemu_plugin_vcpu_discon_cb_t)(qemu_plugin_id_t id,
- unsigned int vcpu_index,
+typedef void (*qemu_plugin_vcpu_discon_cb_t)(unsigned int vcpu_index,
enum qemu_plugin_discon_type type,
uint64_t from_pc, uint64_t to_pc,
void *userdata);
diff --git a/plugins/core.c b/plugins/core.c
index 0da7fbf929b..7e4ccd37b73 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -122,7 +122,7 @@ static void plugin_vcpu_cb__discon(CPUState *cpu,
/* iterate safely; plugins might uninstall themselves at any time */
QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
qemu_plugin_vcpu_discon_cb_t func = cb->f.vcpu_discon;
- func(cb->ctx->id, cpu->cpu_index, type, from, to, cb->udata);
+ func(cpu->cpu_index, type, from, to, cb->udata);
}
}
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_NO_REGS);
diff --git a/tests/tcg/plugins/discons.c b/tests/tcg/plugins/discons.c
index 22114830fdc..5ab645705e3 100644
--- a/tests/tcg/plugins/discons.c
+++ b/tests/tcg/plugins/discons.c
@@ -96,7 +96,7 @@ static void report_mismatch(const char *pc_name, unsigned int vcpu_index,
g_free(report);
}
-static void vcpu_discon(qemu_plugin_id_t id, unsigned int vcpu_index,
+static void vcpu_discon(unsigned int vcpu_index,
enum qemu_plugin_discon_type type, uint64_t from_pc,
uint64_t to_pc, void *userdata)
{
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 15/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_tb_trans_cb_t
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (13 preceding siblings ...)
2026-06-16 18:42 ` [PULL 14/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_discon_cb_t Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 16/26] plugins: add userdata to qemu_plugin_vcpu_tb_trans_cb_t Pierrick Bouvier
` (11 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-16-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
contrib/plugins/bbv.c | 2 +-
contrib/plugins/cache.c | 2 +-
contrib/plugins/cflow.c | 2 +-
contrib/plugins/cpp.cpp | 2 +-
contrib/plugins/drcov.c | 2 +-
contrib/plugins/execlog.c | 2 +-
contrib/plugins/hotblocks.c | 2 +-
contrib/plugins/hotpages.c | 2 +-
contrib/plugins/howvec.c | 2 +-
contrib/plugins/hwprofile.c | 2 +-
contrib/plugins/ips.c | 2 +-
contrib/plugins/lockstep.c | 2 +-
contrib/plugins/stoptrigger.c | 2 +-
contrib/plugins/uftrace.c | 2 +-
include/plugins/qemu-plugin.h | 4 +---
plugins/core.c | 2 +-
tests/tcg/plugins/bb.c | 2 +-
tests/tcg/plugins/discons.c | 2 +-
tests/tcg/plugins/empty.c | 2 +-
tests/tcg/plugins/inline.c | 2 +-
tests/tcg/plugins/insn.c | 2 +-
tests/tcg/plugins/mem.c | 2 +-
tests/tcg/plugins/patch.c | 2 +-
tests/tcg/plugins/reset.c | 4 ++--
tests/tcg/plugins/setpc.c | 2 +-
25 files changed, 26 insertions(+), 28 deletions(-)
diff --git a/contrib/plugins/bbv.c b/contrib/plugins/bbv.c
index 0ad1301a1de..7e9e72477d7 100644
--- a/contrib/plugins/bbv.c
+++ b/contrib/plugins/bbv.c
@@ -102,7 +102,7 @@ static void vcpu_interval_exec(unsigned int vcpu_index, void *udata)
fputc('\n', vcpu->file);
}
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
uint64_t n_insns = qemu_plugin_tb_n_insns(tb);
uint64_t vaddr = qemu_plugin_tb_vaddr(tb);
diff --git a/contrib/plugins/cache.c b/contrib/plugins/cache.c
index f41ddb0aa43..c9d61de26c9 100644
--- a/contrib/plugins/cache.c
+++ b/contrib/plugins/cache.c
@@ -462,7 +462,7 @@ static void vcpu_insn_exec(unsigned int vcpu_index, void *userdata)
g_mutex_unlock(&l2_ucache_locks[cache_idx]);
}
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
size_t n_insns;
size_t i;
diff --git a/contrib/plugins/cflow.c b/contrib/plugins/cflow.c
index 4d00879ccad..9a850c8c0cc 100644
--- a/contrib/plugins/cflow.c
+++ b/contrib/plugins/cflow.c
@@ -297,7 +297,7 @@ static void vcpu_tb_branched_exec(unsigned int cpu_index, void *udata)
* instructions for their execution.
*
*/
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
uint64_t pc = qemu_plugin_tb_vaddr(tb);
size_t insns = qemu_plugin_tb_n_insns(tb);
diff --git a/contrib/plugins/cpp.cpp b/contrib/plugins/cpp.cpp
index 0673c4f074d..34243cc922f 100644
--- a/contrib/plugins/cpp.cpp
+++ b/contrib/plugins/cpp.cpp
@@ -363,7 +363,7 @@
QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
}
diff --git a/contrib/plugins/drcov.c b/contrib/plugins/drcov.c
index 458c0d2084d..2dc08512d44 100644
--- a/contrib/plugins/drcov.c
+++ b/contrib/plugins/drcov.c
@@ -119,7 +119,7 @@ static void vcpu_tb_exec(unsigned int cpu_index, void *udata)
g_mutex_unlock(&lock);
}
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
uint64_t pc = qemu_plugin_tb_vaddr(tb);
size_t n = qemu_plugin_tb_n_insns(tb);
diff --git a/contrib/plugins/execlog.c b/contrib/plugins/execlog.c
index 2d02816a184..8329112305c 100644
--- a/contrib/plugins/execlog.c
+++ b/contrib/plugins/execlog.c
@@ -177,7 +177,7 @@ static void vcpu_insn_exec(unsigned int cpu_index, void *udata)
* QEMU convert code by translation block (TB). By hooking here we can then hook
* a callback on each instruction and memory access.
*/
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
struct qemu_plugin_insn *insn;
bool skip = (imatches || amatches);
diff --git a/contrib/plugins/hotblocks.c b/contrib/plugins/hotblocks.c
index 92859872ac9..682b160019a 100644
--- a/contrib/plugins/hotblocks.c
+++ b/contrib/plugins/hotblocks.c
@@ -121,7 +121,7 @@ static void vcpu_tb_exec(unsigned int cpu_index, void *udata)
* Otherwise a helper is inserted which calls the vcpu_tb_exec
* callback.
*/
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
ExecCount *cnt;
uint64_t pc = qemu_plugin_tb_vaddr(tb);
diff --git a/contrib/plugins/hotpages.c b/contrib/plugins/hotpages.c
index a6d83b06c75..d8321a73303 100644
--- a/contrib/plugins/hotpages.c
+++ b/contrib/plugins/hotpages.c
@@ -148,7 +148,7 @@ static void vcpu_haddr(unsigned int cpu_index, qemu_plugin_meminfo_t meminfo,
g_mutex_unlock(&lock);
}
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
size_t n = qemu_plugin_tb_n_insns(tb);
size_t i;
diff --git a/contrib/plugins/howvec.c b/contrib/plugins/howvec.c
index 75728896198..feabc10bf44 100644
--- a/contrib/plugins/howvec.c
+++ b/contrib/plugins/howvec.c
@@ -310,7 +310,7 @@ static struct qemu_plugin_scoreboard *find_counter(
return NULL;
}
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
size_t n = qemu_plugin_tb_n_insns(tb);
size_t i;
diff --git a/contrib/plugins/hwprofile.c b/contrib/plugins/hwprofile.c
index b7f96117e94..fcc993015d7 100644
--- a/contrib/plugins/hwprofile.c
+++ b/contrib/plugins/hwprofile.c
@@ -242,7 +242,7 @@ static void vcpu_haddr(unsigned int cpu_index, qemu_plugin_meminfo_t meminfo,
}
}
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
size_t n = qemu_plugin_tb_n_insns(tb);
size_t i;
diff --git a/contrib/plugins/ips.c b/contrib/plugins/ips.c
index 2c110906731..a1fcba7c5d6 100644
--- a/contrib/plugins/ips.c
+++ b/contrib/plugins/ips.c
@@ -110,7 +110,7 @@ static void every_quantum_insn(unsigned int cpu_index, void *udata)
update_system_time(vcpu);
}
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
size_t n_insns = qemu_plugin_tb_n_insns(tb);
qemu_plugin_u64 quantum_insn =
diff --git a/contrib/plugins/lockstep.c b/contrib/plugins/lockstep.c
index c1c2b0aca8e..dc527ad56e2 100644
--- a/contrib/plugins/lockstep.c
+++ b/contrib/plugins/lockstep.c
@@ -249,7 +249,7 @@ static void vcpu_tb_exec(unsigned int cpu_index, void *udata)
log = g_slist_prepend(log, exec);
}
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
BlockInfo *bi = g_new0(BlockInfo, 1);
bi->pc = qemu_plugin_tb_vaddr(tb);
diff --git a/contrib/plugins/stoptrigger.c b/contrib/plugins/stoptrigger.c
index 40f8fd313d7..222a3f92ae0 100644
--- a/contrib/plugins/stoptrigger.c
+++ b/contrib/plugins/stoptrigger.c
@@ -64,7 +64,7 @@ static void exit_address_reached(unsigned int cpu_index, void *udata)
exit_emulation(ei->exit_code, msg);
}
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
size_t tb_n = qemu_plugin_tb_n_insns(tb);
for (size_t i = 0; i < tb_n; i++) {
diff --git a/contrib/plugins/uftrace.c b/contrib/plugins/uftrace.c
index 8be8409dce2..a1b10f9cf59 100644
--- a/contrib/plugins/uftrace.c
+++ b/contrib/plugins/uftrace.c
@@ -838,7 +838,7 @@ static void track_callstack(unsigned int cpu_index, void *udata)
trace_enter_stack(t, cs, timestamp);
}
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
size_t n_insns = qemu_plugin_tb_n_insns(tb);
uintptr_t tb_pc = qemu_plugin_tb_vaddr(tb);
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 60d27d8d9c1..8242e054054 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -417,11 +417,9 @@ enum qemu_plugin_cond {
/**
* typedef qemu_plugin_vcpu_tb_trans_cb_t - translation callback
- * @id: unique plugin id
* @tb: opaque handle used for querying and instrumenting a block.
*/
-typedef void (*qemu_plugin_vcpu_tb_trans_cb_t)(qemu_plugin_id_t id,
- struct qemu_plugin_tb *tb);
+typedef void (*qemu_plugin_vcpu_tb_trans_cb_t)(struct qemu_plugin_tb *tb);
/**
* qemu_plugin_register_vcpu_tb_trans_cb() - register a translate cb
diff --git a/plugins/core.c b/plugins/core.c
index 7e4ccd37b73..0ae0dc49aec 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -488,7 +488,7 @@ void qemu_plugin_tb_trans_cb(CPUState *cpu, struct qemu_plugin_tb *tb)
qemu_plugin_vcpu_tb_trans_cb_t func = cb->f.vcpu_tb_trans;
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_RW_REGS);
- func(cb->ctx->id, tb);
+ func(tb);
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_NO_REGS);
}
}
diff --git a/tests/tcg/plugins/bb.c b/tests/tcg/plugins/bb.c
index ba605246eb0..713063f4945 100644
--- a/tests/tcg/plugins/bb.c
+++ b/tests/tcg/plugins/bb.c
@@ -77,7 +77,7 @@ static void vcpu_tb_exec(unsigned int cpu_index, void *udata)
count->bb_count++;
}
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
size_t n_insns = qemu_plugin_tb_n_insns(tb);
diff --git a/tests/tcg/plugins/discons.c b/tests/tcg/plugins/discons.c
index 5ab645705e3..d2a163a5714 100644
--- a/tests/tcg/plugins/discons.c
+++ b/tests/tcg/plugins/discons.c
@@ -147,7 +147,7 @@ static void insn_exec(unsigned int vcpu_index, void *userdata)
}
}
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
size_t n_insns = qemu_plugin_tb_n_insns(tb);
for (size_t i = 0; i < n_insns; i++) {
diff --git a/tests/tcg/plugins/empty.c b/tests/tcg/plugins/empty.c
index 8fa6bacd93d..5927507c18e 100644
--- a/tests/tcg/plugins/empty.c
+++ b/tests/tcg/plugins/empty.c
@@ -20,7 +20,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
* This allows us to measure the overhead of injecting and then
* removing empty instrumentation.
*/
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{ }
QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
diff --git a/tests/tcg/plugins/inline.c b/tests/tcg/plugins/inline.c
index 1d17884b40b..3f5c49f5ede 100644
--- a/tests/tcg/plugins/inline.c
+++ b/tests/tcg/plugins/inline.c
@@ -223,7 +223,7 @@ static void vcpu_mem_access(unsigned int cpu_index,
g_mutex_unlock(&mem_lock);
}
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
void *tb_store = tb;
qemu_plugin_register_vcpu_tb_exec_inline_per_vcpu(
diff --git a/tests/tcg/plugins/insn.c b/tests/tcg/plugins/insn.c
index d9f94888d6f..a303275ea1b 100644
--- a/tests/tcg/plugins/insn.c
+++ b/tests/tcg/plugins/insn.c
@@ -138,7 +138,7 @@ static void vcpu_insn_matched_exec_before(unsigned int cpu_index, void *udata)
}
}
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
size_t n = qemu_plugin_tb_n_insns(tb);
size_t i;
diff --git a/tests/tcg/plugins/mem.c b/tests/tcg/plugins/mem.c
index 5cdf71c7e49..24a3bce0bfd 100644
--- a/tests/tcg/plugins/mem.c
+++ b/tests/tcg/plugins/mem.c
@@ -266,7 +266,7 @@ static void print_access(unsigned int cpu_index, qemu_plugin_meminfo_t meminfo,
qemu_plugin_outs(out->str);
}
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
size_t n = qemu_plugin_tb_n_insns(tb);
size_t i;
diff --git a/tests/tcg/plugins/patch.c b/tests/tcg/plugins/patch.c
index eba2f8b8d6c..8fcf0bd409b 100644
--- a/tests/tcg/plugins/patch.c
+++ b/tests/tcg/plugins/patch.c
@@ -130,7 +130,7 @@ static void patch_vaddr(unsigned int vcpu_index, void *userdata)
/*
* Callback on translation of a translation block.
*/
-static void vcpu_tb_trans_cb(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans_cb(struct qemu_plugin_tb *tb)
{
g_autoptr(GByteArray) insn_data = g_byte_array_new();
uintptr_t addr = 0;
diff --git a/tests/tcg/plugins/reset.c b/tests/tcg/plugins/reset.c
index ef5a32781b2..1fdf114e5e0 100644
--- a/tests/tcg/plugins/reset.c
+++ b/tests/tcg/plugins/reset.c
@@ -27,7 +27,7 @@ static void tb_exec_after_reset(unsigned int vcpu_index, void *userdata)
qemu_plugin_uninstall(plugin_id, after_uninstall, NULL);
}
-static void tb_trans_after_reset(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void tb_trans_after_reset(struct qemu_plugin_tb *tb)
{
g_assert(was_reset && !was_uninstalled);
qemu_plugin_register_vcpu_tb_exec_cb(tb, tb_exec_after_reset,
@@ -49,7 +49,7 @@ static void tb_exec_before_reset(unsigned int vcpu_index, void *userdata)
qemu_plugin_reset(plugin_id, after_reset, (void *) plugin_id);
}
-static void tb_trans_before_reset(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void tb_trans_before_reset(struct qemu_plugin_tb *tb)
{
g_assert(!was_reset && !was_uninstalled);
qemu_plugin_register_vcpu_tb_exec_cb(tb, tb_exec_before_reset,
diff --git a/tests/tcg/plugins/setpc.c b/tests/tcg/plugins/setpc.c
index 8f2d025e245..44cea064783 100644
--- a/tests/tcg/plugins/setpc.c
+++ b/tests/tcg/plugins/setpc.c
@@ -73,7 +73,7 @@ static void vcpu_mem_access(unsigned int vcpu_index,
}
}
-static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
{
size_t insns = qemu_plugin_tb_n_insns(tb);
for (size_t i = 0; i < insns; i++) {
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 16/26] plugins: add userdata to qemu_plugin_vcpu_tb_trans_cb_t
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (14 preceding siblings ...)
2026-06-16 18:42 ` [PULL 15/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_tb_trans_cb_t Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 17/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_cb_t Pierrick Bouvier
` (10 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-17-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
contrib/plugins/bbv.c | 4 ++--
contrib/plugins/cache.c | 4 ++--
contrib/plugins/cflow.c | 4 ++--
contrib/plugins/cpp.cpp | 4 ++--
contrib/plugins/drcov.c | 4 ++--
contrib/plugins/execlog.c | 4 ++--
contrib/plugins/hotblocks.c | 4 ++--
contrib/plugins/hotpages.c | 4 ++--
contrib/plugins/howvec.c | 4 ++--
contrib/plugins/hwprofile.c | 4 ++--
contrib/plugins/ips.c | 4 ++--
contrib/plugins/lockstep.c | 4 ++--
contrib/plugins/stoptrigger.c | 4 ++--
contrib/plugins/uftrace.c | 4 ++--
include/plugins/qemu-plugin.h | 8 ++++++--
plugins/api.c | 5 +++--
plugins/core.c | 2 +-
tests/tcg/plugins/bb.c | 4 ++--
tests/tcg/plugins/discons.c | 4 ++--
tests/tcg/plugins/empty.c | 4 ++--
tests/tcg/plugins/inline.c | 4 ++--
tests/tcg/plugins/insn.c | 4 ++--
tests/tcg/plugins/mem.c | 4 ++--
tests/tcg/plugins/patch.c | 4 ++--
tests/tcg/plugins/reset.c | 8 ++++----
tests/tcg/plugins/setpc.c | 4 ++--
26 files changed, 58 insertions(+), 53 deletions(-)
diff --git a/contrib/plugins/bbv.c b/contrib/plugins/bbv.c
index 7e9e72477d7..0e6ec673d97 100644
--- a/contrib/plugins/bbv.c
+++ b/contrib/plugins/bbv.c
@@ -102,7 +102,7 @@ static void vcpu_interval_exec(unsigned int vcpu_index, void *udata)
fputc('\n', vcpu->file);
}
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
uint64_t n_insns = qemu_plugin_tb_n_insns(tb);
uint64_t vaddr = qemu_plugin_tb_vaddr(tb);
@@ -157,7 +157,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
vcpus = qemu_plugin_scoreboard_new(sizeof(Vcpu));
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
qemu_plugin_register_vcpu_init_cb(id, vcpu_init, NULL);
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
return 0;
}
diff --git a/contrib/plugins/cache.c b/contrib/plugins/cache.c
index c9d61de26c9..0a5349f131e 100644
--- a/contrib/plugins/cache.c
+++ b/contrib/plugins/cache.c
@@ -462,7 +462,7 @@ static void vcpu_insn_exec(unsigned int vcpu_index, void *userdata)
g_mutex_unlock(&l2_ucache_locks[cache_idx]);
}
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
size_t n_insns;
size_t i;
@@ -844,7 +844,7 @@ int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info,
l1_icache_locks = g_new0(GMutex, cores);
l2_ucache_locks = use_l2 ? g_new0(GMutex, cores) : NULL;
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
miss_ht = g_hash_table_new_full(g_int64_hash, g_int64_equal, NULL, insn_free);
diff --git a/contrib/plugins/cflow.c b/contrib/plugins/cflow.c
index 9a850c8c0cc..319a7a7fc07 100644
--- a/contrib/plugins/cflow.c
+++ b/contrib/plugins/cflow.c
@@ -297,7 +297,7 @@ static void vcpu_tb_branched_exec(unsigned int cpu_index, void *udata)
* instructions for their execution.
*
*/
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
uint64_t pc = qemu_plugin_tb_vaddr(tb);
size_t insns = qemu_plugin_tb_n_insns(tb);
@@ -387,7 +387,7 @@ int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info,
plugin_init();
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
return 0;
}
diff --git a/contrib/plugins/cpp.cpp b/contrib/plugins/cpp.cpp
index 34243cc922f..a0bb261fbe8 100644
--- a/contrib/plugins/cpp.cpp
+++ b/contrib/plugins/cpp.cpp
@@ -363,7 +363,7 @@
QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
}
@@ -371,6 +371,6 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
const qemu_info_t *info,
int argc, char **argv)
{
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
return 0;
}
diff --git a/contrib/plugins/drcov.c b/contrib/plugins/drcov.c
index 2dc08512d44..5a18a8f48b4 100644
--- a/contrib/plugins/drcov.c
+++ b/contrib/plugins/drcov.c
@@ -119,7 +119,7 @@ static void vcpu_tb_exec(unsigned int cpu_index, void *udata)
g_mutex_unlock(&lock);
}
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
uint64_t pc = qemu_plugin_tb_vaddr(tb);
size_t n = qemu_plugin_tb_n_insns(tb);
@@ -156,7 +156,7 @@ int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info,
plugin_init();
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
return 0;
diff --git a/contrib/plugins/execlog.c b/contrib/plugins/execlog.c
index 8329112305c..74325495cce 100644
--- a/contrib/plugins/execlog.c
+++ b/contrib/plugins/execlog.c
@@ -177,7 +177,7 @@ static void vcpu_insn_exec(unsigned int cpu_index, void *udata)
* QEMU convert code by translation block (TB). By hooking here we can then hook
* a callback on each instruction and memory access.
*/
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
struct qemu_plugin_insn *insn;
bool skip = (imatches || amatches);
@@ -482,7 +482,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
/* Register init, translation block and exit callbacks */
qemu_plugin_register_vcpu_init_cb(id, vcpu_init, NULL);
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
return 0;
diff --git a/contrib/plugins/hotblocks.c b/contrib/plugins/hotblocks.c
index 682b160019a..ea746b513a1 100644
--- a/contrib/plugins/hotblocks.c
+++ b/contrib/plugins/hotblocks.c
@@ -121,7 +121,7 @@ static void vcpu_tb_exec(unsigned int cpu_index, void *udata)
* Otherwise a helper is inserted which calls the vcpu_tb_exec
* callback.
*/
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
ExecCount *cnt;
uint64_t pc = qemu_plugin_tb_vaddr(tb);
@@ -186,7 +186,7 @@ int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info,
plugin_init();
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
return 0;
}
diff --git a/contrib/plugins/hotpages.c b/contrib/plugins/hotpages.c
index d8321a73303..56e5698ce1d 100644
--- a/contrib/plugins/hotpages.c
+++ b/contrib/plugins/hotpages.c
@@ -148,7 +148,7 @@ static void vcpu_haddr(unsigned int cpu_index, qemu_plugin_meminfo_t meminfo,
g_mutex_unlock(&lock);
}
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
size_t n = qemu_plugin_tb_n_insns(tb);
size_t i;
@@ -197,7 +197,7 @@ int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info,
plugin_init();
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
return 0;
}
diff --git a/contrib/plugins/howvec.c b/contrib/plugins/howvec.c
index feabc10bf44..55db9ff8028 100644
--- a/contrib/plugins/howvec.c
+++ b/contrib/plugins/howvec.c
@@ -310,7 +310,7 @@ static struct qemu_plugin_scoreboard *find_counter(
return NULL;
}
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
size_t n = qemu_plugin_tb_n_insns(tb);
size_t i;
@@ -392,7 +392,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
plugin_init();
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
return 0;
}
diff --git a/contrib/plugins/hwprofile.c b/contrib/plugins/hwprofile.c
index fcc993015d7..87b0267ffe3 100644
--- a/contrib/plugins/hwprofile.c
+++ b/contrib/plugins/hwprofile.c
@@ -242,7 +242,7 @@ static void vcpu_haddr(unsigned int cpu_index, qemu_plugin_meminfo_t meminfo,
}
}
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
size_t n = qemu_plugin_tb_n_insns(tb);
size_t i;
@@ -319,7 +319,7 @@ int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info,
plugin_init();
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
return 0;
}
diff --git a/contrib/plugins/ips.c b/contrib/plugins/ips.c
index a1fcba7c5d6..6f7ac1587ec 100644
--- a/contrib/plugins/ips.c
+++ b/contrib/plugins/ips.c
@@ -110,7 +110,7 @@ static void every_quantum_insn(unsigned int cpu_index, void *udata)
update_system_time(vcpu);
}
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
size_t n_insns = qemu_plugin_tb_n_insns(tb);
qemu_plugin_u64 quantum_insn =
@@ -206,7 +206,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
time_handle = qemu_plugin_request_time_control();
g_assert(time_handle);
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
qemu_plugin_register_vcpu_init_cb(id, vcpu_init, NULL);
qemu_plugin_register_vcpu_exit_cb(id, vcpu_exit, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
diff --git a/contrib/plugins/lockstep.c b/contrib/plugins/lockstep.c
index dc527ad56e2..ed9d18460fe 100644
--- a/contrib/plugins/lockstep.c
+++ b/contrib/plugins/lockstep.c
@@ -249,7 +249,7 @@ static void vcpu_tb_exec(unsigned int cpu_index, void *udata)
log = g_slist_prepend(log, exec);
}
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
BlockInfo *bi = g_new0(BlockInfo, 1);
bi->pc = qemu_plugin_tb_vaddr(tb);
@@ -392,7 +392,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
our_id = id;
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, (void *)id);
return 0;
}
diff --git a/contrib/plugins/stoptrigger.c b/contrib/plugins/stoptrigger.c
index 222a3f92ae0..3babd014171 100644
--- a/contrib/plugins/stoptrigger.c
+++ b/contrib/plugins/stoptrigger.c
@@ -64,7 +64,7 @@ static void exit_address_reached(unsigned int cpu_index, void *udata)
exit_emulation(ei->exit_code, msg);
}
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
size_t tb_n = qemu_plugin_tb_n_insns(tb);
for (size_t i = 0; i < tb_n; i++) {
@@ -150,7 +150,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
}
/* Register translation block and exit callbacks */
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
return 0;
diff --git a/contrib/plugins/uftrace.c b/contrib/plugins/uftrace.c
index a1b10f9cf59..9b0a4963aee 100644
--- a/contrib/plugins/uftrace.c
+++ b/contrib/plugins/uftrace.c
@@ -838,7 +838,7 @@ static void track_callstack(unsigned int cpu_index, void *udata)
trace_enter_stack(t, cs, timestamp);
}
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
size_t n_insns = qemu_plugin_tb_n_insns(tb);
uintptr_t tb_pc = qemu_plugin_tb_vaddr(tb);
@@ -987,7 +987,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
score = qemu_plugin_scoreboard_new(sizeof(Cpu));
qemu_plugin_register_vcpu_init_cb(id, vcpu_init, NULL);
qemu_plugin_register_atexit_cb(id, at_exit, (void *) info->system_emulation);
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
return 0;
}
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 8242e054054..53daa09fc72 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -418,13 +418,16 @@ enum qemu_plugin_cond {
/**
* typedef qemu_plugin_vcpu_tb_trans_cb_t - translation callback
* @tb: opaque handle used for querying and instrumenting a block.
+ * @userdata: any plugin data to pass to the @cb
*/
-typedef void (*qemu_plugin_vcpu_tb_trans_cb_t)(struct qemu_plugin_tb *tb);
+typedef void (*qemu_plugin_vcpu_tb_trans_cb_t)(struct qemu_plugin_tb *tb,
+ void *userdata);
/**
* qemu_plugin_register_vcpu_tb_trans_cb() - register a translate cb
* @id: plugin ID
* @cb: callback function
+ * @userdata: any plugin data to pass to the @cb
*
* The @cb function is called every time a translation occurs. The @cb
* function is passed an opaque qemu_plugin_type which it can query
@@ -435,7 +438,8 @@ typedef void (*qemu_plugin_vcpu_tb_trans_cb_t)(struct qemu_plugin_tb *tb);
*/
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_tb_trans_cb(qemu_plugin_id_t id,
- qemu_plugin_vcpu_tb_trans_cb_t cb);
+ qemu_plugin_vcpu_tb_trans_cb_t cb,
+ void *userdata);
/**
* qemu_plugin_register_vcpu_tb_exec_cb() - register execution callback
diff --git a/plugins/api.c b/plugins/api.c
index 849790fe13b..774b1b80214 100644
--- a/plugins/api.c
+++ b/plugins/api.c
@@ -195,9 +195,10 @@ void qemu_plugin_register_vcpu_mem_inline_per_vcpu(
}
void qemu_plugin_register_vcpu_tb_trans_cb(qemu_plugin_id_t id,
- qemu_plugin_vcpu_tb_trans_cb_t cb)
+ qemu_plugin_vcpu_tb_trans_cb_t cb,
+ void *userdata)
{
- plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_TB_TRANS, cb);
+ plugin_register_cb_udata(id, QEMU_PLUGIN_EV_VCPU_TB_TRANS, cb, userdata);
}
void qemu_plugin_register_vcpu_syscall_cb(qemu_plugin_id_t id,
diff --git a/plugins/core.c b/plugins/core.c
index 0ae0dc49aec..f30009d50dd 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -488,7 +488,7 @@ void qemu_plugin_tb_trans_cb(CPUState *cpu, struct qemu_plugin_tb *tb)
qemu_plugin_vcpu_tb_trans_cb_t func = cb->f.vcpu_tb_trans;
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_RW_REGS);
- func(tb);
+ func(tb, cb->udata);
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_NO_REGS);
}
}
diff --git a/tests/tcg/plugins/bb.c b/tests/tcg/plugins/bb.c
index 713063f4945..90adb3ebd97 100644
--- a/tests/tcg/plugins/bb.c
+++ b/tests/tcg/plugins/bb.c
@@ -77,7 +77,7 @@ static void vcpu_tb_exec(unsigned int cpu_index, void *udata)
count->bb_count++;
}
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
size_t n_insns = qemu_plugin_tb_n_insns(tb);
@@ -127,7 +127,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
qemu_plugin_register_vcpu_idle_cb(id, vcpu_idle, NULL);
}
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
return 0;
}
diff --git a/tests/tcg/plugins/discons.c b/tests/tcg/plugins/discons.c
index d2a163a5714..45f24397047 100644
--- a/tests/tcg/plugins/discons.c
+++ b/tests/tcg/plugins/discons.c
@@ -147,7 +147,7 @@ static void insn_exec(unsigned int vcpu_index, void *userdata)
}
}
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
size_t n_insns = qemu_plugin_tb_n_insns(tb);
for (size_t i = 0; i < n_insns; i++) {
@@ -215,7 +215,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
qemu_plugin_register_vcpu_discon_cb(id, QEMU_PLUGIN_DISCON_ALL,
vcpu_discon, NULL);
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
return 0;
}
diff --git a/tests/tcg/plugins/empty.c b/tests/tcg/plugins/empty.c
index 5927507c18e..286b3035e61 100644
--- a/tests/tcg/plugins/empty.c
+++ b/tests/tcg/plugins/empty.c
@@ -20,13 +20,13 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
* This allows us to measure the overhead of injecting and then
* removing empty instrumentation.
*/
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{ }
QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
const qemu_info_t *info,
int argc, char **argv)
{
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
return 0;
}
diff --git a/tests/tcg/plugins/inline.c b/tests/tcg/plugins/inline.c
index 3f5c49f5ede..436223db0e6 100644
--- a/tests/tcg/plugins/inline.c
+++ b/tests/tcg/plugins/inline.c
@@ -223,7 +223,7 @@ static void vcpu_mem_access(unsigned int cpu_index,
g_mutex_unlock(&mem_lock);
}
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
void *tb_store = tb;
qemu_plugin_register_vcpu_tb_exec_inline_per_vcpu(
@@ -303,7 +303,7 @@ int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info,
data_tb = qemu_plugin_scoreboard_u64_in_struct(data, CPUData, data_tb);
data_mem = qemu_plugin_scoreboard_u64_in_struct(data, CPUData, data_mem);
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
return 0;
diff --git a/tests/tcg/plugins/insn.c b/tests/tcg/plugins/insn.c
index a303275ea1b..4ab30d6df8c 100644
--- a/tests/tcg/plugins/insn.c
+++ b/tests/tcg/plugins/insn.c
@@ -138,7 +138,7 @@ static void vcpu_insn_matched_exec_before(unsigned int cpu_index, void *udata)
}
}
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
size_t n = qemu_plugin_tb_n_insns(tb);
size_t i;
@@ -297,7 +297,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
/* Register init, translation block and exit callbacks */
qemu_plugin_register_vcpu_init_cb(id, vcpu_init, NULL);
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
return 0;
}
diff --git a/tests/tcg/plugins/mem.c b/tests/tcg/plugins/mem.c
index 24a3bce0bfd..e56d10574bd 100644
--- a/tests/tcg/plugins/mem.c
+++ b/tests/tcg/plugins/mem.c
@@ -266,7 +266,7 @@ static void print_access(unsigned int cpu_index, qemu_plugin_meminfo_t meminfo,
qemu_plugin_outs(out->str);
}
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
size_t n = qemu_plugin_tb_n_insns(tb);
size_t i;
@@ -374,7 +374,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
mem_count = qemu_plugin_scoreboard_u64_in_struct(
counts, CPUCount, mem_count);
io_count = qemu_plugin_scoreboard_u64_in_struct(counts, CPUCount, io_count);
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
return 0;
}
diff --git a/tests/tcg/plugins/patch.c b/tests/tcg/plugins/patch.c
index 8fcf0bd409b..59215f8546e 100644
--- a/tests/tcg/plugins/patch.c
+++ b/tests/tcg/plugins/patch.c
@@ -130,7 +130,7 @@ static void patch_vaddr(unsigned int vcpu_index, void *userdata)
/*
* Callback on translation of a translation block.
*/
-static void vcpu_tb_trans_cb(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans_cb(struct qemu_plugin_tb *tb, void *userdata)
{
g_autoptr(GByteArray) insn_data = g_byte_array_new();
uintptr_t addr = 0;
@@ -245,7 +245,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
return -1;
}
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans_cb);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans_cb, NULL);
return 0;
}
diff --git a/tests/tcg/plugins/reset.c b/tests/tcg/plugins/reset.c
index 1fdf114e5e0..949f2d6160a 100644
--- a/tests/tcg/plugins/reset.c
+++ b/tests/tcg/plugins/reset.c
@@ -27,7 +27,7 @@ static void tb_exec_after_reset(unsigned int vcpu_index, void *userdata)
qemu_plugin_uninstall(plugin_id, after_uninstall, NULL);
}
-static void tb_trans_after_reset(struct qemu_plugin_tb *tb)
+static void tb_trans_after_reset(struct qemu_plugin_tb *tb, void *userdata)
{
g_assert(was_reset && !was_uninstalled);
qemu_plugin_register_vcpu_tb_exec_cb(tb, tb_exec_after_reset,
@@ -40,7 +40,7 @@ static void after_reset(void *userdata)
g_assert(!was_reset && !was_uninstalled);
qemu_plugin_outs("reset done\n");
was_reset = true;
- qemu_plugin_register_vcpu_tb_trans_cb(id, tb_trans_after_reset);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, tb_trans_after_reset, NULL);
}
static void tb_exec_before_reset(unsigned int vcpu_index, void *userdata)
@@ -49,7 +49,7 @@ static void tb_exec_before_reset(unsigned int vcpu_index, void *userdata)
qemu_plugin_reset(plugin_id, after_reset, (void *) plugin_id);
}
-static void tb_trans_before_reset(struct qemu_plugin_tb *tb)
+static void tb_trans_before_reset(struct qemu_plugin_tb *tb, void *userdata)
{
g_assert(!was_reset && !was_uninstalled);
qemu_plugin_register_vcpu_tb_exec_cb(tb, tb_exec_before_reset,
@@ -61,7 +61,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
int argc, char **argv)
{
plugin_id = id;
- qemu_plugin_register_vcpu_tb_trans_cb(id, tb_trans_before_reset);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, tb_trans_before_reset, NULL);
return 0;
}
diff --git a/tests/tcg/plugins/setpc.c b/tests/tcg/plugins/setpc.c
index 44cea064783..595571cdfd9 100644
--- a/tests/tcg/plugins/setpc.c
+++ b/tests/tcg/plugins/setpc.c
@@ -73,7 +73,7 @@ static void vcpu_mem_access(unsigned int vcpu_index,
}
}
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb)
+static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
{
size_t insns = qemu_plugin_tb_n_insns(tb);
for (size_t i = 0; i < insns; i++) {
@@ -100,6 +100,6 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
{
qemu_plugin_register_vcpu_syscall_filter_cb(id, vcpu_syscall_filter);
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
+ qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
return 0;
}
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 17/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_cb_t
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (15 preceding siblings ...)
2026-06-16 18:42 ` [PULL 16/26] plugins: add userdata to qemu_plugin_vcpu_tb_trans_cb_t Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 18/26] plugins: add userdata to qemu_plugin_register_vcpu_syscall_cb Pierrick Bouvier
` (9 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-18-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
include/plugins/qemu-plugin.h | 3 +--
plugins/core.c | 2 +-
tests/tcg/plugins/syscall.c | 2 +-
3 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 53daa09fc72..d82d996bce6 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -830,7 +830,6 @@ void qemu_plugin_update_ns(const void *handle, int64_t time);
/**
* typedef qemu_plugin_vcpu_syscall_cb_t - vCPU syscall callback function type
- * @id: plugin id
* @vcpu_index: the executing vCPU
* @num: the syscall number
* @a1: the 1st syscall argument
@@ -843,7 +842,7 @@ void qemu_plugin_update_ns(const void *handle, int64_t time);
* @a8: the 8th syscall argument
*/
typedef void
-(*qemu_plugin_vcpu_syscall_cb_t)(qemu_plugin_id_t id, unsigned int vcpu_index,
+(*qemu_plugin_vcpu_syscall_cb_t)(unsigned int vcpu_index,
int64_t num, uint64_t a1, uint64_t a2,
uint64_t a3, uint64_t a4, uint64_t a5,
uint64_t a6, uint64_t a7, uint64_t a8);
diff --git a/plugins/core.c b/plugins/core.c
index f30009d50dd..c272f47b642 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -534,7 +534,7 @@ qemu_plugin_vcpu_syscall(CPUState *cpu, int64_t num, uint64_t a1, uint64_t a2,
qemu_plugin_vcpu_syscall_cb_t func = cb->f.vcpu_syscall;
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_RW_REGS_PC);
- func(cb->ctx->id, cpu->cpu_index, num, a1, a2, a3, a4, a5, a6, a7, a8);
+ func(cpu->cpu_index, num, a1, a2, a3, a4, a5, a6, a7, a8);
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_NO_REGS);
}
}
diff --git a/tests/tcg/plugins/syscall.c b/tests/tcg/plugins/syscall.c
index 938646f9359..bfe12ad5558 100644
--- a/tests/tcg/plugins/syscall.c
+++ b/tests/tcg/plugins/syscall.c
@@ -125,7 +125,7 @@ static void hexdump(const GByteArray *data)
qemu_plugin_outs(out->str);
}
-static void vcpu_syscall(qemu_plugin_id_t id, unsigned int vcpu_index,
+static void vcpu_syscall(unsigned int vcpu_index,
int64_t num, uint64_t a1, uint64_t a2,
uint64_t a3, uint64_t a4, uint64_t a5,
uint64_t a6, uint64_t a7, uint64_t a8)
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 18/26] plugins: add userdata to qemu_plugin_register_vcpu_syscall_cb
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (16 preceding siblings ...)
2026-06-16 18:42 ` [PULL 17/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_cb_t Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 19/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_filter_cb_t Pierrick Bouvier
` (8 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-19-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
include/plugins/qemu-plugin.h | 8 ++++++--
plugins/api.c | 5 +++--
plugins/core.c | 2 +-
tests/tcg/plugins/syscall.c | 5 +++--
4 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index d82d996bce6..909f19b7128 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -840,12 +840,14 @@ void qemu_plugin_update_ns(const void *handle, int64_t time);
* @a6: the 6th syscall argument
* @a7: the 7th syscall argument
* @a8: the 8th syscall argument
+ * @userdata: user data for callback
*/
typedef void
(*qemu_plugin_vcpu_syscall_cb_t)(unsigned int vcpu_index,
int64_t num, uint64_t a1, uint64_t a2,
uint64_t a3, uint64_t a4, uint64_t a5,
- uint64_t a6, uint64_t a7, uint64_t a8);
+ uint64_t a6, uint64_t a7, uint64_t a8,
+ void *userdata);
/**
* typedef qemu_plugin_vcpu_syscall_filter_cb_t - vCPU syscall filter callback
@@ -891,13 +893,15 @@ typedef void
* qemu_plugin_register_vcpu_syscall_cb() - register a syscall entry callback
* @id: plugin id
* @cb: callback of type qemu_plugin_vcpu_syscall_cb_t
+ * @userdata: user data for callback
*
* This registers a callback for every syscall executed by the guest. The @cb
* function is executed before a syscall is handled by the host.
*/
QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_syscall_cb(qemu_plugin_id_t id,
- qemu_plugin_vcpu_syscall_cb_t cb);
+ qemu_plugin_vcpu_syscall_cb_t cb,
+ void *userdata);
/**
* qemu_plugin_register_vcpu_syscall_filter_cb() - register a syscall filter
diff --git a/plugins/api.c b/plugins/api.c
index 774b1b80214..a72cec541dc 100644
--- a/plugins/api.c
+++ b/plugins/api.c
@@ -202,9 +202,10 @@ void qemu_plugin_register_vcpu_tb_trans_cb(qemu_plugin_id_t id,
}
void qemu_plugin_register_vcpu_syscall_cb(qemu_plugin_id_t id,
- qemu_plugin_vcpu_syscall_cb_t cb)
+ qemu_plugin_vcpu_syscall_cb_t cb,
+ void *userdata)
{
- plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_SYSCALL, cb);
+ plugin_register_cb_udata(id, QEMU_PLUGIN_EV_VCPU_SYSCALL, cb, userdata);
}
void
diff --git a/plugins/core.c b/plugins/core.c
index c272f47b642..7e2f25a9548 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -534,7 +534,7 @@ qemu_plugin_vcpu_syscall(CPUState *cpu, int64_t num, uint64_t a1, uint64_t a2,
qemu_plugin_vcpu_syscall_cb_t func = cb->f.vcpu_syscall;
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_RW_REGS_PC);
- func(cpu->cpu_index, num, a1, a2, a3, a4, a5, a6, a7, a8);
+ func(cpu->cpu_index, num, a1, a2, a3, a4, a5, a6, a7, a8, cb->udata);
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_NO_REGS);
}
}
diff --git a/tests/tcg/plugins/syscall.c b/tests/tcg/plugins/syscall.c
index bfe12ad5558..8a823acfca7 100644
--- a/tests/tcg/plugins/syscall.c
+++ b/tests/tcg/plugins/syscall.c
@@ -128,7 +128,8 @@ static void hexdump(const GByteArray *data)
static void vcpu_syscall(unsigned int vcpu_index,
int64_t num, uint64_t a1, uint64_t a2,
uint64_t a3, uint64_t a4, uint64_t a5,
- uint64_t a6, uint64_t a7, uint64_t a8)
+ uint64_t a6, uint64_t a7, uint64_t a8,
+ void *userdata)
{
if (statistics) {
SyscallStats *entry;
@@ -271,7 +272,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
memory_buffer = g_byte_array_new();
}
- qemu_plugin_register_vcpu_syscall_cb(id, vcpu_syscall);
+ qemu_plugin_register_vcpu_syscall_cb(id, vcpu_syscall, NULL);
qemu_plugin_register_vcpu_syscall_ret_cb(id, vcpu_syscall_ret);
qemu_plugin_register_vcpu_syscall_filter_cb(id, vcpu_syscall_filter);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 19/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_filter_cb_t
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (17 preceding siblings ...)
2026-06-16 18:42 ` [PULL 18/26] plugins: add userdata to qemu_plugin_register_vcpu_syscall_cb Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 20/26] plugins: add userdata to qemu_plugin_register_vcpu_syscall_filter_cb Pierrick Bouvier
` (7 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-20-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
include/plugins/qemu-plugin.h | 4 +---
plugins/core.c | 2 +-
tests/tcg/plugins/setpc.c | 2 +-
tests/tcg/plugins/syscall.c | 2 +-
4 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 909f19b7128..c38ae7db1b3 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -852,7 +852,6 @@ typedef void
/**
* typedef qemu_plugin_vcpu_syscall_filter_cb_t - vCPU syscall filter callback
* function type
- * @id: plugin id
* @vcpu_index: the executing vCPU
* @num: the syscall number
* @a1: the 1st syscall argument
@@ -869,8 +868,7 @@ typedef void
* handled further), otherwise returns false.
*/
typedef bool
-(*qemu_plugin_vcpu_syscall_filter_cb_t)(qemu_plugin_id_t id,
- unsigned int vcpu_index,
+(*qemu_plugin_vcpu_syscall_filter_cb_t)(unsigned int vcpu_index,
int64_t num, uint64_t a1, uint64_t a2,
uint64_t a3, uint64_t a4, uint64_t a5,
uint64_t a6, uint64_t a7, uint64_t a8,
diff --git a/plugins/core.c b/plugins/core.c
index 7e2f25a9548..223a30cb944 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -590,7 +590,7 @@ qemu_plugin_vcpu_syscall_filter(CPUState *cpu, int64_t num, uint64_t a1,
QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
qemu_plugin_vcpu_syscall_filter_cb_t func = cb->f.vcpu_syscall_filter;
- if (func(cb->ctx->id, cpu->cpu_index, num, a1, a2, a3, a4,
+ if (func(cpu->cpu_index, num, a1, a2, a3, a4,
a5, a6, a7, a8, sysret)) {
filtered = true;
break;
diff --git a/tests/tcg/plugins/setpc.c b/tests/tcg/plugins/setpc.c
index 595571cdfd9..9bb5bf0f5f7 100644
--- a/tests/tcg/plugins/setpc.c
+++ b/tests/tcg/plugins/setpc.c
@@ -23,7 +23,7 @@ static uint64_t source_pc;
static uint64_t target_pc;
static uint64_t target_vaddr;
-static bool vcpu_syscall_filter(qemu_plugin_id_t id, unsigned int vcpu_index,
+static bool vcpu_syscall_filter(unsigned int vcpu_index,
int64_t num, uint64_t a1, uint64_t a2,
uint64_t a3, uint64_t a4, uint64_t a5,
uint64_t a6, uint64_t a7, uint64_t a8,
diff --git a/tests/tcg/plugins/syscall.c b/tests/tcg/plugins/syscall.c
index 8a823acfca7..2afd71895e3 100644
--- a/tests/tcg/plugins/syscall.c
+++ b/tests/tcg/plugins/syscall.c
@@ -171,7 +171,7 @@ static void vcpu_syscall_ret(qemu_plugin_id_t id, unsigned int vcpu_idx,
}
}
-static bool vcpu_syscall_filter(qemu_plugin_id_t id, unsigned int vcpu_index,
+static bool vcpu_syscall_filter(unsigned int vcpu_index,
int64_t num, uint64_t a1, uint64_t a2,
uint64_t a3, uint64_t a4, uint64_t a5,
uint64_t a6, uint64_t a7, uint64_t a8,
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 20/26] plugins: add userdata to qemu_plugin_register_vcpu_syscall_filter_cb
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (18 preceding siblings ...)
2026-06-16 18:42 ` [PULL 19/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_filter_cb_t Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 21/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_ret_cb_t Pierrick Bouvier
` (6 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-21-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
include/plugins/qemu-plugin.h | 8 ++++++--
plugins/api.c | 5 +++--
plugins/core.c | 2 +-
tests/tcg/plugins/setpc.c | 4 ++--
tests/tcg/plugins/syscall.c | 4 ++--
5 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index c38ae7db1b3..33d6f8e0b7d 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -863,6 +863,7 @@ typedef void
* @a7: the 7th syscall argument
* @a8: the 8th syscall argument
* @sysret: reference of the syscall return value, must set this if filtered
+ * @userdata: user data for callback
*
* Returns true if you want to filter this syscall (i.e. stop it being
* handled further), otherwise returns false.
@@ -872,7 +873,8 @@ typedef bool
int64_t num, uint64_t a1, uint64_t a2,
uint64_t a3, uint64_t a4, uint64_t a5,
uint64_t a6, uint64_t a7, uint64_t a8,
- uint64_t *sysret);
+ uint64_t *sysret,
+ void *userdata);
/**
* typedef qemu_plugin_vcpu_syscall_ret_cb_t - vCPU syscall return callback
@@ -906,6 +908,7 @@ void qemu_plugin_register_vcpu_syscall_cb(qemu_plugin_id_t id,
* callback
* @id: plugin id
* @cb: callback of type qemu_plugin_vcpu_syscall_filter_cb_t
+ * @userdata: user data for callback
*
* This registers a callback for every syscall executed by the guest. The @cb
* function is executed before a syscall is handled by the host. If the
@@ -916,7 +919,8 @@ void qemu_plugin_register_vcpu_syscall_cb(qemu_plugin_id_t id,
QEMU_PLUGIN_API
void
qemu_plugin_register_vcpu_syscall_filter_cb(qemu_plugin_id_t id,
- qemu_plugin_vcpu_syscall_filter_cb_t cb);
+ qemu_plugin_vcpu_syscall_filter_cb_t cb,
+ void *userdata);
/**
* qemu_plugin_register_vcpu_syscall_ret_cb() - register a syscall entry
diff --git a/plugins/api.c b/plugins/api.c
index a72cec541dc..f2176be5304 100644
--- a/plugins/api.c
+++ b/plugins/api.c
@@ -217,9 +217,10 @@ qemu_plugin_register_vcpu_syscall_ret_cb(qemu_plugin_id_t id,
void
qemu_plugin_register_vcpu_syscall_filter_cb(qemu_plugin_id_t id,
- qemu_plugin_vcpu_syscall_filter_cb_t cb)
+ qemu_plugin_vcpu_syscall_filter_cb_t cb,
+ void *userdata)
{
- plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_SYSCALL_FILTER, cb);
+ plugin_register_cb_udata(id, QEMU_PLUGIN_EV_VCPU_SYSCALL_FILTER, cb, userdata);
}
/*
diff --git a/plugins/core.c b/plugins/core.c
index 223a30cb944..49fe1b582b5 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -591,7 +591,7 @@ qemu_plugin_vcpu_syscall_filter(CPUState *cpu, int64_t num, uint64_t a1,
qemu_plugin_vcpu_syscall_filter_cb_t func = cb->f.vcpu_syscall_filter;
if (func(cpu->cpu_index, num, a1, a2, a3, a4,
- a5, a6, a7, a8, sysret)) {
+ a5, a6, a7, a8, sysret, cb->udata)) {
filtered = true;
break;
}
diff --git a/tests/tcg/plugins/setpc.c b/tests/tcg/plugins/setpc.c
index 9bb5bf0f5f7..7c78f182f01 100644
--- a/tests/tcg/plugins/setpc.c
+++ b/tests/tcg/plugins/setpc.c
@@ -27,7 +27,7 @@ static bool vcpu_syscall_filter(unsigned int vcpu_index,
int64_t num, uint64_t a1, uint64_t a2,
uint64_t a3, uint64_t a4, uint64_t a5,
uint64_t a6, uint64_t a7, uint64_t a8,
- uint64_t *sysret)
+ uint64_t *sysret, void *userdata)
{
if (num == MAGIC_SYSCALL) {
if (a1 == SETPC) {
@@ -99,7 +99,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
int argc, char **argv)
{
- qemu_plugin_register_vcpu_syscall_filter_cb(id, vcpu_syscall_filter);
+ qemu_plugin_register_vcpu_syscall_filter_cb(id, vcpu_syscall_filter, NULL);
qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
return 0;
}
diff --git a/tests/tcg/plugins/syscall.c b/tests/tcg/plugins/syscall.c
index 2afd71895e3..410fe617804 100644
--- a/tests/tcg/plugins/syscall.c
+++ b/tests/tcg/plugins/syscall.c
@@ -175,7 +175,7 @@ static bool vcpu_syscall_filter(unsigned int vcpu_index,
int64_t num, uint64_t a1, uint64_t a2,
uint64_t a3, uint64_t a4, uint64_t a5,
uint64_t a6, uint64_t a7, uint64_t a8,
- uint64_t *sysret)
+ uint64_t *sysret, void *userdata)
{
/* Special syscall to test the filter functionality. */
if (num == 4096 && a1 == 0x66CCFF) {
@@ -274,7 +274,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
qemu_plugin_register_vcpu_syscall_cb(id, vcpu_syscall, NULL);
qemu_plugin_register_vcpu_syscall_ret_cb(id, vcpu_syscall_ret);
- qemu_plugin_register_vcpu_syscall_filter_cb(id, vcpu_syscall_filter);
+ qemu_plugin_register_vcpu_syscall_filter_cb(id, vcpu_syscall_filter, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
return 0;
}
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 21/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_ret_cb_t
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (19 preceding siblings ...)
2026-06-16 18:42 ` [PULL 20/26] plugins: add userdata to qemu_plugin_register_vcpu_syscall_filter_cb Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 22/26] plugins: add userdata to qemu_plugin_register_vcpu_syscall_ret_cb Pierrick Bouvier
` (5 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-22-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
include/plugins/qemu-plugin.h | 4 +---
plugins/core.c | 2 +-
tests/tcg/plugins/syscall.c | 2 +-
3 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 33d6f8e0b7d..4f0c73c7b33 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -879,14 +879,12 @@ typedef bool
/**
* typedef qemu_plugin_vcpu_syscall_ret_cb_t - vCPU syscall return callback
* function type
- * @id: plugin id
* @vcpu_index: the executing vCPU
* @num: the syscall number
* @ret: the syscall return value
*/
typedef void
-(*qemu_plugin_vcpu_syscall_ret_cb_t)(qemu_plugin_id_t id,
- unsigned int vcpu_index,
+(*qemu_plugin_vcpu_syscall_ret_cb_t)(unsigned int vcpu_index,
int64_t num, int64_t ret);
/**
diff --git a/plugins/core.c b/plugins/core.c
index 49fe1b582b5..0a18910f873 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -558,7 +558,7 @@ void qemu_plugin_vcpu_syscall_ret(CPUState *cpu, int64_t num, int64_t ret)
qemu_plugin_vcpu_syscall_ret_cb_t func = cb->f.vcpu_syscall_ret;
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_RW_REGS_PC);
- func(cb->ctx->id, cpu->cpu_index, num, ret);
+ func(cpu->cpu_index, num, ret);
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_NO_REGS);
}
}
diff --git a/tests/tcg/plugins/syscall.c b/tests/tcg/plugins/syscall.c
index 410fe617804..1bc737824ce 100644
--- a/tests/tcg/plugins/syscall.c
+++ b/tests/tcg/plugins/syscall.c
@@ -151,7 +151,7 @@ static void vcpu_syscall(unsigned int vcpu_index,
}
}
-static void vcpu_syscall_ret(qemu_plugin_id_t id, unsigned int vcpu_idx,
+static void vcpu_syscall_ret(unsigned int vcpu_idx,
int64_t num, int64_t ret)
{
if (statistics) {
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 22/26] plugins: add userdata to qemu_plugin_register_vcpu_syscall_ret_cb
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (20 preceding siblings ...)
2026-06-16 18:42 ` [PULL 21/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_ret_cb_t Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 23/26] plugins: use consistent parameter documentation for userdata Pierrick Bouvier
` (4 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-23-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
include/plugins/qemu-plugin.h | 8 ++++++--
plugins/api.c | 5 +++--
plugins/core.c | 2 +-
tests/tcg/plugins/syscall.c | 5 +++--
4 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 4f0c73c7b33..50a39e51d46 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -882,10 +882,12 @@ typedef bool
* @vcpu_index: the executing vCPU
* @num: the syscall number
* @ret: the syscall return value
+ * @userdata: user data for callback
*/
typedef void
(*qemu_plugin_vcpu_syscall_ret_cb_t)(unsigned int vcpu_index,
- int64_t num, int64_t ret);
+ int64_t num, int64_t ret,
+ void *userdata);
/**
* qemu_plugin_register_vcpu_syscall_cb() - register a syscall entry callback
@@ -925,6 +927,7 @@ qemu_plugin_register_vcpu_syscall_filter_cb(qemu_plugin_id_t id,
* callback
* @id: plugin id
* @cb: callback of type qemu_plugin_vcpu_syscall_ret_cb_t
+ * @userdata: user data for callback
*
* This registers a callback for every syscall executed by the guest. The @cb
* function is executed upon return from the host syscall before execution is
@@ -933,7 +936,8 @@ qemu_plugin_register_vcpu_syscall_filter_cb(qemu_plugin_id_t id,
QEMU_PLUGIN_API
void
qemu_plugin_register_vcpu_syscall_ret_cb(qemu_plugin_id_t id,
- qemu_plugin_vcpu_syscall_ret_cb_t cb);
+ qemu_plugin_vcpu_syscall_ret_cb_t cb,
+ void *userdata);
/**
* qemu_plugin_insn_disas() - return disassembly string for instruction
diff --git a/plugins/api.c b/plugins/api.c
index f2176be5304..0038da6d706 100644
--- a/plugins/api.c
+++ b/plugins/api.c
@@ -210,9 +210,10 @@ void qemu_plugin_register_vcpu_syscall_cb(qemu_plugin_id_t id,
void
qemu_plugin_register_vcpu_syscall_ret_cb(qemu_plugin_id_t id,
- qemu_plugin_vcpu_syscall_ret_cb_t cb)
+ qemu_plugin_vcpu_syscall_ret_cb_t cb,
+ void *userdata)
{
- plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_SYSCALL_RET, cb);
+ plugin_register_cb_udata(id, QEMU_PLUGIN_EV_VCPU_SYSCALL_RET, cb, userdata);
}
void
diff --git a/plugins/core.c b/plugins/core.c
index 0a18910f873..4b55aacd2d7 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -558,7 +558,7 @@ void qemu_plugin_vcpu_syscall_ret(CPUState *cpu, int64_t num, int64_t ret)
qemu_plugin_vcpu_syscall_ret_cb_t func = cb->f.vcpu_syscall_ret;
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_RW_REGS_PC);
- func(cpu->cpu_index, num, ret);
+ func(cpu->cpu_index, num, ret, cb->udata);
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_NO_REGS);
}
}
diff --git a/tests/tcg/plugins/syscall.c b/tests/tcg/plugins/syscall.c
index 1bc737824ce..a28d1087840 100644
--- a/tests/tcg/plugins/syscall.c
+++ b/tests/tcg/plugins/syscall.c
@@ -152,7 +152,8 @@ static void vcpu_syscall(unsigned int vcpu_index,
}
static void vcpu_syscall_ret(unsigned int vcpu_idx,
- int64_t num, int64_t ret)
+ int64_t num, int64_t ret,
+ void *userdata)
{
if (statistics) {
SyscallStats *entry;
@@ -273,7 +274,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
}
qemu_plugin_register_vcpu_syscall_cb(id, vcpu_syscall, NULL);
- qemu_plugin_register_vcpu_syscall_ret_cb(id, vcpu_syscall_ret);
+ qemu_plugin_register_vcpu_syscall_ret_cb(id, vcpu_syscall_ret, NULL);
qemu_plugin_register_vcpu_syscall_filter_cb(id, vcpu_syscall_filter, NULL);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
return 0;
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 23/26] plugins: use consistent parameter documentation for userdata
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (21 preceding siblings ...)
2026-06-16 18:42 ` [PULL 22/26] plugins: add userdata to qemu_plugin_register_vcpu_syscall_ret_cb Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 24/26] scripts/checkpatch: ignore spaces required around some operators in C++ Pierrick Bouvier
` (3 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-24-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
include/plugins/qemu-plugin.h | 36 +++++++++++++++++------------------
1 file changed, 17 insertions(+), 19 deletions(-)
diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 50a39e51d46..d8d4b373842 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -142,16 +142,14 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
/**
* typedef qemu_plugin_udata_cb_t - callback with user data
- * @userdata: a pointer to some user data supplied when the callback
- * was registered.
+ * @userdata: user data for callback
*/
typedef void (*qemu_plugin_udata_cb_t)(void *userdata);
/**
* typedef qemu_plugin_vcpu_udata_cb_t - vcpu callback
* @vcpu_index: the current vcpu context
- * @userdata: a pointer to some user data supplied when the callback
- * was registered.
+ * @userdata: user data for callback
*/
typedef void (*qemu_plugin_vcpu_udata_cb_t)(unsigned int vcpu_index,
void *userdata);
@@ -185,7 +183,7 @@ enum qemu_plugin_discon_type {
* @from_pc: the source of the discontinuity, e.g. the PC before the
* transition
* @to_pc: the PC pointing to the next instruction to be executed
- * @userdata: any plugin data to pass to the @cb
+ * @userdata: user data for callback
*
* The exact semantics of @from_pc depends on the @type of discontinuity. For
* interrupts, @from_pc will point to the next instruction which would have
@@ -204,7 +202,7 @@ typedef void (*qemu_plugin_vcpu_discon_cb_t)(unsigned int vcpu_index,
* qemu_plugin_uninstall() - Uninstall a plugin
* @id: this plugin's opaque ID
* @cb: callback to be called once the plugin has been removed
- * @userdata: any plugin data to pass to the @cb
+ * @userdata: user data for callback
*
* Do NOT assume that the plugin has been uninstalled once this function
* returns. Plugins are uninstalled asynchronously, and therefore the given
@@ -220,7 +218,7 @@ void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_plugin_udata_cb_t cb,
* qemu_plugin_reset() - Reset a plugin
* @id: this plugin's opaque ID
* @cb: callback to be called once the plugin has been reset
- * @userdata: any plugin data to pass to the @cb
+ * @userdata: user data for callback
*
* Unregisters all callbacks for the plugin given by @id.
*
@@ -236,7 +234,7 @@ void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_udata_cb_t cb,
* qemu_plugin_register_vcpu_init_cb() - register a vCPU initialization callback
* @id: plugin ID
* @cb: callback function
- * @userdata: any plugin data to pass to the @cb
+ * @userdata: user data for callback
*
* The @cb function is called every time a vCPU is initialized.
*
@@ -251,7 +249,7 @@ void qemu_plugin_register_vcpu_init_cb(qemu_plugin_id_t id,
* qemu_plugin_register_vcpu_exit_cb() - register a vCPU exit callback
* @id: plugin ID
* @cb: callback function
- * @userdata: any plugin data to pass to the @cb
+ * @userdata: user data for callback
*
* The @cb function is called every time a vCPU exits.
*
@@ -266,7 +264,7 @@ void qemu_plugin_register_vcpu_exit_cb(qemu_plugin_id_t id,
* qemu_plugin_register_vcpu_idle_cb() - register a vCPU idle callback
* @id: plugin ID
* @cb: callback function
- * @userdata: any plugin data to pass to the @cb
+ * @userdata: user data for callback
*
* The @cb function is called every time a vCPU idles.
*/
@@ -279,7 +277,7 @@ void qemu_plugin_register_vcpu_idle_cb(qemu_plugin_id_t id,
* qemu_plugin_register_vcpu_resume_cb() - register a vCPU resume callback
* @id: plugin ID
* @cb: callback function
- * @userdata: any plugin data to pass to the @cb
+ * @userdata: user data for callback
*
* The @cb function is called every time a vCPU resumes execution.
*/
@@ -293,7 +291,7 @@ void qemu_plugin_register_vcpu_resume_cb(qemu_plugin_id_t id,
* @id: plugin ID
* @type: types of discontinuities for which to call the callback
* @cb: callback function
- * @userdata: any plugin data to pass to the @cb
+ * @userdata: user data for callback
*
* The @cb function is called every time a vCPU receives a discontinuity event
* of the specified type(s), after the vCPU was prepared to handle the event.
@@ -427,7 +425,7 @@ typedef void (*qemu_plugin_vcpu_tb_trans_cb_t)(struct qemu_plugin_tb *tb,
* qemu_plugin_register_vcpu_tb_trans_cb() - register a translate cb
* @id: plugin ID
* @cb: callback function
- * @userdata: any plugin data to pass to the @cb
+ * @userdata: user data for callback
*
* The @cb function is called every time a translation occurs. The @cb
* function is passed an opaque qemu_plugin_type which it can query
@@ -446,7 +444,7 @@ void qemu_plugin_register_vcpu_tb_trans_cb(qemu_plugin_id_t id,
* @tb: the opaque qemu_plugin_tb handle for the translation
* @cb: callback function
* @flags: does the plugin read or write the CPU's registers?
- * @userdata: any plugin data to pass to the @cb?
+ * @userdata: user data for callback
*
* The @cb function is called every time a translated unit executes.
*/
@@ -464,7 +462,7 @@ void qemu_plugin_register_vcpu_tb_exec_cb(struct qemu_plugin_tb *tb,
* @entry: first operand for condition
* @imm: second operand for condition
* @flags: does the plugin read or write the CPU's registers?
- * @userdata: any plugin data to pass to the @cb?
+ * @userdata: user data for callback
*
* The @cb function is called when a translated unit executes if
* entry @cond imm is true.
@@ -514,7 +512,7 @@ void qemu_plugin_register_vcpu_tb_exec_inline_per_vcpu(
* @insn: the opaque qemu_plugin_insn handle for an instruction
* @cb: callback function
* @flags: does the plugin read or write the CPU's registers?
- * @userdata: any plugin data to pass to the @cb?
+ * @userdata: user data for callback
*
* The @cb function is called every time an instruction is executed
*/
@@ -532,7 +530,7 @@ void qemu_plugin_register_vcpu_insn_exec_cb(struct qemu_plugin_insn *insn,
* @cond: condition to enable callback
* @entry: first operand for condition
* @imm: second operand for condition
- * @userdata: any plugin data to pass to the @cb?
+ * @userdata: user data for callback
*
* The @cb function is called when an instruction executes if
* entry @cond imm is true.
@@ -748,7 +746,7 @@ const char *qemu_plugin_hwaddr_device_name(const struct qemu_plugin_hwaddr *h);
* @vcpu_index: the executing vCPU
* @info: an opaque handle for further queries about the memory
* @vaddr: the virtual address of the transaction
- * @userdata: any user data attached to the callback
+ * @userdata: user data for callback
*/
typedef void (*qemu_plugin_vcpu_mem_cb_t) (unsigned int vcpu_index,
qemu_plugin_meminfo_t info,
@@ -761,7 +759,7 @@ typedef void (*qemu_plugin_vcpu_mem_cb_t) (unsigned int vcpu_index,
* @cb: callback of type qemu_plugin_vcpu_mem_cb_t
* @flags: (currently unused) callback flags
* @rw: monitor reads, writes or both
- * @userdata: opaque pointer for userdata
+ * @userdata: user data for callback
*
* This registers a full callback for every memory access generated by
* an instruction. If the instruction doesn't access memory no
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 24/26] scripts/checkpatch: ignore spaces required around some operators in C++
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (22 preceding siblings ...)
2026-06-16 18:42 ` [PULL 23/26] plugins: use consistent parameter documentation for userdata Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 25/26] scripts/checkpatch: remove check on forbidden space before '[' " Pierrick Bouvier
` (2 subsequent siblings)
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
C++ has a different style when it comes to space around references,
dereferences, so don't report it.
Also, closing templates with >> gets wrongly confused with >> operator,
so just relax this check.
Some examples:
ERROR: spaces required around that '&' (ctx:WxV)
+ auto &[counter, p] = *static_cast<TbData*>(udata);
^
ERROR: spaces required around that '*' (ctx:VxO)
+ auto &[counter, p] = *static_cast<TbData*>(udata);
^
ERROR: spaces required around that '>>' (ctx:VxW)
+ std::vector<std::pair<Vaddr, uint64_t>> v; ^
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-25-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
scripts/checkpatch.pl | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 2189db19f54..538e059e265 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -2621,6 +2621,31 @@ sub process {
if ($op eq '::') {
$ok = 1;
}
+
+ # Ignore * in C++: templates and
+ # pointer types are incorrectly
+ # flagged. Example:
+ # static_cast<T*>
+ if ($op eq '*') {
+ $ok = 1;
+ }
+
+ # Ignore & in C++: & means a
+ # reference, and this create
+ # issues with some constructions.
+ # Example:
+ # auto &[first, second] = pair;
+ if ($op eq '&') {
+ $ok = 1;
+ }
+
+ # Ignore >> in C++
+ # checkpatch is confused by
+ # >> closing templates. Example:
+ # vector<pair<A, B>>
+ if ($op eq '>>') {
+ $ok = 1;
+ }
}
# Ignore email addresses <foo@bar>
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 25/26] scripts/checkpatch: remove check on forbidden space before '[' in C++
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (23 preceding siblings ...)
2026-06-16 18:42 ` [PULL 24/26] scripts/checkpatch: ignore spaces required around some operators in C++ Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-16 18:42 ` [PULL 26/26] plugins/cpp: register callbacks using captureless lambda Pierrick Bouvier
2026-06-17 19:29 ` [PULL 00/26] Plugins update for 2026-06-16 Stefan Hajnoczi
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
Lambdas are very confusing for checkpatch, so just relax this check.
Reviewed-by: Chao Liu <chao.liu.zevorn@gmail.com>
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@mailo.com>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-26-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
scripts/checkpatch.pl | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 538e059e265..03f35e75012 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -2423,7 +2423,8 @@ sub process {
# 3. inside a curly brace -- = { [0...10] = 5 }
# 4. after a comma -- [1] = 5, [2] = 6
# 5. in a macro definition -- #define abc(x) [x] = y
- while ($line =~ /(.*?\s)\[/g) {
+ my $cpp = $realfile =~ /(\.cpp)$/;
+ while (!$cpp && $line =~ /(.*?\s)\[/g) {
my ($where, $prefix) = ($-[1], $1);
if ($prefix !~ /$Type\s+$/ &&
($where != 0 || $prefix !~ /^.\s+$/) &&
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PULL 26/26] plugins/cpp: register callbacks using captureless lambda
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (24 preceding siblings ...)
2026-06-16 18:42 ` [PULL 25/26] scripts/checkpatch: remove check on forbidden space before '[' " Pierrick Bouvier
@ 2026-06-16 18:42 ` Pierrick Bouvier
2026-06-17 19:29 ` [PULL 00/26] Plugins update for 2026-06-16 Stefan Hajnoczi
26 siblings, 0 replies; 28+ messages in thread
From: Pierrick Bouvier @ 2026-06-16 18:42 UTC (permalink / raw)
To: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha
Cc: pierrick.bouvier
We can now demonstrate what previous changes allow us to do. Since all
callbacks have a userdata pointer, we can use that mechanism to move an
object through all of them.
In other words, we can now have stateful plugins without resorting to
any global variable.
As an example, we implement tb counting plugin with our cpp plugin. It
produces an output similar to hotblocks, with same performance.
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-27-pierrick.bouvier@oss.qualcomm.com
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
contrib/plugins/cpp.cpp | 90 +++++++++++++++++++++++++++++++++++++++--
1 file changed, 87 insertions(+), 3 deletions(-)
diff --git a/contrib/plugins/cpp.cpp b/contrib/plugins/cpp.cpp
index a0bb261fbe8..006fa6de243 100644
--- a/contrib/plugins/cpp.cpp
+++ b/contrib/plugins/cpp.cpp
@@ -363,14 +363,98 @@
QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
+class Plugin
{
-}
+ public:
+ void tb_exec(std::atomic<uint64_t> &count)
+ {
+ count++;
+ }
+
+ void tb_trans(struct qemu_plugin_tb *tb)
+ {
+ auto vaddr = qemu_plugin_tb_vaddr(tb);
+
+ TbData *data = [&]() {
+ std::lock_guard l(tb_trans_lock);
+ auto [it, is_new] = tb_data.try_emplace(vaddr);
+ TbData &in = it->second;
+ if (is_new) {
+ in.first = 0;
+ in.second = this;
+ }
+ return ∈
+ } ();
+
+ qemu_plugin_register_vcpu_tb_exec_cb(
+ tb,
+ [](unsigned int cpu_index, void *udata) {
+ auto &[counter, p] = *static_cast<TbData*>(udata);
+ p->tb_exec(counter);
+ },
+ QEMU_PLUGIN_CB_NO_REGS,
+ data);
+ }
+
+ void at_exit()
+ {
+ std::vector<std::pair<Vaddr, uint64_t>> v;
+ for (auto &[vaddr, data] : tb_data) {
+ uint64_t count = data.first;
+ v.push_back({vaddr, count});
+ }
+ std::sort(v.begin(), v.end(),
+ [](const auto &a, const auto &b) {
+ return a.second > b.second;
+ });
+ std::stringstream ss;
+ ss << "Top 10 executed TB are:\n";
+ size_t idx = 0;
+ for (auto &tb : v) {
+ if (idx >= 10) {
+ break;
+ }
+ ss << std::hex << "0x" << tb.first << std::dec << ": "
+ << tb.second << '\n';
+ ++idx;
+ }
+ qemu_plugin_outs(ss.str().c_str());
+ }
+
+ private:
+ using Vaddr = uint64_t;
+ using Counter = std::atomic<uint64_t>;
+ using TbData = std::pair<Counter, Plugin*>;
+ std::unordered_map<Vaddr, TbData> tb_data;
+ std::mutex tb_trans_lock;
+};
QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
const qemu_info_t *info,
int argc, char **argv)
{
- qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans, NULL);
+ Plugin *plugin = new Plugin;
+
+ /*
+ * We can register a cb with any function, which may be a free
+ * function, a static class function, or a captureless lambda.
+ */
+ qemu_plugin_register_vcpu_tb_trans_cb(
+ id,
+ [](struct qemu_plugin_tb *tb, void *userdata) {
+ Plugin *p = static_cast<Plugin*>(userdata);
+ p->tb_trans(tb);
+ },
+ plugin);
+
+ qemu_plugin_register_atexit_cb(
+ id,
+ [](void *userdata) {
+ Plugin *p = static_cast<Plugin*>(userdata);
+ p->at_exit();
+ delete p;
+ },
+ plugin);
+
return 0;
}
--
2.47.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* Re: [PULL 00/26] Plugins update for 2026-06-16
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
` (25 preceding siblings ...)
2026-06-16 18:42 ` [PULL 26/26] plugins/cpp: register callbacks using captureless lambda Pierrick Bouvier
@ 2026-06-17 19:29 ` Stefan Hajnoczi
26 siblings, 0 replies; 28+ messages in thread
From: Stefan Hajnoczi @ 2026-06-17 19:29 UTC (permalink / raw)
To: Pierrick Bouvier
Cc: qemu-devel, peter.maydell, richard.henderson, pbonzini, stefanha,
pierrick.bouvier
[-- Attachment #1: Type: text/plain, Size: 116 bytes --]
Applied, thanks.
Please update the changelog at https://wiki.qemu.org/ChangeLog/11.1 for any user-visible changes.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 28+ messages in thread
end of thread, other threads:[~2026-06-17 19:29 UTC | newest]
Thread overview: 28+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-16 18:42 [PULL 00/26] Plugins update for 2026-06-16 Pierrick Bouvier
2026-06-16 18:42 ` [PULL 01/26] plugins: bump version Pierrick Bouvier
2026-06-16 18:42 ` [PULL 02/26] plugins: add userdata for qemu_plugin_{uninstall, reset} Pierrick Bouvier
2026-06-16 18:42 ` [PULL 03/26] plugins: add userdata to qemu_plugin_register_flush_cb Pierrick Bouvier
2026-06-16 18:42 ` [PULL 04/26] plugins: remove type qemu_plugin_simple_cb_t Pierrick Bouvier
2026-06-16 18:42 ` [PULL 05/26] plugins: remove qemu_plugin_id_t from qemu_plugin_udata_cb_t Pierrick Bouvier
2026-06-16 18:42 ` [PULL 06/26] plugins: remove qemu_plugin_id_t from qemu_plugin_vcpu_simple_cb_t Pierrick Bouvier
2026-06-16 18:42 ` [PULL 07/26] plugins: add userdata to qemu_plugin_register_vcpu_init_cb Pierrick Bouvier
2026-06-16 18:42 ` [PULL 08/26] plugins: add userdata to qemu_plugin_register_vcpu_exit_cb Pierrick Bouvier
2026-06-16 18:42 ` [PULL 09/26] plugins: add userdata to qemu_plugin_register_vcpu_idle_cb Pierrick Bouvier
2026-06-16 18:42 ` [PULL 10/26] plugins: add userdata to qemu_plugin_register_vcpu_resume_cb Pierrick Bouvier
2026-06-16 18:42 ` [PULL 11/26] plugins: add userdata to qemu_plugin_vcpu_for_each Pierrick Bouvier
2026-06-16 18:42 ` [PULL 12/26] plugins: remove type qemu_plugin_vcpu_simple_cb_t Pierrick Bouvier
2026-06-16 18:42 ` [PULL 13/26] plugins: add userdata to qemu_plugin_register_vcpu_discon_cb Pierrick Bouvier
2026-06-16 18:42 ` [PULL 14/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_discon_cb_t Pierrick Bouvier
2026-06-16 18:42 ` [PULL 15/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_tb_trans_cb_t Pierrick Bouvier
2026-06-16 18:42 ` [PULL 16/26] plugins: add userdata to qemu_plugin_vcpu_tb_trans_cb_t Pierrick Bouvier
2026-06-16 18:42 ` [PULL 17/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_cb_t Pierrick Bouvier
2026-06-16 18:42 ` [PULL 18/26] plugins: add userdata to qemu_plugin_register_vcpu_syscall_cb Pierrick Bouvier
2026-06-16 18:42 ` [PULL 19/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_filter_cb_t Pierrick Bouvier
2026-06-16 18:42 ` [PULL 20/26] plugins: add userdata to qemu_plugin_register_vcpu_syscall_filter_cb Pierrick Bouvier
2026-06-16 18:42 ` [PULL 21/26] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_ret_cb_t Pierrick Bouvier
2026-06-16 18:42 ` [PULL 22/26] plugins: add userdata to qemu_plugin_register_vcpu_syscall_ret_cb Pierrick Bouvier
2026-06-16 18:42 ` [PULL 23/26] plugins: use consistent parameter documentation for userdata Pierrick Bouvier
2026-06-16 18:42 ` [PULL 24/26] scripts/checkpatch: ignore spaces required around some operators in C++ Pierrick Bouvier
2026-06-16 18:42 ` [PULL 25/26] scripts/checkpatch: remove check on forbidden space before '[' " Pierrick Bouvier
2026-06-16 18:42 ` [PULL 26/26] plugins/cpp: register callbacks using captureless lambda Pierrick Bouvier
2026-06-17 19:29 ` [PULL 00/26] Plugins update for 2026-06-16 Stefan Hajnoczi
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.