From 1a8577fa68d68b14f6ccddd43d01436eb323151b Mon Sep 17 00:00:00 2001 From: Edward Tomasz Napierala Date: Thu, 29 Oct 2020 14:23:52 +0000 Subject: [PATCH] Add defines for Linux errno values and use them to make linux_errtbl[] more readable. While here, add linux_check_errtbl() function to make sure we don't leave holes. No objections: emaste (earlier version) MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D26972 --- lib/libsysdecode/errno.c | 1 + sys/compat/linux/linux.h | 1 + sys/compat/linux/linux_common.c | 3 + sys/compat/linux/linux_errno.c | 14 +++ sys/compat/linux/linux_errno.h | 183 ++++++++++++++++++++++++++++ sys/compat/linux/linux_errno.inc | 197 ++++++++++++++++--------------- 6 files changed, 302 insertions(+), 97 deletions(-) create mode 100644 sys/compat/linux/linux_errno.h diff --git a/lib/libsysdecode/errno.c b/lib/libsysdecode/errno.c index 710d5f1a6994..037ad0380e4a 100644 --- a/lib/libsysdecode/errno.c +++ b/lib/libsysdecode/errno.c @@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$"); #include #if defined(__aarch64__) || defined(__amd64__) || defined(__i386__) +#include static #include #endif diff --git a/sys/compat/linux/linux.h b/sys/compat/linux/linux.h index 6525f54319fb..947c8e58065f 100644 --- a/sys/compat/linux/linux.h +++ b/sys/compat/linux/linux.h @@ -197,5 +197,6 @@ int linux_to_bsd_bits_(int value, struct bsd_to_linux_bitmap *bitmap, #define BITMAP_1t1_LINUX(_name) BITMAP_EASY_LINUX(_name, LINUX_##_name) int bsd_to_linux_errno(int error); +void linux_check_errtbl(void); #endif /* _LINUX_MI_H_ */ diff --git a/sys/compat/linux/linux_common.c b/sys/compat/linux/linux_common.c index 7454da2d0411..47f85ccea543 100644 --- a/sys/compat/linux/linux_common.c +++ b/sys/compat/linux/linux_common.c @@ -67,6 +67,9 @@ linux_common_modevent(module_t mod, int type, void *data) switch(type) { case MOD_LOAD: +#ifdef INVARIANTS + linux_check_errtbl(); +#endif linux_dev_shm_create(); linux_osd_jail_register(); linux_exit_tag = EVENTHANDLER_REGISTER(process_exit, diff --git a/sys/compat/linux/linux_errno.c b/sys/compat/linux/linux_errno.c index 30435dff4593..6302fd89d5d2 100644 --- a/sys/compat/linux/linux_errno.c +++ b/sys/compat/linux/linux_errno.c @@ -8,6 +8,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include int @@ -19,3 +20,16 @@ bsd_to_linux_errno(int error) return (linux_errtbl[error]); } + +#ifdef INVARIANTS +void +linux_check_errtbl(void) +{ + int i; + + for (i = 1; i < sizeof(linux_errtbl); i++) { + KASSERT(linux_errtbl[i] != 0, + ("%s: linux_errtbl[%d] == 0", __func__, i)); + } +} +#endif diff --git a/sys/compat/linux/linux_errno.h b/sys/compat/linux/linux_errno.h new file mode 100644 index 000000000000..00814d3e6a7c --- /dev/null +++ b/sys/compat/linux/linux_errno.h @@ -0,0 +1,183 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2020 The FreeBSD Foundation + * + * This software was developed by Edward Tomasz Napierala under sponsorship + * from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _LINUX_ERRNO_H_ +#define _LINUX_ERRNO_H_ + +#define LINUX_EPERM 1 +#define LINUX_ENOENT 2 +#define LINUX_ESRCH 3 +#define LINUX_EINTR 4 +#define LINUX_EIO 5 +#define LINUX_ENXIO 6 +#define LINUX_E2BIG 7 +#define LINUX_ENOEXEC 8 +#define LINUX_EBADF 9 + +#define LINUX_ECHILD 10 +#define LINUX_EAGAIN 11 +#define LINUX_ENOMEM 12 +#define LINUX_EACCES 13 +#define LINUX_EFAULT 14 +#define LINUX_ENOTBLK 15 +#define LINUX_EBUSY 16 +#define LINUX_EEXIST 17 +#define LINUX_EXDEV 18 +#define LINUX_ENODEV 19 + +#define LINUX_ENOTDIR 20 +#define LINUX_EISDIR 21 +#define LINUX_EINVAL 22 +#define LINUX_ENFILE 23 +#define LINUX_EMFILE 24 +#define LINUX_ENOTTY 25 +#define LINUX_ETXTBSY 26 +#define LINUX_EFBIG 27 +#define LINUX_ENOSPC 28 +#define LINUX_ESPIPE 29 + +#define LINUX_EROFS 30 +#define LINUX_EMLINK 31 +#define LINUX_EPIPE 32 +#define LINUX_EDOM 33 +#define LINUX_ERANGE 34 +#define LINUX_EDEADLK 35 +#define LINUX_ENAMETOOLONG 36 +#define LINUX_ENOLCK 37 +#define LINUX_ENOSYS 38 +#define LINUX_ENOTEMPTY 39 + +#define LINUX_ELOOP 40 +/* XXX: errno 41 is not defined in Linux. */ +#define LINUX_ENOMSG 42 +#define LINUX_EIDRM 43 +#define LINUX_ECHRNG 44 +#define LINUX_EL2NSYNC 45 +#define LINUX_EL3HLT 46 +#define LINUX_EL3RST 47 +#define LINUX_ELNRNG 48 +#define LINUX_EUNATCH 49 + +#define LINUX_ENOCSI 50 +#define LINUX_L2HLT 51 +#define LINUX_EBADE 52 +#define LINUX_EBADR 53 +#define LINUX_EXFULL 54 +#define LINUX_ENOANO 55 +#define LINUX_EBADRQC 56 +#define LINUX_EBADSLT 57 +/* XXX: errno 58 is not defined in Linux. */ +#define LINUX_EBFONT 59 + +#define LINUX_ENOSTR 60 +#define LINUX_ENODATA 61 +#define LINUX_ENOTIME 62 +#define LINUX_ENOSR 63 +#define LINUX_ENONET 64 +#define LINUX_ENOPKG 65 +#define LINUX_EREMOTE 66 +#define LINUX_ENOLINK 67 +#define LINUX_EADV 68 +#define LINUX_ESRMNT 69 + +#define LINUX_ECOMM 70 +#define LINUX_EPROTO 71 +#define LINUX_EMULTIHOP 72 +#define LINUX_EDOTDOT 73 +#define LINUX_EBADMSG 74 +#define LINUX_EOVERFLOW 75 +#define LINUX_ENOTUNIQ 76 +#define LINUX_EBADFD 77 +#define LINUX_EREMCHG 78 +#define LINUX_ELIBACC 79 + +#define LINUX_ELIBBAD 80 +#define LINUX_ELIBSCN 81 +#define LINUX_ELIBMAX 82 +#define LINUX_ELIBEXEC 83 +#define LINUX_EILSEQ 84 +#define LINUX_ERESTART 85 +#define LINUX_ESTRPIPE 86 +#define LINUX_EUSERS 87 +#define LINUX_ENOTSOCK 88 +#define LINUX_EDESTADDRREQ 89 + +#define LINUX_EMSGSIZE 90 +#define LINUX_EPROTOTYPE 91 +#define LINUX_ENOPROTOOPT 92 +#define LINUX_EPROTONOTSUPPORT 93 +#define LINUX_ESOCKNOTSUPPORT 94 +#define LINUX_EOPNOTSUPPORT 95 +#define LINUX_EPFNOTSUPPORT 96 +#define LINUX_EAFNOTSUPPORT 97 +#define LINUX_EADDRINUSE 98 +#define LINUX_EADDRNOTAVAIL 99 + +#define LINUX_ENETDOWN 100 +#define LINUX_ENETUNREACH 101 +#define LINUX_ENETRESET 102 +#define LINUX_ECONNABORTED 103 +#define LINUX_ECONNRESET 104 +#define LINUX_ENOBUFS 105 +#define LINUX_EISCONN 106 +#define LINUX_ENOTCONN 107 +#define LINUX_ESHUTDOWN 108 +#define LINUX_ETOOMANYREFS 109 + +#define LINUX_ETIMEDOUT 110 +#define LINUX_ECONNREFUSED 111 +#define LINUX_EHOSTDOWN 112 +#define LINUX_EHOSTUNREACH 113 +#define LINUX_EALREADY 114 +#define LINUX_EINPROGRESS 115 +#define LINUX_ESTALE 116 +#define LINUX_EUCLEAN 117 +#define LINUX_ENOTNAM 118 +#define LINUX_ENAVAIL 119 + +#define LINUX_EISNAM 120 +#define LINUX_EREMOTEIO 121 +#define LINUX_EDQUOT 122 +#define LINUX_ENOMEDIUM 123 +#define LINUX_EMEDIUMTYPE 124 +#define LINUX_ECANCELED 125 +#define LINUX_ENOKEY 126 +#define LINUX_EKEYEXPIRED 127 +#define LINUX_EKEYREVOKED 128 +#define LINUX_EKEYREJECTED 129 + +#define LINUX_EOWNERDEAD 130 +#define LINUX_ENOTRECOVERABLE 131 +#define LINUX_ERFKILL 132 +#define LINUX_EHWPOISON 133 + +#endif /* _LINUX_ERRNO_H_ */ diff --git a/sys/compat/linux/linux_errno.inc b/sys/compat/linux/linux_errno.inc index 47e65d5dadfa..c4a3fb0f56a4 100644 --- a/sys/compat/linux/linux_errno.inc +++ b/sys/compat/linux/linux_errno.inc @@ -34,125 +34,128 @@ * FreeBSD: src/sys/sys/errno.h * Linux: include/uapi/asm-generic/errno-base.h * include/uapi/asm-generic/errno.h + * + * XXX: The "XXX" comments below should be replaced with rationale + * for the errno value chosen. */ const int linux_errtbl[ELAST + 1] = { /* [0, 9] */ [0] = -0, - [EPERM] = -1, - [ENOENT] = -2, - [ESRCH] = -3, - [EINTR] = -4, - [EIO] = -5, - [ENXIO] = -6, - [E2BIG] = -7, - [ENOEXEC] = -8, - [EBADF] = -9, + [EPERM] = -LINUX_EPERM, + [ENOENT] = -LINUX_ENOENT, + [ESRCH] = -LINUX_ESRCH, + [EINTR] = -LINUX_EINTR, + [EIO] = -LINUX_EIO, + [ENXIO] = -LINUX_ENXIO, + [E2BIG] = -LINUX_E2BIG, + [ENOEXEC] = -LINUX_ENOEXEC, + [EBADF] = -LINUX_EBADF, /* [10, 19] */ - [ECHILD] = -10, - [EDEADLK] = -35, - [ENOMEM] = -12, - [EACCES] = -13, - [EFAULT] = -14, - [ENOTBLK] = -15, - [EBUSY] = -16, - [EEXIST] = -17, - [EXDEV] = -18, - [ENODEV] = -19, + [ECHILD] = -LINUX_ECHILD, + [EDEADLK] = -LINUX_EDEADLK, + [ENOMEM] = -LINUX_ENOMEM, + [EACCES] = -LINUX_EACCES, + [EFAULT] = -LINUX_EFAULT, + [ENOTBLK] = -LINUX_ENOTBLK, + [EBUSY] = -LINUX_EBUSY, + [EEXIST] = -LINUX_EEXIST, + [EXDEV] = -LINUX_EXDEV, + [ENODEV] = -LINUX_ENODEV, /* [20, 29] */ - [ENOTDIR] = -20, - [EISDIR] = -21, - [EINVAL] = -22, - [ENFILE] = -23, - [EMFILE] = -24, - [ENOTTY] = -25, - [ETXTBSY] = -26, - [EFBIG] = -27, - [ENOSPC] = -28, - [ESPIPE] = -29, + [ENOTDIR] = -LINUX_ENOTDIR, + [EISDIR] = -LINUX_EISDIR, + [EINVAL] = -LINUX_EINVAL, + [ENFILE] = -LINUX_ENFILE, + [EMFILE] = -LINUX_EMFILE, + [ENOTTY] = -LINUX_ENOTTY, + [ETXTBSY] = -LINUX_ETXTBSY, + [EFBIG] = -LINUX_EFBIG, + [ENOSPC] = -LINUX_ENOSPC, + [ESPIPE] = -LINUX_ESPIPE, /* [30, 39] */ - [EROFS] = -30, - [EMLINK] = -31, - [EPIPE] = -32, - [EDOM] = -33, - [ERANGE] = -34, - [EAGAIN] = -11, - [EINPROGRESS] = -115, - [EALREADY] = -114, - [ENOTSOCK] = -88, - [EDESTADDRREQ] = -89, + [EROFS] = -LINUX_EROFS, + [EMLINK] = -LINUX_EMLINK, + [EPIPE] = -LINUX_EPIPE, + [EDOM] = -LINUX_EDOM, + [ERANGE] = -LINUX_ERANGE, + [EAGAIN] = -LINUX_EAGAIN, + [EINPROGRESS] = -LINUX_EINPROGRESS, + [EALREADY] = -LINUX_EALREADY, + [ENOTSOCK] = -LINUX_ENOTSOCK, + [EDESTADDRREQ] = -LINUX_EDESTADDRREQ, /* [40, 49] */ - [EMSGSIZE] = -90, - [EPROTOTYPE] = -91, - [ENOPROTOOPT] = -92, - [EPROTONOSUPPORT] = -93, - [ESOCKTNOSUPPORT] = -94, - [EOPNOTSUPP] = -95, - [EPFNOSUPPORT] = -96, - [EAFNOSUPPORT] = -97, - [EADDRINUSE] = -98, - [EADDRNOTAVAIL] = -99, + [EMSGSIZE] = -LINUX_EMSGSIZE, + [EPROTOTYPE] = -LINUX_EPROTOTYPE, + [ENOPROTOOPT] = -LINUX_ENOPROTOOPT, + [EPROTONOSUPPORT] = -LINUX_EPROTONOTSUPPORT, + [ESOCKTNOSUPPORT] = -LINUX_ESOCKNOTSUPPORT, + [EOPNOTSUPP] = -LINUX_EOPNOTSUPPORT, + [EPFNOSUPPORT] = -LINUX_EPFNOTSUPPORT, + [EAFNOSUPPORT] = -LINUX_EAFNOTSUPPORT, + [EADDRINUSE] = -LINUX_EADDRINUSE, + [EADDRNOTAVAIL] = -LINUX_EADDRNOTAVAIL, /* [50, 59] */ - [ENETDOWN] = -100, - [ENETUNREACH] = -101, - [ENETRESET] = -102, - [ECONNABORTED] = -103, - [ECONNRESET] = -104, - [ENOBUFS] = -105, - [EISCONN] = -106, - [ENOTCONN] = -107, - [ESHUTDOWN] = -108, - [ETOOMANYREFS] = -109, + [ENETDOWN] = -LINUX_ENETDOWN, + [ENETUNREACH] = -LINUX_ENETUNREACH, + [ENETRESET] = -LINUX_ENETRESET, + [ECONNABORTED] = -LINUX_ECONNABORTED, + [ECONNRESET] = -LINUX_ECONNRESET, + [ENOBUFS] = -LINUX_ENOBUFS, + [EISCONN] = -LINUX_EISCONN, + [ENOTCONN] = -LINUX_ENOTCONN, + [ESHUTDOWN] = -LINUX_ESHUTDOWN, + [ETOOMANYREFS] = -LINUX_ETOOMANYREFS, /* [60, 69] */ - [ETIMEDOUT] = -110, - [ECONNREFUSED] = -111, - [ELOOP] = -40, - [ENAMETOOLONG] = -36, - [EHOSTDOWN] = -112, - [EHOSTUNREACH] = -113, - [ENOTEMPTY] = -39, - [EPROCLIM] = -11, - [EUSERS] = -87, - [EDQUOT] = -122, + [ETIMEDOUT] = -LINUX_ETIMEDOUT, + [ECONNREFUSED] = -LINUX_ECONNREFUSED, + [ELOOP] = -LINUX_ELOOP, + [ENAMETOOLONG] = -LINUX_ENAMETOOLONG, + [EHOSTDOWN] = -LINUX_EHOSTDOWN, + [EHOSTUNREACH] = -LINUX_EHOSTUNREACH, + [ENOTEMPTY] = -LINUX_ENOTEMPTY, + [EPROCLIM] = -LINUX_EAGAIN, /* XXX */ + [EUSERS] = -LINUX_EUSERS, + [EDQUOT] = -LINUX_EDQUOT, /* [70, 79] */ - [ESTALE] = -116, - [EREMOTE] = -66, - [EBADRPC] = -6, /* EBADRPC -> ENXIO */ - [ERPCMISMATCH] = -6, /* ERPCMISMATCH -> ENXIO */ - [EPROGUNAVAIL] = -6, /* EPROGUNAVAIL -> ENXIO */ - [EPROGMISMATCH] = -6, /* EPROGMISMATCH -> ENXIO */ - [EPROCUNAVAIL] = -6, /* EPROCUNAVAIL -> ENXIO */ - [ENOLCK] = -37, - [ENOSYS] = -38, - [EFTYPE] = -9, + [ESTALE] = -LINUX_ESTALE, + [EREMOTE] = -LINUX_EREMOTE, + [EBADRPC] = -LINUX_ENXIO, /* XXX */ + [ERPCMISMATCH] = -LINUX_ENXIO, /* XXX */ + [EPROGUNAVAIL] = -LINUX_ENXIO, /* XXX */ + [EPROGMISMATCH] = -LINUX_ENXIO, /* XXX */ + [EPROCUNAVAIL] = -LINUX_ENXIO, /* XXX */ + [ENOLCK] = -LINUX_ENOLCK, + [ENOSYS] = -LINUX_ENOSYS, + [EFTYPE] = -LINUX_EBADF, /* XXX */ /* [80, 89] */ - [EAUTH] = -6, /* EAUTH -> ENXIO */ - [ENEEDAUTH] = -6, /* ENEEDAUTH -> ENXIO */ - [EIDRM] = -43, - [ENOMSG] = -42, - [EOVERFLOW] = -75, - [ECANCELED] = -125, - [EILSEQ] = -84, - [ENOATTR] = -61, - [EDOOFUS] = -22, /* EDOOFUS -> EINVAL */ - [EBADMSG] = -74, + [EAUTH] = -LINUX_ENXIO, /* XXX */ + [ENEEDAUTH] = -LINUX_ENXIO, /* XXX */ + [EIDRM] = -LINUX_EIDRM, + [ENOMSG] = -LINUX_ENOMSG, + [EOVERFLOW] = -LINUX_EOVERFLOW, + [ECANCELED] = -LINUX_ECANCELED, + [EILSEQ] = -LINUX_EILSEQ, + [ENOATTR] = -LINUX_ENODATA, /* XXX */ + [EDOOFUS] = -LINUX_EINVAL, /* XXX */ + [EBADMSG] = -LINUX_EBADMSG, /* [90, 99] */ - [EMULTIHOP] = -72, - [ENOLINK] = -67, - [EPROTO] = -71, - [ENOTCAPABLE] = -1, /* ENOTCAPABLE -> EPERM */ - [ECAPMODE] = -1, /* ECAPMODE -> EPERM */ - [ENOTRECOVERABLE] = -131, /* ENOTRECOVERABLE */ - [EOWNERDEAD] = -130, /* EOWNERDEAD */ - [EINTEGRITY] = -22, /* EINTEGRITY -> EINVAL */ + [EMULTIHOP] = -LINUX_EMULTIHOP, + [ENOLINK] = -LINUX_ENOLINK, + [EPROTO] = -LINUX_EPROTO, + [ENOTCAPABLE] = -LINUX_EPERM, /* XXX */ + [ECAPMODE] = -LINUX_EPERM, /* XXX */ + [ENOTRECOVERABLE] = -LINUX_ENOTRECOVERABLE, + [EOWNERDEAD] = -LINUX_EOWNERDEAD, + [EINTEGRITY] = -LINUX_EINVAL, /* XXX */ }; _Static_assert(ELAST == 97,