diff mbox

[3/4] Consolidate pread/pread64 implementations

Message ID 1447855356-4140-4-git-send-email-adhemerval.zanella@linaro.org
State New
Headers show

Commit Message

Adhemerval Zanella Nov. 18, 2015, 2:02 p.m. UTC
From: Adhemerval Zanella <adhemerval.zanella@linaro.com>

This patch consolidates all the pread/pread64 implementation for Linux
in only one (sysdeps/unix/sysv/linux/pread.c).  It also removes the
syscall from the auto-generation using assembly macros.

For pread{64} offset argument placement the new SYSCALL_LL{64} macro
is used.  For pread ports that do not define __NR_pread will use
__NR_pread64 and for pread64 ports that dot define __NR_pread64 will
use __NR_pread for the syscall.

Checked on x86_64, x32, i386, aarch64, and ppc64le.

	* sysdeps/unix/sysv/linux/arm/pread.c: Remove file.
	* sysdeps/unix/sysv/linux/arm/pread64.c: Likewise.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c: Likewise.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c: Likewise.
	* sysdeps/unix/sysv/linux/mips/pread.c: Likewise.
	* sysdeps/unix/sysv/linux/mips/pread64.c: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c: Likewise,
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c: Likewise.
	* sysdeps/unix/sysv/linux/sh/pread.c: Likewise.
	* sysdeps/unix/sysv/linux/sh/pread64.c: Likewise.
	* sysdeps/unix/sysv/linux/wordsize-64/pread64.c: Likewise.
	* sysdeps/unix/sysv/linux/wordsize-64/syscalls.list (pread): Remove
	syscall generation.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h
	[__NR_pread64] (__NR_pread): Remove define.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h:
	[__NR_pread64] (__NR_pread): Likewise.
	* sysdeps/unix/sysv/linux/pread.c [__NR_pread64] (__NR_pread): Remove
	define.
	(__libc_pread): Use SYSCALL_LL macro on offset argument.
	* sysdeps/unix/sysv/linux/pread64.c [__NR_pread64] (__NR_pread):
	Remove define.
	(__libc_pread64): Use SYSCALL_LL64 macro on offset argument.
---
 sysdeps/unix/sysv/linux/arm/pread.c                | 36 ---------------
 sysdeps/unix/sysv/linux/arm/pread64.c              | 37 ---------------
 .../unix/sysv/linux/generic/wordsize-32/pread.c    | 37 ---------------
 .../unix/sysv/linux/generic/wordsize-32/pread64.c  | 34 --------------
 sysdeps/unix/sysv/linux/mips/pread.c               | 54 ----------------------
 sysdeps/unix/sysv/linux/mips/pread64.c             | 50 --------------------
 sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c  | 34 --------------
 .../unix/sysv/linux/powerpc/powerpc32/pread64.c    | 35 --------------
 sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h |  7 ---
 sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h |  7 ---
 sysdeps/unix/sysv/linux/pread.c                    | 20 ++------
 sysdeps/unix/sysv/linux/pread64.c                  | 17 ++-----
 sysdeps/unix/sysv/linux/sh/pread.c                 | 43 -----------------
 sysdeps/unix/sysv/linux/sh/pread64.c               | 43 -----------------
 sysdeps/unix/sysv/linux/wordsize-64/pread64.c      |  1 -
 sysdeps/unix/sysv/linux/wordsize-64/syscalls.list  |  1 -
 17 files changed, 31 insertions(+), 449 deletions(-)
 delete mode 100644 sysdeps/unix/sysv/linux/arm/pread.c
 delete mode 100644 sysdeps/unix/sysv/linux/arm/pread64.c
 delete mode 100644 sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c
 delete mode 100644 sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c
 delete mode 100644 sysdeps/unix/sysv/linux/mips/pread.c
 delete mode 100644 sysdeps/unix/sysv/linux/mips/pread64.c
 delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c
 delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c
 delete mode 100644 sysdeps/unix/sysv/linux/sh/pread.c
 delete mode 100644 sysdeps/unix/sysv/linux/sh/pread64.c
 delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/pread64.c

Comments

Mike Frysinger Dec. 29, 2015, 5:28 p.m. UTC | #1
On 18 Nov 2015 12:02, Adhemerval Zanella wrote:
> This patch consolidates all the pread/pread64 implementation for Linux
> in only one (sysdeps/unix/sysv/linux/pread.c).  It also removes the
> syscall from the auto-generation using assembly macros.
> 
> For pread{64} offset argument placement the new SYSCALL_LL{64} macro
> is used.  For pread ports that do not define __NR_pread will use
> __NR_pread64 and for pread64 ports that dot define __NR_pread64 will
> use __NR_pread for the syscall.

pretty sure you just broke sh here.  while it doesn't have the 64-bit
arg alignment issue, it has a wart where it copied the kernel interface
of one.  you can see it in the files you deleted:

