From 5c41d44d7d348701f445bb074d86562d12c6ca79 Mon Sep 17 00:00:00 2001 From: chrfranke Date: Thu, 7 Aug 2008 19:43:36 +0000 Subject: [PATCH] 2008-08-07 Christian Franke * kern/i386/pit.c (TIMER2_SPEAKER): New define. (TIMER2_GATE): Likewise. (grub_pit_wait): Add enable/disable of the timer2 gate bit of port 0x61. This fixes a possible infinite loop. --- ChangeLog | 7 +++++++ kern/i386/pit.c | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/ChangeLog b/ChangeLog index 334b1d8c4..1237565be 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-08-07 Christian Franke + + * kern/i386/pit.c (TIMER2_SPEAKER): New define. + (TIMER2_GATE): Likewise. + (grub_pit_wait): Add enable/disable of the timer2 gate + bit of port 0x61. This fixes a possible infinite loop. + 2008-08-07 Bean * conf/x86_64-efi.rmk (kernel_mod_SOURCES): Add kern/time.c, diff --git a/kern/i386/pit.c b/kern/i386/pit.c index fad521b1a..82a17d3e0 100644 --- a/kern/i386/pit.c +++ b/kern/i386/pit.c @@ -28,13 +28,29 @@ #define TIMER_ENABLE_LSB 0x20 #define TIMER_ENABLE_MSB 0x10 #define TIMER2_LATCH 0x20 +#define TIMER2_SPEAKER 0x02 +#define TIMER2_GATE 0x01 void grub_pit_wait (grub_uint16_t tics) { + /* Disable timer2 gate and speaker. */ + grub_outb (grub_inb (TIMER2_REG_LATCH) & ~ (TIMER2_SPEAKER | TIMER2_GATE), + TIMER2_REG_LATCH); + + /* Set tics. */ grub_outb (TIMER2_SELECT | TIMER_ENABLE_LSB | TIMER_ENABLE_MSB, TIMER_REG_COMMAND); grub_outb (tics & 0xff, TIMER2_REG_CONTROL); grub_outb (tics >> 8, TIMER2_REG_CONTROL); + /* Enable timer2 gate, keep speaker disabled. */ + grub_outb ((grub_inb (TIMER2_REG_LATCH) & ~ TIMER2_SPEAKER) | TIMER2_GATE, + TIMER2_REG_LATCH); + + /* Wait. */ while ((grub_inb (TIMER2_REG_LATCH) & TIMER2_LATCH) == 0x00); + + /* Disable timer2 gate and speaker. */ + grub_outb (grub_inb (TIMER2_REG_LATCH) & ~ (TIMER2_SPEAKER | TIMER2_GATE), + TIMER2_REG_LATCH); } -- 2.39.5