Reset RSP after calling Jit in case it cleared the code cache.
This commit is contained in:
parent
e9164247d6
commit
3df935b98e
|
@ -56,10 +56,7 @@ void Jit64AsmRoutineManager::Generate()
|
|||
ABI_PopRegistersAndAdjustStack(1 << RSCRATCH, 0);
|
||||
#endif
|
||||
|
||||
if (m_stack_top)
|
||||
MOV(64, R(RSP), Imm64((u64)m_stack_top - 0x20));
|
||||
else
|
||||
MOV(64, R(RSP), M(&s_saved_rsp));
|
||||
ResetStack();
|
||||
|
||||
SUB(32, PPCSTATE(downcount), R(RSCRATCH));
|
||||
|
||||
|
@ -147,6 +144,9 @@ void Jit64AsmRoutineManager::Generate()
|
|||
ABI_CallFunctionA((void *)&Jit, PPCSTATE(pc));
|
||||
ABI_PopRegistersAndAdjustStack(0, 0);
|
||||
|
||||
// Jit might have cleared the code cache
|
||||
ResetStack();
|
||||
|
||||
JMP(dispatcherNoCheck); // no point in special casing this
|
||||
|
||||
SetJumpTarget(bail);
|
||||
|
@ -168,21 +168,27 @@ void Jit64AsmRoutineManager::Generate()
|
|||
//Landing pad for drec space
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableDebugging)
|
||||
SetJumpTarget(dbg_exit);
|
||||
ResetStack();
|
||||
if (m_stack_top)
|
||||
{
|
||||
MOV(64, R(RSP), Imm64((u64)m_stack_top - 0x8));
|
||||
ADD(64, R(RSP), Imm8(0x18));
|
||||
POP(RSP);
|
||||
}
|
||||
else
|
||||
{
|
||||
MOV(64, R(RSP), M(&s_saved_rsp));
|
||||
}
|
||||
ABI_PopRegistersAndAdjustStack(ABI_ALL_CALLEE_SAVED, 8, 16);
|
||||
RET();
|
||||
|
||||
GenerateCommon();
|
||||
}
|
||||
|
||||
void Jit64AsmRoutineManager::ResetStack()
|
||||
{
|
||||
if (m_stack_top)
|
||||
MOV(64, R(RSP), Imm64((u64)m_stack_top - 0x20));
|
||||
else
|
||||
MOV(64, R(RSP), M(&s_saved_rsp));
|
||||
}
|
||||
|
||||
|
||||
void Jit64AsmRoutineManager::GenerateCommon()
|
||||
{
|
||||
fifoDirectWrite8 = AlignCode4();
|
||||
|
|
|
@ -24,6 +24,7 @@ class Jit64AsmRoutineManager : public CommonAsmRoutines
|
|||
{
|
||||
private:
|
||||
void Generate();
|
||||
void ResetStack();
|
||||
void GenerateCommon();
|
||||
u8* m_stack_top;
|
||||
|
||||
|
|
Loading…
Reference in New Issue