summaryrefslogtreecommitdiff
path: root/sysdeps/unix
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix')
-rw-r--r--sysdeps/unix/sysv/linux/Makefile2
-rw-r--r--sysdeps/unix/sysv/linux/adjtime.c40
-rw-r--r--sysdeps/unix/sysv/linux/adjtimex.c40
-rw-r--r--sysdeps/unix/sysv/linux/alpha/Makefile2
-rw-r--r--sysdeps/unix/sysv/linux/alpha/adjtime.c82
-rw-r--r--sysdeps/unix/sysv/linux/alpha/adjtimex.c22
-rw-r--r--sysdeps/unix/sysv/linux/alpha/osf_adjtime.c130
-rw-r--r--sysdeps/unix/sysv/linux/alpha/osf_getitimer.c43
-rw-r--r--sysdeps/unix/sysv/linux/alpha/osf_getrusage.c39
-rw-r--r--sysdeps/unix/sysv/linux/alpha/osf_gettimeofday.c43
-rw-r--r--sysdeps/unix/sysv/linux/alpha/osf_setitimer.c53
-rw-r--r--sysdeps/unix/sysv/linux/alpha/osf_settimeofday.c40
-rw-r--r--sysdeps/unix/sysv/linux/alpha/osf_utimes.c37
-rw-r--r--sysdeps/unix/sysv/linux/alpha/osf_wait4.c41
-rw-r--r--sysdeps/unix/sysv/linux/alpha/syscalls.list27
-rw-r--r--sysdeps/unix/sysv/linux/alpha/tv32-compat.h112
-rw-r--r--sysdeps/unix/sysv/linux/gettimeofday.c14
-rw-r--r--sysdeps/unix/sysv/linux/syscalls.list1
18 files changed, 637 insertions, 131 deletions
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);
+}
+
+#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..91ad8747da
--- /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 = valid_timeval_to_timeval64 (*itv);
+ struct timeval otv64;
+
+ if (__adjtime (&itv64, &otv64) == -1)
+ return -1;
+
+ *otv = valid_timeval64_to_timeval (otv64);
+ 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;
+ tx64.time = valid_timeval_to_timeval64 (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;
+ tx->time = valid_timeval64_to_timeval (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..8fe63a72a9
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/osf_getitimer.c
@@ -0,0 +1,43 @@
+/* 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. */
+ curr_value->it_interval
+ = valid_timeval64_to_timeval (curr_value_64.it_interval);
+ curr_value->it_value
+ = valid_timeval64_to_timeval (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..59fc614523
--- /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);
+
+ *tv32 = valid_timeval64_to_timeval (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..9184a88a8f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/osf_setitimer.c
@@ -0,0 +1,53 @@
+/* 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;
+ new_value_64.it_interval
+ = valid_timeval_to_timeval64 (new_value->it_interval);
+ new_value_64.it_value
+ = valid_timeval_to_timeval64 (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. */
+ old_value->it_interval
+ = valid_timeval64_to_timeval (old_value_64.it_interval);
+ old_value->it_value
+ = valid_timeval64_to_timeval (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..22de7b510c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/osf_settimeofday.c
@@ -0,0 +1,40 @@
+/* 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 = valid_timeval_to_timeval64 (*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..dbb72a921e
--- /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];
+ times[0] = valid_timeval_to_timeval64 (times32[0]);
+ times[1] = valid_timeval_to_timeval64 (times32[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..d0b4cdcef3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/tv32-compat.h
@@ -0,0 +1,112 @@
+/* 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 struct timeval
+valid_timeval_to_timeval64 (const struct timeval32 tv)
+{
+ return (struct timeval) { tv.tv_sec, tv.tv_usec };
+}
+
+static inline struct timeval32
+valid_timeval64_to_timeval (const struct timeval tv64)
+{
+ if (__glibc_unlikely (tv64.tv_sec > (time_t) INT32_MAX))
+ return (struct timeval32) { INT32_MAX, TV_USEC_MAX};
+ return (struct timeval32) { tv64.tv_sec, tv64.tv_usec };
+}
+
+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);
+
+ r32->ru_utime = valid_timeval64_to_timeval (r64->ru_utime);
+ r32->ru_stime = valid_timeval64_to_timeval (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