diff options
author | Andreas Hansson <andreas.hansson@arm.com> | 2015-05-26 03:21:40 -0400 |
---|---|---|
committer | Andreas Hansson <andreas.hansson@arm.com> | 2015-05-26 03:21:40 -0400 |
commit | 53a360985b5d298e03ed0102d750b2c362ec1d90 (patch) | |
tree | b650358bd5ab73086f731f9cd60f11f54f427a57 /src | |
parent | 4bc7dfb697bd779b12f1fd95fbe72144ae134055 (diff) | |
download | gem5-53a360985b5d298e03ed0102d750b2c362ec1d90.tar.xz |
base: Allow multiple interleaved ranges
This patch changes how the address range calculates intersection such
that a system can have a number of non-overlapping interleaved ranges
without complaining. Without this patch we end up with a panic.
Diffstat (limited to 'src')
-rw-r--r-- | src/base/addr_range.hh | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/src/base/addr_range.hh b/src/base/addr_range.hh index 2a20863b4..ed0259ff7 100644 --- a/src/base/addr_range.hh +++ b/src/base/addr_range.hh @@ -282,26 +282,26 @@ class AddrRange */ bool intersects(const AddrRange& r) const { - if (!interleaved()) { - return _start <= r._end && _end >= r._start; - } - - // the current range is interleaved, split the check up in - // three cases + if (_start > r._end || _end < r._start) + // start with the simple case of no overlap at all, + // applicable even if we have interleaved ranges + return false; + else if (!interleaved() && !r.interleaved()) + // if neither range is interleaved, we are done + return true; + + // now it gets complicated, focus on the cases we care about if (r.size() == 1) // keep it simple and check if the address is within // this range return contains(r.start()); - else if (!r.interleaved()) - // be conservative and ignore the interleaving - return _start <= r._end && _end >= r._start; else if (mergesWith(r)) // restrict the check to ranges that belong to the // same chunk return intlvMatch == r.intlvMatch; else - panic("Cannot test intersection of interleaved range %s\n", - to_string()); + panic("Cannot test intersection of %s and %s\n", + to_string(), r.to_string()); } /** |