diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/arch/mips64/include/types.h | 4 | ||||
-rw-r--r-- | sys/arch/mips64/mips64/clock.c | 74 |
2 files changed, 37 insertions, 41 deletions
diff --git a/sys/arch/mips64/include/types.h b/sys/arch/mips64/include/types.h index 9446daa1889..29706461880 100644 --- a/sys/arch/mips64/include/types.h +++ b/sys/arch/mips64/include/types.h @@ -1,4 +1,4 @@ -/* $OpenBSD: types.h,v 1.5 2004/11/26 21:23:05 miod Exp $ */ +/* $OpenBSD: types.h,v 1.6 2005/04/29 18:41:12 grange Exp $ */ /*- * Copyright (c) 1992, 1993 @@ -94,4 +94,6 @@ typedef struct label_t { /* XXX check why this still has to be defined. pmap.c issue? */ #define __SWAP_BROKEN +#define __HAVE_TIMECOUNTER + #endif /* !_MIPS_TYPES_H_ */ diff --git a/sys/arch/mips64/mips64/clock.c b/sys/arch/mips64/mips64/clock.c index fd0c44ca58b..93614a5da75 100644 --- a/sys/arch/mips64/mips64/clock.c +++ b/sys/arch/mips64/mips64/clock.c @@ -1,4 +1,4 @@ -/* $OpenBSD: clock.c,v 1.13 2005/02/13 22:04:34 grange Exp $ */ +/* $OpenBSD: clock.c,v 1.14 2005/04/29 18:41:12 grange Exp $ */ /* * Copyright (c) 2001-2004 Opsycon AB (www.opsycon.se / www.opsycon.com) @@ -31,6 +31,7 @@ #include <sys/systm.h> #include <sys/device.h> #include <sys/evcount.h> +#include <sys/timetc.h> #include <machine/autoconf.h> #include <machine/cpu.h> @@ -61,6 +62,17 @@ u_int32_t cpu_counter_interval; u_int32_t pendingticks; u_int32_t ticktime; +u_int cp0_get_timecount(struct timecounter *); + +struct timecounter cp0_timecounter = { + cp0_get_timecount, /* get_timecount */ + 0, /* no poll_pps */ + 0xffffffff, /* counter_mask */ + 0, /* frequency */ + "CP0", /* name */ + 1000 /* quality */ +}; + #define SECDAY (24*SECHOUR) /* seconds per day */ #define SECYR (365*SECDAY) /* seconds per common year */ #define SECMIN (60) /* seconds per minute */ @@ -231,38 +243,6 @@ nanodelay(int n) } /* - * Return the best possible estimate of the time in the timeval - * to which tvp points. We guarantee that the time will be greater - * than the value obtained by a previous call. - */ -void -microtime(struct timeval *tvp) -{ - static struct timeval lasttime; - u_int32_t clkdiff; - int s = splclock(); - - *tvp = time; - clkdiff = (cp0_get_count() - cpu_counter_last) * 1000; - tvp->tv_usec += clkdiff / ticktime; - while (tvp->tv_usec >= 1000000) { - tvp->tv_sec++; - tvp->tv_usec -= 1000000; - } - - if (tvp->tv_sec == lasttime.tv_sec && - tvp->tv_usec <= lasttime.tv_usec) { - tvp->tv_usec++; - if (tvp->tv_usec >= 1000000) { - tvp->tv_sec++; - tvp->tv_usec -= 1000000; - } - } - lasttime = *tvp; - splx(s); -} - -/* * Mips machine independent clock routines. */ @@ -288,6 +268,9 @@ cpu_initclocks() tick = 1000000 / hz; /* number of micro-seconds between interrupts */ tickadj = 240000 / (60 * hz); /* can adjust 240ms in 60s */ + cp0_timecounter.tc_frequency = sys_config.cpu[0].clock / 2; + tc_init(&cp0_timecounter); + clock_started++; } @@ -316,10 +299,13 @@ static short dayyr[12] = { void inittodr(time_t base) { + struct timespec ts; struct tod_time c; struct clock_softc *sc = (struct clock_softc *)clock_cd.cd_devs[0]; int days, yr; + ts.tv_nsec = 0; + if (base < 15*SECYR) { printf("WARNING: preposterous time in file system"); /* read the system clock anyway */ @@ -349,15 +335,16 @@ inittodr(time_t base) } /* now have days since Jan 1, 1970; the rest is easy... */ - time.tv_sec = days * SECDAY + c.hour * 3600 + c.min * 60 + c.sec; + ts.tv_sec = days * SECDAY + c.hour * 3600 + c.min * 60 + c.sec; + tc_setclock(&ts); sc->sc_initted = 1; /* * See if we gained/lost time. */ - if (base < time.tv_sec - 5*SECYR) { + if (base < ts.tv_sec - 5*SECYR) { printf("WARNING: file system time much less than clock time\n"); - } else if (base > time.tv_sec + 5*SECYR) { + } else if (base > ts.tv_sec + 5*SECYR) { printf("WARNING: clock time much less than file system time\n"); printf("WARNING: using file system time\n"); } else { @@ -365,7 +352,8 @@ inittodr(time_t base) } bad: - time.tv_sec = base; + ts.tv_sec = base; + tc_setclock(&ts); sc->sc_initted = 1; printf("WARNING: CHECK AND RESET THE DATE!\n"); } @@ -389,11 +377,11 @@ resettodr() } /* compute the day of week. 1 is Sunday*/ - t2 = time.tv_sec / SECDAY; + t2 = time_second / SECDAY; c.dow = (t2 + 5) % 7 + 1; /* 1/1/1970 was thursday */ /* compute the year */ - t2 = time.tv_sec / SECDAY; + t2 = time_second / SECDAY; c.year = 69; while (t2 >= 0) { /* whittle off years */ t = t2; @@ -413,7 +401,7 @@ resettodr() c.day--; } - t = time.tv_sec % SECDAY; + t = time_second % SECDAY; c.hour = t / 3600; t %= 3600; c.min = t / 60; @@ -423,3 +411,9 @@ resettodr() (*sc->sc_clock.clk_set)(sc, &c); } } + +u_int +cp0_get_timecount(struct timecounter *tc) +{ + return (cp0_get_count()); +} |