a180a41bba1d50822df23fff0099e90b86638b89vboxsync/** @file
a180a41bba1d50822df23fff0099e90b86638b89vboxsync System-specific declarations and macros related to time.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync This program and the accompanying materials are licensed and made available under
a180a41bba1d50822df23fff0099e90b86638b89vboxsync the terms and conditions of the BSD License that accompanies this distribution.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync The full text of the license may be found at
a180a41bba1d50822df23fff0099e90b86638b89vboxsync http://opensource.org/licenses/bsd-license.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Copyright (c) 1982, 1986, 1993
a180a41bba1d50822df23fff0099e90b86638b89vboxsync The Regents of the University of California. All rights reserved.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Redistribution and use in source and binary forms, with or without
a180a41bba1d50822df23fff0099e90b86638b89vboxsync modification, are permitted provided that the following conditions
a180a41bba1d50822df23fff0099e90b86638b89vboxsync are met:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 1. Redistributions of source code must retain the above copyright
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync notice, this list of conditions and the following disclaimer.
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync 2. Redistributions in binary form must reproduce the above copyright
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync notice, this list of conditions and the following disclaimer in the
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync documentation and/or other materials provided with the distribution.
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync 3. Neither the name of the University nor the names of its contributors
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync may be used to endorse or promote products derived from this software
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync without specific prior written permission.
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
a180a41bba1d50822df23fff0099e90b86638b89vboxsync IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
a180a41bba1d50822df23fff0099e90b86638b89vboxsync FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
a180a41bba1d50822df23fff0099e90b86638b89vboxsync DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
a180a41bba1d50822df23fff0099e90b86638b89vboxsync OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
a180a41bba1d50822df23fff0099e90b86638b89vboxsync LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
a180a41bba1d50822df23fff0099e90b86638b89vboxsync OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
a180a41bba1d50822df23fff0099e90b86638b89vboxsync SUCH DAMAGE.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync time.h 8.5 (Berkeley) 5/4/95
a180a41bba1d50822df23fff0099e90b86638b89vboxsync NetBSD: time.h,v 1.56 2006/06/18 21:09:24 uwe Exp
a180a41bba1d50822df23fff0099e90b86638b89vboxsync */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef _SYS_TIME_H_
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define _SYS_TIME_H_
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <Uefi.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <sys/featuretest.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <sys/types.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/*
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * Traditional *nix structure returned by gettimeofday(2) system call,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * and used in other calls.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstruct timeval {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync LONG32 tv_sec; /* seconds */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync LONG32 tv_usec; /* and microseconds */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync};
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/*
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * Structure defined by POSIX.1b to be like a timeval.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * This works within EFI since the times really are time_t.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstruct timespec {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync time_t tv_sec; /* seconds */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync LONG32 tv_nsec; /* and nanoseconds */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync};
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define TIMEVAL_TO_TIMESPEC(tv, ts) do { \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (ts)->tv_sec = (tv)->tv_sec; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (ts)->tv_nsec = (tv)->tv_usec * 1000; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync} while (/*CONSTCOND*/0)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define TIMESPEC_TO_TIMEVAL(tv, ts) do { \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (tv)->tv_sec = (ts)->tv_sec; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (tv)->tv_usec = (ts)->tv_nsec / 1000; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync} while (/*CONSTCOND*/0)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Operations on timevals. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define timercmp(tvp, uvp, cmp) \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (((tvp)->tv_sec == (uvp)->tv_sec) ? \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ((tvp)->tv_usec cmp (uvp)->tv_usec) : \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ((tvp)->tv_sec cmp (uvp)->tv_sec))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define timeradd(tvp, uvp, vvp) \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync do { \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if ((vvp)->tv_usec >= 1000000) { \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (vvp)->tv_sec++; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (vvp)->tv_usec -= 1000000; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync } \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync } while (/* CONSTCOND */ 0)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define timersub(tvp, uvp, vvp) \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync do { \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if ((vvp)->tv_usec < 0) { \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (vvp)->tv_sec--; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (vvp)->tv_usec += 1000000; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync } \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync } while (/* CONSTCOND */ 0)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Operations on timespecs. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define timespecclear(tsp) (tsp)->tv_sec = (tsp)->tv_nsec = 0
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define timespecisset(tsp) ((tsp)->tv_sec || (tsp)->tv_nsec)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define timespeccmp(tsp, usp, cmp) \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (((tsp)->tv_sec == (usp)->tv_sec) ? \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ((tsp)->tv_nsec cmp (usp)->tv_nsec) : \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ((tsp)->tv_sec cmp (usp)->tv_sec))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define timespecadd(tsp, usp, vsp) \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync do { \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (vsp)->tv_sec = (tsp)->tv_sec + (usp)->tv_sec; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (vsp)->tv_nsec = (tsp)->tv_nsec + (usp)->tv_nsec; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if ((vsp)->tv_nsec >= 1000000000L) { \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (vsp)->tv_sec++; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (vsp)->tv_nsec -= 1000000000L; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync } \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync } while (/* CONSTCOND */ 0)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define timespecsub(tsp, usp, vsp) \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync do { \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if ((vsp)->tv_nsec < 0) { \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (vsp)->tv_sec--; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (vsp)->tv_nsec += 1000000000L; \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync } \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync } while (/* CONSTCOND */ 0)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/*
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * Names of the interval timers, and structure
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * defining a timer setting.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define ITIMER_REAL 0
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define ITIMER_VIRTUAL 1
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define ITIMER_PROF 2
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstruct itimerval {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync struct timeval it_interval; /* timer interval */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync struct timeval it_value; /* current value */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync};
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/*
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * Structure defined by POSIX.1b to be like a itimerval, but with
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * timespecs. Used in the timer_*() system calls.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstruct itimerspec {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync struct timespec it_interval;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync struct timespec it_value;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync};
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define CLOCK_REALTIME 0
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define CLOCK_VIRTUAL 1
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define CLOCK_PROF 2
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define CLOCK_MONOTONIC 3
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define TIMER_RELTIME 0x0 /* relative timer */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define TIMER_ABSTIME 0x1 /* absolute timer */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#if 0
a180a41bba1d50822df23fff0099e90b86638b89vboxsync #if (_POSIX_C_SOURCE - 0) >= 200112L || \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (defined(_XOPEN_SOURCE) && defined(_XOPEN_SOURCE_EXTENDED)) || \
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync #include <sys/select.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync #endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif /* if 0 */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <sys/EfiCdefs.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <time.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Functions useful for dealing with EFI */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync__BEGIN_DECLS
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Convert an EFI_TIME structure into a time_t value. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsynctime_t Efi2Time( EFI_TIME *EfiBDtime);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Convert a time_t value into an EFI_TIME structure.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync It is the caller's responsibility to free the returned structure.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync*/
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncEFI_TIME * Time2Efi(time_t OTime);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Convert an EFI_TIME structure into a C Standard tm structure. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncvoid Efi2Tm( EFI_TIME *EfiBDtime, struct tm *NewTime);
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncvoid Tm2Efi( struct tm *BdTime, EFI_TIME *ETime);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* BSD compatibility functions */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncint gettimeofday (struct timeval *tp, void *ignore);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* POSIX compatibility functions */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncint getitimer (int which, struct itimerval *value);
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncint setitimer (int which, const struct itimerval *value, struct itimerval *ovalue);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync__END_DECLS
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif /* !_SYS_TIME_H_ */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync