mirror of
https://github.com/stenzek/duckstation.git
synced 2026-02-15 02:44:41 +00:00
CPU/Recompiler: Check downcount in interpret block
Fixes application locking up with CDS=Max in Driver.
This commit is contained in:
@@ -259,6 +259,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
|
||||
#endif
|
||||
|
||||
Label dispatch;
|
||||
Label run_events_and_dispatch;
|
||||
|
||||
g_enter_recompiler = armAsm->GetCursorAddress<decltype(g_enter_recompiler)>();
|
||||
{
|
||||
@@ -276,6 +277,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
|
||||
armAsm->b(lt, &skip_event_check);
|
||||
|
||||
g_run_events_and_dispatch = armAsm->GetCursorAddress<const void*>();
|
||||
armAsm->bind(&run_events_and_dispatch);
|
||||
armEmitCall(armAsm, reinterpret_cast<const void*>(&TimingEvents::RunEvents), true);
|
||||
|
||||
armAsm->bind(&skip_event_check);
|
||||
@@ -315,6 +317,10 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
|
||||
g_interpret_block = armAsm->GetCursorAddress<const void*>();
|
||||
{
|
||||
armEmitCall(armAsm, reinterpret_cast<const void*>(GetInterpretUncachedBlockFunction()), true);
|
||||
armAsm->ldr(RARG1, PTR(&g_state.pending_ticks));
|
||||
armAsm->ldr(RARG2, PTR(&g_state.downcount));
|
||||
armAsm->cmp(RARG1, RARG2);
|
||||
armAsm->b(ge, &run_events_and_dispatch);
|
||||
armAsm->b(&dispatch);
|
||||
}
|
||||
|
||||
|
||||
@@ -453,6 +453,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
|
||||
#endif
|
||||
|
||||
Label dispatch;
|
||||
Label run_events_and_dispatch;
|
||||
|
||||
g_enter_recompiler = armAsm->GetCursorAddress<decltype(g_enter_recompiler)>();
|
||||
{
|
||||
@@ -476,6 +477,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
|
||||
armAsm->b(&dispatch, lt);
|
||||
|
||||
g_run_events_and_dispatch = armAsm->GetCursorAddress<const void*>();
|
||||
armAsm->bind(&run_events_and_dispatch);
|
||||
armEmitCall(armAsm, reinterpret_cast<const void*>(&TimingEvents::RunEvents), true);
|
||||
}
|
||||
|
||||
@@ -516,6 +518,10 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
|
||||
g_interpret_block = armAsm->GetCursorAddress<const void*>();
|
||||
{
|
||||
armEmitCall(armAsm, reinterpret_cast<const void*>(GetInterpretUncachedBlockFunction()), true);
|
||||
armAsm->ldr(RWARG1, PTR(&g_state.pending_ticks));
|
||||
armAsm->ldr(RWARG2, PTR(&g_state.downcount));
|
||||
armAsm->cmp(RWARG1, RWARG2);
|
||||
armAsm->b(&run_events_and_dispatch, ge);
|
||||
armAsm->b(&dispatch);
|
||||
}
|
||||
|
||||
|
||||
@@ -241,6 +241,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
|
||||
Assembler* rvAsm = &actual_asm;
|
||||
|
||||
Label dispatch;
|
||||
Label run_events_and_dispatch;
|
||||
|
||||
g_enter_recompiler = reinterpret_cast<decltype(g_enter_recompiler)>(rvAsm->GetCursorPointer());
|
||||
{
|
||||
@@ -264,6 +265,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
|
||||
rvAsm->LW(RARG2, PTR(&g_state.downcount));
|
||||
rvAsm->BLTU(RARG1, RARG2, &skip_event_check);
|
||||
|
||||
rvAsm->Bind(&run_events_and_dispatch);
|
||||
g_run_events_and_dispatch = rvAsm->GetCursorPointer();
|
||||
rvEmitCall(rvAsm, reinterpret_cast<const void*>(&TimingEvents::RunEvents));
|
||||
|
||||
@@ -309,6 +311,9 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
|
||||
g_interpret_block = rvAsm->GetCursorPointer();
|
||||
{
|
||||
rvEmitCall(rvAsm, CodeCache::GetInterpretUncachedBlockFunction());
|
||||
rvAsm->LW(RARG1, PTR(&g_state.pending_ticks));
|
||||
rvAsm->LW(RARG2, PTR(&g_state.downcount));
|
||||
rvAsm->BGE(RARG1, RARG2, &run_events_and_dispatch);
|
||||
rvAsm->J(&dispatch);
|
||||
}
|
||||
|
||||
|
||||
@@ -118,6 +118,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
|
||||
|
||||
Label dispatch;
|
||||
Label exit_recompiler;
|
||||
Label run_events_and_dispatch;
|
||||
|
||||
g_enter_recompiler = reinterpret_cast<decltype(g_enter_recompiler)>(const_cast<u8*>(cg->getCurr()));
|
||||
{
|
||||
@@ -143,6 +144,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
|
||||
cg->jl(dispatch);
|
||||
|
||||
g_run_events_and_dispatch = cg->getCurr();
|
||||
cg->L(run_events_and_dispatch);
|
||||
cg->call(reinterpret_cast<const void*>(&TimingEvents::RunEvents));
|
||||
}
|
||||
|
||||
@@ -183,6 +185,9 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
|
||||
g_interpret_block = cg->getCurr();
|
||||
{
|
||||
cg->call(CodeCache::GetInterpretUncachedBlockFunction());
|
||||
cg->mov(RWARG1, cg->dword[PTR(&g_state.pending_ticks)]);
|
||||
cg->cmp(RWARG1, cg->dword[PTR(&g_state.downcount)]);
|
||||
cg->jge(run_events_and_dispatch);
|
||||
cg->jmp(dispatch);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user