diff mbox series

[v1,25/28] plugins: add helper functions for coverage plugins

Message ID 20211026102234.3961636-26-alex.bennee@linaro.org
State Superseded
Headers show
Series testing, plugins and gdbstub for 6.2 | expand

Commit Message

Alex Bennée Oct. 26, 2021, 10:22 a.m. UTC
From: Ivanov Arkady <arkadiy.ivanov@ispras.ru>

Which provide information about:
- start_code.
- end_code.
- entry.
- path to the executable binary.

Signed-off-by: Ivanov Arkady <arkadiy.ivanov@ispras.ru>
Message-Id: <163491883461.304355.8210754161847179432.stgit@pc-System-Product-Name>
[AJB: reword title, better descriptions, defaults, rm export, fix include]
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 include/qemu/qemu-plugin.h   | 34 ++++++++++++++++++++++++++
 plugins/api.c                | 46 ++++++++++++++++++++++++++++++++++++
 plugins/qemu-plugins.symbols |  4 ++++
 3 files changed, 84 insertions(+)

-- 
2.30.2

Comments

Richard Henderson Oct. 26, 2021, 8:25 p.m. UTC | #1
On 10/26/21 3:22 AM, Alex Bennée wrote:
> +#else

> +#include "qemu.h"

> +#include "loader.h"


There is no bsd-user/loader.h.


r~
Warner Losh Oct. 27, 2021, 4:09 p.m. UTC | #2
> On Oct 26, 2021, at 2:25 PM, Richard Henderson <richard.henderson@linaro.org> wrote:

> 

> On 10/26/21 3:22 AM, Alex Bennée wrote:

>> +#else

>> +#include "qemu.h"

>> +#include "loader.h"

> 

> There is no bsd-user/loader.h.


Should there be?

Warner


> r~

>
Richard Henderson Oct. 27, 2021, 6:58 p.m. UTC | #3
On 10/27/21 9:09 AM, Warner Losh wrote:
> 

> 

>> On Oct 26, 2021, at 2:25 PM, Richard Henderson <richard.henderson@linaro.org> wrote:

>>

>> On 10/26/21 3:22 AM, Alex Bennée wrote:

>>> +#else

>>> +#include "qemu.h"

>>> +#include "loader.h"

>>

>> There is no bsd-user/loader.h.

> 

> Should there be?


Probably.  It came with Peter's cleanup of linux-user/qemu.h at 
3ad0a76928df01726e5872b8530d8e1eaa1a971d.

What I meant with my over-terse response is that Alex's patch is incomplete and cannot be 
applied as-is.

I think we should introduce a new header for sharing these new functions with plugins/. 
Perhaps something shared, in include/user/.


r~
Warner Losh Oct. 28, 2021, 5:09 p.m. UTC | #4
On Wed, Oct 27, 2021 at 12:58 PM Richard Henderson <
richard.henderson@linaro.org> wrote:

> On 10/27/21 9:09 AM, Warner Losh wrote:

> >

> >

> >> On Oct 26, 2021, at 2:25 PM, Richard Henderson <

> richard.henderson@linaro.org> wrote:

> >>

> >> On 10/26/21 3:22 AM, Alex Bennée wrote:

> >>> +#else

> >>> +#include "qemu.h"

> >>> +#include "loader.h"

> >>

> >> There is no bsd-user/loader.h.

> >

> > Should there be?

>

> Probably.  It came with Peter's cleanup of linux-user/qemu.h at

> 3ad0a76928df01726e5872b8530d8e1eaa1a971d.

>

> What I meant with my over-terse response is that Alex's patch is

> incomplete and cannot be

> applied as-is.

>

> I think we should introduce a new header for sharing these new functions

> with plugins/.

> Perhaps something shared, in include/user/.

>


