From b6c941c9cabdf6bd98be09addc6225c8a18d003b Mon Sep 17 00:00:00 2001 From: Marleson Graf <9793033+hexengraf@users.noreply.github.com> Date: Thu, 19 Dec 2024 01:59:47 -0300 Subject: [PATCH] mem-ruby: Fix missing RubySystem in PerfectCacheMemory's entries (#1864) MOESI_CMP_directory protocol crashes with one of the several assertions in NetDest.cc. It happens because the entry type used to instantiate a PerfectCacheMemory object in MOESI_CMP_directory-L2cache.sm contains a NetDest object, so it requires a RubySystem object to be manually set for it. Instead of just receiving the block size, change PerfectCacheMemory to receive a RubySystem object and use it to set the block size and call ENTRY::setRubySystem if the entries require it. --- src/mem/ruby/structures/PerfectCacheMemory.hh | 19 ++++++++++++++++++- src/mem/slicc/symbols/StateMachine.py | 4 ++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/mem/ruby/structures/PerfectCacheMemory.hh b/src/mem/ruby/structures/PerfectCacheMemory.hh index 0966ca80d2..9cf8e8de19 100644 --- a/src/mem/ruby/structures/PerfectCacheMemory.hh +++ b/src/mem/ruby/structures/PerfectCacheMemory.hh @@ -41,11 +41,13 @@ #ifndef __MEM_RUBY_STRUCTURES_PERFECTCACHEMEMORY_HH__ #define __MEM_RUBY_STRUCTURES_PERFECTCACHEMEMORY_HH__ +#include #include #include "base/compiler.hh" #include "mem/ruby/common/Address.hh" #include "mem/ruby/protocol/AccessPermission.hh" +#include "mem/ruby/system/RubySystem.hh" namespace gem5 { @@ -74,7 +76,7 @@ class PerfectCacheMemory public: PerfectCacheMemory(); - void setBlockSize(const int block_size) { m_block_size = block_size; } + void setRubySystem(RubySystem *rs); // tests to see if an address is present in the cache bool isTagPresent(Addr address) const; @@ -111,7 +113,11 @@ class PerfectCacheMemory // Data Members (m_prefix) std::unordered_map > m_map; + RubySystem *m_ruby_system = nullptr; int m_block_size = 0; + + static constexpr bool entryRequiresRubySystem = + std::is_member_function_pointer_v; }; template @@ -129,6 +135,14 @@ PerfectCacheMemory::PerfectCacheMemory() { } +template +inline +void PerfectCacheMemory::setRubySystem(RubySystem *rs) +{ + m_ruby_system = rs; + m_block_size = rs->getBlockSizeBytes(); +} + // tests to see if an address is present in the cache template inline bool @@ -153,6 +167,9 @@ PerfectCacheMemory::allocate(Addr address) PerfectCacheLineState line_state; line_state.m_permission = AccessPermission_Invalid; line_state.m_entry = ENTRY(); + if constexpr (entryRequiresRubySystem) { + line_state.m_entry.setRubySystem(m_ruby_system); + } Addr line_addr = makeLineAddress(address, floorLog2(m_block_size)); m_map.emplace(line_addr, line_state); } diff --git a/src/mem/slicc/symbols/StateMachine.py b/src/mem/slicc/symbols/StateMachine.py index 42f4c332d2..c1052086bf 100644 --- a/src/mem/slicc/symbols/StateMachine.py +++ b/src/mem/slicc/symbols/StateMachine.py @@ -833,11 +833,11 @@ $c_ident::init() # For objects that require knowing the cache line size, # set the value here. - if vtype.c_ident in ("TBETable", "PerfectCacheMemory"): + if vtype.c_ident in ("TBETable"): block_size_func = "m_ruby_system->getBlockSizeBytes()" code(f"(*{vid}).setBlockSize({block_size_func});") - if vtype.c_ident in ("NetDest"): + if vtype.c_ident in ("NetDest", "PerfectCacheMemory"): code(f"(*{vid}).setRubySystem(m_ruby_system);") for param in self.config_parameters: