diff --git a/src/core/arm/nce/arm_nce.cpp b/src/core/arm/nce/arm_nce.cpp index 0e285b4e75..57f19e169d 100644 --- a/src/core/arm/nce/arm_nce.cpp +++ b/src/core/arm/nce/arm_nce.cpp @@ -190,44 +190,10 @@ bool ArmNce::IsPreciseAccessPage(u64 addr) const { void ArmNce::MarkPreciseAccessPage(u64 addr) { const std::scoped_lock lk{m_precise_pages_guard}; - const u64 page = AlignDownPage(addr); - if (auto it = m_precise_pages.find(page); it != m_precise_pages.end()) { - it->second = std::min(MaxPreciseAccessPageWeight, static_cast(it->second + 1)); - return; - } - - while (m_precise_pages.size() >= MaxPreciseAccessPages) { - DecayPreciseAccessPagesLocked(); - } - - m_precise_pages.emplace(page, 1); -} - -void ArmNce::MarkPreciseAccessFaultWindow(u64 addr) { - MarkPreciseAccessPage(addr); - - if (!IsNearPageBoundary(addr)) { - return; - } - - const u64 page_offset = addr & Memory::YUZU_PAGEMASK; - if (page_offset < SplitPageAccessWindow && addr >= Memory::YUZU_PAGESIZE) { - MarkPreciseAccessPage(addr - Memory::YUZU_PAGESIZE); - } - if (page_offset + SplitPageAccessWindow > Memory::YUZU_PAGESIZE) { - MarkPreciseAccessPage(addr + Memory::YUZU_PAGESIZE); - } -} - -void ArmNce::DecayPreciseAccessPagesLocked() { - for (auto it = m_precise_pages.begin(); it != m_precise_pages.end();) { - if (it->second > 1) { - --it->second; - ++it; - } else { - it = m_precise_pages.erase(it); - } + if (m_precise_pages.size() >= MaxPreciseAccessPages) { + m_precise_pages.clear(); } + m_precise_pages.insert(AlignDownPage(addr)); } void ArmNce::LockThread(Kernel::KThread* thread) { diff --git a/src/core/arm/nce/arm_nce.h b/src/core/arm/nce/arm_nce.h index 4c0ffb6517..32772d9694 100644 --- a/src/core/arm/nce/arm_nce.h +++ b/src/core/arm/nce/arm_nce.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #include "core/arm/arm_interface.h" #include "core/arm/nce/guest_context.h" @@ -84,8 +84,6 @@ private: bool IsPreciseAccessPage(u64 addr) const; void MarkPreciseAccessPage(u64 addr); - void MarkPreciseAccessFaultWindow(u64 addr); - void DecayPreciseAccessPagesLocked(); public: Core::System& m_system; @@ -99,7 +97,7 @@ public: Kernel::KThread* m_running_thread{}; mutable std::mutex m_precise_pages_guard{}; - std::unordered_map m_precise_pages{}; + std::unordered_set m_precise_pages{}; // Stack for signal processing. std::unique_ptr m_stack{};