diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2009-04-26 02:09:27 -0700 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2009-04-26 02:09:27 -0700 |
commit | 2f34a7eaeb6d82b745fbd57fa4cc31d874ed202c (patch) | |
tree | d92201550da7dd68146ef0e43b862c61611cab38 /src/dev/x86/i82094aa.cc | |
parent | 88ab4bb257265cee555baafb940cee42c12f159a (diff) | |
download | gem5-2f34a7eaeb6d82b745fbd57fa4cc31d874ed202c.tar.xz |
X86: Tell the function that sends int messages who to send to instead of figuring it out itself.
Diffstat (limited to 'src/dev/x86/i82094aa.cc')
-rw-r--r-- | src/dev/x86/i82094aa.cc | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/dev/x86/i82094aa.cc b/src/dev/x86/i82094aa.cc index 3f0ed9e96..ad9b29dd0 100644 --- a/src/dev/x86/i82094aa.cc +++ b/src/dev/x86/i82094aa.cc @@ -28,6 +28,7 @@ * Authors: Gabe Black */ +#include "arch/x86/interrupts.hh" #include "arch/x86/intmessage.hh" #include "dev/x86/i82094aa.hh" #include "dev/x86/i8259.hh" @@ -162,7 +163,38 @@ X86ISA::I82094AA::signalInterrupt(int line) message.destMode = entry.destMode; message.level = entry.polarity; message.trigger = entry.trigger; - intPort->sendMessage(message, sys->getMemoryMode() == Enums::timing); + ApicList apics; + int numContexts = sys->numContexts(); + if (message.destMode == 0) { + if (message.deliveryMode == DeliveryMode::LowestPriority) { + panic("Lowest priority delivery mode from the " + "IO APIC aren't supported in physical " + "destination mode.\n"); + } + if (message.destination == 0xFF) { + for (int i = 0; i < numContexts; i++) { + apics.push_back(i); + } + } else { + apics.push_back(message.destination); + } + } else { + for (int i = 0; i < numContexts; i++) { + std::map<int, Interrupts *>::iterator localApicIt = + localApics.find(i); + assert(localApicIt != localApics.end()); + Interrupts *localApic = localApicIt->second; + if ((localApic->readReg(APIC_LOGICAL_DESTINATION) >> 24) & + message.destination) { + apics.push_back(localApicIt->first); + } + } + if (message.deliveryMode == DeliveryMode::LowestPriority) { + panic("Lowest priority delivery mode is not implemented.\n"); + } + } + intPort->sendMessage(apics, message, + sys->getMemoryMode() == Enums::timing); } } |