diff mbox

[3/4] Consolidate pread/pread64 implementations

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

Commit Message

Adhemerval Zanella Netto Jan. 7, 2016, 5:18 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/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/sh/pread.c: Rewrite using default
	Linux implementation as base.
	* sysdeps/unix/sysv/linux/sh/pread64.c: Likewise.
---
 ChangeLog                                          | 25 ++++++++++
 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                 | 30 ++----------
 sysdeps/unix/sysv/linux/sh/pread64.c               | 30 ++----------
 sysdeps/unix/sysv/linux/wordsize-64/pread64.c      |  1 -
 sysdeps/unix/sysv/linux/wordsize-64/syscalls.list  |  1 -
 17 files changed, 42 insertions(+), 413 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/wordsize-64/pread64.c

Comments

Mike Frysinger Jan. 7, 2016, 7:52 p.m. UTC | #1
On 07 Jan 2016 15:18, Adhemerval Zanella wrote:
> 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.

just to make sure i'm reading this correctly, in the past 64-bit ports
would have a pread symbol and pread64 would be an alias to it.  but with
this patch, 64-bit ports now have two symbols w/identical code ?
-mike
Adhemerval Zanella Netto Jan. 7, 2016, 8:30 p.m. UTC | #2
On 07-01-2016 17:52, Mike Frysinger wrote:
> On 07 Jan 2016 15:18, Adhemerval Zanella wrote:
>> 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.
> 
> just to make sure i'm reading this correctly, in the past 64-bit ports
> would have a pread symbol and pread64 would be an alias to it.  but with
> this patch, 64-bit ports now have two symbols w/identical code ?
> -mike
> 

Indeed it is something I was thinking and I was not sure how to
fix it while not breaking the existing ABI.  Maybe only building
the p{read,write}.c if not WORDSIZE64 is define and creating an
alias on p{read,write}64.c. What do you think?
Mike Frysinger Jan. 7, 2016, 8:54 p.m. UTC | #3
On 07 Jan 2016 18:30, Adhemerval Zanella wrote:
> On 07-01-2016 17:52, Mike Frysinger wrote:
> > On 07 Jan 2016 15:18, Adhemerval Zanella wrote:
> >> 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.
> > 
> > just to make sure i'm reading this correctly, in the past 64-bit ports
> > would have a pread symbol and pread64 would be an alias to it.  but with
> > this patch, 64-bit ports now have two symbols w/identical code ?
> 
> Indeed it is something I was thinking and I was not sure how to
> fix it while not breaking the existing ABI.  Maybe only building
> the p{read,write}.c if not WORDSIZE64 is define and creating an
> alias on p{read,write}64.c. What do you think?

why do you need to delete the pread64.c & syscall.lists entries ?
if you kept those, wouldn't things remain the same ?

otherwise you'd have to keep the pread64.c and add a new pread.c
that just includes the 32-bit pread.c but also adds the aliases.
-mike
Adhemerval Zanella Netto Jan. 7, 2016, 9:03 p.m. UTC | #4
On 07-01-2016 18:54, Mike Frysinger wrote:
> On 07 Jan 2016 18:30, Adhemerval Zanella wrote:
>> On 07-01-2016 17:52, Mike Frysinger wrote:
>>> On 07 Jan 2016 15:18, Adhemerval Zanella wrote:
>>>> 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.
>>>
>>> just to make sure i'm reading this correctly, in the past 64-bit ports
>>> would have a pread symbol and pread64 would be an alias to it.  but with
>>> this patch, 64-bit ports now have two symbols w/identical code ?
>>
>> Indeed it is something I was thinking and I was not sure how to
>> fix it while not breaking the existing ABI.  Maybe only building
>> the p{read,write}.c if not WORDSIZE64 is define and creating an
>> alias on p{read,write}64.c. What do you think?
> 
> why do you need to delete the pread64.c & syscall.lists entries ?
> if you kept those, wouldn't things remain the same ?
> 
> otherwise you'd have to keep the pread64.c and add a new pread.c
> that just includes the 32-bit pread.c but also adds the aliases.
> -mike
> 

