All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain
@ 2026-06-03 20:51 Pierrick Bouvier
  2026-06-03 20:51 ` [PATCH 01/25] plugins: bump version Pierrick Bouvier
                   ` (24 more replies)
  0 siblings, 25 replies; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

A coworker recently wrote a C++ plugin, and noticed interesting limitations of
current API. Basically, the biggest issue is that the only way to maintain state
in a plugin is by using global variables. The root cause is that some
callback types can't transfer user data.

Also, he asked why some callbacks have a qemu_plugin_id_t, and some other don't.
This excellent question exposed that we don't need this most of the time. And if
needed, we can rely on user data instead.

For functional programmers here, it allows to have something similar to
continuation-passing style, with all callbacks carrying data to next one.

This series modifies our callback types to make sure they all have a userdata,
and none have a qemu_plugin_id. Existing C plugins don't need to change, and
global variables can still exist.

After all those changes, we can finally implement a C++ plugin without any
static variable (well, out of qemu_plugin_version), using an object and
lambdas. This act as a demonstration of how we could write future plugins, and
also, how we are finally on the edge to offer a proper native interface
in Rust using closures.

Pierrick Bouvier (25):
  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
  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       |  89 +++++++++++++++++++++++++-
 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 | 114 +++++++++++++++++++---------------
 include/qemu/plugin.h         |   2 -
 plugins/api.c                 |  40 +++++++-----
 plugins/core.c                |  94 +++++++++++-----------------
 plugins/loader.c              |  13 ++--
 plugins/plugin.h              |   5 +-
 scripts/checkpatch.pl         |  20 +++++-
 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, 354 insertions(+), 245 deletions(-)

-- 
2.43.0



^ permalink raw reply	[flat|nested] 54+ messages in thread

* [PATCH 01/25] plugins: bump version
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-08  5:58   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 02/25] plugins: add userdata for qemu_plugin_{uninstall, reset} Pierrick Bouvier
                   ` (23 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

Next commits will be breaking changes, so bump min version and version
accordingly.

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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 02/25] plugins: add userdata for qemu_plugin_{uninstall, reset}
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
  2026-06-03 20:51 ` [PATCH 01/25] plugins: bump version Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-08  6:01   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 03/25] plugins: add userdata to qemu_plugin_register_flush_cb Pierrick Bouvier
                   ` (22 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

We do both at the same time because they internally use the same
implementation.

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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 03/25] plugins: add userdata to qemu_plugin_register_flush_cb
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
  2026-06-03 20:51 ` [PATCH 01/25] plugins: bump version Pierrick Bouvier
  2026-06-03 20:51 ` [PATCH 02/25] plugins: add userdata for qemu_plugin_{uninstall, reset} Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-08  6:05   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 04/25] plugins: remove type qemu_plugin_simple_cb_t Pierrick Bouvier
                   ` (21 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 04/25] plugins: remove type qemu_plugin_simple_cb_t
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (2 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 03/25] plugins: add userdata to qemu_plugin_register_flush_cb Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-08  6:10   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 05/25] plugins: remove qemu_plugin_id_t from qemu_plugin_udata_cb_t Pierrick Bouvier
                   ` (20 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

We removed all usage of this type, it can now be removed.

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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 05/25] plugins: remove qemu_plugin_id_t from qemu_plugin_udata_cb_t
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (3 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 04/25] plugins: remove type qemu_plugin_simple_cb_t Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  5:13   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 06/25] plugins: remove qemu_plugin_id_t from qemu_plugin_vcpu_simple_cb_t Pierrick Bouvier
                   ` (19 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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.

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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 06/25] plugins: remove qemu_plugin_id_t from qemu_plugin_vcpu_simple_cb_t
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (4 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 05/25] plugins: remove qemu_plugin_id_t from qemu_plugin_udata_cb_t Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  5:17   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 07/25] plugins: add userdata to qemu_plugin_register_vcpu_init_cb Pierrick Bouvier
                   ` (18 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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.

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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 07/25] plugins: add userdata to qemu_plugin_register_vcpu_init_cb
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (5 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 06/25] plugins: remove qemu_plugin_id_t from qemu_plugin_vcpu_simple_cb_t Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  5:19   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 08/25] plugins: add userdata to qemu_plugin_register_vcpu_exit_cb Pierrick Bouvier
                   ` (17 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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                | 26 +++++++++++++++++++++++---
 tests/tcg/plugins/insn.c      |  4 ++--
 tests/tcg/plugins/registers.c |  4 ++--
 9 files changed, 41 insertions(+), 18 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..1d5692b3f41 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
@@ -145,7 +166,6 @@ static void plugin_cb__udata(enum qemu_plugin_event ev)
     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;
-
             func(cb->udata);
         }
         break;
