@samitouri / QOSamiQemu / commits / 7cb918441a

plugins: add userdata to qemu_plugin_register_vcpu_init_cb

Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org> Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-8-pierrick.bouvier@oss.qualcomm.com Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>

Pierrick Bouvier committed Jun 15, 2026 at 12:35 UTC 7cb918441aa6fc6122939cda48c5ae2d75860575
9 files changed +41 -17
contrib/plugins/bbv.c
+2 -2
@@ -60,7 +60,7 @@ static qemu_plugin_u64 bb_count_u64(Bb *bb)
60 return qemu_plugin_scoreboard_u64(bb->count);
61 }
62
63 -static void vcpu_init(unsigned int vcpu_index)
63 +static void vcpu_init(unsigned int vcpu_index, void *userdata)
64 {
65 g_autofree gchar *vcpu_filename = NULL;
66 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,
156 bbs = g_hash_table_new_full(g_int64_hash, g_int64_equal, NULL, free_bb);
157 vcpus = qemu_plugin_scoreboard_new(sizeof(Vcpu));
158 qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
159 - qemu_plugin_register_vcpu_init_cb(id, vcpu_init);
159 + qemu_plugin_register_vcpu_init_cb(id, vcpu_init, NULL);
160 qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
161
162 return 0;
contrib/plugins/execlog.c
+2 -2
@@ -382,7 +382,7 @@ static GPtrArray *registers_init(int vcpu_index)
382 * As we could have multiple threads trying to do this we need to
383 * serialise the expansion under a lock.
384 */
385 -static void vcpu_init(unsigned int vcpu_index)
385 +static void vcpu_init(unsigned int vcpu_index, void *userdata)
386 {
387 CPU *c;
388
@@ -481,7 +481,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
481 }
482
483 /* Register init, translation block and exit callbacks */
484 - qemu_plugin_register_vcpu_init_cb(id, vcpu_init);
484 + qemu_plugin_register_vcpu_init_cb(id, vcpu_init, NULL);
485 qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
486 qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
487
contrib/plugins/ips.c
+2 -2
@@ -89,7 +89,7 @@ static void update_system_time(vCPUTime *vcpu)
89 g_mutex_unlock(&global_state_lock);
90 }
91
92 -static void vcpu_init(unsigned int cpu_index)
92 +static void vcpu_init(unsigned int cpu_index, void *userdata)
93 {
94 vCPUTime *vcpu = qemu_plugin_scoreboard_find(vcpus, cpu_index);
95 vcpu->total_insn = 0;
@@ -207,7 +207,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
207 g_assert(time_handle);
208
209 qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
210 - qemu_plugin_register_vcpu_init_cb(id, vcpu_init);
210 + qemu_plugin_register_vcpu_init_cb(id, vcpu_init, NULL);
211 qemu_plugin_register_vcpu_exit_cb(id, vcpu_exit);
212 qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
213
contrib/plugins/uftrace.c
+2 -2
@@ -874,7 +874,7 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
874 }
875 }
876
877 -static void vcpu_init(unsigned int vcpu_index)
877 +static void vcpu_init(unsigned int vcpu_index, void *userdata)
878 {
879 Cpu *cpu = qemu_plugin_scoreboard_find(score, vcpu_index);
880 cpu->ops = arch_ops;
@@ -985,7 +985,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
985 }
986
987 score = qemu_plugin_scoreboard_new(sizeof(Cpu));
988 - qemu_plugin_register_vcpu_init_cb(id, vcpu_init);
988 + qemu_plugin_register_vcpu_init_cb(id, vcpu_init, NULL);
989 qemu_plugin_register_atexit_cb(id, at_exit, (void *) info->system_emulation);
990 qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
991
include/plugins/qemu-plugin.h
+3 -1
@@ -242,6 +242,7 @@ void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_udata_cb_t cb,
242 * qemu_plugin_register_vcpu_init_cb() - register a vCPU initialization callback
243 * @id: plugin ID
244 * @cb: callback function
245 + * @userdata: any plugin data to pass to the @cb
246 *
247 * The @cb function is called every time a vCPU is initialized.
248 *
@@ -249,7 +250,8 @@ void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_udata_cb_t cb,
250 */
251 QEMU_PLUGIN_API
252 void qemu_plugin_register_vcpu_init_cb(qemu_plugin_id_t id,
252 - qemu_plugin_vcpu_simple_cb_t cb);
253 + qemu_plugin_vcpu_udata_cb_t cb,
254 + void *userdata);
255
256 /**
257 * qemu_plugin_register_vcpu_exit_cb() - register a vCPU exit callback
plugins/api.c
+3 -2
@@ -71,9 +71,10 @@ void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_udata_cb_t cb,
71 */
72
73 void qemu_plugin_register_vcpu_init_cb(qemu_plugin_id_t id,
74 - qemu_plugin_vcpu_simple_cb_t cb)
74 + qemu_plugin_vcpu_udata_cb_t cb,
75 + void *userdata)
76 {
76 - plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_INIT, cb);
77 + plugin_register_cb_udata(id, QEMU_PLUGIN_EV_VCPU_INIT, cb, userdata);
78 }
79
80 void qemu_plugin_register_vcpu_exit_cb(qemu_plugin_id_t id,
plugins/core.c
+23 -2
@@ -89,7 +89,6 @@ static void plugin_vcpu_cb__simple(CPUState *cpu, enum qemu_plugin_event ev)
89 struct qemu_plugin_cb *cb, *next;
90
91 switch (ev) {
92 - case QEMU_PLUGIN_EV_VCPU_INIT:
92 case QEMU_PLUGIN_EV_VCPU_EXIT:
93 case QEMU_PLUGIN_EV_VCPU_IDLE:
94 case QEMU_PLUGIN_EV_VCPU_RESUME:
@@ -104,6 +103,28 @@ static void plugin_vcpu_cb__simple(CPUState *cpu, enum qemu_plugin_event ev)
103 }
104 }
105
106 +/*
107 + * Disable CFI checks.
108 + * The callback function has been loaded from an external library so we do not
109 + * have type information
110 + */
111 +QEMU_DISABLE_CFI
112 +static void plugin_vcpu_cb__udata(CPUState *cpu, enum qemu_plugin_event ev)
113 +{
114 + struct qemu_plugin_cb *cb, *next;
115 +
116 + switch (ev) {
117 + case QEMU_PLUGIN_EV_VCPU_INIT:
118 + QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
119 + qemu_plugin_vcpu_udata_cb_t func = cb->f.vcpu_udata;
120 + func(cpu->cpu_index, cb->udata);
121 + }
122 + break;
123 + default:
124 + g_assert_not_reached();
125 + }
126 +}
127 +
128 /*
129 * Disable CFI checks.
130 * The callback function has been loaded from an external library so we do not
@@ -271,7 +292,7 @@ static void qemu_plugin_vcpu_init__async(CPUState *cpu, run_on_cpu_data unused)
292 qemu_rec_mutex_unlock(&plugin.lock);
293
294 qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_RW_REGS);
274 - plugin_vcpu_cb__simple(cpu, QEMU_PLUGIN_EV_VCPU_INIT);
295 + plugin_vcpu_cb__udata(cpu, QEMU_PLUGIN_EV_VCPU_INIT);
296 qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_NO_REGS);
297 }
298
tests/tcg/plugins/insn.c
+2 -2
@@ -84,7 +84,7 @@ static Instruction * get_insn_record(const char *disas, uint64_t vaddr, Match *m
84 /*
85 * Initialise a new vcpu with reading the register list
86 */
87 -static void vcpu_init(unsigned int vcpu_index)
87 +static void vcpu_init(unsigned int vcpu_index, void *userdata)
88 {
89 g_autoptr(GArray) reg_list = qemu_plugin_get_registers();
90 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,
296 qemu_plugin_scoreboard_new(sizeof(uint64_t)));
297
298 /* Register init, translation block and exit callbacks */
299 - qemu_plugin_register_vcpu_init_cb(id, vcpu_init);
299 + qemu_plugin_register_vcpu_init_cb(id, vcpu_init, NULL);
300 qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
301 qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
302 return 0;
tests/tcg/plugins/registers.c
+2 -2
@@ -21,7 +21,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
21 * registers that cannot be written to, which would fail the test.
22 * See: https://lists.gnu.org/archive/html/qemu-devel/2026-02/msg07025.html
23 */
24 -static void vcpu_init_cb(unsigned int vcpu_index)
24 +static void vcpu_init_cb(unsigned int vcpu_index, void *userdata)
25 {
26 g_autoptr(GArray) regs = qemu_plugin_get_registers();
27 g_assert(regs != NULL);
@@ -74,6 +74,6 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
74 const qemu_info_t *info,
75 int argc, char **argv)
76 {
77 - qemu_plugin_register_vcpu_init_cb(id, vcpu_init_cb);
77 + qemu_plugin_register_vcpu_init_cb(id, vcpu_init_cb, NULL);
78 return 0;
79 }