The idea is exactly to remove the auto-generation from syscalls.list
to simplify the cancellation syscall generation (to in the future
just get rid of the assembly hackery in sysdep-cancel.h).
Mike Frysinger Jan. 8, 2016, 8:43 p.m. UTC | #5
On 07 Jan 2016 19:03, Adhemerval Zanella wrote:
> On 07-01-2016 18:54, Mike Frysinger wrote:
> > On 07 Jan 2016 18:30, Adhemerval Zanella wrote:
> >> On 07-01-2016 17:52, Mike Frysinger wrote:
> >>> On 07 Jan 2016 15:18, Adhemerval Zanella wrote:
> >>>> 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.
> >>>
> >>> just to make sure i'm reading this correctly, in the past 64-bit ports
> >>> would have a pread symbol and pread64 would be an alias to it.  but with
> >>> this patch, 64-bit ports now have two symbols w/identical code ?
> >>
> >> Indeed it is something I was thinking and I was not sure how to
> >> fix it while not breaking the existing ABI.  Maybe only building
> >> the p{read,write}.c if not WORDSIZE64 is define and creating an
> >> alias on p{read,write}64.c. What do you think?
> > 
> > why do you need to delete the pread64.c & syscall.lists entries ?
> > if you kept those, wouldn't things remain the same ?
> > 
> > otherwise you'd have to keep the pread64.c and add a new pread.c
> > that just includes the 32-bit pread.c but also adds the aliases.
> 
> The idea is exactly to remove the auto-generation from syscalls.list
> to simplify the cancellation syscall generation (to in the future
> just get rid of the assembly hackery in sysdep-cancel.h).

i'm not sold on the idea that syscalls.list is a bad thing and that
having a lot of little stub files like below is an improvement:
int close(int fd)
{
  return INLINE_SYSCALL (close, 1, fd);
}

this is actually what we do in uClibc and i find it often has scaling
issues when needing to fix issues across files.

it also requires that the port have the ability to do inline assembly
such that it can stuff specific registers ... not all ports do.  but
maybe glibc does not care about those and would rather require them to
implement it.
-mike
Adhemerval Zanella Netto Jan. 8, 2016, 8:51 p.m. UTC | #6
On 08-01-2016 18:43, Mike Frysinger wrote:
> On 07 Jan 2016 19:03, Adhemerval Zanella wrote:
>> On 07-01-2016 18:54, Mike Frysinger wrote:
>>> On 07 Jan 2016 18:30, Adhemerval Zanella wrote:
>>>> On 07-01-2016 17:52, Mike Frysinger wrote:
>>>>> On 07 Jan 2016 15:18, Adhemerval Zanella wrote:
>>>>>> 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.
>>>>>
>>>>> just to make sure i'm reading this correctly, in the past 64-bit ports
>>>>> would have a pread symbol and pread64 would be an alias to it.  but with
>>>>> this patch, 64-bit ports now have two symbols w/identical code ?
>>>>
>>>> Indeed it is something I was thinking and I was not sure how to
>>>> fix it while not breaking the existing ABI.  Maybe only building
>>>> the p{read,write}.c if not WORDSIZE64 is define and creating an
>>>> alias on p{read,write}64.c. What do you think?
>>>
>>> why do you need to delete the pread64.c & syscall.lists entries ?
>>> if you kept those, wouldn't things remain the same ?
>>>
>>> otherwise you'd have to keep the pread64.c and add a new pread.c
>>> that just includes the 32-bit pread.c but also adds the aliases.
>>
>> The idea is exactly to remove the auto-generation from syscalls.list
>> to simplify the cancellation syscall generation (to in the future
>> just get rid of the assembly hackery in sysdep-cancel.h).
> 
> i'm not sold on the idea that syscalls.list is a bad thing and that
> having a lot of little stub files like below is an improvement:
> int close(int fd)
> {
>   return INLINE_SYSCALL (close, 1, fd);
> }
> 
> this is actually what we do in uClibc and i find it often has scaling
> issues when needing to fix issues across files.
> 
> it also requires that the port have the ability to do inline assembly
> such that it can stuff specific registers ... not all ports do.  but
> maybe glibc does not care about those and would rather require them to
> implement it.
> -mike
> 

I did not say that, what I said is the 'cancellable' syscalls is not a
good idea to go in syscalls.list.  You have duplicate logic (the assembly
macros) and one need to reimplement function calls in assembly (which 
should be handled by C) while taking care of PIC and non-PIC.

