changeset 6c15fa5fe377 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=6c15fa5fe377
description:
MEM: Fatal when no port can be found for an address
This patch adds a check in the findPort method to ensure that an
invalid port id is never returned. Previously this could happen if no
default port was set, and no address matched the request, in which
case -1 was returned causing a SEGFAULT when using the id to index in
the port array. To clean things up further a symbolic name is added
for the invalid port id.
diffstat:
src/mem/bus.cc | 22 +++++++++++++---------
src/mem/bus.hh | 5 ++++-
2 files changed, 17 insertions(+), 10 deletions(-)
diffs (77 lines):
diff -r 2629f0b99e8d -r 6c15fa5fe377 src/mem/bus.cc
--- a/src/mem/bus.cc Mon Feb 20 08:11:14 2012 -0800
+++ b/src/mem/bus.cc Fri Feb 24 11:40:29 2012 -0500
@@ -56,8 +56,9 @@
Bus::Bus(const BusParams *p)
: MemObject(p), busId(p->bus_id), clock(p->clock),
headerCycles(p->header_cycles), width(p->width), tickNextIdle(0),
- drainEvent(NULL), busIdle(this), inRetry(false), defaultPortId(-1),
- useDefaultRange(p->use_default_range), defaultBlockSize(p->block_size),
+ drainEvent(NULL), busIdle(this), inRetry(false),
+ defaultPortId(INVALID_PORT_ID), useDefaultRange(p->use_default_range),
+ defaultBlockSize(p->block_size),
cachedBlockSize(0), cachedBlockSizeValid(false)
{
//width, clock period, and header cycles must be positive
@@ -76,7 +77,7 @@
std::string portName;
int id = interfaces.size();
if (if_name == "default") {
- if (defaultPortId == -1) {
+ if (defaultPortId == INVALID_PORT_ID) {
defaultPortId = id;
portName = csprintf("%s-default", name());
} else
@@ -301,7 +302,7 @@
int dest_id;
dest_id = checkPortCache(addr);
- if (dest_id != -1)
+ if (dest_id != INVALID_PORT_ID)
return dest_id;
// Check normal port ranges
@@ -321,13 +322,16 @@
return defaultPortId;
}
}
-
- panic("Unable to find destination for addr %#llx\n", addr);
+ } else if (defaultPortId != INVALID_PORT_ID) {
+ DPRINTF(Bus, "Unable to find destination for addr %#llx, "
+ "will use default port\n", addr);
+ return defaultPortId;
}
- DPRINTF(Bus, "Unable to find destination for addr %#llx, "
- "will use default port\n", addr);
- return defaultPortId;
+ // we should use the range for the default port and it did not
+ // match, or the default port is not set
+ fatal("Unable to find destination for addr %#llx on bus %s\n", addr,
+ name());
}
diff -r 2629f0b99e8d -r 6c15fa5fe377 src/mem/bus.hh
--- a/src/mem/bus.hh Mon Feb 20 08:11:14 2012 -0800
+++ b/src/mem/bus.hh Fri Feb 24 11:40:29 2012 -0500
@@ -220,7 +220,7 @@
return portCache[2].id;
}
- return -1;
+ return INVALID_PORT_ID;
}
// Clears the earliest entry of the cache and inserts a new port entry
@@ -317,6 +317,9 @@
/** Port that handles requests that don't match any of the interfaces.*/
short defaultPortId;
+ /** A symbolic name for a port id that denotes no port. */
+ static const short INVALID_PORT_ID = -1;
+
/** If true, use address range provided by default device. Any
address not handled by another port and not in default device's
range will cause a fatal error. If false, just send all
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev