From 599f28045ec2baf0426102a3ef42a2ce5be40445 Mon Sep 17 00:00:00 2001 From: LillyJadeKatrin Date: Sun, 4 May 2025 08:17:22 -0400 Subject: [PATCH 1/2] AchievementManager: verify MEM2 if it exists Adds MEM2 to MemoryVerifier. --- Source/Core/Core/AchievementManager.cpp | 8 ++++---- Source/Core/Core/AchievementManager.h | 3 +++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Source/Core/Core/AchievementManager.cpp b/Source/Core/Core/AchievementManager.cpp index 24a3a418a0..b8ec132bc8 100644 --- a/Source/Core/Core/AchievementManager.cpp +++ b/Source/Core/Core/AchievementManager.cpp @@ -1317,10 +1317,10 @@ void AchievementManager::Request(const rc_api_request_t* request, u32 AchievementManager::MemoryVerifier(u32 address, u8* buffer, u32 num_bytes, rc_client_t* client) { auto& system = Core::System::GetInstance(); - u32 ram_size = system.GetMemory().GetRamSizeReal(); - if (address >= ram_size) - return 0; - return std::min(ram_size - address, num_bytes); + u32 mem2_size = system.GetMemory().GetExRamSizeReal(); + if (address < MEM1_SIZE + mem2_size) + return std::min(MEM1_SIZE + mem2_size - address, num_bytes); + return 0; } u32 AchievementManager::MemoryPeeker(u32 address, u8* buffer, u32 num_bytes, rc_client_t* client) diff --git a/Source/Core/Core/AchievementManager.h b/Source/Core/Core/AchievementManager.h index 3edb561979..f121e96f8e 100644 --- a/Source/Core/Core/AchievementManager.h +++ b/Source/Core/Core/AchievementManager.h @@ -76,6 +76,9 @@ public: using RichPresence = std::array; using Badge = VideoCommon::CustomTextureData::ArraySlice::Level; static constexpr size_t MAX_DISPLAYED_LBOARDS = 4; + // This is hardcoded to 24MiB because rcheevos currently hardcodes it to 24MiB. + static constexpr u32 MEM1_SIZE = 0x01800000; + static constexpr u32 MEM2_START = 0x10000000; static constexpr std::string_view DEFAULT_PLAYER_BADGE_FILENAME = "achievements_player.png"; static constexpr std::string_view DEFAULT_GAME_BADGE_FILENAME = "achievements_game.png"; From 85bb066cb0a1a16f3eadbef263ca8f72d654caad Mon Sep 17 00:00:00 2001 From: LillyJadeKatrin Date: Sun, 4 May 2025 08:18:02 -0400 Subject: [PATCH 2/2] AchievementManager: update dev memory clone for Wii The clone of system memory used by AchievementManager during achievement development for the sake of thread decoupling was only copying MEM1; this grabs MEM2 as well if it exists. --- Source/Core/Core/AchievementManager.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Source/Core/Core/AchievementManager.cpp b/Source/Core/Core/AchievementManager.cpp index b8ec132bc8..dc818c8718 100644 --- a/Source/Core/Core/AchievementManager.cpp +++ b/Source/Core/Core/AchievementManager.cpp @@ -330,10 +330,11 @@ void AchievementManager::DoFrame() if (!system) return; Core::CPUThreadGuard thread_guard(*system); - u32 ram_size = system->GetMemory().GetRamSizeReal(); - if (m_cloned_memory.size() != ram_size) - m_cloned_memory.resize(ram_size); - system->GetMemory().CopyFromEmu(m_cloned_memory.data(), 0, m_cloned_memory.size()); + u32 mem2_size = system->GetMemory().GetExRamSizeReal(); + if (m_cloned_memory.size() != MEM1_SIZE + mem2_size) + m_cloned_memory.resize(MEM1_SIZE + mem2_size); + system->GetMemory().CopyFromEmu(m_cloned_memory.data(), 0, MEM1_SIZE); + system->GetMemory().CopyFromEmu(m_cloned_memory.data() + MEM1_SIZE, MEM2_START, mem2_size); } #endif // RC_CLIENT_SUPPORTS_RAINTEGRATION std::lock_guard lg{m_lock}; @@ -1351,6 +1352,8 @@ u32 AchievementManager::MemoryPeeker(u32 address, u8* buffer, u32 num_bytes, rc_ return 0; } Core::CPUThreadGuard thread_guard(system); + if (address > MEM1_SIZE) + address += (MEM2_START - MEM1_SIZE); for (u32 num_read = 0; num_read < num_bytes; num_read++) { auto value = system.GetMMU().HostTryReadU8(thread_guard, address + num_read, @@ -1591,7 +1594,10 @@ void AchievementManager::MemoryPoker(u32 address, u8* buffer, u32 num_bytes, rc_ return; Core::CPUThreadGuard thread_guard(*system); std::lock_guard lg{instance.m_memory_lock}; - system->GetMemory().CopyToEmu(address, buffer, num_bytes); + if (address < MEM1_SIZE) + system->GetMemory().CopyToEmu(address, buffer, num_bytes); + else + system->GetMemory().CopyToEmu(address - MEM1_SIZE + MEM2_START, buffer, num_bytes); std::copy(buffer, buffer + num_bytes, instance.m_cloned_memory.begin() + address); } void AchievementManager::GameTitleEstimateHandler(char* buffer, u32 buffer_size,