summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mem/physical.cc29
-rw-r--r--src/mem/physical.hh4
2 files changed, 28 insertions, 5 deletions
diff --git a/src/mem/physical.cc b/src/mem/physical.cc
index 140e2b1c0..df106d8cc 100644
--- a/src/mem/physical.cc
+++ b/src/mem/physical.cc
@@ -203,13 +203,34 @@ PhysicalMemory::getConfAddrRanges() const
// this could be done once in the constructor, but since it is unlikely to
// be called more than once the iteration should not be a problem
AddrRangeList ranges;
- for (vector<AbstractMemory*>::const_iterator m = memories.begin();
- m != memories.end(); ++m) {
- if ((*m)->isConfReported()) {
- ranges.push_back((*m)->getAddrRange());
+ vector<AddrRange> intlv_ranges;
+ for (AddrRangeMap<AbstractMemory*>::const_iterator r = addrMap.begin();
+ r != addrMap.end(); ++r) {
+ if (r->second->isConfReported()) {
+ // if the range is interleaved then save it for now
+ if (r->first.interleaved()) {
+ // if we already got interleaved ranges that are not
+ // part of the same range, then first do a merge
+ // before we add the new one
+ if (!intlv_ranges.empty() &&
+ !intlv_ranges.back().mergesWith(r->first)) {
+ ranges.push_back(AddrRange(intlv_ranges));
+ intlv_ranges.clear();
+ }
+ intlv_ranges.push_back(r->first);
+ } else {
+ // keep the current range
+ ranges.push_back(r->first);
+ }
}
}
+ // if there is still interleaved ranges waiting to be merged,
+ // go ahead and do it
+ if (!intlv_ranges.empty()) {
+ ranges.push_back(AddrRange(intlv_ranges));
+ }
+
return ranges;
}
diff --git a/src/mem/physical.hh b/src/mem/physical.hh
index 10edeb18f..02fefb478 100644
--- a/src/mem/physical.hh
+++ b/src/mem/physical.hh
@@ -135,7 +135,9 @@ class PhysicalMemory : public Serializable
/**
* Get the memory ranges for all memories that are to be reported
- * to the configuration table.
+ * to the configuration table. The ranges are merged before they
+ * are returned such that any interleaved ranges appear as a
+ * single range.
*
* @return All configuration table memory ranges
*/