ctr/3ds: attempt to improve cache flushing
[picodrive.git] / platform / libretro / 3ds / 3ds_utils.c
1
2 #include "3ds_utils.h"
3
4 typedef int (*ctr_callback_type)(void);
5
6 int srvGetServiceHandle(unsigned int* out, const char* name);
7 int svcCloseHandle(unsigned int handle);
8 int svcBackdoor(ctr_callback_type);
9
10
11 static 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
23 static void ctr_enable_all_svc(void)
24 {
25    svcBackdoor((ctr_callback_type)ctr_enable_all_svc_kernel);
26 }
27
28 static void ctr_clean_invalidate_kernel(void)
29 {
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");
39 }
40
41 void ctr_flush_invalidate_cache(void)
42 {
43 //   __asm__ volatile("svc 0x2E\n\t");
44 //   __asm__ volatile("svc 0x4B\n\t");
45    svcBackdoor((ctr_callback_type)ctr_clean_invalidate_kernel);
46 }
47
48 int 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