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);
g_string_append_printf(out, "Executed ~%ld instructions\n", insn_count);
qemu_plugin_outs(out->str);
- plugin_cleanup(id);
+ plugin_cleanup(id, NULL);
}
/*
}
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);
}
}
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;
}
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;
}
* 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
* 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.
*
* 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
/* 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);
}
/*
* 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);
}
}
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;
};
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);
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());
}
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;
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,
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,
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");
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)
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");
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)