aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Borgerson <contact@mborgerson.com>2023-10-09 17:41:01 +0100
committerAlex Bennée <alex.bennee@linaro.org>2023-10-11 08:46:39 +0100
commita392277dcf00e7bf6f7a0ecc9075ea154532c436 (patch)
tree22bc7b4689a1d57106bf97e552357c4ca756c615
parent4f9ef4eebcc366fee20cce55aac659c6913bbf49 (diff)
downloadqemu-a392277dcf00e7bf6f7a0ecc9075ea154532c436.zip
qemu-a392277dcf00e7bf6f7a0ecc9075ea154532c436.tar.gz
qemu-a392277dcf00e7bf6f7a0ecc9075ea154532c436.tar.bz2
plugins: Set final instruction count in plugin_gen_tb_end
Translation logic may partially decode an instruction, then abort and remove the instruction from the TB. This can happen for example when an instruction spans two pages. In this case, plugins may get an incorrect result when calling qemu_plugin_tb_n_insns to query for the number of instructions in the TB. This patch updates plugin_gen_tb_end to set the final instruction count. Signed-off-by: Matt Borgerson <contact@mborgerson.com> [AJB: added g_assert to defed API] Message-Id: <CADc=-s5RwGViNTR-h5cq3np673W3RRFfhr4vCGJp0EoDUxvhog@mail.gmail.com> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20231009164104.369749-23-alex.bennee@linaro.org>
-rw-r--r--accel/tcg/plugin-gen.c6
-rw-r--r--accel/tcg/translator.c2
-rw-r--r--include/exec/plugin-gen.h4
3 files changed, 8 insertions, 4 deletions
diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
index d31c999..39b3c93 100644
--- a/accel/tcg/plugin-gen.c
+++ b/accel/tcg/plugin-gen.c
@@ -866,10 +866,14 @@ void plugin_gen_insn_end(void)
* do any clean-up here and make sure things are reset in
* plugin_gen_tb_start.
*/
-void plugin_gen_tb_end(CPUState *cpu)
+void plugin_gen_tb_end(CPUState *cpu, size_t num_insns)
{
struct qemu_plugin_tb *ptb = tcg_ctx->plugin_tb;
+ /* translator may have removed instructions, update final count */
+ g_assert(num_insns <= ptb->n);
+ ptb->n = num_insns;
+
/* collect instrumentation requests */
qemu_plugin_tb_trans_cb(cpu, ptb);
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
index c5da7b3..575b981 100644
--- a/accel/tcg/translator.c
+++ b/accel/tcg/translator.c
@@ -210,7 +210,7 @@ void translator_loop(CPUState *cpu, TranslationBlock *tb, int *max_insns,
gen_tb_end(tb, cflags, icount_start_insn, db->num_insns);
if (plugin_enabled) {
- plugin_gen_tb_end(cpu);
+ plugin_gen_tb_end(cpu, db->num_insns);
}
/* The disas_log hook may use these values rather than recompute. */
diff --git a/include/exec/plugin-gen.h b/include/exec/plugin-gen.h
index 5282878..c4552b5 100644
--- a/include/exec/plugin-gen.h
+++ b/include/exec/plugin-gen.h
@@ -20,7 +20,7 @@ struct DisasContextBase;
bool plugin_gen_tb_start(CPUState *cpu, const struct DisasContextBase *db,
bool supress);
-void plugin_gen_tb_end(CPUState *cpu);
+void plugin_gen_tb_end(CPUState *cpu, size_t num_insns);
void plugin_gen_insn_start(CPUState *cpu, const struct DisasContextBase *db);
void plugin_gen_insn_end(void);
@@ -42,7 +42,7 @@ void plugin_gen_insn_start(CPUState *cpu, const struct DisasContextBase *db)
static inline void plugin_gen_insn_end(void)
{ }
-static inline void plugin_gen_tb_end(CPUState *cpu)
+static inline void plugin_gen_tb_end(CPUState *cpu, size_t num_insns)
{ }
static inline void plugin_gen_disable_mem_helpers(void)