Fix XThread::StepIntoBranch not properly stepping into blr/bctr
This commit is contained in:
parent
44c9e8fe25
commit
b58e9afbf1
|
@ -795,8 +795,18 @@ uint32_t XThread::StepIntoBranch(uint32_t pc) {
|
||||||
|
|
||||||
auto context = thread_state_->context();
|
auto context = thread_state_->context();
|
||||||
|
|
||||||
if (i.type->type & (1 << 4) /* BranchAlways */) {
|
if (i.type->type & (1 << 4) /* BranchAlways */
|
||||||
if (i.type->opcode == 0x48000000) {
|
|| i.code == 0x4E800020 /* blr */
|
||||||
|
|| i.code == 0x4E800420 /* bctr */) {
|
||||||
|
if (i.code == 0x4E800020) {
|
||||||
|
// blr
|
||||||
|
uint32_t nia = uint32_t(context->lr);
|
||||||
|
StepToAddress(nia);
|
||||||
|
} else if (i.code == 0x4E800420) {
|
||||||
|
// bctr
|
||||||
|
uint32_t nia = uint32_t(context->ctr);
|
||||||
|
StepToAddress(nia);
|
||||||
|
} else if (i.type->opcode == 0x48000000) {
|
||||||
// bx
|
// bx
|
||||||
uint32_t nia = 0;
|
uint32_t nia = 0;
|
||||||
if (i.I.AA) {
|
if (i.I.AA) {
|
||||||
|
@ -817,31 +827,9 @@ uint32_t XThread::StepIntoBranch(uint32_t pc) {
|
||||||
fence.Signal();
|
fence.Signal();
|
||||||
};
|
};
|
||||||
|
|
||||||
bool conditional = true;
|
|
||||||
if (i.type->opcode = 0x40000000) {
|
|
||||||
// bx
|
|
||||||
if (cpu::frontend::select_bits(i.B.BO, 4, 4) &&
|
|
||||||
cpu::frontend::select_bits(i.B.BO, 2, 2)) {
|
|
||||||
conditional = false;
|
|
||||||
}
|
|
||||||
} else if (i.type->opcode == 0x4C000420) {
|
|
||||||
// bctrx
|
|
||||||
if (cpu::frontend::select_bits(i.XL.BO, 2, 2)) {
|
|
||||||
// ignore cond
|
|
||||||
conditional = false;
|
|
||||||
}
|
|
||||||
} else if (i.type->opcode == 0x4C000020) {
|
|
||||||
// blrx
|
|
||||||
if (cpu::frontend::select_bits(i.B.BO, 4, 4) &&
|
|
||||||
cpu::frontend::select_bits(i.B.BO, 2, 2)) {
|
|
||||||
// ignore ctr
|
|
||||||
conditional = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cpu::Breakpoint bpt(kernel_state()->processor(), callback);
|
cpu::Breakpoint bpt(kernel_state()->processor(), callback);
|
||||||
cpu::Breakpoint bpf(kernel_state()->processor(), pc + 4, callback);
|
cpu::Breakpoint bpf(kernel_state()->processor(), pc + 4, callback);
|
||||||
if (conditional && !bpf.Install()) {
|
if (!bpf.Install()) {
|
||||||
XELOGE("XThread: Could not install breakpoint to step forward!");
|
XELOGE("XThread: Could not install breakpoint to step forward!");
|
||||||
assert_always();
|
assert_always();
|
||||||
}
|
}
|
||||||
|
@ -874,9 +862,7 @@ uint32_t XThread::StepIntoBranch(uint32_t pc) {
|
||||||
thread_->Resume();
|
thread_->Resume();
|
||||||
fence.Wait();
|
fence.Wait();
|
||||||
bpt.Uninstall();
|
bpt.Uninstall();
|
||||||
if (conditional) {
|
bpf.Uninstall();
|
||||||
bpf.Uninstall();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return pc;
|
return pc;
|
||||||
|
|
Loading…
Reference in New Issue