unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v8 0/2] Support semctl_syscall() for __TIMESIZE==64
@ 2020-05-13 15:22 Alistair Francis via Libc-alpha
  2020-05-13 15:22 ` [PATCH v8 1/2] sysv: linux: Define the __semid_ds32 struct Alistair Francis via Libc-alpha
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Alistair Francis via Libc-alpha @ 2020-05-13 15:22 UTC (permalink / raw)
  To: libc-alpha; +Cc: stepan, Alistair Francis

This series supports the semctl calls on a system with __TIMESIZE==64
and __WORDSIZE==32 while not breaking current architectures. This is a
step towards full y2038 support, but does not get us there yet.

See: https://sourceware.org/pipermail/libc-alpha/2020-May/113774.html
for more details on what is still required.

This series adds a new __semid_ds32 that is passed to the kernel
(as part of a union) when running on 32-bit systems. If we are doing an
IPC_STAT/SEM_STAT command then the 32-bit sem_{c,o}time{_high} values
are combined to create a 64-bit value.

The semctl_syscall() function passes a union semun to the kernel. The
union includes struct semid_ds as a member. On 32-bit architectures the
Linux kernel provides a *_high version of the 32-bit sem_otime and
sem_ctime values. These can be combined to get a 64-bit version of the
time.

This patch adjusts the struct semid_ds to support the *_high versions
of sem_otime and sem_ctime. For 32-bit systems with a 64-bit time_t
this can be used to get a 64-bit time from the two 32-bit values.

This series was tested by running:
  ./scripts/build-many-glibcs.py ... compilers
  ./scripts/build-many-glibcs.py ... glibcs
on my x86_64 machine.

I also ran make check on RV32 and I only see a total of 9 test failures.

v8:
 - Revert back to v6-ish and only support __TIMESIZE==64
v7:
 - Re-write based on code from Adhemerval.
v6:
 - Update the 3rd patch to pass a temp buffer to the kernel
v5:
 - Address v4 review comments
 - Set the semid_ds struct from a temp struct
v4:
 - Remove the __IPC_TIME64 macro
    - It was only used once and doesn't work if __IPC_64 is 0 (which is
      usually is)
 - Address failures pointed out by Vineet Gupta

Alistair Francis (2):
  sysv: linux: Define the __semid_ds32 struct
  sysv: linux: Pass 64-bit version of semctl syscall

 .../unix/sysv/linux/hppa/struct__semid_ds32.h | 30 +++++++++++
 sysdeps/unix/sysv/linux/ipc_priv.h            |  4 ++
 .../unix/sysv/linux/mips/struct__semid_ds32.h | 28 +++++++++++
 .../sysv/linux/powerpc/struct__semid_ds32.h   | 30 +++++++++++
 sysdeps/unix/sysv/linux/semctl.c              | 50 +++++++++++++++++--
 .../sysv/linux/sparc/struct__semid_ds32.h     | 30 +++++++++++
 sysdeps/unix/sysv/linux/struct__semid_ds32.h  | 30 +++++++++++
 .../unix/sysv/linux/x86/struct__semid_ds32.h  | 30 +++++++++++
 8 files changed, 228 insertions(+), 4 deletions(-)
 create mode 100644 sysdeps/unix/sysv/linux/hppa/struct__semid_ds32.h
 create mode 100644 sysdeps/unix/sysv/linux/mips/struct__semid_ds32.h
 create mode 100644 sysdeps/unix/sysv/linux/powerpc/struct__semid_ds32.h
 create mode 100644 sysdeps/unix/sysv/linux/sparc/struct__semid_ds32.h
 create mode 100644 sysdeps/unix/sysv/linux/struct__semid_ds32.h
 create mode 100644 sysdeps/unix/sysv/linux/x86/struct__semid_ds32.h

-- 
2.26.2


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v8 1/2] sysv: linux: Define the __semid_ds32 struct
  2020-05-13 15:22 [PATCH v8 0/2] Support semctl_syscall() for __TIMESIZE==64 Alistair Francis via Libc-alpha
@ 2020-05-13 15:22 ` Alistair Francis via Libc-alpha
  2020-05-13 15:22 ` [PATCH v8 2/2] sysv: linux: Pass 64-bit version of semctl syscall Alistair Francis via Libc-alpha
  2020-05-27  1:42 ` [PATCH v8 0/2] Support semctl_syscall() for __TIMESIZE==64 Vineet Gupta via Libc-alpha
  2 siblings, 0 replies; 6+ messages in thread
