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