CPU/Recompiler: Call RaiseBreakException() on BP

For pcdrv.
This commit is contained in:
Stenzek 2025-04-24 10:50:11 +10:00
parent 559f831c30
commit 740758fdda
No known key found for this signature in database
4 changed files with 39 additions and 8 deletions

View File

@ -695,12 +695,20 @@ void CPU::ARM32Recompiler::EndBlockWithException(Exception excode)
Flush(FLUSH_END_BLOCK | FLUSH_FOR_EXCEPTION | FLUSH_FOR_C_CALL);
// TODO: flush load delay
// TODO: break for pcdrv
EmitMov(RARG1, Cop0Registers::CAUSE::MakeValueForException(excode, m_current_instruction_branch_delay_slot, false,
inst->cop.cop_n));
EmitMov(RARG2, m_current_instruction_pc);
if (excode != Exception::BP)
{
EmitCall(reinterpret_cast<const void*>(static_cast<void (*)(u32, u32)>(&CPU::RaiseException)));
}
else
{
EmitMov(RARG3, inst->bits);
EmitCall(reinterpret_cast<const void*>(&CPU::RaiseBreakException));
}
m_dirty_pc = false;
EndAndLinkBlock(std::nullopt, true, false);

View File

@ -859,12 +859,19 @@ void CPU::ARM64Recompiler::EndBlockWithException(Exception excode)
Flush(FLUSH_END_BLOCK | FLUSH_FOR_EXCEPTION | FLUSH_FOR_C_CALL);
// TODO: flush load delay
// TODO: break for pcdrv
EmitMov(RWARG1, Cop0Registers::CAUSE::MakeValueForException(excode, m_current_instruction_branch_delay_slot, false,
inst->cop.cop_n));
EmitMov(RWARG2, m_current_instruction_pc);
if (excode != Exception::BP)
{
EmitCall(reinterpret_cast<const void*>(static_cast<void (*)(u32, u32)>(&CPU::RaiseException)));
}
else
{
EmitMov(RWARG3, inst->bits);
EmitCall(reinterpret_cast<const void*>(&CPU::RaiseBreakException));
}
m_dirty_pc = false;
EndAndLinkBlock(std::nullopt, true, false);

View File

@ -659,12 +659,19 @@ void CPU::RISCV64Recompiler::EndBlockWithException(Exception excode)
Flush(FLUSH_END_BLOCK | FLUSH_FOR_EXCEPTION | FLUSH_FOR_C_CALL);
// TODO: flush load delay
// TODO: break for pcdrv
EmitMov(RARG1, Cop0Registers::CAUSE::MakeValueForException(excode, m_current_instruction_branch_delay_slot, false,
inst->cop.cop_n));
EmitMov(RARG2, m_current_instruction_pc);
if (excode != Exception::BP)
{
EmitCall(reinterpret_cast<const void*>(static_cast<void (*)(u32, u32)>(&CPU::RaiseException)));
}
else
{
EmitMov(RARG3, inst->bits);
EmitCall(reinterpret_cast<const void*>(&CPU::RaiseBreakException));
}
m_dirty_pc = false;
EndAndLinkBlock(std::nullopt, true, false);

View File

@ -598,12 +598,21 @@ void CPU::X64Recompiler::EndBlockWithException(Exception excode)
Flush(FLUSH_END_BLOCK | FLUSH_FOR_EXCEPTION | FLUSH_FOR_C_CALL);
// TODO: flush load delay
// TODO: break for pcdrv
cg->mov(RWARG1, Cop0Registers::CAUSE::MakeValueForException(excode, m_current_instruction_branch_delay_slot, false,
inst->cop.cop_n));
cg->mov(RWARG2, m_current_instruction_pc);
if (excode != Exception::BP)
{
cg->call(static_cast<void (*)(u32, u32)>(&CPU::RaiseException));
}
else
{
cg->mov(RWARG3, inst->bits);
cg->call(&CPU::RaiseBreakException);
}
m_dirty_pc = false;
EndAndLinkBlock(std::nullopt, true, false);