> --- a/sysdeps/unix/sysv/linux/sh/pread.c
> +++ /dev/null
>
> -ssize_t
> -__libc_pread (int fd, void *buf, size_t count, off_t offset)
> -{
> -  return SYSCALL_CANCEL (pread, fd, buf, count, 0,
> -			 __LONG_LONG_PAIR (offset >> 31, offset));
> -}
> --- a/sysdeps/unix/sysv/linux/sh/pread64.c
> +++ /dev/null
>
> -ssize_t
> -__libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
> -{
> -  return SYSCALL_CANCEL (pread, fd, buf, count, 0,
> -			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
> -					   (off_t) (offset & 0xffffffff)));
> -}
-mike
Adhemerval Zanella Jan. 4, 2016, 12:42 p.m. UTC | #2
On 29-12-2015 15:28, Mike Frysinger wrote:
> On 18 Nov 2015 12:02, Adhemerval Zanella wrote:
>> This patch consolidates all the pread/pread64 implementation for Linux
>> in only one (sysdeps/unix/sysv/linux/pread.c).  It also removes the
>> syscall from the auto-generation using assembly macros.
>>
>> For pread{64} offset argument placement the new SYSCALL_LL{64} macro
>> is used.  For pread ports that do not define __NR_pread will use
>> __NR_pread64 and for pread64 ports that dot define __NR_pread64 will
>> use __NR_pread for the syscall.
> 
> pretty sure you just broke sh here.  while it doesn't have the 64-bit
> arg alignment issue, it has a wart where it copied the kernel interface
> of one.  you can see it in the files you deleted:

Indeed, my understanding is SH also requires __ASSUME_ALIGNED_REGISTER_PAIRS.
I will change it for the 1/4 patch part.

> 
>> --- a/sysdeps/unix/sysv/linux/sh/pread.c
>> +++ /dev/null
>>
>> -ssize_t
>> -__libc_pread (int fd, void *buf, size_t count, off_t offset)
>> -{
>> -  return SYSCALL_CANCEL (pread, fd, buf, count, 0,
>> -			 __LONG_LONG_PAIR (offset >> 31, offset));
>> -}
>> --- a/sysdeps/unix/sysv/linux/sh/pread64.c
>> +++ /dev/null
>>
>> -ssize_t
>> -__libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
>> -{
>> -  return SYSCALL_CANCEL (pread, fd, buf, count, 0,
>> -			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
>> -					   (off_t) (offset & 0xffffffff)));
>> -}
> -mike
>
Mike Frysinger Jan. 5, 2016, 12:53 a.m. UTC | #3
On 04 Jan 2016 10:42, Adhemerval Zanella wrote:
> On 29-12-2015 15:28, Mike Frysinger wrote:
> > On 18 Nov 2015 12:02, Adhemerval Zanella wrote:
> >> This patch consolidates all the pread/pread64 implementation for Linux
> >> in only one (sysdeps/unix/sysv/linux/pread.c).  It also removes the
> >> syscall from the auto-generation using assembly macros.
> >>
> >> For pread{64} offset argument placement the new SYSCALL_LL{64} macro
> >> is used.  For pread ports that do not define __NR_pread will use
> >> __NR_pread64 and for pread64 ports that dot define __NR_pread64 will
> >> use __NR_pread for the syscall.
> > 
> > pretty sure you just broke sh here.  while it doesn't have the 64-bit
> > arg alignment issue, it has a wart where it copied the kernel interface
> > of one.  you can see it in the files you deleted:
> 
> Indeed, my understanding is SH also requires __ASSUME_ALIGNED_REGISTER_PAIRS.
> I will change it for the 1/4 patch part.

just to be clear, SuperH (the ABI) does not have these 64-bit register
pair requirements like ARM/EABI.  its syscall ABI for pread64/pwrite64
has legacy cruft where there's a dummy reg before the 64-bit value.  so
you can (and want) to use the same logic just for these two syscalls as
the result happens to look the same.
-mike
Adhemerval Zanella Jan. 5, 2016, 12:49 p.m. UTC | #4
On 04-01-2016 22:53, Mike Frysinger wrote:
> On 04 Jan 2016 10:42, Adhemerval Zanella wrote:
>> On 29-12-2015 15:28, Mike Frysinger wrote:
>>> On 18 Nov 2015 12:02, Adhemerval Zanella wrote:
>>>> This patch consolidates all the pread/pread64 implementation for Linux
>>>> in only one (sysdeps/unix/sysv/linux/pread.c).  It also removes the
>>>> syscall from the auto-generation using assembly macros.
>>>>
>>>> For pread{64} offset argument placement the new SYSCALL_LL{64} macro
>>>> is used.  For pread ports that do not define __NR_pread will use
>>>> __NR_pread64 and for pread64 ports that dot define __NR_pread64 will
>>>> use __NR_pread for the syscall.
>>>
>>> pretty sure you just broke sh here.  while it doesn't have the 64-bit
>>> arg alignment issue, it has a wart where it copied the kernel interface
>>> of one.  you can see it in the files you deleted:
>>
>> Indeed, my understanding is SH also requires __ASSUME_ALIGNED_REGISTER_PAIRS.
>> I will change it for the 1/4 patch part.
> 
> just to be clear, SuperH (the ABI) does not have these 64-bit register
> pair requirements like ARM/EABI.  its syscall ABI for pread64/pwrite64
> has legacy cruft where there's a dummy reg before the 64-bit value.  so
> you can (and want) to use the same logic just for these two syscalls as
> the result happens to look the same.
> -mike
> 

