summaryrefslogtreecommitdiff
path: root/src/arch/x86/interrupts.cc
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2009-04-19 03:56:36 -0700
committerGabe Black <gblack@eecs.umich.edu>2009-04-19 03:56:36 -0700
commit18b38631274aa6197cb637f2e69d765dd24c8cf3 (patch)
tree9ad3c52c7b3c4e6060255f2e5462a7c791f9de30 /src/arch/x86/interrupts.cc
parent4d32cd10ce5543fcec1ffb21d5e66c510d29e24d (diff)
downloadgem5-18b38631274aa6197cb637f2e69d765dd24c8cf3.tar.xz
X86: Only recognize the first startup IPI after INIT or reset.
Diffstat (limited to 'src/arch/x86/interrupts.cc')
-rw-r--r--src/arch/x86/interrupts.cc7
1 files changed, 5 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;