Make OzoneCPU work again in SE/FS.

src/cpu/ozone/cpu.hh:
    Fixes to get OzoneCPU working in SE/FS again.
src/cpu/ozone/cpu_impl.hh:
    Be sure to set up ports properly.
src/cpu/ozone/front_end.hh:
    Allow port to be created without specifying its name at the beginning.
src/cpu/ozone/front_end_impl.hh:
    Setup port properly, also only use checker if it's enabled.
src/cpu/ozone/lw_back_end_impl.hh:
    Be sure to initialize variables.
src/cpu/ozone/lw_lsq.hh:
    Handle locked flag for UP systems.
src/cpu/ozone/lw_lsq_impl.hh:
    Initialize all variables.
src/python/m5/objects/OzoneCPU.py:
    Fix up config.

--HG--
extra : convert_revision : c99e7bf82fc0dd1099c7a82eaebd58ab6017764d
This commit is contained in:
Kevin Lim 2006-06-25 00:22:41 -04:00
parent 63bdaeedfa
commit 4787d357d5
8 changed files with 71 additions and 13 deletions

View file

@ -214,12 +214,11 @@ class OzoneCPU : public BaseCPU
uint64_t readNextNPC() uint64_t readNextNPC()
{ {
panic("Alpha has no NextNPC!");
return 0; return 0;
} }
void setNextNPC(uint64_t val) void setNextNPC(uint64_t val)
{ panic("Alpha has no NextNPC!"); } { }
public: public:
// ISA stuff: // ISA stuff:

View file

@ -201,7 +201,35 @@ OzoneCPU<Impl>::OzoneCPU(Params *p)
backEnd->renameTable.copyFrom(thread.renameTable); backEnd->renameTable.copyFrom(thread.renameTable);
#if !FULL_SYSTEM #if !FULL_SYSTEM
// pTable = p->pTable; /* Use this port to for syscall emulation writes to memory. */
Port *mem_port;
TranslatingPort *trans_port;
trans_port = new TranslatingPort(csprintf("%s-%d-funcport",
name(), 0),
p->workload[0]->pTable,
false);
mem_port = p->mem->getPort("functional");
mem_port->setPeer(trans_port);
trans_port->setPeer(mem_port);
thread.setMemPort(trans_port);
#else
Port *mem_port;
FunctionalPort *phys_port;
VirtualPort *virt_port;
phys_port = new FunctionalPort(csprintf("%s-%d-funcport",
name(), 0));
mem_port = system->physmem->getPort("functional");
mem_port->setPeer(phys_port);
phys_port->setPeer(mem_port);
virt_port = new VirtualPort(csprintf("%s-%d-vport",
name(), 0));
mem_port = system->physmem->getPort("functional");
mem_port->setPeer(virt_port);
virt_port->setPeer(mem_port);
thread.setPhysPort(phys_port);
thread.setVirtPort(virt_port);
#endif #endif
lockFlag = 0; lockFlag = 0;

View file

@ -43,7 +43,7 @@
#include "sim/stats.hh" #include "sim/stats.hh"
class ThreadContext; class ThreadContext;
class MemInterface; class MemObject;
template <class> template <class>
class OzoneThreadState; class OzoneThreadState;
class PageTable; class PageTable;
@ -75,7 +75,7 @@ class FrontEnd
public: public:
/** Default constructor. */ /** Default constructor. */
IcachePort(FrontEnd<Impl> *_fe) IcachePort(FrontEnd<Impl> *_fe)
: Port(_fe->name() + "-iport"), fe(_fe) : fe(_fe)
{ } { }
protected: protected:
@ -105,8 +105,7 @@ class FrontEnd
std::string name() const; std::string name() const;
void setCPU(CPUType *cpu_ptr) void setCPU(CPUType *cpu_ptr);
{ cpu = cpu_ptr; }
void setBackEnd(BackEnd *back_end_ptr) void setBackEnd(BackEnd *back_end_ptr)
{ backEnd = back_end_ptr; } { backEnd = back_end_ptr; }
@ -206,6 +205,8 @@ class FrontEnd
IcachePort icachePort; IcachePort icachePort;
MemObject *mem;
RequestPtr memReq; RequestPtr memReq;
/** Mask to get a cache block's address. */ /** Mask to get a cache block's address. */

View file

