Author: trasz
Date: Thu Oct 29 14:23:52 2020
New Revision: 367132
URL: https://svnweb.freebsd.org/changeset/base/367132

Log:
  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

Added:
  head/sys/compat/linux/linux_errno.h   (contents, props changed)
Modified:
  head/lib/libsysdecode/errno.c
  head/sys/compat/linux/linux.h
  head/sys/compat/linux/linux_common.c
  head/sys/compat/linux/linux_errno.c
  head/sys/compat/linux/linux_errno.inc

Modified: head/lib/libsysdecode/errno.c
==============================================================================
--- head/lib/libsysdecode/errno.c       Thu Oct 29 14:21:25 2020        
(r367131)
+++ head/lib/libsysdecode/errno.c       Thu Oct 29 14:23:52 2020        
(r367132)
@@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
 #include <sysdecode.h>
 
 #if defined(__aarch64__) || defined(__amd64__) || defined(__i386__)
+#include <compat/linux/linux_errno.h>
 static
 #include <compat/linux/linux_errno.inc>
 #endif

Modified: head/sys/compat/linux/linux.h
==============================================================================
--- head/sys/compat/linux/linux.h       Thu Oct 29 14:21:25 2020        
(r367131)
+++ head/sys/compat/linux/linux.h       Thu Oct 29 14:23:52 2020        
(r367132)
@@ -197,5 +197,6 @@ int linux_to_bsd_bits_(int value, struct bsd_to_linux_
 #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_ */

Modified: head/sys/compat/linux/linux_common.c
==============================================================================
--- head/sys/compat/linux/linux_common.c        Thu Oct 29 14:21:25 2020        
(r367131)
+++ head/sys/compat/linux/linux_common.c        Thu Oct 29 14:23:52 2020        
(r367132)
@@ -67,6 +67,9 @@ linux_common_modevent(module_t mod, int type, void *da
 
        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,

Modified: head/sys/compat/linux/linux_errno.c
==============================================================================
--- head/sys/compat/linux/linux_errno.c Thu Oct 29 14:21:25 2020        
(r367131)
+++ head/sys/compat/linux/linux_errno.c Thu Oct 29 14:23:52 2020        
(r367132)
@@ -8,6 +8,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/systm.h>
 
 #include <compat/linux/linux.h>
+#include <compat/linux/linux_errno.h>
 #include <compat/linux/linux_errno.inc>
 
 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

Added: head/sys/compat/linux/linux_errno.h
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/compat/linux/linux_errno.h Thu Oct 29 14:23:52 2020        
(r367132)
@@ -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_ */

Modified: head/sys/compat/linux/linux_errno.inc
==============================================================================
--- head/sys/compat/linux/linux_errno.inc       Thu Oct 29 14:21:25 2020        
(r367131)
+++ head/sys/compat/linux/linux_errno.inc       Thu Oct 29 14:23:52 2020        
(r367132)
@@ -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,
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to