]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Update sysvipc kernel-features.h files for Linux 5.1
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Mon, 20 May 2019 15:17:46 +0000 (12:17 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 18 Oct 2019 14:01:13 +0000 (11:01 -0300)
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>
sysdeps/unix/sysv/linux/i386/kernel-features.h
sysdeps/unix/sysv/linux/m68k/kernel-features.h
sysdeps/unix/sysv/linux/mips/kernel-features.h
sysdeps/unix/sysv/linux/msgctl.c
sysdeps/unix/sysv/linux/powerpc/kernel-features.h
sysdeps/unix/sysv/linux/s390/kernel-features.h
sysdeps/unix/sysv/linux/semctl.c
sysdeps/unix/sysv/linux/semtimedop.c
sysdeps/unix/sysv/linux/sh/kernel-features.h
sysdeps/unix/sysv/linux/shmctl.c
sysdeps/unix/sysv/linux/sparc/kernel-features.h

index 33ba18e791ce679a3ffed22458ae7deb2248726c..9db3b3a31cff417a48e0a33249c7f1d4e7bb658e 100644 (file)
 # 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
index 7ff9b5e28d1a8eae15e538d7f7358e5e803ea5ac..76f90ff8b40231753797b5708ab9ab99ad83d009 100644 (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
index 7123b362eecd34c3f065ffeae496b2eed5ef7fbf..ad5b1ace82ee85d0b3756c0d6d473307ee27feb0 100644 (file)
    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
index 19d5ded19f57db772e12838a9ebb4dfb1331b167..44ff0e5ac34a1e2b792139274d64af143e73566a 100644 (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);
index b93f7f8f1344816ec093eee6debdc977a968a798..96a2c4b2aa77ea98ea1f5be1828b76c917bacf7e 100644 (file)
 
 #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
index f1f8dad3059dc253e942b5ccbb4aa9a1c8c7d5dd..0fbd16ab8567d292f4a01a377f57851f021d1ee9 100644 (file)
 # 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
index e7f48e4093a86ab46316a4d0d8ae90d0bc5c19a5..b1733e405f21def208a6b64d382e7a5d98ca6499 100644 (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,
index 09c18d9781f212466c022b5f7a6309605f0e78be..3723e6ccf068c7b42e6c46ce3bb4733167d0c12d 100644 (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,
index dce9d41653c0761da7cb2307631ce0210ae98e3c..e9048a64744b31d745d31178b329a6bd66862d63 100644 (file)
    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
index 606c8dcd6b640953f3fcba045f4dcf7029c500be..81dc99172bd14269508dfa226733abd8c58c4668 100644 (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);
index 25194117f681e55ae26432c7a04df272db1ccfe2..ea9a2a8212976b522cf1a03442eaf1b7c9bc1f42 100644 (file)
 # 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.  */