return _sectorBlk->getTag();
}
+void
+SectorSubBlk::setValid()
+{
+ CacheBlk::setValid();
+ _sectorBlk->validateSubBlk();
+}
+
+void
+SectorSubBlk::setSecure()
+{
+ CacheBlk::setSecure();
+ _sectorBlk->setSecure();
+}
+
+void
+SectorSubBlk::invalidate()
+{
+ CacheBlk::invalidate();
+ _sectorBlk->invalidateSubBlk();
+}
+
void
SectorSubBlk::insert(const Addr tag, const bool is_secure,
const int src_master_ID, const uint32_t task_ID)
getSectorOffset());
}
+SectorBlk::SectorBlk()
+ : ReplaceableEntry(), _tag(MaxAddr), _validCounter(0), _secureBit(false)
+{
+}
+
bool
SectorBlk::isValid() const
{
// If any of the blocks in the sector is valid, so is the sector
- for (const auto& blk : blks) {
- if (blk->isValid()) {
- return true;
- }
- }
- return false;
+ return _validCounter > 0;
}
bool
SectorBlk::isSecure() const
{
// If any of the valid blocks in the sector is secure, so is the sector
- for (const auto& blk : blks) {
- if (blk->isValid()) {
- return blk->isSecure();
- }
- }
- return false;
+ return _secureBit;
}
void
{
return _tag;
}
+
+void
+SectorBlk::validateSubBlk()
+{
+ _validCounter++;
+}
+
+void
+SectorBlk::invalidateSubBlk()
+{
+ // If all sub-blocks have been invalidated, the sector becomes invalid,
+ // so clear secure bit
+ if (--_validCounter == 0) {
+ _secureBit = false;
+ }
+}
+
+void
+SectorBlk::setSecure()
+{
+ _secureBit = true;
+}
*/
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
*/
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() : ReplaceableEntry(), _tag(MaxAddr) {}
+ SectorBlk();
SectorBlk(const SectorBlk&) = delete;
SectorBlk& operator=(const SectorBlk&) = delete;
~SectorBlk() {};
* @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__