1*287b96ddSJohn Baldwin /*- 2*287b96ddSJohn Baldwin * Copyright (c) 2015 John H. Baldwin <jhb@FreeBSD.org> 3*287b96ddSJohn Baldwin * All rights reserved. 4*287b96ddSJohn Baldwin * 5*287b96ddSJohn Baldwin * Redistribution and use in source and binary forms, with or without 6*287b96ddSJohn Baldwin * modification, are permitted provided that the following conditions 7*287b96ddSJohn Baldwin * are met: 8*287b96ddSJohn Baldwin * 1. Redistributions of source code must retain the above copyright 9*287b96ddSJohn Baldwin * notice, this list of conditions and the following disclaimer. 10*287b96ddSJohn Baldwin * 2. Redistributions in binary form must reproduce the above copyright 11*287b96ddSJohn Baldwin * notice, this list of conditions and the following disclaimer in the 12*287b96ddSJohn Baldwin * documentation and/or other materials provided with the distribution. 13*287b96ddSJohn Baldwin * 14*287b96ddSJohn Baldwin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*287b96ddSJohn Baldwin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*287b96ddSJohn Baldwin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*287b96ddSJohn Baldwin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18*287b96ddSJohn Baldwin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*287b96ddSJohn Baldwin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*287b96ddSJohn Baldwin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*287b96ddSJohn Baldwin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*287b96ddSJohn Baldwin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*287b96ddSJohn Baldwin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*287b96ddSJohn Baldwin * SUCH DAMAGE. 25*287b96ddSJohn Baldwin */ 26*287b96ddSJohn Baldwin 27*287b96ddSJohn Baldwin #include <sys/cdefs.h> 28*287b96ddSJohn Baldwin __FBSDID("$FreeBSD$"); 29*287b96ddSJohn Baldwin 30*287b96ddSJohn Baldwin #include <sys/param.h> 31*287b96ddSJohn Baldwin #include <errno.h> 32*287b96ddSJohn Baldwin #include <limits.h> 33*287b96ddSJohn Baldwin #include <stdio.h> 34*287b96ddSJohn Baldwin #include <sysdecode.h> 35*287b96ddSJohn Baldwin 36*287b96ddSJohn Baldwin #if defined(__i386__) || defined(__amd64__) 37*287b96ddSJohn Baldwin /* 38*287b96ddSJohn Baldwin * Linux syscalls return negative errno's, we do positive and map them 39*287b96ddSJohn Baldwin * Reference: 40*287b96ddSJohn Baldwin * FreeBSD: src/sys/sys/errno.h 41*287b96ddSJohn Baldwin * Linux: linux-2.6.17.8/include/asm-generic/errno-base.h 42*287b96ddSJohn Baldwin * linux-2.6.17.8/include/asm-generic/errno.h 43*287b96ddSJohn Baldwin */ 44*287b96ddSJohn Baldwin static int bsd_to_linux_errno[ELAST + 1] = { 45*287b96ddSJohn Baldwin -0, -1, -2, -3, -4, -5, -6, -7, -8, -9, 46*287b96ddSJohn Baldwin -10, -35, -12, -13, -14, -15, -16, -17, -18, -19, 47*287b96ddSJohn Baldwin -20, -21, -22, -23, -24, -25, -26, -27, -28, -29, 48*287b96ddSJohn Baldwin -30, -31, -32, -33, -34, -11,-115,-114, -88, -89, 49*287b96ddSJohn Baldwin -90, -91, -92, -93, -94, -95, -96, -97, -98, -99, 50*287b96ddSJohn Baldwin -100,-101,-102,-103,-104,-105,-106,-107,-108,-109, 51*287b96ddSJohn Baldwin -110,-111, -40, -36,-112,-113, -39, -11, -87,-122, 52*287b96ddSJohn Baldwin -116, -66, -6, -6, -6, -6, -6, -37, -38, -9, 53*287b96ddSJohn Baldwin -6, -6, -43, -42, -75,-125, -84, -95, -16, -74, 54*287b96ddSJohn Baldwin -72, -67, -71 55*287b96ddSJohn Baldwin }; 56*287b96ddSJohn Baldwin #endif 57*287b96ddSJohn Baldwin 58*287b96ddSJohn Baldwin #if defined(__aarch64__) || defined(__amd64__) 59*287b96ddSJohn Baldwin #include <compat/cloudabi/cloudabi_syscalldefs.h> 60*287b96ddSJohn Baldwin 61*287b96ddSJohn Baldwin static const int cloudabi_errno_table[] = { 62*287b96ddSJohn Baldwin [CLOUDABI_E2BIG] = E2BIG, 63*287b96ddSJohn Baldwin [CLOUDABI_EACCES] = EACCES, 64*287b96ddSJohn Baldwin [CLOUDABI_EADDRINUSE] = EADDRINUSE, 65*287b96ddSJohn Baldwin [CLOUDABI_EADDRNOTAVAIL] = EADDRNOTAVAIL, 66*287b96ddSJohn Baldwin [CLOUDABI_EAFNOSUPPORT] = EAFNOSUPPORT, 67*287b96ddSJohn Baldwin [CLOUDABI_EAGAIN] = EAGAIN, 68*287b96ddSJohn Baldwin [CLOUDABI_EALREADY] = EALREADY, 69*287b96ddSJohn Baldwin [CLOUDABI_EBADF] = EBADF, 70*287b96ddSJohn Baldwin [CLOUDABI_EBADMSG] = EBADMSG, 71*287b96ddSJohn Baldwin [CLOUDABI_EBUSY] = EBUSY, 72*287b96ddSJohn Baldwin [CLOUDABI_ECANCELED] = ECANCELED, 73*287b96ddSJohn Baldwin [CLOUDABI_ECHILD] = ECHILD, 74*287b96ddSJohn Baldwin [CLOUDABI_ECONNABORTED] = ECONNABORTED, 75*287b96ddSJohn Baldwin [CLOUDABI_ECONNREFUSED] = ECONNREFUSED, 76*287b96ddSJohn Baldwin [CLOUDABI_ECONNRESET] = ECONNRESET, 77*287b96ddSJohn Baldwin [CLOUDABI_EDEADLK] = EDEADLK, 78*287b96ddSJohn Baldwin [CLOUDABI_EDESTADDRREQ] = EDESTADDRREQ, 79*287b96ddSJohn Baldwin [CLOUDABI_EDOM] = EDOM, 80*287b96ddSJohn Baldwin [CLOUDABI_EDQUOT] = EDQUOT, 81*287b96ddSJohn Baldwin [CLOUDABI_EEXIST] = EEXIST, 82*287b96ddSJohn Baldwin [CLOUDABI_EFAULT] = EFAULT, 83*287b96ddSJohn Baldwin [CLOUDABI_EFBIG] = EFBIG, 84*287b96ddSJohn Baldwin [CLOUDABI_EHOSTUNREACH] = EHOSTUNREACH, 85*287b96ddSJohn Baldwin [CLOUDABI_EIDRM] = EIDRM, 86*287b96ddSJohn Baldwin [CLOUDABI_EILSEQ] = EILSEQ, 87*287b96ddSJohn Baldwin [CLOUDABI_EINPROGRESS] = EINPROGRESS, 88*287b96ddSJohn Baldwin [CLOUDABI_EINTR] = EINTR, 89*287b96ddSJohn Baldwin [CLOUDABI_EINVAL] = EINVAL, 90*287b96ddSJohn Baldwin [CLOUDABI_EIO] = EIO, 91*287b96ddSJohn Baldwin [CLOUDABI_EISCONN] = EISCONN, 92*287b96ddSJohn Baldwin [CLOUDABI_EISDIR] = EISDIR, 93*287b96ddSJohn Baldwin [CLOUDABI_ELOOP] = ELOOP, 94*287b96ddSJohn Baldwin [CLOUDABI_EMFILE] = EMFILE, 95*287b96ddSJohn Baldwin [CLOUDABI_EMLINK] = EMLINK, 96*287b96ddSJohn Baldwin [CLOUDABI_EMSGSIZE] = EMSGSIZE, 97*287b96ddSJohn Baldwin [CLOUDABI_EMULTIHOP] = EMULTIHOP, 98*287b96ddSJohn Baldwin [CLOUDABI_ENAMETOOLONG] = ENAMETOOLONG, 99*287b96ddSJohn Baldwin [CLOUDABI_ENETDOWN] = ENETDOWN, 100*287b96ddSJohn Baldwin [CLOUDABI_ENETRESET] = ENETRESET, 101*287b96ddSJohn Baldwin [CLOUDABI_ENETUNREACH] = ENETUNREACH, 102*287b96ddSJohn Baldwin [CLOUDABI_ENFILE] = ENFILE, 103*287b96ddSJohn Baldwin [CLOUDABI_ENOBUFS] = ENOBUFS, 104*287b96ddSJohn Baldwin [CLOUDABI_ENODEV] = ENODEV, 105*287b96ddSJohn Baldwin [CLOUDABI_ENOENT] = ENOENT, 106*287b96ddSJohn Baldwin [CLOUDABI_ENOEXEC] = ENOEXEC, 107*287b96ddSJohn Baldwin [CLOUDABI_ENOLCK] = ENOLCK, 108*287b96ddSJohn Baldwin [CLOUDABI_ENOLINK] = ENOLINK, 109*287b96ddSJohn Baldwin [CLOUDABI_ENOMEM] = ENOMEM, 110*287b96ddSJohn Baldwin [CLOUDABI_ENOMSG] = ENOMSG, 111*287b96ddSJohn Baldwin [CLOUDABI_ENOPROTOOPT] = ENOPROTOOPT, 112*287b96ddSJohn Baldwin [CLOUDABI_ENOSPC] = ENOSPC, 113*287b96ddSJohn Baldwin [CLOUDABI_ENOSYS] = ENOSYS, 114*287b96ddSJohn Baldwin [CLOUDABI_ENOTCONN] = ENOTCONN, 115*287b96ddSJohn Baldwin [CLOUDABI_ENOTDIR] = ENOTDIR, 116*287b96ddSJohn Baldwin [CLOUDABI_ENOTEMPTY] = ENOTEMPTY, 117*287b96ddSJohn Baldwin [CLOUDABI_ENOTRECOVERABLE] = ENOTRECOVERABLE, 118*287b96ddSJohn Baldwin [CLOUDABI_ENOTSOCK] = ENOTSOCK, 119*287b96ddSJohn Baldwin [CLOUDABI_ENOTSUP] = ENOTSUP, 120*287b96ddSJohn Baldwin [CLOUDABI_ENOTTY] = ENOTTY, 121*287b96ddSJohn Baldwin [CLOUDABI_ENXIO] = ENXIO, 122*287b96ddSJohn Baldwin [CLOUDABI_EOVERFLOW] = EOVERFLOW, 123*287b96ddSJohn Baldwin [CLOUDABI_EOWNERDEAD] = EOWNERDEAD, 124*287b96ddSJohn Baldwin [CLOUDABI_EPERM] = EPERM, 125*287b96ddSJohn Baldwin [CLOUDABI_EPIPE] = EPIPE, 126*287b96ddSJohn Baldwin [CLOUDABI_EPROTO] = EPROTO, 127*287b96ddSJohn Baldwin [CLOUDABI_EPROTONOSUPPORT] = EPROTONOSUPPORT, 128*287b96ddSJohn Baldwin [CLOUDABI_EPROTOTYPE] = EPROTOTYPE, 129*287b96ddSJohn Baldwin [CLOUDABI_ERANGE] = ERANGE, 130*287b96ddSJohn Baldwin [CLOUDABI_EROFS] = EROFS, 131*287b96ddSJohn Baldwin [CLOUDABI_ESPIPE] = ESPIPE, 132*287b96ddSJohn Baldwin [CLOUDABI_ESRCH] = ESRCH, 133*287b96ddSJohn Baldwin [CLOUDABI_ESTALE] = ESTALE, 134*287b96ddSJohn Baldwin [CLOUDABI_ETIMEDOUT] = ETIMEDOUT, 135*287b96ddSJohn Baldwin [CLOUDABI_ETXTBSY] = ETXTBSY, 136*287b96ddSJohn Baldwin [CLOUDABI_EXDEV] = EXDEV, 137*287b96ddSJohn Baldwin [CLOUDABI_ENOTCAPABLE] = ENOTCAPABLE, 138*287b96ddSJohn Baldwin }; 139*287b96ddSJohn Baldwin #endif 140*287b96ddSJohn Baldwin 141*287b96ddSJohn Baldwin int 142*287b96ddSJohn Baldwin sysdecode_abi_to_freebsd_errno(enum sysdecode_abi abi, int error) 143*287b96ddSJohn Baldwin { 144*287b96ddSJohn Baldwin 145*287b96ddSJohn Baldwin switch (abi) { 146*287b96ddSJohn Baldwin case SYSDECODE_ABI_FREEBSD: 147*287b96ddSJohn Baldwin case SYSDECODE_ABI_FREEBSD32: 148*287b96ddSJohn Baldwin return (error); 149*287b96ddSJohn Baldwin #if defined(__i386__) || defined(__amd64__) 150*287b96ddSJohn Baldwin case SYSDECODE_ABI_LINUX: 151*287b96ddSJohn Baldwin case SYSDECODE_ABI_LINUX32: { 152*287b96ddSJohn Baldwin unsigned int i; 153*287b96ddSJohn Baldwin 154*287b96ddSJohn Baldwin /* 155*287b96ddSJohn Baldwin * This is imprecise since it returns the first 156*287b96ddSJohn Baldwin * matching errno. 157*287b96ddSJohn Baldwin */ 158*287b96ddSJohn Baldwin for (i = 0; i < nitems(bsd_to_linux_errno); i++) { 159*287b96ddSJohn Baldwin if (error == bsd_to_linux_errno[i]) 160*287b96ddSJohn Baldwin return (i); 161*287b96ddSJohn Baldwin } 162*287b96ddSJohn Baldwin break; 163*287b96ddSJohn Baldwin } 164*287b96ddSJohn Baldwin #endif 165*287b96ddSJohn Baldwin #if defined(__aarch64__) || defined(__amd64__) 166*287b96ddSJohn Baldwin case SYSDECODE_ABI_CLOUDABI64: 167*287b96ddSJohn Baldwin if (error >= 0 && 168*287b96ddSJohn Baldwin (unsigned int)error < nitems(cloudabi_errno_table)) 169*287b96ddSJohn Baldwin return (cloudabi_errno_table[error]); 170*287b96ddSJohn Baldwin break; 171*287b96ddSJohn Baldwin #endif 172*287b96ddSJohn Baldwin default: 173*287b96ddSJohn Baldwin break; 174*287b96ddSJohn Baldwin } 175*287b96ddSJohn Baldwin return (INT_MAX); 176*287b96ddSJohn Baldwin } 177*287b96ddSJohn Baldwin 178*287b96ddSJohn Baldwin int 179*287b96ddSJohn Baldwin sysdecode_freebsd_to_abi_errno(enum sysdecode_abi abi, int error) 180*287b96ddSJohn Baldwin { 181*287b96ddSJohn Baldwin 182*287b96ddSJohn Baldwin switch (abi) { 183*287b96ddSJohn Baldwin case SYSDECODE_ABI_FREEBSD: 184*287b96ddSJohn Baldwin case SYSDECODE_ABI_FREEBSD32: 185*287b96ddSJohn Baldwin return (error); 186*287b96ddSJohn Baldwin #if defined(__i386__) || defined(__amd64__) 187*287b96ddSJohn Baldwin case SYSDECODE_ABI_LINUX: 188*287b96ddSJohn Baldwin case SYSDECODE_ABI_LINUX32: 189*287b96ddSJohn Baldwin if (error >= 0 && error <= ELAST) 190*287b96ddSJohn Baldwin return (bsd_to_linux_errno[error]); 191*287b96ddSJohn Baldwin break; 192*287b96ddSJohn Baldwin #endif 193*287b96ddSJohn Baldwin #if defined(__aarch64__) || defined(__amd64__) 194*287b96ddSJohn Baldwin case SYSDECODE_ABI_CLOUDABI64: { 195*287b96ddSJohn Baldwin unsigned int i; 196*287b96ddSJohn Baldwin 197*287b96ddSJohn Baldwin for (i = 0; i < nitems(cloudabi_errno_table); i++) { 198*287b96ddSJohn Baldwin if (error == cloudabi_errno_table[i]) 199*287b96ddSJohn Baldwin return (i); 200*287b96ddSJohn Baldwin } 201*287b96ddSJohn Baldwin break; 202*287b96ddSJohn Baldwin } 203*287b96ddSJohn Baldwin #endif 204*287b96ddSJohn Baldwin default: 205*287b96ddSJohn Baldwin break; 206*287b96ddSJohn Baldwin } 207*287b96ddSJohn Baldwin return (INT_MAX); 208*287b96ddSJohn Baldwin } 209*287b96ddSJohn Baldwin 210