diff --git a/sys/kern/kern_tc.c b/sys/kern/kern_tc.c index 6e1f486..49598d0 100644 --- a/sys/kern/kern_tc.c +++ b/sys/kern/kern_tc.c @@ -334,6 +334,16 @@ binuptime(struct bintime *bt) } void +sbinuptime(sbintime_t *sbt) +{ + /* XXX: We need a real implementation */ + struct bintime bt; + + binuptime(&bt); + *sbt = bintime2sbintime(bt); +} + +void nanouptime(struct timespec *tsp) { struct bintime bt; @@ -391,6 +401,16 @@ getbinuptime(struct bintime *bt) } void +getsbinuptime(sbintime_t *sbt) +{ + /* XXX: We need a real implementation */ + struct bintime bt; + + getbinuptime(&bt); + *sbt = bintime2sbintime(bt); +} + +void getnanouptime(struct timespec *tsp) { struct timehands *th; @@ -883,6 +903,16 @@ binuptime(struct bintime *bt) } void +sbinuptime(sbintime_t *sbt) +{ + /* XXX: We need a real implementation */ + struct bintime bt; + + binuptime(&bt); + *sbt = bintime2sbintime(bt); +} + +void nanouptime(struct timespec *tsp) { @@ -925,6 +955,16 @@ getbinuptime(struct bintime *bt) } void +getsbinuptime(sbintime_t *sbt) +{ + /* XXX: We need a real implementation */ + struct bintime bt; + + getbinuptime(&bt); + *sbt = bintime2sbintime(bt); +} + +void getnanouptime(struct timespec *tsp) { diff --git a/sys/sys/time.h b/sys/sys/time.h index 80878c0..5076e13 100644 --- a/sys/sys/time.h +++ b/sys/sys/time.h @@ -109,6 +109,37 @@ bintime_mul(struct bintime *bt, u_int x) ((a)->frac cmp (b)->frac) : \ ((a)->sec cmp (b)->sec)) +typedef int64_t sbintime_t; +#define SBT_1S ((sbintime_t)1 << 32) +#define SBT_1M (SBT_1S * 60) +#define SBT_1MS (SBT_1S / 1000) +#define SBT_1US (SBT_1S / 1000000) +#define SBT_1NS (SBT_1S / 1000000000) + +static __inline int +sbintime_getsec(sbintime_t sbt) +{ + + return (int)(sbt >> 32); +} + +static __inline sbintime_t +bintime2sbintime(const struct bintime bt) +{ + + return (((sbintime_t)bt.sec << 32) + (bt.frac >> 32)); +} + +static __inline struct bintime +sbintime2bintime(sbintime_t sbt) +{ + struct bintime bt; + + bt.sec = sbt >> 32; + bt.frac = sbt << 32; + return (bt); +} + /*- * Background information: * @@ -131,6 +162,41 @@ bintime2timespec(const struct bintime *bt, struct timespec *ts) ts->tv_nsec = ((uint64_t)1000000000 * (uint32_t)(bt->frac >> 32)) >> 32; } +static __inline struct timespec +sbintime2timespec(sbintime_t sbt) +{ + struct timespec ts; + + ts.tv_sec = sbt >> 32; + ts.tv_nsec = ((uint64_t)1000000000 * (uint32_t)sbt) >> 32; + return (ts); +} + +static __inline sbintime_t +timespec2sbintime(struct timespec ts) +{ + return (((sbintime_t)ts.tv_sec << 32) + + (ts.tv_nsec * (((uint64_t)1 << 63) / 500000000) >> 32)); +} + +static __inline struct timeval +sbintime2timeval(sbintime_t sbt) +{ + struct timeval tv; + + tv.tv_sec = sbt >> 32; + tv.tv_usec = ((uint64_t)1000000 * (uint32_t)sbt) >> 32; + return (tv); +} + +static __inline sbintime_t +timeval2sbintime(struct timeval tv) +{ + + return (((sbintime_t)tv.tv_sec << 32) + + (tv.tv_usec * (((uint64_t)1 << 63) / 500000) >> 32)); +} + static __inline void timespec2bintime(const struct timespec *ts, struct bintime *bt) { @@ -314,6 +380,7 @@ extern struct timeval boottime; */ void binuptime(struct bintime *bt); +void sbinuptime(sbintime_t *sbt); void nanouptime(struct timespec *tsp); void microuptime(struct timeval *tvp); @@ -322,6 +389,7 @@ void nanotime(struct timespec *tsp); void microtime(struct timeval *tvp); void getbinuptime(struct bintime *bt); +void getsbinuptime(sbintime_t *sbt); void getnanouptime(struct timespec *tsp); void getmicrouptime(struct timeval *tvp);