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:
parent
91dd72a99a
commit
e2dbe59f5d
17 changed files with 31 additions and 102 deletions
|
@ -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();
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
using namespace AlphaISA;
|
||||
|
||||
AlphaSystem::AlphaSystem(Params *p)
|
||||
: System(p)
|
||||
: System(p), intrFreq(0)
|
||||
{
|
||||
consoleSymtab = new SymbolTable;
|
||||
palSymtab = new SymbolTable;
|
||||
|
|
|
@ -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__
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue