SE/FS: Remove System::platform and Platform::intrFrequency.

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.
This commit is contained in:
Gabe Black 2011-09-30 00:29:07 -07:00
parent 91dd72a99a
commit e2dbe59f5d
17 changed files with 31 additions and 102 deletions

View 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();

View file

@ -46,7 +46,7 @@
using namespace AlphaISA;
AlphaSystem::AlphaSystem(Params *p)
: System(p)
: System(p), intrFreq(0)
{
consoleSymtab = new SymbolTable;
palSymtab = new SymbolTable;

View 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__

View 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");
}

View 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
}

View file

@ -36,6 +36,12 @@
#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

View 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.
*/

View 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()

View 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.
*/

View file

@ -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()
{

View file

@ -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.
*/

View 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;

View 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()

View 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.
*/

View 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()
{

View 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.
*/

View 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