freebsd-dev/sys/amd64/include/clock.h
wollman 06e8ec05f6 Redo Kernel NTP PLL support, kernel side.
This code is mostly taken from the 1.1 port (which was in turn taken from
Dave Mills's kern.tar.Z example).  A few significant differences:

1) ntp_gettime() is now a MIB variable rather than a system call.  A few
fiddles are done in libc to make it behave the same.

2) mono_time does not participate in the PLL adjustments.

3) A new interface has been defined (in <machine/clock.h>) for doing
possibly machine-dependent things around the time of the clock update.
This is used in Pentium kernels to disable interrupts, set `time', and
reset the CPU cycle counter as quickly as possible to avoid jitter in
microtime().  Measurements show an apparent resolution of a bit more than
8.14usec, which is reasonable given system-call overhead.
1994-09-18 20:40:01 +00:00

50 lines
1.3 KiB
C

/*
* Kernel interface to machine-dependent clock driver.
* Garrett Wollman, September 1994.
* This file is in the public domain.
*/
#ifndef _MACHINE_CLOCK_H_
#define _MACHINE_CLOCK_H_ 1
extern int pentium_mhz;
#ifdef I586_CPU
/*
* This resets the CPU cycle counter to zero, to make our
* job easier in microtime(). Some fancy ifdefs could speed
* this up for Pentium-only kernels.
* We want this to be done as close as possible to the actual
* timer incrementing in hardclock(), because there is a window
* between the two where the value is no longer valid. Experimentation
* may reveal a good precompensation to apply in microtime().
*/
#define CPU_CLOCKUPDATE(otime, ntime) \
do { \
if(pentium_mhz) { \
__asm __volatile("cli\n" \
"movl (%2),%%eax\n" \
"movl %%eax,(%1)\n" \
"movl 4(%2),%%eax\n" \
"movl %%eax,4(%1)\n" \
"movl $0x10,%%ecx\n" \
"xorl %%eax,%%eax\n" \
"movl %%eax,%%edx\n" \
".byte 0x0f, 0x30\n" \
"sti\n" \
"#%0%1%2" \
: "=m"(*otime) /* no outputs */ \
: "c"(otime), "b"(ntime) /* fake input */ \
: "ax", "cx", "dx"); \
} else { \
*(otime) = *(ntime); \
} \
} while(0)
#else
#define CPU_CLOCKUPDATE(otime, ntime) \
(*(otime) = *(ntime))
#endif
#endif /* _MACHINE_CLOCK_H_ */