X86: Only recognize the first startup IPI after INIT or reset.
This commit is contained in:
parent
4d32cd10ce
commit
18b3863127
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue