Example #1
0
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();
  }
}
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();
}