All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: qemu-devel@nongnu.org
Cc: fam@euphon.net, berrange@redhat.com, stefanha@redhat.com,
	crosa@redhat.com, aaron@os.amperecomputing.com,
	robhenry@microsoft.com, f4bug@amsat.org,
	mahmoudabdalghany@outlook.com, minyihh@uci.edu, cota@braap.org,
	"Ivanov Arkady" <arkadiy.ivanov@ispras.ru>,
	Luke.Craig@ll.mit.edu, pbonzini@redhat.com,
	kuhn.chenqun@huawei.com, ma.mandourr@gmail.com,
	"Alexandre Iooss" <erdnaxe@crans.org>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	aurelien@aurel32.net
Subject: [PATCH  v2 21/25] contrib/plugins: add a drcov plugin
Date: Tue,  1 Feb 2022 18:20:46 +0000	[thread overview]
Message-ID: <20220201182050.15087-22-alex.bennee@linaro.org> (raw)
In-Reply-To: <20220201182050.15087-1-alex.bennee@linaro.org>

From: Ivanov Arkady <arkadiy.ivanov@ispras.ru>

This patch adds the ability to generate files in drcov format. Primary
goal this script is to have coverage logfiles thatwork in Lighthouse.

Signed-off-by: Ivanov Arkady <arkadiy.ivanov@ispras.ru>
Message-Id: <163491884553.304355.13246023070235438959.stgit@pc-System-Product-Name>
[AJB: use g_ptr_array instead of slist]
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20220124201608.604599-19-alex.bennee@linaro.org>
---
 contrib/plugins/drcov.c  | 163 +++++++++++++++++++++++++++++++++++++++
 contrib/plugins/Makefile |   1 +
 2 files changed, 164 insertions(+)
 create mode 100644 contrib/plugins/drcov.c

diff --git a/contrib/plugins/drcov.c b/contrib/plugins/drcov.c
new file mode 100644
index 0000000000..b4a855adaf
--- /dev/null
+++ b/contrib/plugins/drcov.c
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2021, Ivanov Arkady <arkadiy.ivanov@ispras.ru>
+ *
+ * Drcov - a DynamoRIO-based tool that collects coverage information
+ * from a binary. Primary goal this script is to have coverage log
+ * files that work in Lighthouse.
+ *
+ * License: GNU GPL, version 2 or later.
+ *   See the COPYING file in the top-level directory.
+ */
+
+#include <inttypes.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <inttypes.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <glib.h>
+
+#include <qemu-plugin.h>
+
+QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
+
+static char header[] = "DRCOV VERSION: 2\n"
+                "DRCOV FLAVOR: drcov-64\n"
+                "Module Table: version 2, count 1\n"
+                "Columns: id, base, end, entry, path\n";
+
+static FILE *fp;
+static const char *file_name = "file.drcov.trace";
+static GMutex lock;
+
+typedef struct {
+    uint32_t start;
+    uint16_t size;
+    uint16_t mod_id;
+    bool     exec;
+} bb_entry_t;
+
+/* Translated blocks */
+static GPtrArray *blocks;
+
+static void printf_header(unsigned long count)
+{
+    fprintf(fp, "%s", header);
+    const char *path = qemu_plugin_path_to_binary();
+    uint64_t start_code = qemu_plugin_start_code();
+    uint64_t end_code = qemu_plugin_end_code();
+    uint64_t entry = qemu_plugin_entry_code();
+    fprintf(fp, "0, 0x%lx, 0x%lx, 0x%lx, %s\n",
+            start_code, end_code, entry, path);
+    fprintf(fp, "BB Table: %ld bbs\n", count);
+}
+
+static void printf_char_array32(uint32_t data)
+{
+    const uint8_t *bytes = (const uint8_t *)(&data);
+    fwrite(bytes, sizeof(char), sizeof(data), fp);
+}
+
+static void printf_char_array16(uint16_t data)
+{
+    const uint8_t *bytes = (const uint8_t *)(&data);
+    fwrite(bytes, sizeof(char), sizeof(data), fp);
+}
+
+
+static void printf_el(gpointer data, gpointer user_data)
+{
+    bb_entry_t *bb = (bb_entry_t *)data;
+    if (bb->exec) {
+        printf_char_array32(bb->start);
+        printf_char_array16(bb->size);
+        printf_char_array16(bb->mod_id);
+    }
+    g_free(bb);
+}
+
+static void count_block(gpointer data, gpointer user_data)
+{
+    unsigned long *count = (unsigned long *) user_data;
+    bb_entry_t *bb = (bb_entry_t *)data;
+    if (bb->exec) {
+        *count = *count + 1;
+    }
+}
+
+static void plugin_exit(qemu_plugin_id_t id, void *p)
+{
+    unsigned long count = 0;
+    g_mutex_lock(&lock);
+    g_ptr_array_foreach(blocks, count_block, &count);
+
+    /* Print function */
+    printf_header(count);
+    g_ptr_array_foreach(blocks, printf_el, NULL);
+
+    /* Clear */
+    g_ptr_array_free(blocks, true);
+
+    fclose(fp);
+
+    g_mutex_unlock(&lock);
+}
+
+static void plugin_init(void)
+{
+    fp = fopen(file_name, "wb");
+    blocks = g_ptr_array_sized_new(128);
+}
+
+static void vcpu_tb_exec(unsigned int cpu_index, void *udata)
+{
+    bb_entry_t *bb = (bb_entry_t *) udata;
+
+    g_mutex_lock(&lock);
+    bb->exec = true;
+    g_mutex_unlock(&lock);
+}
+
+static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
+{
+    uint64_t pc = qemu_plugin_tb_vaddr(tb);
+    size_t n = qemu_plugin_tb_n_insns(tb);
+
+    g_mutex_lock(&lock);
+
+    bb_entry_t *bb = g_new0(bb_entry_t, 1);
+    for (int i = 0; i < n; i++) {
+        bb->size += qemu_plugin_insn_size(qemu_plugin_tb_get_insn(tb, i));
+    }
+
+    bb->start = pc;
+    bb->mod_id = 0;
+    bb->exec = false;
+    g_ptr_array_add(blocks, bb);
+
+    g_mutex_unlock(&lock);
+    qemu_plugin_register_vcpu_tb_exec_cb(tb, vcpu_tb_exec,
+                                         QEMU_PLUGIN_CB_NO_REGS,
+                                         (void *)bb);
+
+}
+
+QEMU_PLUGIN_EXPORT
+int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info,
+                        int argc, char **argv)
+{
+    for (int i = 0; i < argc; i++) {
+        g_autofree char **tokens = g_strsplit(argv[i], "=", 2);
+        if (g_strcmp0(tokens[0], "filename") == 0) {
+            file_name = g_strdup(tokens[1]);
+        }
+    }
+
+    plugin_init();
+
+    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/contrib/plugins/Makefile b/contrib/plugins/Makefile
index 54ac5ccd9f..df3499f4f2 100644
--- a/contrib/plugins/Makefile
+++ b/contrib/plugins/Makefile
@@ -20,6 +20,7 @@ NAMES += howvec
 NAMES += lockstep
 NAMES += hwprofile
 NAMES += cache
+NAMES += drcov
 
 SONAMES := $(addsuffix .so,$(addprefix lib,$(NAMES)))
 
-- 
2.30.2



  parent reply	other threads:[~2022-02-01 22:23 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-01 18:20 [PATCH v2 00/25] testing and plugin updates Alex Bennée
2022-02-01 18:20 ` [PATCH v2 01/25] tests/Makefile.include: clean-up old code Alex Bennée
2022-02-01 18:20 ` [PATCH v2 02/25] tests/qtest: enable more vhost-user tests by default Alex Bennée
2022-02-01 18:20 ` [PATCH v2 03/25] Makefile: also remove .gcno files when cleaning Alex Bennée
2022-02-01 18:20 ` [PATCH v2 04/25] .gitignore: add .gcov pattern Alex Bennée
2022-02-01 18:20 ` [PATCH v2 05/25] MAINTAINERS: Cover lcitool submodule with build test / automation Alex Bennée
2022-02-01 18:20 ` [PATCH v2 06/25] gitmodules: Correct libvirt-ci submodule URL Alex Bennée
2022-02-01 18:20 ` [PATCH v2 07/25] tests/lcitool: Include local qemu.yml when refreshing cirrus-ci files Alex Bennée
2022-02-01 18:20 ` [PATCH v2 08/25] drop libxml2 checks since libxml is not actually used (for parallels) Alex Bennée
2022-02-01 18:20 ` [PATCH v2 09/25] tests/lcitool: Refresh submodule and remove libxml2 Alex Bennée
2022-02-01 18:20 ` [PATCH v2 10/25] tests: Manually remove libxml2 on MSYS2 runners Alex Bennée
2022-02-01 18:20 ` [PATCH v2 11/25] tests/lcitool: Install libibumad to cover RDMA on Debian based distros Alex Bennée
2022-02-01 18:20 ` [PATCH v2 12/25] docs/devel: mention our .editorconfig Alex Bennée
2022-02-02  1:18   ` Philippe Mathieu-Daudé via
2022-02-01 18:20 ` [PATCH v2 13/25] gitlab: fall back to commit hash in qemu-setup filename Alex Bennée
2022-02-01 18:20 ` [PATCH v2 14/25] tests/lcitool: Allow lcitool-refresh in out-of-tree builds, too Alex Bennée
2022-02-02  1:19   ` Philippe Mathieu-Daudé via
2022-02-01 18:20 ` [PATCH v2 15/25] block: fix FreeBSD build failure with fallocate Alex Bennée
2022-02-01 19:52   ` Kevin Wolf
2022-02-01 18:20 ` [PATCH v2 16/25] docs: remove references to TCG tracing Alex Bennée
2022-02-01 18:20 ` [PATCH v2 17/25] tracing: remove TCG memory access tracing Alex Bennée
2022-02-02  1:21   ` Philippe Mathieu-Daudé via
2022-02-01 18:20 ` [PATCH v2 18/25] tracing: remove the trace-tcg includes from the build Alex Bennée
2022-02-01 18:20 ` [PATCH v2 19/25] tracing: excise the tcg related from tracetool Alex Bennée
2022-02-01 18:20 ` [PATCH v2 20/25] plugins: add helper functions for coverage plugins Alex Bennée
2022-02-01 18:20 ` Alex Bennée [this message]
2022-02-01 18:20 ` [PATCH v2 22/25] tests/plugin: allow libinsn.so per-CPU counts Alex Bennée
2022-02-01 18:20 ` [PATCH v2 23/25] tests/plugins: add instruction matching to libinsn.so Alex Bennée
2022-02-01 18:20 ` [PATCH v2 24/25] target/i386: use CPU_LOG_INT for IRQ servicing Alex Bennée
2022-02-01 18:20 ` [PATCH v2 25/25] plugins: move reset of plugin data to tb_start Alex Bennée

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220201182050.15087-22-alex.bennee@linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=Luke.Craig@ll.mit.edu \
    --cc=aaron@os.amperecomputing.com \
    --cc=arkadiy.ivanov@ispras.ru \
    --cc=aurelien@aurel32.net \
    --cc=berrange@redhat.com \
    --cc=cota@braap.org \
    --cc=crosa@redhat.com \
    --cc=erdnaxe@crans.org \
    --cc=f4bug@amsat.org \
    --cc=fam@euphon.net \
    --cc=kuhn.chenqun@huawei.com \
    --cc=ma.mandourr@gmail.com \
    --cc=mahmoudabdalghany@outlook.com \
    --cc=minyihh@uci.edu \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=robhenry@microsoft.com \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.