def tne(ir, instr, arg1, arg2): e = [] loc_except, loc_except_expr = ir.gen_loc_key_and_expr(ir.IRDst.size) loc_next = ir.get_next_loc_key(instr) loc_next_expr = m2_expr.ExprLoc(loc_next, ir.IRDst.size) do_except = [] do_except.append(m2_expr.ExprAssign(exception_flags, m2_expr.ExprInt( EXCEPT_DIV_BY_ZERO, exception_flags.size))) do_except.append(m2_expr.ExprAssign(ir.IRDst, loc_next_expr)) blk_except = IRBlock(ir.loc_db, loc_except, [AssignBlock(do_except, instr)]) cond = arg1 ^ arg2 e = [] e.append(m2_expr.ExprAssign(ir.IRDst, m2_expr.ExprCond(cond, loc_next_expr, loc_except_expr))) return e, [blk_except]
def ins(ir, instr, a, b, c, d): e = [] pos = int(c) l = int(d) my_slices = [] if pos != 0: my_slices.append(a[:pos]) if l != 0: my_slices.append(b[:l]) if pos + l != 32: my_slices.append(a[pos + l:]) r = m2_expr.ExprCompose(*my_slices) e.append(m2_expr.ExprAssign(a, r)) return e, []
def get_ir(self, instr): args = instr.args instr_ir, extra_ir = get_mnemo_expr(self, instr, *args) fixed_regs = { self.pc: m2_expr.ExprInt(instr.offset + 4, 32), ZERO: m2_expr.ExprInt(0, 32) } instr_ir = [m2_expr.ExprAssign(expr.dst, expr.src.replace_expr(fixed_regs)) for expr in instr_ir] new_extra_ir = [irblock.modify_exprs(mod_src=lambda expr: expr.replace_expr(fixed_regs)) for irblock in extra_ir] return instr_ir, new_extra_ir
def clz(ir, instr, rs, rd): e = [] e.append(m2_expr.ExprAssign(rd, m2_expr.ExprOp('cntleadzeros', rs))) return e, []
def dst2ExprAssign(self, dst): """Return an ExprAssign corresponding to @dst equation @dst: Expr instance""" return m2_expr.ExprAssign(dst, self[dst])
def to_constraint(self): cst1, cst2 = m2_expr.ExprInt(0, 1), m2_expr.ExprInt(1, 1) return m2_expr.ExprAssign(cst1, m2_expr.ExprCond(self.expr, cst1, cst2))
def to_constraint(self): return m2_expr.ExprAssign(self.expr, m2_expr.ExprInt(0, self.expr.size))
def syscall(ir, instr, code): e = [] e.append(m2_expr.ExprAssign(exception_flags, m2_expr.ExprInt(EXCEPT_SYSCALL, 32))) return e, []
def break_(ir, instr): e = [] e.append(m2_expr.ExprAssign(exception_flags, m2_expr.ExprInt(EXCEPT_SOFT_BP, 32))) return e, []
def sh(ir, instr, arg1, arg2): e = [] e.append(m2_expr.ExprAssign(m2_expr.ExprMem(arg2.ptr, 16), arg1[:16])) return e, []
def sb(ir, instr, arg1, arg2): """The least significant byte of @arg1 is stored at the specified address @arg2.""" e = [] e.append(m2_expr.ExprAssign(m2_expr.ExprMem(arg2.ptr, 8), arg1[:8])) return e, []