diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/alpha/adjtime.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/alpha/adjtime.c | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/alpha/adjtime.c b/sysdeps/unix/sysv/linux/alpha/adjtime.c new file mode 100644 index 0000000000..f7df5fcc80 --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/adjtime.c @@ -0,0 +1,202 @@ +/* Copyright (C) 1998 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 Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +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 __adjtime_tv32 +#define ADJTIMEX(x) __adjtimex_tv32 (x) +#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING +#define LINKAGE +#else +#define LINKAGE static +#endif + +LINKAGE int ADJTIME (const struct TIMEVAL *itv, struct TIMEVAL *otv); +extern int ADJTIMEX (struct TIMEX *); + +#include <sysdeps/unix/sysv/linux/adjtime.c> + +#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING +symbol_version (__adjtime_tv32, adjtime, GLIBC_2.0); +#endif + +#undef TIMEVAL +#define TIMEVAL timeval +#undef TIMEX +#define TIMEX timex +#undef ADJTIME +#define ADJTIME __adjtime_tv64 +#undef ADJTIMEX +#define ADJTIMEX(x) __syscall_adjtimex_tv64 (x) +#undef LINKAGE +#define LINKAGE static + +LINKAGE int ADJTIME (const struct TIMEVAL *itv, struct TIMEVAL *otv); +extern int ADJTIMEX (struct TIMEX *); + +#include <sysdeps/unix/sysv/linux/adjtime.c> +static int missing_adjtimex = 0; + +int +__adjtime (itv, otv) + const struct timeval *itv; + struct timeval *otv; +{ + int ret; + + if (!missing_adjtimex) + { + ret = __adjtime_tv64 (itv, otv); + if (ret && errno == ENOSYS) + missing_adjtimex = 1; + } + + if (missing_adjtimex) + { + struct timeval32 itv32, otv32; + + itv32.tv_sec = itv->tv_sec; + itv32.tv_usec = itv->tv_usec; + ret = __adjtime_tv32 (&itv32, &otv32); + if (ret == 0) + { + otv->tv_sec = otv32.tv_sec; + otv->tv_usec = otv32.tv_usec; + } + } + + return ret; +} + +#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING +default_symbol_version (__adjtime, adjtime, GLIBC_2.1); +#else +weak_alias (__adjtime, adjtime); +#endif + +extern int __syscall_adjtimex_tv64 (struct timex *tx); + +int +__adjtimex_tv64 (tx) + struct timex *tx; +{ + int ret; + + if (!missing_adjtimex) + { + ret = __syscall_adjtimex_tv64 (tx); + if (ret && errno == ENOSYS) + missing_adjtimex = 1; + } + + if (missing_adjtimex) + { + struct timex32 tx32; + + tx32.modes = tx->modes; + tx32.offset = tx->offset; + tx32.freq = tx->freq; + tx32.maxerror = tx->maxerror; + tx32.esterror = tx->esterror; + tx32.status = tx->status; + tx32.constant = tx->constant; + tx32.precision = tx->precision; + tx32.tolerance = tx->tolerance; + tx32.time.tv_sec = tx->time.tv_sec; + tx32.time.tv_sec = tx->time.tv_usec; + tx32.tick = tx->tick; + tx32.ppsfreq = tx->ppsfreq; + tx32.jitter = tx->jitter; + tx32.shift = tx->shift; + tx32.stabil = tx->stabil; + tx32.jitcnt = tx->jitcnt; + tx32.calcnt = tx->calcnt; + tx32.errcnt = tx->errcnt; + tx32.stbcnt = tx->stbcnt; + + ret = __adjtimex_tv32 (&tx32); + if (ret == 0) + { + tx->modes = tx32.modes; + tx->offset = tx32.offset; + tx->freq = tx32.freq; + tx->maxerror = tx32.maxerror; + tx->esterror = tx32.esterror; + tx->status = tx32.status; + tx->constant = tx32.constant; + tx->precision = tx32.precision; + tx->tolerance = tx32.tolerance; + tx->time.tv_sec = tx32.time.tv_sec; + tx->time.tv_usec = tx32.time.tv_sec; + tx->tick = tx32.tick; + tx->ppsfreq = tx32.ppsfreq; + tx->jitter = tx32.jitter; + tx->shift = tx32.shift; + tx->stabil = tx32.stabil; + tx->jitcnt = tx32.jitcnt; + tx->calcnt = tx32.calcnt; + tx->errcnt = tx32.errcnt; + tx->stbcnt = tx32.stbcnt; + } + } + + return ret; +} + +#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING +strong_alias (__adjtimex_tv64, __adjtimex_tv64p); +default_symbol_version (__adjtimex_tv64, __adjtimex, GLIBC_2.1); +default_symbol_version (__adjtimex_tv64p, adjtimex, GLIBC_2.1); +#else +weak_alias (__adjtimex_tv64, __adjtimex); +weak_alias (__adjtimex_tv64, adjtimex); +#endif |