base: Allow multiple interleaved ranges
authorAndreas Hansson <andreas.hansson@arm.com>
Tue, 26 May 2015 07:21:40 +0000 (03:21 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Tue, 26 May 2015 07:21:40 +0000 (03:21 -0400)
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.

src/base/addr_range.hh

index 2a20863b4ec00e3c2a8d1e478a4e0451c8146f59..ed0259ff7845ce54c9ac1e57aab499cdf8e9d495 100644 (file)
@@ -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());
     }
 
     /**