mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-12-04 23:19:00 +00:00
3f31c649d1
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.
50 lines
1.3 KiB
C
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_ */
|