diff -r 7b194d1da55f -r d7411fd48828 src/cpu/base.cc --- a/src/cpu/base.cc Fri Jul 16 21:21:44 2010 +0100 +++ b/src/cpu/base.cc Fri Jul 16 21:21:46 2010 +0100 @@ -377,12 +377,14 @@ // CPU. if (!ic->isConnected()) { Port *peer = oldCPU->getPort("icache_port")->getPeer(); + peer->removeConn(); ic->setPeer(peer); peer->setPeer(ic); } if (!dc->isConnected()) { Port *peer = oldCPU->getPort("dcache_port")->getPeer(); + peer->removeConn(); dc->setPeer(peer); peer->setPeer(dc); } diff -r 7b194d1da55f -r d7411fd48828 src/cpu/o3/cpu.hh --- a/src/cpu/o3/cpu.hh Fri Jul 16 21:21:44 2010 +0100 +++ b/src/cpu/o3/cpu.hh Fri Jul 16 21:21:46 2010 +0100 @@ -722,6 +722,14 @@ /** Get the dcache port (used to find block size for translations). */ Port *getDcachePort() { return this->iew.ldstQueue.getDcachePort(); } + /** Tell cpu that this port is about to disappear, so it should remove it + * from any structures that it's keeping it in. */ + virtual void + deletePortRefs(Port *p) + { + p->setDefaultPeer(); + } + Addr lockAddr; /** Temporary fix for the lock flag, works in the UP case. */ diff -r 7b194d1da55f -r d7411fd48828 src/cpu/simple/atomic.hh --- a/src/cpu/simple/atomic.hh Fri Jul 16 21:21:44 2010 +0100 +++ b/src/cpu/simple/atomic.hh Fri Jul 16 21:21:46 2010 +0100 @@ -120,6 +120,7 @@ public: virtual Port *getPort(const std::string &if_name, int idx = -1); + virtual void deletePortRefs(Port *p); virtual void serialize(std::ostream &os); virtual void unserialize(Checkpoint *cp, const std::string §ion); diff -r 7b194d1da55f -r d7411fd48828 src/cpu/simple/atomic.cc --- a/src/cpu/simple/atomic.cc Fri Jul 16 21:21:44 2010 +0100 +++ b/src/cpu/simple/atomic.cc Fri Jul 16 21:21:46 2010 +0100 @@ -77,6 +77,12 @@ } void +AtomicSimpleCPU::deletePortRefs(Port *p) +{ + p->setDefaultPeer(); +} + +void AtomicSimpleCPU::init() { BaseCPU::init(); diff -r 7b194d1da55f -r d7411fd48828 src/mem/port.hh --- a/src/mem/port.hh Fri Jul 16 21:21:44 2010 +0100 +++ b/src/mem/port.hh Fri Jul 16 21:21:46 2010 +0100 @@ -116,6 +116,9 @@ /** Function to set the pointer for the peer port. */ virtual void setPeer(Port *port); + /** Function to set the peer to the default peer port. */ + void setDefaultPeer(); + /** Function to get the pointer to the peer port. */ Port *getPeer() { return peer; } diff -r 7b194d1da55f -r d7411fd48828 src/mem/port.cc --- a/src/mem/port.cc Fri Jul 16 21:21:44 2010 +0100 +++ b/src/mem/port.cc Fri Jul 16 21:21:46 2010 +0100 @@ -110,6 +110,12 @@ } void +Port::setDefaultPeer() +{ + peer = &defaultPeerPort; +} + +void Port::setOwner(MemObject *_owner) { eventq = _owner->queue();