X86: Make the I8259 PIC accept a specific EOI command.

This commit is contained in:
Gabe Black
2008-10-12 23:22:58 -07:00
parent e3004c579f
commit 8e664f3959
2 changed files with 34 additions and 11 deletions

View File

@@ -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);
}
}

View File

@@ -73,6 +73,9 @@ class I8259 : public BasicPioDevice, public IntDev
bool expectICW4;
int initControlWord;
void requestInterrupt(int line);
void handleEOI(int line);
public:
typedef I8259Params Params;