@@ -271,7 +291,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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 08/25] plugins: add userdata to qemu_plugin_register_vcpu_exit_cb
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (6 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 07/25] plugins: add userdata to qemu_plugin_register_vcpu_init_cb Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  5:31   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 09/25] plugins: add userdata to qemu_plugin_register_vcpu_idle_cb Pierrick Bouvier
                   ` (16 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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 1d5692b3f41..15fb548f68c 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);
@@ -306,7 +306,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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 09/25] plugins: add userdata to qemu_plugin_register_vcpu_idle_cb
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (7 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 08/25] plugins: add userdata to qemu_plugin_register_vcpu_exit_cb Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  5:32   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 10/25] plugins: add userdata to qemu_plugin_register_vcpu_resume_cb Pierrick Bouvier
                   ` (15 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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 15fb548f68c..111ceeea285 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;
@@ -626,7 +626,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);
     }
 }
@@ -659,9 +659,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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 10/25] plugins: add userdata to qemu_plugin_register_vcpu_resume_cb
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (8 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 09/25] plugins: add userdata to qemu_plugin_register_vcpu_idle_cb Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  5:33   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 11/25] plugins: add userdata to qemu_plugin_vcpu_for_each Pierrick Bouvier
                   ` (14 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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 111ceeea285..aa9240fe21a 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;
@@ -635,7 +613,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);
     }
 }
@@ -666,9 +644,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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 11/25] plugins: add userdata to qemu_plugin_vcpu_for_each
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (9 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 10/25] plugins: add userdata to qemu_plugin_register_vcpu_resume_cb Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  5:34   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 12/25] plugins: remove type qemu_plugin_vcpu_simple_cb_t Pierrick Bouvier
                   ` (13 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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 aa9240fe21a..a5aac1062aa 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -296,18 +296,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;
 
@@ -317,6 +319,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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 12/25] plugins: remove type qemu_plugin_vcpu_simple_cb_t
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (10 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 11/25] plugins: add userdata to qemu_plugin_vcpu_for_each Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  5:35   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 13/25] plugins: add userdata to qemu_plugin_register_vcpu_discon_cb Pierrick Bouvier
                   ` (12 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 13/25] plugins: add userdata to qemu_plugin_register_vcpu_discon_cb
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (11 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 12/25] plugins: remove type qemu_plugin_vcpu_simple_cb_t Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  5:35   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 14/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_discon_cb_t Pierrick Bouvier
                   ` (11 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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 a5aac1062aa..54ab3bdbedc 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);
