From: H.J. Lu Date: Mon, 5 Jun 2017 14:21:44 +0000 (-0700) Subject: x86-64: Update LO_HI_LONG for p{readv,writev}{64}v2 X-Git-Tag: glibc-2.26~426 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d8a7d10324d9765fa62f42c1d94c5bf36b60d558;p=thirdparty%2Fglibc.git x86-64: Update LO_HI_LONG for p{readv,writev}{64}v2 The kernel interface for p{readv,writev}{64}v is (unsigned long fd, {const }struct iovec *iov, unsigned long vlen, unsigned long pos_l, unsigned long pos_h) Except for targets which define __ARCH_WANT_COMPAT_SYS_PREADV64 and __ARCH_WANT_COMPAT_SYS_PWRITEV64, (unsigned long fd, {const }struct iovec *iov, unsigned long vlen, off64_t pos) is used for p{readv,writev}{64}v. X32 is the only such target. The LO_HI_LONG macro is used to pass offset to the pos_l and pos_h pair. Since pos_h is ignored when size of offset == sizeof of pos_l, x86-64 has #define LO_HI_LONG(val) (val) But the kernel interface for p{readv,writev}{64}v2 is (unsigned long fd, {const }struct iovec *iov, unsigned long vlen, unsigned long pos_l, unsigned long pos_h, int flags) Except for targets which define __ARCH_WANT_COMPAT_SYS_PREADV64V2 and __ARCH_WANT_COMPAT_SYS_PWRITEV64V2, (unsigned long fd, {const }struct iovec *iov, unsigned long vlen, off64_t pos, int flags) is used for p{readv,writev}{64}v2. X32 is the only such target. Update x86-64 LO_HI_LONG to pass 0 as the high part of the offset argument for p{readv,writev}{64}v2 and define a different LO_HI_LONG for x32 to only pass one argument for offset. Tested on x32 and x86-64. * sysdeps/unix/sysv/linux/x86_64/sysdep.h (LO_HI_LONG): Pass 0 as the high part of offset. * sysdeps/unix/sysv/linux/x86_64/x32/sysdep.h (LO_HI_LONG): New. --- diff --git a/ChangeLog b/ChangeLog index ff791f711c9..1cbcf564e0b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2017-06-05 H.J. Lu + + * sysdeps/unix/sysv/linux/x86_64/sysdep.h (LO_HI_LONG): Pass + 0 as the high part of offset. + * sysdeps/unix/sysv/linux/x86_64/x32/sysdep.h (LO_HI_LONG): New. + 2017-06-05 Joseph Myers [BZ #21538] diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h index 7b8bd795b7c..880e496880a 100644 --- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h @@ -387,6 +387,6 @@ /* How to pass the off{64}_t argument on p{readv,writev}{64}. */ #undef LO_HI_LONG -#define LO_HI_LONG(val) (val) +#define LO_HI_LONG(val) (val), 0 #endif /* linux/x86_64/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/x32/sysdep.h index f90fcfaeef5..04c73a2bc13 100644 --- a/sysdeps/unix/sysv/linux/x86_64/x32/sysdep.h +++ b/sysdeps/unix/sysv/linux/x86_64/x32/sysdep.h @@ -22,4 +22,8 @@ #include #include +/* How to pass the off{64}_t argument on p{readv,writev}{64}. */ +#undef LO_HI_LONG +#define LO_HI_LONG(val) (val) + #endif /* linux/x86_64/x32/sysdep.h */