summaryrefslogtreecommitdiff
path: root/Source/Core/Common/MemArenaUnix.cpp
diff options
context:
space:
mode:
authorJMC47 <JMC4789@gmail.com>2026-02-04 16:20:35 -0500
committerGitHub <noreply@github.com>2026-02-04 16:20:35 -0500
commitc4b913d9da37558daebfa9a1abf5b52539f3ea22 (patch)
treef7281ebf71717332c1eb32a41a3d082244e79718 /Source/Core/Common/MemArenaUnix.cpp
parent64d40316d03d231d3ab8a27c51702a0a3cb8ba9f (diff)
parent35ce08fb888036de48b220ee4d3b2dab5cf65a0f (diff)
Merge pull request #13768 from JosJuice/page-table-fastmem-2
Core: Create fastmem mappings for page address translation
Diffstat (limited to 'Source/Core/Common/MemArenaUnix.cpp')
-rw-r--r--Source/Core/Common/MemArenaUnix.cpp25
1 files changed, 23 insertions, 2 deletions
diff --git a/Source/Core/Common/MemArenaUnix.cpp b/Source/Core/Common/MemArenaUnix.cpp
index c25d2357f9..fd4af4e74b 100644
--- a/Source/Core/Common/MemArenaUnix.cpp
+++ b/Source/Core/Common/MemArenaUnix.cpp
@@ -87,9 +87,13 @@ void MemArena::ReleaseMemoryRegion()
}
}
-void* MemArena::MapInMemoryRegion(s64 offset, size_t size, void* base)
+void* MemArena::MapInMemoryRegion(s64 offset, size_t size, void* base, bool writeable)
{
- void* retval = mmap(base, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, m_shm_fd, offset);
+ int prot = PROT_READ;
+ if (writeable)
+ prot |= PROT_WRITE;
+
+ void* retval = mmap(base, size, prot, MAP_SHARED | MAP_FIXED, m_shm_fd, offset);
if (retval == MAP_FAILED)
{
NOTICE_LOG_FMT(MEMMAP, "mmap failed");
@@ -101,6 +105,18 @@ void* MemArena::MapInMemoryRegion(s64 offset, size_t size, void* base)
}
}
+bool MemArena::ChangeMappingProtection(void* view, size_t size, bool writeable)
+{
+ int prot = PROT_READ;
+ if (writeable)
+ prot |= PROT_WRITE;
+
+ int retval = mprotect(view, size, prot);
+ if (retval != 0)
+ NOTICE_LOG_FMT(MEMMAP, "mprotect failed");
+ return retval == 0;
+}
+
void MemArena::UnmapFromMemoryRegion(void* view, size_t size)
{
void* retval = mmap(view, size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
@@ -108,6 +124,11 @@ void MemArena::UnmapFromMemoryRegion(void* view, size_t size)
NOTICE_LOG_FMT(MEMMAP, "mmap failed");
}
+size_t MemArena::GetPageSize() const
+{
+ return sysconf(_SC_PAGESIZE);
+}
+
LazyMemoryRegion::LazyMemoryRegion() = default;
LazyMemoryRegion::~LazyMemoryRegion()