This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH v2 01/11] Linux/Alpha: don't use timeval32 system calls.
On Fri, Oct 25, 2019 at 5:09 AM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> From: Zack Weinberg <zackw@panix.com>
>
> Changes from previous version:
>
> - Add check usage32 check on __wait4_tv32.
>
> - Change capitalized functions to lowercase.
>
> --
>
> Linux/Alpha has two versions of several system call wrappers that take
> or return data of type "struct timeval" (possibly nested inside a
> larger structure). The GLIBC_2.0 version is a compat symbol that
> calls __NR_osf_foo or __NR_old_foo and uses a struct timeval with a
> 32-bit tv_sec field. The GLIBC_2.1 version is used for current code,
> calls __NR_foo, and uses a struct timeval with a 64-bit tv_sec field.
>
> This patch changes all of the compat symbols of this type to be
> wrappers around their GLIBC_2.1 counterparts; the compatibility system
> calls will no longer be used. It serves as a proposal for part of how
> we do the transition to 64-bit time_t on systems that currently use
> 32-bit time_t:
>
> * The patched glibc will NOT use system calls that involve 32-bit
> time_t to implement its compatibility symbols. This will make both
> our lives and the kernel maintainers' lives easier. The primary
> argument I've seen against it is that the kernel could warn about
> uses of the old system calls, helping people find old binaries that
> need to be recompiled. I think there are several other ways we
> could accomplish this, e.g. scripts to scan the filesystem for
> binaries with references to the old symbol versions, or issuing
> diagnostics ourselves.
>
> * The compat symbols do NOT report failure after the Y2038 deadline.
> An earlier revision of this patch had them return -1 and set errno
> to EOVERFLOW, but Adhemerval pointed out that many of them have
> already performed side effects at the point where we discover the
> overflow, so that would break more than it fixes. Also, we don't
> want people to be _checking_ for EOVERFLOW from these functions; we
> want them to recompile with 64-bit time_t. So it's not actually
> useful for them to report failure to the calling code.
>
> * What they do do, when they encounter overflow, is saturate the
> overflowed "struct timeval"(s): tv_sec is set to INT32_MAX and
> tv_nsec is set to 999999. That means time stops advancing for
> programs with 32-bit time_t when they reach the deadline. That's
> obviously going to break stuff, but I think wrapping around is
> probably going to break _more_ stuff. I'd be interested to hear
> arguments against, if anyone has one.
>
> The new header file tv32-compat.h is currently Alpha-specific but I
> mean for it to be reused to aid in writing wrappers for all affected
> architectures. I only put it in sysdeps/unix/sysv/linux/alpha for now
> because I haven't checked whether the various "foo32" structures it
> defines agree with the ABI for ports other than Linux/Alpha.
>
> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> sysdeps/unix/sysv/linux/Makefile | 2 +-
> sysdeps/unix/sysv/linux/adjtime.c | 40 ++---
> sysdeps/unix/sysv/linux/adjtimex.c | 40 +++++
> sysdeps/unix/sysv/linux/alpha/Makefile | 2 +-
> sysdeps/unix/sysv/linux/alpha/adjtime.c | 82 +---------
> sysdeps/unix/sysv/linux/alpha/adjtimex.c | 22 +++
> sysdeps/unix/sysv/linux/alpha/osf_adjtime.c | 130 ++++++++++++++++
> sysdeps/unix/sysv/linux/alpha/osf_getitimer.c | 41 +++++
> sysdeps/unix/sysv/linux/alpha/osf_getrusage.c | 39 +++++
> .../unix/sysv/linux/alpha/osf_gettimeofday.c | 43 ++++++
> sysdeps/unix/sysv/linux/alpha/osf_setitimer.c | 49 ++++++
> .../unix/sysv/linux/alpha/osf_settimeofday.c | 41 +++++
> sysdeps/unix/sysv/linux/alpha/osf_utimes.c | 37 +++++
> sysdeps/unix/sysv/linux/alpha/osf_wait4.c | 41 +++++
> sysdeps/unix/sysv/linux/alpha/syscalls.list | 27 ++--
> sysdeps/unix/sysv/linux/alpha/tv32-compat.h | 146 ++++++++++++++++++
> sysdeps/unix/sysv/linux/gettimeofday.c | 14 +-
> sysdeps/unix/sysv/linux/syscalls.list | 1 -
> 18 files changed, 666 insertions(+), 131 deletions(-)
> create mode 100644 sysdeps/unix/sysv/linux/adjtimex.c
> create mode 100644 sysdeps/unix/sysv/linux/alpha/adjtimex.c
> create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_adjtime.c
> create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_getitimer.c
> create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_getrusage.c
> create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_gettimeofday.c
> create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_setitimer.c
> create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_settimeofday.c
> create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_utimes.c
> create mode 100644 sysdeps/unix/sysv/linux/alpha/osf_wait4.c
> create mode 100644 sysdeps/unix/sysv/linux/alpha/tv32-compat.h
>
> diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
> index bbab8f8cc3..a7623fb390 100644
> --- a/sysdeps/unix/sysv/linux/Makefile
> +++ b/sysdeps/unix/sysv/linux/Makefile
> @@ -14,7 +14,7 @@ endif
> ifeq ($(subdir),misc)
> include $(firstword $(wildcard $(sysdirs:=/sysctl.mk)))
>
> -sysdep_routines += clone umount umount2 readahead \
> +sysdep_routines += adjtimex clone umount umount2 readahead \
> setfsuid setfsgid epoll_pwait signalfd \
> eventfd eventfd_read eventfd_write prlimit \
> personality epoll_wait tee vmsplice splice \
> diff --git a/sysdeps/unix/sysv/linux/adjtime.c b/sysdeps/unix/sysv/linux/adjtime.c
> index 6d1e129ccc..6b8021caa3 100644
> --- a/sysdeps/unix/sysv/linux/adjtime.c
> +++ b/sysdeps/unix/sysv/linux/adjtime.c
> @@ -23,39 +23,14 @@
> #define MAX_SEC (INT_MAX / 1000000L - 2)
> #define MIN_SEC (INT_MIN / 1000000L + 2)
>
> -#ifndef MOD_OFFSET
> -#define modes mode
> -#endif
> -
> -#ifndef TIMEVAL
> -#define TIMEVAL timeval
> -#endif
> -
> -#ifndef TIMEX
> -#define TIMEX timex
> -#endif
> -
> -#ifndef ADJTIME
> -#define ADJTIME __adjtime
> -#endif
> -
> -#ifndef ADJTIMEX
> -#define NO_LOCAL_ADJTIME
> -#define ADJTIMEX(x) __adjtimex (x)
> -#endif
> -
> -#ifndef LINKAGE
> -#define LINKAGE
> -#endif
> -
> -LINKAGE int
> -ADJTIME (const struct TIMEVAL *itv, struct TIMEVAL *otv)
> +int
> +__adjtime (const struct timeval *itv, struct timeval *otv)
> {
> - struct TIMEX tntx;
> + struct timex tntx;
>
> if (itv)
> {
> - struct TIMEVAL tmp;
> + struct timeval tmp;
>
> /* We will do some check here. */
> tmp.tv_sec = itv->tv_sec + itv->tv_usec / 1000000L;
> @@ -68,7 +43,7 @@ ADJTIME (const struct TIMEVAL *itv, struct TIMEVAL *otv)
> else
> tntx.modes = ADJ_OFFSET_SS_READ;
>
> - if (__glibc_unlikely (ADJTIMEX (&tntx) < 0))
> + if (__glibc_unlikely (__adjtimex (&tntx) < 0))
> return -1;
>
> if (otv)
> @@ -87,6 +62,9 @@ ADJTIME (const struct TIMEVAL *itv, struct TIMEVAL *otv)
> return 0;
> }
>
> -#ifdef NO_LOCAL_ADJTIME
> +#ifdef VERSION_adjtime
> +weak_alias (__adjtime, __wadjtime);
> +default_symbol_version (__wadjtime, adjtime, VERSION_adjtime);
> +#else
> weak_alias (__adjtime, adjtime)
> #endif
> diff --git a/sysdeps/unix/sysv/linux/adjtimex.c b/sysdeps/unix/sysv/linux/adjtimex.c
> new file mode 100644
> index 0000000000..6d62c72a17
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/adjtimex.c
> @@ -0,0 +1,40 @@
> +/* Tune kernel clock. Linux specific syscall.
> + Copyright (C) 2019 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <sys/timex.h>
> +#include <sysdep.h>
> +
> +int
> +___adjtimex (struct timex *buf)
> +{
> + return INLINE_SYSCALL_CALL (adjtimex, buf);
The y2038 safe platforms don't have the adjtimex syscall, instead they
have the clock_adjtime call. Can this fall back to clock_adjtime if
__NR_adjtimex isn't defined?
Alistair
> +}
> +
> +#ifdef VERSION_adjtimex
> +weak_alias (___adjtimex, __wadjtimex);
> +weak_alias (___adjtimex, __wnadjtime);
> +default_symbol_version (___adjtimex, __adjtimex, VERSION_adjtimex);
> +default_symbol_version (__wadjtimex, adjtimex, VERSION_adjtimex);
> +default_symbol_version (__wnadjtime, ntp_adjtime, VERSION_adjtimex);
> +libc_hidden_ver (___adjtimex, __adjtimex);
> +#else
> +strong_alias (___adjtimex, __adjtimex)
> +weak_alias (___adjtimex, adjtimex)
> +weak_alias (___adjtimex, ntp_adjtime)
> +libc_hidden_def (__adjtimex)
> +#endif
> diff --git a/sysdeps/unix/sysv/linux/alpha/Makefile b/sysdeps/unix/sysv/linux/alpha/Makefile
> index fdd089af71..2e132e474b 100644
> --- a/sysdeps/unix/sysv/linux/alpha/Makefile
> +++ b/sysdeps/unix/sysv/linux/alpha/Makefile
> @@ -9,7 +9,7 @@ sysdep_routines += ieee_get_fp_control ieee_set_fp_control \
> ioperm
>
> # Support old timeval32 entry points
> -sysdep_routines += osf_gettimeofday osf_settimeofday \
> +sysdep_routines += osf_adjtime osf_gettimeofday osf_settimeofday \
> osf_getitimer osf_setitimer osf_utimes \
> osf_getrusage osf_wait4
>
> diff --git a/sysdeps/unix/sysv/linux/alpha/adjtime.c b/sysdeps/unix/sysv/linux/alpha/adjtime.c
> index 4aede1cc40..9cb058ee55 100644
> --- a/sysdeps/unix/sysv/linux/alpha/adjtime.c
> +++ b/sysdeps/unix/sysv/linux/alpha/adjtime.c
> @@ -1,4 +1,5 @@
> -/* Copyright (C) 1998-2019 Free Software Foundation, Inc.
> +/* adjtime -- Adjust the current time of day. Linux/Alpha/tv64 version.
> + Copyright (C) 2019 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
> @@ -15,80 +16,7 @@
> License along with the GNU C Library. If not, see
> <https://www.gnu.org/licenses/>. */
>
> -#include <shlib-compat.h>
> -#include <sysdep.h>
> -#include <sys/time.h>
> -
> -
> -#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
> -struct timeval32
> -{
> - int tv_sec, tv_usec;
> -};
> -
> -struct timex32 {
> - unsigned int modes; /* mode selector */
> - long offset; /* time offset (usec) */
> - long freq; /* frequency offset (scaled ppm) */
> - long maxerror; /* maximum error (usec) */
> - long esterror; /* estimated error (usec) */
> - int status; /* clock command/status */
> - long constant; /* pll time constant */
> - long precision; /* clock precision (usec) (read only) */
> - long tolerance; /* clock frequency tolerance (ppm)
> - * (read only)
> - */
> - struct timeval32 time; /* (read only) */
> - long tick; /* (modified) usecs between clock ticks */
> -
> - long ppsfreq; /* pps frequency (scaled ppm) (ro) */
> - long jitter; /* pps jitter (us) (ro) */
> - int shift; /* interval duration (s) (shift) (ro) */
> - long stabil; /* pps stability (scaled ppm) (ro) */
> - long jitcnt; /* jitter limit exceeded (ro) */
> - long calcnt; /* calibration intervals (ro) */
> - long errcnt; /* calibration errors (ro) */
> - long stbcnt; /* stability limit exceeded (ro) */
> -
> - int :32; int :32; int :32; int :32;
> - int :32; int :32; int :32; int :32;
> - int :32; int :32; int :32; int :32;
> -};
> -
> -#define TIMEVAL timeval32
> -#define TIMEX timex32
> -#define ADJTIME attribute_compat_text_section __adjtime_tv32
> -#define ADJTIMEX(x) INLINE_SYSCALL (old_adjtimex, 1, x)
> -#define ADJTIMEX32(x) INLINE_SYSCALL (old_adjtimex, 1, x)
> -
> +/* We can use the generic Linux implementation, but we have to override its
> + default symbol version. */
> +#define VERSION_adjtime GLIBC_2.1
> #include <sysdeps/unix/sysv/linux/adjtime.c>
> -
> -int attribute_compat_text_section
> -__adjtimex_tv32 (struct timex32 *tx) { return ADJTIMEX (tx); }
> -
> -strong_alias (__adjtimex_tv32, __adjtimex_tv32_1);
> -strong_alias (__adjtimex_tv32, __adjtimex_tv32_2);
> -compat_symbol (libc, __adjtimex_tv32_1, __adjtimex, GLIBC_2_0);
> -compat_symbol (libc, __adjtimex_tv32_2, adjtimex, GLIBC_2_0);
> -compat_symbol (libc, __adjtime_tv32, adjtime, GLIBC_2_0);
> -#endif /* SHLIB_COMPAT */
> -
> -#undef TIMEVAL
> -#undef TIMEX
> -#undef ADJTIME
> -#undef ADJTIMEX
> -#define TIMEVAL timeval
> -#define TIMEX timex
> -#define ADJTIMEX(x) INLINE_SYSCALL (adjtimex, 1, x)
> -
> -#include <sysdeps/unix/sysv/linux/adjtime.c>
> -
> -int
> -__adjtimex_tv64 (struct timex *tx) { return ADJTIMEX (tx); }
> -
> -libc_hidden_ver (__adjtimex_tv64, __adjtimex)
> -strong_alias (__adjtimex_tv64, __adjtimex_tv64p);
> -weak_alias (__adjtimex_tv64, ntp_adjtime);
> -versioned_symbol (libc, __adjtimex_tv64, __adjtimex, GLIBC_2_1);
> -versioned_symbol (libc, __adjtimex_tv64p, adjtimex, GLIBC_2_1);
> -versioned_symbol (libc, __adjtime, adjtime, GLIBC_2_1);
> diff --git a/sysdeps/unix/sysv/linux/alpha/adjtimex.c b/sysdeps/unix/sysv/linux/alpha/adjtimex.c
> new file mode 100644
> index 0000000000..1a8e0a9529
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/adjtimex.c
> @@ -0,0 +1,22 @@
> +/* adjtimex -- Adjust the current time of day. Linux/Alpha/tv64 version.
> + Copyright (C) 2019 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
> + <http://www.gnu.org/licenses/>. */
> +
> +/* We can use the generic Linux implementation, but we have to override its
> + default symbol version. */
> +#define VERSION_adjtimex GLIBC_2.1
> +#include <sysdeps/unix/sysv/linux/adjtimex.c>
> diff --git a/sysdeps/unix/sysv/linux/alpha/osf_adjtime.c b/sysdeps/unix/sysv/linux/alpha/osf_adjtime.c
> new file mode 100644
> index 0000000000..c948ac2dda
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/osf_adjtime.c
> @@ -0,0 +1,130 @@
> +/* adjtime -- adjust the system clock. Linux/Alpha/tv32 version.
> + Copyright (C) 2019 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <shlib-compat.h>
> +
> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
> +
> +#include <sys/time.h>
> +#include <sys/timex.h>
> +#include <tv32-compat.h>
> +
> +struct timex32 {
> + unsigned int modes; /* mode selector */
> + long offset; /* time offset (usec) */
> + long freq; /* frequency offset (scaled ppm) */
> + long maxerror; /* maximum error (usec) */
> + long esterror; /* estimated error (usec) */
> + int status; /* clock command/status */
> + long constant; /* pll time constant */
> + long precision; /* clock precision (usec) (read only) */
> + long tolerance; /* clock frequency tolerance (ppm)
> + * (read only)
> + */
> + struct timeval32 time; /* (read only) */
> + long tick; /* (modified) usecs between clock ticks */
> +
> + long ppsfreq; /* pps frequency (scaled ppm) (ro) */
> + long jitter; /* pps jitter (us) (ro) */
> + int shift; /* interval duration (s) (shift) (ro) */
> + long stabil; /* pps stability (scaled ppm) (ro) */
> + long jitcnt; /* jitter limit exceeded (ro) */
> + long calcnt; /* calibration intervals (ro) */
> + long errcnt; /* calibration errors (ro) */
> + long stbcnt; /* stability limit exceeded (ro) */
> +
> + int :32; int :32; int :32; int :32;
> + int :32; int :32; int :32; int :32;
> + int :32; int :32; int :32; int :32;
> +};
> +
> +int
> +attribute_compat_text_section
> +__adjtime_tv32 (const struct timeval32 *itv, struct timeval32 *otv)
> +{
> + struct timeval itv64, otv64;
> + tv32_to_tv64 (&itv64, itv);
> +
> + if (__adjtime (&itv64, &otv64) == -1)
> + return -1;
> +
> + tv64_to_tv32 (otv, &itv64);
> + return 0;
> +}
> +
> +int
> +attribute_compat_text_section
> +__adjtimex_tv32 (struct timex32 *tx)
> +{
> + struct timex tx64;
> + memset (&tx64, 0, sizeof tx64);
> + tx64.modes = tx->modes;
> + tx64.offset = tx->offset;
> + tx64.freq = tx->freq;
> + tx64.maxerror = tx->maxerror;
> + tx64.esterror = tx->esterror;
> + tx64.status = tx->status;
> + tx64.constant = tx->constant;
> + tx64.precision = tx->precision;
> + tx64.tolerance = tx->tolerance;
> + tx64.tick = tx->tick;
> + tx64.ppsfreq = tx->ppsfreq;
> + tx64.jitter = tx->jitter;
> + tx64.shift = tx->shift;
> + tx64.stabil = tx->stabil;
> + tx64.jitcnt = tx->jitcnt;
> + tx64.calcnt = tx->calcnt;
> + tx64.errcnt = tx->errcnt;
> + tx64.stbcnt = tx->stbcnt;
> + tv32_to_tv64 (&tx64.time, &tx->time);
> +
> + int status = __adjtimex (&tx64);
> + if (status < 0)
> + return status;
> +
> + memset (tx, 0, sizeof *tx);
> + tx->modes = tx64.modes;
> + tx->offset = tx64.offset;
> + tx->freq = tx64.freq;
> + tx->maxerror = tx64.maxerror;
> + tx->esterror = tx64.esterror;
> + tx->status = tx64.status;
> + tx->constant = tx64.constant;
> + tx->precision = tx64.precision;
> + tx->tolerance = tx64.tolerance;
> + tx->tick = tx64.tick;
> + tx->ppsfreq = tx64.ppsfreq;
> + tx->jitter = tx64.jitter;
> + tx->shift = tx64.shift;
> + tx->stabil = tx64.stabil;
> + tx->jitcnt = tx64.jitcnt;
> + tx->calcnt = tx64.calcnt;
> + tx->errcnt = tx64.errcnt;
> + tx->stbcnt = tx64.stbcnt;
> + tv64_to_tv32 (&tx->time, &tx64.time);
> +
> + return status;
> +}
> +
> +strong_alias (__adjtimex_tv32, __adjtimex_tv32_1);
> +strong_alias (__adjtimex_tv32, __adjtimex_tv32_2);
> +compat_symbol (libc, __adjtimex_tv32_1, __adjtimex, GLIBC_2_0);
> +compat_symbol (libc, __adjtimex_tv32_2, adjtimex, GLIBC_2_0);
> +compat_symbol (libc, __adjtime_tv32, adjtime, GLIBC_2_0);
> +
> +#endif /* SHLIB_COMPAT */
> diff --git a/sysdeps/unix/sysv/linux/alpha/osf_getitimer.c b/sysdeps/unix/sysv/linux/alpha/osf_getitimer.c
> new file mode 100644
> index 0000000000..f290954783
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/osf_getitimer.c
> @@ -0,0 +1,41 @@
> +/* getitimer -- Get the state of an interval timer. Linux/Alpha/tv32 version.
> + Copyright (C) 2019 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <shlib-compat.h>
> +
> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
> +
> +#include <sys/time.h>
> +#include <tv32-compat.h>
> +
> +int
> +attribute_compat_text_section
> +__getitimer_tv32 (int which, struct itimerval32 *curr_value)
> +{
> + struct itimerval curr_value_64;
> + if (__getitimer (which, &curr_value_64) == -1)
> + return -1;
> +
> + /* Write all fields of 'curr_value' regardless of overflow. */
> + tv64_to_tv32 (&curr_value->it_interval, &curr_value_64.it_interval);
> + tv64_to_tv32 (&curr_value->it_value, &curr_value_64.it_value);
> + return 0;
> +}
> +
> +compat_symbol (libc, __getitimer_tv32, getitimer, GLIBC_2_0);
> +#endif
> diff --git a/sysdeps/unix/sysv/linux/alpha/osf_getrusage.c b/sysdeps/unix/sysv/linux/alpha/osf_getrusage.c
> new file mode 100644
> index 0000000000..918e8445d4
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/osf_getrusage.c
> @@ -0,0 +1,39 @@
> +/* utimes -- change file timestamps. Linux/Alpha/tv32 version.
> + Copyright (C) 2019 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <shlib-compat.h>
> +
> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
> +
> +#include <sys/time.h>
> +#include <sys/resource.h>
> +#include <tv32-compat.h>
> +
> +int
> +__getrusage_tv32 (int who, struct rusage32 *usage32)
> +{
> + struct rusage usage64;
> + if (__getrusage (who, &usage64) == -1)
> + return -1;
> +
> + rusage64_to_rusage32 (usage32, &usage64);
> + return 0;
> +}
> +
> +compat_symbol (libc, __getrusage_tv32, getrusage, GLIBC_2_0);
> +#endif
> diff --git a/sysdeps/unix/sysv/linux/alpha/osf_gettimeofday.c b/sysdeps/unix/sysv/linux/alpha/osf_gettimeofday.c
> new file mode 100644
> index 0000000000..e6cc522dd1
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/osf_gettimeofday.c
> @@ -0,0 +1,43 @@
> +/* gettimeofday -- Get the current time of day. Linux/Alpha/tv32 version.
> + Copyright (C) 2019 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <shlib-compat.h>
> +
> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
> +
> +#include <sys/time.h>
> +#include <tv32-compat.h>
> +
> +/* Get the current time of day and timezone information putting it
> + into *TV and *TZ. */
> +
> +int
> +attribute_compat_text_section
> +__gettimeofday_tv32 (struct timeval32 *restrict tv32, void *restrict tz)
> +{
> + struct timeval tv;
> + __gettimeofday (&tv, tz);
> +
> + tv64_to_tv32 (tv32, &tv);
> + return 0;
> +}
> +
> +compat_symbol (libc, __gettimeofday_tv32, __gettimeofday, GLIBC_2_0);
> +strong_alias (__gettimeofday_tv32, __gettimeofday_tv32_1);
> +compat_symbol (libc, __gettimeofday_tv32_1, gettimeofday, GLIBC_2_0);
> +#endif
> diff --git a/sysdeps/unix/sysv/linux/alpha/osf_setitimer.c b/sysdeps/unix/sysv/linux/alpha/osf_setitimer.c
> new file mode 100644
> index 0000000000..d6bbcee60a
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/osf_setitimer.c
> @@ -0,0 +1,49 @@
> +/* getitimer -- Get the state of an interval timer. Linux/Alpha/tv32 version.
> + Copyright (C) 2019 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <shlib-compat.h>
> +
> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
> +
> +#include <sys/time.h>
> +#include <tv32-compat.h>
> +
> +int
> +attribute_compat_text_section
> +__setitimer_tv32 (int which, const struct itimerval32 *restrict new_value,
> + struct itimerval32 *restrict old_value)
> +{
> + struct itimerval new_value_64;
> + tv32_to_tv64 (&new_value_64.it_interval, &new_value->it_interval);
> + tv32_to_tv64 (&new_value_64.it_value, &new_value->it_value);
> +
> + if (old_value == NULL)
> + return __setitimer (which, &new_value_64, NULL);
> +
> + struct itimerval old_value_64;
> + if (__setitimer (which, &new_value_64, &old_value_64) == -1)
> + return -1;
> +
> + /* Write all fields of 'old_value' regardless of overflow. */
> + tv64_to_tv32 (&old_value->it_interval, &old_value_64.it_interval);
> + tv64_to_tv32 (&old_value->it_value, &old_value_64.it_value);
> + return 0;
> +}
> +
> +compat_symbol (libc, __setitimer_tv32, setitimer, GLIBC_2_0);
> +#endif
> diff --git a/sysdeps/unix/sysv/linux/alpha/osf_settimeofday.c b/sysdeps/unix/sysv/linux/alpha/osf_settimeofday.c
> new file mode 100644
> index 0000000000..fb2a36df19
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/osf_settimeofday.c
> @@ -0,0 +1,41 @@
> +/* settimeofday -- Set the current time of day. Linux/Alpha/tv32 version.
> + Copyright (C) 2019 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <shlib-compat.h>
> +
> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
> +
> +#include <sys/time.h>
> +#include <time.h>
> +#include <errno.h>
> +#include <tv32-compat.h>
> +
> +/* Set the current time of day and timezone information.
> + This call is restricted to the super-user. */
> +int
> +attribute_compat_text_section
> +__settimeofday_tv32 (const struct timeval32 *tv32,
> + const struct timezone *tz)
> +{
> + struct timeval tv;
> + tv32_to_tv64 (&tv, tv32);
> + return __settimeofday (&tv, tz);
> +}
> +
> +compat_symbol (libc, __settimeofday_tv32, settimeofday, GLIBC_2_0);
> +#endif
> diff --git a/sysdeps/unix/sysv/linux/alpha/osf_utimes.c b/sysdeps/unix/sysv/linux/alpha/osf_utimes.c
> new file mode 100644
> index 0000000000..788fb7cd44
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/osf_utimes.c
> @@ -0,0 +1,37 @@
> +/* utimes -- change file timestamps. Linux/Alpha/tv32 version.
> + Copyright (C) 2019 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <shlib-compat.h>
> +
> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
> +
> +#include <sys/time.h>
> +#include <tv32-compat.h>
> +
> +int
> +attribute_compat_text_section
> +__utimes_tv32 (const char *filename, const struct timeval32 times32[2])
> +{
> + struct timeval times[2];
> + tv32_to_tv64 (×[0], ×32[0]);
> + tv32_to_tv64 (×[1], ×32[1]);
> + return __utimes (filename, times);
> +}
> +
> +compat_symbol (libc, __utimes_tv32, utimes, GLIBC_2_0);
> +#endif
> diff --git a/sysdeps/unix/sysv/linux/alpha/osf_wait4.c b/sysdeps/unix/sysv/linux/alpha/osf_wait4.c
> new file mode 100644
> index 0000000000..e8db554660
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/osf_wait4.c
> @@ -0,0 +1,41 @@
> +/* wait4 -- wait for process to change state. Linux/Alpha/tv32 version.
> + Copyright (C) 2019 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <shlib-compat.h>
> +
> +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
> +
> +#include <sys/time.h>
> +#include <sys/resource.h>
> +#include <sys/wait.h>
> +#include <tv32-compat.h>
> +
> +pid_t
> +attribute_compat_text_section
> +__wait4_tv32 (pid_t pid, int *status, int options, struct rusage32 *usage32)
> +{
> + struct rusage usage64;
> + pid_t child = __wait4 (pid, status, options, &usage64);
> +
> + if (child >= 0 && usage32 != NULL)
> + rusage64_to_rusage32 (usage32, &usage64);
> + return child;
> +}
> +
> +compat_symbol (libc, __wait4_tv32, wait4, GLIBC_2_0);
> +#endif
> diff --git a/sysdeps/unix/sysv/linux/alpha/syscalls.list b/sysdeps/unix/sysv/linux/alpha/syscalls.list
> index 12cd021b60..c786aa751e 100644
> --- a/sysdeps/unix/sysv/linux/alpha/syscalls.list
> +++ b/sysdeps/unix/sysv/linux/alpha/syscalls.list
> @@ -1,4 +1,4 @@
> -# File name Caller Syscall name # args Strong name Weak names
> +# File name Caller Syscall name Args Strong name Weak names
>
> sigstack - sigstack 2 sigstack
>
> @@ -22,23 +22,14 @@ pciconfig_read EXTRA pciconfig_read 5 pciconfig_read
> pciconfig_write EXTRA pciconfig_write 5 pciconfig_write
> pciconfig_iobase EXTRA pciconfig_iobase 3 __pciconfig_iobase pciconfig_iobase
>
> -# support old timeval32 entry points
> -osf_gettimeofday - osf_gettimeofday 2 __gettimeofday_tv32 __gettimeofday@GLIBC_2.0 gettimeofday@GLIBC_2.0
> -osf_settimeofday - osf_settimeofday 2 __settimeofday_tv32 settimeofday@GLIBC_2.0
> -osf_getitimer - osf_getitimer 2 __getitimer_tv32 getitimer@GLIBC_2.0
> -osf_setitimer - osf_setitimer 3 __setitimer_tv32 setitimer@GLIBC_2.0
> -osf_utimes - osf_utimes 2 __utimes_tv32 utimes@GLIBC_2.0
> -osf_getrusage - osf_getrusage 2 __getrusage_tv32 getrusage@GLIBC_2.0
> -osf_wait4 - osf_wait4 4 __wait4_tv32 wait4@GLIBC_2.0
> -
> -# support new timeval64 entry points
> -gettimeofday - gettimeofday 2 __GI___gettimeofday gettimeofday@@GLIBC_2.1 __gettimeofday@@GLIBC_2.1
> -settimeofday - settimeofday 2 __settimeofday settimeofday@@GLIBC_2.1
> -getitimer - getitimer 2 __getitimer getitimer@@GLIBC_2.1
> -setitimer - setitimer 3 __setitimer setitimer@@GLIBC_2.1
> -utimes - utimes 2 __utimes utimes@@GLIBC_2.1
> -getrusage - getrusage 2 __getrusage getrusage@@GLIBC_2.1
> -wait4 - wait4 4 __wait4 wait4@@GLIBC_2.1
> +# timeval64 entry points (see osf_*.c for GLIBC_2.0 timeval32 equivalents)
> +gettimeofday - gettimeofday i:pP __GI___gettimeofday gettimeofday@@GLIBC_2.1 __gettimeofday@@GLIBC_2.1
> +settimeofday - settimeofday i:PP __settimeofday settimeofday@@GLIBC_2.1
> +getitimer - getitimer i:ip __getitimer getitimer@@GLIBC_2.1
> +setitimer - setitimer i:ipP __setitimer setitimer@@GLIBC_2.1
> +utimes - utimes i:sp __utimes utimes@@GLIBC_2.1
> +getrusage - getrusage i:ip __getrusage getrusage@@GLIBC_2.1
> +wait4 - wait4 i:iWiP __wait4 wait4@@GLIBC_2.1
>
> # avoid 64-bit aliases on 32-bit statfs syscalls
> fstatfs - fstatfs i:ip __fstatfs fstatfs
> diff --git a/sysdeps/unix/sysv/linux/alpha/tv32-compat.h b/sysdeps/unix/sysv/linux/alpha/tv32-compat.h
> new file mode 100644
> index 0000000000..e1edb7453a
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/alpha/tv32-compat.h
> @@ -0,0 +1,146 @@
> +/* Compatibility definitions for `struct timeval' with 32-bit time_t.
> + Copyright (C) 2019 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#ifndef _TV32_COMPAT_H
> +#define _TV32_COMPAT_H 1
> +
> +#include <features.h>
> +
> +#include <bits/types.h>
> +#include <bits/types/time_t.h>
> +#include <bits/types/struct_timeval.h>
> +#include <bits/types/struct_timespec.h>
> +#include <bits/types/struct_rusage.h>
> +
> +#include <stdint.h> // for INT32_MAX
> +#include <string.h> // for memset
> +
> +#define TV_USEC_MAX 999999 // 10**6 - 1
> +
> +/* A version of 'struct timeval' with 32-bit time_t. */
> +struct timeval32
> +{
> + int32_t tv_sec;
> + int32_t tv_usec;
> +};
> +
> +/* Structures containing 'struct timeval' with 32-bit time_t. */
> +struct itimerval32
> +{
> + struct timeval32 it_interval;
> + struct timeval32 it_value;
> +};
> +
> +struct rusage32
> +{
> + struct timeval32 ru_utime; /* user time used */
> + struct timeval32 ru_stime; /* system time used */
> + long ru_maxrss; /* maximum resident set size */
> + long ru_ixrss; /* integral shared memory size */
> + long ru_idrss; /* integral unshared data size */
> + long ru_isrss; /* integral unshared stack size */
> + long ru_minflt; /* page reclaims */
> + long ru_majflt; /* page faults */
> + long ru_nswap; /* swaps */
> + long ru_inblock; /* block input operations */
> + long ru_oublock; /* block output operations */
> + long ru_msgsnd; /* messages sent */
> + long ru_msgrcv; /* messages received */
> + long ru_nsignals; /* signals received */
> + long ru_nvcsw; /* voluntary context switches */
> + long ru_nivcsw; /* involuntary " */
> +};
> +
> +/* Conversion functions. If the seconds field of a timeval32 would
> + overflow, they write { INT32_MAX, TV_USEC_MAX } to the output. */
> +
> +static inline void
> +tv32_to_tv64 (struct timeval *restrict tv64,
> + const struct timeval32 *restrict tv32)
> +{
> + tv64->tv_sec = tv32->tv_sec;
> + tv64->tv_usec = tv32->tv_usec;
> +}
> +
> +static inline void
> +tv32_to_ts64 (struct timespec *restrict ts64,
> + const struct timeval32 *restrict tv32)
> +{
> + ts64->tv_sec = tv32->tv_sec;
> + ts64->tv_nsec = tv32->tv_usec * 1000;
> +}
> +
> +static inline void
> +tv64_to_tv32 (struct timeval32 *restrict tv32,
> + const struct timeval *restrict tv64)
> +{
> + if (__glibc_unlikely (tv64->tv_sec > (time_t) INT32_MAX))
> + {
> + tv32->tv_sec = INT32_MAX;
> + tv32->tv_usec = TV_USEC_MAX;
> + }
> + else
> + {
> + tv32->tv_sec = tv64->tv_sec;
> + tv32->tv_usec = tv64->tv_usec;
> + }
> +}
> +
> +static inline void
> +ts64_to_tv32 (struct timeval32 *restrict tv32,
> + const struct timespec *restrict ts64)
> +{
> + if (__glibc_unlikely (ts64->tv_sec > (time_t) INT32_MAX))
> + {
> + tv32->tv_sec = INT32_MAX;
> + tv32->tv_usec = TV_USEC_MAX;
> + }
> + else
> + {
> + tv32->tv_sec = ts64->tv_sec;
> + tv32->tv_usec = ts64->tv_nsec / 1000;
> + }
> +}
> +
> +static inline void
> +rusage64_to_rusage32 (struct rusage32 *restrict r32,
> + const struct rusage *restrict r64)
> +{
> + /* Make sure the entire output structure is cleared, including
> + padding and reserved fields. */
> + memset (r32, 0, sizeof *r32);
> +
> + tv64_to_tv32 (&r32->ru_utime, &r64->ru_utime);
> + tv64_to_tv32 (&r32->ru_stime, &r64->ru_stime);
> + r32->ru_maxrss = r64->ru_maxrss;
> + r32->ru_ixrss = r64->ru_ixrss;
> + r32->ru_idrss = r64->ru_idrss;
> + r32->ru_isrss = r64->ru_isrss;
> + r32->ru_minflt = r64->ru_minflt;
> + r32->ru_majflt = r64->ru_majflt;
> + r32->ru_nswap = r64->ru_nswap;
> + r32->ru_inblock = r64->ru_inblock;
> + r32->ru_oublock = r64->ru_oublock;
> + r32->ru_msgsnd = r64->ru_msgsnd;
> + r32->ru_msgrcv = r64->ru_msgrcv;
> + r32->ru_nsignals = r64->ru_nsignals;
> + r32->ru_nvcsw = r64->ru_nvcsw;
> + r32->ru_nivcsw = r64->ru_nivcsw;
> +}
> +
> +#endif /* tv32-compat.h */
> diff --git a/sysdeps/unix/sysv/linux/gettimeofday.c b/sysdeps/unix/sysv/linux/gettimeofday.c
> index d69d4eaa96..c9597d6405 100644
> --- a/sysdeps/unix/sysv/linux/gettimeofday.c
> +++ b/sysdeps/unix/sysv/linux/gettimeofday.c
> @@ -30,10 +30,20 @@
> putting it into *tv and *tz. If tz is null, *tz is not filled.
> Returns 0 on success, -1 on errors. */
> int
> -__gettimeofday (struct timeval *tv, struct timezone *tz)
> +___gettimeofday (struct timeval *tv, struct timezone *tz)
> {
> return INLINE_VSYSCALL (gettimeofday, 2, tv, tz);
> }
> +
> +#ifdef VERSION_gettimeofday
> +weak_alias (___gettimeofday, __wgettimeofday);
> +default_symbol_version (___gettimeofday, __gettimeofday, VERSION_gettimeofday);
> +default_symbol_version (__wgettimeofday, gettimeofday, VERSION_gettimeofday);
> +libc_hidden_ver (___gettimeofday, __gettimeofday);
> +libc_hidden_ver (___gettimeofday, gettimeofday);
> +#else
> +strong_alias (___gettimeofday, __gettimeofday)
> +weak_alias (___gettimeofday, gettimeofday)
> libc_hidden_def (__gettimeofday)
> -weak_alias (__gettimeofday, gettimeofday)
> libc_hidden_weak (gettimeofday)
> +#endif
> diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list
> index e374f97b5f..cdcf6c127b 100644
> --- a/sysdeps/unix/sysv/linux/syscalls.list
> +++ b/sysdeps/unix/sysv/linux/syscalls.list
> @@ -1,6 +1,5 @@
> # File name Caller Syscall name Args Strong name Weak names
>
> -adjtimex adjtime adjtimex i:p __adjtimex adjtimex ntp_adjtime
> alarm - alarm i:i alarm
> bdflush EXTRA bdflush i:ii __compat_bdflush bdflush@GLIBC_2.0:GLIBC_2.23
> capget EXTRA capget i:pp capget
> --
> 2.17.1
>