From 8e664f395965b7ff5945d7665eda28cf5592a10a Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Sun, 12 Oct 2008 23:22:58 -0700 Subject: X86: Make the I8259 PIC accept a specific EOI command. --- src/dev/x86/i8259.cc | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) (limited to 'src/dev/x86/i8259.cc') diff --git a/src/dev/x86/i8259.cc b/src/dev/x86/i8259.cc index be0bfbe4d..3b0053ee9 100644 --- a/src/dev/x86/i8259.cc +++ b/src/dev/x86/i8259.cc @@ -107,8 +107,12 @@ X86ISA::I8259::write(PacketPtr pkt) DPRINTF(I8259, "Subcommand: No operation.\n"); break; case 0x3: - DPRINTF(I8259, "Subcommand: Specific EIO."); - DPRINTF(I8259, "Reset In-Service bit %d.\n", bits(val, 2, 0)); + { + int line = bits(val, 2, 0); + DPRINTF(I8259, "Subcommand: Specific EIO on line %d.\n", + line); + handleEOI(line); + } break; case 0x4: DPRINTF(I8259, "Subcommand: Rotate in auto-EOI mode (set).\n"); @@ -205,6 +209,30 @@ X86ISA::I8259::write(PacketPtr pkt) return latency; } +void +X86ISA::I8259::handleEOI(int line) +{ + ISR &= ~(1 << line); + // There may be an interrupt that was waiting which can + // now be sent. + if (IRR) + requestInterrupt(findMsbSet(IRR)); +} + +void +X86ISA::I8259::requestInterrupt(int line) +{ + if (bits(ISR, 7, line) == 0) { + if (output) { + DPRINTF(I8259, "Propogating interrupt.\n"); + output->signalInterrupt(); + } else { + warn("Received interrupt but didn't have " + "anyone to tell about it.\n"); + } + } +} + void X86ISA::I8259::signalInterrupt(int line) { @@ -216,15 +244,7 @@ X86ISA::I8259::signalInterrupt(int line) DPRINTF(I8259, "Interrupt %d was masked.\n", line); } else { IRR |= 1 << line; - if (bits(ISR, 7, line) == 0) { - if (output) { - DPRINTF(I8259, "Propogating interrupt.\n"); - output->signalInterrupt(); - } else { - warn("Received interrupt but didn't have " - "anyone to tell about it.\n"); - } - } + requestInterrupt(line); } } -- cgit v1.2.3