From: Alistair Francis via Libc-alpha @ 2020-05-13 15:22 UTC (permalink / raw)
  To: libc-alpha; +Cc: stepan, Alistair Francis

Define a struct for 32-bit systems for the semctl command.
---
 .../unix/sysv/linux/hppa/struct__semid_ds32.h | 30 +++++++++++++++++++
 .../unix/sysv/linux/mips/struct__semid_ds32.h | 28 +++++++++++++++++
 .../sysv/linux/powerpc/struct__semid_ds32.h   | 30 +++++++++++++++++++
 .../sysv/linux/sparc/struct__semid_ds32.h     | 30 +++++++++++++++++++
 sysdeps/unix/sysv/linux/struct__semid_ds32.h  | 30 +++++++++++++++++++
 .../unix/sysv/linux/x86/struct__semid_ds32.h  | 30 +++++++++++++++++++
 6 files changed, 178 insertions(+)
 create mode 100644 sysdeps/unix/sysv/linux/hppa/struct__semid_ds32.h
 create mode 100644 sysdeps/unix/sysv/linux/mips/struct__semid_ds32.h
 create mode 100644 sysdeps/unix/sysv/linux/powerpc/struct__semid_ds32.h
 create mode 100644 sysdeps/unix/sysv/linux/sparc/struct__semid_ds32.h
 create mode 100644 sysdeps/unix/sysv/linux/struct__semid_ds32.h
 create mode 100644 sysdeps/unix/sysv/linux/x86/struct__semid_ds32.h

diff --git a/sysdeps/unix/sysv/linux/hppa/struct__semid_ds32.h b/sysdeps/unix/sysv/linux/hppa/struct__semid_ds32.h
new file mode 100644
index 0000000000..7a6b803cee
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/hppa/struct__semid_ds32.h
@@ -0,0 +1,30 @@
+/* HPPA implementation of the semaphore struct __semid_ds32.
+   Copyright (C) 1995-2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* This is the "new" y2038 types defined after the 5.1 kernel. It allows
+   the kernel to use {o,c}time{_high} values to support a 64-bit time_t.  */
+struct __semid_ds32 {
+  struct ipc_perm sem_perm;              /* operation permission struct */
+  __syscall_ulong_t   sem_otime_high;    /* last semop() time high */
+  __syscall_ulong_t   sem_otime;         /* last semop() time */
+  __syscall_ulong_t   sem_ctime_high;    /* last time changed by semctl() high */
+  __syscall_ulong_t   sem_ctime;         /* last time changed by semctl() */
+  __syscall_ulong_t   sem_nsems;         /* number of semaphores in set */
+  __syscall_ulong_t   __glibc_reserved3;
+  __syscall_ulong_t   __glibc_reserved4;
+};
diff --git a/sysdeps/unix/sysv/linux/mips/struct__semid_ds32.h b/sysdeps/unix/sysv/linux/mips/struct__semid_ds32.h
new file mode 100644
index 0000000000..3a1d7c6885
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/mips/struct__semid_ds32.h
@@ -0,0 +1,28 @@
+/* MIPS implementation of the semaphore struct __semid_ds32.
+   Copyright (C) 1995-2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* This is the "new" y2038 types defined after the 5.1 kernel. It allows
+   the kernel to use {o,c}time{_high} values to support a 64-bit time_t.  */
+struct __semid_ds32 {
+  struct ipc_perm sem_perm;              /* operation permission struct */
+  __syscall_ulong_t   sem_otime;         /* last semop time */
+  __syscall_ulong_t   sem_ctime;         /* last change time */
+  __syscall_ulong_t   sem_nsems;         /* number of semaphores in set */
+  __syscall_ulong_t   sem_otime_high;
+  __syscall_ulong_t   sem_ctime_high;
+};
diff --git a/sysdeps/unix/sysv/linux/powerpc/struct__semid_ds32.h b/sysdeps/unix/sysv/linux/powerpc/struct__semid_ds32.h
new file mode 100644
index 0000000000..880c0a3c04
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/struct__semid_ds32.h
@@ -0,0 +1,30 @@
+/* PowerPC implementation of the semaphore struct __semid_ds32.
+   Copyright (C) 1995-2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* This is the "new" y2038 types defined after the 5.1 kernel. It allows
+   the kernel to use {o,c}time{_high} values to support a 64-bit time_t.  */
+struct __semid_ds32 {
+  struct ipc_perm sem_perm;              /* operation permission struct */
+  __syscall_ulong_t   sem_otime_high;    /* last semop() time high */
+  __syscall_ulong_t   sem_otime;         /* last semop() time */
+  __syscall_ulong_t   sem_ctime_high;    /* last time changed by semctl() high */
+  __syscall_ulong_t   sem_ctime;         /* last time changed by semctl() */
+  __syscall_ulong_t   sem_nsems;         /* number of semaphores in set */
+  __syscall_ulong_t   __glibc_reserved3;
+  __syscall_ulong_t   __glibc_reserved4;
+};
diff --git a/sysdeps/unix/sysv/linux/sparc/struct__semid_ds32.h b/sysdeps/unix/sysv/linux/sparc/struct__semid_ds32.h
new file mode 100644
index 0000000000..0be263ccd0
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sparc/struct__semid_ds32.h
@@ -0,0 +1,30 @@
+/* Sparc implementation of the semaphore struct __semid_ds32.
+   Copyright (C) 1995-2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* This is the "new" y2038 types defined after the 5.1 kernel. It allows
+   the kernel to use {o,c}time{_high} values to support a 64-bit time_t.  */
+struct __semid_ds32 {
+  struct ipc_perm sem_perm;              /* operation permission struct */
+  __syscall_ulong_t   sem_otime_high;    /* last semop() time high */
+  __syscall_ulong_t   sem_otime;         /* last semop() time */
+  __syscall_ulong_t   sem_ctime_high;    /* last time changed by semctl() high */
+  __syscall_ulong_t   sem_ctime;         /* last time changed by semctl() */
+  __syscall_ulong_t   sem_nsems;         /* number of semaphores in set */
+  __syscall_ulong_t   __glibc_reserved3;
+  __syscall_ulong_t   __glibc_reserved4;
+};
diff --git a/sysdeps/unix/sysv/linux/struct__semid_ds32.h b/sysdeps/unix/sysv/linux/struct__semid_ds32.h
new file mode 100644
index 0000000000..c5242f4096
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/struct__semid_ds32.h
@@ -0,0 +1,30 @@
+/* Generic implementation of the semaphore struct __semid_ds32.
+   Copyright (C) 1995-2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* This is the "new" y2038 types defined after the 5.1 kernel. It allows
+   the kernel to use {o,c}time{_high} values to support a 64-bit time_t.  */
+struct __semid_ds32 {
+  struct ipc_perm sem_perm;              /* operation permission struct */
+  __syscall_ulong_t   sem_otime;         /* last semop() time */
+  __syscall_ulong_t   sem_otime_high;    /* last semop() time high */
+  __syscall_ulong_t   sem_ctime;         /* last time changed by semctl() */
+  __syscall_ulong_t   sem_ctime_high;    /* last time changed by semctl() high */
+  __syscall_ulong_t   sem_nsems;         /* number of semaphores in set */
+  __syscall_ulong_t   __glibc_reserved3;
+  __syscall_ulong_t   __glibc_reserved4;
+};
diff --git a/sysdeps/unix/sysv/linux/x86/struct__semid_ds32.h b/sysdeps/unix/sysv/linux/x86/struct__semid_ds32.h
new file mode 100644
index 0000000000..1155f5f93a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/x86/struct__semid_ds32.h
@@ -0,0 +1,30 @@
+/* x86 implementation of the semaphore struct __semid_ds32.
+   Copyright (C) 1995-2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* This is the "new" y2038 types defined after the 5.1 kernel. It allows
+   the kernel to use {o,c}time{_high} values to support a 64-bit time_t.  */
+struct __semid_ds32 {
+  struct ipc_perm sem_perm;              /* operation permission struct */
+  __syscall_ulong_t   sem_otime;         /* last semop() time */
+  __syscall_ulong_t   sem_otime_high;    /* last semop() time high */
+  __syscall_ulong_t   sem_ctime;         /* last time changed by semctl() */
+  __syscall_ulong_t   sem_ctime_high;    /* last time changed by semctl() high */
+  __syscall_ulong_t   sem_nsems;         /* number of semaphores in set */
+  __syscall_ulong_t   __glibc_reserved3;
+  __syscall_ulong_t   __glibc_reserved4;
+};
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v8 2/2] sysv: linux: Pass 64-bit version of semctl syscall
  2020-05-13 15:22 [PATCH v8 0/2] Support semctl_syscall() for __TIMESIZE==64 Alistair Francis via Libc-alpha
  2020-05-13 15:22 ` [PATCH v8 1/2] sysv: linux: Define the __semid_ds32 struct Alistair Francis via Libc-alpha
@ 2020-05-13 15:22 ` Alistair Francis via Libc-alpha
  2020-05-27 15:38   ` Andreas Schwab
  2020-05-27  1:42 ` [PATCH v8 0/2] Support semctl_syscall() for __TIMESIZE==64 Vineet Gupta via Libc-alpha
  2 siblings, 1 reply; 6+ messages in thread
From: Alistair Francis via Libc-alpha @ 2020-05-13 15:22 UTC (permalink / raw)
  To: libc-alpha; +Cc: stepan, Alistair Francis

The semctl_syscall() function passes a union semun to the kernel. The
union includes struct semid_ds as a member. On 32-bit architectures the
Linux kernel provides a *_high version of the 32-bit sem_otime and
sem_ctime values. These can be combined to get a 64-bit version of the
time.

This patch adjusts the struct semid_ds to support the *_high versions
of sem_otime and sem_ctime. For 32-bit systems with a 64-bit time_t
this can be used to get a 64-bit time from the two 32-bit values.

Due to alignment differences between 64-bit and 32-bit variables we
also need to set nsems to ensure it's correct.
---
 sysdeps/unix/sysv/linux/ipc_priv.h |  4 +++
 sysdeps/unix/sysv/linux/semctl.c   | 50 +++++++++++++++++++++++++++---
 2 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/sysdeps/unix/sysv/linux/ipc_priv.h b/sysdeps/unix/sysv/linux/ipc_priv.h
index 15a6e683a4..a1a7cacd17 100644
--- a/sysdeps/unix/sysv/linux/ipc_priv.h
+++ b/sysdeps/unix/sysv/linux/ipc_priv.h
@@ -43,6 +43,10 @@ struct __old_ipc_perm
   unsigned short int __seq;		/* Sequence number.  */
 };
 
+#define __IPC_TIME64 \
+ (__WORDSIZE == 32 && __TIMESIZE == 64 \
+     && (!defined __SYSCALL_WORDSIZE || __SYSCALL_WORDSIZE == 32))
+
 #define SEMCTL_ARG_ADDRESS(__arg) &__arg.array
 
 #define MSGRCV_ARGS(__msgp, __msgtyp) \
