All of lore.kernel.org
 help / color / mirror / Atom feed
From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, alex.bennee@linaro.org
Subject: [PATCH v3 24/49] semihosting: Split out semihost_sys_close
Date: Fri, 20 May 2022 17:03:35 -0700	[thread overview]
Message-ID: <20220521000400.454525-25-richard.henderson@linaro.org> (raw)
In-Reply-To: <20220521000400.454525-1-richard.henderson@linaro.org>

Split out the non-ARM specific portions of SYS_CLOSE to a
reusable function.  This handles all GuestFD.

Note that gdb_do_syscall %x reads target_ulong, not int.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 include/semihosting/syscalls.h |  3 +++
 semihosting/arm-compat-semi.c  | 41 +----------------------------
 semihosting/guestfd.c          |  7 ++++-
 semihosting/syscalls.c         | 47 ++++++++++++++++++++++++++++++++++
 4 files changed, 57 insertions(+), 41 deletions(-)

diff --git a/include/semihosting/syscalls.h b/include/semihosting/syscalls.h
index 991658bf79..00e718f11d 100644
--- a/include/semihosting/syscalls.h
+++ b/include/semihosting/syscalls.h
@@ -22,4 +22,7 @@ void semihost_sys_open(CPUState *cs, gdb_syscall_complete_cb complete,
                        target_ulong fname, target_ulong fname_len,
                        int gdb_flags, int mode);
 
+void semihost_sys_close(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 cc008d0338..9bb80c3286 100644
--- a/semihosting/arm-compat-semi.c
+++ b/semihosting/arm-compat-semi.c
@@ -276,7 +276,6 @@ 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_closefn(CPUState *cs, GuestFD *gf);
 typedef void sys_writefn(CPUState *cs, GuestFD *gf,
                          target_ulong buf, uint32_t len);
 typedef void sys_readfn(CPUState *cs, GuestFD *gf,
@@ -285,23 +284,6 @@ 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_closefn(CPUState *cs, GuestFD *gf)
-{
-    int ret;
-    /*
-     * Only close the underlying host fd if it's one we opened on behalf
-     * of the guest in SYS_OPEN.
-     */
-    if (gf->hostfd == STDIN_FILENO ||
-        gf->hostfd == STDOUT_FILENO ||
-        gf->hostfd == STDERR_FILENO) {
-        ret = 0;
-    } else {
-        ret = close(gf->hostfd);
-    }
-    common_semi_cb(cs, ret, ret ? errno : 0);
-}
-
 static void host_writefn(CPUState *cs, GuestFD *gf,
                          target_ulong buf, uint32_t len)
 {
@@ -362,11 +344,6 @@ static void host_flenfn(CPUState *cs, GuestFD *gf)
     }
 }
 
-static void gdb_closefn(CPUState *cs, GuestFD *gf)
-{
-    gdb_do_syscall(common_semi_cb, "close,%x", gf->hostfd);
-}
-
 static void gdb_writefn(CPUState *cs, GuestFD *gf,
                         target_ulong buf, uint32_t len)
 {
@@ -414,12 +391,6 @@ static const uint8_t featurefile_data[] = {
     SH_EXT_EXIT_EXTENDED | SH_EXT_STDOUT_STDERR, /* Feature byte 0 */
 };
 
-static void staticfile_closefn(CPUState *cs, GuestFD *gf)
-{
-    /* Nothing to do */
-    common_semi_cb(cs, 0, 0);
-}
-
 static void staticfile_writefn(CPUState *cs, GuestFD *gf,
                                target_ulong buf, uint32_t len)
 {
@@ -468,7 +439,6 @@ static void staticfile_flenfn(CPUState *cs, GuestFD *gf)
 }
 
 typedef struct GuestFDFunctions {
-    sys_closefn *closefn;
     sys_writefn *writefn;
     sys_readfn *readfn;
     sys_isattyfn *isattyfn;
@@ -478,7 +448,6 @@ typedef struct GuestFDFunctions {
 
 static const GuestFDFunctions guestfd_fns[] = {
     [GuestFDHost] = {
-        .closefn = host_closefn,
         .writefn = host_writefn,
         .readfn = host_readfn,
         .isattyfn = host_isattyfn,
@@ -486,7 +455,6 @@ static const GuestFDFunctions guestfd_fns[] = {
         .flenfn = host_flenfn,
     },
     [GuestFDGDB] = {
-        .closefn = gdb_closefn,
         .writefn = gdb_writefn,
         .readfn = gdb_readfn,
         .isattyfn = gdb_isattyfn,
@@ -494,7 +462,6 @@ static const GuestFDFunctions guestfd_fns[] = {
         .flenfn = gdb_flenfn,
     },
     [GuestFDStatic] = {
-        .closefn = staticfile_closefn,
         .writefn = staticfile_writefn,
         .readfn = staticfile_readfn,
         .isattyfn = staticfile_isattyfn,
@@ -585,13 +552,7 @@ void do_common_semihosting(CPUState *cs)
 
     case TARGET_SYS_CLOSE:
         GET_ARG(0);
-
-        gf = get_guestfd(arg0);
-        if (!gf) {
-            goto do_badf;
-        }
-        guestfd_fns[gf->type].closefn(cs, gf);
-        dealloc_guestfd(arg0);
+        semihost_sys_close(cs, common_semi_cb, arg0);
         break;
 
     case TARGET_SYS_WRITEC:
diff --git a/semihosting/guestfd.c b/semihosting/guestfd.c
index 7ac2e147a8..e3122ebba9 100644
--- a/semihosting/guestfd.c
+++ b/semihosting/guestfd.c
@@ -49,6 +49,11 @@ int alloc_guestfd(void)
     return i;
 }
 
+static void do_dealloc_guestfd(GuestFD *gf)
+{
+    gf->type = GuestFDUnused;
+}
+
 /*
  * Look up the guestfd in the data structure; return NULL
  * for out of bounds, but don't check whether the slot is unused.
@@ -119,5 +124,5 @@ void dealloc_guestfd(int guestfd)
     GuestFD *gf = do_get_guestfd(guestfd);
 
     assert(gf);
-    gf->type = GuestFDUnused;
+    do_dealloc_guestfd(gf);
 }
diff --git a/semihosting/syscalls.c b/semihosting/syscalls.c
index a44d5cbae2..9c4b635317 100644
--- a/semihosting/syscalls.c
+++ b/semihosting/syscalls.c
@@ -124,6 +124,12 @@ static void gdb_open(CPUState *cs, gdb_syscall_complete_cb complete,
                    fname, len, (target_ulong)gdb_flags, (target_ulong)mode);
 }
 
+static void gdb_close(CPUState *cs, gdb_syscall_complete_cb complete,
+                      GuestFD *gf)
+{
+    gdb_do_syscall(complete, "close,%x", (target_ulong)gf->hostfd);
+}
+
 /*
  * Host semihosting syscall implementations.
  */
@@ -170,6 +176,23 @@ static void host_open(CPUState *cs, gdb_syscall_complete_cb complete,
     unlock_user(p, fname, 0);
 }
 
+static void host_close(CPUState *cs, gdb_syscall_complete_cb complete,
+                       GuestFD *gf)
+{
+    /*
+     * Only close the underlying host fd if it's one we opened on behalf
+     * of the guest in SYS_OPEN.
+     */
+    if (gf->hostfd != STDIN_FILENO &&
+        gf->hostfd != STDOUT_FILENO &&
+        gf->hostfd != STDERR_FILENO &&
+        close(gf->hostfd) < 0) {
+        complete(cs, -1, errno_for_gdb());
+    } else {
+        complete(cs, 0, 0);
+    }
+}
+
 /*
  * Syscall entry points.
  */
@@ -184,3 +207,27 @@ void semihost_sys_open(CPUState *cs, gdb_syscall_complete_cb complete,
         host_open(cs, complete, fname, fname_len, gdb_flags, mode);
     }
 }
+
+void semihost_sys_close(CPUState *cs, gdb_syscall_complete_cb complete, int fd)
+{
+    GuestFD *gf = get_guestfd(fd);
+
+    if (!gf) {
+        complete(cs, -1, GDB_EBADF);
+        return;
+    }
+    switch (gf->type) {
+    case GuestFDGDB:
+        gdb_close(cs, complete, gf);
+        break;
+    case GuestFDHost:
+        host_close(cs, complete, gf);
+        break;
+    case GuestFDStatic:
+        complete(cs, 0, 0);
+        break;
+    default:
+        g_assert_not_reached();
+    }
+    dealloc_guestfd(fd);
+}
-- 
2.34.1



  parent reply	other threads:[~2022-05-21  0:39 UTC|newest]

Thread overview: 83+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-21  0:03 [PATCH v3 00/49] semihosting cleanup Richard Henderson
2022-05-21  0:03 ` [PATCH v3 01/49] semihosting: Move exec/softmmu-semi.h to semihosting/softmmu-uaccess.h Richard Henderson
2022-05-21  0:03 ` [PATCH v3 02/49] semihosting: Return failure from softmmu-uaccess.h functions Richard Henderson
2022-05-21  0:03 ` [PATCH v3 03/49] semihosting: Improve condition for config.c and console.c Richard Henderson
2022-05-21  0:03 ` [PATCH v3 04/49] semihosting: Move softmmu-uaccess.h functions out of line Richard Henderson
2022-05-21  0:03 ` [PATCH v3 05/49] semihosting: Add target_strlen for softmmu-uaccess.h Richard Henderson
2022-05-21  4:51   ` Richard Henderson
2022-05-23 10:55     ` Peter Maydell
2022-05-21  0:03 ` [PATCH v3 06/49] semihosting: Simplify softmmu_lock_user_string Richard Henderson
2022-05-21  0:03 ` [PATCH v3 07/49] semihosting: Split out guestfd.c Richard Henderson
2022-05-21  0:03 ` [PATCH v3 08/49] semihosting: Inline set_swi_errno into common_semi_cb Richard Henderson
2022-05-23 10:58   ` Peter Maydell
2022-05-23 14:58     ` Richard Henderson
2022-05-23 16:58       ` Peter Maydell
2022-05-21  0:03 ` [PATCH v3 09/49] semihosting: Adjust error checking in common_semi_cb Richard Henderson
2022-05-23 12:13   ` Peter Maydell
2022-05-23 15:35     ` Richard Henderson
2022-05-23 15:44       ` Peter Maydell
2022-06-07 17:41       ` Richard Henderson
2022-05-21  0:03 ` [PATCH v3 10/49] semihosting: Clean up common_semi_flen_cb Richard Henderson
2022-06-07  9:05   ` Alex Bennée
2022-05-21  0:03 ` [PATCH v3 11/49] semihosting: Clean up common_semi_open_cb Richard Henderson
2022-06-07 11:30   ` Alex Bennée
2022-05-21  0:03 ` [PATCH v3 12/49] semihosting: Return void from do_common_semihosting Richard Henderson
2022-05-21  0:03 ` [PATCH v3 13/49] semihosting: Move common-semi.h to include/semihosting/ Richard Henderson
2022-05-23 12:14   ` Peter Maydell
2022-05-21  0:03 ` [PATCH v3 14/49] include/exec: Move gdb open flags to gdbstub.h Richard Henderson
2022-05-23 12:26   ` Peter Maydell
2022-06-07 13:58   ` Alex Bennée
2022-05-21  0:03 ` [PATCH v3 15/49] include/exec: Move gdb_stat and gdb_timeval " Richard Henderson
2022-05-23 12:42   ` Peter Maydell
2022-06-07 13:59   ` Alex Bennée
2022-05-21  0:03 ` [PATCH v3 16/49] include/exec: Define errno values in gdbstub.h Richard Henderson
2022-05-23 12:44   ` Peter Maydell
2022-05-21  0:03 ` [PATCH v3 17/49] semihosting: Use struct gdb_stat in common_semi_flen_cb Richard Henderson
2022-05-23 12:47   ` Peter Maydell
2022-05-21  0:03 ` [PATCH v3 18/49] semihosting: Split is_64bit_semihosting per target Richard Henderson
2022-05-23 12:48   ` Peter Maydell
2022-05-21  0:03 ` [PATCH v3 19/49] semihosting: Split common_semi_flen_buf " Richard Henderson
2022-05-23 12:50   ` Peter Maydell
2022-05-21  0:03 ` [PATCH v3 20/49] semihosting: Split out common_semi_has_synccache Richard Henderson
2022-05-23 12:51   ` Peter Maydell
2022-05-23 15:40     ` Richard Henderson
2022-05-21  0:03 ` [PATCH v3 21/49] semihosting: Use env more often in do_common_semihosting Richard Henderson
2022-05-23 12:53   ` Peter Maydell
2022-05-23 15:41     ` Richard Henderson
2022-05-21  0:03 ` [PATCH v3 22/49] semihosting: Move GET_ARG/SET_ARG earlier in the file Richard Henderson
2022-05-23 12:53   ` Peter Maydell
2022-05-21  0:03 ` [PATCH v3 23/49] semihosting: Split out semihost_sys_open Richard Henderson
2022-05-23 13:30   ` Peter Maydell
2022-05-23 15:46     ` Richard Henderson
2022-05-23 16:54       ` Peter Maydell
2022-05-23 18:21         ` Richard Henderson
2022-06-07 18:23     ` Richard Henderson
2022-05-21  0:03 ` Richard Henderson [this message]
2022-05-21  0:03 ` [PATCH v3 25/49] semihosting: Split out semihost_sys_read Richard Henderson
2022-05-21  0:03 ` [PATCH v3 26/49] semihosting: Split out semihost_sys_write Richard Henderson
2022-05-21  0:03 ` [PATCH v3 27/49] semihosting: Bound length for semihost_sys_{read, write} Richard Henderson
2022-05-21  0:03 ` [PATCH v3 28/49] semihosting: Split out semihost_sys_lseek Richard Henderson
2022-05-21  0:03 ` [PATCH v3 29/49] semihosting: Split out semihost_sys_isatty Richard Henderson
2022-05-21  0:03 ` [PATCH v3 30/49] semihosting: Split out semihost_sys_flen Richard Henderson
2022-05-21  0:03 ` [PATCH v3 31/49] semihosting: Split out semihost_sys_remove Richard Henderson
2022-05-21  0:03 ` [PATCH v3 32/49] semihosting: Split out semihost_sys_rename Richard Henderson
2022-05-21  0:03 ` [PATCH v3 33/49] semihosting: Split out semihost_sys_system Richard Henderson
2022-05-21  0:03 ` [PATCH v3 34/49] semihosting: Create semihost_sys_{stat,fstat} Richard Henderson
2022-05-21  0:03 ` [PATCH v3 35/49] semihosting: Create semihost_sys_gettimeofday Richard Henderson
2022-05-21  0:03 ` [PATCH v3 36/49] gdbstub: Widen gdb_syscall_complete_cb return value Richard Henderson
2022-05-23 13:32   ` Peter Maydell
2022-05-21  0:03 ` [PATCH v3 37/49] semihosting: Fix docs comment for qemu_semihosting_console_inc Richard Henderson
2022-05-23 13:38   ` Peter Maydell
2022-05-21  0:03 ` [PATCH v3 38/49] semihosting: Pass CPUState to qemu_semihosting_console_inc Richard Henderson
2022-05-23 13:39   ` Peter Maydell
2022-05-21  0:03 ` [PATCH v3 39/49] semihosting: Expand qemu_semihosting_console_inc to read Richard Henderson
2022-05-21  0:03 ` [PATCH v3 40/49] semihosting: Cleanup chardev init Richard Henderson
2022-05-21  0:03 ` [PATCH v3 41/49] semihosting: Create qemu_semihosting_console_write Richard Henderson
2022-05-21  0:03 ` [PATCH v3 42/49] semihosting: Add GuestFDConsole Richard Henderson
2022-05-21  0:03 ` [PATCH v3 43/49] semihosting: Create qemu_semihosting_guestfd_init Richard Henderson
2022-05-21  0:03 ` [PATCH v3 44/49] semihosting: Use console_in_gf for SYS_READC Richard Henderson
2022-05-21  0:03 ` [PATCH v3 45/49] semihosting: Use console_out_gf for SYS_WRITEC Richard Henderson
2022-05-21  0:03 ` [PATCH v3 46/49] semihosting: Remove qemu_semihosting_console_outc Richard Henderson
2022-05-21  0:03 ` [PATCH v3 47/49] semihosting: Use console_out_gf for SYS_WRITE0 Richard Henderson
2022-05-21  0:03 ` [PATCH v3 48/49] semihosting: Remove qemu_semihosting_console_outs Richard Henderson
2022-05-21  0:04 ` [PATCH v3 49/49] semihosting: Create semihost_sys_poll_one Richard Henderson

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=20220521000400.454525-25-richard.henderson@linaro.org \
    --to=richard.henderson@linaro.org \
    --cc=alex.bennee@linaro.org \
    --cc=peter.maydell@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 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.