glibc/sysdeps/unix/sysv/linux/include/sys/timex.h

201 lines
6.2 KiB
C
Raw Normal View History

/* Internal declarations for sys/timex.h.
Copyright (C) 2014-2022 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
Prefer https to http for gnu.org and fsf.org URLs Also, change sources.redhat.com to sourceware.org. This patch was automatically generated by running the following shell script, which uses GNU sed, and which avoids modifying files imported from upstream: sed -ri ' s,(http|ftp)(://(.*\.)?(gnu|fsf|sourceware)\.org($|[^.]|\.[^a-z])),https\2,g s,(http|ftp)(://(.*\.)?)sources\.redhat\.com($|[^.]|\.[^a-z]),https\2sourceware.org\4,g ' \ $(find $(git ls-files) -prune -type f \ ! -name '*.po' \ ! -name 'ChangeLog*' \ ! -path COPYING ! -path COPYING.LIB \ ! -path manual/fdl-1.3.texi ! -path manual/lgpl-2.1.texi \ ! -path manual/texinfo.tex ! -path scripts/config.guess \ ! -path scripts/config.sub ! -path scripts/install-sh \ ! -path scripts/mkinstalldirs ! -path scripts/move-if-change \ ! -path INSTALL ! -path locale/programs/charmap-kw.h \ ! -path po/libc.pot ! -path sysdeps/gnu/errlist.c \ ! '(' -name configure \ -execdir test -f configure.ac -o -f configure.in ';' ')' \ ! '(' -name preconfigure \ -execdir test -f preconfigure.ac ';' ')' \ -print) and then by running 'make dist-prepare' to regenerate files built from the altered files, and then executing the following to cleanup: chmod a+x sysdeps/unix/sysv/linux/riscv/configure # Omit irrelevant whitespace and comment-only changes, # perhaps from a slightly-different Autoconf version. git checkout -f \ sysdeps/csky/configure \ sysdeps/hppa/configure \ sysdeps/riscv/configure \ sysdeps/unix/sysv/linux/csky/configure # Omit changes that caused a pre-commit check to fail like this: # remote: *** error: sysdeps/powerpc/powerpc64/ppc-mcount.S: trailing lines git checkout -f \ sysdeps/powerpc/powerpc64/ppc-mcount.S \ sysdeps/unix/sysv/linux/s390/s390-64/syscall.S # Omit change that caused a pre-commit check to fail like this: # remote: *** error: sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: last line does not end in newline git checkout -f sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S
2019-09-07 05:40:42 +00:00
<https://www.gnu.org/licenses/>. */
#ifndef _INCLUDE_SYS_TIMEX_H
#define _INCLUDE_SYS_TIMEX_H 1
#include_next <sys/timex.h>
Installed header hygiene (BZ#20366): Test of installed headers. This adds a test to ensure that the problems fixed in the last several patches do not recur. Each directory checks the headers that it installs for two properties: first, each header must be compilable in isolation, as both C and C++, under a representative combination of language and library conformance levels; second, there is a blacklist of identifiers that may not appear in any installed header, currently consisting of the legacy BSD typedefs. (There is an exemption for the headers that define those typedefs, and for the RPC headers. It may be necessary to make this more sophisticated if we add more stuff to the blacklist in the future.) In order for this test to work correctly, every wrapper header that actually defines something must guard those definitions with #ifndef _ISOMAC. This is the existing mechanism used by the conform/ tests to tell wrapper headers not to define anything that the public header wouldn't, and not to use anything from libc-symbols.h. conform/ only cares for headers that we need to check for standards conformance, whereas this test applies to *every* header. (Headers in include/ that are either installed directly, or are internal-use-only and do *not* correspond to any installed header, are not affected.) * scripts/check-installed-headers.sh: New script. * Rules: In each directory that defines header files to be installed, run check-installed-headers.sh on them as a special test. * Makefile: Likewise for the headers installed at top level. * include/aliases.h, include/alloca.h, include/argz.h * include/arpa/nameser.h, include/arpa/nameser_compat.h * include/elf.h, include/envz.h, include/err.h * include/execinfo.h, include/fpu_control.h, include/getopt.h * include/gshadow.h, include/ifaddrs.h, include/libintl.h * include/link.h, include/malloc.h, include/mcheck.h * include/mntent.h, include/netinet/ether.h * include/nss.h, include/obstack.h, include/printf.h * include/pty.h, include/resolv.h, include/rpc/auth.h * include/rpc/auth_des.h, include/rpc/auth_unix.h * include/rpc/clnt.h, include/rpc/des_crypt.h * include/rpc/key_prot.h, include/rpc/netdb.h * include/rpc/pmap_clnt.h, include/rpc/pmap_prot.h * include/rpc/pmap_rmt.h, include/rpc/rpc.h * include/rpc/rpc_msg.h, include/rpc/svc.h * include/rpc/svc_auth.h, include/rpc/xdr.h * include/rpcsvc/nis_callback.h, include/rpcsvc/nislib.h * include/rpcsvc/yp.h, include/rpcsvc/ypclnt.h * include/rpcsvc/ypupd.h, include/shadow.h * include/stdio_ext.h, include/sys/epoll.h * include/sys/file.h, include/sys/gmon.h, include/sys/ioctl.h * include/sys/prctl.h, include/sys/profil.h * include/sys/statfs.h, include/sys/sysctl.h * include/sys/sysinfo.h, include/ttyent.h, include/utmp.h * sysdeps/arm/nacl/include/bits/setjmp.h * sysdeps/mips/include/sys/asm.h * sysdeps/unix/sysv/linux/include/sys/sysinfo.h * sysdeps/unix/sysv/linux/include/sys/timex.h * sysdeps/x86/fpu/include/bits/fenv.h: Add #ifndef _ISOMAC guard around internal declarations. Add multiple-inclusion guard if not already present.
2016-08-24 01:19:17 +00:00
# ifndef _ISOMAC
extern int __adjtimex (struct timex *__ntx) __nonnull ((1));
libc_hidden_proto (__adjtimex)
# include <time.h>
# include <struct___timeval64.h>
/* Local definition of 64 bit time supporting timex struct */
# if __TIMESIZE == 64
# define __timex64 timex
y2038: linux: Provide __clock_adjtime64 implementation This patch replaces auto generated wrapper (as described in sysdeps/unix/sysv/linux/syscalls.list) for clock_adjtime with one which adds extra support for reading 64 bit time values on machines with __TIMESIZE != 64. To achieve this goal new __clock_adjtime64 explicit 64 bit function for adjusting Linux clock has been added. Moreover, a 32 bit version - __clock_adjtime has been refactored to internally use __clock_adjtime64. The __clock_adjtime is now supposed to be used on systems still supporting 32 bit time (__TIMESIZE != 64) - hence the necessary conversions between 64 bit struct __timespec64 and struct timespec. The new __clock_adjtime64 syscall available from Linux 5.1+ has been used, when applicable. Up till v5.4 in the Linux kernel there was a bug preventing this call from obtaining correct struct's timex time.tv_sec time after time_t overflow (i.e. not being Y2038 safe). Build tests: - ./src/scripts/build-many-glibcs.py glibcs Run-time tests: - Run specific tests on ARM/x86 32bit systems (qemu): https://github.com/lmajewski/meta-y2038 and run tests: https://github.com/lmajewski/y2038-tests/commits/master Linux kernel, headers and minimal kernel version for glibc build test matrix: - Linux v5.1 (with clock_adjtime64) and glibc build with v5.1 as minimal kernel version (--enable-kernel="5.1.0") The __ASSUME_TIME64_SYSCALLS flag defined. - Linux v5.1 and default minimal kernel version The __ASSUME_TIME64_SYSCALLS not defined, but kernel supports clock_adjtime64 syscall. - Linux v4.19 (no clock_adjtime64 support) with default minimal kernel version for contemporary glibc (3.2.0) This kernel doesn't support clock_adjtime64 syscall, so the fallback to clock_adjtime is tested. Above tests were performed with Y2038 redirection applied as well as without (so the __TIMESIZE != 64 execution path is checked as well). No regressions were observed. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2020-04-21 17:14:18 +00:00
# define __clock_adjtime64 __clock_adjtime
# define ___adjtimex64 ___adjtimex
# define __ntptimeval64 ntptimeval
# define __ntp_gettime64 __ntp_gettime
# define __ntp_gettimex64 __ntp_gettimex
# else
struct __timex64
{
unsigned int modes; /* mode selector */
int :32; /* pad */
long long int offset; /* time offset (usec) */
long long int freq; /* frequency offset (scaled ppm) */
long long int maxerror; /* maximum error (usec) */
long long int esterror; /* estimated error (usec) */
int status; /* clock command/status */
int :32; /* pad */
long long int constant; /* pll time constant */
long long int precision; /* clock precision (usec) (read only) */
long long int tolerance; /* clock frequency tolerance (ppm) (ro) */
struct __timeval64 time; /* (read only, except for ADJ_SETOFFSET) */
long long int tick; /* (modified) usecs between clock ticks */
long long int ppsfreq; /* pps frequency (scaled ppm) (ro) */
long long int jitter; /* pps jitter (us) (ro) */
int shift; /* interval duration (s) (shift) (ro) */
int :32; /* pad */
long long int stabil; /* pps stability (scaled ppm) (ro) */
long long int jitcnt; /* jitter limit exceeded (ro) */
long long int calcnt; /* calibration intervals (ro) */
long long int errcnt; /* calibration errors (ro) */
long long int stbcnt; /* stability limit exceeded (ro) */
int tai; /* TAI offset (ro) */
int :32;
int :32;
int :32;
int :32;
int :32;
int :32;
int :32;
int :32;
int :32;
int :32;
int :32;
};
extern int __clock_adjtime64 (const clockid_t clock_id, struct __timex64 *tx64) __nonnull((2));
y2038: linux: Provide __clock_adjtime64 implementation This patch replaces auto generated wrapper (as described in sysdeps/unix/sysv/linux/syscalls.list) for clock_adjtime with one which adds extra support for reading 64 bit time values on machines with __TIMESIZE != 64. To achieve this goal new __clock_adjtime64 explicit 64 bit function for adjusting Linux clock has been added. Moreover, a 32 bit version - __clock_adjtime has been refactored to internally use __clock_adjtime64. The __clock_adjtime is now supposed to be used on systems still supporting 32 bit time (__TIMESIZE != 64) - hence the necessary conversions between 64 bit struct __timespec64 and struct timespec. The new __clock_adjtime64 syscall available from Linux 5.1+ has been used, when applicable. Up till v5.4 in the Linux kernel there was a bug preventing this call from obtaining correct struct's timex time.tv_sec time after time_t overflow (i.e. not being Y2038 safe). Build tests: - ./src/scripts/build-many-glibcs.py glibcs Run-time tests: - Run specific tests on ARM/x86 32bit systems (qemu): https://github.com/lmajewski/meta-y2038 and run tests: https://github.com/lmajewski/y2038-tests/commits/master Linux kernel, headers and minimal kernel version for glibc build test matrix: - Linux v5.1 (with clock_adjtime64) and glibc build with v5.1 as minimal kernel version (--enable-kernel="5.1.0") The __ASSUME_TIME64_SYSCALLS flag defined. - Linux v5.1 and default minimal kernel version The __ASSUME_TIME64_SYSCALLS not defined, but kernel supports clock_adjtime64 syscall. - Linux v4.19 (no clock_adjtime64 support) with default minimal kernel version for contemporary glibc (3.2.0) This kernel doesn't support clock_adjtime64 syscall, so the fallback to clock_adjtime is tested. Above tests were performed with Y2038 redirection applied as well as without (so the __TIMESIZE != 64 execution path is checked as well). No regressions were observed. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
2020-04-21 17:14:18 +00:00
libc_hidden_proto (__clock_adjtime64);
extern int ___adjtimex64 (struct __timex64 *tx64) __nonnull ((1));
libc_hidden_proto (___adjtimex64)
struct __ntptimeval64
{
struct __timeval64 time; /* current time (ro) */
long int maxerror; /* maximum error (us) (ro) */
long int esterror; /* estimated error (us) (ro) */
long int tai; /* TAI offset (ro) */
long int __glibc_reserved1;
long int __glibc_reserved2;
long int __glibc_reserved3;
long int __glibc_reserved4;
};
extern int __ntp_gettime64 (struct __ntptimeval64 *ntv) __nonnull ((1));
libc_hidden_proto (__ntp_gettime64)
extern int __ntp_gettimex64 (struct __ntptimeval64 *ntv) __nonnull ((1));
libc_hidden_proto (__ntp_gettimex64)
# endif
/* Convert a known valid struct timex into a struct __timex64. */
static inline struct __timex64
valid_timex_to_timex64 (const struct timex tx)
{
struct __timex64 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.time = valid_timeval_to_timeval64 (tx.time);
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.tai = tx.tai;
return tx64;
}
/* Convert a known valid struct __timex64 into a struct timex. */
static inline struct timex
valid_timex64_to_timex (const struct __timex64 tx64)
{
struct timex 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.time = valid_timeval64_to_timeval (tx64.time);
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.tai = tx64.tai;
return tx;
}
/* Convert a known valid struct ntptimeval into a struct __ntptimeval64. */
static inline struct __ntptimeval64
valid_ntptimeval_to_ntptimeval64 (const struct ntptimeval ntv)
{
struct __ntptimeval64 ntv64;
ntv64.time = valid_timeval_to_timeval64 (ntv.time);
ntv64.maxerror = ntv.maxerror;
ntv64.esterror = ntv.esterror;
ntv64.tai = ntv.tai;
ntv64.__glibc_reserved1 = 0;
ntv64.__glibc_reserved2 = 0;
ntv64.__glibc_reserved3 = 0;
ntv64.__glibc_reserved4 = 0;
return ntv64;
}
/* Convert a known valid struct __ntptimeval64 into a struct ntptimeval. */
static inline struct ntptimeval
valid_ntptimeval64_to_ntptimeval (const struct __ntptimeval64 ntp64)
{
struct ntptimeval ntp;
ntp.time = valid_timeval64_to_timeval (ntp64.time);
ntp.maxerror = ntp64.maxerror;
ntp.esterror = ntp64.esterror;
ntp.tai = ntp64.tai;
ntp.__glibc_reserved1 = 0;
ntp.__glibc_reserved2 = 0;
ntp.__glibc_reserved3 = 0;
ntp.__glibc_reserved4 = 0;
return ntp;
}
Installed header hygiene (BZ#20366): Test of installed headers. This adds a test to ensure that the problems fixed in the last several patches do not recur. Each directory checks the headers that it installs for two properties: first, each header must be compilable in isolation, as both C and C++, under a representative combination of language and library conformance levels; second, there is a blacklist of identifiers that may not appear in any installed header, currently consisting of the legacy BSD typedefs. (There is an exemption for the headers that define those typedefs, and for the RPC headers. It may be necessary to make this more sophisticated if we add more stuff to the blacklist in the future.) In order for this test to work correctly, every wrapper header that actually defines something must guard those definitions with #ifndef _ISOMAC. This is the existing mechanism used by the conform/ tests to tell wrapper headers not to define anything that the public header wouldn't, and not to use anything from libc-symbols.h. conform/ only cares for headers that we need to check for standards conformance, whereas this test applies to *every* header. (Headers in include/ that are either installed directly, or are internal-use-only and do *not* correspond to any installed header, are not affected.) * scripts/check-installed-headers.sh: New script. * Rules: In each directory that defines header files to be installed, run check-installed-headers.sh on them as a special test. * Makefile: Likewise for the headers installed at top level. * include/aliases.h, include/alloca.h, include/argz.h * include/arpa/nameser.h, include/arpa/nameser_compat.h * include/elf.h, include/envz.h, include/err.h * include/execinfo.h, include/fpu_control.h, include/getopt.h * include/gshadow.h, include/ifaddrs.h, include/libintl.h * include/link.h, include/malloc.h, include/mcheck.h * include/mntent.h, include/netinet/ether.h * include/nss.h, include/obstack.h, include/printf.h * include/pty.h, include/resolv.h, include/rpc/auth.h * include/rpc/auth_des.h, include/rpc/auth_unix.h * include/rpc/clnt.h, include/rpc/des_crypt.h * include/rpc/key_prot.h, include/rpc/netdb.h * include/rpc/pmap_clnt.h, include/rpc/pmap_prot.h * include/rpc/pmap_rmt.h, include/rpc/rpc.h * include/rpc/rpc_msg.h, include/rpc/svc.h * include/rpc/svc_auth.h, include/rpc/xdr.h * include/rpcsvc/nis_callback.h, include/rpcsvc/nislib.h * include/rpcsvc/yp.h, include/rpcsvc/ypclnt.h * include/rpcsvc/ypupd.h, include/shadow.h * include/stdio_ext.h, include/sys/epoll.h * include/sys/file.h, include/sys/gmon.h, include/sys/ioctl.h * include/sys/prctl.h, include/sys/profil.h * include/sys/statfs.h, include/sys/sysctl.h * include/sys/sysinfo.h, include/ttyent.h, include/utmp.h * sysdeps/arm/nacl/include/bits/setjmp.h * sysdeps/mips/include/sys/asm.h * sysdeps/unix/sysv/linux/include/sys/sysinfo.h * sysdeps/unix/sysv/linux/include/sys/timex.h * sysdeps/x86/fpu/include/bits/fenv.h: Add #ifndef _ISOMAC guard around internal declarations. Add multiple-inclusion guard if not already present.
2016-08-24 01:19:17 +00:00
# endif /* _ISOMAC */
#endif /* sys/timex.h */