diff --git a/sysdeps/unix/sysv/linux/semctl.c b/sysdeps/unix/sysv/linux/semctl.c
index 30571af49f..3ed2af89d1 100644
--- a/sysdeps/unix/sysv/linux/semctl.c
+++ b/sysdeps/unix/sysv/linux/semctl.c
@@ -22,6 +22,7 @@
 #include <sysdep.h>
 #include <shlib-compat.h>
 #include <errno.h>
+#include <struct__semid_ds32.h>
 #include <linux/posix_types.h>  /* For __kernel_mode_t.  */
 
 /* Define a `union semun' suitable for Linux here.  */
@@ -44,13 +45,54 @@ union semun
 static int
 semctl_syscall (int semid, int semnum, int cmd, union semun arg)
 {
+  int ret;
+#if __IPC_TIME64
+  /* A temporary buffer is used to avoid both an issue where the export
+     semid_ds might not follow the kernel's expected layout (due
+     to {o,c}time{_high} alignment in 64-bit time case) and the issue where
+     some kernel versions might not clear the high bits when returning
+     then {o,c}time{_high} information.  */
+  struct __semid_ds32 tmp;
+  struct semid_ds *orig;
+  bool restore = false;
+  if (cmd == IPC_STAT || cmd == SEM_STAT || cmd == SEM_STAT_ANY)
+    {
+      tmp = (struct __semid_ds32) {
+        .sem_perm  = arg.buf->sem_perm,
+        .sem_otime = arg.buf->sem_otime,
+        .sem_otime_high = arg.buf->sem_otime >> 32,
+        .sem_ctime = arg.buf->sem_ctime,
+        .sem_ctime_high = arg.buf->sem_ctime >> 32,
+        .sem_nsems = arg.buf->sem_nsems,
+      };
+      orig = arg.buf;
+      arg.buf = (struct semid_ds*) &tmp;
+      restore = true;
+    }
+#endif
+
 #ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
-  return INLINE_SYSCALL_CALL (semctl, semid, semnum, cmd | __IPC_64,
-			      arg.array);
+  ret = INLINE_SYSCALL_CALL (semctl, semid, semnum, cmd | __IPC_64,
+                             arg.array);
 #else
-  return INLINE_SYSCALL_CALL (ipc, IPCOP_semctl, semid, semnum, cmd | __IPC_64,
-			      SEMCTL_ARG_ADDRESS (arg));
+  ret = INLINE_SYSCALL_CALL (ipc, IPCOP_semctl, semid, semnum, cmd | __IPC_64,
+                             SEMCTL_ARG_ADDRESS (arg));
 #endif
+
+#if __IPC_TIME64
+  if (ret >= 0 && restore)
+    {
+      arg.buf = orig;
+      arg.buf->sem_perm  = tmp.sem_perm;
+      arg.buf->sem_otime = tmp.sem_otime
+                           | ((__time64_t) tmp.sem_otime_high << 32);
+      arg.buf->sem_ctime = tmp.sem_ctime
+                           | ((__time64_t) tmp.sem_ctime_high << 32);
+      arg.buf->sem_nsems = tmp.sem_nsems;
+    }
+#endif
+
+    return ret;
 }
 
 int
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v8 0/2] Support semctl_syscall() for __TIMESIZE==64
  2020-05-13 15:22 [PATCH v8 0/2] Support semctl_syscall() for __TIMESIZE==64 Alistair Francis via Libc-alpha
  2020-05-13 15:22 ` [PATCH v8 1/2] sysv: linux: Define the __semid_ds32 struct Alistair Francis via Libc-alpha
  2020-05-13 15:22 ` [PATCH v8 2/2] sysv: linux: Pass 64-bit version of semctl syscall Alistair Francis via Libc-alpha
