[5/5] Update sysvipc kernel-features.h files for Linux 5.1
Commit Message
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(-)
Comments
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,
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,
@@ -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
@@ -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 */
@@ -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
@@ -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);
@@ -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
@@ -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
@@ -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,
@@ -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);
@@ -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,
@@ -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
@@ -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);
@@ -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. */