X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=frontend%2F3ds%2Fsys%2Fmman.h;h=fdf5ac6a91dc908a2fdd79534d6534299356eaff;hb=81574accf59f445626568ec6b4388d887ddc8595;hp=fae16245a0e8f020418b0bd3a45776887045b163;hpb=e87329f47e398760890e8d02a343782fe766728f;p=pcsx_rearmed.git diff --git a/frontend/3ds/sys/mman.h b/frontend/3ds/sys/mman.h index fae16245..fdf5ac6a 100644 --- a/frontend/3ds/sys/mman.h +++ b/frontend/3ds/sys/mman.h @@ -5,44 +5,78 @@ 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; @@ -54,7 +88,20 @@ static inline int mprotect(void *addr, size_t len, int prot) static inline int munmap(void *addr, size_t len) { - free(addr); + 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; }