aboutsummaryrefslogtreecommitdiff
path: root/frontend/3ds/utils.S
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/3ds/utils.S')
-rw-r--r--frontend/3ds/utils.S25
1 files changed, 25 insertions, 0 deletions
diff --git a/frontend/3ds/utils.S b/frontend/3ds/utils.S
new file mode 100644
index 0000000..c8df651
--- /dev/null
+++ b/frontend/3ds/utils.S
@@ -0,0 +1,25 @@
+ .text
+ .arm
+ .balign 4
+
+ .func ctr_clear_cache_kernel
+ctr_clear_cache_kernel:
+ cpsid aif
+ mov r0, #0
+ mcr p15, 0, r0, c7, c10, 0 @ Clean entire data cache
+ mcr p15, 0, r0, c7, c10, 5 @ Data Memory Barrier
+ mcr p15, 0, r0, c7, c5, 0 @ Invalidate entire instruction cache / Flush BTB
+ mcr p15, 0, r0, c7, c10, 4 @ Data Sync Barrier
+ bx lr
+ .endfunc
+
+ @@ Clear the entire data cache / invalidate the instruction cache. Uses
+ @@ Rosalina svcCustomBackdoor to avoid svcBackdoor stack corruption
+ @@ during interrupts.
+ .global ctr_clear_cache
+ .func ctr_clear_cache
+ctr_clear_cache:
+ ldr r0, =ctr_clear_cache_kernel
+ svc 0x80 @ svcCustomBackdoor
+ bx lr
+ .endfunc