diff options
Diffstat (limited to 'src/core/arm')
-rw-r--r-- | src/core/arm/nce/arm_nce.cpp | 8 | ||||
-rw-r--r-- | src/core/arm/nce/arm_nce.h | 10 |
2 files changed, 12 insertions, 6 deletions
diff --git a/src/core/arm/nce/arm_nce.cpp b/src/core/arm/nce/arm_nce.cpp index f08c5c352..6220e3031 100644 --- a/src/core/arm/nce/arm_nce.cpp +++ b/src/core/arm/nce/arm_nce.cpp @@ -199,7 +199,7 @@ bool ArmNce::HandleGuestAccessFault(GuestContext* guest_ctx, void* raw_info, voi } // Trigger an immediate remap if lookup fails - if (!memory.Remap(fault_addr, Memory::CITRON_PAGESIZE)) { + if (!memory.Remap(fault_addr, Memory::CITRON_PAGESIZE, *nce)) { LOG_ERROR(Core_ARM, "Immediate remap failed for address {:X}", fault_addr); return HandleFailedGuestFault(guest_ctx, raw_info, raw_context); } @@ -430,7 +430,7 @@ void ArmNce::InvalidateCacheRange(u64 addr, std::size_t size) { } TlbEntry* ArmNce::FindTlbEntry(u64 guest_addr) { - std::lock_guard lock(m_tlb_mutex); + std::lock_guard<std::mutex> lock(m_tlb_mutex); // Correct usage of lock_guard // Simple linear search - more reliable than complex indexing for (size_t i = 0; i < TLB_SIZE; i++) { @@ -456,7 +456,7 @@ void ArmNce::AddTlbEntry(u64 guest_addr, u64 host_addr, u32 size, bool writable) return; } - std::lock_guard lock(m_tlb_mutex); + std::lock_guard<std::mutex> lock(m_tlb_mutex); // Correct usage of lock_guard size_t replace_idx = TLB_SIZE; auto now = std::chrono::steady_clock::now(); @@ -506,7 +506,7 @@ void ArmNce::AddTlbEntry(u64 guest_addr, u64 host_addr, u32 size, bool writable) } void ArmNce::InvalidateTlb() { - std::lock_guard lock(m_tlb_mutex); + std::lock_guard<std::mutex> lock(m_tlb_mutex); // Correct usage of lock_guard auto now = std::chrono::steady_clock::now(); auto expiration_time = std::chrono::minutes(5); // Example: 5 minutes expiration diff --git a/src/core/arm/nce/arm_nce.h b/src/core/arm/nce/arm_nce.h index 13da2c8b4..416703557 100644 --- a/src/core/arm/nce/arm_nce.h +++ b/src/core/arm/nce/arm_nce.h @@ -62,6 +62,11 @@ public: void LockThread(Kernel::KThread* thread) override; void UnlockThread(Kernel::KThread* thread) override; + // Method to provide access to TLB entries + const std::array<TlbEntry, TLB_SIZE>& GetTlbEntries() const { + return m_tlb; + } + protected: const Kernel::DebugWatchpoint* HaltedWatchpoint() const override { return nullptr; @@ -109,8 +114,8 @@ public: std::unique_ptr<u8[]> m_stack{}; // Enhanced TLB implementation - std::array<TlbEntry, TLB_SIZE> m_tlb{}; - std::mutex m_tlb_mutex; + std::array<TlbEntry, TLB_SIZE> m_tlb{}; // Declare m_tlb + std::mutex m_tlb_mutex; // Declare m_tlb_mutex u64 m_tlb_access_counter{0}; // TLB helper functions @@ -120,6 +125,7 @@ public: size_t GetTlbSetIndex(u64 guest_addr) const; size_t FindReplacementEntry(size_t set_start); void UpdateTlbEntryStats(TlbEntry& entry); + void StartTlbInvalidationTimer(); // Thread context caching std::mutex m_context_mutex; |