113224Sodanrc@yahoo.com.br/** 213224Sodanrc@yahoo.com.br * Copyright (c) 2018 Inria 313224Sodanrc@yahoo.com.br * All rights reserved. 413224Sodanrc@yahoo.com.br * 513224Sodanrc@yahoo.com.br * Redistribution and use in source and binary forms, with or without 613224Sodanrc@yahoo.com.br * modification, are permitted provided that the following conditions are 713224Sodanrc@yahoo.com.br * met: redistributions of source code must retain the above copyright 813224Sodanrc@yahoo.com.br * notice, this list of conditions and the following disclaimer; 913224Sodanrc@yahoo.com.br * redistributions in binary form must reproduce the above copyright 1013224Sodanrc@yahoo.com.br * notice, this list of conditions and the following disclaimer in the 1113224Sodanrc@yahoo.com.br * documentation and/or other materials provided with the distribution; 1213224Sodanrc@yahoo.com.br * neither the name of the copyright holders nor the names of its 1313224Sodanrc@yahoo.com.br * contributors may be used to endorse or promote products derived from 1413224Sodanrc@yahoo.com.br * this software without specific prior written permission. 1513224Sodanrc@yahoo.com.br * 1613224Sodanrc@yahoo.com.br * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1713224Sodanrc@yahoo.com.br * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1813224Sodanrc@yahoo.com.br * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1913224Sodanrc@yahoo.com.br * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2013224Sodanrc@yahoo.com.br * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2113224Sodanrc@yahoo.com.br * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2213224Sodanrc@yahoo.com.br * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2313224Sodanrc@yahoo.com.br * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2413224Sodanrc@yahoo.com.br * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2513224Sodanrc@yahoo.com.br * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2613224Sodanrc@yahoo.com.br * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2713224Sodanrc@yahoo.com.br * 2813224Sodanrc@yahoo.com.br * Authors: Daniel Carvalho 2913224Sodanrc@yahoo.com.br */ 3013224Sodanrc@yahoo.com.br 3113224Sodanrc@yahoo.com.br/** @file 3213224Sodanrc@yahoo.com.br * Implementation of a simple sector block class. Each sector consists of a 3313224Sodanrc@yahoo.com.br * sequence of cache blocks that may or may not be present in the cache. 3413224Sodanrc@yahoo.com.br */ 3513224Sodanrc@yahoo.com.br 3613224Sodanrc@yahoo.com.br#include "mem/cache/tags/sector_blk.hh" 3713224Sodanrc@yahoo.com.br 3813224Sodanrc@yahoo.com.br#include <cassert> 3913224Sodanrc@yahoo.com.br 4013224Sodanrc@yahoo.com.br#include "base/cprintf.hh" 4113224Sodanrc@yahoo.com.br#include "base/logging.hh" 4213224Sodanrc@yahoo.com.br 4313224Sodanrc@yahoo.com.brvoid 4413224Sodanrc@yahoo.com.brSectorSubBlk::setSectorBlock(SectorBlk* sector_blk) 4513224Sodanrc@yahoo.com.br{ 4613224Sodanrc@yahoo.com.br assert(sector_blk != nullptr); 4713224Sodanrc@yahoo.com.br _sectorBlk = sector_blk; 4813224Sodanrc@yahoo.com.br} 4913224Sodanrc@yahoo.com.br 5013224Sodanrc@yahoo.com.brconst SectorBlk* 5113224Sodanrc@yahoo.com.brSectorSubBlk::getSectorBlock() const 5213224Sodanrc@yahoo.com.br{ 5313224Sodanrc@yahoo.com.br return _sectorBlk; 5413224Sodanrc@yahoo.com.br} 5513224Sodanrc@yahoo.com.br 5613224Sodanrc@yahoo.com.brvoid 5713224Sodanrc@yahoo.com.brSectorSubBlk::setSectorOffset(const int sector_offset) 5813224Sodanrc@yahoo.com.br{ 5913224Sodanrc@yahoo.com.br _sectorOffset = sector_offset; 6013224Sodanrc@yahoo.com.br} 6113224Sodanrc@yahoo.com.br 6213224Sodanrc@yahoo.com.brint 6313224Sodanrc@yahoo.com.brSectorSubBlk::getSectorOffset() const 6413224Sodanrc@yahoo.com.br{ 6513224Sodanrc@yahoo.com.br return _sectorOffset; 6613224Sodanrc@yahoo.com.br} 6713224Sodanrc@yahoo.com.br 6813224Sodanrc@yahoo.com.brAddr 6913224Sodanrc@yahoo.com.brSectorSubBlk::getTag() const 7013224Sodanrc@yahoo.com.br{ 7113224Sodanrc@yahoo.com.br return _sectorBlk->getTag(); 7213224Sodanrc@yahoo.com.br} 7313224Sodanrc@yahoo.com.br 7413224Sodanrc@yahoo.com.brvoid 7513473Sodanrc@yahoo.com.brSectorSubBlk::setValid() 7613473Sodanrc@yahoo.com.br{ 7713473Sodanrc@yahoo.com.br CacheBlk::setValid(); 7813473Sodanrc@yahoo.com.br _sectorBlk->validateSubBlk(); 7913473Sodanrc@yahoo.com.br} 8013473Sodanrc@yahoo.com.br 8113473Sodanrc@yahoo.com.brvoid 8213473Sodanrc@yahoo.com.brSectorSubBlk::setSecure() 8313473Sodanrc@yahoo.com.br{ 8413473Sodanrc@yahoo.com.br CacheBlk::setSecure(); 8513473Sodanrc@yahoo.com.br _sectorBlk->setSecure(); 8613473Sodanrc@yahoo.com.br} 8713473Sodanrc@yahoo.com.br 8813473Sodanrc@yahoo.com.brvoid 8913473Sodanrc@yahoo.com.brSectorSubBlk::invalidate() 9013473Sodanrc@yahoo.com.br{ 9113473Sodanrc@yahoo.com.br CacheBlk::invalidate(); 9213473Sodanrc@yahoo.com.br _sectorBlk->invalidateSubBlk(); 9313473Sodanrc@yahoo.com.br} 9413473Sodanrc@yahoo.com.br 9513473Sodanrc@yahoo.com.brvoid 9613224Sodanrc@yahoo.com.brSectorSubBlk::insert(const Addr tag, const bool is_secure, 9713224Sodanrc@yahoo.com.br const int src_master_ID, const uint32_t task_ID) 9813224Sodanrc@yahoo.com.br{ 9913224Sodanrc@yahoo.com.br // Make sure it is not overwriting another sector 10013224Sodanrc@yahoo.com.br panic_if((_sectorBlk && _sectorBlk->isValid()) && 10113224Sodanrc@yahoo.com.br ((_sectorBlk->getTag() != tag) || 10213224Sodanrc@yahoo.com.br (_sectorBlk->isSecure() != is_secure)), 10313224Sodanrc@yahoo.com.br "Overwriting valid sector!"); 10413224Sodanrc@yahoo.com.br 10513224Sodanrc@yahoo.com.br CacheBlk::insert(tag, is_secure, src_master_ID, task_ID); 10613224Sodanrc@yahoo.com.br 10713224Sodanrc@yahoo.com.br // Set sector tag 10813224Sodanrc@yahoo.com.br _sectorBlk->setTag(tag); 10913224Sodanrc@yahoo.com.br} 11013224Sodanrc@yahoo.com.br 11113224Sodanrc@yahoo.com.brstd::string 11213224Sodanrc@yahoo.com.brSectorSubBlk::print() const 11313224Sodanrc@yahoo.com.br{ 11413224Sodanrc@yahoo.com.br return csprintf("%s sector offset: %#x", CacheBlk::print(), 11513224Sodanrc@yahoo.com.br getSectorOffset()); 11613224Sodanrc@yahoo.com.br} 11713224Sodanrc@yahoo.com.br 11813473Sodanrc@yahoo.com.brSectorBlk::SectorBlk() 11913473Sodanrc@yahoo.com.br : ReplaceableEntry(), _tag(MaxAddr), _validCounter(0), _secureBit(false) 12013473Sodanrc@yahoo.com.br{ 12113473Sodanrc@yahoo.com.br} 12213473Sodanrc@yahoo.com.br 12313224Sodanrc@yahoo.com.brbool 12413224Sodanrc@yahoo.com.brSectorBlk::isValid() const 12513224Sodanrc@yahoo.com.br{ 12613224Sodanrc@yahoo.com.br // If any of the blocks in the sector is valid, so is the sector 12713473Sodanrc@yahoo.com.br return _validCounter > 0; 12813224Sodanrc@yahoo.com.br} 12913224Sodanrc@yahoo.com.br 13013224Sodanrc@yahoo.com.brbool 13113224Sodanrc@yahoo.com.brSectorBlk::isSecure() const 13213224Sodanrc@yahoo.com.br{ 13313224Sodanrc@yahoo.com.br // If any of the valid blocks in the sector is secure, so is the sector 13413473Sodanrc@yahoo.com.br return _secureBit; 13513224Sodanrc@yahoo.com.br} 13613224Sodanrc@yahoo.com.br 13713224Sodanrc@yahoo.com.brvoid 13813224Sodanrc@yahoo.com.brSectorBlk::setTag(const Addr tag) 13913224Sodanrc@yahoo.com.br{ 14013224Sodanrc@yahoo.com.br _tag = tag; 14113224Sodanrc@yahoo.com.br} 14213224Sodanrc@yahoo.com.br 14313224Sodanrc@yahoo.com.brAddr 14413224Sodanrc@yahoo.com.brSectorBlk::getTag() const 14513224Sodanrc@yahoo.com.br{ 14613224Sodanrc@yahoo.com.br return _tag; 14713224Sodanrc@yahoo.com.br} 14813473Sodanrc@yahoo.com.br 14913473Sodanrc@yahoo.com.brvoid 15013473Sodanrc@yahoo.com.brSectorBlk::validateSubBlk() 15113473Sodanrc@yahoo.com.br{ 15213473Sodanrc@yahoo.com.br _validCounter++; 15313473Sodanrc@yahoo.com.br} 15413473Sodanrc@yahoo.com.br 15513473Sodanrc@yahoo.com.brvoid 15613473Sodanrc@yahoo.com.brSectorBlk::invalidateSubBlk() 15713473Sodanrc@yahoo.com.br{ 15813473Sodanrc@yahoo.com.br // If all sub-blocks have been invalidated, the sector becomes invalid, 15913473Sodanrc@yahoo.com.br // so clear secure bit 16013473Sodanrc@yahoo.com.br if (--_validCounter == 0) { 16113473Sodanrc@yahoo.com.br _secureBit = false; 16213473Sodanrc@yahoo.com.br } 16313473Sodanrc@yahoo.com.br} 16413473Sodanrc@yahoo.com.br 16513473Sodanrc@yahoo.com.brvoid 16613473Sodanrc@yahoo.com.brSectorBlk::setSecure() 16713473Sodanrc@yahoo.com.br{ 16813473Sodanrc@yahoo.com.br _secureBit = true; 16913473Sodanrc@yahoo.com.br} 17014117Sodanrc@yahoo.com.br 17114117Sodanrc@yahoo.com.brvoid 17214117Sodanrc@yahoo.com.brSectorBlk::setPosition(const uint32_t set, const uint32_t way) 17314117Sodanrc@yahoo.com.br{ 17414117Sodanrc@yahoo.com.br ReplaceableEntry::setPosition(set, way); 17514117Sodanrc@yahoo.com.br for (auto& blk : blks) { 17614117Sodanrc@yahoo.com.br blk->setPosition(set, way); 17714117Sodanrc@yahoo.com.br } 17814117Sodanrc@yahoo.com.br} 179