From 4ef4ac41d1654565aa5f0a975da7ebda84118ba0 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 6 Jun 2021 22:43:38 +0200 Subject: [PATCH] JitArm64: Fix clobbering LR in FakeLKExit Fixes Need for Speed: Carbon accessing invalid memory when branch following and BLR optimization are enabled simultaneously. --- Source/Core/Core/PowerPC/JitArm64/Jit.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.cpp b/Source/Core/Core/PowerPC/JitArm64/Jit.cpp index b606b071ea..b3a6c4e6fd 100644 --- a/Source/Core/Core/PowerPC/JitArm64/Jit.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/Jit.cpp @@ -398,6 +398,7 @@ void JitArm64::FakeLKExit(u32 exit_address_after_return) // We may need to fake the BLR stack on inlined CALL instructions. // Else we can't return to this location any more. + gpr.Lock(ARM64Reg::W30); ARM64Reg after_reg = gpr.GetReg(); ARM64Reg code_reg = gpr.GetReg(); MOVI2R(after_reg, exit_address_after_return); @@ -406,6 +407,7 @@ void JitArm64::FakeLKExit(u32 exit_address_after_return) gpr.Unlock(after_reg, code_reg); FixupBranch skip_exit = BL(); + gpr.Unlock(ARM64Reg::W30); // Write the regular exit node after the return. JitBlock* b = js.curBlock;