diff options
author | H. Peter Anvin <hpa@zytor.com> | 2012-03-30 17:27:04 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2012-03-30 17:29:35 -0700 |
commit | 030b9a942871e73e36930154e4d484657ac8e5fa (patch) | |
tree | 0b7d48fa5698bc5dde1c6c35acff32e2f7b5127c | |
parent | 12b2033fc541241f1b5a286a1a80dd309fe2a708 (diff) | |
download | syslinux-030b9a942871e73e36930154e4d484657ac8e5fa.tar.gz |
pxe: Fix interrupt unmasking
Fix the interrupt unmasking operation; order of arguments was
reversed and the masking constant was incorrect.
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
-rw-r--r-- | core/fs/pxe/isr.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/core/fs/pxe/isr.c b/core/fs/pxe/isr.c index 0c0b8991..709d48e6 100644 --- a/core/fs/pxe/isr.c +++ b/core/fs/pxe/isr.c @@ -20,7 +20,7 @@ static bool install_irq_vector(uint8_t irq, void (*isr)(void), far_ptr_t *old) { far_ptr_t *entry; unsigned int vec; - uint8_t mask; + uint8_t mask, mymask; irq_state_t irqstate; if (irq < 8) @@ -37,17 +37,18 @@ static bool install_irq_vector(uint8_t irq, void (*isr)(void), far_ptr_t *old) entry->ptr = (uint32_t)isr; /* Enable this interrupt at the PIC level, just in case... */ + mymask = ~(1 << (irq & 7)); if (irq >= 8) { mask = inb(0x21); mask &= ~(1 << 2); /* Enable cascade */ outb(mask, 0x21); mask = inb(0xa1); - mask &= ~(1 << (irq & 3)); - outb(0xa1, mask); + mask &= mymask; + outb(mask, 0xa1); } else { mask = inb(0x21); - mask &= ~(1 << (irq & 3)); - outb(0x21, mask); + mask &= mymask; + outb(mask, 0x21); } irq_restore(irqstate); |