changeset 852ba59fa8d9 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=852ba59fa8d9
description:
        X86: The startup IPI delivery mode is not reserved.

diffstat:

3 files changed, 16 insertions(+), 3 deletions(-)
src/arch/x86/interrupts.cc |   12 +++++++++++-
src/arch/x86/interrupts.hh |    2 ++
src/arch/x86/intmessage.hh |    5 +++--

diffs (82 lines):

diff -r 595b5016f6d5 -r 852ba59fa8d9 src/arch/x86/interrupts.cc
--- a/src/arch/x86/interrupts.cc        Sun Apr 19 02:56:03 2009 -0700
+++ b/src/arch/x86/interrupts.cc        Sun Apr 19 03:01:46 2009 -0700
@@ -282,6 +282,9 @@
         } 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 @@
     pendingNmi(false), nmiVector(0),
     pendingExtInt(false), extIntVector(0),
     pendingInit(false), initVector(0),
+    pendingStartup(false), startupVector(0),
     pendingUnmaskableInt(false)
 {
     pioSize = PageBytes;
@@ -587,6 +591,9 @@
         } 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 @@
         } 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 -r 595b5016f6d5 -r 852ba59fa8d9 src/arch/x86/interrupts.hh
--- a/src/arch/x86/interrupts.hh        Sun Apr 19 02:56:03 2009 -0700
+++ b/src/arch/x86/interrupts.hh        Sun Apr 19 03:01:46 2009 -0700
@@ -129,6 +129,8 @@
     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 -r 595b5016f6d5 -r 852ba59fa8d9 src/arch/x86/intmessage.hh
--- a/src/arch/x86/intmessage.hh        Sun Apr 19 02:56:03 2009 -0700
+++ b/src/arch/x86/intmessage.hh        Sun Apr 19 03:01:46 2009 -0700
@@ -57,19 +57,20 @@
             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;
         }
     }
 
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to