libnx port

This commit is contained in:
natinusala 2018-09-29 22:46:38 +02:00
parent 2db90628f5
commit 1909421bb2
4 changed files with 141 additions and 0 deletions

1
.gitignore vendored
View File

@ -27,3 +27,4 @@ obj/
.opk_data
PicoDrive
PicoDrive.opk
*.a

View File

@ -382,6 +382,17 @@ else ifeq ($(platform), switch)
NO_MMAP = 1
ARCH = aarch64
# Nintendo Switch (libnx)
else ifeq ($(platform), libnx)
include $(DEVKITPRO)/libnx/switch_rules
TARGET := $(TARGET_NAME)_libretro_$(platform).a
ARCH := arm64
CFLAGS += -O3 -fomit-frame-pointer -ffast-math -I$(DEVKITPRO)/libnx/include/ -fPIE -Wl,--allow-multiple-definition
CFLAGS += -specs=$(DEVKITPRO)/libnx/switch.specs
CFLAGS += -D__SWITCH__ -DHAVE_LIBNX
CFLAGS += -DARM -D__aarch64__=1 -march=armv8-a -mtune=cortex-a57 -mtp=soft -ffast-math -mcpu=cortex-a57+crc+fp+simd -ffunction-sections
CFLAGS += -Ifrontend/switch -ftree-vectorize
STATIC_LINKING=1
# QNX
else ifeq ($(platform), qnx)

View File

@ -15,8 +15,12 @@
#include <string.h>
#ifndef _WIN32
#ifndef NO_MMAP
#ifdef __SWITCH__
#include "../switch/mman.h"
#else
#include <sys/mman.h>
#endif
#endif
#else
#include <io.h>
#include <windows.h>

125
platform/switch/mman.h Normal file
View File

@ -0,0 +1,125 @@
#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(&currentHandle, 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(&currentHandle, 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(&currentHandle, 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