Message ID | 20210209182749.31323-6-alex.bennee@linaro.org |
---|---|
State | New |
Headers | show |
Series | fix plugins double counting with mmio, cleanup CF_ flags | expand |
On 2/9/21 10:27 AM, Alex Bennée wrote: > A duplicate insn is one that is appears to be executed twice in a row. > This is currently possible due to -icount and cpu_io_recompile() > causing a re-translation of a block. On it's own this won't trigger > any tests though. > > Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > > --- > [AJB: well not quite, the x86_64 test trips over this due to some > weirdness in the way we handle rep insns, e.g. rep movsb (%esi), > %es:(%edi) in the x86 bios code] Ah, but that's not tcg weirdness, that's architectural weirdness. Multiple executions is how "rep" is supposed to work. r~
Richard Henderson <richard.henderson@linaro.org> writes: > On 2/9/21 10:27 AM, Alex Bennée wrote: >> A duplicate insn is one that is appears to be executed twice in a row. >> This is currently possible due to -icount and cpu_io_recompile() >> causing a re-translation of a block. On it's own this won't trigger >> any tests though. >> >> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> >> >> --- >> [AJB: well not quite, the x86_64 test trips over this due to some >> weirdness in the way we handle rep insns, e.g. rep movsb (%esi), >> %es:(%edi) in the x86 bios code] > > Ah, but that's not tcg weirdness, that's architectural weirdness. Multiple > executions is how "rep" is supposed to work. As the plugin can know the arch I can just disable the test for x86. At the moment it doesn't matter because there is only a test for aarch64. -- Alex Bennée
diff --git a/tests/plugin/insn.c b/tests/plugin/insn.c index a9a6e41237..c253980ec8 100644 --- a/tests/plugin/insn.c +++ b/tests/plugin/insn.c @@ -21,6 +21,14 @@ static bool do_inline; static void vcpu_insn_exec_before(unsigned int cpu_index, void *udata) { + static uint64_t last_pc; + uint64_t this_pc = GPOINTER_TO_UINT(udata); + if (this_pc == last_pc) { + g_autofree gchar *out = g_strdup_printf("detected repeat execution @ 0x%" + PRIx64 "\n", this_pc); + qemu_plugin_outs(out); + } + last_pc = this_pc; insn_count++; } @@ -36,8 +44,10 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb) qemu_plugin_register_vcpu_insn_exec_inline( insn, QEMU_PLUGIN_INLINE_ADD_U64, &insn_count, 1); } else { + uint64_t vaddr = qemu_plugin_insn_vaddr(insn); qemu_plugin_register_vcpu_insn_exec_cb( - insn, vcpu_insn_exec_before, QEMU_PLUGIN_CB_NO_REGS, NULL); + insn, vcpu_insn_exec_before, QEMU_PLUGIN_CB_NO_REGS, + GUINT_TO_POINTER(vaddr)); } } }
A duplicate insn is one that is appears to be executed twice in a row. This is currently possible due to -icount and cpu_io_recompile() causing a re-translation of a block. On it's own this won't trigger any tests though. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> --- [AJB: well not quite, the x86_64 test trips over this due to some weirdness in the way we handle rep insns, e.g. rep movsb (%esi), %es:(%edi) in the x86 bios code] --- tests/plugin/insn.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) -- 2.20.1