Message ID | 20211026102234.3961636-26-alex.bennee@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | testing, plugins and gdbstub for 6.2 | expand |
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~
> 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~ >
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~
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 <<a href="mailto:richard.henderson@linaro.org">richard.henderson@linaro.org</a>> 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> > <br> > <br> >> On Oct 26, 2021, at 2:25 PM, Richard Henderson <<a href="mailto:richard.henderson@linaro.org" target="_blank">richard.henderson@linaro.org</a>> wrote:<br> >><br> >> On 10/26/21 3:22 AM, Alex Bennée wrote:<br> >>> +#else<br> >>> +#include "qemu.h"<br> >>> +#include "loader.h"<br> >><br> >> There is no bsd-user/loader.h.<br> > <br> > Should there be?<br> <br> Probably. It came with Peter's cleanup of linux-user/qemu.h at <br> 3ad0a76928df01726e5872b8530d8e1eaa1a971d.<br> <br> What I meant with my over-terse response is that Alex'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'd need to be some level of effort to rework bsd-user</div><div>to use a common header (though if it's just the header, not much). What's harder</div><div>is sharing the bulk of the ELF loading code because it's the same everywhere.</div><div>Or I should, sadly, say mostly the same everywhere but the 'mostly' can be</div><div>worked out w/o a huge amount of fuss.</div><div><br></div><div>Warner</div></div></div>
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;