From 12367ad02622ba0e6457a7bea7b859bcf85ecb46 Mon Sep 17 00:00:00 2001 From: negativeExponent Date: Tue, 17 Dec 2019 01:10:56 +0800 Subject: Update --- frontend/switch/sys/mman.h | 125 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 frontend/switch/sys/mman.h (limited to 'frontend/switch/sys') diff --git a/frontend/switch/sys/mman.h b/frontend/switch/sys/mman.h new file mode 100644 index 0000000..5e8d22e --- /dev/null +++ b/frontend/switch/sys/mman.h @@ -0,0 +1,125 @@ +#ifndef MMAN_H +#define MMAN_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include + +//#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)fd; + (void)offset; + + //void* addr_out; + Result rc = svcMapPhysicalMemory(addr, len); + if (R_FAILED(rc)) + { + printf("mmap failed\n"); + return malloc(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) +{ + Result rc = svcUnmapPhysicalMemory(addr, len); + if (R_FAILED(rc)) + { + 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 +}; +#endif + +#endif // MMAN_H + -- cgit v1.2.3