62a63
> #include "sim/system.hh"
369,376d369
< case APIC_INTERRUPT_COMMAND_LOW:
< panic("Local APIC Interrupt Command low"
< " register unimplemented.\n");
< break;
< case APIC_INTERRUPT_COMMAND_HIGH:
< panic("Local APIC Interrupt Command high"
< " register unimplemented.\n");
< break;
462,463c455,488
< panic("Local APIC Interrupt Command low"
< " register unimplemented.\n");
---
> {
> InterruptCommandRegLow low = regs[APIC_INTERRUPT_COMMAND_LOW];
> // Check if we're already sending an IPI.
> if (low.deliveryStatus) {
> newVal = low;
> break;
> }
> low = val;
> InterruptCommandRegHigh high = regs[APIC_INTERRUPT_COMMAND_HIGH];
> // Record that an IPI is being sent.
> low.deliveryStatus = 1;
> TriggerIntMessage message;
> message.destination = high.destination;
> message.vector = low.vector;
> message.deliveryMode = low.deliveryMode;
> message.destMode = low.destMode;
> message.level = low.level;
> message.trigger = low.trigger;
> bool timing = sys->getMemoryMode() == Enums::timing;
> switch (low.destShorthand) {
> case 0:
> intPort->sendMessage(message, timing);
> break;
> case 1:
> panic("Self IPIs aren't implemented.\n");
> break;
> case 2:
> panic("Broadcast including self IPIs aren't implemented.\n");
> break;
> case 3:
> panic("Broadcast excluding self IPIs aren't implemented.\n");
> break;
> }
> }
465,468d489
< case APIC_INTERRUPT_COMMAND_HIGH:
< panic("Local APIC Interrupt Command high"
< " register unimplemented.\n");
< break;