X86: Only recognize the first startup IPI after INIT or reset.

This commit is contained in:
Gabe Black 2009-04-19 03:56:36 -07:00
parent 4d32cd10ce
commit 18b3863127
2 changed files with 6 additions and 2 deletions

View file

@ -282,7 +282,8 @@ 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) { } else if (deliveryMode == DeliveryMode::SIPI &&
!pendingStartup && !startedUp) {
pendingUnmaskableInt = pendingStartup = true; pendingUnmaskableInt = pendingStartup = true;
startupVector = vector; startupVector = vector;
} }
@ -562,7 +563,7 @@ X86ISA::Interrupts::Interrupts(Params * p) :
pendingExtInt(false), extIntVector(0), pendingExtInt(false), extIntVector(0),
pendingInit(false), initVector(0), pendingInit(false), initVector(0),
pendingStartup(false), startupVector(0), pendingStartup(false), startupVector(0),
pendingUnmaskableInt(false) startedUp(false), pendingUnmaskableInt(false)
{ {
pioSize = PageBytes; pioSize = PageBytes;
memset(regs, 0, sizeof(regs)); memset(regs, 0, sizeof(regs));
@ -643,9 +644,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;
startedUp = false;
} else if (pendingStartup) { } else if (pendingStartup) {
DPRINTF(LocalApic, "SIPI sent to core.\n"); DPRINTF(LocalApic, "SIPI sent to core.\n");
pendingStartup = false; pendingStartup = false;
startedUp = true;
} }
if (!(pendingSmi || pendingNmi || pendingInit || pendingStartup)) if (!(pendingSmi || pendingNmi || pendingInit || pendingStartup))
pendingUnmaskableInt = false; pendingUnmaskableInt = false;

View file

@ -131,6 +131,7 @@ class Interrupts : public BasicPioDevice, IntDev
uint8_t initVector; uint8_t initVector;
bool pendingStartup; bool pendingStartup;
uint8_t startupVector; uint8_t startupVector;
bool startedUp;
// 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;