Esempio n. 1
0
 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)