addr_range.hh (12334:e0ab29a34764) | addr_range.hh (12977:cdc78a6e54d7) |
---|---|
1/* | 1/* |
2 * Copyright (c) 2012, 2014, 2017 ARM Limited | 2 * Copyright (c) 2012, 2014, 2017-2018 ARM Limited |
3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software 9 * licensed hereunder. You may use the software subject to the license 10 * terms below provided that you ensure that this notice is replicated --- 29 unchanged lines hidden (view full) --- 40 * Authors: Nathan Binkert 41 * Steve Reinhardt 42 * Andreas Hansson 43 */ 44 45#ifndef __BASE_ADDR_RANGE_HH__ 46#define __BASE_ADDR_RANGE_HH__ 47 | 3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software 9 * licensed hereunder. You may use the software subject to the license 10 * terms below provided that you ensure that this notice is replicated --- 29 unchanged lines hidden (view full) --- 40 * Authors: Nathan Binkert 41 * Steve Reinhardt 42 * Andreas Hansson 43 */ 44 45#ifndef __BASE_ADDR_RANGE_HH__ 46#define __BASE_ADDR_RANGE_HH__ 47 |
48#include <algorithm> |
|
48#include <list> 49#include <vector> 50 51#include "base/bitfield.hh" 52#include "base/cprintf.hh" 53#include "base/logging.hh" 54#include "base/types.hh" 55 --- 134 unchanged lines hidden (view full) --- 190 191 /** 192 * Determing the interleaving granularity of the range. 193 * 194 * @return The size of the regions created by the interleaving bits 195 */ 196 uint64_t granularity() const 197 { | 49#include <list> 50#include <vector> 51 52#include "base/bitfield.hh" 53#include "base/cprintf.hh" 54#include "base/logging.hh" 55#include "base/types.hh" 56 --- 134 unchanged lines hidden (view full) --- 191 192 /** 193 * Determing the interleaving granularity of the range. 194 * 195 * @return The size of the regions created by the interleaving bits 196 */ 197 uint64_t granularity() const 198 { |
198 return ULL(1) << (intlvHighBit - intlvBits + 1); | 199 if (interleaved()) { 200 const uint8_t intlv_low_bit = intlvHighBit - intlvBits + 1; 201 if (hashed()) { 202 const uint8_t xor_low_bit = xorHighBit - intlvBits + 1; 203 return ULL(1) << std::min(intlv_low_bit, xor_low_bit); 204 } else { 205 return ULL(1) << intlv_low_bit; 206 } 207 } else { 208 return size(); 209 } |
199 } 200 201 /** 202 * Determine the number of interleaved address stripes this range 203 * is part of. 204 * 205 * @return The number of stripes spanned by the interleaving bits 206 */ --- 104 unchanged lines hidden (view full) --- 311 * 312 * @param r Range to compare with 313 * @return true if the this range is a subset of the other one 314 */ 315 bool isSubset(const AddrRange& r) const 316 { 317 if (interleaved()) 318 panic("Cannot test subset of interleaved range %s\n", to_string()); | 210 } 211 212 /** 213 * Determine the number of interleaved address stripes this range 214 * is part of. 215 * 216 * @return The number of stripes spanned by the interleaving bits 217 */ --- 104 unchanged lines hidden (view full) --- 322 * 323 * @param r Range to compare with 324 * @return true if the this range is a subset of the other one 325 */ 326 bool isSubset(const AddrRange& r) const 327 { 328 if (interleaved()) 329 panic("Cannot test subset of interleaved range %s\n", to_string()); |
319 return _start >= r._start && _end <= r._end; | 330 331 // This address range is not interleaved and therefore it 332 // suffices to check the upper bound, the lower bound and 333 // whether it would fit in a continuous segment of the input 334 // addr range. 335 if (r.interleaved()) { 336 return r.contains(_start) && r.contains(_end) && 337 size() <= r.granularity(); 338 } else { 339 return _start >= r._start && _end <= r._end; 340 } |
320 } 321 322 /** 323 * Determine if the range contains an address. 324 * 325 * @param a Address to compare with 326 * @return true if the address is in the range 327 */ --- 123 unchanged lines hidden --- | 341 } 342 343 /** 344 * Determine if the range contains an address. 345 * 346 * @param a Address to compare with 347 * @return true if the address is in the range 348 */ --- 123 unchanged lines hidden --- |