ctr/3ds: attempt to improve cache flushing
[picodrive.git] / platform / libretro / 3ds / 3ds_utils.c
CommitLineData
7612bf90 1
2#include "3ds_utils.h"
3
4typedef int (*ctr_callback_type)(void);
5
6int srvGetServiceHandle(unsigned int* out, const char* name);
7int svcCloseHandle(unsigned int handle);
8int svcBackdoor(ctr_callback_type);
9
10
11static void ctr_enable_all_svc_kernel(void)
12{
13 __asm__ volatile("cpsid aif");
14
15 unsigned int* svc_access_control = *(*(unsigned int***)0xFFFF9000 + 0x22) - 0x6;
16
17 svc_access_control[0]=0xFFFFFFFE;
18 svc_access_control[1]=0xFFFFFFFF;
19 svc_access_control[2]=0xFFFFFFFF;
20 svc_access_control[3]=0x3FFFFFFF;
21}
22
7612bf90 23static void ctr_enable_all_svc(void)
24{
25 svcBackdoor((ctr_callback_type)ctr_enable_all_svc_kernel);
26}
27
fd587b67 28static void ctr_clean_invalidate_kernel(void)
7612bf90 29{
fd587b67 30 __asm__ volatile(
31 "mrs r1, cpsr\n"
32 "cpsid aif\n" // disable interrupts
33 "mov r0, #0\n"
34 "mcr p15, 0, r0, c7, c10, 0\n" // clean dcache
35 "mcr p15, 0, r0, c7, c10, 4\n" // DSB
36 "mcr p15, 0, r0, c7, c5, 0\n" // invalidate icache+BTAC
37 "msr cpsr_cx, r1\n" // restore interrupts
38 ::: "r0", "r1");
7612bf90 39}
40
7612bf90 41void ctr_flush_invalidate_cache(void)
42{
fd587b67 43// __asm__ volatile("svc 0x2E\n\t");
44// __asm__ volatile("svc 0x4B\n\t");
45 svcBackdoor((ctr_callback_type)ctr_clean_invalidate_kernel);
7612bf90 46}
47
48int ctr_svchack_init(void)
49{
50 extern unsigned int __service_ptr;
51
52 if(__service_ptr)
53 return 0;
54
55 /* CFW */
56 ctr_enable_all_svc();
57 return 1;
58}
59