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