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:
parent
967cfa939a
commit
c4ffd4989c
3 changed files with 20 additions and 0 deletions
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue