DirectoryMemory.cc revision 11049:dfb0aa3f0649
15831Sgblack@eecs.umich.edu/* 25831Sgblack@eecs.umich.edu * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 35831Sgblack@eecs.umich.edu * All rights reserved. 45831Sgblack@eecs.umich.edu * 55831Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 65831Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 75831Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 85831Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 95831Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 105831Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 115831Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 125831Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 135831Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 145831Sgblack@eecs.umich.edu * this software without specific prior written permission. 155831Sgblack@eecs.umich.edu * 165831Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175831Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185831Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195831Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205831Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215831Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225831Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235831Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245831Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255831Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265831Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275831Sgblack@eecs.umich.edu */ 285831Sgblack@eecs.umich.edu 295831Sgblack@eecs.umich.edu#include "base/intmath.hh" 305831Sgblack@eecs.umich.edu#include "debug/RubyCache.hh" 3111793Sbrandon.potter@amd.com#include "debug/RubyStats.hh" 3211793Sbrandon.potter@amd.com#include "mem/ruby/slicc_interface/RubySlicc_Util.hh" 335831Sgblack@eecs.umich.edu#include "mem/ruby/structures/DirectoryMemory.hh" 348232Snate@binkert.org#include "mem/ruby/system/System.hh" 355831Sgblack@eecs.umich.edu 365831Sgblack@eecs.umich.eduusing namespace std; 375831Sgblack@eecs.umich.edu 3812514Sjason@lowepower.comint DirectoryMemory::m_num_directories = 0; 3912514Sjason@lowepower.comint DirectoryMemory::m_num_directories_bits = 0; 4012514Sjason@lowepower.comuint64_t DirectoryMemory::m_total_size_bytes = 0; 4112514Sjason@lowepower.comint DirectoryMemory::m_numa_high_bit = 0; 4212514Sjason@lowepower.com 435831Sgblack@eecs.umich.eduDirectoryMemory::DirectoryMemory(const Params *p) 445831Sgblack@eecs.umich.edu : SimObject(p) 455831Sgblack@eecs.umich.edu{ 465831Sgblack@eecs.umich.edu m_version = p->version; 479808Sstever@gmail.com m_size_bytes = p->size; 489808Sstever@gmail.com m_size_bits = floorLog2(m_size_bytes); 499808Sstever@gmail.com m_num_entries = 0; 509808Sstever@gmail.com m_numa_high_bit = p->numa_high_bit; 519808Sstever@gmail.com} 529808Sstever@gmail.com 5312653Sandreas.sandberg@arm.comvoid 549808Sstever@gmail.comDirectoryMemory::init() 5512653Sandreas.sandberg@arm.com{ 5612653Sandreas.sandberg@arm.com m_num_entries = m_size_bytes / RubySystem::getBlockSizeBytes(); 5712653Sandreas.sandberg@arm.com m_entries = new AbstractEntry*[m_num_entries]; 589808Sstever@gmail.com for (int i = 0; i < m_num_entries; i++) 599808Sstever@gmail.com m_entries[i] = NULL; 609808Sstever@gmail.com 619808Sstever@gmail.com m_num_directories++; 629808Sstever@gmail.com m_num_directories_bits = ceilLog2(m_num_directories); 639808Sstever@gmail.com m_total_size_bytes += m_size_bytes; 649808Sstever@gmail.com 6514290Sgabeblack@google.com if (m_numa_high_bit == 0) { 6614290Sgabeblack@google.com m_numa_high_bit = RubySystem::getMemorySizeBits() - 1; 6714291Sgabeblack@google.com } 6814290Sgabeblack@google.com assert(m_numa_high_bit != 0); 6914290Sgabeblack@google.com} 7014290Sgabeblack@google.com 7114291Sgabeblack@google.comDirectoryMemory::~DirectoryMemory() 7214290Sgabeblack@google.com{ 7314290Sgabeblack@google.com // free up all the directory entries 749808Sstever@gmail.com for (uint64_t i = 0; i < m_num_entries; i++) { 759808Sstever@gmail.com if (m_entries[i] != NULL) { 769808Sstever@gmail.com delete m_entries[i]; 778711Sandreas.hansson@arm.com } 789090Sandreas.hansson@arm.com } 795831Sgblack@eecs.umich.edu delete [] m_entries; 808711Sandreas.hansson@arm.com} 819090Sandreas.hansson@arm.com 828711Sandreas.hansson@arm.comuint64_t 838711Sandreas.hansson@arm.comDirectoryMemory::mapAddressToDirectoryVersion(Addr address) 848711Sandreas.hansson@arm.com{ 855831Sgblack@eecs.umich.edu if (m_num_directories_bits == 0) 865831Sgblack@eecs.umich.edu return 0; 875832Sgblack@eecs.umich.edu 885831Sgblack@eecs.umich.edu uint64_t ret = bitSelect(address, 895831Sgblack@eecs.umich.edu m_numa_high_bit - m_num_directories_bits + 1, 905832Sgblack@eecs.umich.edu m_numa_high_bit); 915832Sgblack@eecs.umich.edu return ret; 925832Sgblack@eecs.umich.edu} 935832Sgblack@eecs.umich.edu 945832Sgblack@eecs.umich.edubool 955832Sgblack@eecs.umich.eduDirectoryMemory::isPresent(Addr address) 9614290Sgabeblack@google.com{ 9714290Sgabeblack@google.com bool ret = (mapAddressToDirectoryVersion(address) == m_version); 9814290Sgabeblack@google.com return ret; 9914290Sgabeblack@google.com} 10014290Sgabeblack@google.com 1015832Sgblack@eecs.umich.eduuint64_t 1025832Sgblack@eecs.umich.eduDirectoryMemory::mapAddressToLocalIdx(Addr address) 10314290Sgabeblack@google.com{ 10414290Sgabeblack@google.com uint64_t ret; 10514290Sgabeblack@google.com if (m_num_directories_bits > 0) { 10614290Sgabeblack@google.com ret = bitRemove(address, m_numa_high_bit - m_num_directories_bits + 1, 10714290Sgabeblack@google.com m_numa_high_bit); 1085831Sgblack@eecs.umich.edu } else { 1095831Sgblack@eecs.umich.edu ret = address; 1105831Sgblack@eecs.umich.edu } 1115831Sgblack@eecs.umich.edu 1125831Sgblack@eecs.umich.edu return ret >> (RubySystem::getBlockSizeBits()); 1135831Sgblack@eecs.umich.edu} 1145831Sgblack@eecs.umich.edu 1155831Sgblack@eecs.umich.eduAbstractEntry* 1165831Sgblack@eecs.umich.eduDirectoryMemory::lookup(Addr address) 11712653Sandreas.sandberg@arm.com{ 11812653Sandreas.sandberg@arm.com assert(isPresent(address)); 11912653Sandreas.sandberg@arm.com DPRINTF(RubyCache, "Looking up address: %s\n", address); 12012653Sandreas.sandberg@arm.com 1215831Sgblack@eecs.umich.edu uint64_t idx = mapAddressToLocalIdx(address); 1225831Sgblack@eecs.umich.edu assert(idx < m_num_entries); 1235831Sgblack@eecs.umich.edu return m_entries[idx]; 1245831Sgblack@eecs.umich.edu} 1255831Sgblack@eecs.umich.edu 1265831Sgblack@eecs.umich.eduAbstractEntry* 1275831Sgblack@eecs.umich.eduDirectoryMemory::allocate(Addr address, AbstractEntry *entry) 1285831Sgblack@eecs.umich.edu{ 1295831Sgblack@eecs.umich.edu assert(isPresent(address)); 1305831Sgblack@eecs.umich.edu uint64_t idx; 1315831Sgblack@eecs.umich.edu DPRINTF(RubyCache, "Looking up address: %s\n", address); 1325831Sgblack@eecs.umich.edu 13313229Sgabeblack@google.com idx = mapAddressToLocalIdx(address); 1345831Sgblack@eecs.umich.edu assert(idx < m_num_entries); 1355831Sgblack@eecs.umich.edu entry->changePermission(AccessPermission_Read_Only); 13613229Sgabeblack@google.com m_entries[idx] = entry; 1375831Sgblack@eecs.umich.edu 1385831Sgblack@eecs.umich.edu return entry; 1395831Sgblack@eecs.umich.edu} 1405898Sgblack@eecs.umich.edu 1415831Sgblack@eecs.umich.eduvoid 1425831Sgblack@eecs.umich.eduDirectoryMemory::print(ostream& out) const 1435831Sgblack@eecs.umich.edu{ 1445831Sgblack@eecs.umich.edu} 1455831Sgblack@eecs.umich.edu 1465831Sgblack@eecs.umich.eduvoid 1475831Sgblack@eecs.umich.eduDirectoryMemory::recordRequestType(DirectoryRequestType requestType) { 1485831Sgblack@eecs.umich.edu DPRINTF(RubyStats, "Recorded statistic: %s\n", 14913229Sgabeblack@google.com DirectoryRequestType_to_string(requestType)); 1505831Sgblack@eecs.umich.edu} 1515831Sgblack@eecs.umich.edu 1525831Sgblack@eecs.umich.eduDirectoryMemory * 1535831Sgblack@eecs.umich.eduRubyDirectoryMemoryParams::create() 15412653Sandreas.sandberg@arm.com{ 15512653Sandreas.sandberg@arm.com return new DirectoryMemory(this); 15612653Sandreas.sandberg@arm.com} 1575831Sgblack@eecs.umich.edu