plugins: add API for registering discontinuity callbacks

The plugin API allows registration of callbacks for a variety of VCPU
related events, such as VCPU reset, idle and resume. In addition to
those events, we recently defined discontinuity events, which include
traps.

This change introduces a function to register callbacks for these
events. We define one distinct plugin event type for each type of
discontinuity, granting fine control to plugins in term of which events
they receive.

Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Julian Ganz <neither@nut.email>
Message-ID: <20251027110344.2289945-9-alex.bennee@linaro.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
This commit is contained in:
Julian Ganz 2025-10-27 11:03:15 +00:00 committed by Alex Bennée
parent a8b477239e
commit aac73d85d2
3 changed files with 34 additions and 0 deletions

View file

@ -20,6 +20,9 @@ enum qemu_plugin_event {
QEMU_PLUGIN_EV_VCPU_SYSCALL_RET,
QEMU_PLUGIN_EV_FLUSH,
QEMU_PLUGIN_EV_ATEXIT,
QEMU_PLUGIN_EV_VCPU_INTERRUPT,
QEMU_PLUGIN_EV_VCPU_EXCEPTION,
QEMU_PLUGIN_EV_VCPU_HOSTCALL,
QEMU_PLUGIN_EV_MAX, /* total number of plugin events we support */
};

View file

@ -281,6 +281,22 @@ QEMU_PLUGIN_API
void qemu_plugin_register_vcpu_resume_cb(qemu_plugin_id_t id,
qemu_plugin_vcpu_simple_cb_t cb);
/**
* qemu_plugin_register_vcpu_discon_cb() - register a discontinuity callback
* @id: plugin ID
* @type: types of discontinuities for which to call the callback
* @cb: callback function
*
* 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.
* Preparation entails updating the PC, usually to some interrupt handler or
* trap vector entry.
*/
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);
/** struct qemu_plugin_tb - Opaque handle for a translation block */
struct qemu_plugin_tb;
/** struct qemu_plugin_insn - Opaque handle for a translated instruction */

View file

@ -569,6 +569,21 @@ void qemu_plugin_register_vcpu_resume_cb(qemu_plugin_id_t id,
plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_RESUME, cb);
}
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)
{
if (type & QEMU_PLUGIN_DISCON_INTERRUPT) {
plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_INTERRUPT, cb);
}
if (type & QEMU_PLUGIN_DISCON_EXCEPTION) {
plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_EXCEPTION, cb);
}
if (type & QEMU_PLUGIN_DISCON_HOSTCALL) {
plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_HOSTCALL, cb);
}
}
void qemu_plugin_register_flush_cb(qemu_plugin_id_t id,
qemu_plugin_simple_cb_t cb)
{