aboutsummaryrefslogtreecommitdiff
path: root/frontend/3ds/utils.S
diff options
context:
space:
mode:
authorJustin Weiss2020-02-24 17:47:14 -0800
committerJustin Weiss2020-02-24 20:04:58 -0800
commitb37c639ee018ef6403859952fd459fe8073313d3 (patch)
treee7ae2baefbc11ac89b25240fb505441e18702a5b /frontend/3ds/utils.S
parent28d1bea2e828cd079593abc8c97ea6ff4fd7d4f4 (diff)
downloadpcsx_rearmed-b37c639ee018ef6403859952fd459fe8073313d3.tar.gz
pcsx_rearmed-b37c639ee018ef6403859952fd459fe8073313d3.tar.bz2
pcsx_rearmed-b37c639ee018ef6403859952fd459fe8073313d3.zip
Fix dynarec crashes on 3DS
After the dynarec writes new instructions, it has to flush the instruction and data caches. Some of these flush operations are privileged on the 3DS, so the clear cache functions have to run through svcBackdoor. The Nintendo implementation (and CFW reimplementation) of svcBackdoor has a problem where interrupts and context switches will cause crashes. Even though we can disable interrupts in the flush function, there's still a window of time between svcBackdoor being called and the function being run where an interrupt will corrupt the stack. Luma3DS implemements a svcCustomBackdoor call we can use that also runs a function in supervisor mode, but uses an implementation that avoids this problem.
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