Signed-off-by: demin.han <demin.han@starfivetech.com>
---
include/qemu/qemu-plugin.h | 11 +++++++++++
plugins/api.c | 16 ++++++++++++++++
plugins/qemu-plugins.symbols | 1 +
3 files changed, 28 insertions(+)
diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h
index 622c9a0232..daf75c9f5a 100644
--- a/include/qemu/qemu-plugin.h
+++ b/include/qemu/qemu-plugin.h
@@ -837,6 +837,17 @@ bool qemu_plugin_bool_parse(const char *name, const char
*val, bool *ret);
QEMU_PLUGIN_API
const char *qemu_plugin_path_to_binary(void);
+/**
+ * qemu_plugin_argv_to_binary() - argv to binary file being executed
+ *
+ * Return a string array representing the argv to the binary. For user-mode
+ * this is the main executable's argv. For system emulation we currently
+ * return NULL. The user should g_free() the string array once no longer
+ * needed.
+ */
+QEMU_PLUGIN_API
+const char **qemu_plugin_argv_to_binary(void);
+
/**
* qemu_plugin_start_code() - returns start of text segment
*
diff --git a/plugins/api.c b/plugins/api.c
index 24ea64e2de..fa2735db03 100644
--- a/plugins/api.c
+++ b/plugins/api.c
@@ -485,6 +485,22 @@ const char *qemu_plugin_path_to_binary(void)
return path;
}
+const char **qemu_plugin_argv_to_binary(void)
+{
+ const char **argv = NULL;
+#ifdef CONFIG_USER_ONLY
+ int i, argc;
+ TaskState *ts = get_task_state(current_cpu);
+ argc = ts->bprm->argc;
+ argv = g_malloc(sizeof(char *) * (argc + 1));
+ for (i = 0; i < argc; ++i) {
+ argv[i] = g_strdup(ts->bprm->argv[i]);
+ }
+ argv[argc] = NULL;
+#endif
+ return argv;
+}
+
uint64_t qemu_plugin_start_code(void)
{
uint64_t start = 0;
diff --git a/plugins/qemu-plugins.symbols b/plugins/qemu-plugins.symbols
index 032661f9ea..532582effe 100644
--- a/plugins/qemu-plugins.symbols
+++ b/plugins/qemu-plugins.symbols
@@ -1,4 +1,5 @@
{
+ qemu_plugin_argv_to_binary;
qemu_plugin_bool_parse;
qemu_plugin_end_code;
qemu_plugin_entry_code;