From owner-FreeBSD-users-jp@jp.freebsd.org  Mon Nov  4 18:48:28 1996
Received: by jaz.jp.freebsd.org (8.7.3+2.6Wbeta5/8.7.3) id SAA07008
	Mon, 4 Nov 1996 18:48:28 +0900 (JST)
Received: by jaz.jp.freebsd.org (8.7.3+2.6Wbeta5/8.7.3) with ESMTP id SAA07003
	for <FreeBSD-users-jp@jp.freebsd.org>; Mon, 4 Nov 1996 18:48:27 +0900 (JST)
Received: (from ohashi@localhost) by at_ohasi.mickey.ai.kyutech.ac.jp (8.7.5/3.4Wbeta6) id SAA09521; Mon, 4 Nov 1996 18:43:10 +0900 (JST)
Date: Mon, 4 Nov 1996 18:43:10 +0900 (JST)
From: Takeshi OHASHI <ohashi@mickey.ai.kyutech.ac.jp>
Message-Id: <199611040943.SAA09521@at_ohasi.mickey.ai.kyutech.ac.jp>
To: FreeBSD-users-jp@jp.freebsd.org
In-reply-to: <199610070152.KAA04193@sirius.sbl.cl.nec.co.jp> (message from Naoki Hamada on Mon, 7 Oct 1996 10:52:24 +0900 (JST))
Reply-to: ohashi@mickey.ai.kyutech.ac.jp
X-Distribute: distribute [version 2.1 (Alpha) patchlevel=19]
X-Sequence: FreeBSD-users-jp 5891
Subject: [FreeBSD-users-jp 5891] DELAY() (Re: )
Errors-To: owner-FreeBSD-users-jp@jp.freebsd.org
Sender: owner-FreeBSD-users-jp@jp.freebsd.org

$BBg66!w6e9)Bg$G$9!%(B

  $B$d$C$H<j85$K(B PentiumPro $B$N5!3#(B(FMV-6200T4)$B$,Mh$F>/$7;~4V$,<h$l$?$N$G(B,
FreeBSD-2.2-961014-SNAP $B$rF~$l$^$7$?!%FC$K@_Dj$7$J$/$F$b(B
fxp0, vga0, wcd0, sb0 $BEv$j$N5$$K$J$k%G%P%$%9$b$_$JBg>fIW$G$9!%(B

$B$?$@!"%-!<%\!<%I$,%O%s%0%"%C%W$9$k>I>u$,ITDj4|$K5/$-$k$N$G(BDELAY()$B$r8+(B
$B$F$_$^$7$?!%(B

>> >> DELAY() $B$NCf$G0z?t$KEO$C$F$-$??tCM$r(B -20 $B$7$F$k=j$,$"$j!$$=$ND>A0$N%3(B
>> >> $B%a%s%H$b5$$K$O$J$k$N$G$9$,!E!E(B
>> 
>>   $B$3$N(B 20$B&L(Bsec $B$H$$$&$N$O$:$$$V$s@N$N(B CPU $B$G!"(BDELAY $B$N=hM}$N%*!<%P!<(B
>> $B%X%C%I$N$V$s$r8+@Q$j$7$?$b$N$N$h$&$G$9$M!#$$$^$I$-$N%^%7%s$G$O<B:]$O$b$C(B
>> $B$HC;$$$N$G!"(BDELAY $B$G;XDj$7$?$V$s$h$j$bC;$$;~4V$7$+CY1d$,$*$3$i$J$/$J$C(B
>> $B$F$7$^$C$F$$$k!"$H$$$&$N$O$"$j$,$A$N$h$&$J5$$,$7$^$9!#(B

$B$3$NLdBj$N8D=j$G$9$,!"(Bcurrent$B$G$bBP1~$5$l$F$J$$$h$&$G$9!%(B

DELAY(int n)
{
...
        /*
         * Read the counter first, so that the rest of the setup overhead is
         * counted.  Guess the initial overhead is 20 usec (on most systems it
         * takes about 1.5 usec for each of the i/o's in getit().  The loop
         * takes about 6 usec on a 486/33 and 13 usec on a 386/20.  The
         * multiplications and divisions to scale the count take a while).
         */
        prev_tick = getit();
        n -= 20;
...
}

Pentium/Pentium Pro $B$G$O!"(B2$B$+(B3 usec $B0L$N$h$&$K;W$($^$9$N$GL@$i$+$K0z$-(B
$B2a$.$G$9!%$=$l0JA0$K!"(Bn<20$B$N$H$-$O!"Ii$K$J$j(Bgetit()$B<+BN$r8F$S$^$;$s!%(B
DELAY()$B$r;H$&$H$-$K$O(B"$BBT$A(B"$B$rF~$l$?$$$H$-$J$N$G!"(Bcpu_type$B$K9g$;$F(B
offset$B$r@_Dj$9$k$h$&$K$7$F$_$^$7$?!%>e5-%3%a%s%H$r;29M$K(Boffset$B$NCM$rE,(B
$BEv$K7h$a$^$7$?$N$1$I:#$^$G$h$j$O$:$C$H$^$7$@$H;W$$$^$9!%(B

486/586/686$B$G!"0J2<$N%=!<%9$r;H$&$"$?$j$,IT0BDj$JJ}$O;n$7$F$_$F$/$@$5(B
$B$$!%LdBj$,$J$1$l$P!"(Bsend-pr $B$G$9$M!%(B

# $BB.$$(BCPU$B$G$O!"(BDELAY(20) $B0J2<$OKX$I0UL#$,$J$+$C$?$3$H$K$J$j$^$9$7!"(B
# DELAY(25) $B$"$?$j$O$-$o$I$$$H$3$@$C$?$N$G$9$M!%(B
# $B$3$l$r8+$k$HF0:n$,IT0BDj$HJs9p$5$l$F$$$F860xITL@$J%G%P%$%9$,7k9=4X78(B
# $B$7$F$$$k$+$b$7$l$^$;$s!%(B

/usr/src/sys/i386/isa/
atapi.c, ft.c, if_ar.c, if_ed.c, if_eg.c, if_el.c, if_ix.c,
istallion.c, labpc.c, lpt.c, mcd.c, ncr5380.c, psm.c, seagete.c,
ultra14f.c, wd.c, wt.c, syscons.c

/usr/src/sys/i386/eisa/
aha1742.c

/usr/src/sys/i386/scsi/
bt.c

/usr/src/sys/pci/
if_de.c, if_fxp.c

/usr/src/sys/i386/isa/cloc.c $B$KEv$F$F$/$@$5$$!%(B22-961014-SNAP $BMQ$G$9$,(B
$B<j$GEv$F$F$b$?$$$7$?$3$H$J$$$G$9!%(B

===============================================================
--- clock.c	Thu Oct 10 04:47:31 1996
+++ clock.c.new	Mon Nov  4 17:54:03 1996
@@ -145,6 +145,7 @@
 static	u_char	timer0_state;
 static	u_char	timer2_state;
 static 	void	(*timer_func) __P((struct clockframe *frame)) = hardclock;
+static	u_int	delay_offset = 20;	/* 20usec for i386 */
 
 #if defined(I586_CPU) || defined(I686_CPU)
 static	void	set_i586_ctr_freq(u_int i586_freq, u_int i8254_freq);
@@ -388,7 +389,7 @@
 	 * multiplications and divisions to scale the count take a while).
 	 */
 	prev_tick = getit();
-	n -= 20;
+	n = (n <= delay_offset) ? 1 : (n - delay_offset);
 	/*
 	 * Calculate (n * (timer_freq / 1e6)) without using floating point
 	 * and without any avoidable overflows.
@@ -565,6 +566,32 @@
 		printf("i586 clock: %u Hz, ", i586_ctr_freq);
 	}
 #endif
+
+	switch(cpu_class) {
+#if defined(I386_CPU)
+	case CPUCLASS_386:
+		delay_offset = 20;
+		break;
+#endif
+#if defined(I486_CPU)
+	case CPUCLASS_486:
+		delay_offset = 9;
+		break;
+#endif
+#if defined(I586_CPU)
+	case CPUCLASS_586:
+		delay_offset = 5;
+		break;
+#endif
+#if defined(I686_CPU)
+	case CPUCLASS_686:
+		delay_offset = 2;
+		break;
+#endif
+        default:
+		delay_offset = 0;
+		break;
+        }
 
 	printf("i8254 clock: %u Hz\n", tot_count);
 	return (tot_count);

===============================================================
