Emilio G. Cota <c...@braap.org> writes:
> 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 ++++++++++++++ So I think we need to be putting these somewhere else and also building the examples by default. As plugins only make sense with tcg guests maybe a layout like: tcg/plugins/plugin.c tcg/plugins/examples/ > 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 > > diff --git a/plugin-examples/bbcount_avgsize_racy.c > b/plugin-examples/bbcount_avgsize_racy.c > new file mode 100644 > index 0000000000..ccdf96c1fa > --- /dev/null > +++ b/plugin-examples/bbcount_avgsize_racy.c > @@ -0,0 +1,50 @@ > +#include <inttypes.h> > +#include <assert.h> > +#include <stdlib.h> > +#include <string.h> > +#include <unistd.h> > +#include <stdio.h> > + > +#include <qemu-plugin.h> -#include <qemu-plugin.h> +#include <plugin-api.h> > + > +static uint64_t bb_count; > +static uint64_t insn_count; > +const char *filename; > +static int stdout_fd; > + > +static void plugin_exit(qemu_plugin_id_t id, void *p) > +{ > + dprintf(stdout_fd, "insns: %" PRIu64", bb: %" PRIu64 ", " > + "avg insns/bb: %.2f\n", > + insn_count, bb_count, (double)insn_count / bb_count); > +} > + > +static void vcpu_tb_exec(unsigned int cpu_index, void *udata) > +{ > + unsigned long n_insns = (unsigned long)udata; > + > + insn_count += n_insns; > + bb_count++; > +} > + > +static void vcpu_tb_trans(qemu_plugin_id_t id, unsigned int cpu_index, > + struct qemu_plugin_tb *tb) > +{ > + unsigned long n_insns = qemu_plugin_tb_n_insns(tb); > + > + qemu_plugin_register_vcpu_tb_exec_cb(tb, vcpu_tb_exec, > + QEMU_PLUGIN_CB_NO_REGS, > + (void *)n_insns); > +} > + > +QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id, int argc, > + char **argv) > +{ > + /* 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; > +} > 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> -#include <qemu-plugin.h> +#include <plugin-api.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; > +} > diff --git a/plugin-examples/Makefile b/plugin-examples/Makefile > new file mode 100644 > index 0000000000..71bbcda7a8 > --- /dev/null > +++ b/plugin-examples/Makefile > @@ -0,0 +1,31 @@ > +NAMES := > +NAMES += bbcount_avgsize_racy > +NAMES += mem_count_racy_both > + > +SONAMES := $(addsuffix .so,$(addprefix lib,$(NAMES))) > + > +# QEMU installed path, set by --prefix during configure > +QEMU_PATH ?= /data/src/qemu-inst/plugin-test I guess we should use SRC_PATH (or maybe QEMU_SRC_PATH) if we want the Makefile to be both invoked as a sub-make from a normal QEMU build and to be used as an example for out-of-tree builds. > + > +CC := gcc > +CFLAGS := > +CFLAGS += -O2 -Werror -Wall > +CFLAGS += -Wundef -Wwrite-strings -Wmissing-prototypes > +CFLAGS += -Wstrict-prototypes -Wredundant-decls > +CFLAGS += -fno-strict-aliasing -fno-common -fwrapv > +CFLAGS += -I$(QEMU_PATH)/include -CFLAGS += -I$(QEMU_PATH)/include +CFLAGS += -I$(QEMU_PATH)/include/qemu -- Alex Bennée