2fe8fb192f
There is important information about booting non-ack images in docs/UPDATING. ack/aout-format images can't be built any more, and booting clang/ELF-format ones is a little different. Updating to the new boot monitor is recommended. Changes in this commit: . drop boot monitor -> allowing dropping ack support . facility to copy ELF boot files to /boot so that old boot monitor can still boot fairly easily, see UPDATING . no more ack-format libraries -> single-case libraries . some cleanup of OBJECT_FMT, COMPILER_TYPE, etc cases . drop several ack toolchain commands, but not all support commands (e.g. aal is gone but acksize is not yet). . a few libc files moved to netbsd libc dir . new /bin/date as minix date used code in libc/ . test compile fix . harmonize includes . /usr/lib is no longer special: without ack, /usr/lib plays no kind of special bootstrapping role any more and bootstrapping is done exclusively through packages, so releases depend even less on the state of the machine making them now. . rename nbsd_lib* to lib* . reduce mtree
266 lines
7 KiB
C
266 lines
7 KiB
C
#ifndef _SYS_TIME_H_
|
|
#define _SYS_TIME_H_
|
|
|
|
#include <sys/featuretest.h>
|
|
#include <sys/types.h>
|
|
|
|
/*
|
|
* Structure returned by gettimeofday(2) system call,
|
|
* and used in other calls.
|
|
*/
|
|
struct timeval {
|
|
time_t tv_sec; /* seconds */
|
|
suseconds_t tv_usec; /* and microseconds */
|
|
};
|
|
|
|
/*
|
|
* Structure defined by POSIX.1b to be like a timeval.
|
|
*/
|
|
struct timespec {
|
|
time_t tv_sec; /* seconds */
|
|
long tv_nsec; /* and nanoseconds */
|
|
};
|
|
|
|
#if defined(_NETBSD_SOURCE)
|
|
#define TIMEVAL_TO_TIMESPEC(tv, ts) do { \
|
|
(ts)->tv_sec = (tv)->tv_sec; \
|
|
(ts)->tv_nsec = (tv)->tv_usec * 1000; \
|
|
} while (/*CONSTCOND*/0)
|
|
#define TIMESPEC_TO_TIMEVAL(tv, ts) do { \
|
|
(tv)->tv_sec = (ts)->tv_sec; \
|
|
(tv)->tv_usec = (suseconds_t)(ts)->tv_nsec / 1000; \
|
|
} while (/*CONSTCOND*/0)
|
|
|
|
/*
|
|
* Note: timezone is obsolete. All timezone handling is now in
|
|
* userland. Its just here for back compatibility.
|
|
*/
|
|
struct timezone {
|
|
int tz_minuteswest; /* minutes west of Greenwich */
|
|
int tz_dsttime; /* type of dst correction */
|
|
};
|
|
|
|
/* Operations on timevals. */
|
|
#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0L
|
|
#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)
|
|
#define timercmp(tvp, uvp, cmp) \
|
|
(((tvp)->tv_sec == (uvp)->tv_sec) ? \
|
|
((tvp)->tv_usec cmp (uvp)->tv_usec) : \
|
|
((tvp)->tv_sec cmp (uvp)->tv_sec))
|
|
#define timeradd(tvp, uvp, vvp) \
|
|
do { \
|
|
(vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \
|
|
(vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \
|
|
if ((vvp)->tv_usec >= 1000000) { \
|
|
(vvp)->tv_sec++; \
|
|
(vvp)->tv_usec -= 1000000; \
|
|
} \
|
|
} while (/* CONSTCOND */ 0)
|
|
#define timersub(tvp, uvp, vvp) \
|
|
do { \
|
|
(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
|
|
(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \
|
|
if ((vvp)->tv_usec < 0) { \
|
|
(vvp)->tv_sec--; \
|
|
(vvp)->tv_usec += 1000000; \
|
|
} \
|
|
} while (/* CONSTCOND */ 0)
|
|
|
|
|
|
/*
|
|
* hide bintime for _STANDALONE because this header is used for hpcboot.exe,
|
|
* which is built with compilers which don't recognize LL suffix.
|
|
* http://mail-index.NetBSD.org/tech-userlevel/2008/02/27/msg000181.html
|
|
*/
|
|
#if !defined(_STANDALONE)
|
|
struct bintime {
|
|
time_t sec;
|
|
uint64_t frac;
|
|
};
|
|
|
|
static __inline void
|
|
bintime_addx(struct bintime *bt, uint64_t x)
|
|
{
|
|
uint64_t u;
|
|
|
|
u = bt->frac;
|
|
bt->frac += x;
|
|
if (u > bt->frac)
|
|
bt->sec++;
|
|
}
|
|
|
|
static __inline void
|
|
bintime_add(struct bintime *bt, const struct bintime *bt2)
|
|
{
|
|
uint64_t u;
|
|
|
|
u = bt->frac;
|
|
bt->frac += bt2->frac;
|
|
if (u > bt->frac)
|
|
bt->sec++;
|
|
bt->sec += bt2->sec;
|
|
}
|
|
|
|
static __inline void
|
|
bintime_sub(struct bintime *bt, const struct bintime *bt2)
|
|
{
|
|
uint64_t u;
|
|
|
|
u = bt->frac;
|
|
bt->frac -= bt2->frac;
|
|
if (u < bt->frac)
|
|
bt->sec--;
|
|
bt->sec -= bt2->sec;
|
|
}
|
|
|
|
/*-
|
|
* Background information:
|
|
*
|
|
* When converting between timestamps on parallel timescales of differing
|
|
* resolutions it is historical and scientific practice to round down rather
|
|
* than doing 4/5 rounding.
|
|
*
|
|
* The date changes at midnight, not at noon.
|
|
*
|
|
* Even at 15:59:59.999999999 it's not four'o'clock.
|
|
*
|
|
* time_second ticks after N.999999999 not after N.4999999999
|
|
*/
|
|
|
|
static __inline void
|
|
bintime2timespec(const struct bintime *bt, struct timespec *ts)
|
|
{
|
|
|
|
ts->tv_sec = bt->sec;
|
|
ts->tv_nsec =
|
|
(long)(((uint64_t)1000000000 * (uint32_t)(bt->frac >> 32)) >> 32);
|
|
}
|
|
|
|
static __inline void
|
|
timespec2bintime(const struct timespec *ts, struct bintime *bt)
|
|
{
|
|
|
|
bt->sec = ts->tv_sec;
|
|
/* 18446744073 = int(2^64 / 1000000000) */
|
|
bt->frac = ts->tv_nsec * (uint64_t)18446744073LL;
|
|
}
|
|
|
|
static __inline void
|
|
bintime2timeval(const struct bintime *bt, struct timeval *tv)
|
|
{
|
|
|
|
tv->tv_sec = bt->sec;
|
|
tv->tv_usec =
|
|
(suseconds_t)(((uint64_t)1000000 * (uint32_t)(bt->frac >> 32)) >> 32);
|
|
}
|
|
|
|
static __inline void
|
|
timeval2bintime(const struct timeval *tv, struct bintime *bt)
|
|
{
|
|
|
|
bt->sec = tv->tv_sec;
|
|
/* 18446744073709 = int(2^64 / 1000000) */
|
|
bt->frac = tv->tv_usec * (uint64_t)18446744073709LL;
|
|
}
|
|
#endif /* !defined(_STANDALONE) */
|
|
|
|
/* Operations on timespecs. */
|
|
#define timespecclear(tsp) (tsp)->tv_sec = (time_t)((tsp)->tv_nsec = 0L)
|
|
#define timespecisset(tsp) ((tsp)->tv_sec || (tsp)->tv_nsec)
|
|
#define timespeccmp(tsp, usp, cmp) \
|
|
(((tsp)->tv_sec == (usp)->tv_sec) ? \
|
|
((tsp)->tv_nsec cmp (usp)->tv_nsec) : \
|
|
((tsp)->tv_sec cmp (usp)->tv_sec))
|
|
#define timespecadd(tsp, usp, vsp) \
|
|
do { \
|
|
(vsp)->tv_sec = (tsp)->tv_sec + (usp)->tv_sec; \
|
|
(vsp)->tv_nsec = (tsp)->tv_nsec + (usp)->tv_nsec; \
|
|
if ((vsp)->tv_nsec >= 1000000000L) { \
|
|
(vsp)->tv_sec++; \
|
|
(vsp)->tv_nsec -= 1000000000L; \
|
|
} \
|
|
} while (/* CONSTCOND */ 0)
|
|
#define timespecsub(tsp, usp, vsp) \
|
|
do { \
|
|
(vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec; \
|
|
(vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec; \
|
|
if ((vsp)->tv_nsec < 0) { \
|
|
(vsp)->tv_sec--; \
|
|
(vsp)->tv_nsec += 1000000000L; \
|
|
} \
|
|
} while (/* CONSTCOND */ 0)
|
|
#define timespec2ns(x) (((uint64_t)(x)->tv_sec) * 1000000000L + (x)->tv_nsec)
|
|
#endif /* _NETBSD_SOURCE */
|
|
|
|
/*
|
|
* Names of the interval timers, and structure
|
|
* defining a timer setting.
|
|
*/
|
|
#define ITIMER_REAL 0
|
|
#define ITIMER_VIRTUAL 1
|
|
#define ITIMER_PROF 2
|
|
|
|
struct itimerval {
|
|
struct timeval it_interval; /* timer interval */
|
|
struct timeval it_value; /* current value */
|
|
};
|
|
|
|
/*
|
|
* Structure defined by POSIX.1b to be like a itimerval, but with
|
|
* timespecs. Used in the timer_*() system calls.
|
|
*/
|
|
struct itimerspec {
|
|
struct timespec it_interval;
|
|
struct timespec it_value;
|
|
};
|
|
|
|
#ifndef __minix
|
|
#define CLOCK_REALTIME 0
|
|
#define CLOCK_VIRTUAL 1
|
|
#define CLOCK_PROF 2
|
|
#define CLOCK_MONOTONIC 3
|
|
#endif
|
|
|
|
#if defined(_NETBSD_SOURCE)
|
|
#define TIMER_RELTIME 0x0 /* relative timer */
|
|
#endif
|
|
#define TIMER_ABSTIME 0x1 /* absolute timer */
|
|
|
|
#ifdef _KERNEL
|
|
#include <sys/timevar.h>
|
|
#else /* !_KERNEL */
|
|
#ifndef _STANDALONE
|
|
#if (_POSIX_C_SOURCE - 0) >= 200112L || \
|
|
(defined(_XOPEN_SOURCE) && defined(_XOPEN_SOURCE_EXTENDED)) || \
|
|
(_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE)
|
|
#include <sys/select.h>
|
|
#endif
|
|
|
|
#include <sys/cdefs.h>
|
|
#include <time.h>
|
|
|
|
__BEGIN_DECLS
|
|
#ifndef __LIBC12_SOURCE__
|
|
#if (_POSIX_C_SOURCE - 0) >= 200112L || \
|
|
defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE)
|
|
int getitimer(int, struct itimerval *) __RENAME(__getitimer50);
|
|
int gettimeofday(struct timeval * __restrict, void *__restrict);
|
|
int setitimer(int, const struct itimerval * __restrict,
|
|
struct itimerval * __restrict) __RENAME(__setitimer50);
|
|
#endif /* _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE || _NETBSD_SOURCE */
|
|
|
|
#if defined(_NETBSD_SOURCE) || defined(HAVE_NBTOOL_CONFIG_H)
|
|
#ifndef __minix
|
|
int adjtime(const struct timeval *, struct timeval *) __RENAME(__adjtime50);
|
|
int futimes(int, const struct timeval [2]) __RENAME(__futimes50);
|
|
int lutimes(const char *, const struct timeval [2]) __RENAME(__lutimes50);
|
|
#endif /* !__minix */
|
|
int settimeofday(const struct timeval * __restrict,
|
|
const void *__restrict) __RENAME(__settimeofday50);
|
|
#endif /* _NETBSD_SOURCE */
|
|
#endif /* __LIBC12_SOURCE__ */
|
|
__END_DECLS
|
|
|
|
#endif /* !_STANDALONE */
|
|
#endif /* !_KERNEL */
|
|
#endif /* !_SYS_TIME_H_ */
|