Commit Graph

5 Commits

Author SHA1 Message Date
Alistair Francis
0bcd0c5100 sysv/alpha: Use generic __timeval32 and helpers
Now there is a generic __timeval32 and helpers we can use them for Alpha
instead of the Alpha specific ones.

Reviewed-by: Lukasz Majewski <lukma@denx.de>
Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
2020-04-02 09:21:06 -07:00
Alistair Francis
4da2597af5 sysv/linux: Rename alpha functions to be alpha specific
These functions are alpha specifc, rename them to be clear.

Let's also rename the header file from tv32-compat.h to
alpha-tv32-compat.h. This is to avoid conflicts with the one we will
introduce later.

Reviewed-by: Lukasz Majewski <lukma@denx.de>
Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
2020-03-27 11:23:15 -07:00
Joseph Myers
d614a75396 Update copyright dates with scripts/update-copyrights. 2020-01-01 00:14:33 +00:00
Zack Weinberg
c3f9aef063 Use clock_settime to implement settimeofday.
Unconditionally, on all ports, use clock_settime to implement
settimeofday.  Remove sysdeps/unix/clock_settime.c, which implemented
clock_settime by calling settimeofday; new OS ports must henceforth
provide a real implementation of clock_settime.

Hurd had a real implementation of settimeofday but not of
clock_settime; this patch converts it into an implementation of
clock_settime.  It only supports CLOCK_REALTIME and microsecond
resolution; Hurd/Mach does not appear to have any support for
finer-resolution clocks.

The vestigial "set time zone" feature of settimeofday complicates the
generic settimeofday implementation a little.  The only remaining uses
of this feature that aren't just bugs, are using it to inform the
Linux kernel of the offset between the hardware clock and UTC, on
systems where the hardware clock doesn't run in UTC (usually because
of dual-booting with Windows).  There currently isn't any other way to
do this.  However, the callers that do this call settimeofday with
_only_ the timezone argument non-NULL.  Therefore, glibc's new
behavior is: callers of settimeofday must supply one and only one of
the two arguments.  If both arguments are non-NULL, or both arguments
are NULL, the call fails and sets errno to EINVAL.

When only the timeval argument is supplied, settimeofday calls
__clock_settime(CLOCK_REALTIME), same as stime.

When only the timezone argument is supplied, settimeofday calls a new
internal function called __settimezone.  On Linux, only, this function
will pass the timezone structure to the settimeofday system call.  On
all other operating systems, and on Linux architectures that don't
define __NR_settimeofday, __settimezone is a stub that always sets
errno to ENOSYS and returns -1.

The settimeoday syscall is enabled on Linux by the flag
COMPAT_32BIT_TIME, which is an option to either 32-bits ABIs or COMPAT
builds (defined usually by 64-bit kernels that want to support 32-bit
 ABIs, such as x86).  The idea to future 64-bit time_t only ABIs
is to not provide settimeofday syscall.

The same semantics are implemented for Linux/Alpha's GLIBC_2.0 compat
symbol for settimeofday.

There are no longer any internal callers of __settimeofday, so the
internal prototype is removed.

Checked on x86_64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu,
powerpc64-linux-gnu, powerpc-linux-gnu, and aarch64-linux-gnu.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Reviewed-by: Lukasz Majewski <lukma@denx.de>
2019-10-30 17:05:14 -03:00
Zack Weinberg
04da832e16 Linux/Alpha: don't use timeval32 system calls.
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>
2019-10-30 17:03:42 -03:00