From: Andreas Hansson Date: Tue, 26 May 2015 07:21:40 +0000 (-0400) Subject: base: Allow multiple interleaved ranges X-Git-Tag: stable_2015_09_03~22 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=53a360985b5d298e03ed0102d750b2c362ec1d90;p=gem5.git 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. --- 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()); } /**