[5/5] Update sysvipc kernel-features.h files for Linux 5.1

Message ID 20190516151249.19029-5-adhemerval.zanella@linaro.org
State New
Headers show
Series
  • [1/5] sysvipc: Fix compat msgctl
Related show

Commit Message

Adhemerval Zanella May 16, 2019, 3:12 p.m.
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].
	(__IPC_64): Likewise.
	* sysdeps/unix/sysv/linux/m68k/kernel-features.h
	(__ASSUME_DIRECT_SYSVIPC_SYSCALLS, __IPC_64): Likewise.
	* sysdeps/unix/sysv/linux/mips/kernel-features.h
	(__ASSUME_DIRECT_SYSVIPC_SYSCALLS, __IPC_64): Likewise.
	* sysdeps/unix/sysv/linux/powerpc/kernel-features.h
	(__ASSUME_DIRECT_SYSVIPC_SYSCALLS, __IPC_64): Likewise.
	* sysdeps/unix/sysv/linux/s390/kernel-features.h
	(__ASSUME_DIRECT_SYSVIPC_SYSCALLS, __IPC_64): Likewise.
	* sysdeps/unix/sysv/linux/sh/kernel-features.h
	(__ASSUME_DIRECT_SYSVIPC_SYSCALLS, __IPC_64): Likewise.
	* sysdeps/unix/sysv/linux/sparc/kernel-features.h
	(__ASSUME_DIRECT_SYSVIPC_SYSCALLS, __IPC_64): Likewise.
	* sysdeps/unix/sysv/linux/msgctl.c (__old_msgctl): Only use wire-up
	syscall if __IPC_64 is different than 0x0.
	* 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 define.
	* sysdeps/unix/sysv/linux/semtimedop.c (semtimedop): Likewise.
---
 sysdeps/unix/sysv/linux/i386/kernel-features.h    | 10 ++++++----
 sysdeps/unix/sysv/linux/m68k/kernel-features.h    | 11 ++++++-----
 sysdeps/unix/sysv/linux/mips/kernel-features.h    | 14 +++++++++-----
 sysdeps/unix/sysv/linux/msgctl.c                  |  5 ++++-
 sysdeps/unix/sysv/linux/powerpc/kernel-features.h | 11 ++++++-----
 sysdeps/unix/sysv/linux/s390/kernel-features.h    | 11 ++++++-----
 sysdeps/unix/sysv/linux/semctl.c                  |  5 ++++-
 sysdeps/unix/sysv/linux/semop.c                   |  4 +++-
 sysdeps/unix/sysv/linux/semtimedop.c              |  4 +++-
 sysdeps/unix/sysv/linux/sh/kernel-features.h      | 11 ++++++-----
 sysdeps/unix/sysv/linux/shmctl.c                  |  5 ++++-
 sysdeps/unix/sysv/linux/sparc/kernel-features.h   | 11 +++++++----
 12 files changed, 64 insertions(+), 38 deletions(-)

-- 
2.17.1

Comments

Stepan Golosunov May 17, 2019, 9 p.m. | #1
16.05.2019 в 12:12:49 -0300 Adhemerval Zanella написал:
> diff --git a/sysdeps/unix/sysv/linux/semop.c b/sysdeps/unix/sysv/linux/semop.c

> index 119ee06878..61649e3f41 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


There is no semop on 64-bit ABIs too.

> +     semtimedop_time64 instead with uses a 64-bit time_t).  */

> +#ifdef __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 1d746c4117..6bbca1e16f 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

> +  /* semop wire-up syscall is not exported for 32-bit ABIs (they have


semtimedop, not semop.  And on the three 64-bit ABIs the newly added
syscall is still called semtimedop.  __ASSUME_DIRECT_SYSVIPC_SYSCALLS
condition is still needed for them here (otherwise the new syscall
will be used even when __LINUX_KERNEL_VERSION < 0x050100).

> +     semtimedop_time64 instead with uses a 64-bit time_t).  */

> +#ifdef __NR_semtimedop

>    return INLINE_SYSCALL_CALL (semtimedop, semid, sops, nsops, timeout);

>  #else

