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