summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_rtc.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2006-10-02 15:42:02 +0000
committerphk <phk@FreeBSD.org>2006-10-02 15:42:02 +0000
commit84cc0f277fd9e49e824e8ae9424d9a976b7f21bd (patch)
tree0bb3ea96259ad035c87da7424d8294bbca513c8b /sys/kern/subr_rtc.c
parent81bdd4b32997569134b13c7951c97dd500d71623 (diff)
downloadFreeBSD-src-84cc0f277fd9e49e824e8ae9424d9a976b7f21bd.zip
FreeBSD-src-84cc0f277fd9e49e824e8ae9424d9a976b7f21bd.tar.gz
Second part of a little cleanup in the calendar/timezone/RTC handling.
Split subr_clock.c in two parts (by repo-copy): subr_clock.c contains generic RTC and calendaric stuff. etc. subr_rtc.c contains the newbus'ified RTC interface. Centralize the machdep.{adjkerntz,disable_rtc_set,wall_cmos_clock} sysctls and associated variables into subr_clock.c. They are not machine dependent and we have generic code that relies on being present so they are not even optional.
Diffstat (limited to 'sys/kern/subr_rtc.c')
-rw-r--r--sys/kern/subr_rtc.c147
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 */
{
OpenPOWER on IntegriCloud