diff mbox series

[v1,05/12] tests/plugin: expand insn test to detect duplicate instructions

Message ID 20210209182749.31323-6-alex.bennee@linaro.org (mailing list archive)
State New, archived
Headers show
Series fix plugins double counting with mmio, cleanup CF_ flags | expand

Commit Message

Alex Bennée Feb. 9, 2021, 6:27 p.m. UTC
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(-)

Comments

Richard Henderson Feb. 9, 2021, 6:34 p.m. UTC | #1
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~
Alex Bennée Feb. 9, 2021, 8:48 p.m. UTC | #2
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.
diff mbox series

Patch

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));
         }
     }
 }