>    return INLINE_SYSCALL_CALL (ipc, IPCOP_semtimedop, semid,
Adhemerval Zanella May 20, 2019, 12:31 p.m. | #2
On 17/05/2019 18:00, Stepan Golosunov wrote:
> 16.05.2019 в 12:12:49 -0300 Adhemerval Zanella написал:

>> diff --git a/sysdeps/unix/sysv/linux/semop.c b/sysdeps/unix/sysv/linux/semop.c

>> index 119ee06878..61649e3f41 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

> 

> There is no semop on 64-bit ABIs too.


It does for architectures that already had the sysvipc wire-up before the
time64_t patchset, x86_64 for instance where its value is 65.

> 

>> +     semtimedop_time64 instead with uses a 64-bit time_t).  */

>> +#ifdef __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 1d746c4117..6bbca1e16f 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

>> +  /* semop wire-up syscall is not exported for 32-bit ABIs (they have

> 

> semtimedop, not semop.  And on the three 64-bit ABIs the newly added

> syscall is still called semtimedop.  __ASSUME_DIRECT_SYSVIPC_SYSCALLS

> condition is still needed for them here (otherwise the new syscall

> will be used even when __LINUX_KERNEL_VERSION < 0x050100).


Thanks, I fixed the comment and added back the __ASSUME_DIRECT_SYSVIPC_SYSCALLS
along with the __NR_* check as well. 

> 

>> +     semtimedop_time64 instead with uses a 64-bit time_t).  */

>> +#ifdef __NR_semtimedop

>>    return INLINE_SYSCALL_CALL (semtimedop, semid, sops, nsops, timeout);

>>  #else

>>    return INLINE_SYSCALL_CALL (ipc, IPCOP_semtimedop, semid,

Patch

diff --git a/sysdeps/unix/sysv/linux/i386/kernel-features.h b/sysdeps/unix/sysv/linux/i386/kernel-features.h
index 5a26328d97..e08af61501 100644
--- a/sysdeps/unix/sysv/linux/i386/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/i386/kernel-features.h
@@ -46,10 +46,12 @@ 
 # undef __ASSUME_SENDTO_SYSCALL
 #endif
 
-/* i686 only supports ipc syscall.  */
-#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
-#undef __IPC_64
-#define __IPC_64                        0x100
+/* i686 only supports ipc syscall before 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+# undef __IPC_64
+# define __IPC_64                       0x100
+#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 8e81bb98ef..cec0be6b2b 100644
--- a/sysdeps/unix/sysv/linux/m68k/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/m68k/kernel-features.h
@@ -53,10 +53,11 @@ 
 # undef __ASSUME_SET_ROBUST_LIST
 #endif
 
-/* m68k only supports ipc syscall.  */
-#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
-
-#undef __IPC_64
-#define __IPC_64                        0x100
+/* m68k only supports ipc syscall before 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+# undef __IPC_64
+# define __IPC_64                       0x100
+#endif
 
 #endif /* _KERNEL_FEATURES_H  */
diff --git a/sysdeps/unix/sysv/linux/mips/kernel-features.h b/sysdeps/unix/sysv/linux/mips/kernel-features.h
index d90d87a5b0..2a7c125d5b 100644
--- a/sysdeps/unix/sysv/linux/mips/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/mips/kernel-features.h
@@ -30,15 +30,16 @@ 
 # undef __ASSUME_SET_ROBUST_LIST
 #endif
 
-#undef __IPC_64
-#define __IPC_64                        0x100
-
 /* Define this if your 32-bit syscall API requires 64-bit register
    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 __IPC_64
+#  define __IPC_64                      0x100
+# endif
 
 /* The o32 MIPS fadvise64 syscall behaves as fadvise64_64.  */
 # define __ASSUME_FADVISE64_AS_64_64		1
@@ -46,6 +47,9 @@ 
 /* mips32 support wire-up network syscalls.  */
 # define __ASSUME_RECV_SYSCALL		1
 # define __ASSUME_SEND_SYSCALL		1
+#else
+# undef __IPC_64
+# define __IPC_64                       0x100
 #endif
 
 /* Define that mips64-n32 is a ILP32 ABI to set the correct interface to
diff --git a/sysdeps/unix/sysv/linux/msgctl.c b/sysdeps/unix/sysv/linux/msgctl.c
index 2d49567686..d45e00253b 100644
--- a/sysdeps/unix/sysv/linux/msgctl.c
+++ b/sysdeps/unix/sysv/linux/msgctl.c
@@ -61,7 +61,10 @@  int
 attribute_compat_text_section
 __old_msgctl (int msqid, int cmd, struct __old_msqid_ds *buf)
 {
-#ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+  /* For architecture that have wire-up sysvctl but do not define __IPC_64
+     to a value different than default (0x0), it means the old syscall was
+     done using __NR_ipc.  */
+#if defined(__ASSUME_DIRECT_SYSVIPC_SYSCALLS) && __IPC_64 != 0x0
   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 b0fd94b139..7cfeaff946 100644
--- a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h
@@ -47,11 +47,12 @@ 
 
 #include_next <kernel-features.h>
 
-/* powerpc only supports ipc syscall.  */
-#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
-
-#undef __IPC_64
-#define __IPC_64                        0x100
+/* powerpc only supports ipc syscall before 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+# undef __IPC_64
+# define __IPC_64                       0x100
+#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 12338c0090..c455cec1af 100644
--- a/sysdeps/unix/sysv/linux/s390/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/s390/kernel-features.h
@@ -48,11 +48,12 @@ 
 # undef __ASSUME_SENDTO_SYSCALL
 #endif
 
-/* s390 only supports ipc syscall.  */
-#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
-
-#undef __IPC_64
-#define __IPC_64                        0x100
+/* s390 only supports ipc syscall before 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+# undef __IPC_64
+# define __IPC_64                       0x100
+#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 d428400681..a9d9ee74ec 100644
--- a/sysdeps/unix/sysv/linux/semctl.c
+++ b/sysdeps/unix/sysv/linux/semctl.c
@@ -98,7 +98,10 @@  __old_semctl (int semid, int semnum, int cmd, ...)
       break;
     }
 
-# ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+  /* For architecture that have wire-up sysvctl but do not define __IPC_64
+     to a value different than default (0x0), it means the old syscall was
+     done using __NR_ipc.  */
+# if defined (__ASSUME_DIRECT_SYSVIPC_SYSCALLS) && __IPC_64 != 0x0
   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 119ee06878..61649e3f41 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).  */
