CPU/Recompiler: Check downcount in interpret block

Fixes application locking up with CDS=Max in Driver.
pull/3526/head
Stenzek 3 months ago
parent 6e926041e5
commit 34e0eab9f1
No known key found for this signature in database

@ -259,6 +259,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
#endif #endif
Label dispatch; Label dispatch;
Label run_events_and_dispatch;
g_enter_recompiler = armAsm->GetCursorAddress<decltype(g_enter_recompiler)>(); 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); armAsm->b(lt, &skip_event_check);
g_run_events_and_dispatch = armAsm->GetCursorAddress<const void*>(); g_run_events_and_dispatch = armAsm->GetCursorAddress<const void*>();
armAsm->bind(&run_events_and_dispatch);
armEmitCall(armAsm, reinterpret_cast<const void*>(&TimingEvents::RunEvents), true); armEmitCall(armAsm, reinterpret_cast<const void*>(&TimingEvents::RunEvents), true);
armAsm->bind(&skip_event_check); 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*>(); g_interpret_block = armAsm->GetCursorAddress<const void*>();
{ {
armEmitCall(armAsm, reinterpret_cast<const void*>(GetInterpretUncachedBlockFunction()), true); 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); armAsm->b(&dispatch);
} }

@ -453,6 +453,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
#endif #endif
Label dispatch; Label dispatch;
Label run_events_and_dispatch;
g_enter_recompiler = armAsm->GetCursorAddress<decltype(g_enter_recompiler)>(); 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); armAsm->b(&dispatch, lt);
g_run_events_and_dispatch = armAsm->GetCursorAddress<const void*>(); g_run_events_and_dispatch = armAsm->GetCursorAddress<const void*>();
armAsm->bind(&run_events_and_dispatch);
armEmitCall(armAsm, reinterpret_cast<const void*>(&TimingEvents::RunEvents), true); 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*>(); g_interpret_block = armAsm->GetCursorAddress<const void*>();
{ {
armEmitCall(armAsm, reinterpret_cast<const void*>(GetInterpretUncachedBlockFunction()), true); 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); armAsm->b(&dispatch);
} }

@ -241,6 +241,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
Assembler* rvAsm = &actual_asm; Assembler* rvAsm = &actual_asm;
Label dispatch; Label dispatch;
Label run_events_and_dispatch;
g_enter_recompiler = reinterpret_cast<decltype(g_enter_recompiler)>(rvAsm->GetCursorPointer()); 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->LW(RARG2, PTR(&g_state.downcount));
rvAsm->BLTU(RARG1, RARG2, &skip_event_check); rvAsm->BLTU(RARG1, RARG2, &skip_event_check);
rvAsm->Bind(&run_events_and_dispatch);
g_run_events_and_dispatch = rvAsm->GetCursorPointer(); g_run_events_and_dispatch = rvAsm->GetCursorPointer();
rvEmitCall(rvAsm, reinterpret_cast<const void*>(&TimingEvents::RunEvents)); 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(); g_interpret_block = rvAsm->GetCursorPointer();
{ {
rvEmitCall(rvAsm, CodeCache::GetInterpretUncachedBlockFunction()); 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); rvAsm->J(&dispatch);
} }

@ -118,6 +118,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
Label dispatch; Label dispatch;
Label exit_recompiler; Label exit_recompiler;
Label run_events_and_dispatch;
g_enter_recompiler = reinterpret_cast<decltype(g_enter_recompiler)>(const_cast<u8*>(cg->getCurr())); 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); cg->jl(dispatch);
g_run_events_and_dispatch = cg->getCurr(); g_run_events_and_dispatch = cg->getCurr();
cg->L(run_events_and_dispatch);
cg->call(reinterpret_cast<const void*>(&TimingEvents::RunEvents)); 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(); g_interpret_block = cg->getCurr();
{ {
cg->call(CodeCache::GetInterpretUncachedBlockFunction()); 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); cg->jmp(dispatch);
} }

Loading…
Cancel
Save