From: "Alex Bennée" <alex.bennee@linaro.org>
To: qemu-devel@nongnu.org
Cc: "Julian Ganz" <neither@nut.email>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Alexandre Iooss" <erdnaxe@crans.org>,
"Mahmoud Mandour" <ma.mandourr@gmail.com>,
"Pierrick Bouvier" <pierrick.bouvier@linaro.org>
Subject: [PULL 09/35] plugins: add hooks for new discontinuity related callbacks
Date: Wed, 29 Oct 2025 15:50:18 +0000 [thread overview]
Message-ID: <20251029155045.257802-10-alex.bennee@linaro.org> (raw)
In-Reply-To: <20251029155045.257802-1-alex.bennee@linaro.org>
From: Julian Ganz <neither@nut.email>
The plugin API allows registration of callbacks for a variety of VCPU
related events, such as VCPU reset, idle and resume. In addition, we
recently introduced API for registering callbacks for discontinuity
events, specifically for interrupts, exceptions and host calls.
This change introduces the corresponding hooks called from target
specific code inside qemu.
Signed-off-by: Julian Ganz <neither@nut.email>
Message-ID: <20251027110344.2289945-10-alex.bennee@linaro.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
diff --git a/include/qemu/plugin.h b/include/qemu/plugin.h
index 8cf20cd96f7..cea0a68858b 100644
--- a/include/qemu/plugin.h
+++ b/include/qemu/plugin.h
@@ -161,6 +161,9 @@ void qemu_plugin_vcpu_exit_hook(CPUState *cpu);
void qemu_plugin_tb_trans_cb(CPUState *cpu, struct qemu_plugin_tb *tb);
void qemu_plugin_vcpu_idle_cb(CPUState *cpu);
void qemu_plugin_vcpu_resume_cb(CPUState *cpu);
+void qemu_plugin_vcpu_interrupt_cb(CPUState *cpu, uint64_t from);
+void qemu_plugin_vcpu_exception_cb(CPUState *cpu, uint64_t from);
+void qemu_plugin_vcpu_hostcall_cb(CPUState *cpu, uint64_t from);
void
qemu_plugin_vcpu_syscall(CPUState *cpu, int64_t num, uint64_t a1,
uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a5,
@@ -258,6 +261,15 @@ static inline void qemu_plugin_vcpu_idle_cb(CPUState *cpu)
static inline void qemu_plugin_vcpu_resume_cb(CPUState *cpu)
{ }
+static inline void qemu_plugin_vcpu_interrupt_cb(CPUState *cpu, uint64_t from)
+{ }
+
+static inline void qemu_plugin_vcpu_exception_cb(CPUState *cpu, uint64_t from)
+{ }
+
+static inline void qemu_plugin_vcpu_hostcall_cb(CPUState *cpu, uint64_t from)
+{ }
+
static inline void
qemu_plugin_vcpu_syscall(CPUState *cpu, int64_t num, uint64_t a1, uint64_t a2,
uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a6,
diff --git a/plugins/core.c b/plugins/core.c
index 40d001d39ad..35a252d2729 100644
--- a/plugins/core.c
+++ b/plugins/core.c
@@ -105,6 +105,30 @@ 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__discon(CPUState *cpu,
+ enum qemu_plugin_event ev,
+ enum qemu_plugin_discon_type type,
+ uint64_t from)
+{
+ struct qemu_plugin_cb *cb, *next;
+ uint64_t to = cpu->cc->get_pc(cpu);
+
+ if (cpu->cpu_index < plugin.num_vcpus) {
+ /* iterate safely; plugins might uninstall themselves at any time */
+ QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
+ qemu_plugin_vcpu_discon_cb_t func = cb->f.vcpu_discon;
+
+ func(cb->ctx->id, cpu->cpu_index, type, from, to);
+ }
+ }
+}
+
/*
* Disable CFI checks.
* The callback function has been loaded from an external library so we do not
@@ -557,6 +581,24 @@ void qemu_plugin_vcpu_resume_cb(CPUState *cpu)
}
}
+void qemu_plugin_vcpu_interrupt_cb(CPUState *cpu, uint64_t from)
+{
+ plugin_vcpu_cb__discon(cpu, QEMU_PLUGIN_EV_VCPU_INTERRUPT,
+ QEMU_PLUGIN_DISCON_INTERRUPT, from);
+}
+
+void qemu_plugin_vcpu_exception_cb(CPUState *cpu, uint64_t from)
+{
+ plugin_vcpu_cb__discon(cpu, QEMU_PLUGIN_EV_VCPU_EXCEPTION,
+ QEMU_PLUGIN_DISCON_EXCEPTION, from);
+}
+
+void qemu_plugin_vcpu_hostcall_cb(CPUState *cpu, uint64_t from)
+{
+ plugin_vcpu_cb__discon(cpu, QEMU_PLUGIN_EV_VCPU_HOSTCALL,
+ QEMU_PLUGIN_DISCON_HOSTCALL, from);
+}
+
void qemu_plugin_register_vcpu_idle_cb(qemu_plugin_id_t id,
qemu_plugin_vcpu_simple_cb_t cb)
{
--
2.47.3
next prev parent reply other threads:[~2025-10-29 15:52 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-29 15:50 [PULL 00/35] maintainer updates (ci, plugins, semihosting) Alex Bennée
2025-10-29 15:50 ` [PULL 01/35] ci: clean-up remaining bits of armhf builds Alex Bennée
2025-10-29 15:50 ` [PULL 02/35] scripts/ci/setup: regenerate yaml Alex Bennée
2025-10-29 15:50 ` [PULL 03/35] scripts/ci: move build-environment.yaml up a level Alex Bennée
2025-10-29 15:50 ` [PULL 04/35] scripts/ci: allow both Ubuntu or Debian to run upgrade Alex Bennée
2025-10-29 15:50 ` [PULL 05/35] tests/lcitool: generate a yaml file for the ppc64le runner Alex Bennée
2025-10-29 15:50 ` [PULL 06/35] scripts/ci: modify gitlab runner deb setup Alex Bennée
2025-10-29 15:50 ` [PULL 07/35] plugins: add types for callbacks related to certain discontinuities Alex Bennée
2025-10-29 15:50 ` [PULL 08/35] plugins: add API for registering discontinuity callbacks Alex Bennée
2025-10-29 15:50 ` Alex Bennée [this message]
2025-10-29 15:50 ` [PULL 10/35] contrib/plugins: add plugin showcasing new dicontinuity related API Alex Bennée
2025-10-29 15:50 ` [PULL 11/35] target/alpha: call plugin trap callbacks Alex Bennée
2025-10-29 15:50 ` [PULL 12/35] target/arm: " Alex Bennée
2025-10-29 15:50 ` [PULL 13/35] target/avr: " Alex Bennée
2025-10-29 15:50 ` [PULL 14/35] target/hppa: " Alex Bennée
2025-10-29 15:50 ` [PULL 15/35] target/i386: " Alex Bennée
2025-10-29 15:50 ` [PULL 16/35] target/loongarch: " Alex Bennée
2025-10-29 15:50 ` [PULL 17/35] target/m68k: " Alex Bennée
2025-10-29 15:50 ` [PULL 18/35] target/microblaze: " Alex Bennée
2025-10-29 15:50 ` [PULL 19/35] target/mips: " Alex Bennée
2025-10-29 15:50 ` [PULL 20/35] target/openrisc: " Alex Bennée
2025-10-29 15:50 ` [PULL 21/35] target/ppc: " Alex Bennée
2025-10-29 15:50 ` [PULL 22/35] target/riscv: " Alex Bennée
2025-10-29 15:50 ` [PULL 23/35] target/rx: " Alex Bennée
2025-10-29 15:50 ` [PULL 24/35] target/s390x: " Alex Bennée
2025-10-29 15:50 ` [PULL 25/35] target/sh4: " Alex Bennée
2025-10-29 15:50 ` [PULL 26/35] target/sparc: " Alex Bennée
2025-10-29 15:50 ` [PULL 27/35] target/tricore: " Alex Bennée
2025-10-29 15:50 ` [PULL 28/35] target/xtensa: " Alex Bennée
2025-10-29 15:50 ` [PULL 29/35] tests: add plugin asserting correctness of discon event's to_pc Alex Bennée
2025-10-29 15:50 ` [PULL 30/35] tests: add test for double-traps on rv64 Alex Bennée
2025-10-29 15:50 ` [PULL 31/35] tests: add test with interrupted memory accesses " Alex Bennée
2025-10-29 15:50 ` [PULL 32/35] plugins/core: add missing QEMU_DISABLE_CFI annotations Alex Bennée
2025-10-29 15:50 ` [PULL 33/35] configs: drop SBSA_REF from minimal specification Alex Bennée
2025-10-29 15:50 ` [PULL 34/35] gdbstub: Fix %s formatting Alex Bennée
2025-10-29 15:50 ` [PULL 35/35] semihosting: Fix GDB File-I/O FLEN Alex Bennée
2025-10-31 9:25 ` [PULL 00/35] maintainer updates (ci, plugins, semihosting) Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251029155045.257802-10-alex.bennee@linaro.org \
--to=alex.bennee@linaro.org \
--cc=erdnaxe@crans.org \
--cc=ma.mandourr@gmail.com \
--cc=neither@nut.email \
--cc=pierrick.bouvier@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).