/** * Copyright (c) 2018 Inria * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer; * redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution; * neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Authors: Daniel Carvalho */ /** @file * Definition of a simple sector block class. Each sector consists of a * sequence of cache blocks that may or may not be present in the cache. */ #ifndef __MEM_CACHE_TAGS_SECTOR_BLK_HH__ #define __MEM_CACHE_TAGS_SECTOR_BLK_HH__ #include #include "mem/cache/cache_blk.hh" #include "mem/cache/replacement_policies/replaceable_entry.hh" class SectorBlk; /** * A sector is composed of sub-blocks, and each sub-block has information * regarding its sector and a pointer to its sector tag. */ class SectorSubBlk : public CacheBlk { private: /** * Sector block associated to this block. */ SectorBlk* _sectorBlk; /** * The offset of this sub-block in the sector. */ int _sectorOffset; public: SectorSubBlk() : CacheBlk(), _sectorBlk(nullptr), _sectorOffset(0) {} SectorSubBlk(const SectorSubBlk&) = delete; SectorSubBlk& operator=(const SectorSubBlk&) = delete; ~SectorSubBlk() {}; /** * Set sector block associated to this block. * * @param sector_blk The sector block pointer. */ void setSectorBlock(SectorBlk* sector_blk); /** * Get sector block associated to this block. * * @return The sector block pointer. */ const SectorBlk* getSectorBlock() const; /** * Set offset of this sub-block within the sector. * * @param sector_offset The block's offset. */ void setSectorOffset(const int sector_offset); /** * Get offset of this sub-block within the sector. * * @return sector_offset The block's offset. */ int getSectorOffset() const; /** * Get tag associated to this block. * * @return The tag value. */ Addr getTag() const; /** * Set valid bit and inform sector block. */ void setValid() override; /** * Set secure bit and inform sector block. */ void setSecure() override; /** * Invalidate the block and inform sector block. */ void invalidate() override; /** * Set member variables when a block insertion occurs. Resets reference * count to 1 (the insertion counts as a reference), and touch block if * it hadn't been touched previously. Sets the insertion tick to the * current tick. Marks the block valid. * * @param tag Block address tag. * @param is_secure Whether the block is in secure space or not. * @param src_master_ID The source requestor ID. * @param task_ID The new task ID. */ void insert(const Addr tag, const bool is_secure, const int src_master_ID, const uint32_t task_ID) override; /** * Pretty-print sector offset and other CacheBlk information. * * @return string with basic state information */ std::string print() const override; }; /** * A Basic Sector block. * Contains the tag and a list of blocks associated to this sector. */ class SectorBlk : public ReplaceableEntry { private: /** * Sector tag value. A sector's tag is the tag of all its sub-blocks. */ Addr _tag; /** * Counter of the number of valid sub-blocks. The sector is valid if any * of its sub-blocks is valid. */ uint8_t _validCounter; /** * Whether sector blk is in secure-space or not. */ bool _secureBit; public: SectorBlk(); SectorBlk(const SectorBlk&) = delete; SectorBlk& operator=(const SectorBlk&) = delete; ~SectorBlk() {}; /** List of blocks associated to this sector. */ std::vector blks; /** * Checks that a sector block is valid. * * @return True if any of the blocks in the sector is valid. */ bool isValid() const; /** * Checks that a sector block is secure. A single secure block suffices * to imply that the whole sector is secure, as the insertion proccess * asserts that different secure spaces can't coexist in the same sector. * * @return True if any of the blocks in the sector is secure. */ bool isSecure() const; /** * Set tag associated to this block. * * @param The tag value. */ void setTag(const Addr tag); /** * Get tag associated to this block. * * @return The tag value. */ Addr getTag() const; /** * Increase the number of valid sub-blocks. */ void validateSubBlk(); /** * Decrease the number of valid sub-blocks. */ void invalidateSubBlk(); /** * Set secure bit. */ void setSecure(); }; #endif //__MEM_CACHE_TAGS_SECTOR_BLK_HH__