More proper handling of the ports.

src/cpu/simple_thread.cc:
    Fix up port handling to share code.
src/cpu/thread_state.cc:
    Separate code off into a function.
src/cpu/thread_state.hh:
    Make a separate function that will get the CPU's memory's functional port.

--HG--
extra : convert_revision : 96a9bb3c5e4b9ba5511678c0fd17f0017c8cd312
This commit is contained in:
Kevin Lim 2006-11-02 14:58:31 -05:00
parent 64f8cd12c6
commit dd5e2cd959
3 changed files with 40 additions and 10 deletions

View file

@ -129,6 +129,10 @@ SimpleThread::SimpleThread()
SimpleThread::~SimpleThread()
{
#if FULL_SYSTEM
delete physPort;
delete virtPort;
#endif
delete tc;
}
@ -304,11 +308,9 @@ SimpleThread::getVirtPort(ThreadContext *src_tc)
if (!src_tc)
return virtPort;
VirtualPort *vp;
Port *mem_port;
VirtualPort *vp = new VirtualPort("tc-vport", src_tc);
Port *mem_port = getMemFuncPort();
vp = new VirtualPort("tc-vport", src_tc);
mem_port = system->physmem->getPort("functional");
mem_port->setPeer(vp);
vp->setPeer(mem_port);
return vp;

View file

@ -59,6 +59,16 @@ ThreadState::ThreadState(BaseCPU *cpu, int _cpuId, int _tid, Process *_process,
numLoad = 0;
}
ThreadState::~ThreadState()
{
#if !FULL_SYSTEM
if (port) {
delete port->getPeer();
delete port;
}
#endif
}
void
ThreadState::serialize(std::ostream &os)
{
@ -124,11 +134,24 @@ ThreadState::getMemPort()
return port;
/* Use this port to for syscall emulation writes to memory. */
Port *dcache_port, *func_mem_port;
port = new TranslatingPort(csprintf("%s-%d-funcport",
baseCpu->name(), tid),
process->pTable, false);
Port *func_port = getMemFuncPort();
func_port->setPeer(port);
port->setPeer(func_port);
return port;
}
#endif
Port *
ThreadState::getMemFuncPort()
{
Port *dcache_port, *func_mem_port;
dcache_port = baseCpu->getPort("dcache_port");
assert(dcache_port != NULL);
@ -138,9 +161,5 @@ ThreadState::getMemPort()
func_mem_port = mem_object->getPort("functional");
assert(func_mem_port != NULL);
func_mem_port->setPeer(port);
port->setPeer(func_mem_port);
return port;
return func_mem_port;
}
#endif

View file

@ -51,6 +51,7 @@ namespace Kernel {
class BaseCPU;
class Checkpoint;
class Port;
class TranslatingPort;
/**
@ -69,6 +70,8 @@ struct ThreadState {
short _asid);
#endif
~ThreadState();
void serialize(std::ostream &os);
void unserialize(Checkpoint *cp, const std::string &section);
@ -136,6 +139,12 @@ struct ThreadState {
/** Sets the status of this thread. */
void setStatus(Status new_status) { _status = new_status; }
protected:
/** Gets a functional port from the memory object that's connected
* to the CPU. */
Port *getMemFuncPort();
public:
/** Number of instructions committed. */
Counter numInst;
/** Stat for number instructions committed. */