[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 26/28] plugins: move reset of plugin data to tb_start
From: |
Alex Bennée |
Subject: |
[PULL 26/28] plugins: move reset of plugin data to tb_start |
Date: |
Wed, 9 Feb 2022 14:15:27 +0000 |
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
- [PULL 05/28] MAINTAINERS: Cover lcitool submodule with build test / automation, (continued)
- [PULL 05/28] MAINTAINERS: Cover lcitool submodule with build test / automation, Alex Bennée, 2022/02/09
- [PULL 07/28] tests/lcitool: Include local qemu.yml when refreshing cirrus-ci files, Alex Bennée, 2022/02/09
- [PULL 04/28] .gitignore: add .gcov pattern, Alex Bennée, 2022/02/09
- [PULL 06/28] gitmodules: Correct libvirt-ci submodule URL, Alex Bennée, 2022/02/09
- [PULL 12/28] docs/devel: mention our .editorconfig, Alex Bennée, 2022/02/09
- [PULL 17/28] docs: remove references to TCG tracing, Alex Bennée, 2022/02/09
- [PULL 08/28] drop libxml2 checks since libxml is not actually used (for parallels), Alex Bennée, 2022/02/09
- [PULL 11/28] tests/lcitool: Install libibumad to cover RDMA on Debian based distros, Alex Bennée, 2022/02/09
- [PULL 10/28] tests: Manually remove libxml2 on MSYS2 runners, Alex Bennée, 2022/02/09
- [PULL 21/28] plugins: add helper functions for coverage plugins, Alex Bennée, 2022/02/09
- [PULL 26/28] plugins: move reset of plugin data to tb_start,
Alex Bennée <=
- [PULL 15/28] tests: Update CentOS 8 container to CentOS Stream 8, Alex Bennée, 2022/02/09
- [PULL 19/28] tracing: remove the trace-tcg includes from the build, Alex Bennée, 2022/02/09
- [PULL 28/28] include/exec: fix softmmu version of TARGET_ABI_FMT_lx, Alex Bennée, 2022/02/09
- [PULL 27/28] linux-user: Remove the deprecated ppc64abi32 target, Alex Bennée, 2022/02/09
- [PULL 16/28] tests/tcg/sh4: disable another unreliable test, Alex Bennée, 2022/02/09
- [PULL 20/28] tracing: excise the tcg related from tracetool, Alex Bennée, 2022/02/09
- [PULL 13/28] gitlab: fall back to commit hash in qemu-setup filename, Alex Bennée, 2022/02/09
- [PULL 18/28] tracing: remove TCG memory access tracing, Alex Bennée, 2022/02/09
- [PULL 25/28] target/i386: use CPU_LOG_INT for IRQ servicing, Alex Bennée, 2022/02/09