aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/amd64/linux/linux_sysvec.c22
-rw-r--r--sys/amd64/linux32/linux32_sysvec.c22
-rw-r--r--sys/compat/linux/linux_emul.h2
-rw-r--r--sys/compat/linux/linux_errno.c143
-rw-r--r--sys/conf/files.amd641
-rw-r--r--sys/conf/files.i3861
-rw-r--r--sys/i386/linux/linux_sysvec.c24
-rw-r--r--sys/modules/linux/Makefile2
-rw-r--r--sys/modules/linux_common/Makefile2
9 files changed, 154 insertions, 65 deletions
diff --git a/sys/amd64/linux/linux_sysvec.c b/sys/amd64/linux/linux_sysvec.c
index 802b3cb19b05..cc2a654b400e 100644
--- a/sys/amd64/linux/linux_sysvec.c
+++ b/sys/amd64/linux/linux_sysvec.c
@@ -130,26 +130,6 @@ static void linux_exec_setregs(struct thread *td, struct image_params *imgp,
u_long stack);
static int linux_vsyscall(struct thread *td);
-/*
- * Linux syscalls return negative errno's, we do positive and map them
- * Reference:
- * FreeBSD: src/sys/sys/errno.h
- * Linux: linux-2.6.17.8/include/asm-generic/errno-base.h
- * linux-2.6.17.8/include/asm-generic/errno.h
- */
-static int bsd_to_linux_errno[ELAST + 1] = {
- -0, -1, -2, -3, -4, -5, -6, -7, -8, -9,
- -10, -35, -12, -13, -14, -15, -16, -17, -18, -19,
- -20, -21, -22, -23, -24, -25, -26, -27, -28, -29,
- -30, -31, -32, -33, -34, -11,-115,-114, -88, -89,
- -90, -91, -92, -93, -94, -95, -96, -97, -98, -99,
- -100,-101,-102,-103,-104,-105,-106,-107,-108,-109,
- -110,-111, -40, -36,-112,-113, -39, -11, -87,-122,
- -116, -66, -6, -6, -6, -6, -6, -37, -38, -9,
- -6, -6, -43, -42, -75,-125, -84, -61, -16, -74,
- -72, -67, -71
-};
-
#define LINUX_T_UNKNOWN 255
static int _bsd_to_linux_trapcode[] = {
LINUX_T_UNKNOWN, /* 0 */
@@ -774,7 +754,7 @@ struct sysentvec elf_linux_sysvec = {
.sv_table = linux_sysent,
.sv_mask = 0,
.sv_errsize = ELAST + 1,
- .sv_errtbl = bsd_to_linux_errno,
+ .sv_errtbl = bsd_to_linux_errno_generic,
.sv_transtrap = translate_traps,
.sv_fixup = elf_linux_fixup,
.sv_sendsig = linux_rt_sendsig,
diff --git a/sys/amd64/linux32/linux32_sysvec.c b/sys/amd64/linux32/linux32_sysvec.c
index 8ae4079f0d9e..23d9f470efde 100644
--- a/sys/amd64/linux32/linux32_sysvec.c
+++ b/sys/amd64/linux32/linux32_sysvec.c
@@ -131,26 +131,6 @@ static bool linux32_trans_osrel(const Elf_Note *note, int32_t *osrel);
static void linux_vdso_install(void *param);
static void linux_vdso_deinstall(void *param);
-/*
- * Linux syscalls return negative errno's, we do positive and map them
- * Reference:
- * FreeBSD: src/sys/sys/errno.h
- * Linux: linux-2.6.17.8/include/asm-generic/errno-base.h
- * linux-2.6.17.8/include/asm-generic/errno.h
- */
-static int bsd_to_linux_errno[ELAST + 1] = {
- -0, -1, -2, -3, -4, -5, -6, -7, -8, -9,
- -10, -35, -12, -13, -14, -15, -16, -17, -18, -19,
- -20, -21, -22, -23, -24, -25, -26, -27, -28, -29,
- -30, -31, -32, -33, -34, -11,-115,-114, -88, -89,
- -90, -91, -92, -93, -94, -95, -96, -97, -98, -99,
- -100,-101,-102,-103,-104,-105,-106,-107,-108,-109,
- -110,-111, -40, -36,-112,-113, -39, -11, -87,-122,
- -116, -66, -6, -6, -6, -6, -6, -37, -38, -9,
- -6, -6, -43, -42, -75,-125, -84, -61, -16, -74,
- -72, -67, -71
-};
-
#define LINUX_T_UNKNOWN 255
static int _bsd_to_linux_trapcode[] = {
LINUX_T_UNKNOWN, /* 0 */
@@ -973,7 +953,7 @@ struct sysentvec elf_linux_sysvec = {
.sv_table = linux32_sysent,
.sv_mask = 0,
.sv_errsize = ELAST + 1,
- .sv_errtbl = bsd_to_linux_errno,
+ .sv_errtbl = bsd_to_linux_errno_generic,
.sv_transtrap = translate_traps,
.sv_fixup = elf_linux_fixup,
.sv_sendsig = linux_sendsig,
diff --git a/sys/compat/linux/linux_emul.h b/sys/compat/linux/linux_emul.h
index 5d79e76f2a0a..cfe0f2db4b77 100644
--- a/sys/compat/linux/linux_emul.h
+++ b/sys/compat/linux/linux_emul.h
@@ -77,4 +77,6 @@ struct linux_pemuldata {
struct linux_pemuldata *pem_find(struct proc *);
+extern const int bsd_to_linux_errno_generic[];
+
#endif /* !_LINUX_EMUL_H_ */
diff --git a/sys/compat/linux/linux_errno.c b/sys/compat/linux/linux_errno.c
new file mode 100644
index 000000000000..1d1c6da7b3bb
--- /dev/null
+++ b/sys/compat/linux/linux_errno.c
@@ -0,0 +1,143 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 1994-1996 Søren Schmidt
+ * All rights reserved.
+ *
+ * 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$
+ */
+
+#include <sys/errno.h>
+
+/*
+ * Linux syscalls return negative errno's, we do positive and map them
+ * Reference:
+ * FreeBSD: src/sys/sys/errno.h
+ * Linux: linux-2.6.17.8/include/asm-generic/errno-base.h
+ * linux-2.6.17.8/include/asm-generic/errno.h
+ */
+const int bsd_to_linux_errno_generic[ELAST + 1] = {
+ -0,
+ -1,
+ -2,
+ -3,
+ -4,
+ -5,
+ -6,
+ -7,
+ -8,
+ -9,
+
+ -10,
+ -35, /* EDEADLK */
+ -12,
+ -13,
+ -14,
+ -15,
+ -16,
+ -17,
+ -18,
+ -19,
+
+ -20,
+ -21,
+ -22,
+ -23,
+ -24,
+ -25,
+ -26,
+ -27,
+ -28,
+ -29,
+
+ -30,
+ -31,
+ -32,
+ -33,
+ -34,
+ -11, /* EAGAIN */
+ -115,
+ -114,
+ -88,
+ -89,
+
+ -90,
+ -91,
+ -92,
+ -93,
+ -94,
+ -95,
+ -96,
+ -97,
+ -98,
+ -99,
+
+ -100,
+ -101,
+ -102,
+ -103,
+ -104,
+ -105,
+ -106,
+ -107,
+ -108,
+ -109,
+
+ -110,
+ -111,
+ -40,
+ -36,
+ -112,
+ -113,
+ -39,
+ -11,
+ -87,
+ -122,
+
+ -116,
+ -66,
+ -6, /* EBADRPC -> ENXIO */
+ -6, /* ERPCMISMATCH -> ENXIO */
+ -6, /* EPROGUNAVAIL -> ENXIO */
+ -6, /* EPROGMISMATCH -> ENXIO */
+ -6, /* EPROCUNAVAIL -> ENXIO */
+ -37,
+ -38,
+ -9,
+
+ -6, /* EAUTH -> ENXIO */
+ -6, /* ENEEDAUTH -> ENXIO */
+ -43,
+ -42,
+ -75,
+ -125,
+ -84,
+ -61,
+ -16, /* EDOOFUS -> EBUSY */
+ -74,
+
+ -72,
+ -67,
+ -71,
+};
diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 25dbd5a0d008..3a57be5323f9 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -616,6 +616,7 @@ amd64/linux32/linux32_support.s optional compat_linux32 \
amd64/linux32/linux32_sysent.c optional compat_linux32
amd64/linux32/linux32_sysvec.c optional compat_linux32
compat/linux/linux_emul.c optional compat_linux32
+compat/linux/linux_errno.c optional compat_linux32
compat/linux/linux_file.c optional compat_linux32
compat/linux/linux_fork.c optional compat_linux32
compat/linux/linux_futex.c optional compat_linux32
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index 2f2b84c0c9a6..d2b735202702 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -88,6 +88,7 @@ compat/linprocfs/linprocfs.c optional linprocfs
compat/linsysfs/linsysfs.c optional linsysfs
compat/linux/linux_event.c optional compat_linux
compat/linux/linux_emul.c optional compat_linux
+compat/linux/linux_errno.c optional compat_linux
compat/linux/linux_file.c optional compat_linux
compat/linux/linux_fork.c optional compat_linux
compat/linux/linux_futex.c optional compat_linux
diff --git a/sys/i386/linux/linux_sysvec.c b/sys/i386/linux/linux_sysvec.c
index 03cb9ebc2e2c..2053f0713a65 100644
--- a/sys/i386/linux/linux_sysvec.c
+++ b/sys/i386/linux/linux_sysvec.c
@@ -126,26 +126,6 @@ static eventhandler_tag linux_exit_tag;
static eventhandler_tag linux_exec_tag;
static eventhandler_tag linux_thread_dtor_tag;
-/*
- * Linux syscalls return negative errno's, we do positive and map them
- * Reference:
- * FreeBSD: src/sys/sys/errno.h
- * Linux: linux-2.6.17.8/include/asm-generic/errno-base.h
- * linux-2.6.17.8/include/asm-generic/errno.h
- */
-static int bsd_to_linux_errno[ELAST + 1] = {
- -0, -1, -2, -3, -4, -5, -6, -7, -8, -9,
- -10, -35, -12, -13, -14, -15, -16, -17, -18, -19,
- -20, -21, -22, -23, -24, -25, -26, -27, -28, -29,
- -30, -31, -32, -33, -34, -11,-115,-114, -88, -89,
- -90, -91, -92, -93, -94, -95, -96, -97, -98, -99,
- -100,-101,-102,-103,-104,-105,-106,-107,-108,-109,
- -110,-111, -40, -36,-112,-113, -39, -11, -87,-122,
- -116, -66, -6, -6, -6, -6, -6, -37, -38, -9,
- -6, -6, -43, -42, -75,-125, -84, -61, -16, -74,
- -72, -67, -71
-};
-
#define LINUX_T_UNKNOWN 255
static int _bsd_to_linux_trapcode[] = {
LINUX_T_UNKNOWN, /* 0 */
@@ -913,7 +893,7 @@ struct sysentvec linux_sysvec = {
.sv_table = linux_sysent,
.sv_mask = 0,
.sv_errsize = ELAST + 1,
- .sv_errtbl = bsd_to_linux_errno,
+ .sv_errtbl = bsd_to_linux_errno_generic,
.sv_transtrap = translate_traps,
.sv_fixup = linux_fixup,
.sv_sendsig = linux_sendsig,
@@ -950,7 +930,7 @@ struct sysentvec elf_linux_sysvec = {
.sv_table = linux_sysent,
.sv_mask = 0,
.sv_errsize = ELAST + 1,
- .sv_errtbl = bsd_to_linux_errno,
+ .sv_errtbl = bsd_to_linux_errno_generic,
.sv_transtrap = translate_traps,
.sv_fixup = elf_linux_fixup,
.sv_sendsig = linux_sendsig,
diff --git a/sys/modules/linux/Makefile b/sys/modules/linux/Makefile
index 9fb761b0064b..3eee639ee228 100644
--- a/sys/modules/linux/Makefile
+++ b/sys/modules/linux/Makefile
@@ -31,7 +31,7 @@ OBJS= ${VDSO}.so
.if ${MACHINE_CPUARCH} == "i386"
SRCS+= linux_ptrace.c imgact_linux.c linux_util.c linux_mib.c linux_mmap.c \
- linux_emul.c opt_cpu.h linux.c
+ linux_emul.c linux_errno.c opt_cpu.h linux.c
.endif
.if ${MACHINE_CPUARCH} == "i386"
diff --git a/sys/modules/linux_common/Makefile b/sys/modules/linux_common/Makefile
index 8e08b39674b4..1583e88f7040 100644
--- a/sys/modules/linux_common/Makefile
+++ b/sys/modules/linux_common/Makefile
@@ -4,9 +4,11 @@
KMOD= linux_common
SRCS= linux_common.c linux_mib.c linux_mmap.c linux_util.c linux_emul.c \
+ linux_errno.c \
linux.c opt_compat.h device_if.h vnode_if.h bus_if.h
EXPORT_SYMS=
+EXPORT_SYMS+= bsd_to_linux_errno_generic
EXPORT_SYMS+= linux_emul_path
EXPORT_SYMS+= linux_ioctl_register_handler
EXPORT_SYMS+= linux_ioctl_unregister_handler