Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 28 Apr 2019 13:33:36 +0000 (UTC)
From:      Dmitry Chagin <dchagin@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r346823 - in stable/11: lib/libsysdecode sys/amd64/linux sys/amd64/linux32 sys/compat/linux sys/conf sys/i386/linux sys/modules/linux sys/modules/linux_common
Message-ID:  <201904281333.x3SDXae2023101@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dchagin
Date: Sun Apr 28 13:33:35 2019
New Revision: 346823
URL: https://svnweb.freebsd.org/changeset/base/346823

Log:
  MFC r331056:
  Share a single bsd-linux errno table across MD consumers
  
  Three copies of the linuxulator linux_sysvec.c contained identical
  BSD to Linux errno translation tables, and future work to support other
  architectures will also use the same table.  Move the table to a common
  file to be used by all.  Make it 'const int' to place it in .rodata.
  
  (Some existing Linux architectures use MD errno values, but x86 and Arm
  share the generic set.)
  
  This change should introduce no functional change; a followup will add
  missing errno values.
  
  MFC r331057:
  linux_errno.c: add newer errno values
  
  Also introduce a static assert to ensure the list is kept up to date.
  
  MFC r331060:
  Chase r331057 in libsysdecode erno table

Added:
  stable/11/sys/compat/linux/linux_errno.c
     - copied, changed from r331056, head/sys/compat/linux/linux_errno.c
Modified:
  stable/11/lib/libsysdecode/errno.c
  stable/11/sys/amd64/linux/linux_sysvec.c
  stable/11/sys/amd64/linux32/linux32_sysvec.c
  stable/11/sys/compat/linux/linux_emul.h
  stable/11/sys/conf/files.amd64
  stable/11/sys/conf/files.i386
  stable/11/sys/i386/linux/linux_sysvec.c
  stable/11/sys/modules/linux/Makefile
  stable/11/sys/modules/linux_common/Makefile
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/lib/libsysdecode/errno.c
==============================================================================
--- stable/11/lib/libsysdecode/errno.c	Sun Apr 28 13:29:29 2019	(r346822)
+++ stable/11/lib/libsysdecode/errno.c	Sun Apr 28 13:33:35 2019	(r346823)
@@ -41,8 +41,8 @@ __FBSDID("$FreeBSD$");
  * 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
+ *   Linux:   include/uapi/asm-generic/errno-base.h
+ *            include/uapi/asm-generic/errno.h
  */
 static int bsd_to_linux_errno[ELAST + 1] = {
 	-0,  -1,  -2,  -3,  -4,  -5,  -6,  -7,  -8,  -9,
@@ -54,7 +54,7 @@ static int bsd_to_linux_errno[ELAST + 1] = {
 	-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
+	 -72, -67, -71,  -1,  -1, -131, -130
 };
 #endif
 

Modified: stable/11/sys/amd64/linux/linux_sysvec.c
==============================================================================
--- stable/11/sys/amd64/linux/linux_sysvec.c	Sun Apr 28 13:29:29 2019	(r346822)
+++ stable/11/sys/amd64/linux/linux_sysvec.c	Sun Apr 28 13:33:35 2019	(r346823)
@@ -130,26 +130,6 @@ static void	linux_exec_setregs(struct thread *td, stru
 		    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 */
@@ -773,7 +753,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,

Modified: stable/11/sys/amd64/linux32/linux32_sysvec.c
==============================================================================
--- stable/11/sys/amd64/linux32/linux32_sysvec.c	Sun Apr 28 13:29:29 2019	(r346822)
+++ stable/11/sys/amd64/linux32/linux32_sysvec.c	Sun Apr 28 13:33:35 2019	(r346823)
@@ -131,26 +131,6 @@ static bool	linux32_trans_osrel(const Elf_Note *note, 
 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,

Modified: stable/11/sys/compat/linux/linux_emul.h
==============================================================================
--- stable/11/sys/compat/linux/linux_emul.h	Sun Apr 28 13:29:29 2019	(r346822)
+++ stable/11/sys/compat/linux/linux_emul.h	Sun Apr 28 13:33:35 2019	(r346823)
@@ -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_ */

Copied and modified: stable/11/sys/compat/linux/linux_errno.c (from r331056, head/sys/compat/linux/linux_errno.c)
==============================================================================
--- head/sys/compat/linux/linux_errno.c	Fri Mar 16 14:46:38 2018	(r331056, copy source)
+++ stable/11/sys/compat/linux/linux_errno.c	Sun Apr 28 13:33:35 2019	(r346823)
@@ -28,14 +28,15 @@
  * $FreeBSD$
  */
 
+#include <sys/cdefs.h>
 #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
+ *   Linux:   include/uapi/asm-generic/errno-base.h
+ *            include/uapi/asm-generic/errno.h
  */
 const int bsd_to_linux_errno_generic[ELAST + 1] = {
 	-0,
@@ -140,4 +141,11 @@ const int bsd_to_linux_errno_generic[ELAST + 1] = {
 	-72,
 	-67,
 	-71,
+	-1,	/* ENOTCAPABLE -> EPERM */
+	-1,	/* ECAPMODE -> EPERM */
+	-131,	/* ENOTRECOVERABLE */
+	-130,	/* EOWNERDEAD */
 };
+
+_Static_assert(ELAST == 96,
+    "missing errno entries in bsd_to_linux_errno_generic");

Modified: stable/11/sys/conf/files.amd64
==============================================================================
--- stable/11/sys/conf/files.amd64	Sun Apr 28 13:29:29 2019	(r346822)
+++ stable/11/sys/conf/files.amd64	Sun Apr 28 13:33:35 2019	(r346823)
@@ -623,6 +623,7 @@ amd64/linux32/linux32_support.s	optional	compat_linux3
 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

Modified: stable/11/sys/conf/files.i386
==============================================================================
--- stable/11/sys/conf/files.i386	Sun Apr 28 13:29:29 2019	(r346822)
+++ stable/11/sys/conf/files.i386	Sun Apr 28 13:33:35 2019	(r346823)
@@ -100,6 +100,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

Modified: stable/11/sys/i386/linux/linux_sysvec.c
==============================================================================
--- stable/11/sys/i386/linux/linux_sysvec.c	Sun Apr 28 13:29:29 2019	(r346822)
+++ stable/11/sys/i386/linux/linux_sysvec.c	Sun Apr 28 13:33:35 2019	(r346823)
@@ -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 */
@@ -905,7 +885,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,
@@ -942,7 +922,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,

Modified: stable/11/sys/modules/linux/Makefile
==============================================================================
--- stable/11/sys/modules/linux/Makefile	Sun Apr 28 13:29:29 2019	(r346822)
+++ stable/11/sys/modules/linux/Makefile	Sun Apr 28 13:33:35 2019	(r346823)
@@ -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"

Modified: stable/11/sys/modules/linux_common/Makefile
==============================================================================
--- stable/11/sys/modules/linux_common/Makefile	Sun Apr 28 13:29:29 2019	(r346822)
+++ stable/11/sys/modules/linux_common/Makefile	Sun Apr 28 13:33:35 2019	(r346823)
@@ -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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201904281333.x3SDXae2023101>