X86: The startup IPI delivery mode is not reserved.
authorGabe Black <gblack@eecs.umich.edu>
Sun, 19 Apr 2009 10:01:46 +0000 (03:01 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Sun, 19 Apr 2009 10:01:46 +0000 (03:01 -0700)
src/arch/x86/interrupts.cc
src/arch/x86/interrupts.hh
src/arch/x86/intmessage.hh

index 7043840d21efd1225afcfb3382eb1102bea81d81..7f47b39c13b021731da54186b49d4bcf181e81bd 100644 (file)
@@ -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;
index 34ea992d18223109a268e007012bf6db97530291..c4312913376742979275036f08857671bb27a2ab 100644 (file)
@@ -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;
index ec3a76c66b5f31e6de482bc99b618b9bed3d982a..467085da2b81ef14d940c37462e979f135e23425 100644 (file)
@@ -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;
         }
     }