From 31f52a9f9ab5c7090f67cb6a80bac09bbb47dbf2 Mon Sep 17 00:00:00 2001 From: Justin Weiss Date: Mon, 17 Aug 2020 19:19:21 -0700 Subject: [PATCH] [3DS] Support latest libctru --- Makefile.libretro | 4 +-- frontend/3ds/3ds_utils.h | 35 ++-------------------- frontend/3ds/pthread.h | 63 ++++++++++++++++++++++++++-------------- 3 files changed, 46 insertions(+), 56 deletions(-) diff --git a/Makefile.libretro b/Makefile.libretro index 79732b11..625972a4 100644 --- a/Makefile.libretro +++ b/Makefile.libretro @@ -208,9 +208,9 @@ else ifeq ($(platform), ctr) AR = $(DEVKITARM)/bin/arm-none-eabi-ar$(EXE_EXT) CFLAGS += -DARM11 -D_3DS -DNO_OS -DNO_DYLIB -DNO_SOCKET -DGPU_UNAI_USE_FLOATMATH -DGPU_UNAI_USE_FLOAT_DIV_MULTINV CFLAGS += -march=armv6k -mtune=mpcore -mfloat-abi=hard -marm -mfpu=vfp -mtp=soft - CFLAGS += -Wall -mword-relocations + CFLAGS += -Wall -mword-relocations -fcommon CFLAGS += -fomit-frame-pointer -ffast-math -funroll-loops - CFLAGS += -Ifrontend/3ds + CFLAGS += -Ifrontend/3ds -I$(CTRULIB)/include CFLAGS += -Werror=implicit-function-declaration OBJS += frontend/3ds/utils.o diff --git a/frontend/3ds/3ds_utils.h b/frontend/3ds/3ds_utils.h index c9b9d7f4..7f5c64aa 100644 --- a/frontend/3ds/3ds_utils.h +++ b/frontend/3ds/3ds_utils.h @@ -3,50 +3,19 @@ #include #include +#include <3ds.h> #define MEMOP_PROT 6 #define MEMOP_MAP 4 #define MEMOP_UNMAP 5 -#define GET_VERSION_MAJOR(version) ((version) >>24) - -void* linearMemAlign(size_t size, size_t alignment); -void linearFree(void* mem); - -int32_t svcDuplicateHandle(uint32_t* out, uint32_t original); -int32_t svcCloseHandle(uint32_t handle); -int32_t svcControlMemory(void* addr_out, void* addr0, void* addr1, uint32_t size, uint32_t op, uint32_t perm); -int32_t svcControlProcessMemory(uint32_t process, void* addr0, void* addr1, uint32_t size, uint32_t op, uint32_t perm); - -int32_t threadCreate(void *(*entrypoint)(void*), void* arg, size_t stack_size, int32_t prio, int32_t affinity, bool detached); -int32_t threadJoin(int32_t thread, int64_t timeout_ns); -void threadFree(int32_t thread); -void threadExit(int32_t rc) __attribute__((noreturn)); - -int32_t svcGetSystemInfo(int64_t* out, uint32_t type, int32_t param); - -int32_t svcCreateSemaphore(uint32_t *sem, int32_t initial_count, uint32_t max_count); -int32_t svcReleaseSemaphore(int32_t *count, uint32_t sem, int32_t release_count); -int32_t svcWaitSynchronization(uint32_t handle, int64_t nanoseconds); - -typedef int32_t LightLock; - -void LightLock_Init(LightLock* lock); -void LightLock_Lock(LightLock* lock); -int LightLock_TryLock(LightLock* lock); -void LightLock_Unlock(LightLock* lock); - -int32_t APT_CheckNew3DS(bool *out); - -int32_t svcBackdoor(int32_t (*callback)(void)); - #define DEBUG_HOLD() do{printf("%s@%s:%d.\n",__FUNCTION__, __FILE__, __LINE__);fflush(stdout);wait_for_input();}while(0) void wait_for_input(void); extern __attribute__((weak)) int __ctr_svchax; -bool has_rosalina; +static bool has_rosalina; static void check_rosalina() { int64_t version; diff --git a/frontend/3ds/pthread.h b/frontend/3ds/pthread.h index cc3c9654..4c58fe5e 100644 --- a/frontend/3ds/pthread.h +++ b/frontend/3ds/pthread.h @@ -11,20 +11,26 @@ #define CTR_PTHREAD_STACK_SIZE 0x10000 #define FALSE 0 -typedef int32_t pthread_t; -typedef int pthread_attr_t; - -typedef LightLock pthread_mutex_t; -typedef int pthread_mutexattr_t; - typedef struct { uint32_t semaphore; LightLock lock; uint32_t waiting; -} pthread_cond_t; +} cond_t; + +#if !defined(PTHREAD_SCOPE_PROCESS) +/* An earlier version of devkitARM does not define the pthread types. Can remove in r54+. */ + +typedef uint32_t pthread_t; +typedef int pthread_attr_t; +typedef LightLock pthread_mutex_t; +typedef int pthread_mutexattr_t; + +typedef uint32_t pthread_cond_t; typedef int pthread_condattr_t; +#endif + static inline int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg) { @@ -80,41 +86,56 @@ static inline int pthread_mutex_destroy(pthread_mutex_t *mutex) { } static inline int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr) { - if (svcCreateSemaphore(&cond->semaphore, 0, 1)) + cond_t *cond_data = calloc(1, sizeof(cond_t)); + if (!cond_data) goto error; - LightLock_Init(&cond->lock); - cond->waiting = 0; + if (svcCreateSemaphore(&cond_data->semaphore, 0, 1)) + goto error; + + LightLock_Init(&cond_data->lock); + cond_data->waiting = 0; + *cond = cond_data; return 0; error: - svcCloseHandle(cond->semaphore); + svcCloseHandle(cond_data->semaphore); + if (cond_data) + free(cond_data); return -1; } static inline int pthread_cond_signal(pthread_cond_t *cond) { int32_t count; - LightLock_Lock(&cond->lock); - if (cond->waiting) { - cond->waiting--; - svcReleaseSemaphore(&count, cond->semaphore, 1); + cond_t *cond_data = (cond_t *)*cond; + LightLock_Lock(&cond_data->lock); + if (cond_data->waiting) { + cond_data->waiting--; + svcReleaseSemaphore(&count, cond_data->semaphore, 1); } - LightLock_Unlock(&cond->lock); + LightLock_Unlock(&cond_data->lock); return 0; } static inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *lock) { - LightLock_Lock(&cond->lock); - cond->waiting++; + cond_t *cond_data = (cond_t *)*cond; + LightLock_Lock(&cond_data->lock); + cond_data->waiting++; LightLock_Unlock(lock); - LightLock_Unlock(&cond->lock); - svcWaitSynchronization(cond->semaphore, INT64_MAX); + LightLock_Unlock(&cond_data->lock); + svcWaitSynchronization(cond_data->semaphore, INT64_MAX); LightLock_Lock(lock); return 0; } static inline int pthread_cond_destroy(pthread_cond_t *cond) { - svcCloseHandle(cond->semaphore); + if (*cond) { + cond_t *cond_data = (cond_t *)*cond; + + svcCloseHandle(cond_data->semaphore); + free(*cond); + } + *cond = 0; return 0; } -- 2.39.2