CPU: Add a setCPU function to the interrupt objects.
authorGabe Black <gblack@eecs.umich.edu>
Mon, 26 Jan 2009 04:29:03 +0000 (20:29 -0800)
committerGabe Black <gblack@eecs.umich.edu>
Mon, 26 Jan 2009 04:29:03 +0000 (20:29 -0800)
src/arch/alpha/interrupts.hh
src/arch/sparc/interrupts.hh
src/arch/x86/interrupts.hh
src/cpu/base.cc

index 89db134ffaac2743f82a5ed7c1e6b5a3777097f0..f8e0ad4effcdc257d29a2870643d071962fa641b 100644 (file)
@@ -48,6 +48,7 @@ class Interrupts : public SimObject
     bool newInfoSet;
     int newIpl;
     int newSummary;
+    BaseCPU * cpu;
 
   protected:
     uint64_t interrupts[NumInterruptLevels];
@@ -62,13 +63,19 @@ class Interrupts : public SimObject
         return dynamic_cast<const Params *>(_params);
     }
 
-    Interrupts(Params * p) : SimObject(p)
+    Interrupts(Params * p) : SimObject(p), cpu(NULL)
     {
         memset(interrupts, 0, sizeof(interrupts));
         intstatus = 0;
         newInfoSet = false;
     }
 
+    void
+    setCPU(BaseCPU * _cpu)
+    {
+        cpu = _cpu;
+    }
+
     void
     post(int int_num, int index)
     {
index 66b3792b5b30432d79666459968eb3714d6aa4e5..ec930e2b045776bb8bb3d8e32821e180bc084ebb 100644 (file)
@@ -43,12 +43,20 @@ namespace SparcISA
 
 class Interrupts : public SimObject
 {
-
   private:
+    BaseCPU * cpu;
+
     uint64_t interrupts[NumInterruptTypes];
     uint64_t intStatus;
 
   public:
+
+    void
+    setCPU(BaseCPU * _cpu)
+    {
+        cpu = _cpu;
+    }
+
     typedef SparcInterruptsParams Params;
 
     const Params *
@@ -57,7 +65,7 @@ class Interrupts : public SimObject
         return dynamic_cast<const Params *>(_params);
     }
 
-    Interrupts(Params * p) : SimObject(p)
+    Interrupts(Params * p) : SimObject(p), cpu(NULL)
     {
         clearAll();
     }
index 8c731621793a58158d0f5d175cc5b7ef7bcc8d40..c5e3bde0d5b74e21835eceaabea94b4f11d5a858 100644 (file)
@@ -69,6 +69,7 @@
 #include "sim/eventq.hh"
 
 class ThreadContext;
+class BaseCPU;
 
 namespace X86ISA {
 
@@ -182,12 +183,20 @@ class Interrupts : public BasicPioDevice, IntDev
 
     void requestInterrupt(uint8_t vector, uint8_t deliveryMode, bool level);
 
+    BaseCPU *cpu;
+
   public:
     /*
      * Params stuff.
      */
     typedef X86LocalApicParams Params;
 
+    void
+    setCPU(BaseCPU * newCPU)
+    {
+        cpu = newCPU;
+    }
+
     void
     setClock(Tick newClock)
     {
index 29095f12ac9c5533bd40c5fc498091f5940211ce..06fcebad89ca0d919ecf2ad1801fad793970ee58 100644 (file)
@@ -194,6 +194,8 @@ BaseCPU::BaseCPU(Params *p)
         }
     }
 #if FULL_SYSTEM
+    interrupts->setCPU(this);
+
     profileEvent = NULL;
     if (params()->profile)
         profileEvent = new ProfileEvent(this, params()->profile);
@@ -348,6 +350,7 @@ BaseCPU::takeOverFrom(BaseCPU *oldCPU, Port *ic, Port *dc)
 
 #if FULL_SYSTEM
     interrupts = oldCPU->interrupts;
+    interrupts->setCPU(this);
 
     for (int i = 0; i < threadContexts.size(); ++i)
         threadContexts[i]->profileClear();