All of lore.kernel.org
 help / color / mirror / Atom feed
From: Luc Michel <lmichel@kalray.eu>
To: Richard Henderson <richard.henderson@linaro.org>
Cc: qemu-devel@nongnu.org
Subject: Re: [PATCH v4 30/53] semihosting: Split out semihost_sys_write
Date: Wed, 22 Jun 2022 21:28:40 +0200	[thread overview]
Message-ID: <20220622192840.GI28991@ws2101.lin.mbt.kalray.eu> (raw)
In-Reply-To: <20220607204557.658541-31-richard.henderson@linaro.org>

On 13:45 Tue 07 Jun     , Richard Henderson wrote:
> Split out the non-ARM specific portions of SYS_WRITE to a
> reusable function.  This handles all GuestFD.  This removes
> the last use of common_semi_syscall_len.
> 
> Note that gdb_do_syscall %x reads target_ulong, not int.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

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

> ---
>  include/semihosting/syscalls.h |  6 ++++
>  semihosting/arm-compat-semi.c  | 52 +-------------------------------
>  semihosting/syscalls.c         | 54 ++++++++++++++++++++++++++++++++++
>  3 files changed, 61 insertions(+), 51 deletions(-)
> 
> diff --git a/include/semihosting/syscalls.h b/include/semihosting/syscalls.h
> index 20da8138b0..2464467579 100644
> --- a/include/semihosting/syscalls.h
> +++ b/include/semihosting/syscalls.h
> @@ -33,4 +33,10 @@ void semihost_sys_read(CPUState *cs, gdb_syscall_complete_cb complete,
>  void semihost_sys_read_gf(CPUState *cs, gdb_syscall_complete_cb complete,
>                            GuestFD *gf, target_ulong buf, target_ulong len);
>  
> +void semihost_sys_write(CPUState *cs, gdb_syscall_complete_cb complete,
> +                        int fd, target_ulong buf, target_ulong len);
> +
> +void semihost_sys_write_gf(CPUState *cs, gdb_syscall_complete_cb complete,
> +                           GuestFD *gf, target_ulong buf, target_ulong len);
> +
>  #endif /* SEMIHOSTING_SYSCALLS_H */
> diff --git a/semihosting/arm-compat-semi.c b/semihosting/arm-compat-semi.c
> index 5e11ec307a..d1d35e6032 100644
> --- a/semihosting/arm-compat-semi.c
> +++ b/semihosting/arm-compat-semi.c
> @@ -215,8 +215,6 @@ static inline uint32_t get_swi_errno(CPUState *cs)
>  #endif
>  }
>  
> -static target_ulong common_semi_syscall_len;
> -
>  static void common_semi_cb(CPUState *cs, target_ulong ret, target_ulong err)
>  {
>      if (err) {
> @@ -230,9 +228,6 @@ static void common_semi_cb(CPUState *cs, target_ulong ret, target_ulong err)
>          /* Fixup syscalls that use nonstardard return conventions.  */
>          target_ulong reg0 = common_semi_arg(cs, 0);
>          switch (reg0) {
> -        case TARGET_SYS_WRITE:
> -            ret = common_semi_syscall_len - ret;
> -            break;
>          case TARGET_SYS_SEEK:
>              ret = 0;
>              break;
> @@ -294,30 +289,10 @@ 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_writefn(CPUState *cs, GuestFD *gf,
> -                         target_ulong buf, uint32_t len);
>  typedef void sys_isattyfn(CPUState *cs, GuestFD *gf);
>  typedef void sys_seekfn(CPUState *cs, GuestFD *gf, target_ulong offset);
>  typedef void sys_flenfn(CPUState *cs, GuestFD *gf);
>  
> -static void host_writefn(CPUState *cs, GuestFD *gf,
> -                         target_ulong buf, uint32_t len)
> -{
> -    CPUArchState *env = cs->env_ptr;
> -    uint32_t ret = 0;
> -    char *s = lock_user(VERIFY_READ, buf, len, 1);
> -    (void) env; /* Used in arm softmmu lock_user implicitly */
> -    if (s) {
> -        ret = write(gf->hostfd, s, len);
> -        unlock_user(s, buf, 0);
> -        if (ret == (uint32_t)-1) {
> -            ret = 0;
> -        }
> -    }
> -    /* Return bytes not written, on error as well. */
> -    common_semi_cb(cs, len - ret, 0);
> -}
> -
>  static void host_isattyfn(CPUState *cs, GuestFD *gf)
>  {
>      common_semi_cb(cs, isatty(gf->hostfd), 0);
> @@ -340,13 +315,6 @@ static void host_flenfn(CPUState *cs, GuestFD *gf)
>      }
>  }
>  
> -static void gdb_writefn(CPUState *cs, GuestFD *gf,
> -                        target_ulong buf, uint32_t len)
> -{
> -    common_semi_syscall_len = len;
> -    gdb_do_syscall(common_semi_cb, "write,%x,%x,%x", gf->hostfd, buf, len);
> -}
> -
>  static void gdb_isattyfn(CPUState *cs, GuestFD *gf)
>  {
>      gdb_do_syscall(common_semi_cb, "isatty,%x", gf->hostfd);
> @@ -380,13 +348,6 @@ static const uint8_t featurefile_data[] = {
>      SH_EXT_EXIT_EXTENDED | SH_EXT_STDOUT_STDERR, /* Feature byte 0 */
>  };
>  
> -static void staticfile_writefn(CPUState *cs, GuestFD *gf,
> -                               target_ulong buf, uint32_t len)
> -{
> -    /* This fd can never be open for writing */
> -    common_semi_cb(cs, -1, EBADF);
> -}
> -
>  static void staticfile_isattyfn(CPUState *cs, GuestFD *gf)
>  {
>      common_semi_cb(cs, 0, 0);
> @@ -404,7 +365,6 @@ static void staticfile_flenfn(CPUState *cs, GuestFD *gf)
>  }
>  
>  typedef struct GuestFDFunctions {
> -    sys_writefn *writefn;
>      sys_isattyfn *isattyfn;
>      sys_seekfn *seekfn;
>      sys_flenfn *flenfn;
> @@ -412,19 +372,16 @@ typedef struct GuestFDFunctions {
>  
>  static const GuestFDFunctions guestfd_fns[] = {
>      [GuestFDHost] = {
> -        .writefn = host_writefn,
>          .isattyfn = host_isattyfn,
>          .seekfn = host_seekfn,
>          .flenfn = host_flenfn,
>      },
>      [GuestFDGDB] = {
> -        .writefn = gdb_writefn,
>          .isattyfn = gdb_isattyfn,
>          .seekfn = gdb_seekfn,
>          .flenfn = gdb_flenfn,
>      },
>      [GuestFDStatic] = {
> -        .writefn = staticfile_writefn,
>          .isattyfn = staticfile_isattyfn,
>          .seekfn = staticfile_seekfn,
>          .flenfn = staticfile_flenfn,
> @@ -449,7 +406,6 @@ void do_common_semihosting(CPUState *cs)
>      char * s;
>      int nr;
>      uint32_t ret;
> -    uint32_t len;
>      GuestFD *gf;
>      int64_t elapsed;
>  
> @@ -530,13 +486,7 @@ void do_common_semihosting(CPUState *cs)
>          GET_ARG(0);
>          GET_ARG(1);
>          GET_ARG(2);
> -        len = arg2;
> -
> -        gf = get_guestfd(arg0);
> -        if (!gf) {
> -            goto do_badf;
> -        }
> -        guestfd_fns[gf->type].writefn(cs, gf, arg1, len);
> +        semihost_sys_write(cs, common_semi_rw_cb, arg0, arg1, arg2);
>          break;
>  
>      case TARGET_SYS_READ:
> diff --git a/semihosting/syscalls.c b/semihosting/syscalls.c
> index d42a190746..5cb12d6adc 100644
> --- a/semihosting/syscalls.c
> +++ b/semihosting/syscalls.c
> @@ -107,6 +107,13 @@ static void gdb_read(CPUState *cs, gdb_syscall_complete_cb complete,
>                     (target_ulong)gf->hostfd, buf, len);
>  }
>  
> +static void gdb_write(CPUState *cs, gdb_syscall_complete_cb complete,
> +                      GuestFD *gf, target_ulong buf, target_ulong len)
> +{
> +    gdb_do_syscall(complete, "write,%x,%x,%x",
> +                   (target_ulong)gf->hostfd, buf, len);
> +}
> +
>  /*
>   * Host semihosting syscall implementations.
>   */
> @@ -193,6 +200,22 @@ static void host_read(CPUState *cs, gdb_syscall_complete_cb complete,
>      }
>  }
>  
> +static void host_write(CPUState *cs, gdb_syscall_complete_cb complete,
> +                       GuestFD *gf, target_ulong buf, target_ulong len)
> +{
> +    CPUArchState *env G_GNUC_UNUSED = cs->env_ptr;
> +    void *ptr = lock_user(VERIFY_READ, buf, len, 1);
> +    ssize_t ret;
> +
> +    if (!ptr) {
> +        complete(cs, -1, EFAULT);
> +        return;
> +    }
> +    ret = write(gf->hostfd, ptr, len);
> +    complete(cs, ret, ret == -1 ? errno : 0);
> +    unlock_user(ptr, buf, 0);
> +}
> +
>  /*
>   * Static file semihosting syscall implementations.
>   */
> @@ -286,3 +309,34 @@ void semihost_sys_read(CPUState *cs, gdb_syscall_complete_cb complete,
>          complete(cs, -1, EBADF);
>      }
>  }
> +
> +void semihost_sys_write_gf(CPUState *cs, gdb_syscall_complete_cb complete,
> +                           GuestFD *gf, target_ulong buf, target_ulong len)
> +{
> +    switch (gf->type) {
> +    case GuestFDGDB:
> +        gdb_write(cs, complete, gf, buf, len);
> +        break;
> +    case GuestFDHost:
> +        host_write(cs, complete, gf, buf, len);
> +        break;
> +    case GuestFDStatic:
> +        /* Static files are never open for writing: EBADF. */
> +        complete(cs, -1, EBADF);
> +        break;
> +    default:
> +        g_assert_not_reached();
> +    }
> +}
> +
> +void semihost_sys_write(CPUState *cs, gdb_syscall_complete_cb complete,
> +                        int fd, target_ulong buf, target_ulong len)
> +{
> +    GuestFD *gf = get_guestfd(fd);
> +
> +    if (gf) {
> +        semihost_sys_write_gf(cs, complete, gf, buf, len);
> +    } else {
> +        complete(cs, -1, EBADF);
> +    }
> +}
> -- 
> 2.34.1
> 
> 
> 
> 
> To declare a filtering error, please use the following link : https://www.security-mail.net/reporter.php?mid=c32f.629fcee1.e7f15.0&r=lmichel%40kalrayinc.com&s=qemu-devel-bounces%2Blmichel%3Dkalrayinc.com%40nongnu.org&o=%5BPATCH+v4+30%2F53%5D+semihosting%3A+Split+out+semihost_sys_write&verdict=C&c=3bbac77ccd2af6af6edbaa9dc0a61a8e124e1221
> 

-- 






  reply	other threads:[~2022-06-22 19:32 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 [this message]
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 ` [PATCH v4 47/53] semihosting: Create qemu_semihosting_guestfd_init Richard Henderson
2022-06-27  8:36   ` 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=20220622192840.GI28991@ws2101.lin.mbt.kalray.eu \
    --to=lmichel@kalray.eu \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.