[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3 7/8] linux-user: Simplify host <-> target errno conversion
From: |
Laurent Vivier |
Subject: |
Re: [PATCH v3 7/8] linux-user: Simplify host <-> target errno conversion using macros |
Date: |
Thu, 8 Jul 2021 19:33:53 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 |
Le 08/07/2021 à 19:05, Philippe Mathieu-Daudé a écrit :
> Convert the host_to_target_errno_table[] array to a switch
> case to allow compiler optimizations (such noticing the identity
> function when host and guest errnos match). Extract the errnos
> list as to a new includible unit, using a generic macro. Remove
> the code related to target_to_host_errno_table[] initialization.
>
> Suggested-by: Richard Henderson <richard.henderson@linaro.org>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> linux-user/syscall.c | 159 ++++------------------------------------
> linux-user/errnos.c.inc | 140 +++++++++++++++++++++++++++++++++++
> 2 files changed, 154 insertions(+), 145 deletions(-)
> create mode 100644 linux-user/errnos.c.inc
>
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 4842a1987b7..94ec6f730b3 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -509,150 +509,26 @@ static inline int next_free_host_timer(void)
>
> #define ERRNO_TABLE_SIZE 1200
>
> -/* target_to_host_errno_table[] is initialized from
> - * host_to_target_errno_table[] in syscall_init(). */
> -static uint16_t target_to_host_errno_table[ERRNO_TABLE_SIZE] = {
> -};
> -
> -/*
> - * This list is the union of errno values overridden in asm-<arch>/errno.h
> - * minus the errnos that are not actually generic to all archs.
> - */
> -static uint16_t host_to_target_errno_table[ERRNO_TABLE_SIZE] = {
> - [EAGAIN] = TARGET_EAGAIN,
> - [EIDRM] = TARGET_EIDRM,
> - [ECHRNG] = TARGET_ECHRNG,
> - [EL2NSYNC] = TARGET_EL2NSYNC,
> - [EL3HLT] = TARGET_EL3HLT,
> - [EL3RST] = TARGET_EL3RST,
> - [ELNRNG] = TARGET_ELNRNG,
> - [EUNATCH] = TARGET_EUNATCH,
> - [ENOCSI] = TARGET_ENOCSI,
> - [EL2HLT] = TARGET_EL2HLT,
> - [EDEADLK] = TARGET_EDEADLK,
> - [ENOLCK] = TARGET_ENOLCK,
> - [EBADE] = TARGET_EBADE,
> - [EBADR] = TARGET_EBADR,
> - [EXFULL] = TARGET_EXFULL,
> - [ENOANO] = TARGET_ENOANO,
> - [EBADRQC] = TARGET_EBADRQC,
> - [EBADSLT] = TARGET_EBADSLT,
> - [EBFONT] = TARGET_EBFONT,
> - [ENOSTR] = TARGET_ENOSTR,
> - [ENODATA] = TARGET_ENODATA,
> - [ETIME] = TARGET_ETIME,
> - [ENOSR] = TARGET_ENOSR,
> - [ENONET] = TARGET_ENONET,
> - [ENOPKG] = TARGET_ENOPKG,
> - [EREMOTE] = TARGET_EREMOTE,
> - [ENOLINK] = TARGET_ENOLINK,
> - [EADV] = TARGET_EADV,
> - [ESRMNT] = TARGET_ESRMNT,
> - [ECOMM] = TARGET_ECOMM,
> - [EPROTO] = TARGET_EPROTO,
> - [EDOTDOT] = TARGET_EDOTDOT,
> - [EMULTIHOP] = TARGET_EMULTIHOP,
> - [EBADMSG] = TARGET_EBADMSG,
> - [ENAMETOOLONG] = TARGET_ENAMETOOLONG,
> - [EOVERFLOW] = TARGET_EOVERFLOW,
> - [ENOTUNIQ] = TARGET_ENOTUNIQ,
> - [EBADFD] = TARGET_EBADFD,
> - [EREMCHG] = TARGET_EREMCHG,
> - [ELIBACC] = TARGET_ELIBACC,
> - [ELIBBAD] = TARGET_ELIBBAD,
> - [ELIBSCN] = TARGET_ELIBSCN,
> - [ELIBMAX] = TARGET_ELIBMAX,
> - [ELIBEXEC] = TARGET_ELIBEXEC,
> - [EILSEQ] = TARGET_EILSEQ,
> - [ENOSYS] = TARGET_ENOSYS,
> - [ELOOP] = TARGET_ELOOP,
> - [ERESTART] = TARGET_ERESTART,
> - [ESTRPIPE] = TARGET_ESTRPIPE,
> - [ENOTEMPTY] = TARGET_ENOTEMPTY,
> - [EUSERS] = TARGET_EUSERS,
> - [ENOTSOCK] = TARGET_ENOTSOCK,
> - [EDESTADDRREQ] = TARGET_EDESTADDRREQ,
> - [EMSGSIZE] = TARGET_EMSGSIZE,
> - [EPROTOTYPE] = TARGET_EPROTOTYPE,
> - [ENOPROTOOPT] = TARGET_ENOPROTOOPT,
> - [EPROTONOSUPPORT] = TARGET_EPROTONOSUPPORT,
> - [ESOCKTNOSUPPORT] = TARGET_ESOCKTNOSUPPORT,
> - [EOPNOTSUPP] = TARGET_EOPNOTSUPP,
> - [EPFNOSUPPORT] = TARGET_EPFNOSUPPORT,
> - [EAFNOSUPPORT] = TARGET_EAFNOSUPPORT,
> - [EADDRINUSE] = TARGET_EADDRINUSE,
> - [EADDRNOTAVAIL] = TARGET_EADDRNOTAVAIL,
> - [ENETDOWN] = TARGET_ENETDOWN,
> - [ENETUNREACH] = TARGET_ENETUNREACH,
> - [ENETRESET] = TARGET_ENETRESET,
> - [ECONNABORTED] = TARGET_ECONNABORTED,
> - [ECONNRESET] = TARGET_ECONNRESET,
> - [ENOBUFS] = TARGET_ENOBUFS,
> - [EISCONN] = TARGET_EISCONN,
> - [ENOTCONN] = TARGET_ENOTCONN,
> - [EUCLEAN] = TARGET_EUCLEAN,
> - [ENOTNAM] = TARGET_ENOTNAM,
> - [ENAVAIL] = TARGET_ENAVAIL,
> - [EISNAM] = TARGET_EISNAM,
> - [EREMOTEIO] = TARGET_EREMOTEIO,
> - [EDQUOT] = TARGET_EDQUOT,
> - [ESHUTDOWN] = TARGET_ESHUTDOWN,
> - [ETOOMANYREFS] = TARGET_ETOOMANYREFS,
> - [ETIMEDOUT] = TARGET_ETIMEDOUT,
> - [ECONNREFUSED] = TARGET_ECONNREFUSED,
> - [EHOSTDOWN] = TARGET_EHOSTDOWN,
> - [EHOSTUNREACH] = TARGET_EHOSTUNREACH,
> - [EALREADY] = TARGET_EALREADY,
> - [EINPROGRESS] = TARGET_EINPROGRESS,
> - [ESTALE] = TARGET_ESTALE,
> - [ECANCELED] = TARGET_ECANCELED,
> - [ENOMEDIUM] = TARGET_ENOMEDIUM,
> - [EMEDIUMTYPE] = TARGET_EMEDIUMTYPE,
> -#ifdef ENOKEY
> - [ENOKEY] = TARGET_ENOKEY,
> -#endif
> -#ifdef EKEYEXPIRED
> - [EKEYEXPIRED] = TARGET_EKEYEXPIRED,
> -#endif
> -#ifdef EKEYREVOKED
> - [EKEYREVOKED] = TARGET_EKEYREVOKED,
> -#endif
> -#ifdef EKEYREJECTED
> - [EKEYREJECTED] = TARGET_EKEYREJECTED,
> -#endif
> -#ifdef EOWNERDEAD
> - [EOWNERDEAD] = TARGET_EOWNERDEAD,
> -#endif
> -#ifdef ENOTRECOVERABLE
> - [ENOTRECOVERABLE] = TARGET_ENOTRECOVERABLE,
> -#endif
> -#ifdef ENOMSG
> - [ENOMSG] = TARGET_ENOMSG,
> -#endif
> -#ifdef ERFKILL
> - [ERFKILL] = TARGET_ERFKILL,
> -#endif
> -#ifdef EHWPOISON
> - [EHWPOISON] = TARGET_EHWPOISON,
> -#endif
> -};
> -
> -static inline int host_to_target_errno(int err)
> +static inline int host_to_target_errno(int host_errno)
> {
> - if (err >= 0 && err < ERRNO_TABLE_SIZE &&
> - host_to_target_errno_table[err]) {
> - return host_to_target_errno_table[err];
> + switch (host_errno) {
> +#define E(X) case X: return TARGET_##X;
> +#include "errnos.c.inc"
> +#undef E
> + default:
> + return host_errno;
> }
> - return err;
> }
>
> -static inline int target_to_host_errno(int err)
> +static inline int target_to_host_errno(int target_errno)
> {
> - if (err >= 0 && err < ERRNO_TABLE_SIZE &&
> - target_to_host_errno_table[err]) {
> - return target_to_host_errno_table[err];
> + switch (target_errno) {
> +#define E(X) case TARGET_##X: return X;
> +#include "errnos.c.inc"
> +#undef E
> + default:
> + return target_errno;
> }
> - return err;
> }
>
> static inline abi_long get_errno(abi_long ret)
> @@ -7102,7 +6978,6 @@ void syscall_init(void)
> IOCTLEntry *ie;
> const argtype *arg_type;
> int size;
> - int i;
>
> thunk_init(STRUCT_MAX);
>
> @@ -7112,12 +6987,6 @@ void syscall_init(void)
> #undef STRUCT
> #undef STRUCT_SPECIAL
>
> - /* Build target_to_host_errno_table[] table from
> - * host_to_target_errno_table[]. */
> - for (i = 0; i < ERRNO_TABLE_SIZE; i++) {
> - target_to_host_errno_table[host_to_target_errno_table[i]] = i;
> - }
> -
> /* we patch the ioctl size if necessary. We rely on the fact that
> no ioctl has all the bits at '1' in the size field */
> ie = ioctl_entries;
> diff --git a/linux-user/errnos.c.inc b/linux-user/errnos.c.inc
> new file mode 100644
> index 00000000000..963ba1ce9d1
> --- /dev/null
> +++ b/linux-user/errnos.c.inc
> @@ -0,0 +1,140 @@
> +/*
> + * This list is the union of errno values overridden in asm-<arch>/errno.h
> + * minus the errnos that are not actually generic to all archs.
> + *
> + * Please keep this list sorted alphabetically.
> + *
> + * Copyright (c) 2003 Fabrice Bellard
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, see <http://www.gnu.org/licenses/>.
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +
> +E(EADDRINUSE)
> +E(EADDRNOTAVAIL)
> +E(EADV)
> +E(EAFNOSUPPORT)
> +E(EAGAIN)
> +E(EALREADY)
> +E(EBADE)
> +E(EBADFD)
> +E(EBADMSG)
> +E(EBADR)
> +E(EBADRQC)
> +E(EBADSLT)
> +E(EBFONT)
> +E(ECANCELED)
> +E(ECHRNG)
> +E(ECOMM)
> +E(ECONNABORTED)
> +E(ECONNREFUSED)
> +E(ECONNRESET)
> +E(EDEADLK)
> +E(EDESTADDRREQ)
> +E(EDOTDOT)
> +E(EDQUOT)
> +E(EHOSTDOWN)
> +E(EHOSTUNREACH)
> +#ifdef EHWPOISON
> +E(EHWPOISON)
> +#endif
> +E(EIDRM)
> +E(EILSEQ)
> +E(EINPROGRESS)
> +E(EISCONN)
> +E(EISNAM)
> +#ifdef EKEYEXPIRED
> +E(EKEYEXPIRED)
> +#endif
> +#ifdef EKEYREJECTED
> +E(EKEYREJECTED)
> +#endif
> +#ifdef EKEYREVOKED
> +E(EKEYREVOKED)
> +#endif
> +E(EL2HLT)
> +E(EL2NSYNC)
> +E(EL3HLT)
> +E(EL3RST)
> +E(ELIBACC)
> +E(ELIBBAD)
> +E(ELIBEXEC)
> +E(ELIBMAX)
> +E(ELIBSCN)
> +E(ELNRNG)
> +E(ELOOP)
> +E(EMEDIUMTYPE)
> +E(EMSGSIZE)
> +E(EMULTIHOP)
> +E(ENAMETOOLONG)
> +E(ENAVAIL)
> +E(ENETDOWN)
> +E(ENETRESET)
> +E(ENETUNREACH)
> +E(ENOANO)
> +E(ENOBUFS)
> +E(ENOCSI)
> +E(ENODATA)
> +#ifdef ENOKEY
> +E(ENOKEY)
> +#endif
> +E(ENOLCK)
> +E(ENOLINK)
> +E(ENOMEDIUM)
> +#ifdef ENOMSG
> +E(ENOMSG)
> +#endif
> +E(ENONET)
> +E(ENOPKG)
> +E(ENOPROTOOPT)
> +E(ENOSR)
> +E(ENOSTR)
> +E(ENOSYS)
> +E(ENOTCONN)
> +E(ENOTEMPTY)
> +E(ENOTNAM)
> +#ifdef ENOTRECOVERABLE
> +E(ENOTRECOVERABLE)
> +#endif
> +E(ENOTSOCK)
> +E(ENOTUNIQ)
> +E(EOPNOTSUPP)
> +E(EOVERFLOW)
> +#ifdef EOWNERDEAD
> +E(EOWNERDEAD)
> +#endif
> +E(EPFNOSUPPORT)
> +E(EPROTO)
> +E(EPROTONOSUPPORT)
> +E(EPROTOTYPE)
> +E(EREMCHG)
> +E(EREMOTE)
> +E(EREMOTEIO)
> +E(ERESTART)
> +#ifdef ERFKILL
> +E(ERFKILL)
> +#endif
> +E(ESHUTDOWN)
> +E(ESOCKTNOSUPPORT)
> +E(ESRMNT)
> +E(ESTALE)
> +E(ESTRPIPE)
> +E(ETIME)
> +E(ETIMEDOUT)
> +E(ETOOMANYREFS)
> +E(EUCLEAN)
> +E(EUNATCH)
> +E(EUSERS)
> +E(EXFULL)
>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
- [PATCH v3 0/8] linux-user: target <-> host errno conversion code refactor, Philippe Mathieu-Daudé, 2021/07/08
- [PATCH v3 1/8] linux-user/syscall: Fix RF-kill errno (typo in ERFKILL), Philippe Mathieu-Daudé, 2021/07/08
- [PATCH v3 2/8] linux-user/sparc: Rename target_errno.h -> target_errno_defs.h, Philippe Mathieu-Daudé, 2021/07/08
- [PATCH v3 3/8] linux-user: Extract target errno to 'target_errno_defs.h', Philippe Mathieu-Daudé, 2021/07/08
- [PATCH v3 4/8] linux-user/alpha: Move errno definitions to 'target_errno_defs.h', Philippe Mathieu-Daudé, 2021/07/08
- [PATCH v3 5/8] linux-user/hppa: Move errno definitions to 'target_errno_defs.h', Philippe Mathieu-Daudé, 2021/07/08
- [PATCH v3 6/8] linux-user/mips: Move errno definitions to 'target_errno_defs.h', Philippe Mathieu-Daudé, 2021/07/08
- [PATCH v3 7/8] linux-user: Simplify host <-> target errno conversion using macros, Philippe Mathieu-Daudé, 2021/07/08
- [PATCH v3 8/8] linux-user/syscall: Remove ERRNO_TABLE_SIZE check, Philippe Mathieu-Daudé, 2021/07/08
- Re: [PATCH v3 0/8] linux-user: target <-> host errno conversion code refactor, Laurent Vivier, 2021/07/12