summaryrefslogtreecommitdiff
path: root/src/dev
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2008-10-12 23:22:58 -0700
committerGabe Black <gblack@eecs.umich.edu>2008-10-12 23:22:58 -0700
commit8e664f395965b7ff5945d7665eda28cf5592a10a (patch)
treedb66b55e611fb77297854167cde1d6a6a57425f2 /src/dev
parente3004c579fcd7c3f34dfcbd90169c5aa9218a65b (diff)
downloadgem5-8e664f395965b7ff5945d7665eda28cf5592a10a.tar.xz
X86: Make the I8259 PIC accept a specific EOI command.
Diffstat (limited to 'src/dev')
-rw-r--r--src/dev/x86/i8259.cc42
-rw-r--r--src/dev/x86/i8259.hh3
2 files changed, 34 insertions, 11 deletions
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");
@@ -206,6 +210,30 @@ X86ISA::I8259::write(PacketPtr pkt)
}
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)
{
DPRINTF(I8259, "Interrupt raised on line %d.\n", 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);
}
}
diff --git a/src/dev/x86/i8259.hh b/src/dev/x86/i8259.hh
index 371a27874..6f6d3f038 100644
--- a/src/dev/x86/i8259.hh
+++ b/src/dev/x86/i8259.hh
@@ -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;