Merge ktlim@zizzer:/bk/newmem

into  zamp.eecs.umich.edu:/z/ktlim2/clean/tmp/head

--HG--
extra : convert_revision : 7181d8c2ee673322372484cf288a94ebd91b5265
This commit is contained in:
Kevin Lim 2007-04-04 15:39:13 -04:00
commit b247e02f6e
4 changed files with 25 additions and 5 deletions

View file

@ -52,9 +52,19 @@ Bus::getPort(const std::string &if_name, int idx)
} else } else
fatal("Default port already set\n"); fatal("Default port already set\n");
} }
int id;
if (if_name == "functional") {
if (!funcPort) {
id = maxId++;
funcPort = new BusPort(csprintf("%s-p%d-func", name(), id), this, id);
funcPortId = id;
interfaces[id] = funcPort;
}
return funcPort;
}
// if_name ignored? forced to be empty? // if_name ignored? forced to be empty?
int id = maxId++; id = maxId++;
assert(maxId < std::numeric_limits<typeof(maxId)>::max()); assert(maxId < std::numeric_limits<typeof(maxId)>::max());
BusPort *bp = new BusPort(csprintf("%s-p%d", name(), id), this, id); BusPort *bp = new BusPort(csprintf("%s-p%d", name(), id), this, id);
interfaces[id] = bp; interfaces[id] = bp;
@ -64,10 +74,15 @@ Bus::getPort(const std::string &if_name, int idx)
void void
Bus::deletePortRefs(Port *p) Bus::deletePortRefs(Port *p)
{ {
BusPort *bp = dynamic_cast<BusPort*>(p); BusPort *bp = dynamic_cast<BusPort*>(p);
if (bp == NULL) if (bp == NULL)
panic("Couldn't convert Port* to BusPort*\n"); panic("Couldn't convert Port* to BusPort*\n");
// If this is our one functional port
if (funcPort == bp)
return;
interfaces.erase(bp->getId()); interfaces.erase(bp->getId());
delete bp;
} }
/** Get the ranges of anyone other buses that we are connected to. */ /** Get the ranges of anyone other buses that we are connected to. */
@ -520,7 +535,7 @@ Bus::recvStatusChange(Port::Status status, int id)
m5::hash_map<short,BusPort*>::iterator intIter; m5::hash_map<short,BusPort*>::iterator intIter;
for (intIter = interfaces.begin(); intIter != interfaces.end(); intIter++) for (intIter = interfaces.begin(); intIter != interfaces.end(); intIter++)
if (intIter->first != id) if (intIter->first != id && intIter->first != funcPortId)
intIter->second->sendStatusChange(Port::RangeChange); intIter->second->sendStatusChange(Port::RangeChange);
if (id != defaultId && defaultPort) if (id != defaultId && defaultPort)

View file

@ -63,6 +63,7 @@ class Bus : public MemObject
Event * drainEvent; Event * drainEvent;
static const int defaultId = -3; //Make it unique from Broadcast static const int defaultId = -3; //Make it unique from Broadcast
struct DevMap { struct DevMap {
@ -249,6 +250,9 @@ class Bus : public MemObject
/** Port that handles requests that don't match any of the interfaces.*/ /** Port that handles requests that don't match any of the interfaces.*/
BusPort *defaultPort; BusPort *defaultPort;
BusPort *funcPort;
int funcPortId;
/** Has the user specified their own default responder? */ /** Has the user specified their own default responder? */
bool responderSet; bool responderSet;
@ -266,7 +270,8 @@ class Bus : public MemObject
bool responder_set) bool responder_set)
: MemObject(n), busId(bus_id), clock(_clock), width(_width), : MemObject(n), busId(bus_id), clock(_clock), width(_width),
tickNextIdle(0), drainEvent(NULL), busIdle(this), inRetry(false), tickNextIdle(0), drainEvent(NULL), busIdle(this), inRetry(false),
maxId(0), defaultPort(NULL), responderSet(responder_set) maxId(0), defaultPort(NULL), funcPort(NULL), funcPortId(-4),
responderSet(responder_set)
{ {
//Both the width and clock period must be positive //Both the width and clock period must be positive
if (width <= 0) if (width <= 0)

View file

@ -1183,7 +1183,8 @@ Cache<TagStore,Coherence>::deletePortRefs(Port *p)
{ {
if (cpuSidePort == p || memSidePort == p) if (cpuSidePort == p || memSidePort == p)
panic("Can only delete functional ports\n"); panic("Can only delete functional ports\n");
// nothing else to do
delete p;
} }

View file

@ -51,7 +51,6 @@ Port::removeConn()
{ {
if (peer->getOwner()) if (peer->getOwner())
peer->getOwner()->deletePortRefs(peer); peer->getOwner()->deletePortRefs(peer);
delete peer;
peer = NULL; peer = NULL;
} }