Skip to content

Commit

Permalink
plugins: Set final instruction count in plugin_gen_tb_end
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
mborgerson authored and stsquad committed Oct 11, 2023
1 parent 4f9ef4e commit a392277
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 4 deletions.
6 changes: 5 additions & 1 deletion accel/tcg/plugin-gen.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion accel/tcg/translator.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
4 changes: 2 additions & 2 deletions include/exec/plugin-gen.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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)
Expand Down

0 comments on commit a392277

Please sign in to comment.