On 13:45 Tue 07 Jun , Richard Henderson wrote: > 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.hender...@linaro.org>
Reviewed-by: Luc Michel <lmic...@kalray.eu> > --- > 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 > > > > > To declare a filtering error, please use the following link : > https://www.security-mail.net/reporter.php?mid=1370f.629fd794.51215.0&r=lmichel%40kalrayinc.com&s=qemu-devel-bounces%2Blmichel%3Dkalrayinc.com%40nongnu.org&o=%5BPATCH+v4+47%2F53%5D+semihosting%3A+Create+qemu_semihosting_guestfd_init&verdict=C&c=8a62784599ce0d3c84c0909196f346103514fbcc > --