On 13:45 Tue 07 Jun     , Richard Henderson wrote:
> Split out the non-ARM specific portions of SYS_ISTTY to a
> reusable function.  This handles all GuestFD.
> 
> Add a common_semi_istty_cb helper to translate the Posix
> error return, 0+ENOTTY, to the Arm semihosting not-a-file
> success result.
> 
> Signed-off-by: Richard Henderson <richard.hender...@linaro.org>

Reviewed-by: Luc Michel <lmic...@kalray.eu>

> ---
>  include/semihosting/syscalls.h |  3 +++
>  semihosting/arm-compat-semi.c  | 40 ++++++++++++----------------------
>  semihosting/syscalls.c         | 36 ++++++++++++++++++++++++++++++
>  3 files changed, 53 insertions(+), 26 deletions(-)
> 
> diff --git a/include/semihosting/syscalls.h b/include/semihosting/syscalls.h
> index 841a93d25b..c60ebafb85 100644
> --- a/include/semihosting/syscalls.h
> +++ b/include/semihosting/syscalls.h
> @@ -42,4 +42,7 @@ void semihost_sys_write_gf(CPUState *cs, 
> gdb_syscall_complete_cb complete,
>  void semihost_sys_lseek(CPUState *cs, gdb_syscall_complete_cb complete,
>                          int fd, int64_t off, int gdb_whence);
>  
> +void semihost_sys_isatty(CPUState *cs, gdb_syscall_complete_cb complete,
> +                         int fd);
> +
>  #endif /* SEMIHOSTING_SYSCALLS_H */
> diff --git a/semihosting/arm-compat-semi.c b/semihosting/arm-compat-semi.c
> index 8c6c39daf5..4529c9df06 100644
> --- a/semihosting/arm-compat-semi.c
> +++ b/semihosting/arm-compat-semi.c
> @@ -247,6 +247,19 @@ static void common_semi_rw_cb(CPUState *cs, target_ulong 
> ret, target_ulong err)
>      common_semi_set_ret(cs, arg2 - ret);
>  }
>  
> +/*
> + * Convert from Posix ret+errno to Arm SYS_ISTTY return values.
> + * With gdbstub, err is only ever set for protocol errors to EIO.
> + */
> +static void common_semi_istty_cb(CPUState *cs, target_ulong ret,
> +                                 target_ulong err)
> +{
> +    if (err) {
> +        ret = (err == ENOTTY ? 0 : -1);
> +    }
> +    common_semi_cb(cs, ret, err);
> +}
> +
>  /*
>   * SYS_SEEK returns 0 on success, not the resulting offset.
>   */
> @@ -291,14 +304,8 @@ common_semi_flen_cb(CPUState *cs, target_ulong ret, 
> target_ulong err)
>   * do the work and return the required return value to the guest
>   * via common_semi_cb.
>   */
> -typedef void sys_isattyfn(CPUState *cs, GuestFD *gf);
>  typedef void sys_flenfn(CPUState *cs, GuestFD *gf);
>  
> -static void host_isattyfn(CPUState *cs, GuestFD *gf)
> -{
> -    common_semi_cb(cs, isatty(gf->hostfd), 0);
> -}
> -
>  static void host_flenfn(CPUState *cs, GuestFD *gf)
>  {
>      struct stat buf;
> @@ -310,11 +317,6 @@ static void host_flenfn(CPUState *cs, GuestFD *gf)
>      }
>  }
>  
> -static void gdb_isattyfn(CPUState *cs, GuestFD *gf)
> -{
> -    gdb_do_syscall(common_semi_cb, "isatty,%x", gf->hostfd);
> -}
> -
>  static void gdb_flenfn(CPUState *cs, GuestFD *gf)
>  {
>      gdb_do_syscall(common_semi_flen_cb, "fstat,%x,%x",
> @@ -338,32 +340,23 @@ static const uint8_t featurefile_data[] = {
>      SH_EXT_EXIT_EXTENDED | SH_EXT_STDOUT_STDERR, /* Feature byte 0 */
>  };
>  
> -static void staticfile_isattyfn(CPUState *cs, GuestFD *gf)
> -{
> -    common_semi_cb(cs, 0, 0);
> -}
> -
>  static void staticfile_flenfn(CPUState *cs, GuestFD *gf)
>  {
>      common_semi_cb(cs, gf->staticfile.len, 0);
>  }
>  
>  typedef struct GuestFDFunctions {
> -    sys_isattyfn *isattyfn;
>      sys_flenfn *flenfn;
>  } GuestFDFunctions;
>  
>  static const GuestFDFunctions guestfd_fns[] = {
>      [GuestFDHost] = {
> -        .isattyfn = host_isattyfn,
>          .flenfn = host_flenfn,
>      },
>      [GuestFDGDB] = {
> -        .isattyfn = gdb_isattyfn,
>          .flenfn = gdb_flenfn,
>      },
>      [GuestFDStatic] = {
> -        .isattyfn = staticfile_isattyfn,
>          .flenfn = staticfile_flenfn,
>      },
>  };
> @@ -488,12 +481,7 @@ void do_common_semihosting(CPUState *cs)
>  
>      case TARGET_SYS_ISTTY:
>          GET_ARG(0);
> -
> -        gf = get_guestfd(arg0);
> -        if (!gf) {
> -            goto do_badf;
> -        }
> -        guestfd_fns[gf->type].isattyfn(cs, gf);
> +        semihost_sys_isatty(cs, common_semi_istty_cb, arg0);
>          break;
>  
>      case TARGET_SYS_SEEK:
> diff --git a/semihosting/syscalls.c b/semihosting/syscalls.c
> index 9e3eb464b5..1f1baf7e2d 100644
> --- a/semihosting/syscalls.c
> +++ b/semihosting/syscalls.c
> @@ -121,6 +121,12 @@ static void gdb_lseek(CPUState *cs, 
> gdb_syscall_complete_cb complete,
>                     (target_ulong)gf->hostfd, off, (target_ulong)gdb_whence);
>  }
>  
> +static void gdb_isatty(CPUState *cs, gdb_syscall_complete_cb complete,
> +                       GuestFD *gf)
> +{
> +    gdb_do_syscall(complete, "isatty,%x", (target_ulong)gf->hostfd);
> +}
> +
>  /*
>   * Host semihosting syscall implementations.
>   */
> @@ -246,6 +252,13 @@ static void host_lseek(CPUState *cs, 
> gdb_syscall_complete_cb complete,
>      complete(cs, ret, err);
>  }
>  
> +static void host_isatty(CPUState *cs, gdb_syscall_complete_cb complete,
> +                        GuestFD *gf)
> +{
> +    int ret = isatty(gf->hostfd);
> +    complete(cs, ret, ret ? 0 : errno);
> +}
> +
>  /*
>   * Static file semihosting syscall implementations.
>   */
> @@ -437,3 +450,26 @@ void semihost_sys_lseek(CPUState *cs, 
> gdb_syscall_complete_cb complete,
>          g_assert_not_reached();
>      }
>  }
> +
> +void semihost_sys_isatty(CPUState *cs, gdb_syscall_complete_cb complete, int 
> fd)
> +{
> +    GuestFD *gf = get_guestfd(fd);
> +
> +    if (!gf) {
> +        complete(cs, 0, EBADF);
> +        return;
> +    }
> +    switch (gf->type) {
> +    case GuestFDGDB:
> +        gdb_isatty(cs, complete, gf);
> +        break;
> +    case GuestFDHost:
> +        host_isatty(cs, complete, gf);
> +        break;
> +    case GuestFDStatic:
> +        complete(cs, 0, ENOTTY);
> +        break;
> +    default:
> +        g_assert_not_reached();
> +    }
> +}
> -- 
> 2.34.1
> 
> 
> 
> 
> To declare a filtering error, please use the following link : 
> https://www.security-mail.net/reporter.php?mid=17050.629fd2da.690c4.0&r=lmichel%40kalrayinc.com&s=qemu-devel-bounces%2Blmichel%3Dkalrayinc.com%40nongnu.org&o=%5BPATCH+v4+33%2F53%5D+semihosting%3A+Split+out+semihost_sys_isatty&verdict=C&c=17f76f518a03cfc065e040f542bf220e627d8032
> 

-- 





Reply via email to