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
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> + +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> + +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 + +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 +LDLIBS := -lc + +all: $(SONAMES) + +%.o: %.c + $(CC) $(CFLAGS) -fPIC -c $< -o $@ + +lib%.so: %.o + $(CC) -shared -Wl,-soname,$@ -o $@ $^ $(LDLIBS) + +clean: + $(RM) -f *.o *.so + $(RM) -Rf .libs + +.PHONY: all clean -- 2.17.1