diff options
| author | JosJuice <josjuice@gmail.com> | 2025-08-02 20:52:48 +0200 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2026-02-04 21:35:22 +0100 |
| commit | 0ce95299f6f16b7994592900bd3efc1849c58845 (patch) | |
| tree | f8555621a737ddff0c0590555b2c68abf84b0ff7 /Source/Core/Common/MemArenaAndroid.cpp | |
| parent | 9462e9d8906feab8f82d5593fe4f42345ae55fc8 (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.cpp | 20 |
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); |