Right, so for SuperH kernel interface the 64-bit pair cruft is only for
pread64/pwrite64 or is it for all 64-bits arguments?
Mike Frysinger Jan. 5, 2016, 7:11 p.m. UTC | #5
On 05 Jan 2016 10:49, Adhemerval Zanella wrote:
> On 04-01-2016 22:53, Mike Frysinger wrote:
> > On 04 Jan 2016 10:42, Adhemerval Zanella wrote:
> >> On 29-12-2015 15:28, Mike Frysinger wrote:
> >>> On 18 Nov 2015 12:02, Adhemerval Zanella wrote:
> >>>> This patch consolidates all the pread/pread64 implementation for Linux
> >>>> in only one (sysdeps/unix/sysv/linux/pread.c).  It also removes the
> >>>> syscall from the auto-generation using assembly macros.
> >>>>
> >>>> For pread{64} offset argument placement the new SYSCALL_LL{64} macro
> >>>> is used.  For pread ports that do not define __NR_pread will use
> >>>> __NR_pread64 and for pread64 ports that dot define __NR_pread64 will
> >>>> use __NR_pread for the syscall.
> >>>
> >>> pretty sure you just broke sh here.  while it doesn't have the 64-bit
> >>> arg alignment issue, it has a wart where it copied the kernel interface
> >>> of one.  you can see it in the files you deleted:
> >>
> >> Indeed, my understanding is SH also requires __ASSUME_ALIGNED_REGISTER_PAIRS.
> >> I will change it for the 1/4 patch part.
> > 
> > just to be clear, SuperH (the ABI) does not have these 64-bit register
> > pair requirements like ARM/EABI.  its syscall ABI for pread64/pwrite64
> > has legacy cruft where there's a dummy reg before the 64-bit value.  so
> > you can (and want) to use the same logic just for these two syscalls as
> > the result happens to look the same.
> 
> Right, so for SuperH kernel interface the 64-bit pair cruft is only for
> pread64/pwrite64 or is it for all 64-bits arguments?

just pread64/pwrite64:
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/sh/kernel/sys_sh32.c?h=v4.3
-mike
Adhemerval Zanella Jan. 5, 2016, 7:18 p.m. UTC | #6
On 05-01-2016 17:11, Mike Frysinger wrote:
> On 05 Jan 2016 10:49, Adhemerval Zanella wrote:
>> On 04-01-2016 22:53, Mike Frysinger wrote:
>>> On 04 Jan 2016 10:42, Adhemerval Zanella wrote:
>>>> On 29-12-2015 15:28, Mike Frysinger wrote:
>>>>> On 18 Nov 2015 12:02, Adhemerval Zanella wrote:
>>>>>> This patch consolidates all the pread/pread64 implementation for Linux
>>>>>> in only one (sysdeps/unix/sysv/linux/pread.c).  It also removes the
>>>>>> syscall from the auto-generation using assembly macros.
>>>>>>
>>>>>> For pread{64} offset argument placement the new SYSCALL_LL{64} macro
>>>>>> is used.  For pread ports that do not define __NR_pread will use
>>>>>> __NR_pread64 and for pread64 ports that dot define __NR_pread64 will
>>>>>> use __NR_pread for the syscall.
>>>>>
>>>>> pretty sure you just broke sh here.  while it doesn't have the 64-bit
>>>>> arg alignment issue, it has a wart where it copied the kernel interface
>>>>> of one.  you can see it in the files you deleted:
>>>>
>>>> Indeed, my understanding is SH also requires __ASSUME_ALIGNED_REGISTER_PAIRS.
>>>> I will change it for the 1/4 patch part.
>>>
>>> just to be clear, SuperH (the ABI) does not have these 64-bit register
>>> pair requirements like ARM/EABI.  its syscall ABI for pread64/pwrite64
>>> has legacy cruft where there's a dummy reg before the 64-bit value.  so
>>> you can (and want) to use the same logic just for these two syscalls as
>>> the result happens to look the same.
>>
>> Right, so for SuperH kernel interface the 64-bit pair cruft is only for
>> pread64/pwrite64 or is it for all 64-bits arguments?
> 
> just pread64/pwrite64:
> https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/sh/kernel/sys_sh32.c?h=v4.3
> -mike
> 

sigh... so __ASSUME_ALIGNED_REGISTER_PAIRS is not the way to go on SH. I 
would prefer to avoid this, but since kernel interface is what it is I
think for SH it would be better to provide specific implementations.
Adhemerval Zanella Jan. 5, 2016, 7:19 p.m. UTC | #7
On 05-01-2016 17:11, Mike Frysinger wrote:
> On 05 Jan 2016 10:49, Adhemerval Zanella wrote:
>> On 04-01-2016 22:53, Mike Frysinger wrote:
>>> On 04 Jan 2016 10:42, Adhemerval Zanella wrote:
>>>> On 29-12-2015 15:28, Mike Frysinger wrote:
>>>>> On 18 Nov 2015 12:02, Adhemerval Zanella wrote:
>>>>>> This patch consolidates all the pread/pread64 implementation for Linux
>>>>>> in only one (sysdeps/unix/sysv/linux/pread.c).  It also removes the
>>>>>> syscall from the auto-generation using assembly macros.
>>>>>>
>>>>>> For pread{64} offset argument placement the new SYSCALL_LL{64} macro
>>>>>> is used.  For pread ports that do not define __NR_pread will use
>>>>>> __NR_pread64 and for pread64 ports that dot define __NR_pread64 will
>>>>>> use __NR_pread for the syscall.
>>>>>
>>>>> pretty sure you just broke sh here.  while it doesn't have the 64-bit
>>>>> arg alignment issue, it has a wart where it copied the kernel interface
>>>>> of one.  you can see it in the files you deleted:
>>>>
>>>> Indeed, my understanding is SH also requires __ASSUME_ALIGNED_REGISTER_PAIRS.
>>>> I will change it for the 1/4 patch part.
>>>
>>> just to be clear, SuperH (the ABI) does not have these 64-bit register
>>> pair requirements like ARM/EABI.  its syscall ABI for pread64/pwrite64
>>> has legacy cruft where there's a dummy reg before the 64-bit value.  so
>>> you can (and want) to use the same logic just for these two syscalls as
>>> the result happens to look the same.
>>
>> Right, so for SuperH kernel interface the 64-bit pair cruft is only for
>> pread64/pwrite64 or is it for all 64-bits arguments?
> 
> just pread64/pwrite64:
> https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/sh/kernel/sys_sh32.c?h=v4.3
> -mike
> 

sigh... so __ASSUME_ALIGNED_REGISTER_PAIRS is not the way to go on SH. I 
would prefer to avoid this, but since kernel interface is what it is I
think for SH it would be better to provide specific implementations.
I will change that, thanks for the information.
Mike Frysinger Jan. 5, 2016, 7:39 p.m. UTC | #8
On 05 Jan 2016 17:19, Adhemerval Zanella wrote:
> On 05-01-2016 17:11, Mike Frysinger wrote:
> > On 05 Jan 2016 10:49, Adhemerval Zanella wrote:
> >> On 04-01-2016 22:53, Mike Frysinger wrote:
> >>> On 04 Jan 2016 10:42, Adhemerval Zanella wrote:
> >>>> On 29-12-2015 15:28, Mike Frysinger wrote:
> >>>>> On 18 Nov 2015 12:02, Adhemerval Zanella wrote:
> >>>>>> This patch consolidates all the pread/pread64 implementation for Linux
> >>>>>> in only one (sysdeps/unix/sysv/linux/pread.c).  It also removes the
> >>>>>> syscall from the auto-generation using assembly macros.
> >>>>>>
> >>>>>> For pread{64} offset argument placement the new SYSCALL_LL{64} macro
> >>>>>> is used.  For pread ports that do not define __NR_pread will use
> >>>>>> __NR_pread64 and for pread64 ports that dot define __NR_pread64 will
> >>>>>> use __NR_pread for the syscall.
> >>>>>
> >>>>> pretty sure you just broke sh here.  while it doesn't have the 64-bit
> >>>>> arg alignment issue, it has a wart where it copied the kernel interface
> >>>>> of one.  you can see it in the files you deleted:
> >>>>
> >>>> Indeed, my understanding is SH also requires __ASSUME_ALIGNED_REGISTER_PAIRS.
> >>>> I will change it for the 1/4 patch part.
> >>>
> >>> just to be clear, SuperH (the ABI) does not have these 64-bit register
> >>> pair requirements like ARM/EABI.  its syscall ABI for pread64/pwrite64
> >>> has legacy cruft where there's a dummy reg before the 64-bit value.  so
> >>> you can (and want) to use the same logic just for these two syscalls as
> >>> the result happens to look the same.
> >>
> >> Right, so for SuperH kernel interface the 64-bit pair cruft is only for
> >> pread64/pwrite64 or is it for all 64-bits arguments?
> > 
> > just pread64/pwrite64:
> > https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/sh/kernel/sys_sh32.c?h=v4.3
> 
> sigh... so __ASSUME_ALIGNED_REGISTER_PAIRS is not the way to go on SH. I 
> would prefer to avoid this, but since kernel interface is what it is I
> think for SH it would be better to provide specific implementations.
> I will change that, thanks for the information.