@@ -655,16 +654,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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 14/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_discon_cb_t
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (12 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 13/25] plugins: add userdata to qemu_plugin_register_vcpu_discon_cb Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  5:36   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 15/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_tb_trans_cb_t Pierrick Bouvier
                   ` (10 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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 54ab3bdbedc..3c3212aedda 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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 15/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_tb_trans_cb_t
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (13 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 14/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_discon_cb_t Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  5:55   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 16/25] plugins: add userdata to qemu_plugin_vcpu_tb_trans_cb_t Pierrick Bouvier
                   ` (9 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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 3c3212aedda..c77da4d36fd 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -487,7 +487,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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 16/25] plugins: add userdata to qemu_plugin_vcpu_tb_trans_cb_t
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (14 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 15/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_tb_trans_cb_t Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  5:57   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 17/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_cb_t Pierrick Bouvier
                   ` (8 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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 c77da4d36fd..d891da93040 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -487,7 +487,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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 17/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_cb_t
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (15 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 16/25] plugins: add userdata to qemu_plugin_vcpu_tb_trans_cb_t Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  5:58   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 18/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_cb Pierrick Bouvier
                   ` (7 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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 d891da93040..878fc47cbe1 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -533,7 +533,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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 18/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_cb
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (16 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 17/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_cb_t Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  6:00   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 19/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_filter_cb_t Pierrick Bouvier
                   ` (6 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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 878fc47cbe1..45136bf950a 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -533,7 +533,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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 19/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_filter_cb_t
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (17 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 18/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_cb Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  6:02   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 20/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_filter_cb Pierrick Bouvier
                   ` (5 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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 45136bf950a..987e49b89cd 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -589,7 +589,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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 20/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_filter_cb
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (18 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 19/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_filter_cb_t Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  6:03   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 21/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_ret_cb_t Pierrick Bouvier
                   ` (4 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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 987e49b89cd..fe292a098da 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,
         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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 21/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_ret_cb_t
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (19 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 20/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_filter_cb Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  6:10   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 22/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_ret_cb Pierrick Bouvier
                   ` (3 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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 fe292a098da..887267f8174 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -557,7 +557,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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 22/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_ret_cb
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (20 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 21/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_ret_cb_t Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-11  6:08   ` Manos Pitsidianakis
  2026-06-03 20:51 ` [PATCH 23/25] scripts/checkpatch: ignore spaces required around some operators in C++ Pierrick Bouvier
                   ` (2 subsequent siblings)
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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 887267f8174..7a58fb537c9 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -557,7 +557,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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 23/25] scripts/checkpatch: ignore spaces required around some operators in C++
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (21 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 22/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_ret_cb Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-08  9:21   ` Peter Maydell
  2026-06-03 20:51 ` [PATCH 24/25] scripts/checkpatch: remove check on forbidden space before '[' " Pierrick Bouvier
  2026-06-03 20:51 ` [PATCH 25/25] plugins/cpp: register callbacks using captureless lambda Pierrick Bouvier
  24 siblings, 1 reply; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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.

Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
 scripts/checkpatch.pl | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 2189db19f54..c74ec070c53 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -2621,6 +2621,23 @@ sub process {
 						if ($op eq '::') {
 							$ok = 1;
 						}
+
+						# Ignore * in C++
+						if ($op eq '*') {
+							$ok = 1;
+						}
+
+						# Ignore & in C++
+						if ($op eq '&') {
+							$ok = 1;
+						}
+
+						# Ignore >> in C++
+						# checkpatch is confused by
+						# >> closing templates
+						if ($op eq '>>') {
+							$ok = 1;
+						}
 					}
 
 					# Ignore email addresses <foo@bar>
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 24/25] scripts/checkpatch: remove check on forbidden space before '[' in C++
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (22 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 23/25] scripts/checkpatch: ignore spaces required around some operators in C++ Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  2026-06-04  6:22   ` Philippe Mathieu-Daudé
                     ` (2 more replies)
  2026-06-03 20:51 ` [PATCH 25/25] plugins/cpp: register callbacks using captureless lambda Pierrick Bouvier
  24 siblings, 3 replies; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

Lambdas are very confusing for checkpatch, so just relax this check.

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 c74ec070c53..d90aca6fcbf 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.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 25/25] plugins/cpp: register callbacks using captureless lambda
  2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
                   ` (23 preceding siblings ...)
  2026-06-03 20:51 ` [PATCH 24/25] scripts/checkpatch: remove check on forbidden space before '[' " Pierrick Bouvier
@ 2026-06-03 20:51 ` Pierrick Bouvier
  24 siblings, 0 replies; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

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.

Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
---
 contrib/plugins/cpp.cpp | 89 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 86 insertions(+), 3 deletions(-)

diff --git a/contrib/plugins/cpp.cpp b/contrib/plugins/cpp.cpp
index a0bb261fbe8..c5099456525 100644
--- a/contrib/plugins/cpp.cpp
+++ b/contrib/plugins/cpp.cpp
@@ -363,14 +363,97 @@
 
 QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
 
-static void vcpu_tb_trans(struct qemu_plugin_tb *tb, void *userdata)
+class PluginInstance
 {
-}
+    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.second = this;
+            }
+            return &in;
+        } ();
+
+        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, PluginInstance*>;
+    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);
+    PluginInstance *plugin = new PluginInstance;
+
+    /*
+     * 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) {
+            PluginInstance *p = static_cast<PluginInstance*>(userdata);
+            p->tb_trans(tb);
+        },
+        plugin);
+
+    qemu_plugin_register_atexit_cb(
+        id,
+        [](void *userdata) {
+            PluginInstance *p = static_cast<PluginInstance*>(userdata);
+            p->at_exit();
+            delete p;
+        },
+        plugin);
+
     return 0;
 }
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 54+ messages in thread

* Re: [PATCH 24/25] scripts/checkpatch: remove check on forbidden space before '[' in C++
  2026-06-03 20:51 ` [PATCH 24/25] scripts/checkpatch: remove check on forbidden space before '[' " Pierrick Bouvier
@ 2026-06-04  6:22   ` Philippe Mathieu-Daudé
  2026-06-11  6:07   ` Manos Pitsidianakis
  2026-06-11  6:28   ` Chao Liu
  2 siblings, 0 replies; 54+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-06-04  6:22 UTC (permalink / raw)
  To: Pierrick Bouvier, qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Alexandre Iooss

On 3/6/26 22:51, Pierrick Bouvier wrote:
> Lambdas are very confusing for checkpatch, so just relax this check.
> 
> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
> ---
>   scripts/checkpatch.pl | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@mailo.com>



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 01/25] plugins: bump version
  2026-06-03 20:51 ` [PATCH 01/25] plugins: bump version Pierrick Bouvier
@ 2026-06-08  5:58   ` Manos Pitsidianakis
  2026-06-08 16:53     ` Pierrick Bouvier
  0 siblings, 1 reply; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-08  5:58 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>Next commits will be breaking changes, so bump min version and version
>accordingly.
>
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> 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.

You could alternatively add only "version 7" line and add the 
"changelog" lines in the patches that introduce them, but doesn't make a 
big difference.

>  */
> 
> 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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 02/25] plugins: add userdata for qemu_plugin_{uninstall, reset}
  2026-06-03 20:51 ` [PATCH 02/25] plugins: add userdata for qemu_plugin_{uninstall, reset} Pierrick Bouvier
@ 2026-06-08  6:01   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-08  6:01 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>We do both at the same time because they internally use the same
>implementation.
>
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---

LGTM,

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> 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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 03/25] plugins: add userdata to qemu_plugin_register_flush_cb
  2026-06-03 20:51 ` [PATCH 03/25] plugins: add userdata to qemu_plugin_register_flush_cb Pierrick Bouvier
@ 2026-06-08  6:05   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-08  6:05 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> 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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 04/25] plugins: remove type qemu_plugin_simple_cb_t
  2026-06-03 20:51 ` [PATCH 04/25] plugins: remove type qemu_plugin_simple_cb_t Pierrick Bouvier
@ 2026-06-08  6:10   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-08  6:10 UTC (permalink / raw)
  To: Pierrick Bouvier
  Cc: qemu-devel, Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Alexandre Iooss

On Wed, Jun 3, 2026 at 11:53 PM Pierrick Bouvier
<pierrick.bouvier@oss.qualcomm.com> wrote:
>
> We removed all usage of this type, it can now be removed.
>
> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
> ---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

>  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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 23/25] scripts/checkpatch: ignore spaces required around some operators in C++
  2026-06-03 20:51 ` [PATCH 23/25] scripts/checkpatch: ignore spaces required around some operators in C++ Pierrick Bouvier
@ 2026-06-08  9:21   ` Peter Maydell
  2026-06-08 16:56     ` Pierrick Bouvier
  0 siblings, 1 reply; 54+ messages in thread
From: Peter Maydell @ 2026-06-08  9:21 UTC (permalink / raw)
  To: Pierrick Bouvier
  Cc: qemu-devel, Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Alexandre Iooss

On Wed, 3 Jun 2026 at 21:55, Pierrick Bouvier
<pierrick.bouvier@oss.qualcomm.com> wrote:
>
> 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.
>
> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
> ---
>  scripts/checkpatch.pl | 17 +++++++++++++++++
>  1 file changed, 17 insertions(+)
>
> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
> index 2189db19f54..c74ec070c53 100755
> --- a/scripts/checkpatch.pl
> +++ b/scripts/checkpatch.pl
> @@ -2621,6 +2621,23 @@ sub process {
>                                                 if ($op eq '::') {
>                                                         $ok = 1;
>                                                 }
> +
> +                                               # Ignore * in C++
> +                                               if ($op eq '*') {
> +                                                       $ok = 1;
> +                                               }
> +
> +                                               # Ignore & in C++

I think it would be helpful if these comments said why we're ignoring
the operators, the way we do for the one about ">>". Why we should
ignore "::" is clear (it's an operator that exists in C++ and not C),
but * and & are both present in C, so we should say why C++ is special.

> +                                               if ($op eq '&') {
> +                                                       $ok = 1;
> +                                               }
> +
> +                                               # Ignore >> in C++
> +                                               # checkpatch is confused by
> +                                               # >> closing templates
> +                                               if ($op eq '>>') {
> +                                                       $ok = 1;
> +                                               }
>                                         }

thanks
-- PMM


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 01/25] plugins: bump version
  2026-06-08  5:58   ` Manos Pitsidianakis
@ 2026-06-08 16:53     ` Pierrick Bouvier
  0 siblings, 0 replies; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-08 16:53 UTC (permalink / raw)
  To: Manos Pitsidianakis, qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daud é, Alex Benn é e, Alexandre Iooss

On 6/7/2026 10:58 PM, Manos Pitsidianakis wrote:
> On Wed, 03 Jun 2026 23:51, Pierrick Bouvier
> <pierrick.bouvier@oss.qualcomm.com> wrote:
>> Next commits will be breaking changes, so bump min version and version
>> accordingly.
>>
>> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>> ---
> 
> Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
> 
>> 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.
> 
> You could alternatively add only "version 7" line and add the
> "changelog" lines in the patches that introduce them, but doesn't make a
> big difference.
>

I didn't find a better place for that, since next 22 commits are kind of
an "atomic" step regarding the version bump.
 >>  */
>>
>> 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.43.0
>>
>>



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 23/25] scripts/checkpatch: ignore spaces required around some operators in C++
  2026-06-08  9:21   ` Peter Maydell
@ 2026-06-08 16:56     ` Pierrick Bouvier
  0 siblings, 0 replies; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-08 16:56 UTC (permalink / raw)
  To: Peter Maydell
  Cc: qemu-devel, Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Alexandre Iooss