@ -28,6 +28,8 @@
* Authors: Kevin Lim * Authors: Kevin Lim
*/ */
#include "config/use_checker.hh"
#include "arch/faults.hh" #include "arch/faults.hh"
#include "arch/isa_traits.hh" #include "arch/isa_traits.hh"
#include "base/statistics.hh" #include "base/statistics.hh"
@ -37,6 +39,10 @@
#include "mem/packet.hh" #include "mem/packet.hh"
#include "mem/request.hh" #include "mem/request.hh"
#if USE_CHECKER
#include "cpu/checker/cpu.hh"
#endif
using namespace TheISA; using namespace TheISA;
template<class Impl> template<class Impl>
@ -83,6 +89,7 @@ template <class Impl>
FrontEnd<Impl>::FrontEnd(Params *params) FrontEnd<Impl>::FrontEnd(Params *params)
: branchPred(params), : branchPred(params),
icachePort(this), icachePort(this),
mem(params->mem),
instBufferSize(0), instBufferSize(0),
maxInstBufferSize(params->maxInstBufferSize), maxInstBufferSize(params->maxInstBufferSize),
width(params->frontEndWidth), width(params->frontEndWidth),
@ -123,6 +130,25 @@ FrontEnd<Impl>::name() const
return cpu->name() + ".frontend"; return cpu->name() + ".frontend";
} }
template <class Impl>
void
FrontEnd<Impl>::setCPU(CPUType *cpu_ptr)
{
cpu = cpu_ptr;
icachePort.setName(this->name() + "-iport");
Port *mem_dport = mem->getPort("");
icachePort.setPeer(mem_dport);
mem_dport->setPeer(&icachePort);
#if USE_CHECKER
if (cpu->checker) {
cpu->checker->setIcachePort(&icachePort);
}
#endif
}
template <class Impl> template <class Impl>
void void
FrontEnd<Impl>::setCommBuffer(TimeBuffer<CommStruct> *_comm) FrontEnd<Impl>::setCommBuffer(TimeBuffer<CommStruct> *_comm)

View file

@ -142,7 +142,7 @@ LWBackEnd<Impl>::replayMemInst(DynInstPtr &inst)
template <class Impl> template <class Impl>
LWBackEnd<Impl>::LWBackEnd(Params *params) LWBackEnd<Impl>::LWBackEnd(Params *params)
: d2i(5, 5), i2e(5, 5), e2c(5, 5), numInstsToWB(5, 5), : d2i(5, 5), i2e(5, 5), e2c(5, 5), numInstsToWB(5, 5),
trapSquash(false), tcSquash(false), trapSquash(false), tcSquash(false), LSQ(params),
width(params->backEndWidth), exactFullStall(true) width(params->backEndWidth), exactFullStall(true)
{ {
numROBEntries = params->numROBEntries; numROBEntries = params->numROBEntries;
@ -169,6 +169,7 @@ LWBackEnd<Impl>::LWBackEnd(Params *params)
LSQ.init(params, params->LQEntries, params->SQEntries, 0); LSQ.init(params, params->LQEntries, params->SQEntries, 0);
dispatchStatus = Running; dispatchStatus = Running;
commitStatus = Running;
} }
template <class Impl> template <class Impl>

View file

@ -654,6 +654,10 @@ OzoneLWLSQ<Impl>::read(RequestPtr req, T &data, int load_idx)
return NoFault; return NoFault;
} }
if (req->getFlags() & LOCKED) {
cpu->lockFlag = true;
}
if (data_pkt->result != Packet::Success) { if (data_pkt->result != Packet::Success) {
DPRINTF(OzoneLSQ, "OzoneLSQ: D-cache miss!\n"); DPRINTF(OzoneLSQ, "OzoneLSQ: D-cache miss!\n");
DPRINTF(Activity, "Activity: ld accessing mem miss [sn:%lli]\n", DPRINTF(Activity, "Activity: ld accessing mem miss [sn:%lli]\n",

View file

@ -131,8 +131,8 @@ OzoneLWLSQ<Impl>::completeDataAccess(PacketPtr pkt)
template <class Impl> template <class Impl>
OzoneLWLSQ<Impl>::OzoneLWLSQ() OzoneLWLSQ<Impl>::OzoneLWLSQ()
: loads(0), stores(0), storesToWB(0), stalled(false), isLoadBlocked(false), : switchedOut(false), loads(0), stores(0), storesToWB(0), stalled(false),
loadBlockedHandled(false) isStoreBlocked(false), isLoadBlocked(false), loadBlockedHandled(false)
{ {
} }
@ -153,6 +153,8 @@ OzoneLWLSQ<Impl>::init(Params *params, unsigned maxLQEntries,
SQIndices.push(i); SQIndices.push(i);
} }
mem = params->mem;
usedPorts = 0; usedPorts = 0;
cachePorts = params->cachePorts; cachePorts = params->cachePorts;

View file

@ -7,9 +7,6 @@ class DerivOzoneCPU(BaseCPU):
numThreads = Param.Unsigned("number of HW thread contexts") numThreads = Param.Unsigned("number of HW thread contexts")
if not build_env['FULL_SYSTEM']:
mem = Param.FunctionalMemory(NULL, "memory")
checker = Param.BaseCPU("Checker CPU") checker = Param.BaseCPU("Checker CPU")
width = Param.Unsigned("Width") width = Param.Unsigned("Width")