Treat CORE_NEXTFRAME like CORE_RUNNING is bps.

Fixes some cases where breakpoints skip instructions incorrectly.
This commit is contained in:
Unknown W. Brackets 2013-07-27 13:26:43 -07:00
parent 8602c276ca
commit 1a9b190188
2 changed files with 23 additions and 35 deletions

View File

@ -292,25 +292,15 @@ const u8 *Jit::DoJit(u32 em_address, JitBlock *b)
{
// TODO: Save/restore?
FlushAll();
CMP(32, M((void*)&coreState), Imm32(CORE_RUNNING));
FixupBranch skipCheck1 = J_CC(CC_E);
if (js.afterOp & JitState::AFTER_REWIND_PC_BAD_STATE)
{
// If we're rewinding, CORE_NEXTFRAME should not cause a rewind.
// It doesn't really matter either way if we're not rewinding.
CMP(32, M((void*)&coreState), Imm32(CORE_NEXTFRAME));
FixupBranch skipCheck2 = J_CC(CC_E);
MOV(32, M(&mips_->pc), Imm32(js.compilerPC));
WriteSyscallExit();
SetJumpTarget(skipCheck2);
}
else
{
MOV(32, M(&mips_->pc), Imm32(js.compilerPC + 4));
WriteSyscallExit();
}
SetJumpTarget(skipCheck1);
// If we're rewinding, CORE_NEXTFRAME should not cause a rewind.
// It doesn't really matter either way if we're not rewinding.
// CORE_RUNNING is <= CORE_NEXTFRAME.
CMP(32, M((void*)&coreState), Imm32(CORE_NEXTFRAME));
FixupBranch skipCheck = J_CC(CC_LE);
MOV(32, M(&mips_->pc), Imm32(js.compilerPC + 4));
WriteSyscallExit();
SetJumpTarget(skipCheck);
js.afterOp = JitState::AFTER_NONE;
}
@ -366,14 +356,12 @@ void Jit::WriteExit(u32 destination, int exit_num)
// If we need to verify coreState and rewind, we may not jump yet.
if (js.afterOp & (JitState::AFTER_CORE_STATE | JitState::AFTER_REWIND_PC_BAD_STATE))
{
CMP(32, M((void*)&coreState), Imm32(CORE_RUNNING));
FixupBranch skipCheck1 = J_CC(CC_E);
// CORE_RUNNING is <= CORE_NEXTFRAME.
CMP(32, M((void*)&coreState), Imm32(CORE_NEXTFRAME));
FixupBranch skipCheck2 = J_CC(CC_E);
FixupBranch skipCheck = J_CC(CC_LE);
MOV(32, M(&mips_->pc), Imm32(js.compilerPC));
WriteSyscallExit();
SetJumpTarget(skipCheck1);
SetJumpTarget(skipCheck2);
SetJumpTarget(skipCheck);
js.afterOp = JitState::AFTER_NONE;
}
@ -406,14 +394,12 @@ void Jit::WriteExitDestInEAX()
// If we need to verify coreState and rewind, we may not jump yet.
if (js.afterOp & (JitState::AFTER_CORE_STATE | JitState::AFTER_REWIND_PC_BAD_STATE))
{
CMP(32, M((void*)&coreState), Imm32(CORE_RUNNING));
FixupBranch skipCheck1 = J_CC(CC_E);
// CORE_RUNNING is <= CORE_NEXTFRAME.
CMP(32, M((void*)&coreState), Imm32(CORE_NEXTFRAME));
FixupBranch skipCheck2 = J_CC(CC_E);
FixupBranch skipCheck = J_CC(CC_LE);
MOV(32, M(&mips_->pc), Imm32(js.compilerPC));
WriteSyscallExit();
SetJumpTarget(skipCheck1);
SetJumpTarget(skipCheck2);
SetJumpTarget(skipCheck);
js.afterOp = JitState::AFTER_NONE;
}
@ -752,7 +738,7 @@ void JitMemCheck(u32 addr, int size, int isWrite)
return;
// Did we already hit one?
if (coreState != CORE_RUNNING)
if (coreState != CORE_RUNNING && coreState != CORE_NEXTFRAME)
return;
MemCheck *check = CBreakPoints::GetMemCheck(addr, size);
@ -773,8 +759,9 @@ void Jit::JitSafeMem::MemCheckImm(ReadType type)
jit_->MOV(32, M(&jit_->mips_->pc), Imm32(jit_->js.compilerPC));
jit_->CallProtectedFunction((void *)&JitMemCheck, iaddr_, size_, type == MEM_WRITE ? 1 : 0);
jit_->CMP(32, M((void*)&coreState), Imm32(0));
skipChecks_.push_back(jit_->J_CC(CC_NE, true));
// CORE_RUNNING is <= CORE_NEXTFRAME.
jit_->CMP(32, M((void*)&coreState), Imm32(CORE_NEXTFRAME));
skipChecks_.push_back(jit_->J_CC(CC_G, true));
jit_->js.afterOp |= JitState::AFTER_CORE_STATE | JitState::AFTER_REWIND_PC_BAD_STATE;
}
}
@ -822,8 +809,9 @@ void Jit::JitSafeMem::MemCheckAsm(ReadType type)
if (possible)
{
jit_->CMP(32, M((void*)&coreState), Imm32(0));
skipChecks_.push_back(jit_->J_CC(CC_NE, true));
// CORE_RUNNING is <= CORE_NEXTFRAME.
jit_->CMP(32, M((void*)&coreState), Imm32(CORE_NEXTFRAME));
skipChecks_.push_back(jit_->J_CC(CC_G, true));
jit_->js.afterOp |= JitState::AFTER_CORE_STATE | JitState::AFTER_REWIND_PC_BAD_STATE;
}
}

View File

@ -46,14 +46,14 @@ void PSP_SWI();
void GetSysDirectories(std::string &memstickpath, std::string &flash0path);
// RUNNING must be at 0.
// RUNNING must be at 0, NEXTFRAME must be at 1.
enum CoreState
{
CORE_RUNNING = 0,
CORE_NEXTFRAME = 1,
CORE_STEPPING,
CORE_POWERDOWN,
CORE_ERROR,
CORE_NEXTFRAME,
};
extern volatile CoreState coreState;