X86: The startup IPI delivery mode is not reserved.

This commit is contained in:
Gabe Black 2009-04-19 03:01:46 -07:00
parent 08f021aad0
commit 633c96bd85
3 changed files with 16 additions and 3 deletions

View file

@ -282,6 +282,9 @@ X86ISA::Interrupts::requestInterrupt(uint8_t vector,
} else if (deliveryMode == DeliveryMode::INIT && !pendingInit) { } else if (deliveryMode == DeliveryMode::INIT && !pendingInit) {
pendingUnmaskableInt = pendingInit = true; pendingUnmaskableInt = pendingInit = true;
initVector = vector; initVector = vector;
} else if (deliveryMode == DeliveryMode::SIPI && !pendingStartup) {
pendingUnmaskableInt = pendingStartup = true;
startupVector = vector;
} }
} }
cpu->wakeup(); cpu->wakeup();
@ -538,6 +541,7 @@ X86ISA::Interrupts::Interrupts(Params * p) :
pendingNmi(false), nmiVector(0), pendingNmi(false), nmiVector(0),
pendingExtInt(false), extIntVector(0), pendingExtInt(false), extIntVector(0),
pendingInit(false), initVector(0), pendingInit(false), initVector(0),
pendingStartup(false), startupVector(0),
pendingUnmaskableInt(false) pendingUnmaskableInt(false)
{ {
pioSize = PageBytes; pioSize = PageBytes;
@ -587,6 +591,9 @@ X86ISA::Interrupts::getInterrupt(ThreadContext *tc)
} else if (pendingInit) { } else if (pendingInit) {
DPRINTF(LocalApic, "Generated INIT fault object.\n"); DPRINTF(LocalApic, "Generated INIT fault object.\n");
return new InitInterrupt(initVector); return new InitInterrupt(initVector);
} else if (pendingStartup) {
DPRINTF(LocalApic, "Generating SIPI fault object.\n");
return new StartupInterrupt(startupVector);
} else { } else {
panic("pendingUnmaskableInt set, but no unmaskable " panic("pendingUnmaskableInt set, but no unmaskable "
"ints were pending.\n"); "ints were pending.\n");
@ -616,8 +623,11 @@ X86ISA::Interrupts::updateIntrInfo(ThreadContext *tc)
} else if (pendingInit) { } else if (pendingInit) {
DPRINTF(LocalApic, "Init sent to core.\n"); DPRINTF(LocalApic, "Init sent to core.\n");
pendingInit = false; pendingInit = false;
} else if (pendingStartup) {
DPRINTF(LocalApic, "SIPI sent to core.\n");
pendingStartup = false;
} }
if (!(pendingSmi || pendingNmi || pendingInit)) if (!(pendingSmi || pendingNmi || pendingInit || pendingStartup))
pendingUnmaskableInt = false; pendingUnmaskableInt = false;
} else if (pendingExtInt) { } else if (pendingExtInt) {
pendingExtInt = false; pendingExtInt = false;

View file

@ -129,6 +129,8 @@ class Interrupts : public BasicPioDevice, IntDev
uint8_t extIntVector; uint8_t extIntVector;
bool pendingInit; bool pendingInit;
uint8_t initVector; uint8_t initVector;
bool pendingStartup;
uint8_t startupVector;
// This is a quick check whether any of the above (except ExtInt) are set. // This is a quick check whether any of the above (except ExtInt) are set.
bool pendingUnmaskableInt; bool pendingUnmaskableInt;

View file

@ -57,19 +57,20 @@ namespace X86ISA
SMI = 2, SMI = 2,
NMI = 4, NMI = 4,
INIT = 5, INIT = 5,
SIPI = 6,
ExtInt = 7, ExtInt = 7,
NumModes NumModes
}; };
static const char * const names[NumModes] = { static const char * const names[NumModes] = {
"Fixed", "LowestPriority", "SMI", "Reserved", "Fixed", "LowestPriority", "SMI", "Reserved",
"NMI", "INIT", "Reserved", "ExtInt" "NMI", "INIT", "Startup", "ExtInt"
}; };
static inline bool static inline bool
isReserved(int mode) isReserved(int mode)
{ {
return mode == 3 || mode == 6; return mode == 3;
} }
} }