XThread: Update the PC when we step out of an export!

This commit is contained in:
Dr. Chat 2015-12-08 00:35:38 -06:00 committed by Ben Vanik
parent ee0a41aa2c
commit 606aa9af6f
1 changed files with 10 additions and 8 deletions

View File

@ -40,8 +40,7 @@ uint32_t next_xthread_id_ = 0;
thread_local XThread* current_thread_tls_ = nullptr;
XThread::XThread(KernelState* kernel_state)
: XObject(kernel_state, kTypeThread),
guest_thread_(true) {}
: XObject(kernel_state, kTypeThread), guest_thread_(true) {}
XThread::XThread(KernelState* kernel_state, uint32_t stack_size,
uint32_t xapi_thread_startup, uint32_t start_address,
@ -803,8 +802,7 @@ uint32_t XThread::StepIntoBranch(uint32_t pc) {
if (i.I.AA) {
nia = (uint32_t)cpu::frontend::XEEXTS26(i.I.LI << 2);
} else {
nia =
i.address + (uint32_t)cpu::frontend::XEEXTS26(i.I.LI << 2);
nia = i.address + (uint32_t)cpu::frontend::XEEXTS26(i.I.LI << 2);
}
StepToAddress(nia);
@ -975,7 +973,8 @@ uint32_t XThread::StepToSafePoint() {
pc = thunk_func->address();
} else if (export_data) {
// Non-blocking. Run until we return from the thunk.
StepToAddress(uint32_t(thread_state_->context()->lr));
pc = uint32_t(thread_state_->context()->lr);
StepToAddress(pc);
} else if (first_pc) {
// We're in the MMIO handler/mfmsr/something calling out of the guest
// that doesn't use an export. If the current instruction is
@ -990,7 +989,9 @@ uint32_t XThread::StepToSafePoint() {
// Good to go.
pc = first_pc;
} else {
// Step forward.
// Step forward and run this logic again.
// FIXME: This is broken. Runs this code in an infinite loop because
// breakpoints call out of the guest.
StepToAddress(first_pc + 4);
return StepToSafePoint();
}
@ -1045,6 +1046,7 @@ bool XThread::Save(ByteStream* stream) {
if (!pc) {
XELOGE("XThread %.8X failed to save: could not step to a safe point!",
handle());
assert_always();
return false;
}