Message ID | 20190520175341.17310-2-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | [v2,1/2] ipc: Refactor sysvipc internal definitions | expand |
As a general issue in this patch, you're missing spaces before '(' in calls to 'defined'. 'defined' should be treated like a function for this purpose, and have such spaces (the parentheses are optional, you can just do "defined MACRO"). -- Joseph S. Myers joseph@codesourcery.com
On 20/05/2019 16:10, Joseph Myers wrote: > As a general issue in this patch, you're missing spaces before '(' in > calls to 'defined'. 'defined' should be treated like a function for this > purpose, and have such spaces (the parentheses are optional, you can just > do "defined MACRO"). > Alright, I change it locally to add the required spaces. Thanks for pointing this out.
Ping (x2) with Joseph raised issue corrected (missing spaces before '(' in calls to 'defined', 'defined' should be treated like a function, and have such spaces added). On 20/05/2019 14:53, Adhemerval Zanella wrote: > Changes from previous version: > > - Fixed condition to use wire-up syscalls for semop and semtimedop. > > -- > > 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. > --- > 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 411eb2fca4..8c398ddd1f 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 46418977c8..c9be6bc167 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 b9fa89c81d..8c85193a7a 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 2d49567686..1f034ebc6f 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 e787182396..fd2f22d730 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 <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 > diff --git a/sysdeps/unix/sysv/linux/s390/kernel-features.h b/sysdeps/unix/sysv/linux/s390/kernel-features.h > index 57077ea4cc..7997a78e1d 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 d428400681..46bce6baac 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 119ee06878..e401f3487b 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 1d746c4117..589ffc3fc8 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 cf68256abe..1721b89158 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 b322f205f8..40aa115b24 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 82c8236c23..b8f2212002 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. */ >
diff --git a/sysdeps/unix/sysv/linux/i386/kernel-features.h b/sysdeps/unix/sysv/linux/i386/kernel-features.h index 411eb2fca4..8c398ddd1f 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 46418977c8..c9be6bc167 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 b9fa89c81d..8c85193a7a 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 2d49567686..1f034ebc6f 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 e787182396..fd2f22d730 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 <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 diff --git a/sysdeps/unix/sysv/linux/s390/kernel-features.h b/sysdeps/unix/sysv/linux/s390/kernel-features.h index 57077ea4cc..7997a78e1d 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 d428400681..46bce6baac 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 119ee06878..e401f3487b 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 1d746c4117..589ffc3fc8 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 cf68256abe..1721b89158 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 b322f205f8..40aa115b24 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 82c8236c23..b8f2212002 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. */