From: "Alex Bennée" <alex.bennee@linaro.org>
To: peter.maydell@linaro.org
Cc: "Richard Henderson" <richard.henderson@linaro.org>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
qemu-devel@nongnu.org, "Philippe Mathieu-Daudé" <f4bug@amsat.org>
Subject: [PULL 26/28] plugins: move reset of plugin data to tb_start
Date: Wed, 9 Feb 2022 14:15:27 +0000 [thread overview]
Message-ID: <20220209141529.3418384-27-alex.bennee@linaro.org> (raw)
In-Reply-To: <20220209141529.3418384-1-alex.bennee@linaro.org>
We can't always guarantee we get to the end of a translator loop.
Although this can happen for a variety of reasons it does happen more
often on x86 system emulation when an instruction spans across to an
un-faulted page. This caused confusion of the instruction tracking
data resulting in apparent reverse execution (at least from the
plugins point of view).
Fix this by moving the reset code to plugin_gen_tb_start so we always
start with a clean slate.
We unconditionally reset tcg_ctx->plugin_insn as the
plugin_insn_append code uses this as a proxy for knowing if plugins
are enabled for the current instruction. Otherwise we can hit a race
where a previously instrumented thread leaves a stale value after the
main thread exits and disables instrumentation.
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/824
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-Id: <20220204204335.1689602-27-alex.bennee@linaro.org>
diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
index 22d95fe1c3..3d0b101e34 100644
--- a/accel/tcg/plugin-gen.c
+++ b/accel/tcg/plugin-gen.c
@@ -854,10 +854,20 @@ static void plugin_gen_inject(const struct qemu_plugin_tb *plugin_tb)
bool plugin_gen_tb_start(CPUState *cpu, const TranslationBlock *tb, bool mem_only)
{
- struct qemu_plugin_tb *ptb = tcg_ctx->plugin_tb;
bool ret = false;
if (test_bit(QEMU_PLUGIN_EV_VCPU_TB_TRANS, cpu->plugin_mask)) {
+ struct qemu_plugin_tb *ptb = tcg_ctx->plugin_tb;
+ int i;
+
+ /* reset callbacks */
+ for (i = 0; i < PLUGIN_N_CB_SUBTYPES; i++) {
+ if (ptb->cbs[i]) {
+ g_array_set_size(ptb->cbs[i], 0);
+ }
+ }
+ ptb->n = 0;
+
ret = true;
ptb->vaddr = tb->pc;
@@ -868,6 +878,9 @@ bool plugin_gen_tb_start(CPUState *cpu, const TranslationBlock *tb, bool mem_onl
plugin_gen_empty_callback(PLUGIN_GEN_FROM_TB);
}
+
+ tcg_ctx->plugin_insn = NULL;
+
return ret;
}
@@ -904,23 +917,19 @@ void plugin_gen_insn_end(void)
plugin_gen_empty_callback(PLUGIN_GEN_AFTER_INSN);
}
+/*
+ * There are cases where we never get to finalise a translation - for
+ * example a page fault during translation. As a result we shouldn't
+ * do any clean-up here and make sure things are reset in
+ * plugin_gen_tb_start.
+ */
void plugin_gen_tb_end(CPUState *cpu)
{
struct qemu_plugin_tb *ptb = tcg_ctx->plugin_tb;
- int i;
/* collect instrumentation requests */
qemu_plugin_tb_trans_cb(cpu, ptb);
/* inject the instrumentation at the appropriate places */
plugin_gen_inject(ptb);
-
- /* clean up */
- for (i = 0; i < PLUGIN_N_CB_SUBTYPES; i++) {
- if (ptb->cbs[i]) {
- g_array_set_size(ptb->cbs[i], 0);
- }
- }
- ptb->n = 0;
- tcg_ctx->plugin_insn = NULL;
}
--
2.30.2
next prev parent reply other threads:[~2022-02-09 14:58 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-09 14:15 [PULL 00/28] testing and plugin updates Alex Bennée
2022-02-09 14:15 ` [PULL 01/28] tests/Makefile.include: clean-up old code Alex Bennée
2022-02-09 14:15 ` [PULL 02/28] tests/qtest: enable more vhost-user tests by default Alex Bennée
2022-02-09 14:15 ` [PULL 03/28] Makefile: also remove .gcno files when cleaning Alex Bennée
2022-02-09 14:15 ` [PULL 04/28] .gitignore: add .gcov pattern Alex Bennée
2022-02-09 14:15 ` [PULL 05/28] MAINTAINERS: Cover lcitool submodule with build test / automation Alex Bennée
2022-02-09 14:15 ` [PULL 06/28] gitmodules: Correct libvirt-ci submodule URL Alex Bennée
2022-02-09 14:15 ` [PULL 07/28] tests/lcitool: Include local qemu.yml when refreshing cirrus-ci files Alex Bennée
2022-02-09 14:15 ` [PULL 08/28] drop libxml2 checks since libxml is not actually used (for parallels) Alex Bennée
2022-02-09 14:15 ` [PULL 09/28] tests/lcitool: Refresh submodule and remove libxml2 Alex Bennée
2022-02-09 14:15 ` [PULL 10/28] tests: Manually remove libxml2 on MSYS2 runners Alex Bennée
2022-02-09 14:15 ` [PULL 11/28] tests/lcitool: Install libibumad to cover RDMA on Debian based distros Alex Bennée
2022-02-09 14:15 ` [PULL 12/28] docs/devel: mention our .editorconfig Alex Bennée
2022-02-09 14:15 ` [PULL 13/28] gitlab: fall back to commit hash in qemu-setup filename Alex Bennée
2022-02-09 14:15 ` [PULL 14/28] tests/lcitool: Allow lcitool-refresh in out-of-tree builds, too Alex Bennée
2022-02-09 14:15 ` [PULL 15/28] tests: Update CentOS 8 container to CentOS Stream 8 Alex Bennée
2022-02-15 7:49 ` Philippe Mathieu-Daudé via
2022-02-09 14:15 ` [PULL 16/28] tests/tcg/sh4: disable another unreliable test Alex Bennée
2022-02-09 14:15 ` [PULL 17/28] docs: remove references to TCG tracing Alex Bennée
2022-02-09 14:15 ` [PULL 18/28] tracing: remove TCG memory access tracing Alex Bennée
2022-02-09 14:15 ` [PULL 19/28] tracing: remove the trace-tcg includes from the build Alex Bennée
2022-02-09 14:15 ` [PULL 20/28] tracing: excise the tcg related from tracetool Alex Bennée
2022-02-09 14:15 ` [PULL 21/28] plugins: add helper functions for coverage plugins Alex Bennée
2022-02-09 14:15 ` [PULL 22/28] contrib/plugins: add a drcov plugin Alex Bennée
2022-02-09 14:15 ` [PULL 23/28] tests/plugin: allow libinsn.so per-CPU counts Alex Bennée
2022-02-09 14:15 ` [PULL 24/28] tests/plugins: add instruction matching to libinsn.so Alex Bennée
2022-02-09 14:15 ` [PULL 25/28] target/i386: use CPU_LOG_INT for IRQ servicing Alex Bennée
2022-02-09 14:15 ` Alex Bennée [this message]
2022-02-09 14:15 ` [PULL 27/28] linux-user: Remove the deprecated ppc64abi32 target Alex Bennée
2022-02-09 14:15 ` [PULL 28/28] include/exec: fix softmmu version of TARGET_ABI_FMT_lx Alex Bennée
2022-02-12 22:03 ` [PULL 00/28] testing and plugin updates Peter Maydell
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=20220209141529.3418384-27-alex.bennee@linaro.org \
--to=alex.bennee@linaro.org \
--cc=f4bug@amsat.org \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.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).