changeset 94a7bb476fca in /z/repo/m5 details: http://repo.m5sim.org/m5?cmd=changeset;node=94a7bb476fca summary: Generate more useful error messages for unconnected ports.
changeset 88f1e9295945 in /z/repo/m5 details: http://repo.m5sim.org/m5?cmd=changeset;node=88f1e9295945 summary: Make bus address conflict error more informative diffstat: 8 files changed, 11 insertions(+), 11 deletions(-) src/cpu/o3/fetch.hh | 1 - src/cpu/o3/lsq.hh | 1 - src/mem/bus.cc | 1 - src/mem/cache/cache_impl.hh | 4 ++-- src/mem/mem_object.cc | 1 - src/mem/mem_object.hh | 5 ++--- src/mem/port.cc | 7 +++++++ src/mem/port.hh | 2 -- diffs (truncated from 410 to 300 lines): diff -r c8571e8ce7b6 -r 88f1e9295945 src/cpu/o3/fetch.hh --- a/src/cpu/o3/fetch.hh Wed Jun 18 12:07:15 2008 -0700 +++ b/src/cpu/o3/fetch.hh Sat Jun 21 01:06:27 2008 -0400 @@ -80,8 +80,8 @@ class DefaultFetch public: /** Default constructor. */ - IcachePort(DefaultFetch<Impl> *_fetch) - : Port(_fetch->name() + "-iport"), fetch(_fetch) + IcachePort(DefaultFetch<Impl> *_fetch, O3CPU *_cpu) + : Port(_fetch->name() + "-iport", _cpu), fetch(_fetch) { } bool snoopRangeSent; diff -r c8571e8ce7b6 -r 88f1e9295945 src/cpu/o3/fetch_impl.hh --- a/src/cpu/o3/fetch_impl.hh Wed Jun 18 12:07:15 2008 -0700 +++ b/src/cpu/o3/fetch_impl.hh Sat Jun 21 01:06:27 2008 -0400 @@ -167,7 +167,7 @@ DefaultFetch<Impl>::DefaultFetch(O3CPU * instSize = sizeof(TheISA::MachInst); // Name is finally available, so create the port. - icachePort = new IcachePort(this); + icachePort = new IcachePort(this, cpu); icachePort->snoopRangeSent = false; diff -r c8571e8ce7b6 -r 88f1e9295945 src/cpu/o3/lsq.hh --- a/src/cpu/o3/lsq.hh Wed Jun 18 12:07:15 2008 -0700 +++ b/src/cpu/o3/lsq.hh Sat Jun 21 01:06:27 2008 -0400 @@ -296,8 +296,8 @@ class LSQ { public: /** Default constructor. */ - DcachePort(LSQ *_lsq) - : Port(_lsq->name() + "-dport"), lsq(_lsq) + DcachePort(LSQ *_lsq, O3CPU *_cpu) + : Port(_lsq->name() + "-dport", _cpu), lsq(_lsq) { } bool snoopRangeSent; diff -r c8571e8ce7b6 -r 88f1e9295945 src/cpu/o3/lsq_impl.hh --- a/src/cpu/o3/lsq_impl.hh Wed Jun 18 12:07:15 2008 -0700 +++ b/src/cpu/o3/lsq_impl.hh Sat Jun 21 01:06:27 2008 -0400 @@ -112,7 +112,7 @@ LSQ<Impl>::DcachePort::recvRetry() template <class Impl> LSQ<Impl>::LSQ(O3CPU *cpu_ptr, IEW *iew_ptr, Params *params) - : cpu(cpu_ptr), iewStage(iew_ptr), dcachePort(this), + : cpu(cpu_ptr), iewStage(iew_ptr), dcachePort(this, cpu_ptr), LQEntries(params->LQEntries), SQEntries(params->SQEntries), numThreads(params->numberOfThreads), diff -r c8571e8ce7b6 -r 88f1e9295945 src/cpu/o3/thread_context_impl.hh --- a/src/cpu/o3/thread_context_impl.hh Wed Jun 18 12:07:15 2008 -0700 +++ b/src/cpu/o3/thread_context_impl.hh Sat Jun 21 01:06:27 2008 -0400 @@ -103,7 +103,6 @@ O3ThreadContext<Impl>::delVirtPort(Virtu O3ThreadContext<Impl>::delVirtPort(VirtualPort *vp) { if (vp != thread->getVirtPort()) { - vp->removeConn(); delete vp; } } diff -r c8571e8ce7b6 -r 88f1e9295945 src/cpu/ozone/cpu_impl.hh --- a/src/cpu/ozone/cpu_impl.hh Wed Jun 18 12:07:15 2008 -0700 +++ b/src/cpu/ozone/cpu_impl.hh Sat Jun 21 01:06:27 2008 -0400 @@ -747,7 +747,6 @@ void void OzoneCPU<Impl>::OzoneTC::delVirtPort(VirtualPort *vp) { - vp->removeConn(); delete vp; } #endif diff -r c8571e8ce7b6 -r 88f1e9295945 src/cpu/simple_thread.cc --- a/src/cpu/simple_thread.cc Wed Jun 18 12:07:15 2008 -0700 +++ b/src/cpu/simple_thread.cc Sat Jun 21 01:06:27 2008 -0400 @@ -302,7 +302,6 @@ SimpleThread::delVirtPort(VirtualPort *v SimpleThread::delVirtPort(VirtualPort *vp) { if (vp != virtPort) { - vp->removeConn(); delete vp; } } diff -r c8571e8ce7b6 -r 88f1e9295945 src/cpu/thread_state.cc --- a/src/cpu/thread_state.cc Wed Jun 18 12:07:15 2008 -0700 +++ b/src/cpu/thread_state.cc Sat Jun 21 01:06:27 2008 -0400 @@ -126,7 +126,7 @@ ThreadState::connectPhysPort() // already existed. Fix this memory leak once the bus port IDs // for functional ports is resolved. if (physPort) - physPort->removeConn(); + physPort->disconnectFromPeer(); else physPort = new FunctionalPort(csprintf("%s-%d-funcport", baseCpu->name(), tid)); @@ -140,7 +140,7 @@ ThreadState::connectVirtPort() // already existed. Fix this memory leak once the bus port IDs // for functional ports is resolved. if (virtPort) - virtPort->removeConn(); + virtPort->disconnectFromPeer(); else virtPort = new VirtualPort(csprintf("%s-%d-vport", baseCpu->name(), tid)); diff -r c8571e8ce7b6 -r 88f1e9295945 src/mem/bridge.cc --- a/src/mem/bridge.cc Wed Jun 18 12:07:15 2008 -0700 +++ b/src/mem/bridge.cc Sat Jun 21 01:06:27 2008 -0400 @@ -47,7 +47,7 @@ Bridge::BridgePort::BridgePort(const std int _delay, int _nack_delay, int _req_limit, int _resp_limit, std::vector<Range<Addr> > filter_ranges) - : Port(_name), bridge(_bridge), otherPort(_otherPort), + : Port(_name, _bridge), bridge(_bridge), otherPort(_otherPort), delay(_delay), nackDelay(_nack_delay), filterRanges(filter_ranges), outstandingResponses(0), queuedRequests(0), inRetry(false), reqQueueLimit(_req_limit), respQueueLimit(_resp_limit), sendEvent(this) diff -r c8571e8ce7b6 -r 88f1e9295945 src/mem/bus.cc --- a/src/mem/bus.cc Wed Jun 18 12:07:15 2008 -0700 +++ b/src/mem/bus.cc Sat Jun 21 01:06:27 2008 -0400 @@ -72,8 +72,8 @@ Bus::getPort(const std::string &if_name, return bp; } -void -Bus::deletePortRefs(Port *p) +bool +Bus::deletePort(Port *p) { BusPort *bp = dynamic_cast<BusPort*>(p); @@ -81,10 +81,11 @@ Bus::deletePortRefs(Port *p) panic("Couldn't convert Port* to BusPort*\n"); // If this is our one functional port if (funcPort == bp) - return; + return false; interfaces.erase(bp->getId()); clearBusCache(); delete bp; + return true; } /** Get the ranges of anyone other buses that we are connected to. */ @@ -523,9 +524,12 @@ Bus::recvStatusChange(Port::Status statu for (iter = ranges.begin(); iter != ranges.end(); iter++) { DPRINTF(BusAddrRanges, "Adding range %#llx - %#llx for id %d\n", iter->start, iter->end, id); - if (portMap.insert(*iter, id) == portMap.end()) - panic("Two devices with same range\n"); - + if (portMap.insert(*iter, id) == portMap.end()) { + int conflict_id = portMap.find(*iter)->second; + fatal("%s has two ports with same range:\n\t%s\n\t%s\n", + name(), interfaces[id]->getPeer()->name(), + interfaces[conflict_id]->getPeer()->name()); + } } } DPRINTF(MMU, "port list has %d entries\n", portMap.size()); diff -r c8571e8ce7b6 -r 88f1e9295945 src/mem/bus.hh --- a/src/mem/bus.hh Wed Jun 18 12:07:15 2008 -0700 +++ b/src/mem/bus.hh Sat Jun 21 01:06:27 2008 -0400 @@ -364,7 +364,7 @@ class Bus : public MemObject /** A function used to return the port associated with this bus object. */ virtual Port *getPort(const std::string &if_name, int idx = -1); - virtual void deletePortRefs(Port *p); + virtual bool deletePort(Port *p); virtual void init(); virtual void startup(); diff -r c8571e8ce7b6 -r 88f1e9295945 src/mem/cache/cache.hh --- a/src/mem/cache/cache.hh Wed Jun 18 12:07:15 2008 -0700 +++ b/src/mem/cache/cache.hh Sat Jun 21 01:06:27 2008 -0400 @@ -217,7 +217,7 @@ class Cache : public BaseCache Cache(const Params *p, TagStore *tags, BasePrefetcher *prefetcher); virtual Port *getPort(const std::string &if_name, int idx = -1); - virtual void deletePortRefs(Port *p); + virtual bool deletePort(Port *p); void regStats(); diff -r c8571e8ce7b6 -r 88f1e9295945 src/mem/cache/cache_impl.hh --- a/src/mem/cache/cache_impl.hh Wed Jun 18 12:07:15 2008 -0700 +++ b/src/mem/cache/cache_impl.hh Sat Jun 21 01:06:27 2008 -0400 @@ -105,13 +105,14 @@ Cache<TagStore>::getPort(const std::stri } template<class TagStore> -void -Cache<TagStore>::deletePortRefs(Port *p) +bool +Cache<TagStore>::deletePort(Port *p) { if (cpuSidePort == p || memSidePort == p) panic("Can only delete functional ports\n"); delete p; + return true; } diff -r c8571e8ce7b6 -r 88f1e9295945 src/mem/mem_object.cc --- a/src/mem/mem_object.cc Wed Jun 18 12:07:15 2008 -0700 +++ b/src/mem/mem_object.cc Sat Jun 21 01:06:27 2008 -0400 @@ -43,8 +43,8 @@ MemObject::makeParams(const std::string return params; } -void -MemObject::deletePortRefs(Port *p) +bool +MemObject::deletePort(Port *p) { panic("This object does not support port deletion\n"); } diff -r c8571e8ce7b6 -r 88f1e9295945 src/mem/mem_object.hh --- a/src/mem/mem_object.hh Wed Jun 18 12:07:15 2008 -0700 +++ b/src/mem/mem_object.hh Sat Jun 21 01:06:27 2008 -0400 @@ -64,9 +64,13 @@ class MemObject : public SimObject /** Additional function to return the Port of a memory object. */ virtual Port *getPort(const std::string &if_name, int idx = -1) = 0; - /** Tell object 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) ; + /** Tell MemObject that this port is no longer in use, so it + * should remove it from any structures that it's keeping it in. + * If the port was allocated dynamically for this connection, it + * should be deleted here. + * @return True if the port was deleted, false if it still exists. + */ + virtual bool deletePort(Port *p); }; #endif //__MEM_MEM_OBJECT_HH__ diff -r c8571e8ce7b6 -r 88f1e9295945 src/mem/port.cc --- a/src/mem/port.cc Wed Jun 18 12:07:15 2008 -0700 +++ b/src/mem/port.cc Sat Jun 21 01:06:27 2008 -0400 @@ -39,17 +39,25 @@ #include "mem/mem_object.hh" #include "mem/port.hh" +/** + * Special class for port objects that are used as peers for + * unconnected ports. Assigning instances of this class to newly + * allocated ports allows us to guarantee that every port has a peer + * object (so there's no need to check for null peer pointers), while + * catching uses of unconnected ports. + */ class DefaultPeerPort : public Port { protected: void blowUp() { - fatal("%s: Unconnected port!", peer->name()); + Port *peer = getPeer(); + fatal("unconnected port: %s", peer ? peer->name() : "<unknown>"); } public: - DefaultPeerPort() - : Port("default_port") + DefaultPeerPort(Port *_peer) + : Port("default_port", NULL, _peer) { } bool recvTiming(PacketPtr) @@ -88,36 +96,59 @@ class DefaultPeerPort : public Port bool isDefaultPort() const { return true; } }; -DefaultPeerPort defaultPeerPort; -Port::Port() - : peer(&defaultPeerPort), owner(NULL) -{ -} - -Port::Port(const std::string &_name, MemObject *_owner) - : portName(_name), peer(&defaultPeerPort), owner(_owner) +Port::Port(const std::string &_name, MemObject *_owner, Port *_peer) : + portName(_name), + peer(_peer ? _peer : new DefaultPeerPort(this)), + owner(_owner) { } Port::~Port() { + disconnectFromPeer(); +} + +void +Port::disconnectFromPeer() +{ + if (peer) { _______________________________________________ m5-dev mailing list m5-dev@m5sim.org http://m5sim.org/mailman/listinfo/m5-dev