From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 44663 invoked by alias); 25 Oct 2016 17:54:06 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 44648 invoked by uid 89); 25 Oct 2016 17:54:05 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.3 required=5.0 tests=BAYES_50,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM,SPF_PASS autolearn=no version=3.3.2 spammy=weak_alias, Lesser, 1,38, __set_errno X-HELO: mail-ua0-f178.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=kOj1mVtwwkWSI3vkpG4KODetBzIpu/rDokYMS6EdgbA=; b=hPPDNimELKJPn2qNwumOmq1Pubw8g2LivEUXUysdGtleZf6D7VBxxPLrZGtWCbCX1e zC7MMtJ29N8YqhtJrIuPDKGPZVbfuR/Tr8+CrvoiVwrNwj0+CIi+F+sYatZ7tC5XFp1v AZrDfpFPSQK904+TF7Y9OWUIzQ0Rl6KpcoUMW4OazRCTtzzfyHLsUwiXvr36wwB1NU+G PVNcuOMqVEHIYUKP6xTOJ04X4iWVYUTstn/RkBDP80BeiODcm7wStYhl4W2DQbSBiRJp cwWr84WfdATksDWlLdoZF8KY8uADNpRNFpXazcUGSnvdaizD2HAsw7kB2Y2ICENmJyHv 6LkQ== X-Gm-Message-State: ABUngveAVZnkSxRV3tsFYfBZizMy5PFSJxY+Tj5H9uDhFawF6QZvbPAtMRLdcUmFnLzEUc20 X-Received: by 10.159.36.51 with SMTP id 48mr10038372uaq.124.1477418032887; Tue, 25 Oct 2016 10:53:52 -0700 (PDT) Subject: Re: [PATCH v3 2/4] Consolidate lseek/lseek64/llseek implementations To: libc-alpha@sourceware.org References: <1474383714-15187-1-git-send-email-adhemerval.zanella@linaro.org> <1474383714-15187-3-git-send-email-adhemerval.zanella@linaro.org> From: Adhemerval Zanella Message-ID: Date: Tue, 25 Oct 2016 17:54:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.3.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-SW-Source: 2016-10/txt/msg00435.txt.bz2 Ping (x2). On 11/10/2016 11:39, Adhemerval Zanella wrote: > Ping. > > On 20/09/2016 12:01, Adhemerval Zanella wrote: >> Changes from previous version: >> >> - lseek64 logic to define which syscall to use depends only of >> __NR__llseek and __NR_lseek avaliability (instead of relying on >> __OFF_T_MATCHES_OFF64_T). This is make new ports that might >> define __OFF_T_MATCHES_OFF64_T, but still use the __NR__llseek >> (such as aarch64 ilp32). >> >> - Add a guard while defining __NR__llseek only if __NR_llseek is >> also defined. >> >> - Rebase for new pthread compat wrappers Makefile changes. >> >> -- >> >> This patch consolidates all Linux lseek/lseek64/llseek implementation >> in on on sysdeps/unix/sysv/linux/lseek{64}.c. It also removes the llseek >> file and instead consolidate the LFS lseek implementation on lseek64.c >> as for other LFS symbols implementations. >> >> The general idea is: >> >> - lseek: ABIs that not define __OFF_T_MATCHES_OFF64_T will preferable >> use __NR__llseek if kernel supports it, otherwise they will use __NR_lseek. >> ABIs that defines __OFF_T_MATCHES_OFF64_T won't produce any symbol. >> >> - lseek64: ABIs with __OFF_T_MATCHES_OFF64_T will preferable use __NR_lseek >> (since it will use 64-bit arguments without low/high splitting) and >> __NR__llseek if __NR_lseek is not defined (for some ILP32 ports). >> >> - llseek: files will be removed and symbols will be aliased ot lseek64. >> >> ABI without __OFF_T_MATCHES_OFF64_T and without __NR_llseek (basically MIPS64n32 >> so far) are covered by building lseek with off_t as expected and lseek64 >> using __NR_lseek (as expected for off64_t being passed using 64-bit registers). >> >> For this consolidation I mantained the x32 assembly specific implementation >> because to correctly fix this it would required both the x32 fix for >> {INLINE,INTERNAL}_SYSCALL [1] and a wrapper to correctly subscribe it to >> return 64 bits instead of default 32 bits (as for times). It could a future >> cleanup. >> >> It is based on my previous {INTERNAL,INLINE}_SYSCALL_CALL macro [2], >> although it is mainly for simplification. >> >> Tested on x86_64, i686, aarch64, armhf, and powerpc64le. >> >> * nptl/Makefile (pthread-compat-wrappers): Remove llseek and add >> lseek64. >> * sysdeps/unix/sysv/linux/Makefile (sysdeps_routines): Remove llseek. >> * sysdeps/unix/sysv/linux/alpha/Makefile (sysdeps_routines): >> Likewise. >> * sysdeps/unix/sysv/linux/generic/sysdep.h (__NR__llseek): Define iff >> __NR_llseek is defined. >> * sysdeps/unix/sysv/linux/generic/wordsize-32/llseek.c: Remove file. >> * sysdeps/unix/sysv/linux/generic/wordsize-32/lseek.c: Remove file. >> * sysdeps/unix/sysv/linux/mips/mips64/llseek.c: Likewise. >> * sysdeps/unix/sysv/linux/llseek.c: Remove file. >> * sysdeps/unix/sysv/linux/lseek.c: New file. >> * sysdeps/unix/sysv/linux/lseek64.c: Add default Linux implementation. >> * sysdeps/unix/sysv/linux/mips/mips64/syscalls.list: Remove lseek and >> __libc_lseek64 from auto-generation. >> * sysdeps/unix/sysv/linux/wordsize-64/syscalls.list: Likewise. >> * sysdeps/unix/sysv/linux/x86_64/x32/lseek64.S: New file. >> >> [1] https://sourceware.org/ml/libc-alpha/2016-08/msg00443.html >> [2] https://sourceware.org/ml/libc-alpha/2016-08/msg00646.html >> --- >> nptl/Makefile | 2 +- >> sysdeps/unix/sysv/linux/Makefile | 2 +- >> sysdeps/unix/sysv/linux/alpha/Makefile | 2 +- >> sysdeps/unix/sysv/linux/generic/sysdep.h | 4 +- >> .../unix/sysv/linux/generic/wordsize-32/llseek.c | 46 ------------------ >> .../unix/sysv/linux/generic/wordsize-32/lseek.c | 38 --------------- >> sysdeps/unix/sysv/linux/llseek.c | 46 ------------------ >> sysdeps/unix/sysv/linux/lseek.c | 56 ++++++++++++++++++++++ >> sysdeps/unix/sysv/linux/lseek64.c | 54 ++++++++++++++++++++- >> sysdeps/unix/sysv/linux/mips/mips64/llseek.c | 1 - >> sysdeps/unix/sysv/linux/mips/mips64/syscalls.list | 2 - >> sysdeps/unix/sysv/linux/wordsize-64/syscalls.list | 3 -- >> sysdeps/unix/sysv/linux/x86_64/x32/lseek64.S | 1 + >> 13 files changed, 116 insertions(+), 141 deletions(-) >> delete mode 100644 sysdeps/unix/sysv/linux/generic/wordsize-32/llseek.c >> delete mode 100644 sysdeps/unix/sysv/linux/generic/wordsize-32/lseek.c >> delete mode 100644 sysdeps/unix/sysv/linux/llseek.c >> create mode 100644 sysdeps/unix/sysv/linux/lseek.c >> delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/llseek.c >> create mode 100644 sysdeps/unix/sysv/linux/x86_64/x32/lseek64.S >> >> diff --git a/nptl/Makefile b/nptl/Makefile >> index e9485df..ee828fe 100644 >> --- a/nptl/Makefile >> +++ b/nptl/Makefile >> @@ -38,7 +38,7 @@ shared-only-routines = forward >> pthread-compat-wrappers = \ >> write read close fcntl accept \ >> connect recv recvfrom send \ >> - sendto fsync lseek llseek \ >> + sendto fsync lseek lseek64 \ >> msync nanosleep open open64 pause \ >> pread pread64 pwrite pwrite64 \ >> tcdrain wait waitpid msgrcv msgsnd \ >> diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile >> index 9a0423e..16a61cb 100644 >> --- a/sysdeps/unix/sysv/linux/Makefile >> +++ b/sysdeps/unix/sysv/linux/Makefile >> @@ -14,7 +14,7 @@ endif >> ifeq ($(subdir),misc) >> include $(firstword $(wildcard $(sysdirs:=/sysctl.mk))) >> >> -sysdep_routines += clone llseek umount umount2 readahead \ >> +sysdep_routines += clone umount umount2 readahead \ >> setfsuid setfsgid epoll_pwait signalfd \ >> eventfd eventfd_read eventfd_write prlimit \ >> personality >> diff --git a/sysdeps/unix/sysv/linux/alpha/Makefile b/sysdeps/unix/sysv/linux/alpha/Makefile >> index 1e858ce..45941b0 100644 >> --- a/sysdeps/unix/sysv/linux/alpha/Makefile >> +++ b/sysdeps/unix/sysv/linux/alpha/Makefile >> @@ -10,7 +10,7 @@ ifeq ($(subdir),misc) >> sysdep_headers += alpha/ptrace.h alpha/regdef.h sys/io.h >> >> sysdep_routines += ieee_get_fp_control ieee_set_fp_control \ >> - ioperm llseek >> + ioperm >> >> # Support old timeval32 entry points >> sysdep_routines += osf_select osf_gettimeofday osf_settimeofday \ >> diff --git a/sysdeps/unix/sysv/linux/generic/sysdep.h b/sysdeps/unix/sysv/linux/generic/sysdep.h >> index b0422ff..6d379cc 100644 >> --- a/sysdeps/unix/sysv/linux/generic/sysdep.h >> +++ b/sysdeps/unix/sysv/linux/generic/sysdep.h >> @@ -22,7 +22,9 @@ >> #include >> >> /* Provide the common name to allow more code reuse. */ >> -#define __NR__llseek __NR_llseek >> +#ifdef __NR_llseek >> +# define __NR__llseek __NR_llseek >> +#endif >> >> #if __WORDSIZE == 64 >> /* By defining the older names, glibc will build syscall wrappers for >> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/llseek.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/llseek.c >> deleted file mode 100644 >> index 458964c..0000000 >> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/llseek.c >> +++ /dev/null >> @@ -1,46 +0,0 @@ >> -/* Copyright (C) 2011-2016 Free Software Foundation, Inc. >> - This file is part of the GNU C Library. >> - Contributed by Chris Metcalf , 2011. >> - >> - 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 >> - . */ >> - >> -#include >> -#include >> - >> -#include >> -#include >> - >> -/* Seek to OFFSET on FD, starting from WHENCE. */ >> -extern loff_t __llseek (int fd, loff_t offset, int whence); >> - >> -loff_t >> -__llseek (int fd, loff_t offset, int whence) >> -{ >> - loff_t retval; >> - >> - return (loff_t) (INLINE_SYSCALL (_llseek, 5, fd, (off_t) (offset >> 32), >> - (off_t) (offset & 0xffffffff), >> - &retval, whence) ?: retval); >> -} >> -weak_alias (__llseek, llseek) >> -strong_alias (__llseek, __libc_lseek64) >> -strong_alias (__llseek, __lseek64) >> -weak_alias (__llseek, lseek64) >> - >> -/* llseek doesn't have a prototype. Since the second parameter is a >> - 64bit type, this results in wrong behaviour if no prototype is >> - provided. */ >> -link_warning (llseek, "\ >> -the `llseek' function may be dangerous; use `lseek64' instead.") >> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/lseek.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/lseek.c >> deleted file mode 100644 >> index dbf0b26..0000000 >> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/lseek.c >> +++ /dev/null >> @@ -1,38 +0,0 @@ >> -/* Copyright (C) 2011-2016 Free Software Foundation, Inc. >> - This file is part of the GNU C Library. >> - Contributed by Chris Metcalf , 2011. >> - >> - 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 >> - . */ >> - >> -#include >> -#include >> -#include >> - >> -#include >> -#include >> - >> -#include "overflow.h" >> - >> -off_t >> -__lseek (int fd, off_t offset, int whence) >> -{ >> - loff_t res; >> - int rc = INLINE_SYSCALL (_llseek, 5, fd, (off_t) (offset >> 31), >> - (off_t) offset, &res, whence); >> - return rc ?: lseek_overflow (res); >> -} >> -libc_hidden_def (__lseek) >> -weak_alias (__lseek, lseek) >> -strong_alias (__lseek, __libc_lseek) >> diff --git a/sysdeps/unix/sysv/linux/llseek.c b/sysdeps/unix/sysv/linux/llseek.c >> deleted file mode 100644 >> index b6f3ea5..0000000 >> --- a/sysdeps/unix/sysv/linux/llseek.c >> +++ /dev/null >> @@ -1,46 +0,0 @@ >> -/* Long-long seek operation. >> - Copyright (C) 1996-2016 Free Software Foundation, Inc. >> - This file is part of the GNU C Library. >> - >> - 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 >> - . */ >> - >> -#include >> -#include >> - >> -#include >> -#include >> - >> -/* Seek to OFFSET on FD, starting from WHENCE. */ >> -extern loff_t __llseek (int fd, loff_t offset, int whence); >> - >> -loff_t >> -__llseek (int fd, loff_t offset, int whence) >> -{ >> - loff_t retval; >> - >> - return (loff_t) (INLINE_SYSCALL (_llseek, 5, fd, (off_t) (offset >> 32), >> - (off_t) (offset & 0xffffffff), >> - &retval, whence) ?: retval); >> -} >> -weak_alias (__llseek, llseek) >> -strong_alias (__llseek, __libc_lseek64) >> -strong_alias (__llseek, __lseek64) >> -weak_alias (__llseek, lseek64) >> - >> -/* llseek doesn't have a prototype. Since the second parameter is a >> - 64bit type, this results in wrong behaviour if no prototype is >> - provided. */ >> -link_warning (llseek, "\ >> -the `llseek' function may be dangerous; use `lseek64' instead.") >> diff --git a/sysdeps/unix/sysv/linux/lseek.c b/sysdeps/unix/sysv/linux/lseek.c >> new file mode 100644 >> index 0000000..568df01 >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/lseek.c >> @@ -0,0 +1,56 @@ >> +/* Copyright (C) 2016 Free Software Foundation, Inc. >> + This file is part of the GNU C Library. >> + >> + 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 >> + . */ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +#ifndef __OFF_T_MATCHES_OFF64_T >> + >> +/* Test for overflows of structures where we ask the kernel to fill them >> + in with standard 64-bit syscalls but return them through APIs that >> + only expose the low 32 bits of some fields. */ >> + >> +static inline off_t lseek_overflow (loff_t res) >> +{ >> + off_t retval = (off_t) res; >> + if (retval == res) >> + return retval; >> + >> + __set_errno (EOVERFLOW); >> + return (off_t) -1; >> +} >> + >> +off_t >> +__lseek (int fd, off_t offset, int whence) >> +{ >> +# ifdef __NR__llseek >> + loff_t res; >> + int rc = INLINE_SYSCALL_CALL (_llseek, fd, >> + (long) (((uint64_t) (offset)) >> 32), >> + (long) offset, &res, whence); >> + return rc ?: lseek_overflow (res); >> +# else >> + return INLINE_SYSCALL_CALL (lseek, fd, offset, whence); >> +# endif >> +} >> +libc_hidden_def (__lseek) >> +weak_alias (__lseek, lseek) >> +strong_alias (__lseek, __libc_lseek) >> +#endif /* __OFF_T_MATCHES_OFF64_T */ >> diff --git a/sysdeps/unix/sysv/linux/lseek64.c b/sysdeps/unix/sysv/linux/lseek64.c >> index d81e98f..7e1ff23 100644 >> --- a/sysdeps/unix/sysv/linux/lseek64.c >> +++ b/sysdeps/unix/sysv/linux/lseek64.c >> @@ -1 +1,53 @@ >> -/* We don't need a definition since the llseek function is what we need. */ >> +/* Copyright (C) 2016 Free Software Foundation, Inc. >> + This file is part of the GNU C Library. >> + >> + 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 >> + . */ >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +off64_t >> +__lseek64 (int fd, off64_t offset, int whence) >> +{ >> +#ifdef __NR__llseek >> + loff_t res; >> + int rc = INLINE_SYSCALL_CALL (_llseek, fd, >> + (long) (((uint64_t) (offset)) >> 32), >> + (long) offset, &res, whence); >> + return rc ?: res; >> +#else >> + return INLINE_SYSCALL_CALL (lseek, fd, offset, whence); >> +#endif >> +} >> + >> +#ifdef __OFF_T_MATCHES_OFF64_T >> +weak_alias (__lseek64, lseek) >> +weak_alias (__lseek64, __lseek) >> +strong_alias (__lseek64, __libc_lseek) >> +libc_hidden_def (__lseek) >> +#endif >> + >> +strong_alias (__lseek64, __libc_lseek64) >> +weak_alias (__lseek64, lseek64) >> + >> +/* llseek doesn't have a prototype. Since the second parameter is a >> + 64bit type, this results in wrong behaviour if no prototype is >> + provided. */ >> +weak_alias (__lseek64, llseek) >> +link_warning (llseek, "\ >> +the `llseek' function may be dangerous; use `lseek64' instead.") >> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/llseek.c b/sysdeps/unix/sysv/linux/mips/mips64/llseek.c >> deleted file mode 100644 >> index 24013a8..0000000 >> --- a/sysdeps/unix/sysv/linux/mips/mips64/llseek.c >> +++ /dev/null >> @@ -1 +0,0 @@ >> -/* lseek() is 64-bit capable already. */ >> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/syscalls.list b/sysdeps/unix/sysv/linux/mips/mips64/syscalls.list >> index 66cc687..d2d851e 100644 >> --- a/sysdeps/unix/sysv/linux/mips/mips64/syscalls.list >> +++ b/sysdeps/unix/sysv/linux/mips/mips64/syscalls.list >> @@ -1,7 +1,5 @@ >> # File name Caller Syscall name Args Strong name Weak names >> >> -lseek - lseek i:iii __libc_lseek __lseek lseek __llseek llseek __libc_lseek64 __lseek64 lseek64 >> - >> ftruncate - ftruncate i:ii __ftruncate ftruncate ftruncate64 __ftruncate64 >> truncate - truncate i:si truncate truncate64 >> >> diff --git a/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list b/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list >> index 2eb9419..3f3569f 100644 >> --- a/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list >> +++ b/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list >> @@ -1,8 +1,5 @@ >> # File name Caller Syscall name # args Strong name Weak names >> >> -# Whee! 64-bit systems naturally implement llseek. >> -llseek EXTRA lseek i:iii __libc_lseek __lseek lseek __libc_lseek64 __llseek llseek __lseek64 lseek64 >> -lseek llseek - >> fstatfs - fstatfs i:ip __fstatfs fstatfs fstatfs64 __fstatfs64 >> statfs - statfs i:sp __statfs statfs statfs64 >> mmap - mmap b:aniiii __mmap mmap __mmap64 mmap64 >> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/lseek64.S b/sysdeps/unix/sysv/linux/x86_64/x32/lseek64.S >> new file mode 100644 >> index 0000000..d81e98f >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/lseek64.S >> @@ -0,0 +1 @@ >> +/* We don't need a definition since the llseek function is what we need. */ >>