diff options
author | Florian Weimer <fweimer@redhat.com> | 2020-01-02 10:18:22 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2020-01-02 10:18:23 +0100 |
commit | a1bd5f86739926469bbe0054b93305ff5905b070 (patch) | |
tree | 48f6c1da68ce82fb7207fedc529dc98bf2092e04 /sysdeps | |
parent | 4cf0d223052dabb9caed29e1e91e1d61933e14fb (diff) | |
download | glibc-a1bd5f86739926469bbe0054b93305ff5905b070.tar.gz glibc-a1bd5f86739926469bbe0054b93305ff5905b070.tar.xz glibc-a1bd5f86739926469bbe0054b93305ff5905b070.zip |
Linux: Use system call tables during build
Use <arch-syscall.h> instead of <asm/unistd.h> to obtain the system call numbers. A few direct includes of <asm/unistd.h> need to be removed (if the system call numbers are already provided indirectly by <sysdep.h>) or replaced with <sys/syscall.h>. 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 <asm/break.h> 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 <asm/unistd.h>, but not in <asm/break.h>. Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
Diffstat (limited to 'sysdeps')
20 files changed, 44 insertions, 57 deletions
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 <sysdep.h> -#include <asm/unistd.h> #include <asm/fpu.h> /* 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 <asm/sigcontext.h> #include <linux/signal.h> #include <asm-generic/ucontext.h> -#include <asm/unistd.h> +#include <sys/syscall.h> 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 <asm/unistd.h> #include <sysdep.h> #define _ERRNO_H 1 #include <bits/errno.h> 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 <sysdep.h> -#include <asm/unistd.h> #include <asm/errno.h> .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 <sysdeps/ia64/sysdep.h> #include <dl-sysdep.h> #include <tls.h> +#include <asm/break.h> /* 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 <sys/syscall.h>. 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 + <http://www.gnu.org/licenses/>. */ + +#ifndef _SYSCALL_H + +#ifdef _ISOMAC +# include <sysdeps/unix/sysv/linux/sys/syscall.h> +#else /* !_ISOMAC */ +/* Use the built-in system call list, not <asm/unistd.h>, which may + not list all the system call numbers we need. */ +# define _SYSCALL_H +# include <arch-syscall.h> +#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 <sys/asm.h> #include <sysdep.h> -#include <asm/unistd.h> #include <sgidefs.h> #include <tls.h> 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 <asm/unistd.h> #include <sysdeps/unix/sysdep.h> #include <sysdeps/nios2/sysdep.h> #include <sysdeps/unix/sysv/linux/generic/sysdep.h> 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 <asm/unistd.h> #endif +#include <sys/syscall.h> 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 <asm/errno.h> -#include <asm/unistd.h> #include <tcb-offsets.h> #include <sysdep.h> 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 <asm/errno.h> -#include <asm/unistd.h> #include <tcb-offsets.h> #include <sysdep.h> 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 <asm/unistd.h> -#ifndef _LIBC -/* The Linux kernel header file defines macros `__NR_<name>', but some - programs expect the traditional form `SYS_<name>'. So in building libc - we scan the kernel's list and produce <bits/syscall.h> with macros for - all the `SYS_' names. */ -# include <bits/syscall.h> -#endif +/* The Linux kernel header file defines macros __NR_*, but some + programs expect the traditional form SYS_*. <bits/syscall.h> + defines SYS_* macros for __NR_* macros of known names. */ +#include <bits/syscall.h> #endif |