On 6/10/2026 10:19 PM, Manos Pitsidianakis wrote: > On Wed, 03 Jun 2026 23:51, Pierrick Bouvier > <[email protected]> wrote: >> Signed-off-by: Pierrick Bouvier <[email protected]> >> --- >> 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? >
Accidental delete I would say :) > LGTM though: > > Reviewed-by: Manos Pitsidianakis <[email protected]> > > >> 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 >> >>
