From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Subject: [PATCH v4 47/53] semihosting: Create qemu_semihosting_guestfd_init
Date: Tue, 7 Jun 2022 13:45:51 -0700 [thread overview]
Message-ID: <20220607204557.658541-48-richard.henderson@linaro.org> (raw)
In-Reply-To: <20220607204557.658541-1-richard.henderson@linaro.org>
For arm-compat, initialize console_{in,out}_gf;
otherwise, initialize stdio file descriptors.
This will go some way to cleaning up arm-compat, and
will allow other semihosting to use normal stdio.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
include/semihosting/guestfd.h | 7 +++++
include/semihosting/semihost.h | 1 +
linux-user/main.c | 9 ++++++
semihosting/console.c | 2 ++
semihosting/guestfd.c | 52 +++++++++++++++++++++++++++-------
5 files changed, 61 insertions(+), 10 deletions(-)
diff --git a/include/semihosting/guestfd.h b/include/semihosting/guestfd.h
index a7ea1041ea..3d426fedab 100644
--- a/include/semihosting/guestfd.h
+++ b/include/semihosting/guestfd.h
@@ -35,6 +35,13 @@ typedef struct GuestFD {
};
} GuestFD;
+/*
+ * For ARM semihosting, we have a separate structure for routing
+ * data for the console which is outside the guest fd address space.
+ */
+extern GuestFD console_in_gf;
+extern GuestFD console_out_gf;
+
/**
* alloc_guestfd:
*
diff --git a/include/semihosting/semihost.h b/include/semihosting/semihost.h
index 5b36a76f08..93a3c21b44 100644
--- a/include/semihosting/semihost.h
+++ b/include/semihosting/semihost.h
@@ -64,5 +64,6 @@ int qemu_semihosting_config_options(const char *opt);
void qemu_semihosting_chardev_init(void);
void qemu_semihosting_console_init(Chardev *);
#endif /* CONFIG_USER_ONLY */
+void qemu_semihosting_guestfd_init(void);
#endif /* SEMIHOST_H */
diff --git a/linux-user/main.c b/linux-user/main.c
index 651e32f5f2..e44bdb17b8 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -54,6 +54,10 @@
#include "loader.h"
#include "user-mmap.h"
+#ifdef CONFIG_SEMIHOSTING
+#include "semihosting/semihost.h"
+#endif
+
#ifndef AT_FLAGS_PRESERVE_ARGV0
#define AT_FLAGS_PRESERVE_ARGV0_BIT 0
#define AT_FLAGS_PRESERVE_ARGV0 (1 << AT_FLAGS_PRESERVE_ARGV0_BIT)
@@ -906,6 +910,11 @@ int main(int argc, char **argv, char **envp)
}
gdb_handlesig(cpu, 0);
}
+
+#ifdef CONFIG_SEMIHOSTING
+ qemu_semihosting_guestfd_init();
+#endif
+
cpu_loop(env);
/* never exits */
return 0;
diff --git a/semihosting/console.c b/semihosting/console.c
index b6a342744d..677ec2b176 100644
--- a/semihosting/console.c
+++ b/semihosting/console.c
@@ -190,4 +190,6 @@ void qemu_semihosting_console_init(Chardev *chr)
NULL, NULL, &console,
NULL, true);
}
+
+ qemu_semihosting_guestfd_init();
}
diff --git a/semihosting/guestfd.c b/semihosting/guestfd.c
index e3122ebba9..b05c52f26f 100644
--- a/semihosting/guestfd.c
+++ b/semihosting/guestfd.c
@@ -10,15 +10,56 @@
#include "qemu/osdep.h"
#include "exec/gdbstub.h"
+#include "semihosting/semihost.h"
#include "semihosting/guestfd.h"
#ifdef CONFIG_USER_ONLY
#include "qemu.h"
#else
#include "semihosting/softmmu-uaccess.h"
+#include CONFIG_DEVICES
#endif
static GArray *guestfd_array;
+#ifdef CONFIG_ARM_COMPATIBLE_SEMIHOSTING
+GuestFD console_in_gf;
+GuestFD console_out_gf;
+#endif
+
+void qemu_semihosting_guestfd_init(void)
+{
+ /* New entries zero-initialized, i.e. type GuestFDUnused */
+ guestfd_array = g_array_new(FALSE, TRUE, sizeof(GuestFD));
+
+#ifdef CONFIG_ARM_COMPATIBLE_SEMIHOSTING
+ /* For ARM-compat, the console is in a separate namespace. */
+ if (use_gdb_syscalls()) {
+ console_in_gf.type = GuestFDGDB;
+ console_in_gf.hostfd = 0;
+ console_out_gf.type = GuestFDGDB;
+ console_out_gf.hostfd = 2;
+ } else {
+ console_in_gf.type = GuestFDConsole;
+ console_out_gf.type = GuestFDConsole;
+ }
+#else
+ /* Otherwise, the stdio file descriptors apply. */
+ guestfd_array = g_array_set_size(guestfd_array, 3);
+#ifndef CONFIG_USER_ONLY
+ if (!use_gdb_syscalls()) {
+ GuestFD *gf = &g_array_index(guestfd_array, GuestFD, 0);
+ gf[0].type = GuestFDConsole;
+ gf[1].type = GuestFDConsole;
+ gf[2].type = GuestFDConsole;
+ return;
+ }
+#endif
+ associate_guestfd(0, 0);
+ associate_guestfd(1, 1);
+ associate_guestfd(2, 2);
+#endif
+}
+
/*
* Allocate a new guest file descriptor and return it; if we
* couldn't allocate a new fd then return -1.
@@ -30,11 +71,6 @@ int alloc_guestfd(void)
{
guint i;
- if (!guestfd_array) {
- /* New entries zero-initialized, i.e. type GuestFDUnused */
- guestfd_array = g_array_new(FALSE, TRUE, sizeof(GuestFD));
- }
-
/* SYS_OPEN should return nonzero handle on success. Start guestfd from 1 */
for (i = 1; i < guestfd_array->len; i++) {
GuestFD *gf = &g_array_index(guestfd_array, GuestFD, i);
@@ -61,11 +97,7 @@ static void do_dealloc_guestfd(GuestFD *gf)
*/
static GuestFD *do_get_guestfd(int guestfd)
{
- if (!guestfd_array) {
- return NULL;
- }
-
- if (guestfd <= 0 || guestfd >= guestfd_array->len) {
+ if (guestfd < 0 || guestfd >= guestfd_array->len) {
return NULL;
}
--
2.34.1
next prev parent reply other threads:[~2022-06-07 22:58 UTC|newest]
Thread overview: 106+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-07 20:45 [PATCH v4 00/53] semihosting cleanup Richard Henderson
2022-06-07 20:45 ` [PATCH v4 01/53] semihosting: Move exec/softmmu-semi.h to semihosting/softmmu-uaccess.h Richard Henderson
2022-06-07 20:45 ` [PATCH v4 02/53] semihosting: Return failure from softmmu-uaccess.h functions Richard Henderson
2022-06-07 20:45 ` [PATCH v4 03/53] semihosting: Improve condition for config.c and console.c Richard Henderson
2022-06-07 20:45 ` [PATCH v4 04/53] semihosting: Move softmmu-uaccess.h functions out of line Richard Henderson
2022-06-07 20:45 ` [PATCH v4 05/53] accel/stubs: Add tcg stub for probe_access_flags Richard Henderson
2022-06-22 7:14 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 06/53] semihosting: Add target_strlen for softmmu-uaccess.h Richard Henderson
2022-06-07 20:45 ` [PATCH v4 07/53] semihosting: Simplify softmmu_lock_user_string Richard Henderson
2022-06-08 16:10 ` Alex Bennée
2022-06-07 20:45 ` [PATCH v4 08/53] semihosting: Split out guestfd.c Richard Henderson
2022-06-09 7:24 ` Alex Bennée
2022-06-09 13:51 ` Richard Henderson
2022-06-07 20:45 ` [PATCH v4 09/53] semihosting: Inline set_swi_errno into common_semi_cb Richard Henderson
2022-06-07 20:45 ` [PATCH v4 10/53] semihosting: Adjust error checking in common_semi_cb Richard Henderson
2022-06-08 17:19 ` Alex Bennée
2022-06-07 20:45 ` [PATCH v4 11/53] semihosting: Clean up common_semi_flen_cb Richard Henderson
2022-06-07 20:45 ` [PATCH v4 12/53] semihosting: Clean up common_semi_open_cb Richard Henderson
2022-06-07 20:45 ` [PATCH v4 13/53] semihosting: Return void from do_common_semihosting Richard Henderson
2022-06-09 15:42 ` Alex Bennée
2022-06-07 20:45 ` [PATCH v4 14/53] semihosting: Move common-semi.h to include/semihosting/ Richard Henderson
2022-06-09 15:42 ` Alex Bennée
2022-06-07 20:45 ` [PATCH v4 15/53] semihosting: Remove GDB_O_BINARY Richard Henderson
2022-06-09 15:49 ` Alex Bennée
2022-06-09 15:59 ` Richard Henderson
2022-06-07 20:45 ` [PATCH v4 16/53] include/exec: Move gdb open flags to gdbstub.h Richard Henderson
2022-06-07 20:45 ` [PATCH v4 17/53] include/exec: Move gdb_stat and gdb_timeval " Richard Henderson
2022-06-07 20:45 ` [PATCH v4 18/53] include/exec: Define errno values in gdbstub.h Richard Henderson
2022-06-09 15:50 ` Alex Bennée
2022-06-07 20:45 ` [PATCH v4 19/53] gdbstub: Convert GDB error numbers to host error numbers Richard Henderson
2022-06-22 7:53 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 20/53] semihosting: Use struct gdb_stat in common_semi_flen_cb Richard Henderson
2022-06-07 20:45 ` [PATCH v4 21/53] semihosting: Split is_64bit_semihosting per target Richard Henderson
2022-06-07 20:45 ` [PATCH v4 22/53] semihosting: Split common_semi_flen_buf " Richard Henderson
2022-06-07 20:45 ` [PATCH v4 23/53] semihosting: Split out common_semi_has_synccache Richard Henderson
2022-06-07 20:45 ` [PATCH v4 24/53] semihosting: Split out common-semi-target.h Richard Henderson
2022-06-27 8:48 ` Alex Bennée
2022-06-27 9:03 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 25/53] semihosting: Use env more often in do_common_semihosting Richard Henderson
2022-06-22 8:22 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 26/53] semihosting: Move GET_ARG/SET_ARG earlier in the file Richard Henderson
2022-06-27 8:51 ` Alex Bennée
2022-06-07 20:45 ` [PATCH v4 27/53] semihosting: Split out semihost_sys_open Richard Henderson
2022-06-22 9:35 ` Luc Michel
2022-06-22 15:05 ` Richard Henderson
2022-06-27 9:22 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 28/53] semihosting: Split out semihost_sys_close Richard Henderson
2022-06-22 19:07 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 29/53] semihosting: Split out semihost_sys_read Richard Henderson
2022-06-22 19:25 ` Luc Michel
2022-06-23 14:11 ` Richard Henderson
2022-06-07 20:45 ` [PATCH v4 30/53] semihosting: Split out semihost_sys_write Richard Henderson
2022-06-22 19:28 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 31/53] semihosting: Bound length for semihost_sys_{read, write} Richard Henderson
2022-06-22 19:30 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 32/53] semihosting: Split out semihost_sys_lseek Richard Henderson
2022-06-22 19:40 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 33/53] semihosting: Split out semihost_sys_isatty Richard Henderson
2022-06-22 19:48 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 34/53] semihosting: Split out semihost_sys_flen Richard Henderson
2022-06-24 7:15 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 35/53] semihosting: Split out semihost_sys_remove Richard Henderson
2022-06-24 7:35 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 36/53] semihosting: Split out semihost_sys_rename Richard Henderson
2022-06-24 7:40 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 37/53] semihosting: Split out semihost_sys_system Richard Henderson
2022-06-24 7:51 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 38/53] semihosting: Create semihost_sys_{stat,fstat} Richard Henderson
2022-06-24 8:20 ` Luc Michel
2022-06-24 8:26 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 39/53] semihosting: Create semihost_sys_gettimeofday Richard Henderson
2022-06-24 8:26 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 40/53] gdbstub: Adjust gdb_syscall_complete_cb declaration Richard Henderson
2022-06-24 8:37 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 41/53] semihosting: Fix docs comment for qemu_semihosting_console_inc Richard Henderson
2022-06-24 8:42 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 42/53] semihosting: Pass CPUState to qemu_semihosting_console_inc Richard Henderson
2022-06-24 8:46 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 43/53] semihosting: Expand qemu_semihosting_console_inc to read Richard Henderson
2022-06-24 9:03 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 44/53] semihosting: Cleanup chardev init Richard Henderson
2022-06-24 9:07 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 45/53] semihosting: Create qemu_semihosting_console_write Richard Henderson
2022-06-27 7:23 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 46/53] semihosting: Add GuestFDConsole Richard Henderson
2022-06-27 8:36 ` Luc Michel
2022-06-27 8:56 ` Alex Bennée
2022-06-07 20:45 ` Richard Henderson [this message]
2022-06-27 8:36 ` [PATCH v4 47/53] semihosting: Create qemu_semihosting_guestfd_init Luc Michel
2022-06-27 9:01 ` Alex Bennée
2022-06-07 20:45 ` [PATCH v4 48/53] semihosting: Use console_in_gf for SYS_READC Richard Henderson
2022-06-27 8:41 ` Luc Michel
2022-06-27 9:07 ` Alex Bennée
2022-06-27 23:09 ` Richard Henderson
2022-06-28 9:35 ` Alex Bennée
2022-06-07 20:45 ` [PATCH v4 49/53] semihosting: Use console_out_gf for SYS_WRITEC Richard Henderson
2022-06-27 8:41 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 50/53] semihosting: Remove qemu_semihosting_console_outc Richard Henderson
2022-06-27 8:42 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 51/53] semihosting: Use console_out_gf for SYS_WRITE0 Richard Henderson
2022-06-27 8:42 ` Luc Michel
2022-06-07 20:45 ` [PATCH v4 52/53] semihosting: Remove qemu_semihosting_console_outs Richard Henderson
2022-06-27 8:42 ` Luc Michel
2022-06-27 9:10 ` Alex Bennée
2022-06-07 20:45 ` [PATCH v4 53/53] semihosting: Create semihost_sys_poll_one Richard Henderson
2022-06-27 9:01 ` Luc Michel
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=20220607204557.658541-48-richard.henderson@linaro.org \
--to=richard.henderson@linaro.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).