From owner-FreeBSD-users-jp@jp.FreeBSD.org Wed Oct 15 19:41:40 2003
Received: (from daemon@localhost)
	by castle.jp.FreeBSD.org (8.11.6p2+3.4W/8.11.3) id h9FAfeu29795;
	Wed, 15 Oct 2003 19:41:40 +0900 (JST)
	(envelope-from owner-FreeBSD-users-jp@jp.FreeBSD.org)
Received: from server.t.kanazawa-u.ac.jp (server.t.kanazawa-u.ac.jp [133.28.12.20])
	by castle.jp.FreeBSD.org (8.11.6p2+3.4W/8.11.3) with ESMTP/inet id h9FAfdM29789
	for <FreeBSD-users-jp@jp.FreeBSD.org>; Wed, 15 Oct 2003 19:41:39 +0900 (JST)
	(envelope-from hirano@t.kanazawa-u.ac.jp)
Received: from fw-t (fw-t-dmz [10.12.2.1])
	by server.t.kanazawa-u.ac.jp (8.12.10/8.12.10) with SMTP id h9FAfdcv011577
	for <FreeBSD-users-jp@jp.FreeBSD.org>; Wed, 15 Oct 2003 19:41:39 +0900 (JST)
Received: from pisces.ec.t.kanazawa-u.ac.jp ([133.28.119.45]) by fw-t; Wed, 15 Oct 2003 19:41:38 +0900 (JST)
Received: from localhost (pisces.ec.t.kanazawa-u.ac.jp [133.28.119.45])
	by pisces.ec.t.kanazawa-u.ac.jp (8.12.10/8.12.6) with ESMTP id h9FAfcs8080085
	for <FreeBSD-users-jp@jp.FreeBSD.org>; Wed, 15 Oct 2003 19:41:38 +0900 (JST)
	(envelope-from hirano@t.kanazawa-u.ac.jp)
Message-Id: <20031015.194137.78783610.hirano@t.kanazawa-u.ac.jp>
To: FreeBSD-users-jp@jp.FreeBSD.org
From: Akihiro HIRANO <hirano@t.kanazawa-u.ac.jp>
In-Reply-To: <20031010.012232.42772328.ie9t-sbgk@asahi-net.or.jp>
References: <3F8569BE.80400@a-net.email.ne.jp>
	<20031010.012232.42772328.ie9t-sbgk@asahi-net.or.jp>
X-Mailer: Mew version 2.0 on Emacs 20.7 / Mule 4.0 (HANANOEN)
Mime-Version: 1.0
Content-Type: Multipart/Mixed;
 boundary="--Next_Part(Wed_Oct_15_19:41:37_2003_835)--"
Content-Transfer-Encoding: 7bit
Reply-To: FreeBSD-users-jp@jp.FreeBSD.org
Precedence: list
Date: Wed, 15 Oct 2003 19:41:37 +0900
X-Sequence: FreeBSD-users-jp 76870
Subject: [FreeBSD-users-jp 76870] Re: CASIO FIVA 102 
Sender: owner-FreeBSD-users-jp@jp.FreeBSD.org
X-Originator: hirano@t.kanazawa-u.ac.jp
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+031013

----Next_Part(Wed_Oct_15_19:41:37_2003_835)--
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

