StopReason::Type SystemStateWrapper::run(ticks_t numCycles) { if (numCycles == 0) { system->clearTimeout(); } else { system->setTimeout(lastStopTime + numCycles); } StopReason stopReason = system->run(); lastStopTime = stopReason.getTime(); switch (stopReason.getType()) { default: break; case StopReason::BREAKPOINT: lastBreakpointThread = stopReason.getThread(); break; case StopReason::EXIT: lastExitStatus = stopReason.getStatus(); break; } return stopReason.getType(); }
int BootSequenceStepRun::executeAux(ExecutionState &state) { SystemState &sys = state.sys; BreakpointManager &BM = state.breakpointManager; SyscallHandler &SH = state.syscallHandler; SH.setDoneSyscallsRequired(numDoneSyscalls); StopReason stopReason = sys.run(); while (stopReason.getType() == StopReason::BREAKPOINT) { Thread *thread = stopReason.getThread(); Core &core = thread->getParent(); uint32_t address = thread->getRealPc(); int retval; switch (BM.getBreakpointType(core, address)) { case BreakpointType::Exception: SH.doException(*thread); return thread->regs[Register::ET]; case BreakpointType::Syscall: switch (SH.doSyscall(*thread, retval)) { case SyscallHandler::EXIT: return retval; case SyscallHandler::CONTINUE: thread->setPcFromAddress(thread->regs[Register::LR]); break; } break; case BreakpointType::Other: assert(0 && "Unexpected breakpoint type"); break; } stopReason = sys.run(); } switch (stopReason.getType()) { default: assert(0 && "Unexpected stop reason"); case StopReason::NO_RUNNABLE_THREADS: case StopReason::TIMEOUT: return 1; case StopReason::EXIT: return stopReason.getStatus(); } }