CheckTable.cc revision 6899
19157Sandreas.hansson@arm.com 211524Sdavid.guillen@arm.com/* 310000Sclt67@cornell.edu * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 49157Sandreas.hansson@arm.com * Copyright (c) 2009 Advanced Micro Devices, Inc. 59157Sandreas.hansson@arm.com * All rights reserved. 69157Sandreas.hansson@arm.com * 79157Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 89157Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 99157Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 109157Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 119157Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 129157Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 139157Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 149157Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 159157Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 169157Sandreas.hansson@arm.com * this software without specific prior written permission. 179157Sandreas.hansson@arm.com * 189157Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 199157Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 209157Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 219157Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 229157Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 239157Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 249157Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 259157Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 269157Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 279157Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 289157Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 299157Sandreas.hansson@arm.com */ 309157Sandreas.hansson@arm.com 319157Sandreas.hansson@arm.com 329157Sandreas.hansson@arm.com#include "cpu/rubytest/CheckTable.hh" 339157Sandreas.hansson@arm.com#include "cpu/rubytest/CheckTable.hh" 349157Sandreas.hansson@arm.com#include "cpu/rubytest/Check.hh" 359157Sandreas.hansson@arm.com#include "mem/gems_common/Map.hh" 369157Sandreas.hansson@arm.com 379157Sandreas.hansson@arm.comCheckTable::CheckTable(int _num_cpu_sequencers, RubyTester* _tester) 389157Sandreas.hansson@arm.com : m_num_cpu_sequencers(_num_cpu_sequencers), m_tester_ptr(_tester) 3910000Sclt67@cornell.edu{ 4011524Sdavid.guillen@arm.com m_lookup_map_ptr = new Map<Address, Check*>; 4111524Sdavid.guillen@arm.com physical_address_t physical = 0; 429157Sandreas.hansson@arm.com Address address; 439157Sandreas.hansson@arm.com 449157Sandreas.hansson@arm.com const int size1 = 32; 459157Sandreas.hansson@arm.com const int size2 = 100; 469157Sandreas.hansson@arm.com 479157Sandreas.hansson@arm.com // The first set is to get some false sharing 489157Sandreas.hansson@arm.com physical = 1000; 499157Sandreas.hansson@arm.com for (int i=0; i<size1; i++) { 509157Sandreas.hansson@arm.com // Setup linear addresses 519157Sandreas.hansson@arm.com address.setAddress(physical); 5211524Sdavid.guillen@arm.com addCheck(address); 539157Sandreas.hansson@arm.com physical += CHECK_SIZE; 5411524Sdavid.guillen@arm.com } 559157Sandreas.hansson@arm.com 569356Snilay@cs.wisc.edu // The next two sets are to get some limited false sharing and cache conflicts 579793Sakash.bagdia@arm.com physical = 1000; 589157Sandreas.hansson@arm.com for (int i=0; i<size2; i++) { 599157Sandreas.hansson@arm.com // Setup linear addresses 609157Sandreas.hansson@arm.com address.setAddress(physical); 6111009Sandreas.sandberg@arm.com addCheck(address); 6211009Sandreas.sandberg@arm.com physical += 256; 6311009Sandreas.sandberg@arm.com } 649157Sandreas.hansson@arm.com 6511009Sandreas.sandberg@arm.com physical = 1000 + CHECK_SIZE; 669157Sandreas.hansson@arm.com for (int i=0; i<size2; i++) { 679157Sandreas.hansson@arm.com // Setup linear addresses 689157Sandreas.hansson@arm.com address.setAddress(physical); 699179Sandreas.hansson@arm.com addCheck(address); 709179Sandreas.hansson@arm.com physical += 256; 719179Sandreas.hansson@arm.com } 729179Sandreas.hansson@arm.com} 739179Sandreas.hansson@arm.com 749179Sandreas.hansson@arm.comCheckTable::~CheckTable() 759180Sandreas.hansson@arm.com{ 769179Sandreas.hansson@arm.com int size = m_check_vector.size(); 779157Sandreas.hansson@arm.com for (int i=0; i<size; i++) { 7810236Sjthestness@gmail.com delete m_check_vector[i]; 7910236Sjthestness@gmail.com } 809179Sandreas.hansson@arm.com delete m_lookup_map_ptr; 8114162Sgabeblack@google.com} 8214162Sgabeblack@google.com 839179Sandreas.hansson@arm.comvoid CheckTable::addCheck(const Address& address) 849179Sandreas.hansson@arm.com{ 859179Sandreas.hansson@arm.com if (log_int(CHECK_SIZE) != 0) { 869179Sandreas.hansson@arm.com if (address.bitSelect(0,CHECK_SIZE_BITS-1) != 0) { 879179Sandreas.hansson@arm.com ERROR_MSG("Check not aligned"); 889179Sandreas.hansson@arm.com } 899179Sandreas.hansson@arm.com } 909179Sandreas.hansson@arm.com 919179Sandreas.hansson@arm.com for (int i=0; i<CHECK_SIZE; i++) { 929793Sakash.bagdia@arm.com if (m_lookup_map_ptr->exist(Address(address.getAddress()+i))) { 939179Sandreas.hansson@arm.com // A mapping for this byte already existed, discard the entire check 949179Sandreas.hansson@arm.com return; 959179Sandreas.hansson@arm.com } 969179Sandreas.hansson@arm.com } 979179Sandreas.hansson@arm.com 989179Sandreas.hansson@arm.com Check* check_ptr = new Check(address, 999179Sandreas.hansson@arm.com Address(100+m_check_vector.size()), 1009179Sandreas.hansson@arm.com m_num_cpu_sequencers, 1019179Sandreas.hansson@arm.com m_tester_ptr); 1029793Sakash.bagdia@arm.com for (int i=0; i<CHECK_SIZE; i++) { 1039179Sandreas.hansson@arm.com // Insert it once per byte 1049793Sakash.bagdia@arm.com m_lookup_map_ptr->add(Address(address.getAddress()+i), check_ptr); 1059179Sandreas.hansson@arm.com } 1069179Sandreas.hansson@arm.com m_check_vector.insertAtBottom(check_ptr); 1079793Sakash.bagdia@arm.com} 1089793Sakash.bagdia@arm.com 1099793Sakash.bagdia@arm.comCheck* CheckTable::getRandomCheck() 1109793Sakash.bagdia@arm.com{ 1119157Sandreas.hansson@arm.com return m_check_vector[random() % m_check_vector.size()]; 1129545Sandreas.hansson@arm.com} 1139545Sandreas.hansson@arm.com 1149157Sandreas.hansson@arm.comCheck* CheckTable::getCheck(const Address& address) 1159793Sakash.bagdia@arm.com{ 1169157Sandreas.hansson@arm.com DEBUG_MSG(TESTER_COMP, MedPrio, "Looking for check by address"); 1179157Sandreas.hansson@arm.com DEBUG_EXPR(TESTER_COMP, MedPrio, address); 11811009Sandreas.sandberg@arm.com 11911009Sandreas.sandberg@arm.com if (m_lookup_map_ptr->exist(address)) { 1209418Sandreas.hansson@arm.com Check* check = m_lookup_map_ptr->lookup(address); 12110000Sclt67@cornell.edu assert(check != NULL); 12210000Sclt67@cornell.edu return check; 12310000Sclt67@cornell.edu } else { 1249418Sandreas.hansson@arm.com return NULL; 1259157Sandreas.hansson@arm.com } 12611009Sandreas.sandberg@arm.com} 12711009Sandreas.sandberg@arm.com 12811009Sandreas.sandberg@arm.comvoid CheckTable::print(ostream& out) const 1299157Sandreas.hansson@arm.com{ 1309157Sandreas.hansson@arm.com} 1319157Sandreas.hansson@arm.com