From 13da5a82ccecb407bb7060c9e6b54353d71d0758 Mon Sep 17 00:00:00 2001 From: Kravickas Date: Sun, 5 Apr 2026 18:44:09 +0200 Subject: [PATCH] protect (#4212) Protection change may override page fault tracking set by the GPU buffer cache. Invalidate so the cache re-uploads and re-tracks. --- src/core/libraries/kernel/memory.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/core/libraries/kernel/memory.cpp b/src/core/libraries/kernel/memory.cpp index 378064e44..f0b7df4c9 100644 --- a/src/core/libraries/kernel/memory.cpp +++ b/src/core/libraries/kernel/memory.cpp @@ -339,7 +339,11 @@ s32 PS4_SYSV_ABI sceKernelMprotect(const void* addr, u64 size, s32 prot) { Core::MemoryManager* memory_manager = Core::Memory::Instance(); Core::MemoryProt protection_flags = static_cast(prot); - return memory_manager->Protect(aligned_addr, aligned_size, protection_flags); + s32 result = memory_manager->Protect(aligned_addr, aligned_size, protection_flags); + if (result == ORBIS_OK) { + memory_manager->InvalidateMemory(aligned_addr, aligned_size); + } + return result; } s32 PS4_SYSV_ABI posix_mprotect(const void* addr, u64 size, s32 prot) { @@ -370,6 +374,7 @@ s32 PS4_SYSV_ABI sceKernelMtypeprotect(const void* addr, u64 size, s32 mtype, s3 s32 result = memory_manager->Protect(aligned_addr, aligned_size, protection_flags); if (result == ORBIS_OK) { memory_manager->SetDirectMemoryType(aligned_addr, aligned_size, mtype); + memory_manager->InvalidateMemory(aligned_addr, aligned_size); } return result; }