diff options
author | Thorsten Lockert <tholo@cvs.openbsd.org> | 2004-07-28 17:15:13 +0000 |
---|---|---|
committer | Thorsten Lockert <tholo@cvs.openbsd.org> | 2004-07-28 17:15:13 +0000 |
commit | c65eb6dac1a01e8aedf3be76a030db86be9264f4 (patch) | |
tree | a775e61964a48db2019d60bb802076883a9b047b /sys/kern/kern_clock.c | |
parent | 953666701c83d79c01d0ce862cd14f2120a66b7c (diff) |
This touches only MI code, and adds new time keeping code. The
code is all conditionalized on __HAVE_TIMECOUNTER, and not
enabled on any platforms.
adjtime(2) support exists, courtesy of nordin@, sysctl(2) support
and a concept of quality for each time source attached exists.
High quality time sources exists for PIIX4 ACPI timer as well as
some AMD power management chips. This will have to be redone
once we actually add ACPI support (at that time we need to use
the ACPI interfaces to get at these clocks).
ok art@ ken@ miod@ jmc@ and many more
Diffstat (limited to 'sys/kern/kern_clock.c')
-rw-r--r-- | sys/kern/kern_clock.c | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/sys/kern/kern_clock.c b/sys/kern/kern_clock.c index 15c958bbf6b..9d79ae260fc 100644 --- a/sys/kern/kern_clock.c +++ b/sys/kern/kern_clock.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_clock.c,v 1.46 2004/06/24 19:35:24 tholo Exp $ */ +/* $OpenBSD: kern_clock.c,v 1.47 2004/07/28 17:15:12 tholo Exp $ */ /* $NetBSD: kern_clock.c,v 1.34 1996/06/09 04:51:03 briggs Exp $ */ /*- @@ -49,6 +49,9 @@ #include <uvm/uvm_extern.h> #include <sys/sysctl.h> #include <sys/sched.h> +#ifdef __HAVE_TIMECOUNTER +#include <sys/timetc.h> +#endif #include <machine/cpu.h> @@ -101,17 +104,20 @@ int profprocs; int ticks; static int psdiv, pscnt; /* prof => stat divider */ int psratio; /* ratio: prof / stat */ -int tickfix, tickfixinterval; /* used if tick not really integral */ -static int tickfixcnt; /* accumulated fractional error */ long cp_time[CPUSTATES]; +#ifndef __HAVE_TIMECOUNTER +int tickfix, tickfixinterval; /* used if tick not really integral */ +static int tickfixcnt; /* accumulated fractional error */ + volatile time_t time_second; volatile time_t time_uptime; volatile struct timeval time __attribute__((__aligned__(__alignof__(quad_t)))); volatile struct timeval mono_time; +#endif #ifdef __HAVE_GENERIC_SOFT_INTERRUPTS void *softclock_si; @@ -135,6 +141,9 @@ void initclocks() { int i; +#ifdef __HAVE_TIMECOUNTER + extern void inittimecounter(void); +#endif #ifdef __HAVE_GENERIC_SOFT_INTERRUPTS softclock_si = softintr_establish(IPL_SOFTCLOCK, generic_softclock, NULL); @@ -156,6 +165,9 @@ initclocks() if (profhz == 0) profhz = i; psratio = profhz / i; +#ifdef __HAVE_TIMECOUNTER + inittimecounter(); +#endif } /* @@ -165,12 +177,14 @@ void hardclock(struct clockframe *frame) { struct proc *p; +#ifndef __HAVE_TIMECOUNTER int delta; extern int tickdelta; extern long timedelta; #ifdef __HAVE_CPUINFO struct cpu_info *ci = curcpu(); #endif +#endif p = curproc; if (p) { @@ -189,6 +203,7 @@ hardclock(struct clockframe *frame) psignal(p, SIGPROF); } +#ifndef __HAVE_TIMECOUNTER /* * If no separate statistics clock is available, run it from here. */ @@ -216,6 +231,7 @@ hardclock(struct clockframe *frame) * ``tickdelta'' may also be added in. */ ticks++; + delta = tick; if (tickfix) { @@ -231,14 +247,13 @@ hardclock(struct clockframe *frame) timedelta -= tickdelta; } -#ifdef notyet - microset(); -#endif - BUMPTIME(&time, delta); BUMPTIME(&mono_time, delta); time_second = time.tv_sec; time_uptime = mono_time.tv_sec; +#else + tc_ticktock(); +#endif #ifdef CPU_CLOCKUPDATE CPU_CLOCKUPDATE(); @@ -539,6 +554,7 @@ sysctl_clockrate(where, sizep) return (sysctl_rdstruct(where, sizep, NULL, &clkinfo, sizeof(clkinfo))); } +#ifndef __HAVE_TIMECOUNTER /* * Placeholders until everyone uses the timecounters code. * Won't improve anything except maybe removing a bunch of bugs in fixed code. @@ -609,3 +625,4 @@ getmicrouptime(struct timeval *tvp) *tvp = mono_time; splx(s); } +#endif /* __HAVE_TIMECOUNTERS */ |