diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2006-01-09 22:59:37 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2006-01-09 22:59:37 +0000 |
commit | 15a0879d862e073979691839f0a8b5851f9a9983 (patch) | |
tree | e2cb55777926dba11bbdb8a831dd483c9155105b /sys/arch/mac68k | |
parent | 9477557a97bb9f301020caa9924e7b79f10fc0e5 (diff) |
Spank the clock: remove relics of old GPROF code, compute tickfix for
better clock adjustment, consider clocks past year 2010 as possible, and
do not display the PRAM clock if it consistent.
Diffstat (limited to 'sys/arch/mac68k')
-rw-r--r-- | sys/arch/mac68k/mac68k/clock.c | 195 | ||||
-rw-r--r-- | sys/arch/mac68k/mac68k/clockreg.h | 11 | ||||
-rw-r--r-- | sys/arch/mac68k/mac68k/pmap_bootstrap.c | 3 |
3 files changed, 47 insertions, 162 deletions
diff --git a/sys/arch/mac68k/mac68k/clock.c b/sys/arch/mac68k/mac68k/clock.c index 4787410aaa4..686852d7b23 100644 --- a/sys/arch/mac68k/mac68k/clock.c +++ b/sys/arch/mac68k/mac68k/clock.c @@ -1,4 +1,4 @@ -/* $OpenBSD: clock.c,v 1.19 2006/01/02 18:10:07 miod Exp $ */ +/* $OpenBSD: clock.c,v 1.20 2006/01/09 22:59:35 miod Exp $ */ /* $NetBSD: clock.c,v 1.39 1999/11/05 19:14:56 scottr Exp $ */ /* @@ -74,6 +74,10 @@ * @(#)clock.c 7.6 (Berkeley) 5/7/91 */ +/* + * Mac II machine-dependent clock routines. + */ + #include <sys/param.h> #include <sys/device.h> #include <sys/limits.h> @@ -84,14 +88,12 @@ #include <machine/psl.h> #include <machine/cpu.h> -#if defined(GPROF) && defined(PROFTIMER) -#include <sys/gprof.h> -#endif - #include <mac68k/mac68k/pram.h> #include <mac68k/mac68k/clockreg.h> #include <machine/viareg.h> +#include <dev/clock_subr.h> + #ifdef DEBUG int clock_debug = 0; #endif @@ -99,12 +101,12 @@ int clock_debug = 0; int rtclock_intr(void *); #define DIFF19041970 2082844800 -#define DIFF19701990 630720000 -#define DIFF19702010 1261440000 /* - * Mac II machine-dependent clock routines. + * The Macintosh timers decrement once every 1.2766 microseconds. + * MGFH2, p. 180 */ +#define CLK_RATE 12766 /* * Start the real-time clock; i.e. set timer latches and boot timer. @@ -132,6 +134,15 @@ startrtclock() void cpu_initclocks() { + tickfix = 1000000 - (hz * tick); + if (tickfix != 0) { + int ftp; + + ftp = min(ffs(tickfix), ffs(hz)); + tickfix >>= (ftp - 1); + tickfixinterval = hz >> (ftp - 1); + } + /* clear then enable clock interrupt. */ via_reg(VIA1, vIFR) |= V1IF_T1; via_reg(VIA1, vIER) = 0x80 | V1IF_T1; @@ -162,110 +173,8 @@ clkread() high = high2; /* return count left in timer / 1.27 */ - /* return((CLK_INTERVAL - (high << 8) - low) / CLK_SPEED); */ - return ((CLK_INTERVAL - (high << 8) - low) * 10000 / 12700); -} - - -#ifdef PROFTIMER -/* - * Here, we have implemented code that causes VIA2's timer to count - * the profiling clock. Following the HP300's lead, this reduces - * the impact on other tasks, since locore turns off the profiling clock - * on context switches. If need be, the profiling clock's resolution can - * be cranked higher than the real-time clock's resolution, to prevent - * aliasing and allow higher accuracy. - */ -int profint = PRF_INTERVAL; /* Clock ticks between interrupts */ -int profinthigh; -int profintlow; -int profscale = 0; /* Scale factor from sys clock to prof clock */ -char profon = 0; /* Is profiling clock on? */ - -/* profon values - do not change, locore.s assumes these values */ -#define PRF_NONE 0x00 -#define PRF_USER 0x01 -#define PRF_KERNEL 0x80 - -void -initprofclock() -{ - /* profile interval must be even divisor of system clock interval */ - if (profint > CLK_INTERVAL) - profint = CLK_INTERVAL; - else - if (CLK_INTERVAL % profint != 0) - /* try to intelligently fix clock interval */ - profint = CLK_INTERVAL / (CLK_INTERVAL / profint); - - profscale = CLK_INTERVAL / profint; - - profinthigh = profint >> 8; - profintlow = profint & 0xff; -} - -void -startprofclock() -{ - via_reg(VIA2, vT1L) = (profint - 1) & 0xff; - via_reg(VIA2, vT1LH) = (profint - 1) >> 8; - via_reg(VIA2, vACR) |= ACR_T1LATCH; - via_reg(VIA2, vT1C) = (profint - 1) & 0xff; - via_reg(VIA2, vT1CH) = (profint - 1) >> 8; -} - -void -stopprofclock() -{ - via_reg(VIA2, vT1L) = 0; - via_reg(VIA2, vT1LH) = 0; - via_reg(VIA2, vT1C) = 0; - via_reg(VIA2, vT1CH) = 0; -} - -#ifdef GPROF -/* - * BARF: we should check this: - * - * profclock() is expanded in line in lev6intr() unless profiling kernel. - * Assumes it is called with clock interrupts blocked. - */ -void -profclock(pclk) - clockframe *pclk; -{ - /* - * Came from user mode. - * If this process is being profiled record the tick. - */ - if (USERMODE(pclk->ps)) { - if (p->p_stats.p_prof.pr_scale) - addupc_task(&curproc, pclk->pc, 1); - } - /* - * Came from kernel (supervisor) mode. - * If we are profiling the kernel, record the tick. - */ - else - if (profiling < 2) { - int s = pclk->pc - s_lowpc; - - if (s < s_textsize) - kcount[s / (HISTFRACTION * sizeof(*kcount))]++; - } - /* - * Kernel profiling was on but has been disabled. - * Mark as no longer profiling kernel and if all profiling done, - * disable the clock. - */ - if (profiling && (profon & PRF_KERNEL)) { - profon &= ~PRF_KERNEL; - if (profon == PRF_NONE) - stopprofclock(); - } + return ((CLK_INTERVAL - (high << 8) - low) * 10000 / CLK_RATE); } -#endif -#endif static u_long ugmt_2_pramt(u_long); static u_long pramt_2_ugmt(u_long); @@ -281,7 +190,7 @@ ugmt_2_pramt(t) /* don't know how to open a file properly. */ /* assume compiled timezone is correct. */ - return (t = t + DIFF19041970 - 60 * tz.tz_minuteswest); + return (t + DIFF19041970 - 60 * tz.tz_minuteswest); } /* @@ -292,7 +201,7 @@ static u_long pramt_2_ugmt(t) u_long t; { - return (t = t - DIFF19041970 + 60 * tz.tz_minuteswest); + return (t - DIFF19041970 + 60 * tz.tz_minuteswest); } /* @@ -323,22 +232,30 @@ inittodr(base) { u_long timbuf; - timbuf = pramt_2_ugmt(pram_readtime()); - if ((timbuf - (macos_boottime + 60 * tz.tz_minuteswest)) > 10 * 60) { -#ifdef DIAGNOSTIC - printf( - "PRAM time does not appear to have been read correctly.\n"); - printf("PRAM: 0x%lx, macos_boottime: 0x%lx.\n", - timbuf, macos_boottime + 60 * tz.tz_minuteswest); -#endif + timbuf = pram_readtime(); + if (timbuf == 0) { + /* We don't know how to access PRAM on this hardware. */ timbuf = macos_boottime; mac68k_trust_pram = 0; - } + } else { + timbuf = pramt_2_ugmt(pram_readtime()); + if ((timbuf - (macos_boottime + 60 * tz.tz_minuteswest)) > + 10 * 60) { #ifdef DIAGNOSTIC - else - printf("PRAM: 0x%lx, macos_boottime: 0x%lx.\n", - timbuf, macos_boottime); + printf("PRAM time does not appear" + " to have been read correctly.\n"); + printf("PRAM: 0x%lx, macos_boottime: 0x%lx.\n", + timbuf, macos_boottime + 60 * tz.tz_minuteswest); +#endif + timbuf = macos_boottime; + mac68k_trust_pram = 0; + } +#ifdef DEBUG + else + printf("PRAM: 0x%lx, macos_boottime: 0x%lx.\n", + timbuf, macos_boottime); #endif + } /* * GMT bias is passed in from Booter @@ -350,22 +267,12 @@ inittodr(base) if (base < 5 * SECYR) { printf("WARNING: file system time earlier than 1975\n"); printf(" -- CHECK AND RESET THE DATE!\n"); - base = 21 * SECYR; /* 1991 is our sane date */ - } - /* - * Check sanity against the year 2010. Let's hope OpenBSD/mac68k - * doesn't run that long! - */ - if (base > 40 * SECYR) { - printf("WARNING: file system time later than 2010\n"); - printf(" -- CHECK AND RESET THE DATE!\n"); - base = 21 * SECYR; /* 1991 is our sane date */ + base = 36 * SECYR; /* Last update here in 2006... */ } if (timbuf < base) { printf( "WARNING: Battery clock has earlier time than UNIX fs.\n"); - if (((u_long) base) < (40 * SECYR)) - timbuf = base; + timbuf = base; } time.tv_sec = timbuf; time.tv_usec = 0; @@ -385,20 +292,8 @@ resettodr() * (gmtbias is in minutes, multiply by 60). */ pram_settime(ugmt_2_pramt(time.tv_sec + macos_gmtbias * 60)); -#ifdef DEBUG - else if (clock_debug) - printf("OpenBSD/mac68k does not trust itself to try and write " - "to the PRAM on this system.\n"); -#endif } - -/* - * The Macintosh timers decrement once every 1.2766 microseconds. - * MGFH2, p. 180 - */ -#define CLK_RATE 12766 - #define DELAY_CALIBRATE (0xffffff << 7) /* Large value for calibration */ u_int delay_factor = DELAY_CALIBRATE; @@ -412,7 +307,7 @@ delay_timer1_irq(dummy) void *dummy; { delay_flag = 0; - return 1; + return (1); } /* diff --git a/sys/arch/mac68k/mac68k/clockreg.h b/sys/arch/mac68k/mac68k/clockreg.h index 9b1b1fcf872..6c6186c850c 100644 --- a/sys/arch/mac68k/mac68k/clockreg.h +++ b/sys/arch/mac68k/mac68k/clockreg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: clockreg.h,v 1.6 1997/10/19 23:40:46 briggs Exp $ */ +/* $OpenBSD: clockreg.h,v 1.7 2006/01/09 22:59:35 miod Exp $ */ /* $NetBSD: clockreg.h,v 1.5 1996/04/01 05:16:52 scottr Exp $ */ /*- @@ -39,9 +39,6 @@ * MacII clock characteristics used. */ - -#define CLK_SPEED 0.0000012766 /* time to complete a clock (3 MHz) */ - /* * Calculate clocks needed to hit HZ ticks/sec. * @@ -59,9 +56,3 @@ #define CLK_INTH ((CLK_INTERVAL >> 8) & 0xff) /* high byte */ #define CLK_INTL (CLK_INTERVAL & 0xff) /* low byte */ - -#if !defined(PRF_INTERVAL) -#define PRF_INTERVAL CLK_INTERVAL -#endif - -#define SECYR 31536000 diff --git a/sys/arch/mac68k/mac68k/pmap_bootstrap.c b/sys/arch/mac68k/mac68k/pmap_bootstrap.c index 4a10ffc3375..24f9ea18c96 100644 --- a/sys/arch/mac68k/mac68k/pmap_bootstrap.c +++ b/sys/arch/mac68k/mac68k/pmap_bootstrap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap_bootstrap.c,v 1.35 2006/01/04 20:39:05 miod Exp $ */ +/* $OpenBSD: pmap_bootstrap.c,v 1.36 2006/01/09 22:59:36 miod Exp $ */ /* $NetBSD: pmap_bootstrap.c,v 1.50 1999/04/07 06:14:33 scottr Exp $ */ /* @@ -53,7 +53,6 @@ #include <ufs/mfs/mfs_extern.h> -#include <mac68k/mac68k/clockreg.h> #include <mac68k/mac68k/macrom.h> #include "zsc.h" |