i think your patches are the right way to go.  what we did in uClibc was
add a sh-specific pread/write file that had a comment and then defined
__ASSUME_ALIGNED_REGISTER_PAIRS before including the common one.
-mike
Adhemerval Zanella Jan. 5, 2016, 7:51 p.m. UTC | #9
On 05-01-2016 17:39, Mike Frysinger wrote:
> On 05 Jan 2016 17:19, Adhemerval Zanella wrote:
>> On 05-01-2016 17:11, Mike Frysinger wrote:
>>> On 05 Jan 2016 10:49, Adhemerval Zanella wrote:
>>>> On 04-01-2016 22:53, Mike Frysinger wrote:
>>>>> On 04 Jan 2016 10:42, Adhemerval Zanella wrote:
>>>>>> On 29-12-2015 15:28, Mike Frysinger wrote:
>>>>>>> On 18 Nov 2015 12:02, Adhemerval Zanella wrote:
>>>>>>>> This patch consolidates all the pread/pread64 implementation for Linux
>>>>>>>> in only one (sysdeps/unix/sysv/linux/pread.c).  It also removes the
>>>>>>>> syscall from the auto-generation using assembly macros.
>>>>>>>>
>>>>>>>> For pread{64} offset argument placement the new SYSCALL_LL{64} macro
>>>>>>>> is used.  For pread ports that do not define __NR_pread will use
>>>>>>>> __NR_pread64 and for pread64 ports that dot define __NR_pread64 will
>>>>>>>> use __NR_pread for the syscall.
>>>>>>>
>>>>>>> pretty sure you just broke sh here.  while it doesn't have the 64-bit
>>>>>>> arg alignment issue, it has a wart where it copied the kernel interface
>>>>>>> of one.  you can see it in the files you deleted:
>>>>>>
>>>>>> Indeed, my understanding is SH also requires __ASSUME_ALIGNED_REGISTER_PAIRS.
>>>>>> I will change it for the 1/4 patch part.
>>>>>
>>>>> just to be clear, SuperH (the ABI) does not have these 64-bit register
>>>>> pair requirements like ARM/EABI.  its syscall ABI for pread64/pwrite64
>>>>> has legacy cruft where there's a dummy reg before the 64-bit value.  so
>>>>> you can (and want) to use the same logic just for these two syscalls as
>>>>> the result happens to look the same.
>>>>
>>>> Right, so for SuperH kernel interface the 64-bit pair cruft is only for
>>>> pread64/pwrite64 or is it for all 64-bits arguments?
>>>
>>> just pread64/pwrite64:
>>> https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/sh/kernel/sys_sh32.c?h=v4.3
>>
>> sigh... so __ASSUME_ALIGNED_REGISTER_PAIRS is not the way to go on SH. I 
>> would prefer to avoid this, but since kernel interface is what it is I
>> think for SH it would be better to provide specific implementations.
>> I will change that, thanks for the information.
> 
> i think your patches are the right way to go.  what we did in uClibc was
> add a sh-specific pread/write file that had a comment and then defined
> __ASSUME_ALIGNED_REGISTER_PAIRS before including the common one.
> -mike
> 
That is exactly what I just did.
diff mbox

Patch

