public inbox for glibc-cvs@sourceware.org help / color / mirror / Atom feed
From: Florian Weimer <fw@sourceware.org> To: glibc-cvs@sourceware.org Subject: [glibc/fw/builtin-syscalls-3] Linux: Use system call tables during build Date: Thu, 12 Dec 2019 08:40:00 -0000 [thread overview] Message-ID: <20191212084050.45637.qmail@sourceware.org> (raw) https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=2e9b5db50a9d27393199cfc2737bb30fa533053e commit 2e9b5db50a9d27393199cfc2737bb30fa533053e Author: Florian Weimer <fweimer@redhat.com> Date: Fri May 31 13:47:27 2019 +0200 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>. 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. 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>. Diff: --- NEWS | 3 ++- sysdeps/ia64/start.S | 1 - sysdeps/microblaze/backtrace_linux.c | 2 +- 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 ++++------ 19 files changed, 46 insertions(+), 28 deletions(-) diff --git a/NEWS b/NEWS index 5a2d0a5..65140cb 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 7c52d39..239a728 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 d4035bd..89a318f 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/arm/dl-machine.h b/sysdeps/unix/sysv/linux/arm/dl-machine.h index 5860258..ab5b4a9 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 e9e022e..5b2a9df 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 7dd9b64..54d6012 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 372d29a..536071b 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 884ca2b..8e5f22e 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 01e9eb9..b43770d 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 b8209d2..51430aa 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 0371c41..d3836e6 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 4abe152..e55b2eb 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 0000000..fe87e8e --- /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) 2019 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 ec0f6bd..03b6cc2 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 58c119d..dda6405 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 c5bd60d..39dd293 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 6f6518e..ee82d82 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 f6122e5..603c0a0 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 223fba5..71e4250 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
reply other threads:[~2019-12-12 8:40 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20191212084050.45637.qmail@sourceware.org \ --to=fw@sourceware.org \ --cc=glibc-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).