summaryrefslogtreecommitdiff
path: root/Source/Core/Common/MemArenaAndroid.cpp
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2025-08-02 20:52:48 +0200
committerJosJuice <josjuice@gmail.com>2026-02-04 21:35:22 +0100
commit0ce95299f6f16b7994592900bd3efc1849c58845 (patch)
treef8555621a737ddff0c0590555b2c68abf84b0ff7 /Source/Core/Common/MemArenaAndroid.cpp
parent9462e9d8906feab8f82d5593fe4f42345ae55fc8 (diff)
Core: Don't create page table mappings before R/C bits are set
This gets rid of the hack of setting the R and C bits pessimistically, reversing the performance regression in Rogue Squadron 3.
Diffstat (limited to 'Source/Core/Common/MemArenaAndroid.cpp')
-rw-r--r--Source/Core/Common/MemArenaAndroid.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/Source/Core/Common/MemArenaAndroid.cpp b/Source/Core/Common/MemArenaAndroid.cpp
index 1db5afb91d..81c27b7677 100644
--- a/Source/Core/Common/MemArenaAndroid.cpp
+++ b/Source/Core/Common/MemArenaAndroid.cpp
@@ -123,9 +123,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");
@@ -137,6 +141,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_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0);