> From: Emilio G. Cota [mailto:c...@braap.org] > Signed-off-by: Emilio G. Cota <c...@braap.org> > --- > plugin-examples/bbcount_avgsize_racy.c | 50 ++++++++++++++++++++++ > plugin-examples/mem_count_racy_both.c | 58 ++++++++++++++++++++++++++ > plugin-examples/Makefile | 31 ++++++++++++++ > 3 files changed, 139 insertions(+) > create mode 100644 plugin-examples/bbcount_avgsize_racy.c > create mode 100644 plugin-examples/mem_count_racy_both.c > create mode 100644 plugin-examples/Makefile >
<snip> > diff --git a/plugin-examples/mem_count_racy_both.c > b/plugin-examples/mem_count_racy_both.c > new file mode 100644 > index 0000000000..a47f2025bf > --- /dev/null > +++ b/plugin-examples/mem_count_racy_both.c > @@ -0,0 +1,58 @@ > +#include <inttypes.h> > +#include <assert.h> > +#include <stdlib.h> > +#include <string.h> > +#include <unistd.h> > +#include <stdio.h> > + > +#include <qemu-plugin.h> > + > +static uint64_t mem_count; > +static int stdout_fd; > +static bool do_inline; > + > +static void plugin_exit(qemu_plugin_id_t id, void *p) > +{ > + dprintf(stdout_fd, "accesses: %" PRIu64 "\n", mem_count); > +} > + > +static void vcpu_mem(unsigned int cpu_index, qemu_plugin_meminfo_t meminfo, > + uint64_t vaddr, void *udata) > +{ > + mem_count++; > +} > + > +static void vcpu_tb_trans(qemu_plugin_id_t id, unsigned int cpu_index, > + struct qemu_plugin_tb *tb) > +{ > + size_t n = qemu_plugin_tb_n_insns(tb); > + size_t i; > + > + for (i = 0; i < n; i++) { > + struct qemu_plugin_insn *insn = qemu_plugin_tb_get_insn(tb, i); > + > + if (do_inline) { > + qemu_plugin_register_vcpu_mem_inline(insn, > + QEMU_PLUGIN_INLINE_ADD_U64, > + &mem_count, 1); > + } else { > + qemu_plugin_register_vcpu_mem_cb(insn, vcpu_mem, > + QEMU_PLUGIN_CB_NO_REGS, NULL); > + } > + } > +} > + > +QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id, int argc, > + char **argv) > +{ > + if (argc && strcmp(argv[0], "inline") == 0) { > + do_inline = true; > + } > + /* plugin_exit might write to stdout after stdout has been closed */ > + stdout_fd = dup(STDOUT_FILENO); > + assert(stdout_fd); > + > + qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans); > + qemu_plugin_register_atexit_cb(id, plugin_exit, NULL); > + return 0; > +} Thanks for the series. Can you provide more plugin examples for better understanding of double-translate idea? E.g., plugins that hook specific instructions or addresses. Pavel Dovgalyuk