summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
authorCamilleLaVey <camillelavey@citron-emu.org>2025-03-05 11:12:44 -0400
committerCamilleLaVey <camillelavey@citron-emu.org>2025-03-05 11:12:44 -0400
commit031c635095622a35982f7f6faef894df9583e888 (patch)
tree15eff2f503ad0b897d229d6935fd0878d5c946d0 /src/video_core
parent90a8165f7740702c5bc9c57a997bb67d229002aa (diff)
arm: corrected declarations
Diffstat (limited to 'src/video_core')
-rw-r--r--src/video_core/memory_manager.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp
index ffafc48ef..248b8bb5b 100644
--- a/src/video_core/memory_manager.cpp
+++ b/src/video_core/memory_manager.cpp
@@ -15,6 +15,7 @@
#include "video_core/memory_manager.h"
#include "video_core/rasterizer_interface.h"
#include "video_core/renderer_base.h"
+#include "core/arm/nce/arm_nce.h"
namespace Tegra {
using Tegra::Memory::GuestMemoryFlags;
@@ -785,3 +786,28 @@ u8* MemoryManager::GetSpan(const GPUVAddr src_addr, const std::size_t size) {
}
} // namespace Tegra
+
+namespace Core::Memory {
+
+void Memory::ReclaimUnusedMemory(ArmNce& arm_nce) {
+ std::lock_guard<std::mutex> lock(arm_nce.m_tlb_mutex); // Correct usage of lock_guard
+
+ const auto& tlb_entries = arm_nce.GetTlbEntries();
+
+ for (const auto& entry : tlb_entries) {
+ if (entry.valid && entry.ref_count == 0) {
+ // Unmap the memory region
+ UnmapRegion(*impl->current_page_table, entry.guest_addr, entry.size, false);
+
+ // Free the memory
+ std::free(reinterpret_cast<void*>(entry.host_addr));
+
+ // Invalidate the TLB entry
+ const_cast<TlbEntry&>(entry).valid = false;
+
+ LOG_INFO(Core_Memory, "Reclaimed memory for address {:X}", entry.guest_addr);
+ }
+ }
+}
+
+} // namespace Core::Memory