On 6/8/2026 2:21 AM, Peter Maydell wrote:
> On Wed, 3 Jun 2026 at 21:55, Pierrick Bouvier
> <pierrick.bouvier@oss.qualcomm.com> wrote:
>>
>> 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.
>>
>> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>> ---
>>  scripts/checkpatch.pl | 17 +++++++++++++++++
>>  1 file changed, 17 insertions(+)
>>
>> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
>> index 2189db19f54..c74ec070c53 100755
>> --- a/scripts/checkpatch.pl
>> +++ b/scripts/checkpatch.pl
>> @@ -2621,6 +2621,23 @@ sub process {
>>                                                 if ($op eq '::') {
>>                                                         $ok = 1;
>>                                                 }
>> +
>> +                                               # Ignore * in C++
>> +                                               if ($op eq '*') {
>> +                                                       $ok = 1;
>> +                                               }
>> +
>> +                                               # Ignore & in C++
> 
> I think it would be helpful if these comments said why we're ignoring
> the operators, the way we do for the one about ">>". Why we should
> ignore "::" is clear (it's an operator that exists in C++ and not C),
> but * and & are both present in C, so we should say why C++ is special.
>

I'll add it thanks.

For reference, that's (some of) the errors I ran into that motivated
this change:

ERROR: spaces required around that '&' (ctx:WxV)
#58: FILE: contrib/plugins/cpp.cpp:392:
+                auto &[counter, p] = *static_cast<TbData*>(udata);
                      ^

ERROR: spaces required around that '*' (ctx:VxO)
#58: FILE: contrib/plugins/cpp.cpp:392:
+                auto &[counter, p] = *static_cast<TbData*>(udata);
                                                         ^

ERROR: spaces required around that '>>' (ctx:VxW)
#67: FILE: contrib/plugins/cpp.cpp:401:
+        std::vector<std::pair<Vaddr, uint64_t>> v;
                                              ^

>> +                                               if ($op eq '&') {
>> +                                                       $ok = 1;
>> +                                               }
>> +
>> +                                               # Ignore >> in C++
>> +                                               # checkpatch is confused by
>> +                                               # >> closing templates
>> +                                               if ($op eq '>>') {
>> +                                                       $ok = 1;
>> +                                               }
>>                                         }
> 
> thanks
> -- PMM



^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 05/25] plugins: remove qemu_plugin_id_t from qemu_plugin_udata_cb_t
  2026-06-03 20:51 ` [PATCH 05/25] plugins: remove qemu_plugin_id_t from qemu_plugin_udata_cb_t Pierrick Bouvier
@ 2026-06-11  5:13   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  5:13 UTC (permalink / raw)
  To: Pierrick Bouvier
  Cc: qemu-devel, Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Alexandre Iooss

On Wed, Jun 3, 2026 at 11:52 PM Pierrick Bouvier
<pierrick.bouvier@oss.qualcomm.com> wrote:
>
> 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.
>
> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
> ---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

>  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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 06/25] plugins: remove qemu_plugin_id_t from qemu_plugin_vcpu_simple_cb_t
  2026-06-03 20:51 ` [PATCH 06/25] plugins: remove qemu_plugin_id_t from qemu_plugin_vcpu_simple_cb_t Pierrick Bouvier
