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>
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -89,7 +89,6 @@ static void plugin_vcpu_cb__simple(CPUState *cpu, enum qemu_plugin_event ev)
|
||||
struct qemu_plugin_cb *cb, *next;
|
||||
|
||||
switch (ev) {
|
||||
case QEMU_PLUGIN_EV_VCPU_INIT:
|
||||
case QEMU_PLUGIN_EV_VCPU_EXIT:
|
||||
case QEMU_PLUGIN_EV_VCPU_IDLE:
|
||||
case QEMU_PLUGIN_EV_VCPU_RESUME:
|
||||
@@ -104,6 +103,28 @@ static void plugin_vcpu_cb__simple(CPUState *cpu, enum qemu_plugin_event ev)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Disable CFI checks.
|
||||
* The callback function has been loaded from an external library so we do not
|
||||
* have type information
|
||||
*/
|
||||
QEMU_DISABLE_CFI
|
||||
static void plugin_vcpu_cb__udata(CPUState *cpu, enum qemu_plugin_event ev)
|
||||
{
|
||||
struct qemu_plugin_cb *cb, *next;
|
||||
|
||||
switch (ev) {
|
||||
case QEMU_PLUGIN_EV_VCPU_INIT:
|
||||
QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
|
||||
qemu_plugin_vcpu_udata_cb_t func = cb->f.vcpu_udata;
|
||||
func(cpu->cpu_index, cb->udata);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Disable CFI checks.
|
||||
* The callback function has been loaded from an external library so we do not
|
||||
@@ -271,7 +292,7 @@ static void qemu_plugin_vcpu_init__async(CPUState *cpu, run_on_cpu_data unused)
|
||||
qemu_rec_mutex_unlock(&plugin.lock);
|
||||
|
||||
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_RW_REGS);
|
||||
plugin_vcpu_cb__simple(cpu, QEMU_PLUGIN_EV_VCPU_INIT);
|
||||
plugin_vcpu_cb__udata(cpu, QEMU_PLUGIN_EV_VCPU_INIT);
|
||||
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_NO_REGS);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user