diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-04-07 12:58:43 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2016-04-08 11:34:42 +0200 |
commit | 3156cdcc805840b77a56a1b6c740be7dcb447c99 (patch) | |
tree | 11d70ce76fa6afded37e6e55db65cbd4f55f57b2 /newlib/libc/sys/rtems | |
parent | 3fc46dc562e70f28919df666abd7d613993a843d (diff) | |
download | cygnal-3156cdcc805840b77a56a1b6c740be7dcb447c99.tar.gz cygnal-3156cdcc805840b77a56a1b6c740be7dcb447c99.tar.bz2 cygnal-3156cdcc805840b77a56a1b6c740be7dcb447c99.zip |
Move kernel dependent parts of <sys/time.h>cygwin-2_5_0-release
Move the kernel dependent parts of <sys/time.h> to new system-specific
header file <machine/_time.h>. Provide an empty default implementation.
Add a specialized implementation for RTEMS.
Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
Diffstat (limited to 'newlib/libc/sys/rtems')
-rw-r--r-- | newlib/libc/sys/rtems/include/machine/_time.h | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/newlib/libc/sys/rtems/include/machine/_time.h b/newlib/libc/sys/rtems/include/machine/_time.h new file mode 100644 index 000000000..44a220d92 --- /dev/null +++ b/newlib/libc/sys/rtems/include/machine/_time.h @@ -0,0 +1,199 @@ +/*- + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)time.h 8.5 (Berkeley) 5/4/95 + * $FreeBSD$ + */ + +#ifndef _SYS_TIME_H_ +#error "must be included via <sys/time.h>" +#else /* _SYS_TIME_H_ */ + +__BEGIN_DECLS +extern volatile time_t _Timecounter_Time_second; +extern volatile time_t _Timecounter_Time_uptime; +extern struct bintime _Timecounter_Boottimebin; + +void _Timecounter_Binuptime(struct bintime *); +void _Timecounter_Nanouptime(struct timespec *); +void _Timecounter_Microuptime(struct timeval *); +void _Timecounter_Bintime(struct bintime *); +void _Timecounter_Nanotime(struct timespec *); +void _Timecounter_Microtime(struct timeval *); +void _Timecounter_Getbinuptime(struct bintime *); +void _Timecounter_Getnanouptime(struct timespec *); +void _Timecounter_Getmicrouptime(struct timeval *); +void _Timecounter_Getbintime(struct bintime *); +void _Timecounter_Getnanotime(struct timespec *); +void _Timecounter_Getmicrotime(struct timeval *); +__END_DECLS + +#ifdef _KERNEL + +/* Operations on timespecs */ +#define timespecclear(tvp) ((tvp)->tv_sec = (tvp)->tv_nsec = 0) +#define timespecisset(tvp) ((tvp)->tv_sec || (tvp)->tv_nsec) +#define timespeccmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec == (uvp)->tv_sec) ? \ + ((tvp)->tv_nsec cmp (uvp)->tv_nsec) : \ + ((tvp)->tv_sec cmp (uvp)->tv_sec)) +#define timespecadd(vvp, uvp) \ + do { \ + (vvp)->tv_sec += (uvp)->tv_sec; \ + (vvp)->tv_nsec += (uvp)->tv_nsec; \ + if ((vvp)->tv_nsec >= 1000000000) { \ + (vvp)->tv_sec++; \ + (vvp)->tv_nsec -= 1000000000; \ + } \ + } while (0) +#define timespecsub(vvp, uvp) \ + do { \ + (vvp)->tv_sec -= (uvp)->tv_sec; \ + (vvp)->tv_nsec -= (uvp)->tv_nsec; \ + if ((vvp)->tv_nsec < 0) { \ + (vvp)->tv_sec--; \ + (vvp)->tv_nsec += 1000000000; \ + } \ + } while (0) + +/* Operations on timevals. */ + +#define timevalclear(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = 0) +#define timevalisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) +#define timevalcmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec == (uvp)->tv_sec) ? \ + ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ + ((tvp)->tv_sec cmp (uvp)->tv_sec)) + +/* timevaladd and timevalsub are not inlined */ + +/* + * Kernel to clock driver interface. + */ +void inittodr(time_t base); +void resettodr(void); + +#define time_second _Timecounter_Time_second +#define time_uptime _Timecounter_Time_uptime +#define boottimebin _Timecounter_Boottimebin +extern struct timeval boottime; +extern struct bintime tc_tick_bt; +extern sbintime_t tc_tick_sbt; +extern struct bintime tick_bt; +extern sbintime_t tick_sbt; +extern int tc_precexp; +extern int tc_timepercentage; +extern struct bintime bt_timethreshold; +extern struct bintime bt_tickthreshold; +extern sbintime_t sbt_timethreshold; +extern sbintime_t sbt_tickthreshold; + +/* + * Functions for looking at our clock: [get]{bin,nano,micro}[up]time() + * + * Functions without the "get" prefix returns the best timestamp + * we can produce in the given format. + * + * "bin" == struct bintime == seconds + 64 bit fraction of seconds. + * "nano" == struct timespec == seconds + nanoseconds. + * "micro" == struct timeval == seconds + microseconds. + * + * Functions containing "up" returns time relative to boot and + * should be used for calculating time intervals. + * + * Functions without "up" returns UTC time. + * + * Functions with the "get" prefix returns a less precise result + * much faster than the functions without "get" prefix and should + * be used where a precision of 1/hz seconds is acceptable or where + * performance is priority. (NB: "precision", _not_ "resolution" !) + */ + +#define binuptime(_bt) _Timecounter_Binuptime(_bt) +#define nanouptime(_tsp) _Timecounter_Nanouptime(_tsp) +#define microuptime(_tvp) _Timecounter_Microuptime(_tvp) + +static __inline sbintime_t +sbinuptime(void) +{ + struct bintime _bt; + + binuptime(&_bt); + return (bttosbt(_bt)); +} + +#define bintime(_bt) _Timecounter_Bintime(_bt) +#define nanotime(_tsp) _Timecounter_Nanotime(_tsp) +#define microtime(_tvp) _Timecounter_Microtime(_tvp) + +#define getbinuptime(_bt) _Timecounter_Getbinuptime(_bt) +#define getnanouptime(_tsp) _Timecounter_Getnanouptime(_tsp) +#define getmicrouptime(_tvp) _Timecounter_Getmicrouptime(_tvp) + +static __inline sbintime_t +getsbinuptime(void) +{ + struct bintime _bt; + + getbinuptime(&_bt); + return (bttosbt(_bt)); +} + +#define getbintime(_bt) _Timecounter_Getbintime(_bt) +#define getnanotime(_tsp) _Timecounter_Getnanotime(_tsp) +#define getmicrotime(_tvp) _Timecounter_Getmicrotime(_tvp) + +/* Other functions */ +int itimerdecr(struct itimerval *itp, int usec); +int itimerfix(struct timeval *tv); +int ppsratecheck(struct timeval *, int *, int); +int ratecheck(struct timeval *, const struct timeval *); +void timevaladd(struct timeval *t1, const struct timeval *t2); +void timevalsub(struct timeval *t1, const struct timeval *t2); +int tvtohz(struct timeval *tv); + +#define TC_DEFAULTPERC 5 + +#define BT2FREQ(bt) \ + (((uint64_t)0x8000000000000000 + ((bt)->frac >> 2)) / \ + ((bt)->frac >> 1)) + +#define SBT2FREQ(sbt) ((SBT_1S + ((sbt) >> 1)) / (sbt)) + +#define FREQ2BT(freq, bt) \ +{ \ + (bt)->sec = 0; \ + (bt)->frac = ((uint64_t)0x8000000000000000 / (freq)) << 1; \ +} + +#define TIMESEL(sbt, sbt2) \ + (((sbt2) >= sbt_timethreshold) ? \ + ((*(sbt) = getsbinuptime()), 1) : ((*(sbt) = sbinuptime()), 0)) + +#endif /* _KERNEL */ +#endif /* _SYS_TIME_H_ */ |