Address.hh revision 7054:7d6862b80049
14104Ssaidi@eecs.umich.edu/* 24104Ssaidi@eecs.umich.edu * Copyright (c) 1999 Mark D. Hill and David A. Wood 34104Ssaidi@eecs.umich.edu * All rights reserved. 44104Ssaidi@eecs.umich.edu * 54104Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 64104Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are 74104Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright 84104Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 94104Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 104104Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 114104Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution; 124104Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its 134104Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from 144104Ssaidi@eecs.umich.edu * this software without specific prior written permission. 154104Ssaidi@eecs.umich.edu * 164104Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 174104Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 184104Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 194104Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 204104Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 214104Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 224104Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 234104Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244104Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254104Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 264104Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274104Ssaidi@eecs.umich.edu */ 284104Ssaidi@eecs.umich.edu 294104Ssaidi@eecs.umich.edu#ifndef __MEM_RUBY_COMMON_ADDRESS_HH__ 304104Ssaidi@eecs.umich.edu#define __MEM_RUBY_COMMON_ADDRESS_HH__ 314104Ssaidi@eecs.umich.edu 324104Ssaidi@eecs.umich.edu#include <iomanip> 334104Ssaidi@eecs.umich.edu 344104Ssaidi@eecs.umich.edu#include "base/hashmap.hh" 354104Ssaidi@eecs.umich.edu#include "mem/ruby/common/Global.hh" 364104Ssaidi@eecs.umich.edu#include "mem/ruby/system/MachineID.hh" 374104Ssaidi@eecs.umich.edu#include "mem/ruby/system/NodeID.hh" 384104Ssaidi@eecs.umich.edu#include "mem/ruby/system/System.hh" 394104Ssaidi@eecs.umich.edu 408229Snate@binkert.orgconst int ADDRESS_WIDTH = 64; // address width in bytes 414104Ssaidi@eecs.umich.edu 427723SAli.Saidi@ARM.comclass Address; 434104Ssaidi@eecs.umich.edutypedef Address PhysAddress; 444104Ssaidi@eecs.umich.edutypedef Address VirtAddress; 458739Sgblack@eecs.umich.edu 468232Snate@binkert.orgclass Address 474104Ssaidi@eecs.umich.edu{ 484104Ssaidi@eecs.umich.edu public: 498229Snate@binkert.org Address() 504104Ssaidi@eecs.umich.edu : m_address(0) 514194Ssaidi@eecs.umich.edu { } 524104Ssaidi@eecs.umich.edu 534104Ssaidi@eecs.umich.edu explicit 544762Snate@binkert.org Address(physical_address_t address) 554104Ssaidi@eecs.umich.edu : m_address(address) 564104Ssaidi@eecs.umich.edu { } 574104Ssaidi@eecs.umich.edu 584104Ssaidi@eecs.umich.edu Address(const Address& obj); 594104Ssaidi@eecs.umich.edu Address& operator=(const Address& obj); 604104Ssaidi@eecs.umich.edu 614104Ssaidi@eecs.umich.edu void setAddress(physical_address_t address) { m_address = address; } 625103Ssaidi@eecs.umich.edu physical_address_t getAddress() const {return m_address;} 635103Ssaidi@eecs.umich.edu // selects bits inclusive 645103Ssaidi@eecs.umich.edu physical_address_t bitSelect(int small, int big) const; 654104Ssaidi@eecs.umich.edu physical_address_t bitRemove(int small, int big) const; 664104Ssaidi@eecs.umich.edu physical_address_t maskLowOrderBits(int number) const; 674104Ssaidi@eecs.umich.edu physical_address_t maskHighOrderBits(int number) const; 684104Ssaidi@eecs.umich.edu physical_address_t shiftLowOrderBits(int number) const; 694104Ssaidi@eecs.umich.edu 704104Ssaidi@eecs.umich.edu physical_address_t 714104Ssaidi@eecs.umich.edu getLineAddress() const 724104Ssaidi@eecs.umich.edu { 734104Ssaidi@eecs.umich.edu return bitSelect(RubySystem::getBlockSizeBits(), ADDRESS_WIDTH); 744104Ssaidi@eecs.umich.edu } 754104Ssaidi@eecs.umich.edu 764104Ssaidi@eecs.umich.edu physical_address_t 774104Ssaidi@eecs.umich.edu getOffset() const 784104Ssaidi@eecs.umich.edu { 794104Ssaidi@eecs.umich.edu return bitSelect(0, RubySystem::getBlockSizeBits() - 1); 804104Ssaidi@eecs.umich.edu } 814104Ssaidi@eecs.umich.edu 824104Ssaidi@eecs.umich.edu void 834104Ssaidi@eecs.umich.edu makeLineAddress() 844104Ssaidi@eecs.umich.edu { 854870Sstever@eecs.umich.edu m_address = maskLowOrderBits(RubySystem::getBlockSizeBits()); 864104Ssaidi@eecs.umich.edu } 874104Ssaidi@eecs.umich.edu 884104Ssaidi@eecs.umich.edu // returns the next stride address based on line address 894104Ssaidi@eecs.umich.edu void 904104Ssaidi@eecs.umich.edu makeNextStrideAddress(int stride) 914104Ssaidi@eecs.umich.edu { 924104Ssaidi@eecs.umich.edu m_address = maskLowOrderBits(RubySystem::getBlockSizeBits()) 934104Ssaidi@eecs.umich.edu + RubySystem::getBlockSizeBytes()*stride; 944104Ssaidi@eecs.umich.edu } 956712Snate@binkert.org 966712Snate@binkert.org int getBankSetNum() const; 974104Ssaidi@eecs.umich.edu int getBankSetDist() const; 984104Ssaidi@eecs.umich.edu 994104Ssaidi@eecs.umich.edu Index memoryModuleIndex() const; 1004104Ssaidi@eecs.umich.edu 1014104Ssaidi@eecs.umich.edu void print(ostream& out) const; 1026712Snate@binkert.org void output(ostream& out) const; 1036712Snate@binkert.org void input(istream& in); 1046712Snate@binkert.org 1054104Ssaidi@eecs.umich.edu void 1064104Ssaidi@eecs.umich.edu setOffset(int offset) 1074104Ssaidi@eecs.umich.edu { 1084104Ssaidi@eecs.umich.edu // first, zero out the offset bits 1094104Ssaidi@eecs.umich.edu makeLineAddress(); 1104104Ssaidi@eecs.umich.edu m_address |= (physical_address_t) offset; 1114104Ssaidi@eecs.umich.edu } 1124104Ssaidi@eecs.umich.edu 1134104Ssaidi@eecs.umich.edu private: 1144104Ssaidi@eecs.umich.edu physical_address_t m_address; 1154104Ssaidi@eecs.umich.edu}; 1164104Ssaidi@eecs.umich.edu 1174104Ssaidi@eecs.umich.eduinline Address 1184104Ssaidi@eecs.umich.eduline_address(const Address& addr) 1194104Ssaidi@eecs.umich.edu{ 1204104Ssaidi@eecs.umich.edu Address temp(addr); 1215714Shsul@eecs.umich.edu temp.makeLineAddress(); 1224104Ssaidi@eecs.umich.edu return temp; 1234104Ssaidi@eecs.umich.edu} 1244104Ssaidi@eecs.umich.edu 1254104Ssaidi@eecs.umich.eduinline bool 1264104Ssaidi@eecs.umich.eduoperator<(const Address& obj1, const Address& obj2) 1274104Ssaidi@eecs.umich.edu{ 1284104Ssaidi@eecs.umich.edu return obj1.getAddress() < obj2.getAddress(); 1294104Ssaidi@eecs.umich.edu} 1304104Ssaidi@eecs.umich.edu 1314104Ssaidi@eecs.umich.eduinline ostream& 1324104Ssaidi@eecs.umich.eduoperator<<(ostream& out, const Address& obj) 1334104Ssaidi@eecs.umich.edu{ 1344104Ssaidi@eecs.umich.edu obj.print(out); 1354104Ssaidi@eecs.umich.edu out << flush; 1364104Ssaidi@eecs.umich.edu return out; 1374104Ssaidi@eecs.umich.edu} 1384104Ssaidi@eecs.umich.edu 1394104Ssaidi@eecs.umich.eduinline bool 1404104Ssaidi@eecs.umich.eduoperator==(const Address& obj1, const Address& obj2) 1414104Ssaidi@eecs.umich.edu{ 1424104Ssaidi@eecs.umich.edu return (obj1.getAddress() == obj2.getAddress()); 1434104Ssaidi@eecs.umich.edu} 1444104Ssaidi@eecs.umich.edu 1454104Ssaidi@eecs.umich.eduinline bool 1464104Ssaidi@eecs.umich.eduoperator!=(const Address& obj1, const Address& obj2) 1474104Ssaidi@eecs.umich.edu{ 1484104Ssaidi@eecs.umich.edu return (obj1.getAddress() != obj2.getAddress()); 1494104Ssaidi@eecs.umich.edu} 1504104Ssaidi@eecs.umich.edu 1514104Ssaidi@eecs.umich.edu// rips bits inclusive 1524104Ssaidi@eecs.umich.eduinline physical_address_t 1534104Ssaidi@eecs.umich.eduAddress::bitSelect(int small, int big) const 1544104Ssaidi@eecs.umich.edu{ 1554104Ssaidi@eecs.umich.edu physical_address_t mask; 1564104Ssaidi@eecs.umich.edu assert((unsigned)big >= (unsigned)small); 1574104Ssaidi@eecs.umich.edu 1584104Ssaidi@eecs.umich.edu if (big >= ADDRESS_WIDTH - 1) { 1594104Ssaidi@eecs.umich.edu return (m_address >> small); 1604104Ssaidi@eecs.umich.edu } else { 1614104Ssaidi@eecs.umich.edu mask = ~((physical_address_t)~0 << (big + 1)); 1624104Ssaidi@eecs.umich.edu // FIXME - this is slow to manipulate a 64-bit number using 32-bits 1634104Ssaidi@eecs.umich.edu physical_address_t partial = (m_address & mask); 1644104Ssaidi@eecs.umich.edu return (partial >> small); 1654104Ssaidi@eecs.umich.edu } 1664104Ssaidi@eecs.umich.edu} 1674104Ssaidi@eecs.umich.edu 1684104Ssaidi@eecs.umich.edu// removes bits inclusive 1694104Ssaidi@eecs.umich.eduinline physical_address_t 1704104Ssaidi@eecs.umich.eduAddress::bitRemove(int small, int big) const 1714104Ssaidi@eecs.umich.edu{ 1724104Ssaidi@eecs.umich.edu physical_address_t mask; 1734104Ssaidi@eecs.umich.edu assert((unsigned)big >= (unsigned)small); 1744104Ssaidi@eecs.umich.edu 1754104Ssaidi@eecs.umich.edu if (small >= ADDRESS_WIDTH - 1) { 1764104Ssaidi@eecs.umich.edu return m_address; 1774104Ssaidi@eecs.umich.edu } else if (big >= ADDRESS_WIDTH - 1) { 1784870Sstever@eecs.umich.edu mask = (physical_address_t)~0 >> small; 1794104Ssaidi@eecs.umich.edu return (m_address & mask); 1804104Ssaidi@eecs.umich.edu } else if (small == 0) { 1814104Ssaidi@eecs.umich.edu mask = (physical_address_t)~0 << big; 1824104Ssaidi@eecs.umich.edu return (m_address & mask); 1834104Ssaidi@eecs.umich.edu } else { 1844104Ssaidi@eecs.umich.edu mask = ~((physical_address_t)~0 << small); 1854104Ssaidi@eecs.umich.edu physical_address_t lower_bits = m_address & mask; 1864104Ssaidi@eecs.umich.edu mask = (physical_address_t)~0 << (big + 1); 1874104Ssaidi@eecs.umich.edu physical_address_t higher_bits = m_address & mask; 1884104Ssaidi@eecs.umich.edu 1894104Ssaidi@eecs.umich.edu // Shift the valid high bits over the removed section 1904104Ssaidi@eecs.umich.edu higher_bits = higher_bits >> (big - small); 1914104Ssaidi@eecs.umich.edu return (higher_bits | lower_bits); 1924104Ssaidi@eecs.umich.edu } 1934104Ssaidi@eecs.umich.edu} 1944216Ssaidi@eecs.umich.edu 1954216Ssaidi@eecs.umich.eduinline physical_address_t 1964104Ssaidi@eecs.umich.eduAddress::maskLowOrderBits(int number) const 1974104Ssaidi@eecs.umich.edu{ 1984104Ssaidi@eecs.umich.edu physical_address_t mask; 1994104Ssaidi@eecs.umich.edu 2006712Snate@binkert.org if (number >= ADDRESS_WIDTH - 1) { 2014104Ssaidi@eecs.umich.edu mask = ~0; 2024104Ssaidi@eecs.umich.edu } else { 2034104Ssaidi@eecs.umich.edu mask = (physical_address_t)~0 << number; 2044104Ssaidi@eecs.umich.edu } 2054216Ssaidi@eecs.umich.edu return (m_address & mask); 2064216Ssaidi@eecs.umich.edu} 2074104Ssaidi@eecs.umich.edu 2084104Ssaidi@eecs.umich.eduinline physical_address_t 2094104Ssaidi@eecs.umich.eduAddress::maskHighOrderBits(int number) const 2104104Ssaidi@eecs.umich.edu{ 2114104Ssaidi@eecs.umich.edu physical_address_t mask; 2124216Ssaidi@eecs.umich.edu 2134104Ssaidi@eecs.umich.edu if (number >= ADDRESS_WIDTH - 1) { 2144104Ssaidi@eecs.umich.edu mask = ~0; 2154104Ssaidi@eecs.umich.edu } else { 2164104Ssaidi@eecs.umich.edu mask = (physical_address_t)~0 >> number; 2174104Ssaidi@eecs.umich.edu } 2184104Ssaidi@eecs.umich.edu return (m_address & mask); 2194104Ssaidi@eecs.umich.edu} 2204104Ssaidi@eecs.umich.edu 2214104Ssaidi@eecs.umich.eduinline physical_address_t 2224104Ssaidi@eecs.umich.eduAddress::shiftLowOrderBits(int number) const 2234104Ssaidi@eecs.umich.edu{ 2244104Ssaidi@eecs.umich.edu return (m_address >> number); 2254104Ssaidi@eecs.umich.edu} 2264104Ssaidi@eecs.umich.edu 2274104Ssaidi@eecs.umich.eduinline integer_t 2284104Ssaidi@eecs.umich.eduAddress::memoryModuleIndex() const 2294104Ssaidi@eecs.umich.edu{ 2304104Ssaidi@eecs.umich.edu integer_t index = 2314104Ssaidi@eecs.umich.edu bitSelect(RubySystem::getBlockSizeBits() + 2324104Ssaidi@eecs.umich.edu RubySystem::getMemorySizeBits(), ADDRESS_WIDTH); 2334104Ssaidi@eecs.umich.edu assert (index >= 0); 2344104Ssaidi@eecs.umich.edu return index; 2354104Ssaidi@eecs.umich.edu 2365714Shsul@eecs.umich.edu // Index indexHighPortion = 2374104Ssaidi@eecs.umich.edu // address.bitSelect(MEMORY_SIZE_BITS - 1, 2384104Ssaidi@eecs.umich.edu // PAGE_SIZE_BITS + NUMBER_OF_MEMORY_MODULE_BITS); 2394104Ssaidi@eecs.umich.edu // Index indexLowPortion = 2404104Ssaidi@eecs.umich.edu // address.bitSelect(DATA_BLOCK_BITS, PAGE_SIZE_BITS - 1); 2414104Ssaidi@eecs.umich.edu // 2424104Ssaidi@eecs.umich.edu // Index index = indexLowPortion | 2434104Ssaidi@eecs.umich.edu // (indexHighPortion << (PAGE_SIZE_BITS - DATA_BLOCK_BITS)); 2444216Ssaidi@eecs.umich.edu 2454216Ssaidi@eecs.umich.edu /* 2464104Ssaidi@eecs.umich.edu Round-robin mapping of addresses, at page size granularity 2474104Ssaidi@eecs.umich.edu 2484104Ssaidi@eecs.umich.eduADDRESS_WIDTH MEMORY_SIZE_BITS PAGE_SIZE_BITS DATA_BLOCK_BITS 2494104Ssaidi@eecs.umich.edu | | | | 2504104Ssaidi@eecs.umich.edu \ / \ / \ / \ / 0 2514216Ssaidi@eecs.umich.edu ----------------------------------------------------------------------- 2524216Ssaidi@eecs.umich.edu | unused |xxxxxxxxxxxxxxx| |xxxxxxxxxxxxxxx| | 2534104Ssaidi@eecs.umich.edu | |xxxxxxxxxxxxxxx| |xxxxxxxxxxxxxxx| | 2544104Ssaidi@eecs.umich.edu ----------------------------------------------------------------------- 2554104Ssaidi@eecs.umich.edu indexHighPortion indexLowPortion 2564104Ssaidi@eecs.umich.edu <-------> 2574104Ssaidi@eecs.umich.edu NUMBER_OF_MEMORY_MODULE_BITS 2584104Ssaidi@eecs.umich.edu */ 2594104Ssaidi@eecs.umich.edu} 2604104Ssaidi@eecs.umich.edu 2614104Ssaidi@eecs.umich.eduinline void 2624104Ssaidi@eecs.umich.eduAddress::print(ostream& out) const 2634104Ssaidi@eecs.umich.edu{ 2644104Ssaidi@eecs.umich.edu using namespace std; 2654104Ssaidi@eecs.umich.edu out << "[" << hex << "0x" << m_address << "," << " line 0x" 2664104Ssaidi@eecs.umich.edu << maskLowOrderBits(RubySystem::getBlockSizeBits()) << dec << "]" 2674216Ssaidi@eecs.umich.edu << flush; 2684216Ssaidi@eecs.umich.edu} 2694104Ssaidi@eecs.umich.edu 2704104Ssaidi@eecs.umich.educlass Address; 2714104Ssaidi@eecs.umich.edunamespace __hash_namespace { 2724104Ssaidi@eecs.umich.edutemplate <> struct hash<Address> 2734104Ssaidi@eecs.umich.edu{ 2744104Ssaidi@eecs.umich.edu size_t 2754104Ssaidi@eecs.umich.edu operator()(const Address &s) const 2764194Ssaidi@eecs.umich.edu { 2775719Shsul@eecs.umich.edu return (size_t)s.getAddress(); 2784104Ssaidi@eecs.umich.edu } 2794130Ssaidi@eecs.umich.edu}; 2804194Ssaidi@eecs.umich.edu/* namespace __hash_namespace */ } 2814194Ssaidi@eecs.umich.edu 2824216Ssaidi@eecs.umich.edunamespace std { 2834216Ssaidi@eecs.umich.edutemplate <> struct equal_to<Address> 2844194Ssaidi@eecs.umich.edu{ 2854194Ssaidi@eecs.umich.edu bool 2864194Ssaidi@eecs.umich.edu operator()(const Address& s1, const Address& s2) const 2874194Ssaidi@eecs.umich.edu { 2884194Ssaidi@eecs.umich.edu return s1 == s2; 2894194Ssaidi@eecs.umich.edu } 2904194Ssaidi@eecs.umich.edu}; 2914194Ssaidi@eecs.umich.edu/* namespace std */ } 2924194Ssaidi@eecs.umich.edu 2934194Ssaidi@eecs.umich.edu#endif // __MEM_RUBY_COMMON_ADDRESS_HH__ 2944216Ssaidi@eecs.umich.edu