[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH] vl.c: add -semihosting-config "arg" sub-argumen
From: |
Leon Alrae |
Subject: |
[Qemu-devel] [RFC PATCH] vl.c: add -semihosting-config "arg" sub-argument |
Date: |
Wed, 1 Apr 2015 14:18:03 +0100 |
Signed-off-by: Leon Alrae <address@hidden>
---
Hi,
Continuing the discussion related to extending QEMU's command line with new
argument allowing to pass semi-hosting input arguments to the guest program:
https://lists.gnu.org/archive/html/qemu-devel/2015-03/msg05960.html
This simple patch adds "arg" sub-argument which in my opinion is flexible
enough to satisfy semi-hosting interfaces which allocate buffers at runtime
(so it is possible to pass any number of strings of any length) as well as the
ones which have limited buffer for a single input string.
Highlights:
* arg can appear multiple times in -semihosting-config group of sub-arguments
and is used to create argc/argv.
* Single string cmdline can be still easily created:
static void concat_semihosting_args(char *buffer, int buffer_size,
const char *separator)
{
int i;
buffer[0] = '\0';
for (i = 0; i < semihosting_argc - 1; i++) {
pstrcat(buffer, buffer_size, semihosting_argv[i]);
pstrcat(buffer, buffer_size, separator);
}
pstrcat(buffer, buffer_size, semihosting_argv[i]);
}
* argv[0] is set by the first occurence of "arg" rather than taking the same
string from "-kernel". This might be required in cases where the path is too
long and semi-hosting app's buffer for the cmdline is fixed and small.
* No altering the parser itself, just traversing the -semihosting-config opts
and picking all arg strings.
* This patch doesn't fix the need of using double-commas if user want to have
a comma in the string.
If we agree on this new option then I would like to follow up with a clean up
where we've got a semi-hosting specific structure rather than keep generating
more semihosting_* variables (I skipped it in this patch to avoid generating
clean up related noise in the diff).
Any comments?
Thanks,
Leon
---
include/sysemu/sysemu.h | 2 ++
vl.c | 18 ++++++++++++++++++
2 files changed, 20 insertions(+)
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index 8a52934..651863f 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -126,6 +126,8 @@ extern int graphic_rotate;
extern int no_quit;
extern int no_shutdown;
extern int semihosting_enabled;
+extern const char **semihosting_argv;
+extern int semihosting_argc;
extern int old_param;
extern int boot_menu;
extern bool boot_strict;
diff --git a/vl.c b/vl.c
index 74c2681..640d9da 100644
--- a/vl.c
+++ b/vl.c
@@ -171,6 +171,8 @@ const char *watchdog;
QEMUOptionRom option_rom[MAX_OPTION_ROMS];
int nb_option_roms;
int semihosting_enabled = 0;
+const char **semihosting_argv;
+int semihosting_argc;
int old_param = 0;
const char *qemu_name;
int alt_grab = 0;
@@ -485,6 +487,9 @@ static QemuOptsList qemu_semihosting_config_opts = {
}, {
.name = "target",
.type = QEMU_OPT_STRING,
+ }, {
+ .name = "arg",
+ .type = QEMU_OPT_STRING,
},
{ /* end of list */ }
},
@@ -2727,6 +2732,17 @@ static void set_memory_options(uint64_t *ram_slots,
ram_addr_t *maxram_size)
}
}
+static int add_semihosting_arg(const char *name, const char *val, void *opaque)
+{
+ if (strcmp(name, "arg") == 0) {
+ semihosting_argc++;
+ semihosting_argv = g_realloc(semihosting_argv,
+ semihosting_argc * sizeof(void *));
+ semihosting_argv[semihosting_argc - 1] = val;
+ }
+ return 0;
+}
+
int main(int argc, char **argv, char **envp)
{
int i;
@@ -3562,6 +3578,8 @@ int main(int argc, char **argv, char **envp)
} else {
semihosting_target = SEMIHOSTING_TARGET_AUTO;
}
+ /* Set semihosting argument count and vector */
+ qemu_opt_foreach(opts, add_semihosting_arg, NULL, 0);
} else {
fprintf(stderr, "Unsupported semihosting-config %s\n",
optarg);
--
2.1.0
- [Qemu-devel] [RFC PATCH] vl.c: add -semihosting-config "arg" sub-argument,
Leon Alrae <=
- Re: [Qemu-devel] [RFC PATCH] vl.c: add -semihosting-config "arg" sub-argument, Liviu Ionescu, 2015/04/01
- Re: [Qemu-devel] [RFC PATCH] vl.c: add -semihosting-config "arg" sub-argument, Matthew Fortune, 2015/04/01
- Re: [Qemu-devel] [RFC PATCH] vl.c: add -semihosting-config "arg" sub-argument, Leon Alrae, 2015/04/02
- Re: [Qemu-devel] [RFC PATCH] vl.c: add -semihosting-config "arg" sub-argument, Liviu Ionescu, 2015/04/02
- Re: [Qemu-devel] [RFC PATCH] vl.c: add -semihosting-config "arg" sub-argument, Leon Alrae, 2015/04/02
- Re: [Qemu-devel] [RFC PATCH] vl.c: add -semihosting-config "arg" sub-argument, Leon Alrae, 2015/04/02
- Re: [Qemu-devel] [RFC PATCH] vl.c: add -semihosting-config "arg" sub-argument, Liviu Ionescu, 2015/04/02
- Re: [Qemu-devel] [RFC PATCH] vl.c: add -semihosting-config "arg" sub-argument, Matthew Fortune, 2015/04/02
- Re: [Qemu-devel] [RFC PATCH] vl.c: add -semihosting-config "arg" sub-argument, Liviu Ionescu, 2015/04/02
- Re: [Qemu-devel] [RFC PATCH] vl.c: add -semihosting-config "arg" sub-argument, Liviu Ionescu, 2015/04/03