SE/FS: Remove System::platform and Platform::intrFrequency.
authorGabe Black <gblack@eecs.umich.edu>
Fri, 30 Sep 2011 07:29:07 +0000 (00:29 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Fri, 30 Sep 2011 07:29:07 +0000 (00:29 -0700)
In order for a system object to work in SE mode and FS mode, it has to either
always require a platform object even in SE mode, or get rid of the
requirement all together. Making SE mode carry around unnecessary/unused bits
of FS seems less than ideal, so I decided to go with the second option. The
platform pointer in the System class was used for exactly one purpose, a path
for the Alpha Linux system object to get to the real time clock and read its
frequency so that it could short cut the loops_per_jiffy calculation. There
was also a copy and pasted implementation in MIPS, but since it was only there
because it was there in Alpha I still count that as one use.

This change reverses the mechanism that communicates the RTC frequency so that
the Tsunami platform object pushes it up to the AlphaSystem object. This is
slightly less specific than it could be because really only the
AlphaLinuxSystem uses it. Because the intrFrequency function on the Platform
class was no longer necessary (and unimplemented on anything but Alpha) it was
eliminated.

After this change, a platform will need to have a system, but a system won't
have to have a platform.

17 files changed:
src/arch/alpha/linux/system.cc
src/arch/alpha/system.cc
src/arch/alpha/system.hh
src/arch/mips/linux/system.cc
src/dev/alpha/backdoor.cc
src/dev/alpha/tsunami.cc
src/dev/alpha/tsunami.hh
src/dev/arm/realview.cc
src/dev/arm/realview.hh
src/dev/mips/malta.cc
src/dev/mips/malta.hh
src/dev/platform.hh
src/dev/sparc/t1000.cc
src/dev/sparc/t1000.hh
src/dev/x86/pc.cc
src/dev/x86/pc.hh
src/sim/system.hh

index 6ca603a3bf1d19f3ecd6ed7da2b77e06cc91ee6c..e662ef9ce8c5e5b9983a0062d2ed7de1688660de 100644 (file)
@@ -49,7 +49,6 @@
 #include "cpu/base.hh"
 #include "cpu/thread_context.hh"
 #include "debug/Thread.hh"
-#include "dev/platform.hh"
 #include "kern/linux/events.hh"
 #include "kern/linux/printk.hh"
 #include "mem/physical.hh"
@@ -164,7 +163,7 @@ LinuxAlphaSystem::setDelayLoop(ThreadContext *tc)
     Addr addr = 0;
     if (kernelSymtab->findAddress("loops_per_jiffy", addr)) {
         Tick cpuFreq = tc->getCpuPtr()->frequency();
-        Tick intrFreq = platform->intrFrequency();
+        assert(intrFreq);
         VirtualPort *vp;
 
         vp = tc->getVirtPort();
index 6a55ef8ae99972e73268a65528e2962614574f6f..f1afda76e4fcadc9f0199a26bcb1055374dec1c8 100644 (file)
@@ -46,7 +46,7 @@
 using namespace AlphaISA;
 
 AlphaSystem::AlphaSystem(Params *p)
-    : System(p)
+    : System(p), intrFreq(0)
 {
     consoleSymtab = new SymbolTable;
     palSymtab = new SymbolTable;
index da42ab263881ffd7a41c73b5887d2012f360a6e1..a74aa206f2a495f1300cc320908da4c61bbd32cd 100644 (file)
@@ -79,6 +79,8 @@ class AlphaSystem : public System
 #endif
 
   protected:
+    Tick intrFreq;
+
     const Params *params() const { return (const Params *)_params; }
 
     /** Add a function-based event to PALcode. */
@@ -98,6 +100,9 @@ class AlphaSystem : public System
     }
 
     virtual Addr fixFuncEventAddr(Addr addr);
+
+  public:
+    void setIntrFreq(Tick freq) { intrFreq = freq; }
 };
 
 #endif // __ARCH_ALPHA_SYSTEM_HH__
index 67e21574e8ad5f4e820eee4dabfe742379cf1057..f82ad8d247c84b2f6feaf678f9428408caaa7b2d 100644 (file)
@@ -153,15 +153,7 @@ LinuxMipsSystem::~LinuxMipsSystem()
 void
 LinuxMipsSystem::setDelayLoop(ThreadContext *tc)
 {
-    Addr addr = 0;
-    if (kernelSymtab->findAddress("loops_per_jiffy", addr)) {
-        Tick cpuFreq = tc->getCpuPtr()->frequency();
-        Tick intrFreq = platform->intrFrequency();
-        VirtualPort *vp;
-
-        vp = tc->getVirtPort();
-        vp->writeHtoG(addr, (uint32_t)((cpuFreq / intrFreq) * 0.9988));
-    }
+    panic("setDelayLoop not implemented.\n");
 }
 
 
index 4d9d046ded56ef2661b6e28b033ef712eb1e5e00..1c5bb5f5456d9872cd8b1449c8ac08ea6bf6db43 100644 (file)
@@ -50,6 +50,9 @@
 #include "cpu/thread_context.hh"
 #include "debug/AlphaBackdoor.hh"
 #include "dev/alpha/backdoor.hh"
+#include "dev/alpha/tsunami.hh"
+#include "dev/alpha/tsunami_cchip.hh"
+#include "dev/alpha/tsunami_io.hh"
 #include "dev/platform.hh"
 #include "dev/simple_disk.hh"
 #include "dev/terminal.hh"
@@ -99,7 +102,9 @@ AlphaBackdoor::startup()
     alphaAccess->entryPoint = system->getKernelEntry();
     alphaAccess->mem_size = system->physmem->size();
     alphaAccess->cpuClock = cpu->frequency() / 1000000; // In MHz
-    alphaAccess->intrClockFrequency = params()->platform->intrFrequency();
+    Tsunami *tsunami = dynamic_cast<Tsunami *>(params()->platform);
+    assert(tsunami);
+    alphaAccess->intrClockFrequency = tsunami->io->frequency();
 #endif
 }
 
