From: chrfranke Date: Thu, 7 Aug 2008 19:43:36 +0000 (+0000) Subject: 2008-08-07 Christian Franke X-Git-Tag: 1.98~1324 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5c41d44d7d348701f445bb074d86562d12c6ca79;p=thirdparty%2Fgrub.git 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. --- 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); }