CheckTable.cc revision 9108
15086Sgblack@eecs.umich.edu/*
25086Sgblack@eecs.umich.edu * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
38466Snilay@cs.wisc.edu * Copyright (c) 2009 Advanced Micro Devices, Inc.
45086Sgblack@eecs.umich.edu * All rights reserved.
55086Sgblack@eecs.umich.edu *
67087Snate@binkert.org * Redistribution and use in source and binary forms, with or without
77087Snate@binkert.org * modification, are permitted provided that the following conditions are
87087Snate@binkert.org * met: redistributions of source code must retain the above copyright
97087Snate@binkert.org * notice, this list of conditions and the following disclaimer;
107087Snate@binkert.org * redistributions in binary form must reproduce the above copyright
117087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the
127087Snate@binkert.org * documentation and/or other materials provided with the distribution;
137087Snate@binkert.org * neither the name of the copyright holders nor the names of its
145086Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
157087Snate@binkert.org * this software without specific prior written permission.
167087Snate@binkert.org *
177087Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
187087Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
197087Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
207087Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
217087Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
227087Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
235086Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
247087Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
255086Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
265086Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
275086Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
285086Sgblack@eecs.umich.edu */
295086Sgblack@eecs.umich.edu
305086Sgblack@eecs.umich.edu#include "base/intmath.hh"
315086Sgblack@eecs.umich.edu#include "cpu/testers/rubytest/Check.hh"
325086Sgblack@eecs.umich.edu#include "cpu/testers/rubytest/CheckTable.hh"
335086Sgblack@eecs.umich.edu#include "debug/RubyTest.hh"
345086Sgblack@eecs.umich.edu
355086Sgblack@eecs.umich.eduCheckTable::CheckTable(int _num_writers, int _num_readers, RubyTester* _tester)
365086Sgblack@eecs.umich.edu    : m_num_writers(_num_writers), m_num_readers(_num_readers),
375086Sgblack@eecs.umich.edu      m_tester_ptr(_tester)
385086Sgblack@eecs.umich.edu{
395086Sgblack@eecs.umich.edu    physical_address_t physical = 0;
405086Sgblack@eecs.umich.edu    Address address;
4111793Sbrandon.potter@amd.com
4211793Sbrandon.potter@amd.com    const int size1 = 32;
435647Sgblack@eecs.umich.edu    const int size2 = 100;
448466Snilay@cs.wisc.edu
455135Sgblack@eecs.umich.edu    // The first set is to get some false sharing
465647Sgblack@eecs.umich.edu    physical = 1000;
479889Sandreas@sandberg.pp.se    for (int i = 0; i < size1; i++) {
4811800Sbrandon.potter@amd.com        // Setup linear addresses
495086Sgblack@eecs.umich.edu        address.setAddress(physical);
505086Sgblack@eecs.umich.edu        addCheck(address);
515086Sgblack@eecs.umich.edu        physical += CHECK_SIZE;
527707Sgblack@eecs.umich.edu    }
537707Sgblack@eecs.umich.edu
547707Sgblack@eecs.umich.edu    // The next two sets are to get some limited false sharing and
5510553Salexandru.dutu@amd.com    // cache conflicts
569887Sandreas@sandberg.pp.se    physical = 1000;
579887Sandreas@sandberg.pp.se    for (int i = 0; i < size2; i++) {
589887Sandreas@sandberg.pp.se        // Setup linear addresses
599887Sandreas@sandberg.pp.se        address.setAddress(physical);
609887Sandreas@sandberg.pp.se        addCheck(address);
619887Sandreas@sandberg.pp.se        physical += 256;
629887Sandreas@sandberg.pp.se    }
639887Sandreas@sandberg.pp.se
649887Sandreas@sandberg.pp.se    physical = 1000 + CHECK_SIZE;
659887Sandreas@sandberg.pp.se    for (int i = 0; i < size2; i++) {
669887Sandreas@sandberg.pp.se        // Setup linear addresses
679887Sandreas@sandberg.pp.se        address.setAddress(physical);
689887Sandreas@sandberg.pp.se        addCheck(address);
699887Sandreas@sandberg.pp.se        physical += 256;
709887Sandreas@sandberg.pp.se    }
719887Sandreas@sandberg.pp.se}
725086Sgblack@eecs.umich.edu
735135Sgblack@eecs.umich.eduCheckTable::~CheckTable()
745135Sgblack@eecs.umich.edu{
755135Sgblack@eecs.umich.edu    int size = m_check_vector.size();
766048Sgblack@eecs.umich.edu    for (int i = 0; i < size; i++)
776048Sgblack@eecs.umich.edu        delete m_check_vector[i];
786048Sgblack@eecs.umich.edu}
796048Sgblack@eecs.umich.edu
806048Sgblack@eecs.umich.eduvoid
816048Sgblack@eecs.umich.eduCheckTable::addCheck(const Address& address)
827720Sgblack@eecs.umich.edu{
837720Sgblack@eecs.umich.edu    if (floorLog2(CHECK_SIZE) != 0) {
847720Sgblack@eecs.umich.edu        if (address.bitSelect(0, CHECK_SIZE_BITS - 1) != 0) {
857720Sgblack@eecs.umich.edu            panic("Check not aligned");
865135Sgblack@eecs.umich.edu        }
875135Sgblack@eecs.umich.edu    }
885135Sgblack@eecs.umich.edu
895135Sgblack@eecs.umich.edu    for (int i = 0; i < CHECK_SIZE; i++) {
905135Sgblack@eecs.umich.edu        if (m_lookup_map.count(Address(address.getAddress()+i))) {
915135Sgblack@eecs.umich.edu            // A mapping for this byte already existed, discard the
925135Sgblack@eecs.umich.edu            // entire check
935135Sgblack@eecs.umich.edu            return;
945135Sgblack@eecs.umich.edu        }
955135Sgblack@eecs.umich.edu    }
965135Sgblack@eecs.umich.edu
975135Sgblack@eecs.umich.edu    Check* check_ptr = new Check(address, Address(100 + m_check_vector.size()),
985135Sgblack@eecs.umich.edu                                 m_num_writers, m_num_readers, m_tester_ptr);
995135Sgblack@eecs.umich.edu    for (int i = 0; i < CHECK_SIZE; i++) {
1005135Sgblack@eecs.umich.edu        // Insert it once per byte
1015135Sgblack@eecs.umich.edu        m_lookup_map[Address(address.getAddress() + i)] = check_ptr;
1025135Sgblack@eecs.umich.edu    }
1035264Sgblack@eecs.umich.edu    m_check_vector.push_back(check_ptr);
1045135Sgblack@eecs.umich.edu}
1055135Sgblack@eecs.umich.edu
1065135Sgblack@eecs.umich.eduCheck*
1075135Sgblack@eecs.umich.eduCheckTable::getRandomCheck()
1085141Sgblack@eecs.umich.edu{
1095141Sgblack@eecs.umich.edu    assert(m_check_vector.size() > 0);
1105141Sgblack@eecs.umich.edu    return m_check_vector[random() % m_check_vector.size()];
1115141Sgblack@eecs.umich.edu}
1125141Sgblack@eecs.umich.edu
1135141Sgblack@eecs.umich.eduCheck*
1145141Sgblack@eecs.umich.eduCheckTable::getCheck(const Address& address)
1155141Sgblack@eecs.umich.edu{
1165141Sgblack@eecs.umich.edu    DPRINTF(RubyTest, "Looking for check by address: %s", address);
1175182Sgblack@eecs.umich.edu
1185141Sgblack@eecs.umich.edu    m5::hash_map<Address, Check*>::iterator i = m_lookup_map.find(address);
1195141Sgblack@eecs.umich.edu
1205141Sgblack@eecs.umich.edu    if (i == m_lookup_map.end())
1215141Sgblack@eecs.umich.edu        return NULL;
1225141Sgblack@eecs.umich.edu
1235141Sgblack@eecs.umich.edu    Check* check = i->second;
1245135Sgblack@eecs.umich.edu    assert(check != NULL);
1255141Sgblack@eecs.umich.edu    return check;
1265141Sgblack@eecs.umich.edu}
1275141Sgblack@eecs.umich.edu
1285141Sgblack@eecs.umich.eduvoid
1295141Sgblack@eecs.umich.eduCheckTable::print(std::ostream& out) const
1305141Sgblack@eecs.umich.edu{
1315141Sgblack@eecs.umich.edu}
1325141Sgblack@eecs.umich.edu