DirectoryMemory.cc revision 11793
16145SN/A/* 26145SN/A * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 36145SN/A * All rights reserved. 46145SN/A * 56145SN/A * Redistribution and use in source and binary forms, with or without 66145SN/A * modification, are permitted provided that the following conditions are 76145SN/A * met: redistributions of source code must retain the above copyright 86145SN/A * notice, this list of conditions and the following disclaimer; 96145SN/A * redistributions in binary form must reproduce the above copyright 106145SN/A * notice, this list of conditions and the following disclaimer in the 116145SN/A * documentation and/or other materials provided with the distribution; 126145SN/A * neither the name of the copyright holders nor the names of its 136145SN/A * contributors may be used to endorse or promote products derived from 146145SN/A * this software without specific prior written permission. 156145SN/A * 166145SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176145SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186145SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196145SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206145SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216145SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226145SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236145SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246145SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256145SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266145SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276145SN/A */ 286145SN/A 2911793Sbrandon.potter@amd.com#include "mem/ruby/structures/DirectoryMemory.hh" 3011793Sbrandon.potter@amd.com 317056SN/A#include "base/intmath.hh" 328232SN/A#include "debug/RubyCache.hh" 339104SN/A#include "debug/RubyStats.hh" 347039SN/A#include "mem/ruby/slicc_interface/RubySlicc_Util.hh" 3511108Sdavid.hashe@amd.com#include "mem/ruby/system/RubySystem.hh" 366145SN/A 377055SN/Ausing namespace std; 387055SN/A 396285SN/Aint DirectoryMemory::m_num_directories = 0; 406285SN/Aint DirectoryMemory::m_num_directories_bits = 0; 417027SN/Aint DirectoryMemory::m_numa_high_bit = 0; 426285SN/A 436876SN/ADirectoryMemory::DirectoryMemory(const Params *p) 446876SN/A : SimObject(p) 456145SN/A{ 466876SN/A m_version = p->version; 476903SN/A m_size_bytes = p->size; 487056SN/A m_size_bits = floorLog2(m_size_bytes); 497025SN/A m_num_entries = 0; 507027SN/A m_numa_high_bit = p->numa_high_bit; 516285SN/A} 526285SN/A 537039SN/Avoid 547039SN/ADirectoryMemory::init() 556285SN/A{ 567039SN/A m_num_entries = m_size_bytes / RubySystem::getBlockSizeBytes(); 5710520Snilay@cs.wisc.edu m_entries = new AbstractEntry*[m_num_entries]; 5810520Snilay@cs.wisc.edu for (int i = 0; i < m_num_entries; i++) 5910520Snilay@cs.wisc.edu m_entries[i] = NULL; 606285SN/A 617039SN/A m_num_directories++; 6210004SN/A m_num_directories_bits = ceilLog2(m_num_directories); 637027SN/A 647039SN/A if (m_numa_high_bit == 0) { 657563SN/A m_numa_high_bit = RubySystem::getMemorySizeBits() - 1; 667039SN/A } 677039SN/A assert(m_numa_high_bit != 0); 686145SN/A} 696145SN/A 706145SN/ADirectoryMemory::~DirectoryMemory() 716145SN/A{ 727039SN/A // free up all the directory entries 7311025Snilay@cs.wisc.edu for (uint64_t i = 0; i < m_num_entries; i++) { 7410520Snilay@cs.wisc.edu if (m_entries[i] != NULL) { 7510520Snilay@cs.wisc.edu delete m_entries[i]; 767039SN/A } 777039SN/A } 7810520Snilay@cs.wisc.edu delete [] m_entries; 796285SN/A} 806145SN/A 8111025Snilay@cs.wisc.eduuint64_t 8211025Snilay@cs.wisc.eduDirectoryMemory::mapAddressToDirectoryVersion(Addr address) 836285SN/A{ 847039SN/A if (m_num_directories_bits == 0) 857039SN/A return 0; 867039SN/A 8711025Snilay@cs.wisc.edu uint64_t ret = bitSelect(address, 8811025Snilay@cs.wisc.edu m_numa_high_bit - m_num_directories_bits + 1, 8911025Snilay@cs.wisc.edu m_numa_high_bit); 907039SN/A return ret; 916145SN/A} 926145SN/A 937039SN/Abool 9411025Snilay@cs.wisc.eduDirectoryMemory::isPresent(Addr address) 956145SN/A{ 967039SN/A bool ret = (mapAddressToDirectoryVersion(address) == m_version); 977039SN/A return ret; 986145SN/A} 996145SN/A 10011025Snilay@cs.wisc.eduuint64_t 10111025Snilay@cs.wisc.eduDirectoryMemory::mapAddressToLocalIdx(Addr address) 1026161SN/A{ 10311025Snilay@cs.wisc.edu uint64_t ret; 1047563SN/A if (m_num_directories_bits > 0) { 10511025Snilay@cs.wisc.edu ret = bitRemove(address, m_numa_high_bit - m_num_directories_bits + 1, 10611025Snilay@cs.wisc.edu m_numa_high_bit); 1077563SN/A } else { 10811025Snilay@cs.wisc.edu ret = address; 1097563SN/A } 1107563SN/A 1117563SN/A return ret >> (RubySystem::getBlockSizeBits()); 1126161SN/A} 1136161SN/A 1148644SN/AAbstractEntry* 11511025Snilay@cs.wisc.eduDirectoryMemory::lookup(Addr address) 1166145SN/A{ 1177039SN/A assert(isPresent(address)); 11811118Snilay@cs.wisc.edu DPRINTF(RubyCache, "Looking up address: %#x\n", address); 1198644SN/A 12010520Snilay@cs.wisc.edu uint64_t idx = mapAddressToLocalIdx(address); 12110520Snilay@cs.wisc.edu assert(idx < m_num_entries); 12210520Snilay@cs.wisc.edu return m_entries[idx]; 1238644SN/A} 1248644SN/A 1258644SN/AAbstractEntry* 12611025Snilay@cs.wisc.eduDirectoryMemory::allocate(Addr address, AbstractEntry *entry) 1278644SN/A{ 1288644SN/A assert(isPresent(address)); 12911025Snilay@cs.wisc.edu uint64_t idx; 13011118Snilay@cs.wisc.edu DPRINTF(RubyCache, "Looking up address: %#x\n", address); 1317025SN/A 13210520Snilay@cs.wisc.edu idx = mapAddressToLocalIdx(address); 13310520Snilay@cs.wisc.edu assert(idx < m_num_entries); 13410520Snilay@cs.wisc.edu entry->changePermission(AccessPermission_Read_Only); 13510520Snilay@cs.wisc.edu m_entries[idx] = entry; 1366145SN/A 1378644SN/A return entry; 1386145SN/A} 1396145SN/A 1407039SN/Avoid 1417039SN/ADirectoryMemory::print(ostream& out) const 1427039SN/A{ 1437039SN/A} 1447039SN/A 1457039SN/Avoid 1469104SN/ADirectoryMemory::recordRequestType(DirectoryRequestType requestType) { 1479104SN/A DPRINTF(RubyStats, "Recorded statistic: %s\n", 1489104SN/A DirectoryRequestType_to_string(requestType)); 1499104SN/A} 1509104SN/A 1516876SN/ADirectoryMemory * 1526876SN/ARubyDirectoryMemoryParams::create() 1536876SN/A{ 1546876SN/A return new DirectoryMemory(this); 1556876SN/A} 156