From: "Alex Bennée" <alex.bennee@linaro.org>
To: qemu-devel@nongnu.org
Cc: qemu-arm@nongnu.org, "Alex Bennée" <alex.bennee@linaro.org>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Paolo Bonzini" <pbonzini@redhat.com>
Subject: [PATCH v1 05/23] semihosting: enable chardev backed output
Date: Thu, 9 May 2019 17:58:53 +0100 [thread overview]
Message-ID: <20190509165912.10512-6-alex.bennee@linaro.org> (raw)
In-Reply-To: <20190509165912.10512-1-alex.bennee@linaro.org>
For running system tests we want to be able to re-direct output to a
file like we do with serial output. This does the wiring to allow us
to treat semihosting like just another character output device.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
include/exec/semihost.h | 6 ++++++
qemu-options.hx | 6 ++++--
target/arm/arm-semi.c | 21 +++++++++++++++++++--
vl.c | 23 +++++++++++++++++++++++
4 files changed, 52 insertions(+), 4 deletions(-)
diff --git a/include/exec/semihost.h b/include/exec/semihost.h
index 5980939c7b8..f5cc9ad2759 100644
--- a/include/exec/semihost.h
+++ b/include/exec/semihost.h
@@ -51,12 +51,18 @@ static inline const char *semihosting_get_cmdline(void)
{
return NULL;
}
+
+static inline Chardev *semihosting_get_chardev(void)
+{
+ return NULL;
+}
#else
bool semihosting_enabled(void);
SemihostingTarget semihosting_get_target(void);
const char *semihosting_get_arg(int i);
int semihosting_get_argc(void);
const char *semihosting_get_cmdline(void);
+Chardev *semihosting_get_chardev(void);
#endif
#endif
diff --git a/qemu-options.hx b/qemu-options.hx
index 51802cbb266..6aa3a08c2fb 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -3975,12 +3975,12 @@ STEXI
Enable semihosting mode (ARM, M68K, Xtensa, MIPS, Nios II only).
ETEXI
DEF("semihosting-config", HAS_ARG, QEMU_OPTION_semihosting_config,
- "-semihosting-config [enable=on|off][,target=native|gdb|auto][,arg=str[,...]]\n" \
+ "-semihosting-config [enable=on|off][,target=native|gdb|auto][,chardev=id][,arg=str[,...]]\n" \
" semihosting configuration\n",
QEMU_ARCH_ARM | QEMU_ARCH_M68K | QEMU_ARCH_XTENSA | QEMU_ARCH_LM32 |
QEMU_ARCH_MIPS | QEMU_ARCH_NIOS2)
STEXI
-@item -semihosting-config [enable=on|off][,target=native|gdb|auto][,arg=str[,...]]
+@item -semihosting-config [enable=on|off][,target=native|gdb|auto][,chardev=id][,arg=str[,...]]
@findex -semihosting-config
Enable and configure semihosting (ARM, M68K, Xtensa, MIPS, Nios II only).
@table @option
@@ -3988,6 +3988,8 @@ Enable and configure semihosting (ARM, M68K, Xtensa, MIPS, Nios II only).
Defines where the semihosting calls will be addressed, to QEMU (@code{native})
or to GDB (@code{gdb}). The default is @code{auto}, which means @code{gdb}
during debug sessions and @code{native} otherwise.
+@item chardev=@var{str1}
+Send the output to a chardev backend output for native or auto output when not in gdb
@item arg=@var{str1},arg=@var{str2},...
Allows the user to pass input arguments, and can be used multiple times to build
up a list. The old-style @code{-kernel}/@code{-append} method of passing a
diff --git a/target/arm/arm-semi.c b/target/arm/arm-semi.c
index 8b5fd7bc6e3..4c326fdc2fb 100644
--- a/target/arm/arm-semi.c
+++ b/target/arm/arm-semi.c
@@ -32,6 +32,7 @@
#include "hw/arm/arm.h"
#include "qemu/cutils.h"
#endif
+#include "chardev/char.h"
#define TARGET_SYS_OPEN 0x01
#define TARGET_SYS_CLOSE 0x02
@@ -310,7 +311,15 @@ target_ulong do_arm_semihosting(CPUARMState *env)
if (use_gdb_syscalls()) {
return arm_gdb_syscall(cpu, arm_semi_cb, "write,2,%x,1", args);
} else {
- return write(STDERR_FILENO, &c, 1);
+#ifdef CONFIG_SOFTMMU
+ Chardev *chardev = semihosting_get_chardev();
+ if (chardev) {
+ return qemu_chr_write_all(chardev, (uint8_t *) &c, 1);
+ } else
+#endif
+ {
+ return write(STDERR_FILENO, &c, 1);
+ }
}
}
case TARGET_SYS_WRITE0:
@@ -322,7 +331,15 @@ target_ulong do_arm_semihosting(CPUARMState *env)
return arm_gdb_syscall(cpu, arm_semi_cb, "write,2,%x,%x",
args, len);
} else {
- ret = write(STDERR_FILENO, s, len);
+#ifdef CONFIG_SOFTMMU
+ Chardev *chardev = semihosting_get_chardev();
+ if (chardev) {
+ ret = qemu_chr_write_all(chardev, (uint8_t *) s, len);
+ } else
+#endif
+ {
+ ret = write(STDERR_FILENO, s, len);
+ }
}
unlock_user(s, args, 0);
return ret;
diff --git a/vl.c b/vl.c
index b6709514c1b..34bbb4df865 100644
--- a/vl.c
+++ b/vl.c
@@ -511,6 +511,9 @@ static QemuOptsList qemu_semihosting_config_opts = {
}, {
.name = "target",
.type = QEMU_OPT_STRING,
+ }, {
+ .name = "chardev",
+ .type = QEMU_OPT_STRING,
}, {
.name = "arg",
.type = QEMU_OPT_STRING,
@@ -1356,6 +1359,7 @@ static void configure_msg(QemuOpts *opts)
typedef struct SemihostingConfig {
bool enabled;
SemihostingTarget target;
+ Chardev *chardev;
const char **argv;
int argc;
const char *cmdline; /* concatenated argv */
@@ -1386,6 +1390,11 @@ int semihosting_get_argc(void)
return semihosting.argc;
}
+Chardev *semihosting_get_chardev(void)
+{
+ return semihosting.chardev;
+}
+
const char *semihosting_get_cmdline(void)
{
if (semihosting.cmdline == NULL && semihosting.argc > 0) {
@@ -3027,6 +3036,7 @@ int main(int argc, char **argv, char **envp)
int display_remote = 0;
const char *log_mask = NULL;
const char *log_file = NULL;
+ const char *semihost_chardev = NULL;
char *trace_file = NULL;
ram_addr_t maxram_size;
uint64_t ram_slots = 0;
@@ -3744,6 +3754,8 @@ int main(int argc, char **argv, char **envp)
semihosting.enabled = qemu_opt_get_bool(opts, "enable",
true);
const char *target = qemu_opt_get(opts, "target");
+ /* setup of chardev is deferred until they are initialised */
+ semihost_chardev = qemu_opt_get(opts, "chardev");
if (target != NULL) {
if (strcmp("native", target) == 0) {
semihosting.target = SEMIHOSTING_TARGET_NATIVE;
@@ -4277,6 +4289,17 @@ int main(int argc, char **argv, char **envp)
qemu_opts_foreach(qemu_find_opts("chardev"),
chardev_init_func, NULL, &error_fatal);
+ /* We had to defer this until chardevs were created */
+ if (semihost_chardev) {
+ Chardev *chr = qemu_chr_find(semihost_chardev);
+ if (chr == NULL) {
+ error_report("semihosting chardev '%s' not found",
+ semihost_chardev);
+ exit(1);
+ }
+ semihosting.chardev = chr;
+ }
+
#ifdef CONFIG_VIRTFS
qemu_opts_foreach(qemu_find_opts("fsdev"),
fsdev_init_func, NULL, &error_fatal);
--
2.20.1
WARNING: multiple messages have this Message-ID (diff)
From: "Alex Bennée" <alex.bennee@linaro.org>
To: qemu-devel@nongnu.org
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
qemu-arm@nongnu.org, "Alex Bennée" <alex.bennee@linaro.org>,
"Paolo Bonzini" <pbonzini@redhat.com>
Subject: [Qemu-devel] [PATCH v1 05/23] semihosting: enable chardev backed output
Date: Thu, 9 May 2019 17:58:53 +0100 [thread overview]
Message-ID: <20190509165912.10512-6-alex.bennee@linaro.org> (raw)
In-Reply-To: <20190509165912.10512-1-alex.bennee@linaro.org>
For running system tests we want to be able to re-direct output to a
file like we do with serial output. This does the wiring to allow us
to treat semihosting like just another character output device.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
include/exec/semihost.h | 6 ++++++
qemu-options.hx | 6 ++++--
target/arm/arm-semi.c | 21 +++++++++++++++++++--
vl.c | 23 +++++++++++++++++++++++
4 files changed, 52 insertions(+), 4 deletions(-)
diff --git a/include/exec/semihost.h b/include/exec/semihost.h
index 5980939c7b8..f5cc9ad2759 100644
--- a/include/exec/semihost.h
+++ b/include/exec/semihost.h
@@ -51,12 +51,18 @@ static inline const char *semihosting_get_cmdline(void)
{
return NULL;
}
+
+static inline Chardev *semihosting_get_chardev(void)
+{
+ return NULL;
+}
#else
bool semihosting_enabled(void);
SemihostingTarget semihosting_get_target(void);
const char *semihosting_get_arg(int i);
int semihosting_get_argc(void);
const char *semihosting_get_cmdline(void);
+Chardev *semihosting_get_chardev(void);
#endif
#endif
diff --git a/qemu-options.hx b/qemu-options.hx
index 51802cbb266..6aa3a08c2fb 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -3975,12 +3975,12 @@ STEXI
Enable semihosting mode (ARM, M68K, Xtensa, MIPS, Nios II only).
ETEXI
DEF("semihosting-config", HAS_ARG, QEMU_OPTION_semihosting_config,
- "-semihosting-config [enable=on|off][,target=native|gdb|auto][,arg=str[,...]]\n" \
+ "-semihosting-config [enable=on|off][,target=native|gdb|auto][,chardev=id][,arg=str[,...]]\n" \
" semihosting configuration\n",
QEMU_ARCH_ARM | QEMU_ARCH_M68K | QEMU_ARCH_XTENSA | QEMU_ARCH_LM32 |
QEMU_ARCH_MIPS | QEMU_ARCH_NIOS2)
STEXI
-@item -semihosting-config [enable=on|off][,target=native|gdb|auto][,arg=str[,...]]
+@item -semihosting-config [enable=on|off][,target=native|gdb|auto][,chardev=id][,arg=str[,...]]
@findex -semihosting-config
Enable and configure semihosting (ARM, M68K, Xtensa, MIPS, Nios II only).
@table @option
@@ -3988,6 +3988,8 @@ Enable and configure semihosting (ARM, M68K, Xtensa, MIPS, Nios II only).
Defines where the semihosting calls will be addressed, to QEMU (@code{native})
or to GDB (@code{gdb}). The default is @code{auto}, which means @code{gdb}
during debug sessions and @code{native} otherwise.
+@item chardev=@var{str1}
+Send the output to a chardev backend output for native or auto output when not in gdb
@item arg=@var{str1},arg=@var{str2},...
Allows the user to pass input arguments, and can be used multiple times to build
up a list. The old-style @code{-kernel}/@code{-append} method of passing a
diff --git a/target/arm/arm-semi.c b/target/arm/arm-semi.c
index 8b5fd7bc6e3..4c326fdc2fb 100644
--- a/target/arm/arm-semi.c
+++ b/target/arm/arm-semi.c
@@ -32,6 +32,7 @@
#include "hw/arm/arm.h"
#include "qemu/cutils.h"
#endif
+#include "chardev/char.h"
#define TARGET_SYS_OPEN 0x01
#define TARGET_SYS_CLOSE 0x02
@@ -310,7 +311,15 @@ target_ulong do_arm_semihosting(CPUARMState *env)
if (use_gdb_syscalls()) {
return arm_gdb_syscall(cpu, arm_semi_cb, "write,2,%x,1", args);
} else {
- return write(STDERR_FILENO, &c, 1);
+#ifdef CONFIG_SOFTMMU
+ Chardev *chardev = semihosting_get_chardev();
+ if (chardev) {
+ return qemu_chr_write_all(chardev, (uint8_t *) &c, 1);
+ } else
+#endif
+ {
+ return write(STDERR_FILENO, &c, 1);
+ }
}
}
case TARGET_SYS_WRITE0:
@@ -322,7 +331,15 @@ target_ulong do_arm_semihosting(CPUARMState *env)
return arm_gdb_syscall(cpu, arm_semi_cb, "write,2,%x,%x",
args, len);
} else {
- ret = write(STDERR_FILENO, s, len);
+#ifdef CONFIG_SOFTMMU
+ Chardev *chardev = semihosting_get_chardev();
+ if (chardev) {
+ ret = qemu_chr_write_all(chardev, (uint8_t *) s, len);
+ } else
+#endif
+ {
+ ret = write(STDERR_FILENO, s, len);
+ }
}
unlock_user(s, args, 0);
return ret;
diff --git a/vl.c b/vl.c
index b6709514c1b..34bbb4df865 100644
--- a/vl.c
+++ b/vl.c
@@ -511,6 +511,9 @@ static QemuOptsList qemu_semihosting_config_opts = {
}, {
.name = "target",
.type = QEMU_OPT_STRING,
+ }, {
+ .name = "chardev",
+ .type = QEMU_OPT_STRING,
}, {
.name = "arg",
.type = QEMU_OPT_STRING,
@@ -1356,6 +1359,7 @@ static void configure_msg(QemuOpts *opts)
typedef struct SemihostingConfig {
bool enabled;
SemihostingTarget target;
+ Chardev *chardev;
const char **argv;
int argc;
const char *cmdline; /* concatenated argv */
@@ -1386,6 +1390,11 @@ int semihosting_get_argc(void)
return semihosting.argc;
}
+Chardev *semihosting_get_chardev(void)
+{
+ return semihosting.chardev;
+}
+
const char *semihosting_get_cmdline(void)
{
if (semihosting.cmdline == NULL && semihosting.argc > 0) {
@@ -3027,6 +3036,7 @@ int main(int argc, char **argv, char **envp)
int display_remote = 0;
const char *log_mask = NULL;
const char *log_file = NULL;
+ const char *semihost_chardev = NULL;
char *trace_file = NULL;
ram_addr_t maxram_size;
uint64_t ram_slots = 0;
@@ -3744,6 +3754,8 @@ int main(int argc, char **argv, char **envp)
semihosting.enabled = qemu_opt_get_bool(opts, "enable",
true);
const char *target = qemu_opt_get(opts, "target");
+ /* setup of chardev is deferred until they are initialised */
+ semihost_chardev = qemu_opt_get(opts, "chardev");
if (target != NULL) {
if (strcmp("native", target) == 0) {
semihosting.target = SEMIHOSTING_TARGET_NATIVE;
@@ -4277,6 +4289,17 @@ int main(int argc, char **argv, char **envp)
qemu_opts_foreach(qemu_find_opts("chardev"),
chardev_init_func, NULL, &error_fatal);
+ /* We had to defer this until chardevs were created */
+ if (semihost_chardev) {
+ Chardev *chr = qemu_chr_find(semihost_chardev);
+ if (chr == NULL) {
+ error_report("semihosting chardev '%s' not found",
+ semihost_chardev);
+ exit(1);
+ }
+ semihosting.chardev = chr;
+ }
+
#ifdef CONFIG_VIRTFS
qemu_opts_foreach(qemu_find_opts("fsdev"),
fsdev_init_func, NULL, &error_fatal);
--
2.20.1
next prev parent reply other threads:[~2019-05-09 16:59 UTC|newest]
Thread overview: 85+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-09 16:58 [PATCH v1 00/23] current testing/next queue (docker/system & io tests) Alex Bennée
2019-05-09 16:58 ` [Qemu-devel] " Alex Bennée
2019-05-09 16:58 ` [PATCH v1 01/23] tests/docker: add ubuntu 18.04 Alex Bennée
2019-05-09 16:58 ` [Qemu-devel] " Alex Bennée
2019-05-09 17:41 ` Philippe Mathieu-Daudé
2019-05-09 17:41 ` [Qemu-devel] " Philippe Mathieu-Daudé
2019-05-09 16:58 ` [PATCH v1 02/23] tests/docker: Test more components on the Fedora default image Alex Bennée
2019-05-09 16:58 ` [Qemu-devel] " Alex Bennée
2019-05-09 17:40 ` Philippe Mathieu-Daudé
2019-05-09 17:40 ` [Qemu-devel] " Philippe Mathieu-Daudé
2019-05-09 17:53 ` Richard Henderson
2019-05-09 16:58 ` [PATCH v1 03/23] tests/tcg/multiarch: add support for multiarch system tests Alex Bennée
2019-05-09 16:58 ` [Qemu-devel] " Alex Bennée
2019-05-09 16:58 ` [PATCH v1 04/23] tests/tcg/multiarch: add hello world system test Alex Bennée
2019-05-09 16:58 ` [Qemu-devel] " Alex Bennée
2019-05-09 16:58 ` Alex Bennée [this message]
2019-05-09 16:58 ` [Qemu-devel] [PATCH v1 05/23] semihosting: enable chardev backed output Alex Bennée
2019-05-09 22:48 ` Richard Henderson
2019-05-10 6:55 ` Alex Bennée
2019-05-10 6:55 ` Alex Bennée
2019-05-10 13:52 ` Richard Henderson
2019-05-10 13:52 ` Richard Henderson
2019-05-10 14:05 ` Alex Bennée
2019-05-10 14:05 ` Alex Bennée
2019-05-10 14:21 ` Peter Maydell
2019-05-10 14:21 ` Peter Maydell
2019-05-10 14:22 ` Peter Maydell
2019-05-10 14:22 ` [Qemu-devel] " Peter Maydell
2019-05-10 16:59 ` Alex Bennée
2019-05-10 16:59 ` [Qemu-devel] " Alex Bennée
2019-05-10 17:02 ` Peter Maydell
2019-05-10 17:02 ` [Qemu-devel] " Peter Maydell
2019-05-11 18:04 ` Alex Bennée
2019-05-11 18:04 ` [Qemu-devel] " Alex Bennée
2019-05-09 16:58 ` [PATCH v1 06/23] editorconfig: add settings for .s/.S files Alex Bennée
2019-05-09 16:58 ` [Qemu-devel] " Alex Bennée
2019-05-09 22:50 ` Richard Henderson
2019-05-09 16:58 ` [PATCH v1 07/23] tests/tcg/aarch64: add system boot.S Alex Bennée
2019-05-09 16:58 ` [Qemu-devel] " Alex Bennée
2019-05-09 16:58 ` [PATCH v1 08/23] tests/tcg/multiarch: move the system memory test Alex Bennée
2019-05-09 16:58 ` [Qemu-devel] " Alex Bennée
2019-05-09 16:58 ` [PATCH v1 09/23] tests/tcg/minilib: support %c format char Alex Bennée
2019-05-09 16:58 ` [Qemu-devel] " Alex Bennée
2019-05-09 16:58 ` [PATCH v1 10/23] tests/tcg/multiarch: expand system memory test to cover more Alex Bennée
2019-05-09 16:58 ` [Qemu-devel] " Alex Bennée
2019-05-09 17:03 ` Richard Henderson
2019-05-09 17:03 ` [Qemu-devel] " Richard Henderson
2019-05-09 16:58 ` [PATCH v1 11/23] tests/tcg/alpha: add system boot.S Alex Bennée
2019-05-09 16:58 ` [Qemu-devel] " Alex Bennée
2019-05-09 16:59 ` [PATCH v1 12/23] .travis.yml: enable aarch64-softmmu and alpha-softmmu tcg tests Alex Bennée
2019-05-09 16:59 ` [Qemu-devel] " Alex Bennée
2019-05-09 23:01 ` Richard Henderson
2019-05-09 23:01 ` Richard Henderson
2019-05-09 16:59 ` [PATCH v1 13/23] Makefile: fix coverage-report reference to BUILD_DIR Alex Bennée
2019-05-09 16:59 ` [Qemu-devel] " Alex Bennée
2019-05-09 16:59 ` [PATCH v1 14/23] Makefile: include per-target build directories in coverage report Alex Bennée
2019-05-09 16:59 ` [Qemu-devel] " Alex Bennée
2019-05-09 16:59 ` [PATCH v1 15/23] Makefile.target: support per-target coverage reports Alex Bennée
2019-05-09 16:59 ` [Qemu-devel] " Alex Bennée
2019-05-09 16:59 ` [PATCH v1 16/23] tests/qemu-iotests/005: Add a sanity check for large sparse file support Alex Bennée
2019-05-09 16:59 ` [Qemu-devel] " Alex Bennée
2019-05-09 23:03 ` Richard Henderson
2019-05-09 23:03 ` Richard Henderson
2019-05-09 16:59 ` [PATCH v1 17/23] tests/qemu-iotests/check: Pick a default machine if necessary Alex Bennée
2019-05-09 16:59 ` [Qemu-devel] " Alex Bennée
2019-05-09 16:59 ` [PATCH v1 18/23] tests/qemu-iotests: Do not hard-code the path to bash Alex Bennée
2019-05-09 16:59 ` [Qemu-devel] " Alex Bennée
2019-05-09 16:59 ` [PATCH v1 19/23] cirrus / travis: Add gnu-sed and bash for macOS and FreeBSD Alex Bennée
2019-05-09 16:59 ` [Qemu-devel] " Alex Bennée
2019-05-09 16:59 ` [PATCH v1 20/23] tests/qemu-iotests: Remove the "_supported_os Linux" line from many tests Alex Bennée
2019-05-09 16:59 ` [Qemu-devel] " Alex Bennée
2019-05-09 16:59 ` [PATCH v1 21/23] tests/qemu-iotests/group: Re-use the "auto" group for tests that can always run Alex Bennée
2019-05-09 16:59 ` [Qemu-devel] " Alex Bennée
2019-05-09 16:59 ` [PATCH v1 22/23] tests/qemu-iotests: re-format output to for make check-block Alex Bennée
2019-05-09 16:59 ` [Qemu-devel] " Alex Bennée
2019-05-09 18:12 ` Max Reitz
2019-05-09 18:12 ` [Qemu-devel] " Max Reitz
2019-05-09 20:38 ` Alex Bennée
2019-05-09 20:38 ` [Qemu-devel] " Alex Bennée
2019-05-09 20:45 ` Eric Blake
2019-05-09 20:45 ` Eric Blake
2019-05-10 4:45 ` Thomas Huth
2019-05-09 16:59 ` [PATCH v1 23/23] tests: Run the iotests during "make check" again Alex Bennée
2019-05-09 16:59 ` [Qemu-devel] " Alex Bennée
2019-05-10 8:46 ` Thomas Huth
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=20190509165912.10512-6-alex.bennee@linaro.org \
--to=alex.bennee@linaro.org \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
/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.