From 3f31c649d16f2b5e9d77bc84c513949ec2a76868 Mon Sep 17 00:00:00 2001 From: Garrett Wollman Date: Sun, 18 Sep 1994 20:40:01 +0000 Subject: 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 ) 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. --- sys/amd64/include/clock.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 sys/amd64/include/clock.h (limited to 'sys/amd64/include/clock.h') diff --git a/sys/amd64/include/clock.h b/sys/amd64/include/clock.h new file mode 100644 index 000000000000..b7420e4adc66 --- /dev/null +++ b/sys/amd64/include/clock.h @@ -0,0 +1,49 @@ +/* + * 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_ */ -- cgit v1.3