aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmilio Cota <cota@braap.org>2023-01-24 18:01:24 +0000
committerAlex Bennée <alex.bennee@linaro.org>2023-02-02 11:48:20 +0000
commit0f92d94ae37952ed3e6771bc429de4b739eb6ca3 (patch)
tree92c7bc9c7a40f2c024dbbba6fb31fbd750c485b3
parent3fd62e73ad8193b58a1bc15ad6f6d8b4f284f6a7 (diff)
downloadqemu-0f92d94ae37952ed3e6771bc429de4b739eb6ca3.zip
qemu-0f92d94ae37952ed3e6771bc429de4b739eb6ca3.tar.gz
qemu-0f92d94ae37952ed3e6771bc429de4b739eb6ca3.tar.bz2
translator: always pair plugin_gen_insn_{start, end} calls
Related: #1381 Signed-off-by: Emilio Cota <cota@braap.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20230108164731.61469-3-cota@braap.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20230124180127.1881110-33-alex.bennee@linaro.org>
-rw-r--r--accel/tcg/translator.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
index 0615196..ef5193c 100644
--- a/accel/tcg/translator.c
+++ b/accel/tcg/translator.c
@@ -100,19 +100,24 @@ void translator_loop(CPUState *cpu, TranslationBlock *tb, int max_insns,
ops->translate_insn(db, cpu);
}
- /* Stop translation if translate_insn so indicated. */
- if (db->is_jmp != DISAS_NEXT) {
- break;
- }
-
/*
* We can't instrument after instructions that change control
* flow although this only really affects post-load operations.
+ *
+ * Calling plugin_gen_insn_end() before we possibly stop translation
+ * is important. Even if this ends up as dead code, plugin generation
+ * needs to see a matching plugin_gen_insn_{start,end}() pair in order
+ * to accurately track instrumented helpers that might access memory.
*/
if (plugin_enabled) {
plugin_gen_insn_end();
}
+ /* Stop translation if translate_insn so indicated. */
+ if (db->is_jmp != DISAS_NEXT) {
+ break;
+ }
+
/* Stop translation if the output buffer is full,
or we have executed all of the allowed instructions. */
if (tcg_op_buf_full() || db->num_insns >= db->max_insns) {