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:
parent
64f8cd12c6
commit
dd5e2cd959
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 §ion);
|
||||
|
@ -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. */
|
||||
|
|
Loading…
Reference in a new issue