I like that idea. I think there'd need to be some level of effort to rework
bsd-user
to use a common header (though if it's just the header, not much). What's
harder
is sharing the bulk of the ELF loading code because it's the same
everywhere.
Or I should, sadly, say mostly the same everywhere but the 'mostly' can be
worked out w/o a huge amount of fuss.

Warner
<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Oct 27, 2021 at 12:58 PM Richard Henderson &lt;<a href="mailto:richard.henderson@linaro.org">richard.henderson@linaro.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 10/27/21 9:09 AM, Warner Losh wrote:<br>
&gt; <br>
&gt; <br>
&gt;&gt; On Oct 26, 2021, at 2:25 PM, Richard Henderson &lt;<a href="mailto:richard.henderson@linaro.org" target="_blank">richard.henderson@linaro.org</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; On 10/26/21 3:22 AM, Alex Bennée wrote:<br>
&gt;&gt;&gt; +#else<br>
&gt;&gt;&gt; +#include &quot;qemu.h&quot;<br>
&gt;&gt;&gt; +#include &quot;loader.h&quot;<br>
&gt;&gt;<br>
&gt;&gt; There is no bsd-user/loader.h.<br>
&gt; <br>
&gt; Should there be?<br>
<br>
Probably.  It came with Peter&#39;s cleanup of linux-user/qemu.h at <br>
3ad0a76928df01726e5872b8530d8e1eaa1a971d.<br>
<br>
What I meant with my over-terse response is that Alex&#39;s patch is incomplete and cannot be <br>
applied as-is.<br>
<br>
I think we should introduce a new header for sharing these new functions with plugins/. <br>
Perhaps something shared, in include/user/.<br></blockquote><div><br></div><div>I like that idea. I think there&#39;d need to be some level of effort to rework bsd-user</div><div>to use a common header (though if it&#39;s just the header, not much). What&#39;s harder</div><div>is sharing the bulk of the ELF loading code because it&#39;s the same everywhere.</div><div>Or I should, sadly, say mostly the same everywhere but the &#39;mostly&#39; can be</div><div>worked out w/o a huge amount of fuss.</div><div><br></div><div>Warner</div></div></div>
diff mbox series

Patch

diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h
index 5f1017201f..535ddbf0ae 100644
--- a/include/qemu/qemu-plugin.h
+++ b/include/qemu/qemu-plugin.h
@@ -590,4 +590,38 @@  void qemu_plugin_outs(const char *string);
  */
 bool qemu_plugin_bool_parse(const char *name, const char *val, bool *ret);
 
+/**
+ * qemu_plugin_path_to_binary() - path to binary file being executed
+ *
+ * Return a string representing the path to the binary. For user-mode
+ * this is the main executable. For system emulation we currently
+ * return NULL. The user should g_free() the string once no longer
+ * needed.
+ */
+const char *qemu_plugin_path_to_binary(void);
+
+/**
+ * qemu_plugin_start_code() - returns start of text segment
+ *
+ * Returns the nominal start address of the main text segment in
+ * user-mode. Currently returns 0 for system emulation.
+ */
+uint64_t qemu_plugin_start_code(void);
+
+/**
+ * qemu_plugin_end_code() - returns end of text segment
+ *
+ * Returns the nominal end address of the main text segment in
+ * user-mode. Currently returns 0 for system emulation.
+ */
+uint64_t qemu_plugin_end_code(void);
+
+/**
+ * qemu_plugin_entry_code() - returns start address for module
+ *
+ * Returns the nominal entry address of the main text segment in
+ * user-mode. Currently returns 0 for system emulation.
+ */
+uint64_t qemu_plugin_entry_code(void);
+
 #endif /* QEMU_PLUGIN_API_H */
diff --git a/plugins/api.c b/plugins/api.c
index b143b09ce9..e6a2c9dde3 100644
--- a/plugins/api.c
+++ b/plugins/api.c
@@ -44,6 +44,9 @@ 
 #ifndef CONFIG_USER_ONLY
 #include "qemu/plugin-memory.h"
 #include "hw/boards.h"
+#else
+#include "qemu.h"
+#include "loader.h"
 #endif
 
 /* Uninstall and Reset handlers */
@@ -391,3 +394,46 @@  bool qemu_plugin_bool_parse(const char *name, const char *value, bool *ret)
 {
     return name && value && qapi_bool_parse(name, value, ret, NULL);
 }
+
+/*
+ * Binary path, start and end locations
+ */
+const char *qemu_plugin_path_to_binary(void)
+{
+    char *path = NULL;
+#ifdef CONFIG_USER_ONLY
+    TaskState *ts = (TaskState *) current_cpu->opaque;
+    path = g_strdup(ts->bprm->filename);
+#endif
+    return path;
+}
+
+uint64_t qemu_plugin_start_code(void)
+{
+    uint64_t start = 0;
+#ifdef CONFIG_USER_ONLY
+    TaskState *ts = (TaskState *) current_cpu->opaque;
+    start = ts->info->start_code;
+#endif
+    return start;
+}
+
+uint64_t qemu_plugin_end_code(void)
+{
+    uint64_t end = 0;
+#ifdef CONFIG_USER_ONLY
+    TaskState *ts = (TaskState *) current_cpu->opaque;
+    end = ts->info->end_code;
+#endif
+    return end;
+}
+
+uint64_t qemu_plugin_entry_code(void)
+{
+    uint64_t entry = 0;
+#ifdef CONFIG_USER_ONLY
+    TaskState *ts = (TaskState *) current_cpu->opaque;
+    entry = ts->info->entry;
+#endif
+    return entry;
+}
diff --git a/plugins/qemu-plugins.symbols b/plugins/qemu-plugins.symbols
index 4834756ba3..71f6c90549 100644
--- a/plugins/qemu-plugins.symbols
+++ b/plugins/qemu-plugins.symbols
@@ -1,5 +1,7 @@ 
 {
   qemu_plugin_bool_parse;
+  qemu_plugin_end_code;
+  qemu_plugin_entry_code;
   qemu_plugin_get_hwaddr;
   qemu_plugin_hwaddr_device_name;
   qemu_plugin_hwaddr_is_io;
@@ -17,6 +19,7 @@ 
   qemu_plugin_n_max_vcpus;
   qemu_plugin_n_vcpus;
   qemu_plugin_outs;
+  qemu_plugin_path_to_binary;
   qemu_plugin_register_atexit_cb;
   qemu_plugin_register_flush_cb;
   qemu_plugin_register_vcpu_exit_cb;
@@ -33,6 +36,7 @@ 
   qemu_plugin_register_vcpu_tb_exec_inline;
   qemu_plugin_register_vcpu_tb_trans_cb;
   qemu_plugin_reset;
+  qemu_plugin_start_code;
   qemu_plugin_tb_get_insn;
   qemu_plugin_tb_n_insns;
   qemu_plugin_tb_vaddr;