diff --git a/sysdeps/unix/sysv/linux/arm/pread.c b/sysdeps/unix/sysv/linux/arm/pread.c
deleted file mode 100644
index 91b3c66..0000000
--- a/sysdeps/unix/sysv/linux/arm/pread.c
+++ /dev/null
@@ -1,36 +0,0 @@ 
-/* Copyright (C) 1997-2015 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   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/>.  */
-
-#include <errno.h>
-#include <endian.h>
-#include <unistd.h>
-
-#include <sysdep-cancel.h>
-#include <sys/syscall.h>
-
-ssize_t
-__libc_pread (int fd, void *buf, size_t count, off_t offset)
-{
-  /* In the ARM EABI, 64-bit values are aligned to even/odd register
-     pairs for syscalls.  */
-  return SYSCALL_CANCEL (pread64, fd, buf, count, 0,
-			 __LONG_LONG_PAIR (offset >> 31, offset));
-}
-
-strong_alias (__libc_pread, __pread)
-weak_alias (__libc_pread, pread)
diff --git a/sysdeps/unix/sysv/linux/arm/pread64.c b/sysdeps/unix/sysv/linux/arm/pread64.c
deleted file mode 100644
index ca71feb..0000000
--- a/sysdeps/unix/sysv/linux/arm/pread64.c
+++ /dev/null
@@ -1,37 +0,0 @@ 
-/* Copyright (C) 1997-2015 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   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/>.  */
-
-#include <errno.h>
-#include <endian.h>
-#include <unistd.h>
-
-#include <sysdep-cancel.h>
-#include <sys/syscall.h>
-
-ssize_t
-__libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
-{
-  /* In the ARM EABI, 64-bit values are aligned to even/odd register
-     pairs for syscalls.  */
-  return SYSCALL_CANCEL (pread64, fd, buf, count, 0,
-			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
-					   (off_t) (offset & 0xffffffff)));
-}
-
-weak_alias (__libc_pread64, __pread64)
-weak_alias (__libc_pread64, pread64)
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c
deleted file mode 100644
index 6f9703c..0000000
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c
+++ /dev/null
@@ -1,37 +0,0 @@ 
-/* Copyright (C) 2011-2015 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
-   Based on work contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   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/>.  */
-
-#include <assert.h>
-#include <errno.h>
-#include <endian.h>
-#include <unistd.h>
-
-#include <sysdep-cancel.h>
-#include <sys/syscall.h>
-
-ssize_t
-__libc_pread (int fd, void *buf, size_t count, off_t offset)
-{
-  assert (sizeof (offset) == 4);
-  return SYSCALL_CANCEL (pread64, fd,
-                         buf, count, __ALIGNMENT_ARG
-                         __LONG_LONG_PAIR (offset >> 31, offset));
-}
-strong_alias (__libc_pread, __pread)
-weak_alias (__libc_pread, pread)
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c
deleted file mode 100644
index a3f8ec1..0000000
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c
+++ /dev/null
@@ -1,34 +0,0 @@ 
-/* Copyright (C) 2011-2015 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
-   Based on work contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   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/>.  */
-
-#include <errno.h>
-#include <endian.h>
-#include <unistd.h>
-
-#include <sysdep-cancel.h>
-#include <sys/syscall.h>
-
-ssize_t
-__libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
-{
-  return SYSCALL_CANCEL (pread64, fd, buf, count, __ALIGNMENT_ARG
-                         __LONG_LONG_PAIR ((off_t) (offset >> 32),
-                                           (off_t) (offset & 0xffffffff)));
-}
-weak_alias (__libc_pread64, __pread64) weak_alias (__libc_pread64, pread64)
diff --git a/sysdeps/unix/sysv/linux/mips/pread.c b/sysdeps/unix/sysv/linux/mips/pread.c
deleted file mode 100644
index 0bd712d..0000000
--- a/sysdeps/unix/sysv/linux/mips/pread.c
+++ /dev/null
@@ -1,54 +0,0 @@ 
-/* Copyright (C) 1997-2015 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   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/>.  */
-
-#include <assert.h>
-#include <errno.h>
-#ifndef NO_SGIDEFS_H
-#include <sgidefs.h>
-#endif
-#include <unistd.h>
-#include <endian.h>
-
-#include <sysdep-cancel.h>
-#include <sys/syscall.h>
-
-#ifdef __NR_pread64             /* Newer kernels renamed but it's the same.  */
-# ifdef __NR_pread
-#  error "__NR_pread and __NR_pread64 both defined???"
-# endif
-# define __NR_pread __NR_pread64
-#endif
-
-
-ssize_t
-__libc_pread (int fd, void *buf, size_t count, off_t offset)
-{
-#if _MIPS_SIM != _ABI64
-  assert (sizeof (offset) == 4);
-#endif
-
-#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
-  return SYSCALL_CANCEL (pread, fd, buf, count, offset);
-#else
-  return SYSCALL_CANCEL (pread, fd, buf, count, 0,
-			 __LONG_LONG_PAIR (offset >> 31, offset));
-#endif
-}
-
-strong_alias (__libc_pread, __pread)
-weak_alias (__libc_pread, pread)
diff --git a/sysdeps/unix/sysv/linux/mips/pread64.c b/sysdeps/unix/sysv/linux/mips/pread64.c
deleted file mode 100644
index 3ed100b..0000000
--- a/sysdeps/unix/sysv/linux/mips/pread64.c
+++ /dev/null
@@ -1,50 +0,0 @@ 
-/* Copyright (C) 1997-2015 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   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/>.  */
-
-#include <errno.h>
-#ifndef NO_SGIDEFS_H
-#include <sgidefs.h>
-#endif
-#include <unistd.h>
-#include <endian.h>
-
-#include <sysdep-cancel.h>
-#include <sys/syscall.h>
-
-#ifdef __NR_pread64             /* Newer kernels renamed but it's the same.  */
-# ifdef __NR_pread
-#  error "__NR_pread and __NR_pread64 both defined???"
-# endif
-# define __NR_pread __NR_pread64
-#endif
-
-
-ssize_t
-__libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
-{
-#if _MIPS_SIM == _ABIN32 || _MIPS_SIM == _ABI64
-  return SYSCALL_CANCEL (pread, fd, buf, count, offset);
-#else
-  return SYSCALL_CANCEL (pread, fd, buf, count, 0,
-			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
-					   (off_t) (offset & 0xffffffff)));
-#endif
-}
-
-weak_alias (__libc_pread64, __pread64)
-weak_alias (__libc_pread64, pread64)
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c
deleted file mode 100644
index f6b7f43..0000000
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c
+++ /dev/null
@@ -1,34 +0,0 @@ 
-/* Copyright (C) 1997-2015 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   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/>.  */
-
-#include <assert.h>
-#include <errno.h>
-#include <unistd.h>
-
-#include <sysdep-cancel.h>
-#include <sys/syscall.h>
-
-ssize_t
-__libc_pread (int fd, void *buf, size_t count, off_t offset)
-{
-  /* On PPC32 64bit values are aligned in odd/even register pairs.  */
-  return SYSCALL_CANCEL (pread, fd, buf, count, 0, offset >> 31, offset);
-}
-
-strong_alias (__libc_pread, __pread)
-weak_alias (__libc_pread, pread)
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c
deleted file mode 100644
index 75ee34b..0000000
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c
+++ /dev/null
@@ -1,35 +0,0 @@ 
-/* Copyright (C) 1997-2015 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   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/>.  */
-
-#include <errno.h>
-#include <unistd.h>
-
-#include <sysdep-cancel.h>
-#include <sys/syscall.h>
-
-
-ssize_t
-__libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
-{
-  /* On PPC32 64bit values are aligned in odd/even register pairs.  */
-  return SYSCALL_CANCEL (pread, fd, buf, count, 0, (long) (offset >> 32),
-			 (long) offset);
-}
-
-weak_alias (__libc_pread64, __pread64)
-weak_alias (__libc_pread64, pread64)
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h
index c25f824..910841e 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h
@@ -27,13 +27,6 @@ 
    Handle them here so they can be catched by both C and assembler stubs in
    glibc.  */
 
