1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00

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.3.0 kernel with
--enable-kernel=5.1.

Tested-by: Paul A. Clarke <pc@us.ibm.com>
This commit is contained in:
Adhemerval Zanella
2019-05-20 12:17:46 -03:00
parent 2901743568
commit 720e9541f5
11 changed files with 57 additions and 27 deletions

View File

@ -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

View File

@ -50,7 +50,9 @@
# undef __ASSUME_SET_ROBUST_LIST
#endif
/* m68k only supports ipc syscall. */
#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
/* 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
#define __ASSUME_SYSVIPC_BROKEN_MODE_T
#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64

View File

@ -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

View File

@ -111,7 +111,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 compat symbol used the
__NR_ipc syscall. */
return INLINE_SYSCALL_CALL (msgctl, msqid, cmd, buf);
#else
return INLINE_SYSCALL_CALL (ipc, IPCOP_msgctl, msqid, cmd, 0, buf);

View File

@ -44,9 +44,11 @@
#include_next <kernel-features.h>
/* 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

View File

@ -45,12 +45,14 @@
# undef __ASSUME_SENDTO_SYSCALL
#endif
/* s390 only supports ipc syscall. */
#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
/* 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
#ifndef __s390x__
# define __ASSUME_SYSVIPC_BROKEN_MODE_T
#endif
#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64
#undef __ASSUME_CLONE_DEFAULT
#define __ASSUME_CLONE_BACKWARDS2

View File

@ -168,7 +168,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 architectures that have wire-up semctl but also have __IPC_64 to a
value different than default (0x0) it means the compat symbol used the
__NR_ipc syscall. */
return INLINE_SYSCALL_CALL (semctl, semid, semnum, cmd, arg.array);
# else
return INLINE_SYSCALL_CALL (ipc, IPCOP_semctl, semid, semnum, cmd,

View File

@ -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,

View File

@ -43,12 +43,14 @@
before the offset. */
#define __ASSUME_PRW_DUMMY_ARG 1
/* sh only supports ipc syscall. */
#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
/* 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
#if __BYTE_ORDER == __BIG_ENDIAN
# define __ASSUME_SYSVIPC_BROKEN_MODE_T
#endif
#undef __ASSUME_SYSVIPC_DEFAULT_IPC_64
/* Support for several syscalls was added in 4.8. */
#if __LINUX_KERNEL_VERSION < 0x040800

View File

@ -111,7 +111,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 compat symbol used the
__NR_ipc syscall. */
return INLINE_SYSCALL_CALL (shmctl, shmid, cmd, buf);
#else
return INLINE_SYSCALL_CALL (ipc, IPCOP_shmctl, shmid, cmd, 0, buf);

View File

@ -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. */