From a1bd5f86739926469bbe0054b93305ff5905b070 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Thu, 2 Jan 2020 10:18:22 +0100 Subject: Linux: Use system call tables during build Use instead of to obtain the system call numbers. A few direct includes of need to be removed (if the system call numbers are already provided indirectly by ) or replaced with . Current Linux headers for alpha define the required system call names, so most of the _NR_* hacks are no longer needed. For the 32-bit arm architecture, eliminate the INTERNAL_SYSCALL_ARM macro, now that we have regular system call names for cacheflush and set_tls. There are more such cleanup opportunities for other architectures, but these cleanups are required to avoid macro redefinition errors during the build. For ia64, it is desirable to use directly to obtain the break number for system calls (which is not a system call number itself). This requires replacing __BREAK_SYSCALL with __IA64_BREAK_SYSCALL because the former is defined as an alias in , but not in . Reviewed-by: Siddhesh Poyarekar --- NEWS | 3 ++- sysdeps/ia64/start.S | 1 - sysdeps/microblaze/backtrace_linux.c | 2 +- sysdeps/unix/sysv/linux/alpha/kernel-features.h | 5 ----- sysdeps/unix/sysv/linux/alpha/sysdep.h | 25 --------------------- sysdeps/unix/sysv/linux/arm/dl-machine.h | 2 +- sysdeps/unix/sysv/linux/arm/sysdep.h | 4 ---- sysdeps/unix/sysv/linux/arm/tls.h | 2 +- sysdeps/unix/sysv/linux/hppa/clone.S | 1 - sysdeps/unix/sysv/linux/ia64/brk.S | 1 - sysdeps/unix/sysv/linux/ia64/clone2.S | 4 ++-- sysdeps/unix/sysv/linux/ia64/syscall.S | 2 +- sysdeps/unix/sysv/linux/ia64/sysdep.S | 2 +- sysdeps/unix/sysv/linux/ia64/sysdep.h | 5 +++-- sysdeps/unix/sysv/linux/include/sys/syscall.h | 29 +++++++++++++++++++++++++ sysdeps/unix/sysv/linux/mips/vfork.S | 1 - sysdeps/unix/sysv/linux/nios2/sysdep.h | 1 - sysdeps/unix/sysv/linux/riscv/flush-icache.c | 1 + sysdeps/unix/sysv/linux/sparc/sparc32/clone.S | 1 - sysdeps/unix/sysv/linux/sparc/sparc64/clone.S | 1 - sysdeps/unix/sysv/linux/sys/syscall.h | 11 ++++------ 21 files changed, 46 insertions(+), 58 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/include/sys/syscall.h diff --git a/NEWS b/NEWS index 7249fcad48..b85989ec3d 100644 --- a/NEWS +++ b/NEWS @@ -101,7 +101,8 @@ Deprecated and removed features, and other changes affecting compatibility: Changes to build and runtime requirements: - [Add changes to build and runtime requirements here] +* It is no longer necessary to have recent Linux kernel headers to build + working (non-stub) system call wrappers. Security related changes: diff --git a/sysdeps/ia64/start.S b/sysdeps/ia64/start.S index dcd2aa0131..18c8962b6e 100644 --- a/sysdeps/ia64/start.S +++ b/sysdeps/ia64/start.S @@ -35,7 +35,6 @@ #include -#include #include /* diff --git a/sysdeps/microblaze/backtrace_linux.c b/sysdeps/microblaze/backtrace_linux.c index 9ae5aeded9..49c955b5d6 100644 --- a/sysdeps/microblaze/backtrace_linux.c +++ b/sysdeps/microblaze/backtrace_linux.c @@ -20,7 +20,7 @@ #include #include #include -#include +#include int _identify_sighandler (unsigned long fp, unsigned long pc, diff --git a/sysdeps/unix/sysv/linux/alpha/kernel-features.h b/sysdeps/unix/sysv/linux/alpha/kernel-features.h index 24fd6ca38f..5f003e634a 100644 --- a/sysdeps/unix/sysv/linux/alpha/kernel-features.h +++ b/sysdeps/unix/sysv/linux/alpha/kernel-features.h @@ -28,11 +28,6 @@ # define __ASSUME_STATFS64 0 #endif -/* Alpha used to define SysV ipc shmat syscall with a different name. */ -#ifndef __NR_shmat -# define __NR_shmat __NR_osf_shmat -#endif - #define __ASSUME_RECV_SYSCALL 1 #define __ASSUME_SEND_SYSCALL 1 diff --git a/sysdeps/unix/sysv/linux/alpha/sysdep.h b/sysdeps/unix/sysv/linux/alpha/sysdep.h index 81de842644..2458f9860a 100644 --- a/sysdeps/unix/sysv/linux/alpha/sysdep.h +++ b/sysdeps/unix/sysv/linux/alpha/sysdep.h @@ -37,31 +37,6 @@ #undef SYS_ify #define SYS_ify(syscall_name) __NR_##syscall_name -/* Define some aliases to make automatic syscall generation work - properly. The SYS_* variants are for the benefit of the files in - sysdeps/unix. */ -#define __NR_getpid __NR_getxpid -#define __NR_getuid __NR_getxuid -#define __NR_getgid __NR_getxgid -#define SYS_getpid __NR_getxpid -#define SYS_getuid __NR_getxuid -#define SYS_getgid __NR_getxgid - -/* - * Some syscalls no Linux program should know about: - */ -#define __NR_osf_sigprocmask 48 -#ifndef __NR_osf_shmat -# define __NR_osf_shmat 209 -#endif -#define __NR_osf_getsysinfo 256 -#define __NR_osf_setsysinfo 257 - -/* Help old kernel headers where particular syscalls are not available. */ -#ifndef __NR_semtimedop -# define __NR_semtimedop 423 -#endif - /* This is a kludge to make syscalls.list find these under the names pread and pwrite, since some kernel headers define those names and some define the *64 names for the same system calls. */ diff --git a/sysdeps/unix/sysv/linux/arm/dl-machine.h b/sysdeps/unix/sysv/linux/arm/dl-machine.h index 11b56a62b1..5fc685fdaf 100644 --- a/sysdeps/unix/sysv/linux/arm/dl-machine.h +++ b/sysdeps/unix/sysv/linux/arm/dl-machine.h @@ -20,7 +20,7 @@ /* This definition is Linux-specific. */ #define CLEAR_CACHE(BEG,END) \ - INTERNAL_SYSCALL_ARM (cacheflush, , 3, (BEG), (END), 0) + INTERNAL_SYSCALL (cacheflush, , 3, (BEG), (END), 0) #endif diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.h b/sysdeps/unix/sysv/linux/arm/sysdep.h index 4c2dc2dbb2..2304dad8f3 100644 --- a/sysdeps/unix/sysv/linux/arm/sysdep.h +++ b/sysdeps/unix/sysv/linux/arm/sysdep.h @@ -377,10 +377,6 @@ __local_syscall_error: \ #define INTERNAL_SYSCALL(name, err, nr, args...) \ INTERNAL_SYSCALL_RAW(SYS_ify(name), err, nr, args) -#undef INTERNAL_SYSCALL_ARM -#define INTERNAL_SYSCALL_ARM(name, err, nr, args...) \ - INTERNAL_SYSCALL_RAW(__ARM_NR_##name, err, nr, args) - #undef INTERNAL_SYSCALL_ERROR_P #define INTERNAL_SYSCALL_ERROR_P(val, err) \ ((unsigned int) (val) >= 0xfffff001u) diff --git a/sysdeps/unix/sysv/linux/arm/tls.h b/sysdeps/unix/sysv/linux/arm/tls.h index 3b91f46e3c..18afe244d7 100644 --- a/sysdeps/unix/sysv/linux/arm/tls.h +++ b/sysdeps/unix/sysv/linux/arm/tls.h @@ -33,7 +33,7 @@ # define TLS_INIT_TP(tcbp) \ ({ INTERNAL_SYSCALL_DECL (err); \ long int result_var; \ - result_var = INTERNAL_SYSCALL_ARM (set_tls, err, 1, (tcbp)); \ + result_var = INTERNAL_SYSCALL (set_tls, err, 1, (tcbp)); \ INTERNAL_SYSCALL_ERROR_P (result_var, err) \ ? "unknown error" : NULL; }) diff --git a/sysdeps/unix/sysv/linux/hppa/clone.S b/sysdeps/unix/sysv/linux/hppa/clone.S index e90dd5ed9c..4eda812dd0 100644 --- a/sysdeps/unix/sysv/linux/hppa/clone.S +++ b/sysdeps/unix/sysv/linux/hppa/clone.S @@ -20,7 +20,6 @@ /* clone() is even more special than fork() as it mucks with stacks and invokes a function in the right context after its all over. */ -#include #include #define _ERRNO_H 1 #include diff --git a/sysdeps/unix/sysv/linux/ia64/brk.S b/sysdeps/unix/sysv/linux/ia64/brk.S index f4195c8672..734d3467a7 100644 --- a/sysdeps/unix/sysv/linux/ia64/brk.S +++ b/sysdeps/unix/sysv/linux/ia64/brk.S @@ -20,7 +20,6 @@ #include -#include #include .global __curbrk diff --git a/sysdeps/unix/sysv/linux/ia64/clone2.S b/sysdeps/unix/sysv/linux/ia64/clone2.S index de6de43706..c8c90e5372 100644 --- a/sysdeps/unix/sysv/linux/ia64/clone2.S +++ b/sysdeps/unix/sysv/linux/ia64/clone2.S @@ -58,7 +58,7 @@ ENTRY(__clone2) */ mov r15=SYS_ify (clone2) .save rp, r0 - break __BREAK_SYSCALL + break __IA64_BREAK_SYSCALL .body cmp.eq p6,p0=-1,r10 cmp.eq CHILD,PARENT=0,r8 /* Are we the child? */ @@ -78,7 +78,7 @@ ENTRY(__clone2) mov gp=loc0 mov r15=SYS_ify (exit) .save rp, r0 - break __BREAK_SYSCALL + break __IA64_BREAK_SYSCALL ret /* Not reached. */ PSEUDO_END(__clone2) diff --git a/sysdeps/unix/sysv/linux/ia64/syscall.S b/sysdeps/unix/sysv/linux/ia64/syscall.S index 14b3be6927..d819f79d4b 100644 --- a/sysdeps/unix/sysv/linux/ia64/syscall.S +++ b/sysdeps/unix/sysv/linux/ia64/syscall.S @@ -25,7 +25,7 @@ ENTRY(syscall) in {out0...out5} like the kernel syscall handler expects. */ alloc r2=ar.pfs,1,0,8,0 mov r15=r32 /* syscall number */ - break __BREAK_SYSCALL + break __IA64_BREAK_SYSCALL ;; cmp.ne p6,p0=-1,r10 /* r10 = -1 on error */ (p6) ret diff --git a/sysdeps/unix/sysv/linux/ia64/sysdep.S b/sysdeps/unix/sysv/linux/ia64/sysdep.S index be1aeb2e1c..75fc3d6456 100644 --- a/sysdeps/unix/sysv/linux/ia64/sysdep.S +++ b/sysdeps/unix/sysv/linux/ia64/sysdep.S @@ -51,7 +51,7 @@ END(__syscall_error) ENTRY(__ia64_syscall) mov r15=r37 /* syscall number */ - break __BREAK_SYSCALL + break __IA64_BREAK_SYSCALL cmp.eq p6,p0=-1,r10 /* r10 = -1 on error */ (p6) br.cond.spnt.few __syscall_error ret diff --git a/sysdeps/unix/sysv/linux/ia64/sysdep.h b/sysdeps/unix/sysv/linux/ia64/sysdep.h index c4aa72a2fc..61f32ca8b4 100644 --- a/sysdeps/unix/sysv/linux/ia64/sysdep.h +++ b/sysdeps/unix/sysv/linux/ia64/sysdep.h @@ -25,6 +25,7 @@ #include #include #include +#include /* In order to get __set_errno() definition in INLINE_SYSCALL. */ #ifndef __ASSEMBLER__ @@ -115,7 +116,7 @@ #define DO_CALL_VIA_BREAK(num) \ mov r15=num; \ - break __BREAK_SYSCALL + break __IA64_BREAK_SYSCALL #ifdef IA64_USE_NEW_STUB # ifdef SHARED @@ -229,7 +230,7 @@ register long _r15 asm ("r15") = name; \ long _retval; \ LOAD_REGS_##nr \ - __asm __volatile (BREAK_INSN (__BREAK_SYSCALL) \ + __asm __volatile (BREAK_INSN (__IA64_BREAK_SYSCALL) \ : "=r" (_r8), "=r" (_r10), "=r" (_r15) \ ASM_OUTARGS_##nr \ : "2" (_r15) ASM_ARGS_##nr \ diff --git a/sysdeps/unix/sysv/linux/include/sys/syscall.h b/sysdeps/unix/sysv/linux/include/sys/syscall.h new file mode 100644 index 0000000000..9611ca4481 --- /dev/null +++ b/sysdeps/unix/sysv/linux/include/sys/syscall.h @@ -0,0 +1,29 @@ +/* Wrapper header for . Linux version. + Copyright (C) 2020 Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _SYSCALL_H + +#ifdef _ISOMAC +# include +#else /* !_ISOMAC */ +/* Use the built-in system call list, not , which may + not list all the system call numbers we need. */ +# define _SYSCALL_H +# include +#endif /* !_ISOMAC */ + +#endif /* _SYSCALL_H */ diff --git a/sysdeps/unix/sysv/linux/mips/vfork.S b/sysdeps/unix/sysv/linux/mips/vfork.S index 1c08f222da..ba3c64ae1e 100644 --- a/sysdeps/unix/sysv/linux/mips/vfork.S +++ b/sysdeps/unix/sysv/linux/mips/vfork.S @@ -19,7 +19,6 @@ #include #include -#include #include #include diff --git a/sysdeps/unix/sysv/linux/nios2/sysdep.h b/sysdeps/unix/sysv/linux/nios2/sysdep.h index 82a126b697..b02730bd23 100644 --- a/sysdeps/unix/sysv/linux/nios2/sysdep.h +++ b/sysdeps/unix/sysv/linux/nios2/sysdep.h @@ -19,7 +19,6 @@ #ifndef _LINUX_NIOS2_SYSDEP_H #define _LINUX_NIOS2_SYSDEP_H 1 -#include #include #include #include diff --git a/sysdeps/unix/sysv/linux/riscv/flush-icache.c b/sysdeps/unix/sysv/linux/riscv/flush-icache.c index ef41725f6f..f1565ab2dd 100644 --- a/sysdeps/unix/sysv/linux/riscv/flush-icache.c +++ b/sysdeps/unix/sysv/linux/riscv/flush-icache.c @@ -26,6 +26,7 @@ #else # include #endif +#include typedef int (*func_type) (void *, void *, unsigned long int); diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S index 94ce7aef28..a6a797f30d 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S @@ -20,7 +20,6 @@ and invokes a function in the right context after its all over. */ #include -#include #include #include diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S b/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S index 177ef93ef0..de5e054d84 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S @@ -20,7 +20,6 @@ and invokes a function in the right context after its all over. */ #include -#include #include #include diff --git a/sysdeps/unix/sysv/linux/sys/syscall.h b/sysdeps/unix/sysv/linux/sys/syscall.h index 2a42f5be2e..aa89a74e6b 100644 --- a/sysdeps/unix/sysv/linux/sys/syscall.h +++ b/sysdeps/unix/sysv/linux/sys/syscall.h @@ -23,12 +23,9 @@ from the kernel sources. */ #include -#ifndef _LIBC -/* The Linux kernel header file defines macros `__NR_', but some - programs expect the traditional form `SYS_'. So in building libc - we scan the kernel's list and produce with macros for - all the `SYS_' names. */ -# include -#endif +/* The Linux kernel header file defines macros __NR_*, but some + programs expect the traditional form SYS_*. + defines SYS_* macros for __NR_* macros of known names. */ +#include #endif -- cgit v1.2.3-70-g09d2