[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v4 33/53] semihosting: Split out semihost_sys_isatty
From: |
Luc Michel |
Subject: |
Re: [PATCH v4 33/53] semihosting: Split out semihost_sys_isatty |
Date: |
Wed, 22 Jun 2022 21:48:04 +0200 |
User-agent: |
Mutt/1.9.4 (2018-02-28) |
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.henderson@linaro.org>
Reviewed-by: Luc Michel <lmichel@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
>
--
- Re: [PATCH v4 28/53] semihosting: Split out semihost_sys_close, (continued)
- [PATCH v4 26/53] semihosting: Move GET_ARG/SET_ARG earlier in the file, Richard Henderson, 2022/06/07
- [PATCH v4 29/53] semihosting: Split out semihost_sys_read, Richard Henderson, 2022/06/07
- [PATCH v4 32/53] semihosting: Split out semihost_sys_lseek, Richard Henderson, 2022/06/07
- [PATCH v4 30/53] semihosting: Split out semihost_sys_write, Richard Henderson, 2022/06/07
- [PATCH v4 33/53] semihosting: Split out semihost_sys_isatty, Richard Henderson, 2022/06/07
- Re: [PATCH v4 33/53] semihosting: Split out semihost_sys_isatty,
Luc Michel <=
- [PATCH v4 34/53] semihosting: Split out semihost_sys_flen, Richard Henderson, 2022/06/07
- [PATCH v4 36/53] semihosting: Split out semihost_sys_rename, Richard Henderson, 2022/06/07
- [PATCH v4 39/53] semihosting: Create semihost_sys_gettimeofday, Richard Henderson, 2022/06/07
- [PATCH v4 41/53] semihosting: Fix docs comment for qemu_semihosting_console_inc, Richard Henderson, 2022/06/07
- [PATCH v4 45/53] semihosting: Create qemu_semihosting_console_write, Richard Henderson, 2022/06/07