+#ifdef __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 1d746c4117..6bbca1e16f 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
+  /* semop wire-up syscall is not exported for 32-bit ABIs (they have
+     semtimedop_time64 instead with uses a 64-bit time_t).  */
+#ifdef __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 1f8e140232..1060d2fe8b 100644
--- a/sysdeps/unix/sysv/linux/sh/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/sh/kernel-features.h
@@ -41,11 +41,12 @@ 
    before the offset.  */
 #define __ASSUME_PRW_DUMMY_ARG	1
 
-/* sh only supports ipc syscall.  */
-#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
-
-#undef __IPC_64
-#define __IPC_64                        0x100
+/* sh only supports ipc syscall before 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+# undef __IPC_64
+# define __IPC_64                       0x100
+#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 b322f205f8..5d9d9d15a7 100644
--- a/sysdeps/unix/sysv/linux/shmctl.c
+++ b/sysdeps/unix/sysv/linux/shmctl.c
@@ -63,7 +63,10 @@  int
 attribute_compat_text_section
 __old_shmctl (int shmid, int cmd, struct __old_shmid_ds *buf)
 {
-#ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+  /* For architecture that have wire-up sysvctl but do not define __IPC_64
+     to a value different than default (0x0), it means the old syscall was
+     done using __NR_ipc.  */
+#if defined (__ASSUME_DIRECT_SYSVIPC_SYSCALLS) && __IPC_64 != 0x0
   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 4cbe8399ac..11e1c8582a 100644
--- a/sysdeps/unix/sysv/linux/sparc/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/sparc/kernel-features.h
@@ -62,10 +62,13 @@ 
 #endif
 
 /* sparc only supports ipc syscall.  */
-#undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
-#ifndef __arch64__
-# undef __IPC_64
-# define __IPC_64                            0x100
+/* sparc only supports ipc syscall before 5.1.  */
+#if __LINUX_KERNEL_VERSION < 0x050100
+# undef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
+# if !defined __arch64__
+#  undef __IPC_64
+#  define __IPC_64                           0x100
+# endif
 #endif
 
 /* Support for the renameat2 syscall was added in 3.16.  */