From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 78335 invoked by alias); 23 Jul 2019 20:34:23 -0000 Mailing-List: contact glibc-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: , Sender: glibc-cvs-owner@sourceware.org List-Subscribe: Received: (qmail 78318 invoked by uid 9943); 23 Jul 2019 20:34:22 -0000 Date: Tue, 23 Jul 2019 20:34:00 -0000 Message-ID: <20190723203422.78317.qmail@sourceware.org> Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Adhemerval Zanella To: glibc-cvs@sourceware.org Subject: [glibc/azanella/bz18231] Update sysvipc kernel-features.h files for Linux 5.1 X-Act-Checkin: glibc X-Git-Author: Adhemerval Zanella X-Git-Refname: refs/heads/azanella/bz18231 X-Git-Oldrev: ea248d4f1df4000eda1f6cf47745918e268bf0ae X-Git-Newrev: 6c2d232a8ec276afa967f19c384f30a1e0c2d6d0 X-SW-Source: 2019-q3/txt/msg00118.txt.bz2 https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=6c2d232a8ec276afa967f19c384f30a1e0c2d6d0 commit 6c2d232a8ec276afa967f19c384f30a1e0c2d6d0 Author: Adhemerval Zanella Date: Mon May 20 12:17:46 2019 -0300 Update sysvipc kernel-features.h files for Linux 5.1 Linux 5.1 adds missing SySV IPC syscalls to the syscall table for remanining one that still uses the ipc syscall on glibc (m68k, mips-o32, powerpc, s390, sh, and sparc32). However the newly added direct ipc syscall are different than the old ones: 1. They do not expect IPC_64, meaning __IPC_64 should be set to zero when new syscalls are used. And new syscalls can not be used for compat functions like __old_semctl (to emulated old sysvipc it requires to use the old __NR_ipc syscall without __IPC_64). Thus IPC_64 is redefined for newer kernels on affected ABIs. 2. semtimedop and semop does not exist on 32-bit ABIs (only semtimedop_time64 is supplied). The provided syscall wrappers only uses the wire-up syscall if __NR_semtimedop and __NR_semop are also defined. Checked on x86_64-linux-gnu and i686-linux-gnu on both a 4.15 kernel configure with default options and sysvipc tests on a 5.1.2 kernel with --enable-kernel=5.1. * sysdeps/unix/sysv/linux/i386/kernel-features.h. (__ASSUME_DIRECT_SYSVIPC_SYSCALLS): Only undefine if [__LINUX_KERNEL_VERSION < 0x050100]. (__ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise. * sysdeps/unix/sysv/linux/m68k/kernel-features.h (__ASSUME_DIRECT_SYSVIPC_SYSCALLS, __ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise. * sysdeps/unix/sysv/linux/mips/kernel-features.h (__ASSUME_DIRECT_SYSVIPC_SYSCALLS, __ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise. * sysdeps/unix/sysv/linux/powerpc/kernel-features.h (__ASSUME_DIRECT_SYSVIPC_SYSCALLS, __ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise. * sysdeps/unix/sysv/linux/s390/kernel-features.h (__ASSUME_DIRECT_SYSVIPC_SYSCALLS, __ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise. * sysdeps/unix/sysv/linux/sh/kernel-features.h (__ASSUME_DIRECT_SYSVIPC_SYSCALLS, __ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise. * sysdeps/unix/sysv/linux/sparc/kernel-features.h (__ASSUME_DIRECT_SYSVIPC_SYSCALLS, __ASSUME_SYSVIPC_DEFAULT_IPC_64): Likewise. * sysdeps/unix/sysv/linux/msgctl.c (__old_msgctl): Only use wire-up syscall if __ASSUME_SYSVIPC_DEFAULT_IPC_64 is not defined. * sysdeps/unix/sysv/linux/semctl.c (__old_semctl): Likewise. * sysdeps/unix/sysv/linux/shmctl.c (__old_shmctl): Likewise. * sysdeps/unix/sysv/linux/semop.c (semop): Only use wire-up if __NR_semop is also defined. * sysdeps/unix/sysv/linux/semtimedop.c (semtimedop): Likewise. Diff: --- sysdeps/unix/sysv/linux/i386/kernel-features.h | 8 +++++--- sysdeps/unix/sysv/linux/m68k/kernel-features.h | 8 +++++--- sysdeps/unix/sysv/linux/mips/kernel-features.h | 12 ++++++++---- sysdeps/unix/sysv/linux/msgctl.c | 6 +++++- sysdeps/unix/sysv/linux/powerpc/kernel-features.h | 8 +++++--- sysdeps/unix/sysv/linux/s390/kernel-features.h | 8 +++++--- sysdeps/unix/sysv/linux/semctl.c | 6 +++++- sysdeps/unix/sysv/linux/semop.c | 4 +++- sysdeps/unix/sysv/linux/semtimedop.c | 4 +++- sysdeps/unix/sysv/linux/sh/kernel-features.h | 8 +++++--- sysdeps/unix/sysv/linux/shmctl.c | 6 +++++- sysdeps/unix/sysv/linux/sparc/kernel-features.h | 10 ++++++---- 12 files changed, 60 insertions(+), 28 deletions(-) diff --git a/sysdeps/unix/sysv/linux/i386/kernel-features.h b/sysdeps/unix/sysv/linux/i386/kernel-features.h index 411eb2f..8c398dd 100644 --- a/sysdeps/unix/sysv/linux/i386/kernel-features.h +++ b/sysdeps/unix/sysv/linux/i386/kernel-features.h @@ -43,9 +43,11 @@ # undef __ASSUME_SENDTO_SYSCALL #endif -/* i686 only supports ipc syscall. */ -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS -#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +/* i686 only supports ipc syscall before 5.1. */ +#if __LINUX_KERNEL_VERSION < 0x050100 +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +#endif #undef __ASSUME_CLONE_DEFAULT #define __ASSUME_CLONE_BACKWARDS 1 diff --git a/sysdeps/unix/sysv/linux/m68k/kernel-features.h b/sysdeps/unix/sysv/linux/m68k/kernel-features.h index 4641897..c9be6bc 100644 --- a/sysdeps/unix/sysv/linux/m68k/kernel-features.h +++ b/sysdeps/unix/sysv/linux/m68k/kernel-features.h @@ -50,6 +50,8 @@ # undef __ASSUME_SET_ROBUST_LIST #endif -/* m68k only supports ipc syscall. */ -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS -#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +/* m68k only supports ipc syscall before 5.1. */ +#if __LINUX_KERNEL_VERSION < 0x050100 +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +#endif diff --git a/sysdeps/unix/sysv/linux/mips/kernel-features.h b/sysdeps/unix/sysv/linux/mips/kernel-features.h index b9fa89c..8c85193 100644 --- a/sysdeps/unix/sysv/linux/mips/kernel-features.h +++ b/sysdeps/unix/sysv/linux/mips/kernel-features.h @@ -31,8 +31,12 @@ pairs to start with an even-number register. */ #if _MIPS_SIM == _ABIO32 # define __ASSUME_ALIGNED_REGISTER_PAIRS 1 -/* mips32 only supports ipc syscall. */ -# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +/* mips32 only supports ipc syscall before 5.1. */ +# if __LINUX_KERNEL_VERSION < 0x050100 +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +# else +# endif /* The o32 MIPS fadvise64 syscall behaves as fadvise64_64. */ # define __ASSUME_FADVISE64_AS_64_64 1 @@ -40,6 +44,8 @@ /* mips32 support wire-up network syscalls. */ # define __ASSUME_RECV_SYSCALL 1 # define __ASSUME_SEND_SYSCALL 1 +#else +# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 #endif /* Define that mips64-n32 is a ILP32 ABI to set the correct interface to @@ -50,5 +56,3 @@ #undef __ASSUME_CLONE_DEFAULT #define __ASSUME_CLONE_BACKWARDS 1 - -#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 diff --git a/sysdeps/unix/sysv/linux/msgctl.c b/sysdeps/unix/sysv/linux/msgctl.c index 2d49567..852c668 100644 --- a/sysdeps/unix/sysv/linux/msgctl.c +++ b/sysdeps/unix/sysv/linux/msgctl.c @@ -61,7 +61,11 @@ int attribute_compat_text_section __old_msgctl (int msqid, int cmd, struct __old_msqid_ds *buf) { -#ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +#if defined __ASSUME_DIRECT_SYSVIPC_SYSCALLS \ + && !defined __ASSUME_SYSVIPC_DEFAULT_IPC_64 + /* For architecture that have wire-up msgctl but also have __IPC_64 to a + value different than default (0x0), it means the old syscall was done + using __NR_ipc. */ return INLINE_SYSCALL_CALL (msgctl, msqid, cmd, buf); #else return INLINE_SYSCALL_CALL (ipc, IPCOP_msgctl, msqid, cmd, 0, buf); diff --git a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h index e787182..fd2f22d 100644 --- a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h +++ b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h @@ -44,9 +44,11 @@ #include_next -/* powerpc only supports ipc syscall. */ -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS -#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +/* powerpc only supports ipc syscall before 5.1. */ +#if __LINUX_KERNEL_VERSION < 0x050100 +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +#endif #undef __ASSUME_CLONE_DEFAULT #define __ASSUME_CLONE_BACKWARDS 1 diff --git a/sysdeps/unix/sysv/linux/s390/kernel-features.h b/sysdeps/unix/sysv/linux/s390/kernel-features.h index 57077ea..7997a78 100644 --- a/sysdeps/unix/sysv/linux/s390/kernel-features.h +++ b/sysdeps/unix/sysv/linux/s390/kernel-features.h @@ -45,9 +45,11 @@ # undef __ASSUME_SENDTO_SYSCALL #endif -/* s390 only supports ipc syscall. */ -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS -#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +/* s390 only supports ipc syscall before 5.1. */ +#if __LINUX_KERNEL_VERSION < 0x050100 +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +#endif #undef __ASSUME_CLONE_DEFAULT #define __ASSUME_CLONE_BACKWARDS2 diff --git a/sysdeps/unix/sysv/linux/semctl.c b/sysdeps/unix/sysv/linux/semctl.c index d428400..6f4e46d 100644 --- a/sysdeps/unix/sysv/linux/semctl.c +++ b/sysdeps/unix/sysv/linux/semctl.c @@ -98,7 +98,11 @@ __old_semctl (int semid, int semnum, int cmd, ...) break; } -# ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +#if defined __ASSUME_DIRECT_SYSVIPC_SYSCALLS \ + && !defined __ASSUME_SYSVIPC_DEFAULT_IPC_64 + /* For architecture that have wire-up semctl but also have __IPC_64 to a + value different than default (0x0), it means the old syscall was done + using __NR_ipc. */ return INLINE_SYSCALL_CALL (semctl, semid, semnum, cmd, arg.array); # else return INLINE_SYSCALL_CALL (ipc, IPCOP_semctl, semid, semnum, cmd, diff --git a/sysdeps/unix/sysv/linux/semop.c b/sysdeps/unix/sysv/linux/semop.c index 119ee06..8e5305c 100644 --- a/sysdeps/unix/sysv/linux/semop.c +++ b/sysdeps/unix/sysv/linux/semop.c @@ -26,7 +26,9 @@ int semop (int semid, struct sembuf *sops, size_t nsops) { -#ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS + /* semop wire-up syscall is not exported for 32-bit ABIs (they have + semtimedop_time64 instead with uses a 64-bit time_t). */ +#if defined __ASSUME_DIRECT_SYSVIPC_SYSCALLS && defined __NR_semop return INLINE_SYSCALL_CALL (semop, semid, sops, nsops); #else return INLINE_SYSCALL_CALL (ipc, IPCOP_semop, semid, nsops, 0, sops); diff --git a/sysdeps/unix/sysv/linux/semtimedop.c b/sysdeps/unix/sysv/linux/semtimedop.c index 1d746c4..49f6df8 100644 --- a/sysdeps/unix/sysv/linux/semtimedop.c +++ b/sysdeps/unix/sysv/linux/semtimedop.c @@ -27,7 +27,9 @@ int semtimedop (int semid, struct sembuf *sops, size_t nsops, const struct timespec *timeout) { -#ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS + /* semtimedop wire-up syscall is not exported for 32-bit ABIs (they have + semtimedop_time64 instead with uses a 64-bit time_t). */ +#if defined __ASSUME_DIRECT_SYSVIPC_SYSCALLS && defined __NR_semtimedop return INLINE_SYSCALL_CALL (semtimedop, semid, sops, nsops, timeout); #else return INLINE_SYSCALL_CALL (ipc, IPCOP_semtimedop, semid, diff --git a/sysdeps/unix/sysv/linux/sh/kernel-features.h b/sysdeps/unix/sysv/linux/sh/kernel-features.h index 110d6d3..e793a83 100644 --- a/sysdeps/unix/sysv/linux/sh/kernel-features.h +++ b/sysdeps/unix/sysv/linux/sh/kernel-features.h @@ -41,9 +41,11 @@ before the offset. */ #define __ASSUME_PRW_DUMMY_ARG 1 -/* sh only supports ipc syscall. */ -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS -#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +/* sh only supports ipc syscall before 5.1. */ +#if __LINUX_KERNEL_VERSION < 0x050100 +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +#endif /* Support for several syscalls was added in 4.8. */ #if __LINUX_KERNEL_VERSION < 0x040800 diff --git a/sysdeps/unix/sysv/linux/shmctl.c b/sysdeps/unix/sysv/linux/shmctl.c index b322f20..ba1dc28 100644 --- a/sysdeps/unix/sysv/linux/shmctl.c +++ b/sysdeps/unix/sysv/linux/shmctl.c @@ -63,7 +63,11 @@ int attribute_compat_text_section __old_shmctl (int shmid, int cmd, struct __old_shmid_ds *buf) { -#ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +#if defined __ASSUME_DIRECT_SYSVIPC_SYSCALLS \ + && !defined __ASSUME_SYSVIPC_DEFAULT_IPC_64 + /* For architecture that have wire-up shmctl but also have __IPC_64 to a + value different than default (0x0), it means the old syscall was done + using __NR_ipc. */ return INLINE_SYSCALL_CALL (shmctl, shmid, cmd, buf); #else return INLINE_SYSCALL_CALL (ipc, IPCOP_shmctl, shmid, cmd, 0, buf); diff --git a/sysdeps/unix/sysv/linux/sparc/kernel-features.h b/sysdeps/unix/sysv/linux/sparc/kernel-features.h index 82c8236..b8f2212 100644 --- a/sysdeps/unix/sysv/linux/sparc/kernel-features.h +++ b/sysdeps/unix/sysv/linux/sparc/kernel-features.h @@ -58,10 +58,12 @@ # undef __NR_pause #endif -/* sparc only supports ipc syscall. */ -#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS -#ifndef __arch64__ -# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +/* sparc only supports ipc syscall before 5.1. */ +#if __LINUX_KERNEL_VERSION < 0x050100 +# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS +# if !defined __arch64__ +# undef __ASSUME_SYSVIPC_DEFAULT_IPC_64 +# endif #endif /* Support for the renameat2 syscall was added in 3.16. */