From patchwork Tue May 28 22:10:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 1106583 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-102312-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="EaaRwS1J"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45D7MB6T4bz9s5c for ; Wed, 29 May 2019 08:10:30 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:mime-version :content-type; q=dns; s=default; b=PxZFEzDUs94WxQuiXikI47JjIm7TN FUiW2oSMydxlM6kUJTyO5s2vAvh4kgozCC2SvTj4+mZAjeQTCy1EI0IjB5Y/TdST VTXmC3+PB1IV8OruOMlo8ndZCVqmO1Zr3Cx8g5TF+bSgzmKN1kJTNVtMAdJfrwgs tEMvM8bvDmCXxk= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:mime-version :content-type; s=default; bh=sWux21QUIEtOlrJ7Xtqz3WUkPus=; b=Eaa RwS1JSGgTBUVwNBhLcDyCPDj8CVfuWJV2oymv+xT4n9q1VbL+RT1GLJAOlp+cm2W XnKKT4tubZBuj1Ws2/ZSZvKl73mmlLwkhAOIpAcRSF049Ufn9Yizfccm5JQ50BaE jJSmAPgrWJtc68VA76Jeh8O+xGxrEnQPEnIJnMeQ= Received: (qmail 84655 invoked by alias); 28 May 2019 22:10:24 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 84644 invoked by uid 89); 28 May 2019 22:10:24 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-18.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, SPF_HELO_PASS autolearn=ham version=3.3.1 spammy=356, 2297, Wrapper X-HELO: mx1.redhat.com From: Florian Weimer To: libc-alpha@sourceware.org Subject: [PATCH] Linux: Use system call tables during build Date: Wed, 29 May 2019 00:10:18 +0200 Message-ID: <87k1eaqlh1.fsf@oldenburg2.str.redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 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 . 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 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 . 2019-05-28 Florian Weimer Linux: Use system call tables during build. * sysdeps/unix/sysv/linux/sys/syscall.h: Remove _LIBC preprocessor check. This file is now only used with _ISOMAC (from the test suite), so can be included unconditionally. Update comment. * sysdeps/unix/sysv/linux/include/sys/syscall.h: New file. * sysdeps/ia64/start.S: Do not include . * sysdeps/microblaze/backtrace_linux.c: Include instead of . * sysdeps/unix/sysv/linux/arm/dl-machine.h (CLEAR_CACHE): Use INTERNAL_SYSCALL instead of INTERNAL_SYSCALL_ARM. * sysdeps/unix/sysv/linux/arm/tls.h (TLS_INIT_TP): Likewise. * sysdeps/unix/sysv/linux/arm/sysdep.h (INTERNAL_SYSCALL_ARM): Remove definition. * sysdeps/unix/sysv/linux/hppa/clone.S: Do not include . * sysdeps/unix/sysv/linux/ia64/brk.S: Likewise. * sysdeps/unix/sysv/linux/ia64/clone2.S (__clone2): Use __IA64_BREAK_SYSCALL instead of __BREAK_SYSCALL. * sysdeps/unix/sysv/linux/ia64/syscall.S (syscall): Likewise. * sysdeps/unix/sysv/linux/ia64/sysdep.S (__ia64_syscall): Likewise. * sysdeps/unix/sysv/linux/ia64/sysdep.h (DO_CALL_VIA_BREAK): Likewise. (DO_INLINE_SYSCALL_NCS): Likewise. * sysdeps/unix/sysv/linux/mips/vfork.S: Do not include . * sysdeps/unix/sysv/linux/nios2/sysdep.h: Likewise. * sysdeps/unix/sysv/linux/riscv/flush-icache.c: Unconditionally include instead of or . * sysdeps/unix/sysv/linux/sparc/sparc32/clone.S: Do not include . * sysdeps/unix/sysv/linux/sparc/sparc64/clone.S: Likewise. diff --git a/NEWS b/NEWS index c885b960ca..9cd311466a 100644 --- a/NEWS +++ b/NEWS @@ -65,6 +65,9 @@ Changes to build and runtime requirements: Older GCC versions and non-GNU compilers are still supported when compiling programs that use the GNU C Library. +* It is no longer necessary to have recent Linux kernel headers to build + working (non-stub) system call wrappers. + Security related changes: CVE-2019-7309: x86-64 memcmp used signed Jcc instructions to check diff --git a/sysdeps/ia64/start.S b/sysdeps/ia64/start.S index 0ddc06ef57..839edf0661 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 c9549201e3..71febfd1b1 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/arm/dl-machine.h b/sysdeps/unix/sysv/linux/arm/dl-machine.h index 51cf8c7cce..a421cb8226 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 9b4ed8d6a5..1e96a7608d 100644 --- a/sysdeps/unix/sysv/linux/arm/sysdep.h +++ b/sysdeps/unix/sysv/linux/arm/sysdep.h @@ -380,10 +380,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 5fc3ccd013..0a54dcae3a 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 79fa4f6147..661f6e8e0e 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 0d06c0c5b7..96abd462d1 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 054d4347f2..a699929c70 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 c1edd146f6..bb0432bff9 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 a3b38fa8fc..553d9152c4 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 3328502efe..be35bbf7e4 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..fe87e8ee25 --- /dev/null +++ b/sysdeps/unix/sysv/linux/include/sys/syscall.h @@ -0,0 +1,29 @@ +/* Wrapper header for . 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 + . */ + +#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 f186c0f302..d95125a891 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 a617a5c03f..bf88ef08ae 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 cd5c400977..328abd0780 100644 --- a/sysdeps/unix/sysv/linux/riscv/flush-icache.c +++ b/sysdeps/unix/sysv/linux/riscv/flush-icache.c @@ -21,11 +21,7 @@ #include #include #include -#if __has_include__ () -# include -#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 274605dc65..d67e339e2b 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 2d0cf2dbe6..ab9ffb7214 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 c0fc63b736..a04b9dda3d 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