* [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).