mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-09-06 18:05:37 +00:00
tests/plugin: expand insn test to detect duplicate instructions
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. The heuristics that the plugin use can't deal with the x86 rep instruction which (validly) will look like executing the same instruction several times. To avoid problems later we tweak the rules for x86 to run the "inline" version of the plugin. This also has the advantage of increasing coverage of the plugin code (see bugfix in previous commit). Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20210213130325.14781-15-alex.bennee@linaro.org>
This commit is contained in:
parent
eb56afdb15
commit
e025d799af
|
@ -21,6 +21,14 @@ static bool do_inline;
|
||||||
|
|
||||||
static void vcpu_insn_exec_before(unsigned int cpu_index, void *udata)
|
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++;
|
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(
|
qemu_plugin_register_vcpu_insn_exec_inline(
|
||||||
insn, QEMU_PLUGIN_INLINE_ADD_U64, &insn_count, 1);
|
insn, QEMU_PLUGIN_INLINE_ADD_U64, &insn_count, 1);
|
||||||
} else {
|
} else {
|
||||||
|
uint64_t vaddr = qemu_plugin_insn_vaddr(insn);
|
||||||
qemu_plugin_register_vcpu_insn_exec_cb(
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,5 +33,15 @@ EXTRA_RUNS+=$(MULTIARCH_RUNS)
|
||||||
|
|
||||||
memory: CFLAGS+=-DCHECK_UNALIGNED=1
|
memory: CFLAGS+=-DCHECK_UNALIGNED=1
|
||||||
|
|
||||||
|
# non-inline runs will trigger the duplicate instruction heuristics in libinsn.so
|
||||||
|
run-plugin-%-with-libinsn.so:
|
||||||
|
$(call run-test, $@, \
|
||||||
|
$(QEMU) -monitor none -display none \
|
||||||
|
-chardev file$(COMMA)path=$@.out$(COMMA)id=output \
|
||||||
|
-plugin ../../plugin/libinsn.so$(COMMA)arg=inline \
|
||||||
|
-d plugin -D $*-with-libinsn.so.pout \
|
||||||
|
$(QEMU_OPTS) $*, \
|
||||||
|
"$* on $(TARGET_NAME)")
|
||||||
|
|
||||||
# Running
|
# Running
|
||||||
QEMU_OPTS+=-device isa-debugcon,chardev=output -device isa-debug-exit,iobase=0xf4,iosize=0x4 -kernel
|
QEMU_OPTS+=-device isa-debugcon,chardev=output -device isa-debug-exit,iobase=0xf4,iosize=0x4 -kernel
|
||||||
|
|
|
@ -48,6 +48,13 @@ else
|
||||||
SKIP_I386_TESTS+=test-i386-fprem
|
SKIP_I386_TESTS+=test-i386-fprem
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# non-inline runs will trigger the duplicate instruction heuristics in libinsn.so
|
||||||
|
run-plugin-%-with-libinsn.so:
|
||||||
|
$(call run-test, $@, $(QEMU) $(QEMU_OPTS) \
|
||||||
|
-plugin ../../plugin/libinsn.so$(COMMA)arg=inline \
|
||||||
|
-d plugin -D $*-with-libinsn.so.pout $*, \
|
||||||
|
"$* (inline) on $(TARGET_NAME)")
|
||||||
|
|
||||||
# Update TESTS
|
# Update TESTS
|
||||||
I386_TESTS:=$(filter-out $(SKIP_I386_TESTS), $(ALL_X86_TESTS))
|
I386_TESTS:=$(filter-out $(SKIP_I386_TESTS), $(ALL_X86_TESTS))
|
||||||
TESTS=$(MULTIARCH_TESTS) $(I386_TESTS)
|
TESTS=$(MULTIARCH_TESTS) $(I386_TESTS)
|
||||||
|
|
|
@ -33,5 +33,15 @@ EXTRA_RUNS+=$(MULTIARCH_RUNS)
|
||||||
|
|
||||||
memory: CFLAGS+=-DCHECK_UNALIGNED=1
|
memory: CFLAGS+=-DCHECK_UNALIGNED=1
|
||||||
|
|
||||||
|
# non-inline runs will trigger the duplicate instruction heuristics in libinsn.so
|
||||||
|
run-plugin-%-with-libinsn.so:
|
||||||
|
$(call run-test, $@, \
|
||||||
|
$(QEMU) -monitor none -display none \
|
||||||
|
-chardev file$(COMMA)path=$@.out$(COMMA)id=output \
|
||||||
|
-plugin ../../plugin/libinsn.so$(COMMA)arg=inline \
|
||||||
|
-d plugin -D $*-with-libinsn.so.pout \
|
||||||
|
$(QEMU_OPTS) $*, \
|
||||||
|
"$* on $(TARGET_NAME)")
|
||||||
|
|
||||||
# Running
|
# Running
|
||||||
QEMU_OPTS+=-device isa-debugcon,chardev=output -device isa-debug-exit,iobase=0xf4,iosize=0x4 -kernel
|
QEMU_OPTS+=-device isa-debugcon,chardev=output -device isa-debug-exit,iobase=0xf4,iosize=0x4 -kernel
|
||||||
|
|
Loading…
Reference in a new issue