addr_range.hh revision 10853
12SN/A/* 210676Sandreas.hansson@arm.com * Copyright (c) 2012, 2014 ARM Limited 39235Sandreas.hansson@arm.com * All rights reserved 49235Sandreas.hansson@arm.com * 59235Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall 69235Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual 79235Sandreas.hansson@arm.com * property including but not limited to intellectual property relating 89235Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software 99235Sandreas.hansson@arm.com * licensed hereunder. You may use the software subject to the license 109235Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated 119235Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software, 129235Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form. 139235Sandreas.hansson@arm.com * 141762SN/A * Copyright (c) 2002-2005 The Regents of The University of Michigan 152SN/A * All rights reserved. 162SN/A * 172SN/A * Redistribution and use in source and binary forms, with or without 182SN/A * modification, are permitted provided that the following conditions are 192SN/A * met: redistributions of source code must retain the above copyright 202SN/A * notice, this list of conditions and the following disclaimer; 212SN/A * redistributions in binary form must reproduce the above copyright 222SN/A * notice, this list of conditions and the following disclaimer in the 232SN/A * documentation and/or other materials provided with the distribution; 242SN/A * neither the name of the copyright holders nor the names of its 252SN/A * contributors may be used to endorse or promote products derived from 262SN/A * this software without specific prior written permission. 272SN/A * 282SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 292SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 302SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 312SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 322SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 332SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 342SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 352SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 362SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 372SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 382SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 392665SN/A * 402665SN/A * Authors: Nathan Binkert 412665SN/A * Steve Reinhardt 429235Sandreas.hansson@arm.com * Andreas Hansson 432SN/A */ 442SN/A 459235Sandreas.hansson@arm.com#ifndef __BASE_ADDR_RANGE_HH__ 469235Sandreas.hansson@arm.com#define __BASE_ADDR_RANGE_HH__ 472SN/A 4810481Sandreas.hansson@arm.com#include <list> 499412Sandreas.hansson@arm.com#include <vector> 509412Sandreas.hansson@arm.com 519411Sandreas.hansson@arm.com#include "base/bitfield.hh" 529405Sandreas.hansson@arm.com#include "base/cprintf.hh" 539411Sandreas.hansson@arm.com#include "base/misc.hh" 549235Sandreas.hansson@arm.com#include "base/types.hh" 559235Sandreas.hansson@arm.com 5610676Sandreas.hansson@arm.com/** 5710676Sandreas.hansson@arm.com * The AddrRange class encapsulates an address range, and supports a 5810676Sandreas.hansson@arm.com * number of tests to check if two ranges intersect, if a range 5910676Sandreas.hansson@arm.com * contains a specific address etc. Besides a basic range, the 6010676Sandreas.hansson@arm.com * AddrRange also support interleaved ranges, to stripe across cache 6110676Sandreas.hansson@arm.com * banks, or memory controllers. The interleaving is implemented by 6210676Sandreas.hansson@arm.com * allowing a number of bits of the address, at an arbitrary bit 6310676Sandreas.hansson@arm.com * position, to be used as interleaving bits with an associated 6410676Sandreas.hansson@arm.com * matching value. In addition, to prevent uniformly strided address 6510676Sandreas.hansson@arm.com * patterns from a very biased interleaving, we also allow basic 6610676Sandreas.hansson@arm.com * XOR-based hashing by specifying an additional set of bits to XOR 6710676Sandreas.hansson@arm.com * with before matching. 6810676Sandreas.hansson@arm.com * 6910676Sandreas.hansson@arm.com * The AddrRange is also able to coalesce a number of interleaved 7010676Sandreas.hansson@arm.com * ranges to a contiguous range. 7110676Sandreas.hansson@arm.com */ 729235Sandreas.hansson@arm.comclass AddrRange 732SN/A{ 742SN/A 759405Sandreas.hansson@arm.com private: 769405Sandreas.hansson@arm.com 779411Sandreas.hansson@arm.com /// Private fields for the start and end of the range 7810435Snilay@cs.wisc.edu /// Both _start and _end are part of the range. 799405Sandreas.hansson@arm.com Addr _start; 809405Sandreas.hansson@arm.com Addr _end; 819405Sandreas.hansson@arm.com 829411Sandreas.hansson@arm.com /// The high bit of the slice that is used for interleaving 839411Sandreas.hansson@arm.com uint8_t intlvHighBit; 849411Sandreas.hansson@arm.com 8510676Sandreas.hansson@arm.com /// The high bit of the slice used to XOR hash the value we match 8610676Sandreas.hansson@arm.com /// against, set to 0 to disable. 8710676Sandreas.hansson@arm.com uint8_t xorHighBit; 8810676Sandreas.hansson@arm.com 899411Sandreas.hansson@arm.com /// The number of bits used for interleaving, set to 0 to disable 909411Sandreas.hansson@arm.com uint8_t intlvBits; 919411Sandreas.hansson@arm.com 929411Sandreas.hansson@arm.com /// The value to compare the slice addr[high:(high - bits + 1)] 939411Sandreas.hansson@arm.com /// with. 949411Sandreas.hansson@arm.com uint8_t intlvMatch; 959411Sandreas.hansson@arm.com 969235Sandreas.hansson@arm.com public: 972SN/A 989235Sandreas.hansson@arm.com AddrRange() 9910676Sandreas.hansson@arm.com : _start(1), _end(0), intlvHighBit(0), xorHighBit(0), intlvBits(0), 10010676Sandreas.hansson@arm.com intlvMatch(0) 1019411Sandreas.hansson@arm.com {} 1029411Sandreas.hansson@arm.com 1039411Sandreas.hansson@arm.com AddrRange(Addr _start, Addr _end, uint8_t _intlv_high_bit, 10410676Sandreas.hansson@arm.com uint8_t _xor_high_bit, uint8_t _intlv_bits, 10510676Sandreas.hansson@arm.com uint8_t _intlv_match) 1069411Sandreas.hansson@arm.com : _start(_start), _end(_end), intlvHighBit(_intlv_high_bit), 10710676Sandreas.hansson@arm.com xorHighBit(_xor_high_bit), intlvBits(_intlv_bits), 10810676Sandreas.hansson@arm.com intlvMatch(_intlv_match) 10910676Sandreas.hansson@arm.com { 11010676Sandreas.hansson@arm.com // sanity checks 11110676Sandreas.hansson@arm.com fatal_if(intlvBits && intlvMatch >= ULL(1) << intlvBits, 11210676Sandreas.hansson@arm.com "Match value %d does not fit in %d interleaving bits\n", 11310676Sandreas.hansson@arm.com intlvMatch, intlvBits); 11410676Sandreas.hansson@arm.com 11510676Sandreas.hansson@arm.com // ignore the XOR bits if not interleaving 11610676Sandreas.hansson@arm.com if (intlvBits && xorHighBit) { 11710676Sandreas.hansson@arm.com if (xorHighBit == intlvHighBit) { 11810676Sandreas.hansson@arm.com fatal("XOR and interleave high bit must be different\n"); 11910676Sandreas.hansson@arm.com } else if (xorHighBit > intlvHighBit) { 12010676Sandreas.hansson@arm.com if ((xorHighBit - intlvHighBit) < intlvBits) 12110676Sandreas.hansson@arm.com fatal("XOR and interleave high bit must be at least " 12210676Sandreas.hansson@arm.com "%d bits apart\n", intlvBits); 12310676Sandreas.hansson@arm.com } else { 12410676Sandreas.hansson@arm.com if ((intlvHighBit - xorHighBit) < intlvBits) { 12510676Sandreas.hansson@arm.com fatal("Interleave and XOR high bit must be at least " 12610676Sandreas.hansson@arm.com "%d bits apart\n", intlvBits); 12710676Sandreas.hansson@arm.com } 12810676Sandreas.hansson@arm.com } 12910676Sandreas.hansson@arm.com } 13010676Sandreas.hansson@arm.com } 1319235Sandreas.hansson@arm.com 1329235Sandreas.hansson@arm.com AddrRange(Addr _start, Addr _end) 13310676Sandreas.hansson@arm.com : _start(_start), _end(_end), intlvHighBit(0), xorHighBit(0), 13410676Sandreas.hansson@arm.com intlvBits(0), intlvMatch(0) 1359235Sandreas.hansson@arm.com {} 1369235Sandreas.hansson@arm.com 1379405Sandreas.hansson@arm.com /** 1389412Sandreas.hansson@arm.com * Create an address range by merging a collection of interleaved 1399412Sandreas.hansson@arm.com * ranges. 1409412Sandreas.hansson@arm.com * 1419412Sandreas.hansson@arm.com * @param ranges Interleaved ranges to be merged 1429412Sandreas.hansson@arm.com */ 1439412Sandreas.hansson@arm.com AddrRange(const std::vector<AddrRange>& ranges) 14410676Sandreas.hansson@arm.com : _start(1), _end(0), intlvHighBit(0), xorHighBit(0), intlvBits(0), 14510676Sandreas.hansson@arm.com intlvMatch(0) 1469412Sandreas.hansson@arm.com { 1479412Sandreas.hansson@arm.com if (!ranges.empty()) { 1489412Sandreas.hansson@arm.com // get the values from the first one and check the others 1499412Sandreas.hansson@arm.com _start = ranges.front()._start; 1509412Sandreas.hansson@arm.com _end = ranges.front()._end; 1519412Sandreas.hansson@arm.com intlvHighBit = ranges.front().intlvHighBit; 15210676Sandreas.hansson@arm.com xorHighBit = ranges.front().xorHighBit; 1539412Sandreas.hansson@arm.com intlvBits = ranges.front().intlvBits; 1549412Sandreas.hansson@arm.com 1559412Sandreas.hansson@arm.com if (ranges.size() != (ULL(1) << intlvBits)) 1569412Sandreas.hansson@arm.com fatal("Got %d ranges spanning %d interleaving bits\n", 1579412Sandreas.hansson@arm.com ranges.size(), intlvBits); 1589412Sandreas.hansson@arm.com 1599412Sandreas.hansson@arm.com uint8_t match = 0; 16010676Sandreas.hansson@arm.com for (const auto& r : ranges) { 16110676Sandreas.hansson@arm.com if (!mergesWith(r)) 1629412Sandreas.hansson@arm.com fatal("Can only merge ranges with the same start, end " 1639412Sandreas.hansson@arm.com "and interleaving bits\n"); 1649412Sandreas.hansson@arm.com 16510676Sandreas.hansson@arm.com if (r.intlvMatch != match) 1669412Sandreas.hansson@arm.com fatal("Expected interleave match %d but got %d when " 16710676Sandreas.hansson@arm.com "merging\n", match, r.intlvMatch); 1689412Sandreas.hansson@arm.com ++match; 1699412Sandreas.hansson@arm.com } 1709412Sandreas.hansson@arm.com 1719412Sandreas.hansson@arm.com // our range is complete and we can turn this into a 1729412Sandreas.hansson@arm.com // non-interleaved range 1739412Sandreas.hansson@arm.com intlvHighBit = 0; 17410676Sandreas.hansson@arm.com xorHighBit = 0; 1759412Sandreas.hansson@arm.com intlvBits = 0; 1769412Sandreas.hansson@arm.com } 1779412Sandreas.hansson@arm.com } 1789412Sandreas.hansson@arm.com 1799412Sandreas.hansson@arm.com /** 1809411Sandreas.hansson@arm.com * Determine if the range is interleaved or not. 1819411Sandreas.hansson@arm.com * 1829411Sandreas.hansson@arm.com * @return true if interleaved 1839411Sandreas.hansson@arm.com */ 1849411Sandreas.hansson@arm.com bool interleaved() const { return intlvBits != 0; } 1859411Sandreas.hansson@arm.com 1869411Sandreas.hansson@arm.com /** 18710676Sandreas.hansson@arm.com * Determine if the range interleaving is hashed or not. 18810676Sandreas.hansson@arm.com */ 18910676Sandreas.hansson@arm.com bool hashed() const { return interleaved() && xorHighBit != 0; } 19010676Sandreas.hansson@arm.com 19110676Sandreas.hansson@arm.com /** 1929411Sandreas.hansson@arm.com * Determing the interleaving granularity of the range. 1939411Sandreas.hansson@arm.com * 1949411Sandreas.hansson@arm.com * @return The size of the regions created by the interleaving bits 1959411Sandreas.hansson@arm.com */ 1969581Sandreas.hansson@arm.com uint64_t granularity() const 1979581Sandreas.hansson@arm.com { 1989780Sandreas.hansson@arm.com return ULL(1) << (intlvHighBit - intlvBits + 1); 1999581Sandreas.hansson@arm.com } 2009411Sandreas.hansson@arm.com 2019411Sandreas.hansson@arm.com /** 2029411Sandreas.hansson@arm.com * Determine the number of interleaved address stripes this range 2039411Sandreas.hansson@arm.com * is part of. 2049411Sandreas.hansson@arm.com * 2059411Sandreas.hansson@arm.com * @return The number of stripes spanned by the interleaving bits 2069411Sandreas.hansson@arm.com */ 2079411Sandreas.hansson@arm.com uint32_t stripes() const { return ULL(1) << intlvBits; } 2089411Sandreas.hansson@arm.com 2099411Sandreas.hansson@arm.com /** 2109405Sandreas.hansson@arm.com * Get the size of the address range. For a case where 2119411Sandreas.hansson@arm.com * interleaving is used we make the simplifying assumption that 2129411Sandreas.hansson@arm.com * the size is a divisible by the size of the interleaving slice. 2139405Sandreas.hansson@arm.com */ 2149411Sandreas.hansson@arm.com Addr size() const 2159411Sandreas.hansson@arm.com { 2169411Sandreas.hansson@arm.com return (_end - _start + 1) >> intlvBits; 2179411Sandreas.hansson@arm.com } 218532SN/A 2199405Sandreas.hansson@arm.com /** 2209405Sandreas.hansson@arm.com * Determine if the range is valid. 2219405Sandreas.hansson@arm.com */ 22210435Snilay@cs.wisc.edu bool valid() const { return _start <= _end; } 2239405Sandreas.hansson@arm.com 2249405Sandreas.hansson@arm.com /** 2259405Sandreas.hansson@arm.com * Get the start address of the range. 2269405Sandreas.hansson@arm.com */ 2279405Sandreas.hansson@arm.com Addr start() const { return _start; } 2289405Sandreas.hansson@arm.com 2299405Sandreas.hansson@arm.com /** 23010678SCurtis.Dunham@arm.com * Get the end address of the range. 23110678SCurtis.Dunham@arm.com */ 23210678SCurtis.Dunham@arm.com Addr end() const { return _end; } 23310678SCurtis.Dunham@arm.com 23410678SCurtis.Dunham@arm.com /** 2359405Sandreas.hansson@arm.com * Get a string representation of the range. This could 2369405Sandreas.hansson@arm.com * alternatively be implemented as a operator<<, but at the moment 2379405Sandreas.hansson@arm.com * that seems like overkill. 2389405Sandreas.hansson@arm.com */ 2399405Sandreas.hansson@arm.com std::string to_string() const 2409405Sandreas.hansson@arm.com { 24110676Sandreas.hansson@arm.com if (interleaved()) { 24210676Sandreas.hansson@arm.com if (hashed()) { 24310676Sandreas.hansson@arm.com return csprintf("[%#llx : %#llx], [%d : %d] XOR [%d : %d] = %d", 24410676Sandreas.hansson@arm.com _start, _end, 24510676Sandreas.hansson@arm.com intlvHighBit, intlvHighBit - intlvBits + 1, 24610676Sandreas.hansson@arm.com xorHighBit, xorHighBit - intlvBits + 1, 24710676Sandreas.hansson@arm.com intlvMatch); 24810676Sandreas.hansson@arm.com } else { 24910676Sandreas.hansson@arm.com return csprintf("[%#llx : %#llx], [%d : %d] = %d", 25010676Sandreas.hansson@arm.com _start, _end, 25110676Sandreas.hansson@arm.com intlvHighBit, intlvHighBit - intlvBits + 1, 25210676Sandreas.hansson@arm.com intlvMatch); 25310676Sandreas.hansson@arm.com } 25410676Sandreas.hansson@arm.com } else { 2559411Sandreas.hansson@arm.com return csprintf("[%#llx : %#llx]", _start, _end); 25610676Sandreas.hansson@arm.com } 2579411Sandreas.hansson@arm.com } 2589411Sandreas.hansson@arm.com 2599411Sandreas.hansson@arm.com /** 2609411Sandreas.hansson@arm.com * Determine if another range merges with the current one, i.e. if 2619411Sandreas.hansson@arm.com * they are part of the same contigous range and have the same 2629411Sandreas.hansson@arm.com * interleaving bits. 2639411Sandreas.hansson@arm.com * 2649411Sandreas.hansson@arm.com * @param r Range to evaluate merging with 2659411Sandreas.hansson@arm.com * @return true if the two ranges would merge 2669411Sandreas.hansson@arm.com */ 2679411Sandreas.hansson@arm.com bool mergesWith(const AddrRange& r) const 2689411Sandreas.hansson@arm.com { 2699411Sandreas.hansson@arm.com return r._start == _start && r._end == _end && 2709411Sandreas.hansson@arm.com r.intlvHighBit == intlvHighBit && 27110676Sandreas.hansson@arm.com r.xorHighBit == xorHighBit && 2729411Sandreas.hansson@arm.com r.intlvBits == intlvBits; 2739405Sandreas.hansson@arm.com } 2749279Sandreas.hansson@arm.com 2759279Sandreas.hansson@arm.com /** 2769279Sandreas.hansson@arm.com * Determine if another range intersects this one, i.e. if there 2779279Sandreas.hansson@arm.com * is an address that is both in this range and the other 2789279Sandreas.hansson@arm.com * range. No check is made to ensure either range is valid. 2799279Sandreas.hansson@arm.com * 2809279Sandreas.hansson@arm.com * @param r Range to intersect with 2819279Sandreas.hansson@arm.com * @return true if the intersection of the two ranges is not empty 2829279Sandreas.hansson@arm.com */ 2839279Sandreas.hansson@arm.com bool intersects(const AddrRange& r) const 2849279Sandreas.hansson@arm.com { 28510853Sandreas.hansson@arm.com if (_start > r._end || _end < r._start) 28610853Sandreas.hansson@arm.com // start with the simple case of no overlap at all, 28710853Sandreas.hansson@arm.com // applicable even if we have interleaved ranges 28810853Sandreas.hansson@arm.com return false; 28910853Sandreas.hansson@arm.com else if (!interleaved() && !r.interleaved()) 29010853Sandreas.hansson@arm.com // if neither range is interleaved, we are done 29110853Sandreas.hansson@arm.com return true; 2929411Sandreas.hansson@arm.com 29310853Sandreas.hansson@arm.com // now it gets complicated, focus on the cases we care about 2949411Sandreas.hansson@arm.com if (r.size() == 1) 2959411Sandreas.hansson@arm.com // keep it simple and check if the address is within 2969411Sandreas.hansson@arm.com // this range 2979411Sandreas.hansson@arm.com return contains(r.start()); 2989411Sandreas.hansson@arm.com else if (mergesWith(r)) 2999411Sandreas.hansson@arm.com // restrict the check to ranges that belong to the 3009411Sandreas.hansson@arm.com // same chunk 3019411Sandreas.hansson@arm.com return intlvMatch == r.intlvMatch; 3029411Sandreas.hansson@arm.com else 30310853Sandreas.hansson@arm.com panic("Cannot test intersection of %s and %s\n", 30410853Sandreas.hansson@arm.com to_string(), r.to_string()); 3059279Sandreas.hansson@arm.com } 3069279Sandreas.hansson@arm.com 3079279Sandreas.hansson@arm.com /** 3089279Sandreas.hansson@arm.com * Determine if this range is a subset of another range, i.e. if 3099279Sandreas.hansson@arm.com * every address in this range is also in the other range. No 3109279Sandreas.hansson@arm.com * check is made to ensure either range is valid. 3119279Sandreas.hansson@arm.com * 3129279Sandreas.hansson@arm.com * @param r Range to compare with 3139279Sandreas.hansson@arm.com * @return true if the this range is a subset of the other one 3149279Sandreas.hansson@arm.com */ 3159279Sandreas.hansson@arm.com bool isSubset(const AddrRange& r) const 3169279Sandreas.hansson@arm.com { 3179411Sandreas.hansson@arm.com if (interleaved()) 3189411Sandreas.hansson@arm.com panic("Cannot test subset of interleaved range %s\n", to_string()); 3199405Sandreas.hansson@arm.com return _start >= r._start && _end <= r._end; 3209279Sandreas.hansson@arm.com } 3219405Sandreas.hansson@arm.com 3229405Sandreas.hansson@arm.com /** 3239405Sandreas.hansson@arm.com * Determine if the range contains an address. 3249405Sandreas.hansson@arm.com * 3259405Sandreas.hansson@arm.com * @param a Address to compare with 3269405Sandreas.hansson@arm.com * @return true if the address is in the range 3279405Sandreas.hansson@arm.com */ 3289405Sandreas.hansson@arm.com bool contains(const Addr& a) const 3299405Sandreas.hansson@arm.com { 3309411Sandreas.hansson@arm.com // check if the address is in the range and if there is either 3319411Sandreas.hansson@arm.com // no interleaving, or with interleaving also if the selected 3329411Sandreas.hansson@arm.com // bits from the address match the interleaving value 33310676Sandreas.hansson@arm.com bool in_range = a >= _start && a <= _end; 33410676Sandreas.hansson@arm.com if (!interleaved()) { 33510676Sandreas.hansson@arm.com return in_range; 33610676Sandreas.hansson@arm.com } else if (in_range) { 33710676Sandreas.hansson@arm.com if (!hashed()) { 33810676Sandreas.hansson@arm.com return bits(a, intlvHighBit, intlvHighBit - intlvBits + 1) == 33910676Sandreas.hansson@arm.com intlvMatch; 34010676Sandreas.hansson@arm.com } else { 34110676Sandreas.hansson@arm.com return (bits(a, intlvHighBit, intlvHighBit - intlvBits + 1) ^ 34210676Sandreas.hansson@arm.com bits(a, xorHighBit, xorHighBit - intlvBits + 1)) == 34310676Sandreas.hansson@arm.com intlvMatch; 34410676Sandreas.hansson@arm.com } 34510676Sandreas.hansson@arm.com } 34610676Sandreas.hansson@arm.com return false; 3479405Sandreas.hansson@arm.com } 3482SN/A 349531SN/A/** 3509235Sandreas.hansson@arm.com * Keep the operators away from SWIG. 351531SN/A */ 3529235Sandreas.hansson@arm.com#ifndef SWIG 3532SN/A 3549405Sandreas.hansson@arm.com /** 3559405Sandreas.hansson@arm.com * Less-than operator used to turn an STL map into a binary search 3569405Sandreas.hansson@arm.com * tree of non-overlapping address ranges. 3579405Sandreas.hansson@arm.com * 3589405Sandreas.hansson@arm.com * @param r Range to compare with 3599405Sandreas.hansson@arm.com * @return true if the start address is less than that of the other range 3609405Sandreas.hansson@arm.com */ 3619405Sandreas.hansson@arm.com bool operator<(const AddrRange& r) const 3629405Sandreas.hansson@arm.com { 3639411Sandreas.hansson@arm.com if (_start != r._start) 3649411Sandreas.hansson@arm.com return _start < r._start; 3659411Sandreas.hansson@arm.com else 3669411Sandreas.hansson@arm.com // for now assume that the end is also the same, and that 3679411Sandreas.hansson@arm.com // we are looking at the same interleaving bits 3689411Sandreas.hansson@arm.com return intlvMatch < r.intlvMatch; 3699405Sandreas.hansson@arm.com } 370531SN/A 37110678SCurtis.Dunham@arm.com bool operator==(const AddrRange& r) const 37210678SCurtis.Dunham@arm.com { 37310678SCurtis.Dunham@arm.com if (_start != r._start) return false; 37410678SCurtis.Dunham@arm.com if (_end != r._end) return false; 37510678SCurtis.Dunham@arm.com if (intlvBits != r.intlvBits) return false; 37610678SCurtis.Dunham@arm.com if (intlvBits != 0) { 37710678SCurtis.Dunham@arm.com if (intlvHighBit != r.intlvHighBit) return false; 37810678SCurtis.Dunham@arm.com if (intlvMatch != r.intlvMatch) return false; 37910678SCurtis.Dunham@arm.com } 38010678SCurtis.Dunham@arm.com return true; 38110678SCurtis.Dunham@arm.com } 38210678SCurtis.Dunham@arm.com 38310678SCurtis.Dunham@arm.com bool operator!=(const AddrRange& r) const 38410678SCurtis.Dunham@arm.com { 38510678SCurtis.Dunham@arm.com return !(*this == r); 38610678SCurtis.Dunham@arm.com } 3879405Sandreas.hansson@arm.com#endif // SWIG 3889405Sandreas.hansson@arm.com}; 3892SN/A 39010481Sandreas.hansson@arm.com/** 39110481Sandreas.hansson@arm.com * Convenience typedef for a collection of address ranges 39210481Sandreas.hansson@arm.com */ 39310481Sandreas.hansson@arm.comtypedef std::list<AddrRange> AddrRangeList; 39410481Sandreas.hansson@arm.com 3959235Sandreas.hansson@arm.cominline AddrRange 3969235Sandreas.hansson@arm.comRangeEx(Addr start, Addr end) 3979405Sandreas.hansson@arm.com{ return AddrRange(start, end - 1); } 3982SN/A 3999235Sandreas.hansson@arm.cominline AddrRange 4009235Sandreas.hansson@arm.comRangeIn(Addr start, Addr end) 4019405Sandreas.hansson@arm.com{ return AddrRange(start, end); } 4022SN/A 4039235Sandreas.hansson@arm.cominline AddrRange 4049235Sandreas.hansson@arm.comRangeSize(Addr start, Addr size) 4059405Sandreas.hansson@arm.com{ return AddrRange(start, start + size - 1); } 4062SN/A 4079235Sandreas.hansson@arm.com#endif // __BASE_ADDR_RANGE_HH__ 408