From: john stultz 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 --- 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 #include #include +#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 */ _