From 8053889d2030d1b8348898cd76b112fce00ab7d8 Mon Sep 17 00:00:00 2001 From: Elias Bachaalany Date: Sat, 18 Jan 2025 21:10:28 -0800 Subject: [PATCH 1/2] introducing reflection concept into core components the idea is to allow as much internal information into inner components. to not burden all builds, the reflection level can be controlled via the MOMO_REFLECTION_LEVEL (where 0 means no reflection code is included). more reflection variables will be introduced as needed. for now, the memory manager's layout version is used to track whether the memory layout is changed or not (at the lowest level). the API consumer can use this to decide to refresh or not expensive computations --- CMakeLists.txt | 4 ++++ src/emulator/memory_manager.cpp | 26 ++++++++++++++++++++++++++ src/emulator/memory_manager.hpp | 20 ++++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 02e43e14..d1113184 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,10 @@ cmake_minimum_required(VERSION 3.26.4) option(MOMO_ENABLE_SANITIZER "Enable sanitizer" OFF) option(MOMO_BUILD_AS_LIBRARY "Configure and Build the emulator as a shared library (without the samples and tests)" OFF) +set(MOMO_REFLECTION_LEVEL "0" CACHE STRING "Reflection level for the build") +message(STATUS "Reflection level is set to: ${MOMO_REFLECTION_LEVEL}") +add_compile_definitions(MOMO_REFLECTION_LEVEL=${MOMO_REFLECTION_LEVEL}) + if(MOMO_BUILD_AS_LIBRARY) add_compile_definitions(MOMO_BUILD_AS_LIBRARY=1) else() diff --git a/src/emulator/memory_manager.cpp b/src/emulator/memory_manager.cpp index 6f64b013..756f4eab 100644 --- a/src/emulator/memory_manager.cpp +++ b/src/emulator/memory_manager.cpp @@ -214,6 +214,11 @@ bool memory_manager::protect_memory(const uint64_t address, const size_t size, c } merge_regions(committed_regions); + +#if MOMO_REFLECTION_LEVEL > 0 + inc_memory_layout_state_ver(); +#endif + return true; } @@ -237,6 +242,10 @@ bool memory_manager::allocate_mmio(const uint64_t address, const size_t size, mm entry->second.committed_regions[address] = committed_region{size, memory_permission::read_write}; +#if MOMO_REFLECTION_LEVEL > 0 + inc_memory_layout_state_ver(); +#endif + return true; } @@ -261,6 +270,10 @@ bool memory_manager::allocate_memory(const uint64_t address, const size_t size, entry->second.committed_regions[address] = committed_region{size, memory_permission::read_write}; } +#if MOMO_REFLECTION_LEVEL > 0 + inc_memory_layout_state_ver(); +#endif + return true; } @@ -320,6 +333,11 @@ bool memory_manager::commit_memory(const uint64_t address, const size_t size, co } merge_regions(committed_regions); + +#if MOMO_REFLECTION_LEVEL > 0 + inc_memory_layout_state_ver(); +#endif + return true; } @@ -366,6 +384,10 @@ bool memory_manager::decommit_memory(const uint64_t address, const size_t size) ++i; } +#if MOMO_REFLECTION_LEVEL > 0 + inc_memory_layout_state_ver(); +#endif + return true; } @@ -418,6 +440,10 @@ bool memory_manager::release_memory(const uint64_t address, size_t size) } this->reserved_regions_.erase(entry); + +#if MOMO_REFLECTION_LEVEL > 0 + inc_memory_layout_state_ver(); +#endif return true; } diff --git a/src/emulator/memory_manager.hpp b/src/emulator/memory_manager.hpp index b1cf5acf..582dc7b9 100644 --- a/src/emulator/memory_manager.hpp +++ b/src/emulator/memory_manager.hpp @@ -1,5 +1,9 @@ #pragma once #include +#if MOMO_REFLECTION_LEVEL > 0 +#include +#include +#endif #include "memory_region.hpp" #include "address_utils.hpp" @@ -123,6 +127,13 @@ class memory_manager return reserved_regions_; } +#if MOMO_REFLECTION_LEVEL > 0 + std::uint64_t get_memory_layout_state_ver() const + { + return memory_layout_state_ver_.load(std::memory_order_relaxed); + } +#endif + private: reserved_region_map reserved_regions_{}; @@ -133,6 +144,15 @@ class memory_manager virtual void apply_memory_protection(uint64_t address, size_t size, memory_permission permissions) = 0; protected: +#if MOMO_REFLECTION_LEVEL > 0 + std::atomic memory_layout_state_ver_{0}; + + void inc_memory_layout_state_ver() + { + memory_layout_state_ver_.fetch_add(1, std::memory_order_relaxed); + } +#endif + void serialize_memory_state(utils::buffer_serializer& buffer, bool is_snapshot) const; void deserialize_memory_state(utils::buffer_deserializer& buffer, bool is_snapshot); }; From 8b3c0755b1ab07601238607b67a22931ef18891a Mon Sep 17 00:00:00 2001 From: Elias Bachaalany Date: Sun, 19 Jan 2025 13:57:45 -0800 Subject: [PATCH 2/2] mods based on suggestion/feedback --- src/emulator/memory_manager.cpp | 25 ++++++------------------- src/emulator/memory_manager.hpp | 16 ++++++---------- 2 files changed, 12 insertions(+), 29 deletions(-) diff --git a/src/emulator/memory_manager.cpp b/src/emulator/memory_manager.cpp index 756f4eab..46c5f944 100644 --- a/src/emulator/memory_manager.cpp +++ b/src/emulator/memory_manager.cpp @@ -215,9 +215,7 @@ bool memory_manager::protect_memory(const uint64_t address, const size_t size, c merge_regions(committed_regions); -#if MOMO_REFLECTION_LEVEL > 0 - inc_memory_layout_state_ver(); -#endif + invalidate_memory_layout_state_version(); return true; } @@ -242,9 +240,7 @@ bool memory_manager::allocate_mmio(const uint64_t address, const size_t size, mm entry->second.committed_regions[address] = committed_region{size, memory_permission::read_write}; -#if MOMO_REFLECTION_LEVEL > 0 - inc_memory_layout_state_ver(); -#endif + invalidate_memory_layout_state_version(); return true; } @@ -270,9 +266,7 @@ bool memory_manager::allocate_memory(const uint64_t address, const size_t size, entry->second.committed_regions[address] = committed_region{size, memory_permission::read_write}; } -#if MOMO_REFLECTION_LEVEL > 0 - inc_memory_layout_state_ver(); -#endif + invalidate_memory_layout_state_version(); return true; } @@ -334,9 +328,7 @@ bool memory_manager::commit_memory(const uint64_t address, const size_t size, co merge_regions(committed_regions); -#if MOMO_REFLECTION_LEVEL > 0 - inc_memory_layout_state_ver(); -#endif + invalidate_memory_layout_state_version(); return true; } @@ -384,9 +376,7 @@ bool memory_manager::decommit_memory(const uint64_t address, const size_t size) ++i; } -#if MOMO_REFLECTION_LEVEL > 0 - inc_memory_layout_state_ver(); -#endif + invalidate_memory_layout_state_version(); return true; } @@ -440,10 +430,7 @@ bool memory_manager::release_memory(const uint64_t address, size_t size) } this->reserved_regions_.erase(entry); - -#if MOMO_REFLECTION_LEVEL > 0 - inc_memory_layout_state_ver(); -#endif + invalidate_memory_layout_state_version(); return true; } diff --git a/src/emulator/memory_manager.hpp b/src/emulator/memory_manager.hpp index 582dc7b9..39899a2c 100644 --- a/src/emulator/memory_manager.hpp +++ b/src/emulator/memory_manager.hpp @@ -1,9 +1,7 @@ #pragma once #include -#if MOMO_REFLECTION_LEVEL > 0 #include #include -#endif #include "memory_region.hpp" #include "address_utils.hpp" @@ -127,12 +125,10 @@ class memory_manager return reserved_regions_; } -#if MOMO_REFLECTION_LEVEL > 0 std::uint64_t get_memory_layout_state_ver() const { - return memory_layout_state_ver_.load(std::memory_order_relaxed); + return memory_layout_state_version_.load(std::memory_order_relaxed); } -#endif private: reserved_region_map reserved_regions_{}; @@ -144,14 +140,14 @@ class memory_manager virtual void apply_memory_protection(uint64_t address, size_t size, memory_permission permissions) = 0; protected: -#if MOMO_REFLECTION_LEVEL > 0 - std::atomic memory_layout_state_ver_{0}; + std::atomic memory_layout_state_version_{0}; - void inc_memory_layout_state_ver() + void invalidate_memory_layout_state_version() { - memory_layout_state_ver_.fetch_add(1, std::memory_order_relaxed); - } +#if MOMO_REFLECTION_LEVEL > 0 + memory_layout_state_version_.fetch_add(1, std::memory_order_relaxed); #endif + } void serialize_memory_state(utils::buffer_serializer& buffer, bool is_snapshot) const; void deserialize_memory_state(utils::buffer_deserializer& buffer, bool is_snapshot);