diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MESI_CMP_directory-L1cache.sm --- a/src/mem/protocol/MESI_CMP_directory-L1cache.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MESI_CMP_directory-L1cache.sm Mon Jun 06 16:42:05 2011 -0500 @@ -183,6 +183,26 @@ } } + AccessPermission getAccessPermission(Address addr) { + TBE tbe := L1_TBEs[addr]; + if(is_valid(tbe)) { + return L1Cache_State_to_permission(tbe.TBEState); + } + + Entry cache_entry := getCacheEntry(addr); + if(is_valid(cache_entry)) { + return L1Cache_State_to_permission(cache_entry.CacheState); + } + + return AccessPermission:NotPresent; + } + + void setAccessPermission(Entry cache_entry, Address addr, State state) { + if (is_valid(cache_entry)) { + cache_entry.changePermission(L1Cache_State_to_permission(state)); + } + } + Event mandatory_request_type_to_event(RubyRequestType type) { if (type == RubyRequestType:LD) { return Event:Load; diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MESI_CMP_directory-L2cache.sm --- a/src/mem/protocol/MESI_CMP_directory-L2cache.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MESI_CMP_directory-L2cache.sm Mon Jun 06 16:42:05 2011 -0500 @@ -202,7 +202,6 @@ return L2Cache_State_to_string(getState(tbe, cache_entry, addr)); } - // when is this called void setState(TBE tbe, Entry cache_entry, Address addr, State state) { // MUST CHANGE @@ -215,6 +214,26 @@ } } + AccessPermission getAccessPermission(Address addr) { + TBE tbe := L2_TBEs[addr]; + if(is_valid(tbe)) { + return L2Cache_State_to_permission(tbe.TBEState); + } + + Entry cache_entry := getCacheEntry(addr); + if(is_valid(cache_entry)) { + return L2Cache_State_to_permission(cache_entry.CacheState); + } + + return AccessPermission:NotPresent; + } + + void setAccessPermission(Entry cache_entry, Address addr, State state) { + if (is_valid(cache_entry)) { + cache_entry.changePermission(L2Cache_State_to_permission(state)); + } + } + Event L1Cache_request_type_to_event(CoherenceRequestType type, Address addr, MachineID requestor, Entry cache_entry) { if(type == CoherenceRequestType:GETS) { diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MESI_CMP_directory-dir.sm --- a/src/mem/protocol/MESI_CMP_directory-dir.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MESI_CMP_directory-dir.sm Mon Jun 06 16:42:05 2011 -0500 @@ -124,7 +124,6 @@ } } - void setState(TBE tbe, Address addr, State state) { if (is_valid(tbe)) { @@ -145,6 +144,20 @@ } } + AccessPermission getAccessPermission(Address addr) { + TBE tbe := TBEs[addr]; + if(is_valid(tbe)) { + return Directory_State_to_permission(tbe.TBEState); + } + + return Directory_State_to_permission(getDirectoryEntry(addr).DirectoryState); + } + + void setAccessPermission(Address addr, State state) { + if (directory.isPresent(addr)) { + getDirectoryEntry(addr).changePermission(Directory_State_to_permission(state)); + } + } bool isGETRequest(CoherenceRequestType type) { return (type == CoherenceRequestType:GETS) || diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MESI_CMP_directory-dma.sm --- a/src/mem/protocol/MESI_CMP_directory-dma.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MESI_CMP_directory-dma.sm Mon Jun 06 16:42:05 2011 -0500 @@ -35,6 +35,13 @@ cur_state := state; } + AccessPermission getAccessPermission(Address addr) { + return AccessPermission:NotPresent; + } + + void setAccessPermission(Address addr, State state) { + } + out_port(reqToDirectory_out, RequestMsg, reqToDirectory, desc="..."); in_port(dmaRequestQueue_in, SequencerMsg, mandatoryQueue, desc="...") { diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MI_example-cache.sm --- a/src/mem/protocol/MI_example-cache.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MI_example-cache.sm Mon Jun 06 16:42:05 2011 -0500 @@ -120,6 +120,26 @@ } } + AccessPermission getAccessPermission(Address addr) { + TBE tbe := TBEs[addr]; + if(is_valid(tbe)) { + return L1Cache_State_to_permission(tbe.TBEState); + } + + Entry cache_entry := getCacheEntry(addr); + if(is_valid(cache_entry)) { + return L1Cache_State_to_permission(cache_entry.CacheState); + } + + return AccessPermission:NotPresent; + } + + void setAccessPermission(Entry cache_entry, Address addr, State state) { + if (is_valid(cache_entry)) { + cache_entry.changePermission(L1Cache_State_to_permission(state)); + } + } + GenericMachineType getNondirectHitMachType(MachineID sender) { if (machineIDToMachineType(sender) == MachineType:L1Cache) { // diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MI_example-dir.sm --- a/src/mem/protocol/MI_example-dir.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MI_example-dir.sm Mon Jun 06 16:42:05 2011 -0500 @@ -116,6 +116,21 @@ } } + AccessPermission getAccessPermission(Address addr) { + TBE tbe := TBEs[addr]; + if(is_valid(tbe)) { + return Directory_State_to_permission(tbe.TBEState); + } + + return Directory_State_to_permission(getDirectoryEntry(addr).DirectoryState); + } + + void setAccessPermission(Address addr, State state) { + if (directory.isPresent(addr)) { + getDirectoryEntry(addr).changePermission(Directory_State_to_permission(state)); + } + } + // ** OUT_PORTS ** out_port(forwardNetwork_out, RequestMsg, forwardFromDir); out_port(responseNetwork_out, ResponseMsg, responseFromDir); diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MI_example-dma.sm --- a/src/mem/protocol/MI_example-dma.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MI_example-dma.sm Mon Jun 06 16:42:05 2011 -0500 @@ -30,6 +30,13 @@ cur_state := state; } + AccessPermission getAccessPermission(Address addr) { + return AccessPermission:NotPresent; + } + + void setAccessPermission(Address addr, State state) { + } + out_port(reqToDirectory_out, DMARequestMsg, reqToDirectory, desc="..."); in_port(dmaRequestQueue_in, SequencerMsg, mandatoryQueue, desc="...") { diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MOESI_CMP_directory-L1cache.sm --- a/src/mem/protocol/MOESI_CMP_directory-L1cache.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MOESI_CMP_directory-L1cache.sm Mon Jun 06 16:42:05 2011 -0500 @@ -194,6 +194,26 @@ } } + AccessPermission getAccessPermission(Address addr) { + TBE tbe := TBEs[addr]; + if(is_valid(tbe)) { + return L1Cache_State_to_permission(tbe.TBEState); + } + + Entry cache_entry := getCacheEntry(addr); + if(is_valid(cache_entry)) { + return L1Cache_State_to_permission(cache_entry.CacheState); + } + + return AccessPermission:NotPresent; + } + + void setAccessPermission(Entry cache_entry, Address addr, State state) { + if (is_valid(cache_entry)) { + cache_entry.changePermission(L1Cache_State_to_permission(state)); + } + } + Event mandatory_request_type_to_event(RubyRequestType type) { if (type == RubyRequestType:LD) { return Event:Load; diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MOESI_CMP_directory-L2cache.sm --- a/src/mem/protocol/MOESI_CMP_directory-L2cache.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MOESI_CMP_directory-L2cache.sm Mon Jun 06 16:42:05 2011 -0500 @@ -499,6 +499,26 @@ } } + AccessPermission getAccessPermission(Address addr) { + TBE tbe := TBEs[addr]; + if(is_valid(tbe)) { + return L2Cache_State_to_permission(tbe.TBEState); + } + + Entry cache_entry := getCacheEntry(addr); + if(is_valid(cache_entry)) { + return L2Cache_State_to_permission(cache_entry.CacheState); + } + + return AccessPermission:NotPresent; + } + + void setAccessPermission(Entry cache_entry, Address addr, State state) { + if (is_valid(cache_entry)) { + cache_entry.changePermission(L2Cache_State_to_permission(state)); + } + } + MessageBuffer triggerQueue, ordered="true"; out_port(globalRequestNetwork_out, RequestMsg, GlobalRequestFromL2Cache); diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MOESI_CMP_directory-dir.sm --- a/src/mem/protocol/MOESI_CMP_directory-dir.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MOESI_CMP_directory-dir.sm Mon Jun 06 16:42:05 2011 -0500 @@ -171,6 +171,20 @@ } } + AccessPermission getAccessPermission(Address addr) { + if (directory.isPresent(addr)) { + return Directory_State_to_permission(getDirectoryEntry(addr).DirectoryState); + } + + return AccessPermission:NotPresent; + } + + void setAccessPermission(Address addr, State state) { + if (directory.isPresent(addr)) { + getDirectoryEntry(addr).changePermission(Directory_State_to_permission(state)); + } + } + // if no sharers, then directory can be considered both a sharer and exclusive w.r.t. coherence checking bool isBlockShared(Address addr) { if (directory.isPresent(addr)) { diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MOESI_CMP_directory-dma.sm --- a/src/mem/protocol/MOESI_CMP_directory-dma.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MOESI_CMP_directory-dma.sm Mon Jun 06 16:42:05 2011 -0500 @@ -61,6 +61,13 @@ cur_state := state; } + AccessPermission getAccessPermission(Address addr) { + return AccessPermission:NotPresent; + } + + void setAccessPermission(Address addr, State state) { + } + out_port(reqToDirectory_out, RequestMsg, reqToDir, desc="..."); out_port(respToDirectory_out, ResponseMsg, respToDir, desc="..."); out_port(foo1_out, ResponseMsg, foo1, desc="..."); diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MOESI_CMP_token-L1cache.sm --- a/src/mem/protocol/MOESI_CMP_token-L1cache.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MOESI_CMP_token-L1cache.sm Mon Jun 06 16:42:05 2011 -0500 @@ -341,6 +341,26 @@ } } + AccessPermission getAccessPermission(Address addr) { + TBE tbe := L1_TBEs[addr]; + if(is_valid(tbe)) { + return L1Cache_State_to_permission(tbe.TBEState); + } + + Entry cache_entry := getCacheEntry(addr); + if(is_valid(cache_entry)) { + return L1Cache_State_to_permission(cache_entry.CacheState); + } + + return AccessPermission:NotPresent; + } + + void setAccessPermission(Entry cache_entry, Address addr, State state) { + if (is_valid(cache_entry)) { + cache_entry.changePermission(L1Cache_State_to_permission(state)); + } + } + Event mandatory_request_type_to_event(RubyRequestType type) { if (type == RubyRequestType:LD) { return Event:Load; diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MOESI_CMP_token-L2cache.sm --- a/src/mem/protocol/MOESI_CMP_token-L2cache.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MOESI_CMP_token-L2cache.sm Mon Jun 06 16:42:05 2011 -0500 @@ -211,6 +211,21 @@ } } + AccessPermission getAccessPermission(Address addr) { + Entry cache_entry := getCacheEntry(addr); + if(is_valid(cache_entry)) { + return L2Cache_State_to_permission(cache_entry.CacheState); + } + + return AccessPermission:NotPresent; + } + + void setAccessPermission(Entry cache_entry, Address addr, State state) { + if (is_valid(cache_entry)) { + cache_entry.changePermission(L2Cache_State_to_permission(state)); + } + } + void removeSharer(Address addr, NodeID id) { if (localDirectory.isTagPresent(addr)) { diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MOESI_CMP_token-dir.sm --- a/src/mem/protocol/MOESI_CMP_token-dir.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MOESI_CMP_token-dir.sm Mon Jun 06 16:42:05 2011 -0500 @@ -199,7 +199,20 @@ // assert(getDirectoryEntry(addr).Tokens >= (max_tokens() / 2)); // Only mostly true; this might not always hold } } - + + AccessPermission getAccessPermission(Address addr) { + TBE tbe := TBEs[addr]; + if(is_valid(tbe)) { + return Directory_State_to_permission(tbe.TBEState); + } + + return Directory_State_to_permission(getDirectoryEntry(addr).DirectoryState); + } + + void setAccessPermission(Address addr, State state) { + getDirectoryEntry(addr).changePermission(Directory_State_to_permission(state)); + } + bool okToIssueStarving(Address addr, MachineID machinID) { return persistentTable.okToIssueStarving(addr, machineID); } diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MOESI_CMP_token-dma.sm --- a/src/mem/protocol/MOESI_CMP_token-dma.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MOESI_CMP_token-dma.sm Mon Jun 06 16:42:05 2011 -0500 @@ -63,6 +63,13 @@ cur_state := state; } + AccessPermission getAccessPermission(Address addr) { + return AccessPermission:NotPresent; + } + + void setAccessPermission(Address addr, State state) { + } + out_port(reqToDirectory_out, DMARequestMsg, reqToDirectory, desc="..."); in_port(dmaRequestQueue_in, SequencerMsg, mandatoryQueue, desc="...") { diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MOESI_hammer-cache.sm --- a/src/mem/protocol/MOESI_hammer-cache.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MOESI_hammer-cache.sm Mon Jun 06 16:42:05 2011 -0500 @@ -227,6 +227,26 @@ } } + AccessPermission getAccessPermission(Address addr) { + TBE tbe := TBEs[addr]; + if(is_valid(tbe)) { + return L1Cache_State_to_permission(tbe.TBEState); + } + + Entry cache_entry := getCacheEntry(addr); + if(is_valid(cache_entry)) { + return L1Cache_State_to_permission(cache_entry.CacheState); + } + + return AccessPermission:NotPresent; + } + + void setAccessPermission(Entry cache_entry, Address addr, State state) { + if (is_valid(cache_entry)) { + cache_entry.changePermission(L1Cache_State_to_permission(state)); + } + } + Event mandatory_request_type_to_event(RubyRequestType type) { if (type == RubyRequestType:LD) { return Event:Load; diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MOESI_hammer-dir.sm --- a/src/mem/protocol/MOESI_hammer-dir.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MOESI_hammer-dir.sm Mon Jun 06 16:42:05 2011 -0500 @@ -232,7 +232,20 @@ } getDirectoryEntry(addr).DirectoryState := state; } - + + AccessPermission getAccessPermission(Address addr) { + TBE tbe := TBEs[addr]; + if(is_valid(tbe)) { + return Directory_State_to_permission(tbe.TBEState); + } + + return Directory_State_to_permission(getDirectoryEntry(addr).DirectoryState); + } + + void setAccessPermission(PfEntry pf_entry, Address addr, State state) { + getDirectoryEntry(addr).changePermission(Directory_State_to_permission(state)); + } + Event cache_request_to_event(CoherenceRequestType type) { if (type == CoherenceRequestType:GETS) { return Event:GETS; diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/MOESI_hammer-dma.sm --- a/src/mem/protocol/MOESI_hammer-dma.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/MOESI_hammer-dma.sm Mon Jun 06 16:42:05 2011 -0500 @@ -60,6 +60,13 @@ cur_state := state; } + AccessPermission getAccessPermission(Address addr) { + return AccessPermission:NotPresent; + } + + void setAccessPermission(Address addr, State state) { + } + out_port(reqToDirectory_out, DMARequestMsg, reqToDirectory, desc="..."); in_port(dmaRequestQueue_in, SequencerMsg, mandatoryQueue, desc="...") { diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/Network_test-cache.sm --- a/src/mem/protocol/Network_test-cache.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/Network_test-cache.sm Mon Jun 06 16:42:05 2011 -0500 @@ -120,6 +120,13 @@ } + AccessPermission getAccessPermission(Address addr) { + return AccessPermission:NotPresent; + } + + void setAccessPermission(Entry cache_entry, Address addr, State state) { + } + Entry getCacheEntry(Address address), return_by_pointer="yes" { return OOD; } diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/Network_test-dir.sm --- a/src/mem/protocol/Network_test-dir.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/Network_test-dir.sm Mon Jun 06 16:42:05 2011 -0500 @@ -69,6 +69,13 @@ } + AccessPermission getAccessPermission(Address addr) { + return AccessPermission:NotPresent; + } + + void setAccessPermission(Address addr, State state) { + } + // ** IN_PORTS ** in_port(requestQueue_in, RequestMsg, requestToDir) { diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/protocol/RubySlicc_Types.sm --- a/src/mem/protocol/RubySlicc_Types.sm Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/protocol/RubySlicc_Types.sm Mon Jun 06 16:42:05 2011 -0500 @@ -120,7 +120,9 @@ int contextId, desc="this goes away but must be replace with Nilay"; } -external_type(AbstractEntry, primitive="yes"); +structure(AbstractEntry, primitive="yes", external = "yes") { + void changePermission(AccessPermission); +} structure (DirectoryMemory, external = "yes") { AbstractEntry lookup(Address); @@ -128,7 +130,9 @@ void invalidateBlock(Address); } -external_type(AbstractCacheEntry, primitive="yes"); +structure(AbstractCacheEntry, primitive="yes", external = "yes") { + void changePermission(AccessPermission); +} structure (CacheMemory, external = "yes") { bool cacheAvail(Address); diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/ruby/slicc_interface/AbstractController.hh --- a/src/mem/ruby/slicc_interface/AbstractController.hh Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/ruby/slicc_interface/AbstractController.hh Mon Jun 06 16:42:05 2011 -0500 @@ -32,6 +32,7 @@ #include #include +#include "mem/protocol/AccessPermission.hh" #include "mem/protocol/MachineType.hh" #include "mem/ruby/common/Address.hh" #include "mem/ruby/common/Consumer.hh" @@ -67,6 +68,9 @@ virtual void wakeup() = 0; // virtual void dumpStats(std::ostream & out) = 0; virtual void clearStats() = 0; + + private: + virtual AccessPermission getAccessPermission(Address addr) = 0; }; #endif // __MEM_RUBY_SLICC_INTERFACE_ABSTRACTCONTROLLER_HH__ diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/slicc/ast/MethodCallExprAST.py --- a/src/mem/slicc/ast/MethodCallExprAST.py Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/slicc/ast/MethodCallExprAST.py Mon Jun 06 16:42:05 2011 -0500 @@ -160,7 +160,13 @@ if return_type.isInterface: prefix = "static_cast<%s &>" % return_type.c_ident - prefix = "%s((%s)." % (prefix, code) + + if str(obj_type) == "AbstractCacheEntry" or \ + ("interface" in obj_type and + obj_type["interface"] == "AbstractCacheEntry"): + prefix = "%s((*(%s))." % (prefix, code) + else: + prefix = "%s((%s)." % (prefix, code) return obj_type, methodId, prefix diff -r b9ba22cb23f2 -r ba23c909b4b5 src/mem/slicc/symbols/StateMachine.py --- a/src/mem/slicc/symbols/StateMachine.py Fri Jun 03 13:52:18 2011 -0500 +++ b/src/mem/slicc/symbols/StateMachine.py Mon Jun 06 16:42:05 2011 -0500 @@ -348,8 +348,6 @@ // Set and Reset for cache_entry variable void set_cache_entry(${{self.EntryType.c_ident}}*& m_cache_entry_ptr, AbstractCacheEntry* m_new_cache_entry); void unset_cache_entry(${{self.EntryType.c_ident}}*& m_cache_entry_ptr); -// Set permissions for the cache_entry -void set_permission(${{self.EntryType.c_ident}}*& m_cache_entry_ptr, AccessPermission perm); ''') if self.TBEType != None: @@ -864,15 +862,6 @@ { m_cache_entry_ptr = 0; } - -void -$c_ident::set_permission(${{self.EntryType.c_ident}}*& m_cache_entry_ptr, - AccessPermission perm) -{ - if (m_cache_entry_ptr != NULL) { - m_cache_entry_ptr->changePermission(perm); - } -} ''') if self.TBEType != None: @@ -1116,14 +1105,16 @@ ''') if self.TBEType != None and self.EntryType != None: code('setState(m_tbe_ptr, m_cache_entry_ptr, addr, next_state);') - code('set_permission(m_cache_entry_ptr, ${ident}_State_to_permission(next_state));') + code('setAccessPermission(m_cache_entry_ptr, addr, next_state);') elif self.TBEType != None: code('setState(m_tbe_ptr, addr, next_state);') + code('setAccessPermission(addr, next_state);') elif self.EntryType != None: code('setState(m_cache_entry_ptr, addr, next_state);') - code('set_permission(m_cache_entry_ptr, ${ident}_State_to_permission(next_state));') + code('setAccessPermission(m_cache_entry_ptr, addr, next_state);') else: code('setState(addr, next_state);') + code('setAccessPermission(addr, next_state);') code(''' } else if (result == TransitionResult_ResourceStall) {