From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: Luc Michel <lmichel@kalray.eu>
Subject: [PULL 53/60] semihosting: Create semihost_sys_poll_one
Date: Tue, 28 Jun 2022 10:23:56 +0530 [thread overview]
Message-ID: <20220628045403.508716-54-richard.henderson@linaro.org> (raw)
In-Reply-To: <20220628045403.508716-1-richard.henderson@linaro.org>
This will be used for implementing the xtensa select_one
system call. Choose "poll" over "select" so that we can
reuse Glib's g_poll constants and to avoid struct timeval.
Reviewed-by: Luc Michel <lmichel@kalray.eu>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
include/semihosting/console.h | 16 ++++++++
include/semihosting/syscalls.h | 3 ++
semihosting/console.c | 19 ++++++++-
semihosting/syscalls.c | 70 ++++++++++++++++++++++++++++++++++
4 files changed, 106 insertions(+), 2 deletions(-)
diff --git a/include/semihosting/console.h b/include/semihosting/console.h
index 20c31d89d4..61b0cb3a94 100644
--- a/include/semihosting/console.h
+++ b/include/semihosting/console.h
@@ -53,4 +53,20 @@ int qemu_semihosting_console_write(void *buf, int len);
*/
int qemu_semihosting_log_out(const char *s, int len);
+/*
+ * qemu_semihosting_console_block_until_ready:
+ * @cs: CPUState
+ *
+ * If no data is available we suspend the CPU and will re-execute the
+ * instruction when data is available.
+ */
+void qemu_semihosting_console_block_until_ready(CPUState *cs);
+
+/**
+ * qemu_semihosting_console_ready:
+ *
+ * Return true if characters are available for read; does not block.
+ */
+bool qemu_semihosting_console_ready(void);
+
#endif /* SEMIHOST_CONSOLE_H */
diff --git a/include/semihosting/syscalls.h b/include/semihosting/syscalls.h
index 347200cb9f..3a5ec229eb 100644
--- a/include/semihosting/syscalls.h
+++ b/include/semihosting/syscalls.h
@@ -69,4 +69,7 @@ void semihost_sys_system(CPUState *cs, gdb_syscall_complete_cb complete,
void semihost_sys_gettimeofday(CPUState *cs, gdb_syscall_complete_cb complete,
target_ulong tv_addr, target_ulong tz_addr);
+void semihost_sys_poll_one(CPUState *cs, gdb_syscall_complete_cb complete,
+ int fd, GIOCondition cond, int timeout);
+
#endif /* SEMIHOSTING_SYSCALLS_H */
diff --git a/semihosting/console.c b/semihosting/console.c
index c84ab97ab6..cda7cf1905 100644
--- a/semihosting/console.c
+++ b/semihosting/console.c
@@ -77,10 +77,17 @@ static void console_read(void *opaque, const uint8_t *buf, int size)
c->sleeping_cpus = NULL;
}
-int qemu_semihosting_console_read(CPUState *cs, void *buf, int len)
+bool qemu_semihosting_console_ready(void)
+{
+ SemihostingConsole *c = &console;
+
+ g_assert(qemu_mutex_iothread_locked());
+ return !fifo8_is_empty(&c->fifo);
+}
+
+void qemu_semihosting_console_block_until_ready(CPUState *cs)
{
SemihostingConsole *c = &console;
- int ret = 0;
g_assert(qemu_mutex_iothread_locked());
@@ -92,6 +99,14 @@ int qemu_semihosting_console_read(CPUState *cs, void *buf, int len)
cpu_loop_exit(cs);
/* never returns */
}
+}
+
+int qemu_semihosting_console_read(CPUState *cs, void *buf, int len)
+{
+ SemihostingConsole *c = &console;
+ int ret = 0;
+
+ qemu_semihosting_console_block_until_ready(cs);
/* Read until buffer full or fifo exhausted. */
do {
diff --git a/semihosting/syscalls.c b/semihosting/syscalls.c
index 9e499b1751..4847f66c02 100644
--- a/semihosting/syscalls.c
+++ b/semihosting/syscalls.c
@@ -520,6 +520,21 @@ static void host_gettimeofday(CPUState *cs, gdb_syscall_complete_cb complete,
unlock_user(p, tv_addr, sizeof(struct gdb_timeval));
}
+#ifndef CONFIG_USER_ONLY
+static void host_poll_one(CPUState *cs, gdb_syscall_complete_cb complete,
+ GuestFD *gf, GIOCondition cond, int timeout)
+{
+ /*
+ * Since this is only used by xtensa in system mode, and stdio is
+ * handled through GuestFDConsole, and there are no semihosting
+ * system calls for sockets and the like, that means this descriptor
+ * must be a normal file. Normal files never block and are thus
+ * always ready.
+ */
+ complete(cs, cond & (G_IO_IN | G_IO_OUT), 0);
+}
+#endif
+
/*
* Static file semihosting syscall implementations.
*/
@@ -628,6 +643,34 @@ static void console_fstat(CPUState *cs, gdb_syscall_complete_cb complete,
complete(cs, ret ? -1 : 0, ret ? -ret : 0);
}
+#ifndef CONFIG_USER_ONLY
+static void console_poll_one(CPUState *cs, gdb_syscall_complete_cb complete,
+ GuestFD *gf, GIOCondition cond, int timeout)
+{
+ /* The semihosting console does not support urgent data or errors. */
+ cond &= G_IO_IN | G_IO_OUT;
+
+ /*
+ * Since qemu_semihosting_console_write never blocks, we can
+ * consider output always ready -- leave G_IO_OUT alone.
+ * All that remains is to conditionally signal input ready.
+ * Since output ready causes an immediate return, only block
+ * for G_IO_IN alone.
+ *
+ * TODO: Implement proper timeout. For now, only support
+ * indefinite wait or immediate poll.
+ */
+ if (cond == G_IO_IN && timeout < 0) {
+ qemu_semihosting_console_block_until_ready(cs);
+ /* We returned -- input must be ready. */
+ } else if ((cond & G_IO_IN) && !qemu_semihosting_console_ready()) {
+ cond &= ~G_IO_IN;
+ }
+
+ complete(cs, cond, 0);
+}
+#endif
+
/*
* Syscall entry points.
*/
@@ -906,3 +949,30 @@ void semihost_sys_gettimeofday(CPUState *cs, gdb_syscall_complete_cb complete,
host_gettimeofday(cs, complete, tv_addr, tz_addr);
}
}
+
+#ifndef CONFIG_USER_ONLY
+void semihost_sys_poll_one(CPUState *cs, gdb_syscall_complete_cb complete,
+ int fd, GIOCondition cond, int timeout)
+{
+ GuestFD *gf = get_guestfd(fd);
+
+ if (!gf) {
+ complete(cs, G_IO_NVAL, 1);
+ return;
+ }
+ switch (gf->type) {
+ case GuestFDGDB:
+ complete(cs, G_IO_NVAL, 1);
+ break;
+ case GuestFDHost:
+ host_poll_one(cs, complete, gf, cond, timeout);
+ break;
+ case GuestFDConsole:
+ console_poll_one(cs, complete, gf, cond, timeout);
+ break;
+ case GuestFDStatic:
+ default:
+ g_assert_not_reached();
+ }
+}
+#endif
--
2.34.1
next prev parent reply other threads:[~2022-06-28 6:47 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-28 4:53 [PULL 00/60] semihosting patch queue Richard Henderson
2022-06-28 4:53 ` [PULL 01/60] semihosting: Move exec/softmmu-semi.h to semihosting/softmmu-uaccess.h Richard Henderson
2022-06-28 4:53 ` [PULL 02/60] semihosting: Return failure from softmmu-uaccess.h functions Richard Henderson
2022-07-29 14:31 ` Peter Maydell
2022-07-29 15:53 ` Richard Henderson
2024-01-29 9:49 ` Philippe Mathieu-Daudé
2022-06-28 4:53 ` [PULL 03/60] semihosting: Improve condition for config.c and console.c Richard Henderson
2022-06-28 4:53 ` [PULL 04/60] semihosting: Move softmmu-uaccess.h functions out of line Richard Henderson
2022-06-28 4:53 ` [PULL 05/60] accel/stubs: Add tcg stub for probe_access_flags Richard Henderson
2022-06-28 4:53 ` [PULL 06/60] semihosting: Add target_strlen for softmmu-uaccess.h Richard Henderson
2022-06-28 4:53 ` [PULL 07/60] semihosting: Simplify softmmu_lock_user_string Richard Henderson
2022-06-28 4:53 ` [PULL 08/60] semihosting: Split out guestfd.c Richard Henderson
2022-06-28 4:53 ` [PULL 09/60] semihosting: Inline set_swi_errno into common_semi_cb Richard Henderson
2022-06-28 4:53 ` [PULL 10/60] semihosting: Adjust error checking in common_semi_cb Richard Henderson
2022-06-28 4:53 ` [PULL 11/60] semihosting: Clean up common_semi_flen_cb Richard Henderson
2022-06-28 4:53 ` [PULL 12/60] semihosting: Clean up common_semi_open_cb Richard Henderson
2022-06-28 4:53 ` [PULL 13/60] semihosting: Return void from do_common_semihosting Richard Henderson
2022-06-28 4:53 ` [PULL 14/60] semihosting: Move common-semi.h to include/semihosting/ Richard Henderson
2022-06-28 4:53 ` [PULL 15/60] semihosting: Remove GDB_O_BINARY Richard Henderson
2022-06-28 4:53 ` [PULL 16/60] include/exec: Move gdb open flags to gdbstub.h Richard Henderson
2022-06-28 4:53 ` [PULL 17/60] include/exec: Move gdb_stat and gdb_timeval " Richard Henderson
2022-06-28 4:53 ` [PULL 18/60] include/exec: Define errno values in gdbstub.h Richard Henderson
2022-06-28 4:53 ` [PULL 19/60] gdbstub: Convert GDB error numbers to host error numbers Richard Henderson
2022-06-28 4:53 ` [PULL 20/60] semihosting: Use struct gdb_stat in common_semi_flen_cb Richard Henderson
2022-06-28 4:53 ` [PULL 21/60] semihosting: Split is_64bit_semihosting per target Richard Henderson
2022-06-28 4:53 ` [PULL 22/60] semihosting: Split common_semi_flen_buf " Richard Henderson
2022-06-28 4:53 ` [PULL 23/60] semihosting: Split out common_semi_has_synccache Richard Henderson
2022-06-28 4:53 ` [PULL 24/60] semihosting: Split out common-semi-target.h Richard Henderson
2022-06-28 4:53 ` [PULL 25/60] semihosting: Use env more often in do_common_semihosting Richard Henderson
2022-06-28 4:53 ` [PULL 26/60] semihosting: Move GET_ARG/SET_ARG earlier in the file Richard Henderson
2022-06-28 4:53 ` [PULL 27/60] semihosting: Split out semihost_sys_open Richard Henderson
2022-06-28 4:53 ` [PULL 28/60] semihosting: Split out semihost_sys_close Richard Henderson
2022-06-28 4:53 ` [PULL 29/60] semihosting: Split out semihost_sys_read Richard Henderson
2022-06-28 4:53 ` [PULL 30/60] semihosting: Split out semihost_sys_write Richard Henderson
2022-06-28 4:53 ` [PULL 31/60] semihosting: Bound length for semihost_sys_{read,write} Richard Henderson
2022-06-28 4:53 ` [PULL 32/60] semihosting: Split out semihost_sys_lseek Richard Henderson
2022-06-28 4:53 ` [PULL 33/60] semihosting: Split out semihost_sys_isatty Richard Henderson
2022-06-28 4:53 ` [PULL 34/60] semihosting: Split out semihost_sys_flen Richard Henderson
2022-06-28 4:53 ` [PULL 35/60] semihosting: Split out semihost_sys_remove Richard Henderson
2022-06-28 4:53 ` [PULL 36/60] semihosting: Split out semihost_sys_rename Richard Henderson
2022-06-28 4:53 ` [PULL 37/60] semihosting: Split out semihost_sys_system Richard Henderson
2022-06-28 4:53 ` [PULL 38/60] semihosting: Create semihost_sys_{stat,fstat} Richard Henderson
2022-06-28 4:53 ` [PULL 39/60] semihosting: Create semihost_sys_gettimeofday Richard Henderson
2022-06-28 4:53 ` [PULL 40/60] gdbstub: Adjust gdb_syscall_complete_cb declaration Richard Henderson
2022-06-28 4:53 ` [PULL 41/60] semihosting: Fix docs comment for qemu_semihosting_console_inc Richard Henderson
2022-06-28 4:53 ` [PULL 42/60] semihosting: Pass CPUState to qemu_semihosting_console_inc Richard Henderson
2022-06-28 4:53 ` [PULL 43/60] semihosting: Expand qemu_semihosting_console_inc to read Richard Henderson
2022-06-28 4:53 ` [PULL 44/60] semihosting: Cleanup chardev init Richard Henderson
2022-06-28 4:53 ` [PULL 45/60] semihosting: Create qemu_semihosting_console_write Richard Henderson
2022-06-28 4:53 ` [PULL 46/60] semihosting: Add GuestFDConsole Richard Henderson
2022-06-28 4:53 ` [PULL 47/60] semihosting: Create qemu_semihosting_guestfd_init Richard Henderson
2022-06-28 4:53 ` [PULL 48/60] semihosting: Use console_in_gf for SYS_READC Richard Henderson
2022-06-28 4:53 ` [PULL 49/60] semihosting: Use console_out_gf for SYS_WRITEC Richard Henderson
2022-06-28 4:53 ` [PULL 50/60] semihosting: Remove qemu_semihosting_console_outc Richard Henderson
2022-06-28 4:53 ` [PULL 51/60] semihosting: Use console_out_gf for SYS_WRITE0 Richard Henderson
2022-06-28 4:53 ` [PULL 52/60] semihosting: Remove qemu_semihosting_console_outs Richard Henderson
2022-06-28 4:53 ` Richard Henderson [this message]
2022-06-28 4:53 ` [PULL 54/60] target/m68k: Eliminate m68k_semi_is_fseek Richard Henderson
2022-06-28 4:53 ` [PULL 55/60] target/m68k: Make semihosting system only Richard Henderson
2022-06-28 4:53 ` [PULL 56/60] target/mips: Use an exception for semihosting Richard Henderson
2022-06-28 4:54 ` [PULL 57/60] target/mips: Add UHI errno values Richard Henderson
2022-06-28 4:54 ` [PULL 58/60] target/mips: Drop pread and pwrite syscalls from semihosting Richard Henderson
2022-06-28 4:54 ` [PULL 59/60] target/nios2: Eliminate nios2_semi_is_lseek Richard Henderson
2022-06-28 4:54 ` [PULL 60/60] target/nios2: Move nios2-semi.c to nios2_softmmu_ss Richard Henderson
2022-06-28 6:20 ` [PULL 00/60] semihosting patch queue 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=20220628045403.508716-54-richard.henderson@linaro.org \
--to=richard.henderson@linaro.org \
--cc=lmichel@kalray.eu \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).