def simulate(self, iaddr: str, simstate: "SimulationState") -> str: syscallindex = simstate.registers['v0'] if syscallindex.is_literal and syscallindex.is_defined: syscallindex = cast(SV.SimLiteralValue, syscallindex) raise SU.CHBSimSystemCallException(simstate, iaddr, syscallindex.value) else: raise SU.CHBSimCallTargetUnknownError( simstate, iaddr, syscallindex, 'syscall = ' + str(syscallindex))
def simulate(self, iaddr: str, simstate: "SimulationState") -> str: tgtop = self.tgt_operand tgtval = simstate.rhs(iaddr, tgtop) simra = SSV.pc_to_return_address(simstate.programcounter.add_offset(8), simstate.function_address) simstate.increment_programcounter() simstate.registers['ra'] = simra if tgtval.is_undefined: raise SU.CHBSimError( simstate, iaddr, "jalr: target address is undefined: " + str(tgtop)) tgtaddr: Union[SSV.SimGlobalAddress, SSV.SimDynamicLinkSymbol] if tgtval.is_address: tgtval = cast(SSV.SimAddress, tgtval) if tgtval.is_global_address: tgtaddr = cast(SSV.SimGlobalAddress, tgtval) else: raise SU.CHBSimError( simstate, iaddr, "target address is not global: " + str(tgtval)) # check if literal could be an address elif tgtval.is_literal: tgtaddr = simstate.resolve_literal_address(iaddr, tgtval.literal_value) if tgtaddr.is_undefined: raise SU.CHBSimError( simstate, iaddr, "jalr: target address cannot be resolved: " + str(tgtval)) elif tgtval.is_dynamic_link_symbol: tgtaddr = cast(SSV.SimDynamicLinkSymbol, tgtval) elif tgtval.is_symbolic: raise SU.CHBSimError( simstate, iaddr, ("symbolic target address not recognized: " + str(tgtval))) else: raise SU.CHBSimCallTargetUnknownError(simstate, iaddr, tgtval, 'target = ' + str(tgtval)) simstate.simprogramcounter.set_delayed_programcounter(tgtaddr) return SU.simcall(iaddr, simstate, tgtaddr, simra)