Fix dynarec crashes on 3DS
authorJustin Weiss <justin@justinweiss.com>
Tue, 25 Feb 2020 01:47:14 +0000 (17:47 -0800)
committerJustin Weiss <justin@justinweiss.com>
Tue, 25 Feb 2020 04:04:58 +0000 (20:04 -0800)
commitb37c639ee018ef6403859952fd459fe8073313d3
treee7ae2baefbc11ac89b25240fb505441e18702a5b
parent28d1bea2e828cd079593abc8c97ea6ff4fd7d4f4
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.
Makefile.libretro
frontend/3ds/3ds_utils.h
frontend/3ds/utils.S [new file with mode: 0644]
libpcsxcore/new_dynarec/new_dynarec.c