ruby: expose access permission to replacement policies

This patch adds support that allows the replacement policy to identify each
cache block's access permission.  This information can be useful when making
replacement decisions.
This commit is contained in:
David Hashe 2015-07-20 09:15:18 -05:00
parent 967cfa939a
commit c4ffd4989c
3 changed files with 20 additions and 0 deletions

View file

@ -34,6 +34,8 @@
#include "params/ReplacementPolicy.hh"
#include "sim/sim_object.hh"
class CacheMemory;
class AbstractReplacementPolicy : public SimObject
{
public:
@ -52,6 +54,9 @@ class AbstractReplacementPolicy : public SimObject
virtual bool useOccupancy() const { return false; }
void setCache(CacheMemory * pCache) {m_cache = pCache;}
CacheMemory * m_cache;
protected:
unsigned m_num_sets; /** total number of sets */
unsigned m_assoc; /** set associativity */

View file

@ -63,6 +63,7 @@ CacheMemory::CacheMemory(const Params *p)
m_latency = p->latency;
m_cache_assoc = p->assoc;
m_replacementPolicy_ptr = p->replacement_policy;
m_replacementPolicy_ptr->setCache(this);
m_start_index_bit = p->start_index_bit;
m_is_instruction_only_cache = p->is_icache;
m_resource_stalls = p->resourceStalls;
@ -592,3 +593,15 @@ CacheMemory::checkResourceAvailable(CacheResourceType res, Address addr)
return true;
}
}
bool
CacheMemory::isBlockInvalid(int64 cache_set, int64 loc)
{
return (m_cache[cache_set][loc]->m_Permission == AccessPermission_Invalid);
}
bool
CacheMemory::isBlockNotBusy(int64 cache_set, int64 loc)
{
return (m_cache[cache_set][loc]->m_Permission != AccessPermission_Busy);
}

View file

@ -100,6 +100,8 @@ class CacheMemory : public SimObject
Cycles getTagLatency() const { return tagArray.getLatency(); }
Cycles getDataLatency() const { return dataArray.getLatency(); }
bool isBlockInvalid(int64 cache_set, int64 loc);
bool isBlockNotBusy(int64 cache_set, int64 loc);
// Hook for checkpointing the contents of the cache
void recordCacheContents(int cntrl, CacheRecorder* tr) const;