12 #include "3ds_utils.h"
14 #define PROT_READ 0b001
15 #define PROT_WRITE 0b010
16 #define PROT_EXEC 0b100
18 #define MAP_FIXED 0x10
19 #define MAP_ANONYMOUS 0x20
21 #define MAP_FAILED ((void *)-1)
23 void SysPrintf(const char *fmt, ...);
26 static void* dynarec_cache = NULL;
27 static void* dynarec_cache_mapping = NULL;
29 static inline void* mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)
36 if((prot == (PROT_READ | PROT_WRITE | PROT_EXEC)) &&
37 (flags == (MAP_PRIVATE | MAP_ANONYMOUS)))
41 /* this hack works only for pcsx_rearmed */
42 uint32_t currentHandle;
45 dynarec_cache = memalign(0x1000, len);
50 svcDuplicateHandle(¤tHandle, 0xFFFF8001);
51 svcControlProcessMemory(currentHandle, (uintptr_t)addr, (uintptr_t)dynarec_cache,
52 len, MEMOP_MAP, prot);
53 svcCloseHandle(currentHandle);
54 dynarec_cache_mapping = addr;
60 printf("tried to mmap RWX pages without svcControlProcessMemory access !\n");
66 addr_out = memalign(0x1000, len);
70 memset(addr_out, 0, len);
74 static inline int munmap(void *addr, size_t len)
76 if((addr == dynarec_cache_mapping) && __ctr_svchax)
78 uint32_t currentHandle;
79 svcDuplicateHandle(¤tHandle, 0xFFFF8001);
80 svcControlProcessMemory(currentHandle,
81 (uintptr_t)dynarec_cache, (uintptr_t)dynarec_cache_mapping,
82 len, MEMOP_UNMAP, 0b111);
83 svcCloseHandle(currentHandle);
84 dynarec_cache_mapping = NULL;
94 static inline int mprotect(void *addr, size_t len, int prot)
98 uint32_t currentHandle = 0;
100 svcDuplicateHandle(¤tHandle, 0xFFFF8001);
101 r = svcControlProcessMemory(currentHandle, (uintptr_t)addr, 0,
102 len, MEMOP_PROT, prot);
103 svcCloseHandle(currentHandle);
105 SysPrintf("svcControlProcessMemory failed for %p %u %x: %d\n",
112 SysPrintf("mprotect called without svcControlProcessMemory access!\n");