@ 2026-06-11  5:17   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  5:17 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>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.
>
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> 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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 07/25] plugins: add userdata to qemu_plugin_register_vcpu_init_cb
  2026-06-03 20:51 ` [PATCH 07/25] plugins: add userdata to qemu_plugin_register_vcpu_init_cb Pierrick Bouvier
@ 2026-06-11  5:19   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  5:19 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>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                | 26 +++++++++++++++++++++++---
> tests/tcg/plugins/insn.c      |  4 ++--
> tests/tcg/plugins/registers.c |  4 ++--
> 9 files changed, 41 insertions(+), 18 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..1d5692b3f41 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
>@@ -145,7 +166,6 @@ static void plugin_cb__udata(enum qemu_plugin_event ev)
>     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;
>-

Accidental or something missing?

LGTM though:

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>


>             func(cb->udata);
>         }
>         break;
>@@ -271,7 +291,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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 08/25] plugins: add userdata to qemu_plugin_register_vcpu_exit_cb
  2026-06-03 20:51 ` [PATCH 08/25] plugins: add userdata to qemu_plugin_register_vcpu_exit_cb Pierrick Bouvier
@ 2026-06-11  5:31   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  5:31 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---


Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> 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 1d5692b3f41..15fb548f68c 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);
>@@ -306,7 +306,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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 09/25] plugins: add userdata to qemu_plugin_register_vcpu_idle_cb
  2026-06-03 20:51 ` [PATCH 09/25] plugins: add userdata to qemu_plugin_register_vcpu_idle_cb Pierrick Bouvier
@ 2026-06-11  5:32   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  5:32 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> 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 15fb548f68c..111ceeea285 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;
>@@ -626,7 +626,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);
>     }
> }
>@@ -659,9 +659,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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 10/25] plugins: add userdata to qemu_plugin_register_vcpu_resume_cb
  2026-06-03 20:51 ` [PATCH 10/25] plugins: add userdata to qemu_plugin_register_vcpu_resume_cb Pierrick Bouvier