GLIBC already requires support of inline syscalls through INLINE macros,
so I do see a much better strategy to just implement cancellable
entrypoint on top of that.
Phil Blundell Jan. 8, 2016, 9:02 p.m. UTC | #7
On Fri, 2016-01-08 at 18:51 -0200, Adhemerval Zanella wrote:
> I did not say that, what I said is the 'cancellable' syscalls is not a
> good idea to go in syscalls.list.  You have duplicate logic (the assembly
> macros) and one need to reimplement function calls in assembly (which 
> should be handled by C) while taking care of PIC and non-PIC.

Can't you rework the syscalls.list code to auto-generate C rather than
assembler for the cancellable cases?

p.
Adhemerval Zanella Netto Jan. 8, 2016, 9:48 p.m. UTC | #8
> Em 8 de jan de 2016, às 19:02, Phil Blundell <pb@pbcl.net> escreveu:
> 
>> On Fri, 2016-01-08 at 18:51 -0200, Adhemerval Zanella wrote:
>> I did not say that, what I said is the 'cancellable' syscalls is not a
>> good idea to go in syscalls.list.  You have duplicate logic (the assembly
>> macros) and one need to reimplement function calls in assembly (which 
>> should be handled by C) while taking care of PIC and non-PIC.
> 
> Can't you rework the syscalls.list code to auto-generate C rather than
> assembler for the cancellable cases?
> 
> p.
> 
> 

This is a future work I am planning to do, which also I think is orthogonal of the target I am aiming with these changes (the cancellation rewrite).
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 8c9b878..0000000
--- a/sysdeps/unix/sysv/linux/arm/pread.c
+++ /dev/null
@@ -1,36 +0,0 @@ 
-/* Copyright (C) 1997-2016 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 3364b6a..0000000
--- a/sysdeps/unix/sysv/linux/arm/pread64.c
+++ /dev/null
@@ -1,37 +0,0 @@ 
-/* Copyright (C) 1997-2016 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 0dff648..0000000
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread.c
+++ /dev/null
@@ -1,37 +0,0 @@ 
-/* Copyright (C) 2011-2016 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 8931900..0000000
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/pread64.c
+++ /dev/null
@@ -1,34 +0,0 @@ 
-/* Copyright (C) 2011-2016 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 02755cb..0000000
--- a/sysdeps/unix/sysv/linux/mips/pread.c
+++ /dev/null
@@ -1,54 +0,0 @@ 
-/* Copyright (C) 1997-2016 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 ed0e91c..0000000
--- a/sysdeps/unix/sysv/linux/mips/pread64.c
+++ /dev/null
@@ -1,50 +0,0 @@ 
-/* Copyright (C) 1997-2016 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 2d67013..0000000
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread.c
+++ /dev/null
@@ -1,34 +0,0 @@ 
-/* Copyright (C) 1997-2016 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 712ab72..0000000
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/pread64.c
+++ /dev/null
@@ -1,35 +0,0 @@ 
-/* Copyright (C) 1997-2016 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 390ce24..c12fd7f 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 761f3ea..c39a0f2 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 4aa3c67..107e04b 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 7b5019a..0948da9 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
index 8afada5..d3f99f3 100644
--- a/sysdeps/unix/sysv/linux/sh/pread.c
+++ b/sysdeps/unix/sysv/linux/sh/pread.c
@@ -16,28 +16,8 @@ 
    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)
+/* SH4 ABI does not really require argument alignment for 64-bits, but
+   the kernel interface for pread adds a dummy long argument before the
+   offset.  */
+#define __ALIGNMENT_ARG
+#include <sysdeps/unix/sysv/linux/pread.c>
diff --git a/sysdeps/unix/sysv/linux/sh/pread64.c b/sysdeps/unix/sysv/linux/sh/pread64.c
index cfc751d..b2e8a25 100644
--- a/sysdeps/unix/sysv/linux/sh/pread64.c
+++ b/sysdeps/unix/sysv/linux/sh/pread64.c
@@ -16,28 +16,8 @@ 
    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)
+/* SH4 ABI does not really require argument alignment for 64-bits, but
+   the kernel interface for pread adds a dummy long argument before the
+   offset.  */
+#define __ALIGNMENT_ARG
+#include <sysdeps/unix/sysv/linux/pread64.c>
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 19cc6d9..7d5f6a5 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