aboutsummaryrefslogtreecommitdiff
path: root/frontend
diff options
context:
space:
mode:
authoraliaspider2016-01-16 17:47:28 +0100
committeraliaspider2016-01-16 17:47:28 +0100
commitf72db18e0c39a5bf115f493767decc409e10f94a (patch)
treea88f156055799bd78dafd7423440ec6a429be016 /frontend
parent0c840ff34defe22147f497c33e0ebad9386fada6 (diff)
downloadpcsx_rearmed-f72db18e0c39a5bf115f493767decc409e10f94a.tar.gz
pcsx_rearmed-f72db18e0c39a5bf115f493767decc409e10f94a.tar.bz2
pcsx_rearmed-f72db18e0c39a5bf115f493767decc409e10f94a.zip
(3DS) - remove provileged services enabling code, it should be done by
the frontend instead. - dynamically allocate the recompiler cache, this will allow using the recompiler even when the .bss section is relocated far from the .text section (for example when using the hombrew loader).
Diffstat (limited to 'frontend')
-rw-r--r--frontend/3ds/3ds_utils.c74
-rw-r--r--frontend/3ds/3ds_utils.h60
-rw-r--r--frontend/3ds/pthread.h16
-rw-r--r--frontend/3ds/sys/mman.h69
-rw-r--r--frontend/libretro.c15
5 files changed, 124 insertions, 110 deletions
diff --git a/frontend/3ds/3ds_utils.c b/frontend/3ds/3ds_utils.c
deleted file mode 100644
index c415d37..0000000
--- a/frontend/3ds/3ds_utils.c
+++ /dev/null
@@ -1,74 +0,0 @@
-
-#include "3ds.h"
-#include "3ds_utils.h"
-
-typedef s32 (*ctr_callback_type)(void);
-
-static void ctr_enable_all_svc_kernel(void)
-{
- __asm__ volatile("cpsid aif");
-
- u32* svc_access_control = *(*(u32***)0xFFFF9000 + 0x22) - 0x6;
-
- svc_access_control[0]=0xFFFFFFFE;
- svc_access_control[1]=0xFFFFFFFF;
- svc_access_control[2]=0xFFFFFFFF;
- svc_access_control[3]=0x3FFFFFFF;
-}
-
-
-static void ctr_invalidate_ICache_kernel(void)
-{
- __asm__ volatile(
- "cpsid aif\n\t"
- "mov r0, #0\n\t"
- "mcr p15, 0, r0, c7, c5, 0\n\t");
-}
-
-static void ctr_flush_DCache_kernel(void)
-{
- __asm__ volatile(
- "cpsid aif\n\t"
- "mov r0, #0\n\t"
- "mcr p15, 0, r0, c7, c10, 0\n\t");
-
-}
-
-
-static void ctr_enable_all_svc(void)
-{
- svcBackdoor((ctr_callback_type)ctr_enable_all_svc_kernel);
-}
-
-void ctr_invalidate_ICache(void)
-{
-// __asm__ volatile("svc 0x2E\n\t");
- svcBackdoor((ctr_callback_type)ctr_invalidate_ICache_kernel);
-
-}
-
-void ctr_flush_DCache(void)
-{
-// __asm__ volatile("svc 0x4B\n\t");
- svcBackdoor((ctr_callback_type)ctr_flush_DCache_kernel);
-}
-
-
-void ctr_flush_invalidate_cache(void)
-{
- ctr_flush_DCache();
- ctr_invalidate_ICache();
-}
-
-int ctr_svchack_init(void)
-{
- extern unsigned int __service_ptr;
-
- if(__service_ptr)
- return 0;
-
- /* CFW */
- ctr_enable_all_svc();
- return 1;
-}
-
diff --git a/frontend/3ds/3ds_utils.h b/frontend/3ds/3ds_utils.h
index fe97985..3d50a66 100644
--- a/frontend/3ds/3ds_utils.h
+++ b/frontend/3ds/3ds_utils.h
@@ -1,16 +1,66 @@
#ifndef _3DS_UTILS_H
#define _3DS_UTILS_H
-void ctr_invalidate_ICache(void);
-void ctr_flush_DCache(void);
+#include <stdio.h>
-void ctr_flush_invalidate_cache(void);
+#define MEMOP_PROT 6
+#define MEMOP_MAP 4
+#define MEMOP_UNMAP 5
-int ctr_svchack_init(void);
+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 svcCreateThread(int32_t* thread, void *(*entrypoint)(void*), void* arg, void* stack_top, int32_t thread_priority, int32_t processor_id);
+int32_t svcWaitSynchronization(int32_t handle, int64_t nanoseconds);
+void svcExitThread(void) __attribute__((noreturn));
+
+int32_t svcBackdoor(int32_t (*callback)(void));
-#include <stdio.h>
#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;
+
+typedef int32_t (*ctr_callback_type)(void);
+
+static inline void ctr_invalidate_ICache_kernel(void)
+{
+ __asm__ volatile(
+ "cpsid aif\n\t"
+ "mov r0, #0\n\t"
+ "mcr p15, 0, r0, c7, c5, 0\n\t");
+}
+
+static inline void ctr_flush_DCache_kernel(void)
+{
+ __asm__ volatile(
+ "cpsid aif\n\t"
+ "mov r0, #0\n\t"
+ "mcr p15, 0, r0, c7, c10, 0\n\t");
+}
+
+static inline void ctr_invalidate_ICache(void)
+{
+ svcBackdoor((ctr_callback_type)ctr_invalidate_ICache_kernel);
+}
+
+static inline void ctr_flush_DCache(void)
+{
+ svcBackdoor((ctr_callback_type)ctr_flush_DCache_kernel);
+}
+
+
+static inline void ctr_flush_invalidate_cache(void)
+{
+ ctr_flush_DCache();
+ ctr_invalidate_ICache();
+}
+
+
#endif // _3DS_UTILS_H
diff --git a/frontend/3ds/pthread.h b/frontend/3ds/pthread.h
index 56d9085..2c2bf6b 100644
--- a/frontend/3ds/pthread.h
+++ b/frontend/3ds/pthread.h
@@ -2,18 +2,18 @@
#ifndef _3DS_PTHREAD_WRAP__
#define _3DS_PTHREAD_WRAP__
-#include "3ds.h"
-#include "stdlib.h"
-#include "string.h"
-#include "stdio.h"
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "3ds_utils.h"
#define CTR_PTHREAD_STACK_SIZE 0x10000
typedef struct
{
- Handle handle;
- u32* stack;
+ int32_t handle;
+ uint32_t* stack;
}pthread_t;
typedef int pthread_attr_t;
@@ -23,8 +23,8 @@ static inline int pthread_create(pthread_t *thread,
thread->stack = linearMemAlign(CTR_PTHREAD_STACK_SIZE, 8);
- svcCreateThread(&thread->handle, (ThreadFunc)start_routine,arg,
- (u32*)((u32)thread->stack + CTR_PTHREAD_STACK_SIZE),
+ svcCreateThread(&thread->handle, start_routine, arg,
+ (uint32_t*)((uint32_t)thread->stack + CTR_PTHREAD_STACK_SIZE),
0x25, 1);
return 1;
diff --git a/frontend/3ds/sys/mman.h b/frontend/3ds/sys/mman.h
index fae1624..e295b89 100644
--- a/frontend/3ds/sys/mman.h
+++ b/frontend/3ds/sys/mman.h
@@ -5,28 +5,58 @@
extern "C" {
#endif
-#include "3ds.h"
-#include "stdlib.h"
-#include "stdio.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <malloc.h>
-#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;
+ if((prot == (PROT_READ | PROT_WRITE | PROT_EXEC)) &&
+ (flags == (MAP_FIXED | 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);
+
+ 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 = malloc(len);
if(!addr_out)
return MAP_FAILED;
@@ -36,13 +66,11 @@ static inline void* mmap(void *addr, size_t len, int prot, int flags, int fd, of
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(&currentHandle, 0xFFFF8001);
- svcControlProcessMemory(currentHandle, (u32)addr, 0x0,
+ svcControlProcessMemory(currentHandle, addr, NULL,
len, MEMOP_PROT, prot);
svcCloseHandle(currentHandle);
return 0;
@@ -54,7 +82,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(&currentHandle, 0xFFFF8001);
+ svcControlProcessMemory(currentHandle,
+ dynarec_cache, dynarec_cache_mapping,
+ len, MEMOP_UNMAP, 0b111);
+ svcCloseHandle(currentHandle);
+ dynarec_cache_mapping = NULL;
+
+ }
+ else
+ free(addr);
+
return 0;
}
diff --git a/frontend/libretro.c b/frontend/libretro.c
index aaeb624..a9b6e43 100644
--- a/frontend/libretro.c
+++ b/frontend/libretro.c
@@ -29,9 +29,7 @@
#include "libretro.h"
#ifdef _3DS
-#include "3ds.h"
#include "3ds/3ds_utils.h"
-int ctr_svchack_init_success = 0;
#endif
static retro_video_refresh_t video_cb;
@@ -194,7 +192,7 @@ void* pl_3ds_mmap(unsigned long addr, size_t size, int is_fixed,
(void)is_fixed;
(void)addr;
- if (ctr_svchack_init_success)
+ if (__ctr_svchax)
{
psx_map_t* custom_map = custom_psx_maps;
@@ -207,7 +205,7 @@ void* pl_3ds_mmap(unsigned long addr, size_t size, int is_fixed,
custom_map->buffer = malloc(size + 0x1000);
ptr_aligned = (((u32)custom_map->buffer) + 0xFFF) & ~0xFFF;
- if(svcControlMemory(&tmp, custom_map->target_map, ptr_aligned, size, MEMOP_MAP, 0x3) < 0)
+ if(svcControlMemory(&tmp, (void*)custom_map->target_map, (void*)ptr_aligned, size, MEMOP_MAP, 0x3) < 0)
{
SysPrintf("could not map memory @0x%08X\n", custom_map->target_map);
exit(1);
@@ -225,7 +223,7 @@ void pl_3ds_munmap(void *ptr, size_t size, enum psxMapTag tag)
{
(void)tag;
- if (ctr_svchack_init_success)
+ if (__ctr_svchax)
{
psx_map_t* custom_map = custom_psx_maps;
@@ -237,7 +235,7 @@ void pl_3ds_munmap(void *ptr, size_t size, enum psxMapTag tag)
ptr_aligned = (((u32)custom_map->buffer) + 0xFFF) & ~0xFFF;
- svcControlMemory(&tmp, custom_map->target_map, ptr_aligned, size, MEMOP_UNMAP, 0x3);
+ svcControlMemory(&tmp, (void*)custom_map->target_map, (void*)ptr_aligned, size, MEMOP_UNMAP, 0x3);
free(custom_map->buffer);
custom_map->buffer = NULL;
@@ -1139,7 +1137,7 @@ static void update_variables(bool in_flight)
R3000Acpu *prev_cpu = psxCpu;
#ifdef _3DS
- if(!ctr_svchack_init_success)
+ if(!__ctr_svchax)
Config.Cpu = CPU_INTERPRETER;
else
#endif
@@ -1385,14 +1383,13 @@ void retro_init(void)
bool found_bios = false;
#ifdef _3DS
- ctr_svchack_init_success = ctr_svchack_init();
psxMapHook = pl_3ds_mmap;
psxUnmapHook = pl_3ds_munmap;
#endif
ret = emu_core_preinit();
#ifdef _3DS
/* emu_core_preinit sets the cpu to dynarec */
- if(!ctr_svchack_init_success)
+ if(!__ctr_svchax)
Config.Cpu = CPU_INTERPRETER;
#endif
ret |= emu_core_init();