diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2009-04-19 03:56:36 -0700 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2009-04-19 03:56:36 -0700 |
commit | 18b38631274aa6197cb637f2e69d765dd24c8cf3 (patch) | |
tree | 9ad3c52c7b3c4e6060255f2e5462a7c791f9de30 /src | |
parent | 4d32cd10ce5543fcec1ffb21d5e66c510d29e24d (diff) | |
download | gem5-18b38631274aa6197cb637f2e69d765dd24c8cf3.tar.xz |
X86: Only recognize the first startup IPI after INIT or reset.
Diffstat (limited to 'src')
-rw-r--r-- | src/arch/x86/interrupts.cc | 7 | ||||
-rw-r--r-- | src/arch/x86/interrupts.hh | 1 |
2 files changed, 6 insertions, 2 deletions
diff --git a/src/arch/x86/interrupts.cc b/src/arch/x86/interrupts.cc index c247d9ebc..e51fef623 100644 --- a/src/arch/x86/interrupts.cc +++ b/src/arch/x86/interrupts.cc @@ -282,7 +282,8 @@ X86ISA::Interrupts::requestInterrupt(uint8_t vector, } else if (deliveryMode == DeliveryMode::INIT && !pendingInit) { pendingUnmaskableInt = pendingInit = true; initVector = vector; - } else if (deliveryMode == DeliveryMode::SIPI && !pendingStartup) { + } else if (deliveryMode == DeliveryMode::SIPI && + !pendingStartup && !startedUp) { pendingUnmaskableInt = pendingStartup = true; startupVector = vector; } @@ -562,7 +563,7 @@ X86ISA::Interrupts::Interrupts(Params * p) : pendingExtInt(false), extIntVector(0), pendingInit(false), initVector(0), pendingStartup(false), startupVector(0), - pendingUnmaskableInt(false) + startedUp(false), pendingUnmaskableInt(false) { pioSize = PageBytes; memset(regs, 0, sizeof(regs)); @@ -643,9 +644,11 @@ X86ISA::Interrupts::updateIntrInfo(ThreadContext *tc) } else if (pendingInit) { DPRINTF(LocalApic, "Init sent to core.\n"); pendingInit = false; + startedUp = false; } else if (pendingStartup) { DPRINTF(LocalApic, "SIPI sent to core.\n"); pendingStartup = false; + startedUp = true; } if (!(pendingSmi || pendingNmi || pendingInit || pendingStartup)) pendingUnmaskableInt = false; diff --git a/src/arch/x86/interrupts.hh b/src/arch/x86/interrupts.hh index ba92c77d6..6ae77d7e3 100644 --- a/src/arch/x86/interrupts.hh +++ b/src/arch/x86/interrupts.hh @@ -131,6 +131,7 @@ class Interrupts : public BasicPioDevice, IntDev uint8_t initVector; bool pendingStartup; uint8_t startupVector; + bool startedUp; // This is a quick check whether any of the above (except ExtInt) are set. bool pendingUnmaskableInt; |