3ds: only invalidate icache on non-compiler core
authornotaz <notasas@gmail.com>
Fri, 25 Oct 2024 19:25:09 +0000 (22:25 +0300)
committernotaz <notasas@gmail.com>
Fri, 25 Oct 2024 19:25:09 +0000 (22:25 +0300)
seems enough, or is it?

frontend/3ds/3ds_utils.h
frontend/3ds/utils.S
libpcsxcore/new_dynarec/emu_if.c

index bde9c49..5c5ad3c 100644 (file)
@@ -14,7 +14,7 @@
 void wait_for_input(void);
 void ctr_clear_cache(void);
 void ctr_clear_cache_range(void *start, void *end);
-//void ctr_invalidate_icache(void); // only icache
+void ctr_invalidate_icache(void); // only icache
 
 extern __attribute__((weak)) int  __ctr_svchax;
 
index 6f7a6a2..be4eb97 100644 (file)
@@ -61,13 +61,14 @@ ctr_clear_cache_range:
   bx lr
   .endfunc
 
-#if 0
   .func ctr_invalidate_icache_kernel
 ctr_invalidate_icache_kernel:
+  mrs r3, cpsr
   cpsid aif
   mov r0, #0
   mcr p15, 0, r0, c7, c10, 4    @ Data Sync Barrier
   mcr p15, 0, r0, c7, c5, 0     @ Invalidate entire instruction cache / Flush BTB
+  msr cpsr, r3
   bx lr
   .endfunc
 
@@ -78,4 +79,3 @@ ctr_invalidate_icache:
   svc 0x80                      @ svcCustomBackdoor
   bx lr
   .endfunc
-#endif
index 8ebf274..62e984b 100644 (file)
@@ -320,7 +320,7 @@ static void clear_local_cache(void)
 #ifdef _3DS
        if (ndrc_g.thread.cache_dirty) {
                ndrc_g.thread.cache_dirty = 0;
-               ctr_clear_cache();
+               ctr_invalidate_icache();
        }
 #else
        // hopefully nothing is needed, as tested on r-pi4 and switch