@ 2026-06-11  5:33   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  5:33 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> 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 111ceeea285..aa9240fe21a 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;
>@@ -635,7 +613,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);
>     }
> }
>@@ -666,9 +644,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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 11/25] plugins: add userdata to qemu_plugin_vcpu_for_each
  2026-06-03 20:51 ` [PATCH 11/25] plugins: add userdata to qemu_plugin_vcpu_for_each Pierrick Bouvier
@ 2026-06-11  5:34   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  5:34 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> 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 aa9240fe21a..a5aac1062aa 100644
>--- a/plugins/core.c
>+++ b/plugins/core.c
>@@ -296,18 +296,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;
> 
>@@ -317,6 +319,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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 12/25] plugins: remove type qemu_plugin_vcpu_simple_cb_t
  2026-06-03 20:51 ` [PATCH 12/25] plugins: remove type qemu_plugin_vcpu_simple_cb_t Pierrick Bouvier
@ 2026-06-11  5:35   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  5:35 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> 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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 13/25] plugins: add userdata to qemu_plugin_register_vcpu_discon_cb
  2026-06-03 20:51 ` [PATCH 13/25] plugins: add userdata to qemu_plugin_register_vcpu_discon_cb Pierrick Bouvier
@ 2026-06-11  5:35   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  5:35 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> 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 a5aac1062aa..54ab3bdbedc 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);
>@@ -655,16 +654,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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 14/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_discon_cb_t
  2026-06-03 20:51 ` [PATCH 14/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_discon_cb_t Pierrick Bouvier
@ 2026-06-11  5:36   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  5:36 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> 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 54ab3bdbedc..3c3212aedda 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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 15/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_tb_trans_cb_t
  2026-06-03 20:51 ` [PATCH 15/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_tb_trans_cb_t Pierrick Bouvier
@ 2026-06-11  5:55   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  5:55 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> 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 3c3212aedda..c77da4d36fd 100644
>--- a/plugins/core.c
>+++ b/plugins/core.c
>@@ -487,7 +487,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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 16/25] plugins: add userdata to qemu_plugin_vcpu_tb_trans_cb_t
  2026-06-03 20:51 ` [PATCH 16/25] plugins: add userdata to qemu_plugin_vcpu_tb_trans_cb_t Pierrick Bouvier
@ 2026-06-11  5:57   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  5:57 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> 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 c77da4d36fd..d891da93040 100644
>--- a/plugins/core.c
>+++ b/plugins/core.c
>@@ -487,7 +487,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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 17/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_cb_t
  2026-06-03 20:51 ` [PATCH 17/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_cb_t Pierrick Bouvier
@ 2026-06-11  5:58   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  5:58 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>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);

Unrelated to this patch: this is an ugly function signature. It could 
use a "syscall" struct to hold all of these values into one argument.


Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

>diff --git a/plugins/core.c b/plugins/core.c
>index d891da93040..878fc47cbe1 100644
>--- a/plugins/core.c
>+++ b/plugins/core.c
>@@ -533,7 +533,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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 18/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_cb
  2026-06-03 20:51 ` [PATCH 18/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_cb Pierrick Bouvier
@ 2026-06-11  6:00   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  6:00 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>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

Suggestion: I noticed in some patches you say "for @cb" and sometimes 
"for callback", if you re-spin this series you could make them 
consistent if you wish.

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

>  *
>  * 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 878fc47cbe1..45136bf950a 100644
>--- a/plugins/core.c
>+++ b/plugins/core.c
>@@ -533,7 +533,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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 19/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_filter_cb_t
  2026-06-03 20:51 ` [PATCH 19/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_filter_cb_t Pierrick Bouvier
@ 2026-06-11  6:02   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  6:02 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> 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 45136bf950a..987e49b89cd 100644
>--- a/plugins/core.c
>+++ b/plugins/core.c
>@@ -589,7 +589,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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 20/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_filter_cb
  2026-06-03 20:51 ` [PATCH 20/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_filter_cb Pierrick Bouvier
@ 2026-06-11  6:03   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  6:03 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> 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 987e49b89cd..fe292a098da 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,
>         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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 24/25] scripts/checkpatch: remove check on forbidden space before '[' in C++
  2026-06-03 20:51 ` [PATCH 24/25] scripts/checkpatch: remove check on forbidden space before '[' " Pierrick Bouvier
  2026-06-04  6:22   ` Philippe Mathieu-Daudé
@ 2026-06-11  6:07   ` Manos Pitsidianakis
  2026-06-11  6:28   ` Chao Liu
  2 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  6:07 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>Lambdas are very confusing for checkpatch, so just relax this check.
>
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---

cpp lambdas are confusing for a lot of people I guess

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> scripts/checkpatch.pl | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
>diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
>index c74ec070c53..d90aca6fcbf 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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 22/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_ret_cb
  2026-06-03 20:51 ` [PATCH 22/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_ret_cb Pierrick Bouvier
@ 2026-06-11  6:08   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  6:08 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> 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 887267f8174..7a58fb537c9 100644
>--- a/plugins/core.c
>+++ b/plugins/core.c
>@@ -557,7 +557,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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 21/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_ret_cb_t
  2026-06-03 20:51 ` [PATCH 21/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_ret_cb_t Pierrick Bouvier
@ 2026-06-11  6:10   ` Manos Pitsidianakis
  0 siblings, 0 replies; 54+ messages in thread
From: Manos Pitsidianakis @ 2026-06-11  6:10 UTC (permalink / raw)
  To: qemu-devel, Pierrick Bouvier
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé , Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

On Wed, 03 Jun 2026 23:51, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> wrote:
>Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
>---

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>

> 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 fe292a098da..887267f8174 100644
>--- a/plugins/core.c
>+++ b/plugins/core.c
>@@ -557,7 +557,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.43.0
>
>


^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 24/25] scripts/checkpatch: remove check on forbidden space before '[' in C++
  2026-06-03 20:51 ` [PATCH 24/25] scripts/checkpatch: remove check on forbidden space before '[' " Pierrick Bouvier
  2026-06-04  6:22   ` Philippe Mathieu-Daudé
  2026-06-11  6:07   ` Manos Pitsidianakis
@ 2026-06-11  6:28   ` Chao Liu
  2 siblings, 0 replies; 54+ messages in thread
From: Chao Liu @ 2026-06-11  6:28 UTC (permalink / raw)
  To: Pierrick Bouvier
  Cc: qemu-devel, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Alexandre Iooss

On Wed, Jun 03, 2026 at 01:51:51PM +0800, Pierrick Bouvier wrote:
> Lambdas are very confusing for checkpatch, so just relax this check.
> 
> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
Reviewed-by: Chao Liu <chao.liu.zevorn@gmail.com>

> ---
>  scripts/checkpatch.pl | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
> index c74ec070c53..d90aca6fcbf 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.43.0
> 


^ permalink raw reply	[flat|nested] 54+ messages in thread

end of thread, other threads:[~2026-06-11  6:29 UTC | newest]

Thread overview: 54+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
2026-06-03 20:51 ` [PATCH 01/25] plugins: bump version Pierrick Bouvier
2026-06-08  5:58   ` Manos Pitsidianakis
2026-06-08 16:53     ` Pierrick Bouvier
2026-06-03 20:51 ` [PATCH 02/25] plugins: add userdata for qemu_plugin_{uninstall, reset} Pierrick Bouvier
2026-06-08  6:01   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 03/25] plugins: add userdata to qemu_plugin_register_flush_cb Pierrick Bouvier
2026-06-08  6:05   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 04/25] plugins: remove type qemu_plugin_simple_cb_t Pierrick Bouvier
2026-06-08  6:10   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 05/25] plugins: remove qemu_plugin_id_t from qemu_plugin_udata_cb_t Pierrick Bouvier
2026-06-11  5:13   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 06/25] plugins: remove qemu_plugin_id_t from qemu_plugin_vcpu_simple_cb_t Pierrick Bouvier
2026-06-11  5:17   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 07/25] plugins: add userdata to qemu_plugin_register_vcpu_init_cb Pierrick Bouvier
2026-06-11  5:19   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 08/25] plugins: add userdata to qemu_plugin_register_vcpu_exit_cb Pierrick Bouvier
2026-06-11  5:31   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 09/25] plugins: add userdata to qemu_plugin_register_vcpu_idle_cb Pierrick Bouvier
2026-06-11  5:32   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 10/25] plugins: add userdata to qemu_plugin_register_vcpu_resume_cb Pierrick Bouvier
2026-06-11  5:33   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 11/25] plugins: add userdata to qemu_plugin_vcpu_for_each Pierrick Bouvier
2026-06-11  5:34   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 12/25] plugins: remove type qemu_plugin_vcpu_simple_cb_t Pierrick Bouvier
2026-06-11  5:35   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 13/25] plugins: add userdata to qemu_plugin_register_vcpu_discon_cb Pierrick Bouvier
2026-06-11  5:35   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 14/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_discon_cb_t Pierrick Bouvier
2026-06-11  5:36   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 15/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_tb_trans_cb_t Pierrick Bouvier
2026-06-11  5:55   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 16/25] plugins: add userdata to qemu_plugin_vcpu_tb_trans_cb_t Pierrick Bouvier
2026-06-11  5:57   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 17/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_cb_t Pierrick Bouvier
2026-06-11  5:58   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 18/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_cb Pierrick Bouvier
2026-06-11  6:00   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 19/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_filter_cb_t Pierrick Bouvier
2026-06-11  6:02   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 20/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_filter_cb Pierrick Bouvier
2026-06-11  6:03   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 21/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_ret_cb_t Pierrick Bouvier
2026-06-11  6:10   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 22/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_ret_cb Pierrick Bouvier
2026-06-11  6:08   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 23/25] scripts/checkpatch: ignore spaces required around some operators in C++ Pierrick Bouvier
2026-06-08  9:21   ` Peter Maydell
2026-06-08 16:56     ` Pierrick Bouvier
2026-06-03 20:51 ` [PATCH 24/25] scripts/checkpatch: remove check on forbidden space before '[' " Pierrick Bouvier
2026-06-04  6:22   ` Philippe Mathieu-Daudé
2026-06-11  6:07   ` Manos Pitsidianakis
2026-06-11  6:28   ` Chao Liu
2026-06-03 20:51 ` [PATCH 25/25] plugins/cpp: register callbacks using captureless lambda Pierrick Bouvier

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.