summaryrefslogtreecommitdiff
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
parent90a8165f7740702c5bc9c57a997bb67d229002aa (diff)
arm: corrected declarations
-rw-r--r--src/core/memory.cpp6
-rw-r--r--src/core/memory.h30
-rw-r--r--src/video_core/memory_manager.cpp26
3 files changed, 59 insertions, 3 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index b32071899..9a77e4ac0 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -1183,9 +1183,9 @@ bool Memory::Remap(u64 guest_addr, u32 size, ArmNce& arm_nce) {
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();
+ auto& tlb_entries = arm_nce.GetTlbEntries();
- for (const auto& entry : tlb_entries) {
+ for (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);
@@ -1194,7 +1194,7 @@ void Memory::ReclaimUnusedMemory(ArmNce& arm_nce) {
std::free(reinterpret_cast<void*>(entry.host_addr));
// Invalidate the TLB entry
- const_cast<TlbEntry&>(entry).valid = false;
+ entry.valid = false;
LOG_INFO(Core_Memory, "Reclaimed memory for address {:X}", entry.guest_addr);
}
diff --git a/src/core/memory.h b/src/core/memory.h
index eeeee6d65..1fdb2ccc4 100644
--- a/src/core/memory.h
+++ b/src/core/memory.h
@@ -14,6 +14,7 @@
#include "common/typed_address.h"
#include "core/guest_memory.h"
#include "core/hle/result.h"
+#include "core/arm/nce/arm_nce.h" // Include ArmNce header
namespace Common {
enum class MemoryPermission : u32;
@@ -52,6 +53,17 @@ enum : u64 {
DEFAULT_STACK_SIZE = 0x100000,
};
+struct TlbEntry {
+ u64 guest_addr;
+ u64 host_addr;
+ u32 size;
+ bool valid;
+ bool writable;
+ u32 access_count;
+ std::chrono::steady_clock::time_point last_access_time;
+ u32 ref_count= 0;
+};
+
/// Central class that handles all memory operations and state.
class Memory {
public:
@@ -503,10 +515,28 @@ public:
bool Remap(u64 guest_addr, u32 size);
/**
+ * Remaps a region of the emulated process address space.
+ *
+ * @param guest_addr The address to begin remapping at.
+ * @param size The amount of bytes to remap.
+ * @param arm_nce The ArmNce instance to use for TLB entries.
+ *
+ * @returns True if remapping is successful, false otherwise.
+ */
+ bool Remap(u64 guest_addr, u32 size, ArmNce& arm_nce);
+
+ /**
* Reclaims memory from pages that are no longer used.
*/
void ReclaimUnusedMemory();
+ /**
+ * Reclaims memory from pages that are no longer used.
+ *
+ * @param arm_nce The ArmNce instance to use for TLB entries.
+ */
+ void ReclaimUnusedMemory(ArmNce& arm_nce);
+
private:
Core::System& system;
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