From 633c96bd85e856dea174fd325f8a297413eb6a9c Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Sun, 19 Apr 2009 03:01:46 -0700 Subject: [PATCH] X86: The startup IPI delivery mode is not reserved. --- src/arch/x86/interrupts.cc | 12 +++++++++++- src/arch/x86/interrupts.hh | 2 ++ src/arch/x86/intmessage.hh | 5 +++-- 3 files changed, 16 insertions(+), 3 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; diff --git a/src/arch/x86/interrupts.hh b/src/arch/x86/interrupts.hh index 34ea992d1..c43129133 100644 --- a/src/arch/x86/interrupts.hh +++ b/src/arch/x86/interrupts.hh @@ -129,6 +129,8 @@ class Interrupts : public BasicPioDevice, IntDev uint8_t extIntVector; bool pendingInit; uint8_t initVector; + bool pendingStartup; + uint8_t startupVector; // This is a quick check whether any of the above (except ExtInt) are set. bool pendingUnmaskableInt; diff --git a/src/arch/x86/intmessage.hh b/src/arch/x86/intmessage.hh index ec3a76c66..467085da2 100644 --- a/src/arch/x86/intmessage.hh +++ b/src/arch/x86/intmessage.hh @@ -57,19 +57,20 @@ namespace X86ISA SMI = 2, NMI = 4, INIT = 5, + SIPI = 6, ExtInt = 7, NumModes }; static const char * const names[NumModes] = { "Fixed", "LowestPriority", "SMI", "Reserved", - "NMI", "INIT", "Reserved", "ExtInt" + "NMI", "INIT", "Startup", "ExtInt" }; static inline bool isReserved(int mode) { - return mode == 3 || mode == 6; + return mode == 3; } }