-#ifdef __NR_pread64
-# ifdef __NR_pread
-#  error "__NR_pread and __NR_pread64 both defined???"
-# endif
-# define __NR_pread __NR_pread64
-#endif
-
 #ifdef __NR_pwrite64
 # ifdef __NR_pwrite
 #  error "__NR_pwrite and __NR_pwrite64 both defined???"
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h
index c4bee54..6299d0d 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h
@@ -34,13 +34,6 @@ 
    Handle them here so they can be catched by both C and assembler stubs in
    glibc.  */
 
-#ifdef __NR_pread64
-# ifdef __NR_pread
-#  error "__NR_pread and __NR_pread64 both defined???"
-# endif
-# define __NR_pread __NR_pread64
-#endif
-
 #ifdef __NR_pwrite64
 # ifdef __NR_pwrite
 #  error "__NR_pwrite and __NR_pwrite64 both defined???"
diff --git a/sysdeps/unix/sysv/linux/pread.c b/sysdeps/unix/sysv/linux/pread.c
index 09389e4..2f86f62 100644
--- a/sysdeps/unix/sysv/linux/pread.c
+++ b/sysdeps/unix/sysv/linux/pread.c
@@ -16,32 +16,18 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <assert.h>
-#include <errno.h>
-#include <endian.h>
 #include <unistd.h>
-
 #include <sysdep-cancel.h>
-#include <sys/syscall.h>
 
-#ifdef __NR_pread64		/* Newer kernels renamed but it's the same.  */
-# ifdef __NR_pread
-#  error "__NR_pread and __NR_pread64 both defined???"
-# endif
+#ifndef __NR_pread
 # define __NR_pread __NR_pread64
 #endif
 
-
 ssize_t
 __libc_pread (int fd, void *buf, size_t count, off_t offset)
 {
-  ssize_t result;
-
-  assert (sizeof (offset) == 4);
-  result = SYSCALL_CANCEL (pread, fd, buf, count,
-			   __LONG_LONG_PAIR (offset >> 31, offset));
-
-  return result;
+  return SYSCALL_CANCEL (pread, fd, buf, count,
+			 __ALIGNMENT_ARG SYSCALL_LL (offset));
 }
 
 strong_alias (__libc_pread, __pread)
diff --git a/sysdeps/unix/sysv/linux/pread64.c b/sysdeps/unix/sysv/linux/pread64.c
index baf2355..d90c40e 100644
--- a/sysdeps/unix/sysv/linux/pread64.c
+++ b/sysdeps/unix/sysv/linux/pread64.c
@@ -16,27 +16,18 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <errno.h>
-#include <endian.h>
 #include <unistd.h>
-
 #include <sysdep-cancel.h>
-#include <sys/syscall.h>
 
-#ifdef __NR_pread64		/* Newer kernels renamed but it's the same.  */
-# ifdef __NR_pread
-#  error "__NR_pread and __NR_pread64 both defined???"
-# endif
-# define __NR_pread __NR_pread64
+#ifndef __NR_pread64
+# define __NR_pread64 __NR_pread
 #endif
 
-
 ssize_t
 __libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
 {
-  return SYSCALL_CANCEL (pread, fd, buf, count,
-			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
-					   (off_t) (offset & 0xffffffff)));
+  return SYSCALL_CANCEL (pread64, fd, buf, count,
+			 __ALIGNMENT_ARG SYSCALL_LL64 (offset));
 }
 
 weak_alias (__libc_pread64, __pread64)
diff --git a/sysdeps/unix/sysv/linux/sh/pread.c b/sysdeps/unix/sysv/linux/sh/pread.c
deleted file mode 100644
index 2f926b3..0000000
--- a/sysdeps/unix/sysv/linux/sh/pread.c
+++ /dev/null
@@ -1,43 +0,0 @@ 
-/* Copyright (C) 1997-2015 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   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/>.  */
-
-#include <assert.h>
-#include <errno.h>
-#include <unistd.h>
-#include <endian.h>
-
-#include <sysdep-cancel.h>
-#include <sys/syscall.h>
-
-#ifdef __NR_pread64             /* Newer kernels renamed but it's the same.  */
-# ifdef __NR_pread
-#  error "__NR_pread and __NR_pread64 both defined???"
-# endif
-# define __NR_pread __NR_pread64
-#endif
-
-
-ssize_t
-__libc_pread (int fd, void *buf, size_t count, off_t offset)
-{
-  return SYSCALL_CANCEL (pread, fd, buf, count, 0,
-			 __LONG_LONG_PAIR (offset >> 31, offset));
-}
-
-strong_alias (__libc_pread, __pread)
-weak_alias (__libc_pread, pread)
diff --git a/sysdeps/unix/sysv/linux/sh/pread64.c b/sysdeps/unix/sysv/linux/sh/pread64.c
deleted file mode 100644
index 697718d..0000000
--- a/sysdeps/unix/sysv/linux/sh/pread64.c
+++ /dev/null
@@ -1,43 +0,0 @@ 
-/* Copyright (C) 1997-2015 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   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/>.  */
-
-#include <errno.h>
-#include <unistd.h>
-#include <endian.h>
-
-#include <sysdep-cancel.h>
-#include <sys/syscall.h>
-
-#ifdef __NR_pread64             /* Newer kernels renamed but it's the same.  */
-# ifdef __NR_pread
-#  error "__NR_pread and __NR_pread64 both defined???"
-# endif
-# define __NR_pread __NR_pread64
-#endif
-
-
-ssize_t
-__libc_pread64 (int fd, void *buf, size_t count, off64_t offset)
-{
-  return SYSCALL_CANCEL (pread, fd, buf, count, 0,
-			 __LONG_LONG_PAIR ((off_t) (offset >> 32),
-					   (off_t) (offset & 0xffffffff)));
-}
-
-weak_alias (__libc_pread64, __pread64)
-weak_alias (__libc_pread64, pread64)
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/pread64.c b/sysdeps/unix/sysv/linux/wordsize-64/pread64.c
deleted file mode 100644
index b7f298d..0000000
--- a/sysdeps/unix/sysv/linux/wordsize-64/pread64.c
+++ /dev/null
@@ -1 +0,0 @@ 
-/* Empty since the pread syscall is equivalent.  */
diff --git a/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list b/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list
index 51ee8d8..79a7006 100644
--- a/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list
+++ b/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list
@@ -3,7 +3,6 @@ 
 # Whee! 64-bit systems naturally implement llseek.
 llseek		EXTRA	lseek		i:iii	__libc_lseek	__lseek lseek __libc_lseek64 __llseek llseek __lseek64 lseek64
 lseek		llseek	-
-pread		-	pread		Ci:ibni	__libc_pread	__libc_pread64 __pread pread __pread64 pread64
 pwrite		-	pwrite		Ci:ibni	__libc_pwrite	__libc_pwrite64 __pwrite pwrite __pwrite64 pwrite64
 fstatfs		-	fstatfs		i:ip	__fstatfs	fstatfs fstatfs64 __fstatfs64
 statfs		-	statfs		i:sp	__statfs	statfs statfs64