diff options
author | Emilio Cota <cota@braap.org> | 2023-01-24 18:01:24 +0000 |
---|---|---|
committer | Alex Bennée <alex.bennee@linaro.org> | 2023-02-02 11:48:20 +0000 |
commit | 0f92d94ae37952ed3e6771bc429de4b739eb6ca3 (patch) | |
tree | 92c7bc9c7a40f2c024dbbba6fb31fbd750c485b3 /accel | |
parent | 3fd62e73ad8193b58a1bc15ad6f6d8b4f284f6a7 (diff) |
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>
Diffstat (limited to 'accel')
-rw-r--r-- | accel/tcg/translator.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c index 061519691f..ef5193c67e 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) { |