@ 2020-05-27  1:42 ` Vineet Gupta via Libc-alpha
  2 siblings, 0 replies; 6+ messages in thread
From: Vineet Gupta via Libc-alpha @ 2020-05-27  1:42 UTC (permalink / raw)
  To: Alistair Francis, libc-alpha@sourceware.org; +Cc: stepan@golosunov.pp.ru

On 5/13/20 8:22 AM, Alistair Francis via Libc-alpha wrote:
> This series supports the semctl calls on a system with __TIMESIZE==64
> and __WORDSIZE==32 while not breaking current architectures. This is a
> step towards full y2038 support, but does not get us there yet.
> 
> See: https://sourceware.org/pipermail/libc-alpha/2020-May/113774.html
> for more details on what is still required.

Reviewers ping !

FWIW ARC port is also dependent on this patchset !

> 
> This series adds a new __semid_ds32 that is passed to the kernel
> (as part of a union) when running on 32-bit systems. If we are doing an
> IPC_STAT/SEM_STAT command then the 32-bit sem_{c,o}time{_high} values
> are combined to create a 64-bit value.
> 
> The semctl_syscall() function passes a union semun to the kernel. The
> union includes struct semid_ds as a member. On 32-bit architectures the
> Linux kernel provides a *_high version of the 32-bit sem_otime and
> sem_ctime values. These can be combined to get a 64-bit version of the
> time.
> 
> This patch adjusts the struct semid_ds to support the *_high versions
> of sem_otime and sem_ctime. For 32-bit systems with a 64-bit time_t
> this can be used to get a 64-bit time from the two 32-bit values.
> 
> This series was tested by running:
>   ./scripts/build-many-glibcs.py ... compilers
>   ./scripts/build-many-glibcs.py ... glibcs
> on my x86_64 machine.
> 
> I also ran make check on RV32 and I only see a total of 9 test failures.
> 
> v8:
>  - Revert back to v6-ish and only support __TIMESIZE==64
> v7:
>  - Re-write based on code from Adhemerval.
> v6:
>  - Update the 3rd patch to pass a temp buffer to the kernel
> v5:
>  - Address v4 review comments
>  - Set the semid_ds struct from a temp struct
> v4:
>  - Remove the __IPC_TIME64 macro
>     - It was only used once and doesn't work if __IPC_64 is 0 (which is
>       usually is)
>  - Address failures pointed out by Vineet Gupta
> 
> Alistair Francis (2):
>   sysv: linux: Define the __semid_ds32 struct
>   sysv: linux: Pass 64-bit version of semctl syscall
> 
>  .../unix/sysv/linux/hppa/struct__semid_ds32.h | 30 +++++++++++
>  sysdeps/unix/sysv/linux/ipc_priv.h            |  4 ++
>  .../unix/sysv/linux/mips/struct__semid_ds32.h | 28 +++++++++++
>  .../sysv/linux/powerpc/struct__semid_ds32.h   | 30 +++++++++++
>  sysdeps/unix/sysv/linux/semctl.c              | 50 +++++++++++++++++--
>  .../sysv/linux/sparc/struct__semid_ds32.h     | 30 +++++++++++
>  sysdeps/unix/sysv/linux/struct__semid_ds32.h  | 30 +++++++++++
>  .../unix/sysv/linux/x86/struct__semid_ds32.h  | 30 +++++++++++
>  8 files changed, 228 insertions(+), 4 deletions(-)
>  create mode 100644 sysdeps/unix/sysv/linux/hppa/struct__semid_ds32.h
>  create mode 100644 sysdeps/unix/sysv/linux/mips/struct__semid_ds32.h
>  create mode 100644 sysdeps/unix/sysv/linux/powerpc/struct__semid_ds32.h
>  create mode 100644 sysdeps/unix/sysv/linux/sparc/struct__semid_ds32.h
>  create mode 100644 sysdeps/unix/sysv/linux/struct__semid_ds32.h
>  create mode 100644 sysdeps/unix/sysv/linux/x86/struct__semid_ds32.h
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v8 2/2] sysv: linux: Pass 64-bit version of semctl syscall
  2020-05-13 15:22 ` [PATCH v8 2/2] sysv: linux: Pass 64-bit version of semctl syscall Alistair Francis via Libc-alpha
