aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2012-03-30 17:27:04 -0700
committerH. Peter Anvin <hpa@zytor.com>2012-03-30 17:29:35 -0700
commit030b9a942871e73e36930154e4d484657ac8e5fa (patch)
tree0b7d48fa5698bc5dde1c6c35acff32e2f7b5127c
parent12b2033fc541241f1b5a286a1a80dd309fe2a708 (diff)
downloadsyslinux-030b9a942871e73e36930154e4d484657ac8e5fa.tar.gz
syslinux-030b9a942871e73e36930154e4d484657ac8e5fa.tar.xz
syslinux-030b9a942871e73e36930154e4d484657ac8e5fa.zip
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.c11
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);