Message ID | 20220607204557.658541-48-richard.henderson@linaro.org |
---|---|
State | Accepted |
Commit | e4a4aaa51b4c71914a6f30ca504ab78e8f695aee |
Headers | show |
Series | semihosting cleanup | expand |
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.henderson@linaro.org> Reviewed-by: Luc Michel <lmichel@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 > --
Richard Henderson <richard.henderson@linaro.org> writes: > 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> Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
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; }
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(-)