index 16e2bfb28b522f6a539f36b013d237bc635bab14..65154c7d888eb037ee122fdbef244f2633b89748 100644 (file)
 #include <string>
 #include <vector>
 
+#include "config/full_system.hh"
+
+#if FULL_SYSTEM //XXX AlphaSystem doesn't build in SE mode yet.
+#include "arch/alpha/system.hh"
+#endif
+
 #include "config/the_isa.hh"
 #include "cpu/intr_control.hh"
 #include "dev/alpha/tsunami.hh"
@@ -43,7 +49,6 @@
 #include "dev/alpha/tsunami_io.hh"
 #include "dev/alpha/tsunami_pchip.hh"
 #include "dev/terminal.hh"
-#include "sim/system.hh"
 
 using namespace std;
 //Should this be AlphaISA?
@@ -52,19 +57,18 @@ using namespace TheISA;
 Tsunami::Tsunami(const Params *p)
     : Platform(p), system(p->system)
 {
-#if FULL_SYSTEM //XXX No platform pointer in SE mode.
-    // set the back pointer from the system to myself
-    system->platform = this;
-#endif
-
     for (int i = 0; i < Tsunami::Max_CPUs; i++)
         intr_sum_type[i] = 0;
 }
 
-Tick
-Tsunami::intrFrequency()
+void
+Tsunami::init()
 {
-    return io->frequency();
+#if FULL_SYSTEM //XXX AlphaSystem doesn't build in SE mode yet.
+    AlphaSystem *alphaSystem = dynamic_cast<AlphaSystem *>(system);
+    assert(alphaSystem);
+    alphaSystem->setIntrFreq(io->frequency());
+#endif
 }
 
 void
index 64aafe5334b719d05ee6d0393d54aeeecb38982f..9380864b04e3a15d366d18bcdd71a986c7712c50 100644 (file)
@@ -80,16 +80,12 @@ class Tsunami : public Platform
     int intr_sum_type[Tsunami::Max_CPUs];
     int ipi_pending[Tsunami::Max_CPUs];
 
+    void init();
+
   public:
     typedef TsunamiParams Params;
     Tsunami(const Params *p);
 
-    /**
-     * Return the interrupting frequency to AlphaAccess
-     * @return frequency of RTC interrupts
-     */
-    virtual Tick intrFrequency();
-
     /**
      * Cause the cpu to post a serial interrupt to the CPU.
      */
index ed6365efcfb7f61d7a44717ca00eb61fb3be5604..b33624cc63214880ff3f06bd1a1479542068863d 100644 (file)
@@ -60,19 +60,7 @@ using namespace TheISA;
 
 RealView::RealView(const Params *p)
     : Platform(p), system(p->system)
-{
-#if FULL_SYSTEM //XXX No platform pointer on the system object in SE mode.
-    // set the back pointer from the system to myself
-    system->platform = this;
-#endif
-}
-
-Tick
-RealView::intrFrequency()
-{
-    panic("Need implementation\n");
-    M5_DUMMY_RETURN
-}
+{}
 
 void
 RealView::postConsoleInt()
index 8ec9db5fce70387015401a16d63c40fb3ccadebe..70647d47c994f4ec9d00c40c9d3bb534b049a2b7 100644 (file)
@@ -81,12 +81,6 @@ class RealView : public Platform
     /** Give platform a pointer to interrupt controller */
     void setGic(Gic *_gic) { gic = _gic; }
 
-    /**
-     * Return the interrupting frequency to AlphaAccess
-     * @return frequency of RTC interrupts
-     */
-    virtual Tick intrFrequency();
-
     /**
      * Cause the cpu to post a serial interrupt to the CPU.
      */
