From 1534f70a2d09afd68b23fc365d6e10fcb2da2e23 Mon Sep 17 00:00:00 2001 From: notaz Date: Tue, 19 Jul 2022 00:03:44 +0300 Subject: [PATCH] libnx: make mmap act more like on Linux --- frontend/switch/sys/mman.h | 93 ++++++-------------------------------- 1 file changed, 14 insertions(+), 79 deletions(-) diff --git a/frontend/switch/sys/mman.h b/frontend/switch/sys/mman.h index 211e09d5..49fb4454 100644 --- a/frontend/switch/sys/mman.h +++ b/frontend/switch/sys/mman.h @@ -6,13 +6,8 @@ extern "C" { #endif #include -#include -#include -#include +#include #include -#include - -//#include "3ds_utils.h" #define PROT_READ 0b001 #define PROT_WRITE 0b010 @@ -23,98 +18,38 @@ extern "C" { #define MAP_FAILED ((void *)-1) -//static void* dynarec_cache = NULL; -//static void* dynarec_cache_mapping = NULL; +#define ALIGNMENT 0x1000 -static inline void* mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset) +static inline void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset) { - (void)fd; - (void)offset; + (void)fd; + (void)offset; + + // match Linux behavior + len = (len + ALIGNMENT - 1) & ~(ALIGNMENT - 1); - //void* addr_out; Result rc = svcMapPhysicalMemory(addr, len); if (R_FAILED(rc)) { - printf("mmap failed\n"); - return malloc(len); + //printf("mmap failed\n"); + addr = aligned_alloc(ALIGNMENT, len); } + if (addr) + memset(addr, 0, len); return addr; - -// if((prot == (PROT_READ | PROT_WRITE | PROT_EXEC)) && -// (flags == (MAP_PRIVATE | MAP_ANONYMOUS))) -// { -// if(true)// __ctr_svchax) -// { -// /* this hack works only for pcsx_rearmed */ -// uint32_t currentHandle; -// -// if(!dynarec_cache) -// dynarec_cache = memalign(0x1000, len); -// -// //svcDuplicateHandle(¤tHandle, 0xFFFF8001); -// //svcControlProcessMemory(currentHandle, addr, dynarec_cache, -// // len, MEMOP_MAP, prot); -// svcCloseHandle(currentHandle); -// dynarec_cache_mapping = addr; -// return addr; -// } -// else -// { -// printf("tried to mmap RWX pages without svcControlProcessMemory access !\n"); -// return MAP_FAILED; -// } -// -// } - -// addr_out = memalign(0x1000, len); -// if(!addr_out) -// return MAP_FAILED; -// -// return addr_out; -} - -static inline int mprotect(void *addr, size_t len, int prot) -{ - return 0; - //if(true) // __ctr_svchax) - //{ - // uint32_t currentHandle; - // //svcDuplicateHandle(¤tHandle, 0xFFFF8001); - // //svcControlProcessMemory(currentHandle, addr, NULL, - // // len, MEMOP_PROT, prot); - // svcCloseHandle(currentHandle); - // return 0; - //} - - //printf("mprotect called without svcControlProcessMemory access !\n"); - //return -1; } static inline int munmap(void *addr, size_t len) { + len = (len + ALIGNMENT - 1) & ~(ALIGNMENT - 1); Result rc = svcUnmapPhysicalMemory(addr, len); if (R_FAILED(rc)) { - printf("munmap failed\n"); + //printf("munmap failed\n"); free(addr); } return 0; -// if((addr == dynarec_cache_mapping) && true)//__ctr_svchax) -// { -// uint32_t currentHandle; -// //svcDuplicateHandle(¤tHandle, 0xFFFF8001); -// //svcControlProcessMemory(currentHandle, -// // dynarec_cache, dynarec_cache_mapping, -// // len, MEMOP_UNMAP, 0b111); -// svcCloseHandle(currentHandle); -// dynarec_cache_mapping = NULL; -// -// } -// else - free(addr); - - return 0; } #ifdef __cplusplus -- 2.39.2