$BJ?Ln(B@$B6bBtBg(B.$BF(Hr%b!<%I$G$9!D(B

From: Takeshi Shibagaki <ie9t-sbgk@asahi-net.or.jp>
> From: Hironori Miyagawa <hm@a-net.email.ne.jp>
> 
> hm> $BI=Bj$N5!<o$G$9$,!"0JA0(B Media GX $B$NLdBj$,Js9p$5$l$F$$$?$h$&$K5-21$7$F$$$^(B
> hm> $B$9!#8=67(B(4.8R$B!"(B5.1R$BEy$G(B)$B$r$4B8CN$NJ}$$$i$C$7$c$$$^$9$G$7$g$&$+!)!#(B
> 
> RTC$B$,$^$H$b$KF0$$$F$$$J$$$N$G!"(BDELAY()$B$,$^$H$b$KF0$-$^$;$s!#(B
> $B$=$N$?$a!"3N$+!"(Bpsm$B$H(Bcbb$B$OF0$+$J$+$C$?$h$&$J5$$,$7$^$9!#(B

$B!!EvJ}$O(BFIVA 101$B$G$9$,!"AG$N(B4.1R$B$d(B4.7R$B$G$OLdBj$,5/$3$j$^$9!#(B3.x$B$N%Q%C(B
$B%A$r;29M$K!"E:IU$7$?$h$&$J%Q%C%A$rEv$F$F$$$^$9!#(B3.x$B$G$O(Bpsm.c$B$K$b%Q%C%A(B
$B$rEv$F$F$$$^$7$?$,!"$3$A$i$O(B4.x$B$G$OITMW$N$h$&$G$9!#(B4.7R-p23$B$G!"(Bconfig
$B$K!V(Boptions BROKEN_CLOCK$B!W$rDI2C$7$?%+!<%M%k$G!"$H$j$"$($:%-!<%\!<%I$H(B
$B%?%C%A%Q%C%I(B (psm0) $B$OL5;v$KF0$$$F$$$^$9!#(B4.1R$B$+$i(Bmake installworld$B$G(B
4.7R $B$K$7$?$H$$$&2x$7$2$J>uBV$G!"(BXFree86$B$O(B4.1R$B$N$^$^$G(B3.6.x$B$@$C$?$j$7(B
$B$^$9$1$I!#(B

$B!!$J$*!"(BAPM$B4X78$O!V(Bshutdown -p now$B!W$GEE8;$,@Z$l$k$N$r3NG'$7$F$$$kDxEY(B
$B$G$9!#%5%9%Z%s%IEy$OL$3NG'$G$9!#%P%C%F%j@Z$l$HF1;~$KA`:nITG=$K4Y$C$?$N(B
$B$G!"2?$+$"$j$=$&$G$9$,!D(B

$B!!$H$j$"$($:$4;29M$^$G$K!D(B
----
$BJ?Ln989((B@$B6bBtBg3X9)3XIt(B $B>pJs%7%9%F%`9)3X2J(B ($B5l(B $BEE5$!&>pJs9)3X2J(B)
hirano@t.kanazawa-u.ac.jp

----Next_Part(Wed_Oct_15_19:41:37_2003_835)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="FIVA-4.7-clock.patch"

--- sys/i386/isa/clock.c.orig	Sun Oct 31 15:04:52 1999
+++ sys/i386/isa/clock.c	Mon Mar 13 23:52:22 2000
@@ -101,6 +101,11 @@
 #endif
 #endif /* SMP */
 
+#ifdef BROKEN_CLOCK
+static void check_clock_bug __P((void));
+static __inline int getit_broken_latch __P((void));
+#endif /* BROKEN_CLOCK */
+
 /*
  * 32-bit time_t's can't reach leap years before 1904 or after 2036, so we
  * can use a simple formula for leap years.
@@ -196,6 +201,91 @@
 SYSCTL_OPAQUE(_debug, OID_AUTO, i8254_timecounter, CTLFLAG_RD, 
 	&i8254_timecounter, sizeof(i8254_timecounter), "S,timecounter", "");
 
+#ifdef BROKEN_CLOCK
+static int clock_broken_latch = 0;
+
+/*
+ * check i8254 latch routine:
+ *	set the variable 'clock_broken_latch'
+ *	XXX check only cpu_id
+ */
+static void
+check_clock_bug()
+{
+	/* extern int cpu_id; */
+
+	switch (cpu_id & 0xff0) {
+	case 0x440:     /* Cyrix MediaGX */
+	case 0x540:     /* GXm */
+		clock_broken_latch = 1;
+		break;
+	default:
+		clock_broken_latch = 0;
+		break;
+	}
+}
+
+int
+getit_broken_latch()
+{
+	u_long ef;
+	int v1, v2, v3;
+	int w1, w2, w3;
+
+	/* Don't want someone screwing with the counter
+	   while we're here. */
+	ef = read_eflags();
+	disable_intr();
+
+	v1 = inb(TIMER_CNTR0);
+	v1 |= inb(TIMER_CNTR0) << 8;
+	v2 = inb(TIMER_CNTR0);
+	v2 |= inb(TIMER_CNTR0) << 8;
+	v3 = inb(TIMER_CNTR0);
+	v3 |= inb(TIMER_CNTR0) << 8;
+
+	write_eflags(ef);
+
+	if (v1 >= v2 && v2 >= v3 && v1 - v3 < 0x200)
+		return (v2);
+
+#define _swap_val(a, b) do { \
+	int c = a; \
+	a = b; \
+	b = c; \
+} while (0)
+
+	/*
+	 * sort v1 v2 v3
+	 */
+	if (v1 < v2)
+		_swap_val(v1, v2);
+	if (v2 < v3)
+		_swap_val(v2, v3);
+	if (v1 < v2)
+		_swap_val(v1, v2);
+
+	/*
+	 * compute the middle value
+	 */
+
+	if (v1 - v3 < 0x200)
+		return (v2);
+
+	w1 = v2 - v3;
+	w2 = v3 - v1 + timer0_max_count;
+	w3 = v1 - v2;
+	if (w1 >= w2) {
+		if (w1 >= w3)
+			return (v1);
+	} else {
+		if (w2 >= w3)
+			return (v2);
+	}
+	return (v3);
+}
+#endif /* BROKEN_CLOCK */
+
 static void
 clkintr(struct clockframe frame)
 {
@@ -418,6 +508,11 @@
 	u_long ef;
 	int high, low;
 
+#ifdef BROKEN_CLOCK
+	if (clock_broken_latch)
+		return (getit_broken_latch());
+#endif /* BROKEN_CLOCK */
+
 	ef = read_eflags();
 	disable_intr();
 
@@ -732,6 +827,10 @@
 startrtclock()
 {
 	u_int delta, freq;
+
+#ifdef BROKEN_CLOCK
+	check_clock_bug();
+#endif /* BROKEN_CLOCK */
 
 	if (cpu_feature & CPUID_TSC)
 		tsc_present = 1;
--- sys/conf/options.i386.orig	Thu Nov 21 19:07:24 2002
+++ sys/conf/options.i386	Wed Oct  8 19:14:21 2003
@@ -213,6 +213,8 @@
 # SMB/CIFS filesystem
 SMBFS
 
+# MediaGX broken clock latch
+BROKEN_CLOCK		opt_clock.h
 # -------------------------------
 # EOF
 # -------------------------------

----Next_Part(Wed_Oct_15_19:41:37_2003_835)----
