Index: sys/amd64/amd64/tsc.c =========================================================================== --- sys/amd64/amd64/tsc.c 2005/11/29 01:00:18 #7 +++ sys/amd64/amd64/tsc.c 2005/11/29 01:00:18 @@ -128,3 +128,15 @@ { return (rdtsc()); } + +void +tsc_DELAY(int n) +{ + uint64_t start, end, now; + + start = rdtsc(); + end = start + (tsc_freq * n) / 1000000; + do { + now = rdtsc(); + } while (now < end || (now > start && end < start)); +} Index: sys/amd64/include/clock.h =========================================================================== --- sys/amd64/include/clock.h 2005/11/29 01:00:18 #7 +++ sys/amd64/include/clock.h 2005/11/29 01:00:18 @@ -37,6 +37,7 @@ int sysbeep(int pitch, int period); void init_TSC(void); void init_TSC_tc(void); +void tsc_DELAY(int); #endif /* _KERNEL */ Index: sys/amd64/isa/clock.c =========================================================================== --- sys/amd64/isa/clock.c 2005/11/29 01:00:18 #25 +++ sys/amd64/isa/clock.c 2005/11/29 01:00:18 @@ -269,7 +272,13 @@ int getit_calls = 1; int n1; static int state = 0; +#endif + if (tsc_freq != 0 && !tsc_is_broken) { + tsc_DELAY(n); + return; + } +#ifdef DELAYDEBUG if (state == 0) { state = 1; for (n1 = 1; n1 <= 10000000; n1 *= 10)