summaryrefslogtreecommitdiff
path: root/src/dev/x86/intdev.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/dev/x86/intdev.cc')
-rw-r--r--src/dev/x86/intdev.cc47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/dev/x86/intdev.cc b/src/dev/x86/intdev.cc
index e386687a9..3b29eb7bf 100644
--- a/src/dev/x86/intdev.cc
+++ b/src/dev/x86/intdev.cc
@@ -30,6 +30,53 @@
#include "dev/x86/intdev.hh"
+void
+X86ISA::IntDev::IntPort::sendMessage(TriggerIntMessage message, bool timing)
+{
+ if (DeliveryMode::isReserved(message.deliveryMode)) {
+ fatal("Tried to use reserved delivery mode %d\n",
+ message.deliveryMode);
+ } else if (DTRACE(IntDev)) {
+ DPRINTF(IntDev, "Delivery mode is: %s.\n",
+ DeliveryMode::names[message.deliveryMode]);
+ DPRINTF(IntDev, "Vector is %#x.\n", message.vector);
+ }
+ if (message.destMode == 0) {
+ DPRINTF(IntDev,
+ "Sending interrupt to APIC ID %d.\n", message.destination);
+ PacketPtr pkt = buildIntRequest(message.destination, message);
+ if (timing)
+ sendMessageTiming(pkt, latency);
+ else
+ sendMessageAtomic(pkt);
+ } else {
+ DPRINTF(IntDev, "Sending interrupts to APIC IDs:"
+ "%s%s%s%s%s%s%s%s\n",
+ bits((int)message.destination, 0) ? " 0": "",
+ bits((int)message.destination, 1) ? " 1": "",
+ bits((int)message.destination, 2) ? " 2": "",
+ bits((int)message.destination, 3) ? " 3": "",
+ bits((int)message.destination, 4) ? " 4": "",
+ bits((int)message.destination, 5) ? " 5": "",
+ bits((int)message.destination, 6) ? " 6": "",
+ bits((int)message.destination, 7) ? " 7": ""
+ );
+ uint8_t dests = message.destination;
+ uint8_t id = 0;
+ while(dests) {
+ if (dests & 0x1) {
+ PacketPtr pkt = buildIntRequest(id, message);
+ if (timing)
+ sendMessageTiming(pkt, latency);
+ else
+ sendMessageAtomic(pkt);
+ }
+ dests >>= 1;
+ id++;
+ }
+ }
+}
+
X86ISA::IntSourcePin *
X86IntSourcePinParams::create()
{