index df949c2cf93dd2ec58c85f56d29b3f46db07851a..277633c6b8aaea7491e7c6ae8657922ad355a0a6 100755 (executable)
@@ -54,21 +54,10 @@ using namespace TheISA;
 Malta::Malta(const Params *p)
     : Platform(p), system(p->system)
 {
-#if FULL_SYSTEM //XXX No platform pointer on the system object in SE mode.
-    // set the back pointer from the system to myself
-    system->platform = this;
-#endif
-
     for (int i = 0; i < Malta::Max_CPUs; i++)
         intr_sum_type[i] = 0;
 }
 
-Tick
-Malta::intrFrequency()
-{
-    return io->frequency();
-}
-
 void
 Malta::postConsoleInt()
 {
index 69ae004b3ae9e522661538a64a817df3d41f9497..e612fb295c295e5cfe8c7c430a909cabf32934fd 100755 (executable)
@@ -91,12 +91,6 @@ class Malta : public Platform
     typedef MaltaParams Params;
     Malta(const Params *p);
 
-    /**
-     * Return the interrupting frequency to MipsAccess
-     * @return frequency of RTC interrupts
-     */
-    virtual Tick intrFrequency();
-
     /**
      * Cause the cpu to post a serial interrupt to the CPU.
      */
index a3f2398657d0654469053cde39c9cd1ed913edc3..b3d1bec9fec008eaca9ac93e9228884d89998484 100644 (file)
@@ -64,7 +64,6 @@ class Platform : public SimObject
     virtual ~Platform();
     virtual void postConsoleInt() = 0;
     virtual void clearConsoleInt() = 0;
-    virtual Tick intrFrequency() = 0;
     virtual void postPciInt(int line);
     virtual void clearPciInt(int line);
     virtual Addr pciToDma(Addr pciAddr) const;
index 2c3d3c071fd2f9b59a0a9e6037a98940913720a2..12f43ab23d6e0d11d7f423024da4235eeb261493 100644 (file)
@@ -48,19 +48,7 @@ using namespace TheISA;
 
 T1000::T1000(const Params *p)
     : Platform(p), system(p->system)
-{
-#if FULL_SYSTEM //XXX No platform pointer on system objects in SE mode.
-    // set the back pointer from the system to myself
-    system->platform = this;
-#endif
-}
-
-Tick
-T1000::intrFrequency()
-{
-    panic("Need implementation\n");
-    M5_DUMMY_RETURN
-}
+{}
 
 void
 T1000::postConsoleInt()
index 01ff3d3192431a724c05932f28cbf793ec01f2b0..6440f317b101f523953b3e4713672acce1b9826e 100644 (file)
@@ -59,12 +59,6 @@ class T1000 : public Platform
      */
     T1000(const Params *p);
 
-    /**
-     * Return the interrupting frequency to AlphaAccess
-     * @return frequency of RTC interrupts
-     */
-    virtual Tick intrFrequency();
-
     /**
      * Cause the cpu to post a serial interrupt to the CPU.
      */
index ec2bb209c1c241fcce8fcfc5514e396e29b35903..dd8e34d9e55685168fb6166334177a6577463432 100644 (file)
@@ -55,10 +55,6 @@ Pc::Pc(const Params *p)
     : Platform(p), system(p->system)
 {
     southBridge = NULL;
-    // set the back pointer from the system to myself
-#if FULL_SYSTEM //XXX No platform pointer in SE mode.
-    system->platform = this;
-#endif
 }
 
 void
@@ -119,13 +115,6 @@ Pc::init()
     southBridge->pic2->maskAll();
 }
 
-Tick
-Pc::intrFrequency()
-{
-    panic("Need implementation for intrFrequency\n");
-    M5_DUMMY_RETURN
-}
-
 void
 Pc::postConsoleInt()
 {
index 427cc4165c365b26a5f28b33eb6db0b32f0bd90b..c999440d25a46c6d281eac64def3087f3bd59f5e 100644 (file)
@@ -61,12 +61,6 @@ class Pc : public Platform
 
     Pc(const Params *p);
 
-    /**
-     * Return the interrupting frequency to AlphaAccess
-     * @return frequency of RTC interrupts
-     */
-    virtual Tick intrFrequency();
-
     /**
      * Cause the cpu to post a serial interrupt to the CPU.
      */
index a6bc47fc0b62137ceab10abb9a63d0415d2b8732..5b48b5242b6e498a81bf55b8c08a8124009879d4 100644 (file)
@@ -114,7 +114,6 @@ class System : public SimObject
     bool isMemory(const Addr addr) const;
 
 #if FULL_SYSTEM
-    Platform *platform;
     uint64_t init_param;
 
     /** Port to physical memory used for writing object files into ram at