diff options
Diffstat (limited to 'sys/kern/subr_rtc.c')
-rw-r--r-- | sys/kern/subr_rtc.c | 147 |
1 files changed, 0 insertions, 147 deletions
diff --git a/sys/kern/subr_rtc.c b/sys/kern/subr_rtc.c index 18be8bc..ba1d719 100644 --- a/sys/kern/subr_rtc.c +++ b/sys/kern/subr_rtc.c @@ -47,12 +47,6 @@ * This code is not yet used by all architectures. */ -/* - * Generic routines to convert between a POSIX date - * (seconds since 1/1/1970) and yr/mo/day/hr/min/sec - * Derived from NetBSD arch/hp300/hp300/clock.c - */ - #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); @@ -69,150 +63,9 @@ __FBSDID("$FreeBSD$"); #include "clock_if.h" -static __inline int leapyear(int year); -static int sysctl_machdep_adjkerntz(SYSCTL_HANDLER_ARGS); - -#define FEBRUARY 2 -#define days_in_year(y) (leapyear(y) ? 366 : 365) -#define days_in_month(y, m) \ - (month_days[(m) - 1] + (m == FEBRUARY ? leapyear(y) : 0)) -/* Day of week. Days are counted from 1/1/1970, which was a Thursday */ -#define day_of_week(days) (((days) + 4) % 7) - -static const int month_days[12] = { - 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 -}; - static device_t clock_dev = NULL; static long clock_res; -int adjkerntz; /* local offset from GMT in seconds */ -int disable_rtc_set; /* disable resettodr() if != 0 */ -int wall_cmos_clock; /* wall CMOS clock assumed if != 0 */ - -/* - * These have traditionally been in machdep, but should probably be moved to - * kern. - */ -SYSCTL_PROC(_machdep, OID_AUTO, adjkerntz, CTLTYPE_INT|CTLFLAG_RW, - &adjkerntz, 0, sysctl_machdep_adjkerntz, "I", ""); - -SYSCTL_INT(_machdep, OID_AUTO, disable_rtc_set, - CTLFLAG_RW, &disable_rtc_set, 0, ""); - -SYSCTL_INT(_machdep, OID_AUTO, wall_cmos_clock, - CTLFLAG_RW, &wall_cmos_clock, 0, ""); - -static int -sysctl_machdep_adjkerntz(SYSCTL_HANDLER_ARGS) -{ - int error; - error = sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, - req); - if (!error && req->newptr) - resettodr(); - return (error); -} - -/* - * This inline avoids some unnecessary modulo operations - * as compared with the usual macro: - * ( ((year % 4) == 0 && - * (year % 100) != 0) || - * ((year % 400) == 0) ) - * It is otherwise equivalent. - */ -static __inline int -leapyear(int year) -{ - int rv = 0; - - if ((year & 3) == 0) { - rv = 1; - if ((year % 100) == 0) { - rv = 0; - if ((year % 400) == 0) - rv = 1; - } - } - return (rv); -} - -int -clock_ct_to_ts(struct clocktime *ct, struct timespec *ts) -{ - time_t secs; - int i, year, days; - - year = ct->year; - - /* Sanity checks. */ - if (ct->mon < 1 || ct->mon > 12 || ct->day < 1 || - ct->day > days_in_month(year, ct->mon) || - ct->hour > 23 || ct->min > 59 || ct->sec > 59 || - ct->year > 2037) /* time_t overflow */ - return (EINVAL); - - /* - * Compute days since start of time - * First from years, then from months. - */ - days = 0; - for (i = POSIX_BASE_YEAR; i < year; i++) - days += days_in_year(i); - - /* Months */ - for (i = 1; i < ct->mon; i++) - days += days_in_month(year, i); - days += (ct->day - 1); - - /* Another sanity check. */ - if (ct->dow != -1 && ct->dow != day_of_week(days)) - return (EINVAL); - - /* Add hours, minutes, seconds. */ - secs = ((days * 24 + ct->hour) * 60 + ct->min) * 60 + ct->sec; - - ts->tv_sec = secs; - ts->tv_nsec = ct->nsec; - return (0); -} - -void -clock_ts_to_ct(struct timespec *ts, struct clocktime *ct) -{ - int i, year, days; - time_t rsec; /* remainder seconds */ - time_t secs; - - secs = ts->tv_sec; - days = secs / SECDAY; - rsec = secs % SECDAY; - - ct->dow = day_of_week(days); - - /* Subtract out whole years, counting them in i. */ - for (year = POSIX_BASE_YEAR; days >= days_in_year(year); year++) - days -= days_in_year(year); - ct->year = year; - - /* Subtract out whole months, counting them in i. */ - for (i = 1; days >= days_in_month(year, i); i++) - days -= days_in_month(year, i); - ct->mon = i; - - /* Days are what is left over (+1) from all that. */ - ct->day = days + 1; - - /* Hours, minutes, seconds are easy */ - ct->hour = rsec / 3600; - rsec = rsec % 3600; - ct->min = rsec / 60; - rsec = rsec % 60; - ct->sec = rsec; - ct->nsec = ts->tv_nsec; -} - void clock_register(device_t dev, long res) /* res has units of microseconds */ { |