X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=frontend%2F3ds%2Fsys%2Fmman.h;h=fdf5ac6a91dc908a2fdd79534d6534299356eaff;hb=323d7f3571b8bdc4371c69c3276e66b0ec6accae;hp=c93b13b3289bccd732d6300d7fd281d8cca7ea7e;hpb=fc99395c2d7efbbaa0663feed47dc89a54e49506;p=pcsx_rearmed.git diff --git a/frontend/3ds/sys/mman.h b/frontend/3ds/sys/mman.h index c93b13b3..fdf5ac6a 100644 --- a/frontend/3ds/sys/mman.h +++ b/frontend/3ds/sys/mman.h @@ -5,57 +5,104 @@ extern "C" { #endif -#include "3ds.h" -#include "stdlib.h" -#include "stdio.h" +#include +#include +#include +#include +#include -#define PROT_READ MEMPERM_READ -#define PROT_WRITE MEMPERM_WRITE -#define PROT_EXEC MEMPERM_EXECUTE +#include "3ds_utils.h" + +#define PROT_READ 0b001 +#define PROT_WRITE 0b010 +#define PROT_EXEC 0b100 #define MAP_PRIVATE 2 +#define MAP_FIXED 0x10 #define MAP_ANONYMOUS 0x20 #define MAP_FAILED ((void *)-1) +static void* dynarec_cache = NULL; +static void* dynarec_cache_mapping = NULL; + static inline void* mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset) { - (void)addr; - (void)prot; - (void)flags; (void)fd; (void)offset; void* addr_out; - addr_out = malloc(len); - if(!addr_out) + if((prot == (PROT_READ | PROT_WRITE | PROT_EXEC)) && + (flags == (MAP_PRIVATE | MAP_ANONYMOUS))) + { + if(__ctr_svchax) + { + /* this hack works only for pcsx_rearmed */ + uint32_t currentHandle; + + if (!dynarec_cache) { + dynarec_cache = memalign(0x1000, len); + if (!dynarec_cache) + return MAP_FAILED; + } + + svcDuplicateHandle(¤tHandle, 0xFFFF8001); + svcControlProcessMemory(currentHandle, addr, dynarec_cache, + len, MEMOP_MAP, prot); + svcCloseHandle(currentHandle); + dynarec_cache_mapping = addr; + memset(addr, 0, len); + 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; + memset(addr_out, 0, len); return addr_out; } static inline int mprotect(void *addr, size_t len, int prot) { - extern int ctr_svchack_init_success; - - if(ctr_svchack_init_success) + if(__ctr_svchax) { uint32_t currentHandle; svcDuplicateHandle(¤tHandle, 0xFFFF8001); - svcControlProcessMemory(currentHandle, (u32)addr, 0x0, + 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) { - free(addr); - return 0; + if((addr == dynarec_cache_mapping) && __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