ruby: cleaned up access permission enum
authorBrad Beckmann <Brad.Beckmann@amd.com>
Thu, 24 Feb 2011 00:41:58 +0000 (16:41 -0800)
committerBrad Beckmann <Brad.Beckmann@amd.com>
Thu, 24 Feb 2011 00:41:58 +0000 (16:41 -0800)
src/mem/protocol/MESI_CMP_directory-L2cache.sm
src/mem/protocol/RubySlicc_Exports.sm
src/mem/ruby/slicc_interface/AbstractCacheEntry.cc
src/mem/ruby/system/PerfectCacheMemory.hh

index c037527de39e707c7b6298d539776097a386a441..aeaf3d60deb17628ba580084d173ff273c46358c 100644 (file)
@@ -219,7 +219,7 @@ machine(L2Cache, "MESI Directory L2 Cache CMP")
       } else if (state == State:M) {
         cache_entry.changePermission(AccessPermission:Read_Write);
       } else if (state == State:MT) {
-        cache_entry.changePermission(AccessPermission:Stale);
+        cache_entry.changePermission(AccessPermission:Invalid);
       } else {
         cache_entry.changePermission(AccessPermission:Busy);
       }
index 2799be55dea456399906402294be696cd3be707f..c02af62ef8810b04c06477bc51136f2f42a02214 100644 (file)
@@ -47,14 +47,20 @@ external_type(DataBlock, desc="..."){
 // Declarations of external types that are common to all protocols
 
 // AccessPermission
+// The following five states define the access permission of all memory blocks.
+// These permissions have multiple uses.  They coordinate locking and 
+// synchronization primitives, as well as enable functional accesses.
+// One should not need to add any additional permission values and it is very
+// risky to do so.
 enumeration(AccessPermission, desc="...", default="AccessPermission_NotPresent") {
-  Busy,       desc="No Read or Write";
-  Read_Only,  desc="Read Only";
-  Read_Write, desc="Read/Write";
-  Invalid,    desc="Invalid";
-  NotPresent, desc="NotPresent";
-  ReadUpgradingToWrite, desc="Read only, but trying to get Read/Write";
-  Stale,      desc="local L1 has a modified copy, assume L2 copy is stale data";
+  // Valid data
+  Read_Only,  desc="block is Read Only (modulo functional writes)";
+  Read_Write, desc="block is Read/Write";
+
+  // Invalid data
+  Invalid,    desc="block is in an Invalid base state";
+  NotPresent, desc="block is NotPresent";
+  Busy,       desc="block is in a transient state, currently invalid";
 }
 
 // TesterStatus
index c0fe6ffd3b95e131c00ae03a17f55d35215bda2d..d53697c76564fed222db877cb5e0206b92228d5b 100644 (file)
@@ -50,8 +50,7 @@ AbstractCacheEntry::changePermission(AccessPermission new_perm)
 {
     m_Permission = new_perm;
     if ((new_perm == AccessPermission_Invalid) ||
-        (new_perm == AccessPermission_NotPresent) ||
-        (new_perm == AccessPermission_Stale)) {
+        (new_perm == AccessPermission_NotPresent)) {
         m_locked = -1;
     }
 }
index b04a6471701e984dc6ae6073c41d812c31218501..772b3d1f9a1520bfea256f5d3db1c7effcc3b11b 100644 (file)
@@ -149,7 +149,7 @@ inline void
 PerfectCacheMemory<ENTRY>::allocate(const Address& address)
 {
     PerfectCacheLineState<ENTRY> line_state;
-    line_state.m_permission = AccessPermission_Busy;
+    line_state.m_permission = AccessPermission_Invalid;
     line_state.m_entry = ENTRY();
     m_map[line_address(address)] = line_state;
 }