mirror of
				https://github.com/RaySollium99/picodrive.git
				synced 2025-10-27 21:48:50 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			125 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef MMAN_H
 | |
| #define MMAN_H
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C"
 | |
| {
 | |
| #endif
 | |
| 
 | |
| #include <stdlib.h>
 | |
| #include <stdio.h>
 | |
| #include <stdint.h>
 | |
| #include <malloc.h>
 | |
| #include <switch.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| //#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
 | 
