summaryrefslogtreecommitdiff
path: root/src/arch/x86/interrupts.cc
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2009-04-19 03:01:46 -0700
committerGabe Black <gblack@eecs.umich.edu>2009-04-19 03:01:46 -0700
commit633c96bd85e856dea174fd325f8a297413eb6a9c (patch)
tree4bed6671f0ab08c951fd2aac2cd942d3138ff2a3 /src/arch/x86/interrupts.cc
parent08f021aad0aa2ce7510060e1d29523dada226236 (diff)
downloadgem5-633c96bd85e856dea174fd325f8a297413eb6a9c.tar.xz
X86: The startup IPI delivery mode is not reserved.
Diffstat (limited to 'src/arch/x86/interrupts.cc')
-rw-r--r--src/arch/x86/interrupts.cc12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/arch/x86/interrupts.cc b/src/arch/x86/interrupts.cc
index 7043840d2..7f47b39c1 100644
--- a/src/arch/x86/interrupts.cc
+++ b/src/arch/x86/interrupts.cc
@@ -282,6 +282,9 @@ X86ISA::Interrupts::requestInterrupt(uint8_t vector,
} else if (deliveryMode == DeliveryMode::INIT && !pendingInit) {
pendingUnmaskableInt = pendingInit = true;
initVector = vector;
+ } else if (deliveryMode == DeliveryMode::SIPI && !pendingStartup) {
+ pendingUnmaskableInt = pendingStartup = true;
+ startupVector = vector;
}
}
cpu->wakeup();
@@ -538,6 +541,7 @@ X86ISA::Interrupts::Interrupts(Params * p) :
pendingNmi(false), nmiVector(0),
pendingExtInt(false), extIntVector(0),
pendingInit(false), initVector(0),
+ pendingStartup(false), startupVector(0),
pendingUnmaskableInt(false)
{
pioSize = PageBytes;
@@ -587,6 +591,9 @@ X86ISA::Interrupts::getInterrupt(ThreadContext *tc)
} else if (pendingInit) {
DPRINTF(LocalApic, "Generated INIT fault object.\n");
return new InitInterrupt(initVector);
+ } else if (pendingStartup) {
+ DPRINTF(LocalApic, "Generating SIPI fault object.\n");
+ return new StartupInterrupt(startupVector);
} else {
panic("pendingUnmaskableInt set, but no unmaskable "
"ints were pending.\n");
@@ -616,8 +623,11 @@ X86ISA::Interrupts::updateIntrInfo(ThreadContext *tc)
} else if (pendingInit) {
DPRINTF(LocalApic, "Init sent to core.\n");
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;
} else if (pendingExtInt) {
pendingExtInt = false;