
From: john stultz <johnstul@us.ibm.com>

In testing for SLES9, we ran across a bug caused by userspace apps poking
the PIT which caused bad values to be read by the kernel.  This would then
trigger the lost tick detection code with insane values and would then
break the SCSI subsystem.

This patch includes the PIT sanity check from the TSC timesource into the
cyclone timesource code, which catches the bad case described above and
resolves the issue.

Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/arch/i386/kernel/timers/timer_cyclone.c |   12 ++++++++++++
 1 files changed, 12 insertions(+)

diff -puN arch/i386/kernel/timers/timer_cyclone.c~cyclone-pit-sanity-checking arch/i386/kernel/timers/timer_cyclone.c
--- 25/arch/i386/kernel/timers/timer_cyclone.c~cyclone-pit-sanity-checking	2004-06-07 22:21:34.857936104 -0700
+++ 25-akpm/arch/i386/kernel/timers/timer_cyclone.c	2004-06-07 22:21:34.861935496 -0700
@@ -17,6 +17,7 @@
 #include <asm/io.h>
 #include <asm/pgtable.h>
 #include <asm/fixmap.h>
+#include "io_ports.h"
 
 extern spinlock_t i8253_lock;
 
@@ -62,6 +63,17 @@ static void mark_offset_cyclone(void)
 
 	count = inb_p(0x40);    /* read the latched count */
 	count |= inb(0x40) << 8;
+
+	/*
+	 * VIA686a test code... reset the latch if count > max + 1
+	 * from timer_pit.c - cjb
+	 */
+	if (count > LATCH) {
+		outb_p(0x34, PIT_MODE);
+		outb_p(LATCH & 0xff, PIT_CH0);
+		outb(LATCH >> 8, PIT_CH0);
+		count = LATCH - 1;
+	}
 	spin_unlock(&i8253_lock);
 
 	/* lost tick compensation */
_
