aboutsummaryrefslogtreecommitdiff
path: root/target
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2019-09-16 15:15:44 +0100
committerPeter Maydell <peter.maydell@linaro.org>2019-10-15 18:09:04 +0100
commit6ee18643770b360da0c8ee44aa07708caa516fa9 (patch)
treee33b9e6ca0683709473303cd26a3e3f5ea8ae2ab /target
parent22a43bb9abf946a9e405e740cfd0ba887ccd4823 (diff)
downloadqemu-6ee18643770b360da0c8ee44aa07708caa516fa9.zip
qemu-6ee18643770b360da0c8ee44aa07708caa516fa9.tar.gz
qemu-6ee18643770b360da0c8ee44aa07708caa516fa9.tar.bz2
target/arm/arm-semi: Implement SH_EXT_STDOUT_STDERR extension
SH_EXT_STDOUT_STDERR is a v2.0 semihosting extension: the guest can open ":tt" with a file mode requesting append access in order to open stderr, in addition to the existing "open for read for stdin or write for stdout". Implement this and report it via the :semihosting-features data. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Message-id: 20190916141544.17540-16-peter.maydell@linaro.org
Diffstat (limited to 'target')
-rw-r--r--target/arm/arm-semi.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/target/arm/arm-semi.c b/target/arm/arm-semi.c
index f65d8c9..6f7b6d8 100644
--- a/target/arm/arm-semi.c
+++ b/target/arm/arm-semi.c
@@ -516,13 +516,14 @@ static uint32_t gdb_flenfn(ARMCPU *cpu, GuestFD *gf)
/* Feature bits reportable in feature byte 0 */
#define SH_EXT_EXIT_EXTENDED (1 << 0)
+#define SH_EXT_STDOUT_STDERR (1 << 1)
static const uint8_t featurefile_data[] = {
SHFB_MAGIC_0,
SHFB_MAGIC_1,
SHFB_MAGIC_2,
SHFB_MAGIC_3,
- SH_EXT_EXIT_EXTENDED, /* Feature byte 0 */
+ SH_EXT_EXIT_EXTENDED | SH_EXT_STDOUT_STDERR, /* Feature byte 0 */
};
static void init_featurefile_guestfd(int guestfd)
@@ -710,7 +711,21 @@ target_ulong do_arm_semihosting(CPUARMState *env)
}
if (strcmp(s, ":tt") == 0) {
- int result_fileno = arg1 < 4 ? STDIN_FILENO : STDOUT_FILENO;
+ int result_fileno;
+
+ /*
+ * We implement SH_EXT_STDOUT_STDERR, so:
+ * open for read == stdin
+ * open for write == stdout
+ * open for append == stderr
+ */
+ if (arg1 < 4) {
+ result_fileno = STDIN_FILENO;
+ } else if (arg1 < 8) {
+ result_fileno = STDOUT_FILENO;
+ } else {
+ result_fileno = STDERR_FILENO;
+ }
associate_guestfd(guestfd, result_fileno);
unlock_user(s, arg0, 0);
return guestfd;