@ 2020-05-27 15:38   ` Andreas Schwab
  2020-06-01  1:44     ` Alistair Francis via Libc-alpha
  0 siblings, 1 reply; 6+ messages in thread
From: Andreas Schwab @ 2020-05-27 15:38 UTC (permalink / raw)
  To: Alistair Francis via Libc-alpha; +Cc: stepan, Alistair Francis

On Mai 13 2020, Alistair Francis via Libc-alpha wrote:

> diff --git a/sysdeps/unix/sysv/linux/ipc_priv.h b/sysdeps/unix/sysv/linux/ipc_priv.h
> index 15a6e683a4..a1a7cacd17 100644
> --- a/sysdeps/unix/sysv/linux/ipc_priv.h
> +++ b/sysdeps/unix/sysv/linux/ipc_priv.h
> @@ -43,6 +43,10 @@ struct __old_ipc_perm
>    unsigned short int __seq;		/* Sequence number.  */
>  };
>  
> +#define __IPC_TIME64 \
> + (__WORDSIZE == 32 && __TIMESIZE == 64 \
> +     && (!defined __SYSCALL_WORDSIZE || __SYSCALL_WORDSIZE == 32))

Using defined in a macro expansion is undefined.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v8 2/2] sysv: linux: Pass 64-bit version of semctl syscall
  2020-05-27 15:38   ` Andreas Schwab
@ 2020-06-01  1:44     ` Alistair Francis via Libc-alpha
  0 siblings, 0 replies; 6+ messages in thread
From: Alistair Francis via Libc-alpha @ 2020-06-01  1:44 UTC (permalink / raw)
  To: Andreas Schwab
  Cc: Stepan Golosunov, Alistair Francis,
	Alistair Francis via Libc-alpha

On Wed, May 27, 2020 at 10:03 AM Andreas Schwab <schwab@linux-m68k.org> wrote:
>
> On Mai 13 2020, Alistair Francis via Libc-alpha wrote:
>
> > diff --git a/sysdeps/unix/sysv/linux/ipc_priv.h b/sysdeps/unix/sysv/linux/ipc_priv.h
> > index 15a6e683a4..a1a7cacd17 100644
> > --- a/sysdeps/unix/sysv/linux/ipc_priv.h
> > +++ b/sysdeps/unix/sysv/linux/ipc_priv.h
> > @@ -43,6 +43,10 @@ struct __old_ipc_perm
> >    unsigned short int __seq;          /* Sequence number.  */
> >  };
> >
> > +#define __IPC_TIME64 \
> > + (__WORDSIZE == 32 && __TIMESIZE == 64 \
> > +     && (!defined __SYSCALL_WORDSIZE || __SYSCALL_WORDSIZE == 32))
>
> Using defined in a macro expansion is undefined.

Fixed in v9.

Alistair

>
> Andreas.
>
> --
> Andreas Schwab, schwab@linux-m68k.org
> GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
> "And now for something completely different."

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-06-01  1:53 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-13 15:22 [PATCH v8 0/2] Support semctl_syscall() for __TIMESIZE==64 Alistair Francis via Libc-alpha
2020-05-13 15:22 ` [PATCH v8 1/2] sysv: linux: Define the __semid_ds32 struct Alistair Francis via Libc-alpha
2020-05-13 15:22 ` [PATCH v8 2/2] sysv: linux: Pass 64-bit version of semctl syscall Alistair Francis via Libc-alpha
2020-05-27 15:38   ` Andreas Schwab
2020-06-01  1:44     ` Alistair Francis via Libc-alpha
2020-05-27  1:42 ` [PATCH v8 0/2] Support semctl_syscall() for __TIMESIZE==64 Vineet Gupta via Libc-alpha

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).