miasm2.arch.sh4.arch module
#-*- coding:utf-8 -*- from pyparsing import * from miasm2.core.cpu import * from miasm2.expression.expression import * from collections import defaultdict import miasm2.arch.sh4.regs as regs_module from miasm2.arch.sh4.regs import * from miasm2.core.asm_ast import AstInt, AstId, AstMem, AstOp jra = ExprId('jra', 32) jrb = ExprId('jrb', 32) jrc = ExprId('jrc', 32) # parser helper ########### PLUS = Suppress("+") MULT = Suppress("*") MINUS = Suppress("-") AND = Suppress("&") LBRACK = Suppress("[") RBRACK = Suppress("]") DEREF = Suppress("@") COMMA = Suppress(",") LPARENT = Suppress("(") RPARENT = Suppress(")") def cb_deref_pcimm(tokens): return tokens[0] + tokens[1] def cb_pcandimmimm(tokens): return (tokens[0] & tokens[1]) + tokens[2] ref_pc = (LPARENT + reg_info_pc.parser + COMMA + base_expr + RPARENT).setParseAction(cb_deref_pcimm) ref_pcandimm = (LPARENT + reg_info_pc.parser + AND + base_expr + COMMA + base_expr + RPARENT).setParseAction(cb_pcandimmimm) pcdisp = (reg_info_pc.parser + AND + base_expr + PLUS + base_expr).setParseAction(cb_pcandimmimm) PTR = Suppress('PTR') def cb_deref_mem(tokens): assert len(tokens) == 1 result = AstMem(tokens[0], 32) return result def cb_predec(tokens): assert len(tokens) == 1 result = AstMem(AstOp('predec', tokens[0]), 32) return result def cb_postinc(tokens): assert len(tokens) == 1 result = AstMem(AstOp('postinc', tokens[0]), 32) return result def cb_regdisp(tokens): assert len(tokens) == 2 result = AstMem(tokens[0] + tokens[1], 32) return result def cb_regreg(tokens): assert len(tokens) == 2 result = AstMem(tokens[0] + tokens[1], 32) return result deref_pc = (DEREF + ref_pc).setParseAction(cb_deref_mem) deref_pcimm = (DEREF + ref_pcandimm).setParseAction(cb_deref_mem) dgpregs_base = (DEREF + gpregs.parser).setParseAction(cb_deref_mem) dgpregs_predec = (DEREF + MINUS + gpregs.parser).setParseAction(cb_predec) dgpregs_postinc = (DEREF + gpregs.parser + PLUS).setParseAction(cb_postinc) dgpregs = dgpregs_base | dgpregs_predec | dgpregs_postinc d_gpreg_gpreg = (DEREF + LPARENT + gpregs.parser + COMMA + gpregs.parser + RPARENT).setParseAction(cb_regdisp) dgpregs_p = dgpregs_predec | dgpregs_postinc dgpregs_ir = (DEREF + LPARENT + gpregs.parser + COMMA + base_expr + RPARENT).setParseAction(cb_regdisp) dgpregs_ir |= d_gpreg_gpreg dgbr_imm = (DEREF + LPARENT + reg_info_gbr.parser + COMMA + base_expr + RPARENT).setParseAction(cb_regdisp) dgbr_reg = (DEREF + LPARENT + reg_info_gbr.parser + COMMA + gpregs.parser + RPARENT).setParseAction(cb_regreg) class sh4_arg(m_arg): def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None _, bs_pr = gen_reg_bs('PR', reg_info_pr, (m_reg, sh4_arg,)) _, bs_r0 = gen_reg_bs('R0', reg_info_r0, (m_reg, sh4_arg,)) _, bs_sr = gen_reg_bs('SR', reg_info_sr, (m_reg, sh4_arg,)) _, bs_gbr = gen_reg_bs('GBR', reg_info_gbr, (m_reg, sh4_arg,)) _, bs_vbr = gen_reg_bs('VBR', reg_info_vbr, (m_reg, sh4_arg,)) _, bs_ssr = gen_reg_bs('SSR', reg_info_ssr, (m_reg, sh4_arg,)) _, bs_spc = gen_reg_bs('SPC', reg_info_spc, (m_reg, sh4_arg,)) _, bs_sgr = gen_reg_bs('SGR', reg_info_sgr, (m_reg, sh4_arg,)) _, bs_dbr = gen_reg_bs('dbr', reg_info_dbr, (m_reg, sh4_arg,)) _, bs_mach = gen_reg_bs('mach', reg_info_mach, (m_reg, sh4_arg,)) _, bs_macl = gen_reg_bs('macl', reg_info_macl, (m_reg, sh4_arg,)) _, bs_fpul = gen_reg_bs('fpul', reg_info_fpul, (m_reg, sh4_arg,)) _, bs_fr0 = gen_reg_bs('fr0', reg_info_fr0, (m_reg, sh4_arg,)) class sh4_reg(reg_noarg, sh4_arg): pass class sh4_gpreg(sh4_reg): reg_info = gpregs parser = reg_info.parser class sh4_dr(sh4_reg): reg_info = dregs parser = reg_info.parser class sh4_bgpreg(sh4_reg): reg_info = bgpregs parser = reg_info.parser class sh4_gpreg_noarg(reg_noarg, ): reg_info = gpregs parser = reg_info.parser class sh4_freg(sh4_reg): reg_info = fregs parser = reg_info.parser class sh4_dgpreg(sh4_arg): parser = dgpregs_base def fromstring(self, text, loc_db, parser_result=None): start, stop = super(sh4_dgpreg, self).fromstring(text, loc_db, parser_result) if start is None or self.expr == [None]: return start, stop self.expr = ExprMem(self.expr.arg, self.sz) return start, stop def decode(self, v): r = gpregs.expr[v] self.expr = ExprMem(r, self.sz) return True def encode(self): e = self.expr if not isinstance(e, ExprMem): return False if not isinstance(e.arg, ExprId): return False v = gpregs.expr.index(e.arg) self.value = v return True class sh4_dgpregpinc(sh4_arg): parser = dgpregs_p def fromstring(self, text, loc_db, parser_result=None): start, stop = super(sh4_dgpregpinc, self).fromstring(text, loc_db, parser_result) if self.expr == [None]: return None, None if not isinstance(self.expr.arg, ExprOp): return None, None if self.expr.arg.op != self.op: return None, None return start, stop def decode(self, v): r = gpregs.expr[v] e = ExprOp(self.op, r) self.expr = ExprMem(e, self.sz) return True def encode(self): e = self.expr if not isinstance(e, ExprMem): return False e = e.arg res = match_expr(e, ExprOp(self.op, jra), [jra]) if not res: return False r = res[jra] if not r in gpregs.expr: return False v = gpregs.expr.index(r) self.value = v return True class sh4_dgpregpdec(sh4_arg): parser = dgpregs_postinc op = "preinc" class sh4_dgpreg_imm(sh4_dgpreg): parser = dgpregs_ir def decode(self, v): p = self.parent r = gpregs.expr[v] s = self.sz d = ExprInt(p.disp.value * s / 8, 32) e = ExprMem(r + d, s) self.expr = e return True def encode(self): e = self.expr p = self.parent s = self.sz if not isinstance(e, ExprMem): return False if isinstance(e.arg, ExprId): v = gpregs.expr.index(e.arg) p.disp.value = 0 elif isinstance(e.arg, ExprOp): res = match_expr(e, ExprMem(jra + jrb, self.sz), [jra, jrb]) if not res: return False if not isinstance(res[jra], ExprId): return False if not isinstance(res[jrb], ExprInt): return False d = int(res[jrb]) p.disp.value = d / (s / 8) if not res[jra] in gpregs.expr: return False v = gpregs.expr.index(res[jra]) else: return False self.value = v return True class sh4_imm(imm_noarg, sh4_arg): parser = base_expr pass class sh4_simm(sh4_imm): parser = base_expr def decode(self, v): v = sign_ext(v, self.l, 32) v = self.decodeval(v) self.expr = ExprInt(v, 32) return True def encode(self): if not isinstance(self.expr, ExprInt): return False v = int(self.expr) if (1 << (self.l - 1)) & v: v = -((0xffffffff ^ v) + 1) v = self.encodeval(v) self.value = (v & 0xffffffff) & self.lmask return True class sh4_dpc16imm(sh4_dgpreg): parser = deref_pc def decode(self, v): self.expr = ExprMem(PC + ExprInt(v * 2 + 4, 32), 16) return True def calcdisp(self, v): v = (int(v) - 4) / 2 if not 0 < v <= 0xff: return None return v def encode(self): res = match_expr(self.expr, ExprMem(PC + jra, 16), [jra]) if not res: return False if not isinstance(res[jra], ExprInt): return False v = self.calcdisp(res[jra]) if v is None: return False self.value = v return True class sh4_dgbrimm8(sh4_dgpreg): parser = dgbr_imm def decode(self, v): s = self.sz self.expr = ExprMem(GBR + ExprInt(v * s / 8, 32), s) return True def encode(self): e = self.expr s = self.sz if e == ExprMem(GBR, 32): self.value = 0 return True res = match_expr(self.expr, ExprMem(GBR + jra, s), [jra]) if not res: return False if not isinstance(res[jra], ExprInt): return False self.value = int(res[jra]) / (s / 8) return True class sh4_dpc32imm(sh4_dpc16imm): parser = deref_pcimm def decode(self, v): self.expr = ExprMem( (PC & ExprInt(0xfffffffc, 32)) + ExprInt(v * 4 + 4, 32), 32) return True def calcdisp(self, v): v = (int(v) - 4) / 4 if not 0 < v <= 0xff: return None return v def encode(self): res = match_expr( self.expr, ExprMem((PC & ExprInt(0xFFFFFFFC, 32)) + jra, 32), [jra]) if not res: return False if not isinstance(res[jra], ExprInt): return False v = self.calcdisp(res[jra]) if v is None: return False self.value = v return True class sh4_pc32imm(sh4_arg): parser = pcdisp def decode(self, v): self.expr = (PC & ExprInt(0xfffffffc, 32)) + ExprInt(v * 4 + 4, 32) return True def encode(self): res = match_expr(self.expr, (PC & ExprInt(0xfffffffc, 32)) + jra, [jra]) if not res: return False if not isinstance(res[jra], ExprInt): return False v = (int(res[jra]) - 4) / 4 if v is None: return False self.value = v return True class additional_info: def __init__(self): self.except_on_instr = False class instruction_sh4(instruction): __slots__ = [] delayslot = 0 def __init__(self, *args, **kargs): super(instruction_sh4, self).__init__(*args, **kargs) def dstflow(self): return self.name.startswith('J') @staticmethod def arg2str(expr, index=None, loc_db=None): if isinstance(expr, ExprId) or isinstance(expr, ExprInt): return str(expr) elif expr.is_loc(): if loc_db is not None: return loc_db.pretty_str(expr.loc_key) else: return str(expr) assert(isinstance(expr, ExprMem)) expr = expr.arg if isinstance(expr, ExprOp): if expr.op == "predec": s = '-%s' % expr.args[0] elif expr.op == "postinc": s = '%s+' % expr.args[0] else: s = ','.join([str(x).replace('(', '').replace(')', '') for x in expr.args]) s = "(%s)"%s s = "@%s" % s elif isinstance(expr, ExprId): s = "@%s" % expr else: raise NotImplementedError('zarb arg2str') return s """ def dstflow2label(self, loc_db): e = self.args[0] if not isinstance(e, ExprInt): return if self.name == 'BLX': ad = e.arg+8+self.offset else: ad = e.arg+8+self.offset l = loc_db.get_or_create_offset_location(ad) s = ExprId(l, e.size) self.args[0] = s """ def breakflow(self): if self.name.startswith('J'): return True return False def is_subcall(self): return self.name == 'JSR' def getdstflow(self, loc_db): return [self.args[0]] def splitflow(self): return self.name == 'JSR' def get_symbol_size(self, symbol, loc_db): return 32 def fixDstOffset(self): e = self.args[0] if self.offset is None: raise ValueError('symbol not resolved %s' % l) if not isinstance(e, ExprInt): log.debug('dyn dst %r', e) return off = e.arg - (self.offset + 4 + self.l) print hex(off) if int(off % 4): raise ValueError('strange offset! %r' % off) self.args[0] = ExprInt(off, 32) print 'final', self.args[0] def get_args_expr(self): args = [a for a in self.args] return args class mn_sh4(cls_mn): bintree = {} regs = regs_module num = 0 all_mn = [] all_mn_mode = defaultdict(list) all_mn_name = defaultdict(list) all_mn_inst = defaultdict(list) pc = PC # delayslot: # http://resource.renesas.com/lib/eng/e_learnig/sh4/13/index.html delayslot = 0 # unit is instruction instruction instruction = instruction_sh4 def additional_info(self): info = additional_info() return info @classmethod def getbits(cls, bs, attrib, start, n): if not n: return 0 o = 0 if n > bs.getlen() * 8: raise ValueError('not enought bits %r %r' % (n, len(bs.bin) * 8)) while n: i = start / 8 c = cls.getbytes(bs, i) if not c: raise IOError c = ord(c) r = 8 - start % 8 c &= (1 << r) - 1 l = min(r, n) c >>= (r - l) o <<= l o |= c n -= l start += l return o @classmethod def getbytes(cls, bs, offset, l=1): out = "" for _ in xrange(l): n_offset = (offset & ~1) + 1 - offset % 2 out += bs.getbytes(n_offset, 1) offset += 1 return out @classmethod def check_mnemo(cls, fields): l = sum([x.l for x in fields]) assert l == 16, "len %r" % l @classmethod def getmn(cls, name): return name.upper().replace('_', '.') @classmethod def gen_modes(cls, subcls, name, bases, dct, fields): dct['mode'] = None return [(subcls, name, bases, dct, fields)] def value(self, mode): v = super(mn_sh4, self).value(mode) return [x[::-1] for x in v] class bs_dr0gbr(sh4_dgpreg): parser = dgbr_reg def decode(self, v): self.expr = ExprMem(GBR + R0, 8) return True def encode(self): return self.expr == ExprMem(GBR + R0, 8) class bs_dr0gp(sh4_dgpreg): parser = d_gpreg_gpreg def decode(self, v): self.expr = ExprMem(gpregs.expr[v] + R0, self.sz) return True def encode(self): res = match_expr(self.expr, ExprMem(R0 + jra, self.sz), [jra]) if not res: return False r = res[jra] if not r in gpregs.expr: return False self.value = gpregs.expr.index(r) return True class bs_dgpreg(sh4_dgpreg): parser = dgpregs_base rn = bs(l=4, cls=(sh4_gpreg,), fname="rn") rm = bs(l=4, cls=(sh4_gpreg,), fname="rm") d08_rn = bs(l=4, cls=(sh4_dgpreg,), fname="rn", sz = 8) d16_rn = bs(l=4, cls=(sh4_dgpreg,), fname="rn", sz = 16) d32_rn = bs(l=4, cls=(sh4_dgpreg,), fname="rn", sz = 32) d08_rm = bs(l=4, cls=(sh4_dgpreg,), fname="rm", sz = 8) d16_rm = bs(l=4, cls=(sh4_dgpreg,), fname="rm", sz = 16) d32_rm = bs(l=4, cls=(sh4_dgpreg,), fname="rm", sz = 32) brm = bs(l=3, cls=(sh4_bgpreg,), fname="brm") brn = bs(l=3, cls=(sh4_bgpreg,), fname="brn") d08rnimm = bs(l=4, fname="rn", cls=(sh4_dgpreg_imm,), sz = 8) d16rnimm = bs(l=4, fname="rn", cls=(sh4_dgpreg_imm,), sz = 16) d32rnimm = bs(l=4, fname="rn", cls=(sh4_dgpreg_imm,), sz = 32) d08rmimm = bs(l=4, fname="rm", cls=(sh4_dgpreg_imm,), sz = 8) d16rmimm = bs(l=4, fname="rm", cls=(sh4_dgpreg_imm,), sz = 16) d32rmimm = bs(l=4, fname="rm", cls=(sh4_dgpreg_imm,), sz = 32) btype = bs(l=4, fname="btype", order=-1) s08imm = bs(l=8, cls=(sh4_simm,), fname="imm") s12imm = bs(l=12, cls=(sh4_simm,), fname="imm") dpc16imm = bs(l=8, cls=(sh4_dpc16imm,), fname="pcimm", sz=16) dpc32imm = bs(l=8, cls=(sh4_dpc32imm,), fname="pcimm", sz=32) dimm4 = bs(l=4, fname='disp', order=-1) d08gbrimm8 = bs(l=8, cls=(sh4_dgbrimm8,), fname='disp', sz=8) d16gbrimm8 = bs(l=8, cls=(sh4_dgbrimm8,), fname='disp', sz=16) d32gbrimm8 = bs(l=8, cls=(sh4_dgbrimm8,), fname='disp', sz=32) pc32imm = bs(l=8, cls=(sh4_pc32imm,), fname="pcimm") d08rnpinc = bs(l=4, cls=(sh4_dgpregpinc,), op='postinc', sz=8, fname="rn") d08rmpinc = bs(l=4, cls=(sh4_dgpregpinc,), op='postinc', sz=8, fname="rm") d16rnpinc = bs(l=4, cls=(sh4_dgpregpinc,), op='postinc', sz=16, fname="rn") d16rmpinc = bs(l=4, cls=(sh4_dgpregpinc,), op='postinc', sz=16, fname="rm") d32rnpinc = bs(l=4, cls=(sh4_dgpregpinc,), op='postinc', sz=32, fname="rn") d32rmpinc = bs(l=4, cls=(sh4_dgpregpinc,), op='postinc', sz=32, fname="rm") d08rnpdec = bs(l=4, cls=(sh4_dgpregpinc,), op='predec', sz=8, fname="rn") d08rmpdec = bs(l=4, cls=(sh4_dgpregpinc,), op='predec', sz=8, fname="rm") d16rnpdec = bs(l=4, cls=(sh4_dgpregpinc,), op='predec', sz=16, fname="rn") d16rmpdec = bs(l=4, cls=(sh4_dgpregpinc,), op='predec', sz=16, fname="rm") d32rnpdec = bs(l=4, cls=(sh4_dgpregpinc,), op='predec', sz=32, fname="rn") d32rmpdec = bs(l=4, cls=(sh4_dgpregpinc,), op='predec', sz=32, fname="rm") u08imm = bs(l=8, cls=(sh4_imm,), fname="imm") dr0gbr = bs(l=0, cls=(bs_dr0gbr,), sz=8) d08gpreg = bs(l=4, cls=(bs_dgpreg,), sz=8) d32gpreg = bs(l=4, cls=(bs_dgpreg,), sz=32) frn = bs(l=4, cls=(sh4_freg,), fname="frn") frm = bs(l=4, cls=(sh4_freg,), fname="frm") bd08r0gp = bs(l=4, cls=(bs_dr0gp,), sz=8) bd16r0gp = bs(l=4, cls=(bs_dr0gp,), sz=16) bd32r0gp = bs(l=4, cls=(bs_dr0gp,), sz=32) drn = bs(l=3, cls=(sh4_dr,), fname="drn") drm = bs(l=3, cls=(sh4_dr,), fname="drm") def addop(name, fields, args=None, alias=False): dct = {"fields": fields} dct["alias"] = alias if args is not None: dct['args'] = args type(name, (mn_sh4,), dct) addop("mov", [bs('1110'), rn, s08imm], [s08imm, rn]) addop("mov_w", [bs('1001'), rn, dpc16imm], [dpc16imm, rn]) addop("mov_l", [bs('1101'), rn, dpc32imm], [dpc32imm, rn]) addop("mov", [bs('0110', fname="opc"), rn, rm, bs('0011')], [rm, rn]) addop("mov_b", [bs('0010', fname="opc"), d08_rn, rm, bs('0000')], [rm, d08_rn]) addop("mov_w", [bs('0010', fname="opc"), d16_rn, rm, bs('0001')], [rm, d16_rn]) addop("mov_l", [bs('0010', fname="opc"), d32_rn, rm, bs('0010')], [rm, d32_rn]) addop("mov_b", [bs('0110', fname="opc"), rn, d08_rm, bs('0000')], [d08_rm, rn]) addop("mov_w", [bs('0110', fname="opc"), rn, d16_rm, bs('0001')], [d16_rm, rn]) addop("mov_l", [bs('0110', fname="opc"), rn, d32_rm, bs('0010')], [d32_rm, rn]) addop("mov_b", [bs('0010', fname="opc"), d08rnpdec, rm, bs('0100')], [rm, d08rnpdec]) addop("mov_w", [bs('0010', fname="opc"), d16rnpdec, rm, bs('0101')], [rm, d16rnpdec]) addop("mov_l", [bs('0010', fname="opc"), d32rnpdec, rm, bs('0110')], [rm, d32rnpdec]) addop("mov_b", [bs('0110', fname="opc"), rn, d08rmpinc, bs('0100')], [rm, d08rnpinc]) addop("mov_w", [bs('0110', fname="opc"), rn, d16rmpinc, bs('0101')], [d16rmpinc, rn]) addop("mov_l", [bs('0110', fname="opc"), rn, d32rmpinc, bs('0110')], [d32rmpinc, rn]) addop("mov_b", [bs('10000000', fname='opc'), bs_r0, d08rnimm, dimm4]) addop("mov_w", [bs('10000001', fname='opc'), bs_r0, d16rnimm, dimm4]) addop("mov_l", [bs('0001', fname='opc'), d32rnimm, rm, dimm4], [rm, d32rnimm]) addop("mov_b", [bs('10000100', fname='opc'), d08rmimm, dimm4, bs_r0]) addop("mov_w", [bs('10000101', fname='opc'), d16rmimm, dimm4, bs_r0]) addop("mov_l", [bs('0101', fname='opc'), rn, d32rmimm, dimm4], [d32rmimm, rn]) addop("mov_b", [bs('0000', fname='opc'), bd08r0gp, rm, bs('0100')], [rm, bd08r0gp]) addop("mov_w", [bs('0000', fname='opc'), bd16r0gp, rm, bs('0101')], [rm, bd16r0gp]) addop("mov_l", [bs('0000', fname='opc'), bd32r0gp, rm, bs('0110')], [rm, bd32r0gp]) addop("mov_b", [bs('0000', fname='opc'), rn, bd08r0gp, bs('1100')], [bd08r0gp, rn]) addop("mov_w", [bs('0000', fname='opc'), rn, bd16r0gp, bs('1101')], [bd16r0gp, rn]) addop("mov_l", [bs('0000', fname='opc'), rn, bd32r0gp, bs('1110')], [bd32r0gp, rn]) addop("mov_b", [bs('11000000'), bs_r0, d08gbrimm8]) addop("mov_w", [bs('11000001'), bs_r0, d16gbrimm8]) addop("mov_l", [bs('11000010'), bs_r0, d32gbrimm8]) addop("mov_b", [bs('11000100'), d08gbrimm8, bs_r0]) addop("mov_w", [bs('11000101'), d16gbrimm8, bs_r0]) addop("mov_l", [bs('11000110'), d32gbrimm8, bs_r0]) addop("mov", [bs('11000111'), pc32imm, bs_r0]) addop("swapb", [bs('0110'), rn, rm, bs('1000')], [rm, rn]) addop("swapw", [bs('0110'), rn, rm, bs('1001')], [rm, rn]) addop("xtrct", [bs('0010'), rn, rm, bs('1101')], [rm, rn]) addop("add", [bs('0011'), rn, rm, bs('1100')], [rm, rn]) addop("add", [bs('0111'), rn, s08imm], [s08imm, rn]) addop("addc", [bs('0011'), rn, rm, bs('1110')], [rm, rn]) addop("addv", [bs('0011'), rn, rm, bs('1111')], [rm, rn]) addop("cmpeq", [bs('10001000'), s08imm, bs_r0]) addop("cmpeq", [bs('0011'), rn, rm, bs('0000')], [rm, rn]) addop("cmphs", [bs('0011'), rn, rm, bs('0010')], [rm, rn]) addop("cmpge", [bs('0011'), rn, rm, bs('0011')], [rm, rn]) addop("cmphi", [bs('0011'), rn, rm, bs('0110')], [rm, rn]) addop("cmpgt", [bs('0011'), rn, rm, bs('0111')], [rm, rn]) addop("cmppz", [bs('0100'), rn, bs('00010001')]) addop("cmppl", [bs('0100'), rn, bs('00010101')]) addop("cmpstr", [bs('0010'), rn, rm, bs('1100')], [rm, rn]) addop("div1", [bs('0011'), rn, rm, bs('0100')], [rm, rn]) addop("div0s", [bs('0010'), rn, rm, bs('0111')], [rm, rn]) addop("div0u", [bs('0000000000011001')]) addop("dmuls", [bs('0011'), rn, rm, bs('1101')], [rm, rn]) addop("dmulu", [bs('0011'), rn, rm, bs('0101')], [rm, rn]) addop("dt", [bs('0100'), rn, bs('00010000')]) addop("extsb", [bs('0110'), rn, rm, bs('1110')], [rm, rn]) addop("extsw", [bs('0110'), rn, rm, bs('1111')], [rm, rn]) addop("extub", [bs('0110'), rn, rm, bs('1100')], [rm, rn]) addop("extuw", [bs('0110'), rn, rm, bs('1101')], [rm, rn]) addop("mac_l", [bs('0000', fname='opc'), d32rnpinc, d32rmpinc, bs('1111')], [d32rmpinc, d32rnpinc]) addop("mac_w", [bs('0100', fname='opc'), d16rnpinc, d16rmpinc, bs('1111')], [d16rmpinc, d16rnpinc]) addop("mull", [bs('0000'), rn, rm, bs('0111')], [rm, rn]) addop("mulsw", [bs('0010'), rn, rm, bs('1111')], [rm, rn]) addop("muluw", [bs('0010'), rn, rm, bs('1110')], [rm, rn]) addop("neg", [bs('0110'), rn, rm, bs('1011')], [rm, rn]) addop("negc", [bs('0110'), rn, rm, bs('1010')], [rm, rn]) addop("sub", [bs('0011'), rn, rm, bs('1000')], [rm, rn]) addop("subc", [bs('0011'), rn, rm, bs('1010')], [rm, rn]) addop("subv", [bs('0011'), rn, rm, bs('1011')], [rm, rn]) addop("and", [bs('0010'), rn, rm, bs('1001')], [rm, rn]) addop("and", [bs('11001001'), u08imm, bs_r0]) addop("and_b", [bs('11001101'), u08imm, dr0gbr]) addop("not", [bs('0110'), rn, rm, bs('0111')], [rm, rn]) addop("or", [bs('0010'), rn, rm, bs('1011')], [rm, rn]) addop("or", [bs('11001011'), u08imm, bs_r0]) addop("or_b", [bs('11001111'), u08imm, dr0gbr]) addop("tas_b", [bs('0100'), d08gpreg, bs('00011011')]) addop("tst", [bs('0010'), rn, rm, bs('1000')], [rm, rn]) addop("tst", [bs('11001000'), u08imm, bs_r0]) addop("tst_b", [bs('11001100'), u08imm, dr0gbr]) addop("xor", [bs('0010'), rn, rm, bs('1010')], [rm, rn]) addop("xor", [bs('11001010'), u08imm, bs_r0]) addop("xor_b", [bs('11001110'), u08imm, dr0gbr]) addop("rotl", [bs('0100'), rn, bs('00000100')]) addop("rotr", [bs('0100'), rn, bs('00000101')]) addop("rotcl", [bs('0100'), rn, bs('00100100')]) addop("rotcr", [bs('0100'), rn, bs('00100101')]) addop("shad", [bs('0100'), rn, rm, bs('1100')], [rm, rn]) addop("shal", [bs('0100'), rn, bs('00100000')]) addop("shar", [bs('0100'), rn, bs('00100001')]) addop("shld", [bs('0100'), rn, rm, bs('1101')], [rm, rn]) addop("shll", [bs('0100'), rn, bs('00000000')]) addop("shlr", [bs('0100'), rn, bs('00000001')]) addop("shll2", [bs('0100'), rn, bs('00001000')]) addop("shlr2", [bs('0100'), rn, bs('00001001')]) addop("shll8", [bs('0100'), rn, bs('00011000')]) addop("shlr8", [bs('0100'), rn, bs('00011001')]) addop("shll16", [bs('0100'), rn, bs('00101000')]) addop("shlr16", [bs('0100'), rn, bs('00101001')]) addop("bf", [bs('10001011'), s08imm]) """ def splitflow(self): return True def breakflow(self): return True def dstflow(self): return True def dstflow2label(self, loc_db): e = self.args[0].expr ad = e.arg*2+4+self.offset l = loc_db.get_or_create_offset_location(ad) s = ExprId(l, e.size) self.args[0].expr = s """ addop("bfs", [bs('10001111'), s08imm]) """ delayslot = 1 """ addop("bt", [bs('10001001'), s08imm]) addop("bts", [bs('10001101'), s08imm]) addop("bra", [bs('1010'), s12imm]) """ delayslot = 1 def breakflow(self): return True def dstflow(self): return True def dstflow2label(self, loc_db): e = self.args[0].expr ad = e.arg*2+4+self.offset l = loc_db.get_or_create_offset_location(ad) s = ExprId(l, e.size) self.args[0].expr = s """ addop("braf", [bs('0000'), rn, bs('00100011')]) """ delayslot = 1 def breakflow(self): return True def dstflow(self): return True """ addop("bsr", [bs('1011'), s12imm]) addop("bsrf", [bs('0000'), rn, bs('00000011')]) """ delayslot = 1 def breakflow(self): return True def is_subcall(self): return True def splitflow(self): return True """ addop("jmp_l", [bs('0100'), d32gpreg, bs('00101011')]) """ delayslot = 1 def breakflow(self): return True """ addop("jsr_l", [bs('0100'), d32gpreg, bs('00001011')]) """ delayslot = 1 def breakflow(self): return True def is_subcall(self): return True def splitflow(self): return True """ addop("rts", [bs('0000000000001011')]) """ delayslot = 1 def breakflow(self): return True """ addop("clrmac", [bs('0000000000101000')]) addop("clrs", [bs('0000000001001000')]) addop("clrt", [bs('0000000000001000')]) addop("ldc", [bs('0100'), rm, bs_sr, bs('00001110')]) addop("ldc", [bs('0100'), rm, bs_gbr, bs('00011110')]) addop("ldc", [bs('0100'), rm, bs_vbr, bs('00101110')]) addop("ldc", [bs('0100'), rm, bs_ssr, bs('00111110')]) addop("ldc", [bs('0100'), rm, bs_spc, bs('01001110')]) addop("ldc", [bs('0100'), rm, bs_dbr, bs('11111010')]) addop("ldc", [bs('0100'), rm, bs('1'), brn, bs('1110')], [rm, brn]) addop("ldc_l", [bs('0100'), d32rmpinc, bs_sr, bs('00000111')]) addop("ldc_l", [bs('0100'), d32rmpinc, bs_gbr, bs('00010111')]) addop("ldc_l", [bs('0100'), d32rmpinc, bs_vbr, bs('00100111')]) addop("ldc_l", [bs('0100'), d32rmpinc, bs_ssr, bs('00110111')]) addop("ldc_l", [bs('0100'), d32rmpinc, bs_spc, bs('01000111')]) addop("ldc_l", [bs('0100'), d32rmpinc, bs_dbr, bs('11110110')]) addop("ldc_l", [bs('0100'), d32rmpinc, bs('1'), brn, bs('0111')]) addop("lds", [bs('0100'), rm, bs_mach, bs('00001010')]) addop("lds", [bs('0100'), rm, bs_macl, bs('00011010')]) addop("lds", [bs('0100'), rm, bs_pr, bs('00101010')]) addop("lds_l", [bs('0100'), d32rmpinc, bs_mach, bs('00000110')]) addop("lds_l", [bs('0100'), d32rmpinc, bs_macl, bs('00010110')]) addop("lds_l", [bs('0100'), d32rmpinc, bs_pr, bs('00100110')]) addop("ldtlb", [bs('0000000000111000')]) addop("movca_l", [bs('0000'), bs_r0, d32gpreg, bs('11000011')]) addop("nop", [bs('0000000000001001')]) addop("ocbi_l", [bs('0000'), d32gpreg, bs('10010011')]) addop("ocbp_l", [bs('0000'), d32gpreg, bs('10100011')]) addop("ocbwb_l", [bs('0000'), d32gpreg, bs('10110011')]) addop("pref_l", [bs('0000'), d32gpreg, bs('10000011')]) addop("rte", [bs('0000000000101011')]) addop("sets", [bs('0000000001011000')]) addop("sett", [bs('0000000000011000')]) addop("sleep", [bs('0000000000011011')]) addop("stc", [bs('0000'), bs_sr, rn, bs('00000010')]) addop("stc", [bs('0000'), bs_gbr, rn, bs('00010010')]) addop("stc", [bs('0000'), bs_vbr, rn, bs('00100010')]) addop("stc", [bs('0000'), bs_ssr, rn, bs('00110010')]) addop("stc", [bs('0000'), bs_spc, rn, bs('01000010')]) addop("stc", [bs('0000'), bs_sgr, rn, bs('00111010')]) addop("stc", [bs('0000'), bs_dbr, rn, bs('11111010')]) addop("stc", [bs('0000'), rn, bs('1'), brm, bs('0010')], [brm, rn]) addop("stc_l", [bs('0100'), bs_sr, d32rmpdec, bs('00000011')]) addop("stc_l", [bs('0100'), bs_gbr, d32rmpdec, bs('00010011')]) addop("stc_l", [bs('0100'), bs_vbr, d32rmpdec, bs('00100011')]) addop("stc_l", [bs('0100'), bs_ssr, d32rmpdec, bs('00110011')]) addop("stc_l", [bs('0100'), bs_spc, d32rmpdec, bs('01000011')]) addop("stc_l", [bs('0100'), bs_sgr, d32rmpdec, bs('00110010')]) addop("stc_l", [bs('0100'), bs_dbr, d32rmpdec, bs('11110010')]) addop("stc_l", [bs('0100'), d32rnpdec, bs('1'), brm, bs('0011')], [brm, d32rnpdec]) # float addop("sts", [bs('0000'), bs_mach, rm, bs('00001010')]) addop("sts", [bs('0000'), bs_macl, rm, bs('00011010')]) addop("sts", [bs('0000'), bs_pr, rm, bs('00101010')]) addop("sts_l", [bs('0100'), bs_mach, d32rmpdec, bs('00000010')]) addop("sts_l", [bs('0100'), bs_macl, d32rmpdec, bs('00010010')]) addop("sts_l", [bs('0100'), d32rnpdec, bs_pr, bs('00100010')], [bs_pr, d32rnpdec]) addop("trapa", [bs('11000011'), u08imm]) addop("fldi0", [bs('1111'), frn, bs('10001101')]) addop("fldi1", [bs('1111'), frn, bs('10011101')]) addop("fmov", [bs('1111'), frn, frm, bs('1100')], [frm, frn]) addop("fmov_s", [bs('1111'), frn, d32gpreg, bs('1000')], [d32gpreg, frn]) addop("fmov_s", [bs('1111'), frn, bd32r0gp, bs('0110')], [bd32r0gp, frn]) addop("fmov_s", [bs('1111'), frn, d32rmpinc, bs('1001')], [d32rmpinc, frn]) addop("fmov_s", [bs('1111'), d32gpreg, frm, bs('1010')], [frm, d32gpreg]) addop("fmov_s", [bs('1111'), d32rnpdec, frm, bs('1011')], [frm, d32rnpdec]) addop("fmov_s", [bs('1111'), bd32r0gp, frm, bs('0111')], [frm, bd32r0gp]) addop("flds", [bs('1111'), frm, bs_fpul, bs('00011101')]) addop("fsts", [bs('1111'), bs_fpul, frm, bs('00001101')]) addop("fabs", [bs('1111'), frn, bs('01011101')]) addop("fadd", [bs('1111'), frn, frm, bs('0000')], [frm, frn]) addop("fcmpeq", [bs('1111'), frn, frm, bs('0100')], [frm, frn]) addop("fcmpgt", [bs('1111'), frn, frm, bs('0101')], [frm, frn]) addop("fdiv", [bs('1111'), frn, frm, bs('0011')], [frm, frn]) addop("float", [bs('1111'), bs_fpul, frn, bs('00101101')]) addop("fmac", [bs('1111'), bs_fr0, frn, frm, bs('1110')], [bs_fr0, frm, frn]) addop("fmul", [bs('1111'), frn, frm, bs('0010')], [frm, frn]) addop("fneg", [bs('1111'), frn, bs('01001101')]) addop("fsqrt", [bs('1111'), frn, bs('01101101')]) addop("fsub", [bs('1111'), frn, frm, bs('0001')], [frm, frn]) addop("ftrc", [bs('1111'), frm, bs_fpul, bs('00111101')])
Module variables
var AND
var COMMA
var DEREF
var EXPRAFF
var EXPRCOMPOSE
var EXPRCOND
var EXPRID
var EXPRINT
var EXPRLOC
var EXPRMEM
var EXPROP
var EXPRSLICE
var EXPR_ORDER_DICT
var LBRACK
var LPARENT
var MINUS
var MULT
var PLUS
var PRIORITY_MAX
var PTR
var RBRACK
var RPARENT
var TOK_EQUAL
var TOK_INF
var TOK_INF_EQUAL
var TOK_INF_EQUAL_SIGNED
var TOK_INF_EQUAL_UNSIGNED
var TOK_INF_SIGNED
var TOK_INF_UNSIGNED
var TOK_POS
var TOK_POS_STRICT
var all_regs_ids
var all_regs_ids_byname
var all_regs_ids_init
var all_regs_ids_no_alias
var alphanums
var alphas
var alphas8bit
var bd08r0gp
var bd16r0gp
var bd32r0gp
var bgpregs_expr
var bgpregs_str
var brm
var brn
var btype
var d08_rm
var d08_rn
var d08gbrimm8
var d08gpreg
var d08rmimm
var d08rmpdec
var d08rmpinc
var d08rnimm
var d08rnpdec
var d08rnpinc
var d16_rm
var d16_rn
var d16gbrimm8
var d16rmimm
var d16rmpdec
var d16rmpinc
var d16rnimm
var d16rnpdec
var d16rnpinc
var d32_rm
var d32_rn
var d32gbrimm8
var d32gpreg
var d32rmimm
var d32rmpdec
var d32rmpinc
var d32rnimm
var d32rnpdec
var d32rnpinc
var d_gpreg_gpreg
var default_prio
var deref_pc
var deref_pcimm
var dgbr_imm
var dgbr_reg
var dgpregs
var dgpregs_base
var dgpregs_ir
var dgpregs_p
var dgpregs_postinc
var dgpregs_predec
var dimm4
var dpc16imm
var dpc32imm
var dr0gbr
var dregs_expr
var dregs_str
var drm
var drn
var fregs_expr
var fregs_str
var frm
var frn
var gpregs_expr
var gpregs_str
var hexnums
var i
var jra
var jrb
var jrc
var mod_size2uint
var nums
var pc32imm
var pcdisp
var printables
var priorities
var priorities_list
var punc8bit
var ref_pc
var ref_pcandimm
var reg_cf
var reg_nf
var reg_of
var reg_zf
var regs_flt_expr
var regs_init
var rm
var rn
var s08imm
var s12imm
var size_to_IEEE754_info
var total_scans
var u08imm
Functions
def addop(
name, fields, args=None, alias=False)
def addop(name, fields, args=None, alias=False): dct = {"fields": fields} dct["alias"] = alias if args is not None: dct['args'] = args type(name, (mn_sh4,), dct)
def cb_deref_mem(
tokens)
def cb_deref_mem(tokens): assert len(tokens) == 1 result = AstMem(tokens[0], 32) return result
def cb_deref_pcimm(
tokens)
def cb_deref_pcimm(tokens): return tokens[0] + tokens[1]
def cb_pcandimmimm(
tokens)
def cb_pcandimmimm(tokens): return (tokens[0] & tokens[1]) + tokens[2]
def cb_postinc(
tokens)
def cb_postinc(tokens): assert len(tokens) == 1 result = AstMem(AstOp('postinc', tokens[0]), 32) return result
def cb_predec(
tokens)
def cb_predec(tokens): assert len(tokens) == 1 result = AstMem(AstOp('predec', tokens[0]), 32) return result
def cb_regdisp(
tokens)
def cb_regdisp(tokens): assert len(tokens) == 2 result = AstMem(tokens[0] + tokens[1], 32) return result
def cb_regreg(
tokens)
def cb_regreg(tokens): assert len(tokens) == 2 result = AstMem(tokens[0] + tokens[1], 32) return result
Classes
class additional_info
class additional_info: def __init__(self): self.except_on_instr = False
Ancestors (in MRO)
Instance variables
var except_on_instr
Methods
def __init__(
self)
def __init__(self): self.except_on_instr = False
class bs_dgpreg
class bs_dgpreg(sh4_dgpreg): parser = dgpregs_base
Ancestors (in MRO)
- bs_dgpreg
- sh4_dgpreg
- sh4_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_dgpreg
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def decode(
self, v)
Inheritance:
sh4_dgpreg
.decode
def decode(self, v): r = gpregs.expr[v] self.expr = ExprMem(r, self.sz) return True
def encode(
self)
Inheritance:
sh4_dgpreg
.encode
def encode(self): e = self.expr if not isinstance(e, ExprMem): return False if not isinstance(e.arg, ExprId): return False v = gpregs.expr.index(e.arg) self.value = v return True
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_dgpreg
.fromstring
def fromstring(self, text, loc_db, parser_result=None): start, stop = super(sh4_dgpreg, self).fromstring(text, loc_db, parser_result) if start is None or self.expr == [None]: return start, stop self.expr = ExprMem(self.expr.arg, self.sz) return start, stop
class bs_dr0gbr
class bs_dr0gbr(sh4_dgpreg): parser = dgbr_reg def decode(self, v): self.expr = ExprMem(GBR + R0, 8) return True def encode(self): return self.expr == ExprMem(GBR + R0, 8)
Ancestors (in MRO)
- bs_dr0gbr
- sh4_dgpreg
- sh4_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_dgpreg
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def decode(
self, v)
Inheritance:
sh4_dgpreg
.decode
def decode(self, v): self.expr = ExprMem(GBR + R0, 8) return True
def encode(
self)
Inheritance:
sh4_dgpreg
.encode
def encode(self): return self.expr == ExprMem(GBR + R0, 8)
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_dgpreg
.fromstring
def fromstring(self, text, loc_db, parser_result=None): start, stop = super(sh4_dgpreg, self).fromstring(text, loc_db, parser_result) if start is None or self.expr == [None]: return start, stop self.expr = ExprMem(self.expr.arg, self.sz) return start, stop
class bs_dr0gp
class bs_dr0gp(sh4_dgpreg): parser = d_gpreg_gpreg def decode(self, v): self.expr = ExprMem(gpregs.expr[v] + R0, self.sz) return True def encode(self): res = match_expr(self.expr, ExprMem(R0 + jra, self.sz), [jra]) if not res: return False r = res[jra] if not r in gpregs.expr: return False self.value = gpregs.expr.index(r) return True
Ancestors (in MRO)
- bs_dr0gp
- sh4_dgpreg
- sh4_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_dgpreg
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def decode(
self, v)
Inheritance:
sh4_dgpreg
.decode
def decode(self, v): self.expr = ExprMem(gpregs.expr[v] + R0, self.sz) return True
def encode(
self)
Inheritance:
sh4_dgpreg
.encode
def encode(self): res = match_expr(self.expr, ExprMem(R0 + jra, self.sz), [jra]) if not res: return False r = res[jra] if not r in gpregs.expr: return False self.value = gpregs.expr.index(r) return True
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_dgpreg
.fromstring
def fromstring(self, text, loc_db, parser_result=None): start, stop = super(sh4_dgpreg, self).fromstring(text, loc_db, parser_result) if start is None or self.expr == [None]: return start, stop self.expr = ExprMem(self.expr.arg, self.sz) return start, stop
class instruction_sh4
class instruction_sh4(instruction): __slots__ = [] delayslot = 0 def __init__(self, *args, **kargs): super(instruction_sh4, self).__init__(*args, **kargs) def dstflow(self): return self.name.startswith('J') @staticmethod def arg2str(expr, index=None, loc_db=None): if isinstance(expr, ExprId) or isinstance(expr, ExprInt): return str(expr) elif expr.is_loc(): if loc_db is not None: return loc_db.pretty_str(expr.loc_key) else: return str(expr) assert(isinstance(expr, ExprMem)) expr = expr.arg if isinstance(expr, ExprOp): if expr.op == "predec": s = '-%s' % expr.args[0] elif expr.op == "postinc": s = '%s+' % expr.args[0] else: s = ','.join([str(x).replace('(', '').replace(')', '') for x in expr.args]) s = "(%s)"%s s = "@%s" % s elif isinstance(expr, ExprId): s = "@%s" % expr else: raise NotImplementedError('zarb arg2str') return s """ def dstflow2label(self, loc_db): e = self.args[0] if not isinstance(e, ExprInt): return if self.name == 'BLX': ad = e.arg+8+self.offset else: ad = e.arg+8+self.offset l = loc_db.get_or_create_offset_location(ad) s = ExprId(l, e.size) self.args[0] = s """ def breakflow(self): if self.name.startswith('J'): return True return False def is_subcall(self): return self.name == 'JSR' def getdstflow(self, loc_db): return [self.args[0]] def splitflow(self): return self.name == 'JSR' def get_symbol_size(self, symbol, loc_db): return 32 def fixDstOffset(self): e = self.args[0] if self.offset is None: raise ValueError('symbol not resolved %s' % l) if not isinstance(e, ExprInt): log.debug('dyn dst %r', e) return off = e.arg - (self.offset + 4 + self.l) print hex(off) if int(off % 4): raise ValueError('strange offset! %r' % off) self.args[0] = ExprInt(off, 32) print 'final', self.args[0] def get_args_expr(self): args = [a for a in self.args] return args
Ancestors (in MRO)
- instruction_sh4
- miasm2.core.cpu.instruction
- __builtin__.object
Class variables
var additional_info
var args
var b
var data
var delayslot
var l
var mode
var name
var offset
Static methods
def arg2str(
expr, index=None, loc_db=None)
@staticmethod def arg2str(expr, index=None, loc_db=None): if isinstance(expr, ExprId) or isinstance(expr, ExprInt): return str(expr) elif expr.is_loc(): if loc_db is not None: return loc_db.pretty_str(expr.loc_key) else: return str(expr) assert(isinstance(expr, ExprMem)) expr = expr.arg if isinstance(expr, ExprOp): if expr.op == "predec": s = '-%s' % expr.args[0] elif expr.op == "postinc": s = '%s+' % expr.args[0] else: s = ','.join([str(x).replace('(', '').replace(')', '') for x in expr.args]) s = "(%s)"%s s = "@%s" % s elif isinstance(expr, ExprId): s = "@%s" % expr else: raise NotImplementedError('zarb arg2str') return s
Methods
def __init__(
self, *args, **kargs)
def __init__(self, *args, **kargs): super(instruction_sh4, self).__init__(*args, **kargs)
def breakflow(
self)
def breakflow(self): if self.name.startswith('J'): return True return False
def dstflow(
self)
def dstflow(self): return self.name.startswith('J')
def fixDstOffset(
self)
def fixDstOffset(self): e = self.args[0] if self.offset is None: raise ValueError('symbol not resolved %s' % l) if not isinstance(e, ExprInt): log.debug('dyn dst %r', e) return off = e.arg - (self.offset + 4 + self.l) print hex(off) if int(off % 4): raise ValueError('strange offset! %r' % off) self.args[0] = ExprInt(off, 32) print 'final', self.args[0]
def gen_args(
self, args)
def gen_args(self, args): out = ', '.join([str(x) for x in args]) return out
def get_args_expr(
self)
def get_args_expr(self): args = [a for a in self.args] return args
def get_asm_next_offset(
self, expr)
def get_asm_next_offset(self, expr): return m2_expr.ExprInt(self.offset+self.l, expr.size)
def get_asm_offset(
self, expr)
def get_asm_offset(self, expr): return m2_expr.ExprInt(self.offset, expr.size)
def get_info(
self, c)
def get_info(self, c): return
def get_symbol_size(
self, symbol, loc_db)
def get_symbol_size(self, symbol, loc_db): return 32
def getdstflow(
self, loc_db)
def getdstflow(self, loc_db): return [self.args[0]]
def is_subcall(
self)
def is_subcall(self): return self.name == 'JSR'
def resolve_args_with_symbols(
self, symbols=None)
def resolve_args_with_symbols(self, symbols=None): if symbols is None: symbols = {} args_out = [] for expr in self.args: # try to resolve symbols using symbols (0 for default value) loc_keys = m2_expr.get_expr_locs(expr) fixed_expr = {} for exprloc in loc_keys: loc_key = exprloc.loc_key names = symbols.get_location_names(loc_key) # special symbols if '$' in names: fixed_expr[exprloc] = self.get_asm_offset(exprloc) continue if '_' in names: fixed_expr[exprloc] = self.get_asm_next_offset(exprloc) continue if not names: raise ValueError('Unresolved symbol: %r' % exprloc) offset = symbols.get_location_offset(loc_key) if offset is None: raise ValueError( 'The offset of loc_key "%s" cannot be determined' % names ) else: # Fix symbol with its offset size = exprloc.size if size is None: default_size = self.get_symbol_size(exprloc, symbols) size = default_size value = m2_expr.ExprInt(offset, size) fixed_expr[exprloc] = value expr = expr.replace_expr(fixed_expr) expr = expr_simp(expr) args_out.append(expr) return args_out
def splitflow(
self)
def splitflow(self): return self.name == 'JSR'
def to_string(
self, loc_db=None)
def to_string(self, loc_db=None): o = "%-10s " % self.name args = [] for i, arg in enumerate(self.args): if not isinstance(arg, m2_expr.Expr): raise ValueError('zarb arg type') x = self.arg2str(arg, i, loc_db) args.append(x) o += self.gen_args(args) return o
class mn_sh4
class mn_sh4(cls_mn): bintree = {} regs = regs_module num = 0 all_mn = [] all_mn_mode = defaultdict(list) all_mn_name = defaultdict(list) all_mn_inst = defaultdict(list) pc = PC # delayslot: # http://resource.renesas.com/lib/eng/e_learnig/sh4/13/index.html delayslot = 0 # unit is instruction instruction instruction = instruction_sh4 def additional_info(self): info = additional_info() return info @classmethod def getbits(cls, bs, attrib, start, n): if not n: return 0 o = 0 if n > bs.getlen() * 8: raise ValueError('not enought bits %r %r' % (n, len(bs.bin) * 8)) while n: i = start / 8 c = cls.getbytes(bs, i) if not c: raise IOError c = ord(c) r = 8 - start % 8 c &= (1 << r) - 1 l = min(r, n) c >>= (r - l) o <<= l o |= c n -= l start += l return o @classmethod def getbytes(cls, bs, offset, l=1): out = "" for _ in xrange(l): n_offset = (offset & ~1) + 1 - offset % 2 out += bs.getbytes(n_offset, 1) offset += 1 return out @classmethod def check_mnemo(cls, fields): l = sum([x.l for x in fields]) assert l == 16, "len %r" % l @classmethod def getmn(cls, name): return name.upper().replace('_', '.') @classmethod def gen_modes(cls, subcls, name, bases, dct, fields): dct['mode'] = None return [(subcls, name, bases, dct, fields)] def value(self, mode): v = super(mn_sh4, self).value(mode) return [x[::-1] for x in v]
Ancestors (in MRO)
- mn_sh4
- miasm2.core.cpu.cls_mn
- __builtin__.object
Class variables
var alignment
var all_mn
var all_mn_inst
var all_mn_mode
var all_mn_name
var args_symb
var bintree
var delayslot
var instruction
var num
var pc
var regs
Methods
def add_pre_dis_info(
self, prefix=None)
def add_pre_dis_info(self, prefix=None): return True
def additional_info(
self)
def additional_info(self): info = additional_info() return info
def args2str(
self)
def args2str(self): args = [] for arg in self.args: # XXX todo test if not (isinstance(arg, m2_expr.Expr) or isinstance(arg.expr, m2_expr.Expr)): raise ValueError('zarb arg type') x = str(arg) args.append(x) return args
def asm(
cls, instr, symbols=None)
Re asm instruction by searching mnemo using name and args. We then can modify args and get the hex of a modified instruction
@classmethod def asm(cls, instr, symbols=None): """ Re asm instruction by searching mnemo using name and args. We then can modify args and get the hex of a modified instruction """ clist = cls.all_mn_name[instr.name] clist = [x for x in clist] vals = [] candidates = [] args = instr.resolve_args_with_symbols(symbols) for cc in clist: for c in cls.get_cls_instance( cc, instr.mode, instr.additional_info): cannot_parse = False if len(c.args) != len(instr.args): continue # only fix args expr for i in xrange(len(c.args)): c.args[i].expr = args[i] v = c.value(instr.mode) if not v: log.debug("cannot encode %r", c) cannot_parse = True if cannot_parse: continue vals += v candidates.append((c, v)) if len(vals) == 0: raise ValueError('cannot asm %r %r' % (instr.name, [str(x) for x in instr.args])) if len(vals) != 1: log.debug('asm multiple args ret default') vals = cls.filter_asm_candidates(instr, candidates) return vals
def check_mnemo(
cls, fields)
@classmethod def check_mnemo(cls, fields): l = sum([x.l for x in fields]) assert l == 16, "len %r" % l
def decoded2bytes(
self, result)
def decoded2bytes(self, result): if not result: return [] out = [] for decoded in result: decoded.sort() o = self.encodefields(decoded) if o is None: continue out.append(o) out = list(set(out)) return out
def dis(
cls, bs_o, mode_o=None, offset=0)
@classmethod def dis(cls, bs_o, mode_o = None, offset=0): if not isinstance(bs_o, bin_stream): bs_o = bin_stream_str(bs_o) bs_o.enter_atomic_mode() offset_o = offset try: pre_dis_info, bs, mode, offset, prefix_len = cls.pre_dis( bs_o, mode_o, offset) except: bs_o.leave_atomic_mode() raise candidates = cls.guess_mnemo(bs, mode, pre_dis_info, offset) if not candidates: bs_o.leave_atomic_mode() raise Disasm_Exception('cannot disasm (guess) at %X' % offset) out = [] out_c = [] if hasattr(bs, 'getlen'): bs_l = bs.getlen() else: bs_l = len(bs) alias = False for c in candidates: log.debug("*" * 40, mode, c.mode) log.debug(c.fields) c = cls.all_mn_inst[c][0] c.reset_class() c.mode = mode if not c.add_pre_dis_info(pre_dis_info): continue todo = {} getok = True fname_values = dict(pre_dis_info) offset_b = offset * 8 total_l = 0 for i, f in enumerate(c.fields_order): if f.flen is not None: l = f.flen(mode, fname_values) else: l = f.l if l is not None: total_l += l f.l = l f.is_present = True log.debug("FIELD %s %s %s %s", f.__class__, f.fname, offset_b, l) if bs_l * 8 - offset_b < l: getok = False break try: bv = cls.getbits(bs, mode, offset_b, l) except: bs_o.leave_atomic_mode() raise offset_b += l if not f.fname in fname_values: fname_values[f.fname] = bv todo[i] = bv else: f.is_present = False todo[i] = None if not getok: continue c.l = prefix_len + total_l / 8 for i in c.to_decode: f = c.fields_order[i] if f.is_present: ret = f.decode(todo[i]) if not ret: log.debug("cannot decode %r", f) break if not ret: continue for a in c.args: a.expr = expr_simp(a.expr) c.b = cls.getbytes(bs, offset_o, c.l) c.offset = offset_o c = c.post_dis() if c is None: continue c_args = [a.expr for a in c.args] instr = cls.instruction(c.name, mode, c_args, additional_info=c.additional_info()) instr.l = prefix_len + total_l / 8 instr.b = cls.getbytes(bs, offset_o, instr.l) instr.offset = offset_o instr.get_info(c) if c.alias: alias = True out.append(instr) out_c.append(c) bs_o.leave_atomic_mode() if not out: raise Disasm_Exception('cannot disasm at %X' % offset_o) if len(out) != 1: if not alias: log.warning('dis multiple args ret default') for i, o in enumerate(out_c): if o.alias: return out[i] raise NotImplementedError('Multiple disas: \n' + "\n".join([str(x) for x in out])) return out[0]
def dup_info(
self, infos)
def dup_info(self, infos): return
def encodefields(
self, decoded)
def encodefields(self, decoded): bits = bitobj() for _, f in decoded: setattr(self, f.fname, f) if f.value is None: continue bits.putbits(f.value, f.l) return bits.tostring()
def filter_asm_candidates(
cls, instr, candidates)
@classmethod def filter_asm_candidates(cls, instr, candidates): o = [] for _, v in candidates: o += v o.sort(key=len) return o
def fromstring(
cls, text, loc_db, mode=None)
@classmethod def fromstring(cls, text, loc_db, mode = None): global total_scans name = re.search('(\S+)', text).groups() if not name: raise ValueError('cannot find name', text) name = name[0] if not name in cls.all_mn_name: raise ValueError('unknown name', name) clist = [x for x in cls.all_mn_name[name]] out = [] out_args = [] parsers = defaultdict(dict) for cc in clist: for c in cls.get_cls_instance(cc, mode): args_expr = [] args_str = text[len(name):].strip(' ') start = 0 cannot_parse = False len_o = len(args_str) for i, f in enumerate(c.args): start_i = len_o - len(args_str) if type(f.parser) == tuple: parser = f.parser else: parser = (f.parser,) for p in parser: if p in parsers[(i, start_i)]: continue try: total_scans += 1 v, start, stop = p.scanString(args_str).next() except StopIteration: v, start, stop = [None], None, None if start != 0: v, start, stop = [None], None, None if v != [None]: v = f.asm_ast_to_expr(v[0], loc_db) if v is None: v, start, stop = [None], None, None parsers[(i, start_i)][p] = v, start, stop start, stop = f.fromstring(args_str, loc_db, parsers[(i, start_i)]) if start != 0: log.debug("cannot fromstring %r", args_str) cannot_parse = True break if f.expr is None: raise NotImplementedError('not fully functional') f.expr = expr_simp(f.expr) args_expr.append(f.expr) args_str = args_str[stop:].strip(' ') if args_str.startswith(','): args_str = args_str[1:] args_str = args_str.strip(' ') if args_str: cannot_parse = True if cannot_parse: continue out.append(c) out_args.append(args_expr) break if len(out) == 0: raise ValueError('cannot fromstring %r' % text) if len(out) != 1: log.debug('fromstring multiple args ret default') c = out[0] c_args = out_args[0] instr = cls.instruction(c.name, mode, c_args, additional_info=c.additional_info()) return instr
def gen_args(
self, args)
def gen_args(self, args): out = ', '.join([str(x) for x in args]) return out
def gen_modes(
cls, subcls, name, bases, dct, fields)
@classmethod def gen_modes(cls, subcls, name, bases, dct, fields): dct['mode'] = None return [(subcls, name, bases, dct, fields)]
def get_cls_instance(
cls, cc, mode, infos=None)
@classmethod def get_cls_instance(cls, cc, mode, infos=None): c = cls.all_mn_inst[cc][0] c.reset_class() c.add_pre_dis_info() c.dup_info(infos) c.mode = mode yield c
def getbits(
cls, bs, attrib, start, n)
@classmethod def getbits(cls, bs, attrib, start, n): if not n: return 0 o = 0 if n > bs.getlen() * 8: raise ValueError('not enought bits %r %r' % (n, len(bs.bin) * 8)) while n: i = start / 8 c = cls.getbytes(bs, i) if not c: raise IOError c = ord(c) r = 8 - start % 8 c &= (1 << r) - 1 l = min(r, n) c >>= (r - l) o <<= l o |= c n -= l start += l return o
def getbytes(
cls, bs, offset, l=1)
@classmethod def getbytes(cls, bs, offset, l=1): out = "" for _ in xrange(l): n_offset = (offset & ~1) + 1 - offset % 2 out += bs.getbytes(n_offset, 1) offset += 1 return out
def getdstflow(
self, loc_db)
def getdstflow(self, loc_db): return [self.args[0].expr]
def getmn(
cls, name)
@classmethod def getmn(cls, name): return name.upper().replace('_', '.')
def guess_mnemo(
cls, bs, attrib, pre_dis_info, offset)
@classmethod def guess_mnemo(cls, bs, attrib, pre_dis_info, offset): candidates = [] candidates = set() fname_values = pre_dis_info todo = [(dict(fname_values), branch, offset * 8) for branch in cls.bintree.items()] for fname_values, branch, offset_b in todo: (l, fmask, fbits, fname, flen), vals = branch if flen is not None: l = flen(attrib, fname_values) if l is not None: try: v = cls.getbits(bs, attrib, offset_b, l) except IOError: # Raised if offset is out of bound continue offset_b += l if v & fmask != fbits: continue if fname is not None and not fname in fname_values: fname_values[fname] = v for nb, v in vals.items(): if 'mn' in nb: candidates.update(v) else: todo.append((dict(fname_values), (nb, v), offset_b)) return [c for c in candidates]
def init_class(
self)
def init_class(self): args = [] fields_order = [] to_decode = [] off = 0 for i, fc in enumerate(self.fields): f = fc.gen(self) f.offset = off off += f.l fields_order.append(f) to_decode.append((i, f)) if isinstance(f, m_arg): args.append(f) if f.fname: setattr(self, f.fname, f) if hasattr(self, 'args_permut'): args = [args[self.args_permut[i]] for i in xrange(len(self.args_permut))] to_decode.sort(key=lambda x: (x[1].order, x[0])) to_decode = [fields_order.index(f[1]) for f in to_decode] self.args = args self.fields_order = fields_order self.to_decode = to_decode
def mod_fields(
cls, fields)
@classmethod def mod_fields(cls, fields): return fields
def parse_prefix(
self, v)
def parse_prefix(self, v): return 0
def post_dis(
self)
def post_dis(self): return self
def pre_dis(
cls, v_o, attrib, offset)
@classmethod def pre_dis(cls, v_o, attrib, offset): return {}, v_o, attrib, offset, 0
def reset_class(
self)
def reset_class(self): for f in self.fields_order: if f.strbits and isbin(f.strbits): f.value = int(f.strbits, 2) elif 'default_val' in f.kargs: f.value = int(f.kargs['default_val'], 2) else: f.value = None if f.fname: setattr(self, f.fname, f)
def set_dst_symbol(
self, loc_db)
def set_dst_symbol(self, loc_db): dst = self.getdstflow(loc_db) args = [] for d in dst: if isinstance(d, m2_expr.ExprInt): l = loc_db.get_or_create_offset_location(int(d)) a = m2_expr.ExprId(l.name, d.size) else: a = d args.append(a) self.args_symb = args
def value(
self, mode)
def value(self, mode): v = super(mn_sh4, self).value(mode) return [x[::-1] for x in v]
class sh4_arg
class sh4_arg(m_arg): def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
Ancestors (in MRO)
- sh4_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Methods
def asm_ast_to_expr(
self, arg, loc_db)
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def fromstring(
self, text, loc_db, parser_result=None)
def fromstring(self, text, loc_db, parser_result=None): if parser_result: e, start, stop = parser_result[self.parser] self.expr = e return start, stop try: v, start, stop = self.parser.scanString(text).next() except StopIteration: return None, None arg = v[0] expr = self.asm_ast_to_expr(arg, loc_db) self.expr = expr return start, stop
class sh4_bgpreg
class sh4_bgpreg(sh4_reg): reg_info = bgpregs parser = reg_info.parser
Ancestors (in MRO)
- sh4_bgpreg
- sh4_reg
- miasm2.core.cpu.reg_noarg
- sh4_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_reg
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def check_fbits(
self, v)
Inheritance:
sh4_reg
.check_fbits
def check_fbits(self, v): return v & self.fmask == self.fbits
def decode(
self, v)
def decode(self, v): v = v & self.lmask if v >= len(self.reg_info.expr): return False self.expr = self.reg_info.expr[v] return True
def encode(
self)
def encode(self): if not self.expr in self.reg_info.expr: log.debug("cannot encode reg %r", self.expr) return False self.value = self.reg_info.expr.index(self.expr) if self.value > self.lmask: log.debug("cannot encode field value %x %x", self.value, self.lmask) return False return True
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_reg
.fromstring
def fromstring(self, text, loc_db, parser_result=None): if parser_result: e, start, stop = parser_result[self.parser] self.expr = e return start, stop try: v, start, stop = self.parser.scanString(text).next() except StopIteration: return None, None arg = v[0] expr = self.parses_to_expr(arg, loc_db) self.expr = expr return start, stop
class sh4_dgbrimm8
class sh4_dgbrimm8(sh4_dgpreg): parser = dgbr_imm def decode(self, v): s = self.sz self.expr = ExprMem(GBR + ExprInt(v * s / 8, 32), s) return True def encode(self): e = self.expr s = self.sz if e == ExprMem(GBR, 32): self.value = 0 return True res = match_expr(self.expr, ExprMem(GBR + jra, s), [jra]) if not res: return False if not isinstance(res[jra], ExprInt): return False self.value = int(res[jra]) / (s / 8) return True
Ancestors (in MRO)
- sh4_dgbrimm8
- sh4_dgpreg
- sh4_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_dgpreg
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def decode(
self, v)
Inheritance:
sh4_dgpreg
.decode
def decode(self, v): s = self.sz self.expr = ExprMem(GBR + ExprInt(v * s / 8, 32), s) return True
def encode(
self)
Inheritance:
sh4_dgpreg
.encode
def encode(self): e = self.expr s = self.sz if e == ExprMem(GBR, 32): self.value = 0 return True res = match_expr(self.expr, ExprMem(GBR + jra, s), [jra]) if not res: return False if not isinstance(res[jra], ExprInt): return False self.value = int(res[jra]) / (s / 8) return True
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_dgpreg
.fromstring
def fromstring(self, text, loc_db, parser_result=None): start, stop = super(sh4_dgpreg, self).fromstring(text, loc_db, parser_result) if start is None or self.expr == [None]: return start, stop self.expr = ExprMem(self.expr.arg, self.sz) return start, stop
class sh4_dgpreg
class sh4_dgpreg(sh4_arg): parser = dgpregs_base def fromstring(self, text, loc_db, parser_result=None): start, stop = super(sh4_dgpreg, self).fromstring(text, loc_db, parser_result) if start is None or self.expr == [None]: return start, stop self.expr = ExprMem(self.expr.arg, self.sz) return start, stop def decode(self, v): r = gpregs.expr[v] self.expr = ExprMem(r, self.sz) return True def encode(self): e = self.expr if not isinstance(e, ExprMem): return False if not isinstance(e.arg, ExprId): return False v = gpregs.expr.index(e.arg) self.value = v return True
Ancestors (in MRO)
- sh4_dgpreg
- sh4_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
var parser
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_arg
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def decode(
self, v)
def decode(self, v): r = gpregs.expr[v] self.expr = ExprMem(r, self.sz) return True
def encode(
self)
def encode(self): e = self.expr if not isinstance(e, ExprMem): return False if not isinstance(e.arg, ExprId): return False v = gpregs.expr.index(e.arg) self.value = v return True
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_arg
.fromstring
def fromstring(self, text, loc_db, parser_result=None): start, stop = super(sh4_dgpreg, self).fromstring(text, loc_db, parser_result) if start is None or self.expr == [None]: return start, stop self.expr = ExprMem(self.expr.arg, self.sz) return start, stop
class sh4_dgpreg_imm
class sh4_dgpreg_imm(sh4_dgpreg): parser = dgpregs_ir def decode(self, v): p = self.parent r = gpregs.expr[v] s = self.sz d = ExprInt(p.disp.value * s / 8, 32) e = ExprMem(r + d, s) self.expr = e return True def encode(self): e = self.expr p = self.parent s = self.sz if not isinstance(e, ExprMem): return False if isinstance(e.arg, ExprId): v = gpregs.expr.index(e.arg) p.disp.value = 0 elif isinstance(e.arg, ExprOp): res = match_expr(e, ExprMem(jra + jrb, self.sz), [jra, jrb]) if not res: return False if not isinstance(res[jra], ExprId): return False if not isinstance(res[jrb], ExprInt): return False d = int(res[jrb]) p.disp.value = d / (s / 8) if not res[jra] in gpregs.expr: return False v = gpregs.expr.index(res[jra]) else: return False self.value = v return True
Ancestors (in MRO)
- sh4_dgpreg_imm
- sh4_dgpreg
- sh4_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_dgpreg
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def decode(
self, v)
Inheritance:
sh4_dgpreg
.decode
def decode(self, v): p = self.parent r = gpregs.expr[v] s = self.sz d = ExprInt(p.disp.value * s / 8, 32) e = ExprMem(r + d, s) self.expr = e return True
def encode(
self)
Inheritance:
sh4_dgpreg
.encode
def encode(self): e = self.expr p = self.parent s = self.sz if not isinstance(e, ExprMem): return False if isinstance(e.arg, ExprId): v = gpregs.expr.index(e.arg) p.disp.value = 0 elif isinstance(e.arg, ExprOp): res = match_expr(e, ExprMem(jra + jrb, self.sz), [jra, jrb]) if not res: return False if not isinstance(res[jra], ExprId): return False if not isinstance(res[jrb], ExprInt): return False d = int(res[jrb]) p.disp.value = d / (s / 8) if not res[jra] in gpregs.expr: return False v = gpregs.expr.index(res[jra]) else: return False self.value = v return True
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_dgpreg
.fromstring
def fromstring(self, text, loc_db, parser_result=None): start, stop = super(sh4_dgpreg, self).fromstring(text, loc_db, parser_result) if start is None or self.expr == [None]: return start, stop self.expr = ExprMem(self.expr.arg, self.sz) return start, stop
class sh4_dgpregpdec
class sh4_dgpregpdec(sh4_arg): parser = dgpregs_postinc op = "preinc"
Ancestors (in MRO)
- sh4_dgpregpdec
- sh4_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
var op
var parser
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_arg
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_arg
.fromstring
def fromstring(self, text, loc_db, parser_result=None): if parser_result: e, start, stop = parser_result[self.parser] self.expr = e return start, stop try: v, start, stop = self.parser.scanString(text).next() except StopIteration: return None, None arg = v[0] expr = self.asm_ast_to_expr(arg, loc_db) self.expr = expr return start, stop
class sh4_dgpregpinc
class sh4_dgpregpinc(sh4_arg): parser = dgpregs_p def fromstring(self, text, loc_db, parser_result=None): start, stop = super(sh4_dgpregpinc, self).fromstring(text, loc_db, parser_result) if self.expr == [None]: return None, None if not isinstance(self.expr.arg, ExprOp): return None, None if self.expr.arg.op != self.op: return None, None return start, stop def decode(self, v): r = gpregs.expr[v] e = ExprOp(self.op, r) self.expr = ExprMem(e, self.sz) return True def encode(self): e = self.expr if not isinstance(e, ExprMem): return False e = e.arg res = match_expr(e, ExprOp(self.op, jra), [jra]) if not res: return False r = res[jra] if not r in gpregs.expr: return False v = gpregs.expr.index(r) self.value = v return True
Ancestors (in MRO)
- sh4_dgpregpinc
- sh4_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
var parser
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_arg
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def decode(
self, v)
def decode(self, v): r = gpregs.expr[v] e = ExprOp(self.op, r) self.expr = ExprMem(e, self.sz) return True
def encode(
self)
def encode(self): e = self.expr if not isinstance(e, ExprMem): return False e = e.arg res = match_expr(e, ExprOp(self.op, jra), [jra]) if not res: return False r = res[jra] if not r in gpregs.expr: return False v = gpregs.expr.index(r) self.value = v return True
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_arg
.fromstring
def fromstring(self, text, loc_db, parser_result=None): start, stop = super(sh4_dgpregpinc, self).fromstring(text, loc_db, parser_result) if self.expr == [None]: return None, None if not isinstance(self.expr.arg, ExprOp): return None, None if self.expr.arg.op != self.op: return None, None return start, stop
class sh4_dpc16imm
class sh4_dpc16imm(sh4_dgpreg): parser = deref_pc def decode(self, v): self.expr = ExprMem(PC + ExprInt(v * 2 + 4, 32), 16) return True def calcdisp(self, v): v = (int(v) - 4) / 2 if not 0 < v <= 0xff: return None return v def encode(self): res = match_expr(self.expr, ExprMem(PC + jra, 16), [jra]) if not res: return False if not isinstance(res[jra], ExprInt): return False v = self.calcdisp(res[jra]) if v is None: return False self.value = v return True
Ancestors (in MRO)
- sh4_dpc16imm
- sh4_dgpreg
- sh4_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_dgpreg
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def calcdisp(
self, v)
def calcdisp(self, v): v = (int(v) - 4) / 2 if not 0 < v <= 0xff: return None return v
def decode(
self, v)
Inheritance:
sh4_dgpreg
.decode
def decode(self, v): self.expr = ExprMem(PC + ExprInt(v * 2 + 4, 32), 16) return True
def encode(
self)
Inheritance:
sh4_dgpreg
.encode
def encode(self): res = match_expr(self.expr, ExprMem(PC + jra, 16), [jra]) if not res: return False if not isinstance(res[jra], ExprInt): return False v = self.calcdisp(res[jra]) if v is None: return False self.value = v return True
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_dgpreg
.fromstring
def fromstring(self, text, loc_db, parser_result=None): start, stop = super(sh4_dgpreg, self).fromstring(text, loc_db, parser_result) if start is None or self.expr == [None]: return start, stop self.expr = ExprMem(self.expr.arg, self.sz) return start, stop
class sh4_dpc32imm
class sh4_dpc32imm(sh4_dpc16imm): parser = deref_pcimm def decode(self, v): self.expr = ExprMem( (PC & ExprInt(0xfffffffc, 32)) + ExprInt(v * 4 + 4, 32), 32) return True def calcdisp(self, v): v = (int(v) - 4) / 4 if not 0 < v <= 0xff: return None return v def encode(self): res = match_expr( self.expr, ExprMem((PC & ExprInt(0xFFFFFFFC, 32)) + jra, 32), [jra]) if not res: return False if not isinstance(res[jra], ExprInt): return False v = self.calcdisp(res[jra]) if v is None: return False self.value = v return True
Ancestors (in MRO)
- sh4_dpc32imm
- sh4_dpc16imm
- sh4_dgpreg
- sh4_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_dpc16imm
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def calcdisp(
self, v)
Inheritance:
sh4_dpc16imm
.calcdisp
def calcdisp(self, v): v = (int(v) - 4) / 4 if not 0 < v <= 0xff: return None return v
def decode(
self, v)
Inheritance:
sh4_dpc16imm
.decode
def decode(self, v): self.expr = ExprMem( (PC & ExprInt(0xfffffffc, 32)) + ExprInt(v * 4 + 4, 32), 32) return True
def encode(
self)
Inheritance:
sh4_dpc16imm
.encode
def encode(self): res = match_expr( self.expr, ExprMem((PC & ExprInt(0xFFFFFFFC, 32)) + jra, 32), [jra]) if not res: return False if not isinstance(res[jra], ExprInt): return False v = self.calcdisp(res[jra]) if v is None: return False self.value = v return True
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_dpc16imm
.fromstring
def fromstring(self, text, loc_db, parser_result=None): start, stop = super(sh4_dgpreg, self).fromstring(text, loc_db, parser_result) if start is None or self.expr == [None]: return start, stop self.expr = ExprMem(self.expr.arg, self.sz) return start, stop
class sh4_dr
class sh4_dr(sh4_reg): reg_info = dregs parser = reg_info.parser
Ancestors (in MRO)
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_reg
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def check_fbits(
self, v)
Inheritance:
sh4_reg
.check_fbits
def check_fbits(self, v): return v & self.fmask == self.fbits
def decode(
self, v)
def decode(self, v): v = v & self.lmask if v >= len(self.reg_info.expr): return False self.expr = self.reg_info.expr[v] return True
def encode(
self)
def encode(self): if not self.expr in self.reg_info.expr: log.debug("cannot encode reg %r", self.expr) return False self.value = self.reg_info.expr.index(self.expr) if self.value > self.lmask: log.debug("cannot encode field value %x %x", self.value, self.lmask) return False return True
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_reg
.fromstring
def fromstring(self, text, loc_db, parser_result=None): if parser_result: e, start, stop = parser_result[self.parser] self.expr = e return start, stop try: v, start, stop = self.parser.scanString(text).next() except StopIteration: return None, None arg = v[0] expr = self.parses_to_expr(arg, loc_db) self.expr = expr return start, stop
class sh4_freg
class sh4_freg(sh4_reg): reg_info = fregs parser = reg_info.parser
Ancestors (in MRO)
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_reg
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def check_fbits(
self, v)
Inheritance:
sh4_reg
.check_fbits
def check_fbits(self, v): return v & self.fmask == self.fbits
def decode(
self, v)
def decode(self, v): v = v & self.lmask if v >= len(self.reg_info.expr): return False self.expr = self.reg_info.expr[v] return True
def encode(
self)
def encode(self): if not self.expr in self.reg_info.expr: log.debug("cannot encode reg %r", self.expr) return False self.value = self.reg_info.expr.index(self.expr) if self.value > self.lmask: log.debug("cannot encode field value %x %x", self.value, self.lmask) return False return True
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_reg
.fromstring
def fromstring(self, text, loc_db, parser_result=None): if parser_result: e, start, stop = parser_result[self.parser] self.expr = e return start, stop try: v, start, stop = self.parser.scanString(text).next() except StopIteration: return None, None arg = v[0] expr = self.parses_to_expr(arg, loc_db) self.expr = expr return start, stop
class sh4_gpreg
class sh4_gpreg(sh4_reg): reg_info = gpregs parser = reg_info.parser
Ancestors (in MRO)
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_reg
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def check_fbits(
self, v)
Inheritance:
sh4_reg
.check_fbits
def check_fbits(self, v): return v & self.fmask == self.fbits
def decode(
self, v)
def decode(self, v): v = v & self.lmask if v >= len(self.reg_info.expr): return False self.expr = self.reg_info.expr[v] return True
def encode(
self)
def encode(self): if not self.expr in self.reg_info.expr: log.debug("cannot encode reg %r", self.expr) return False self.value = self.reg_info.expr.index(self.expr) if self.value > self.lmask: log.debug("cannot encode field value %x %x", self.value, self.lmask) return False return True
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_reg
.fromstring
def fromstring(self, text, loc_db, parser_result=None): if parser_result: e, start, stop = parser_result[self.parser] self.expr = e return start, stop try: v, start, stop = self.parser.scanString(text).next() except StopIteration: return None, None arg = v[0] expr = self.parses_to_expr(arg, loc_db) self.expr = expr return start, stop
class sh4_gpreg_noarg
class sh4_gpreg_noarg(reg_noarg, ): reg_info = gpregs parser = reg_info.parser
Ancestors (in MRO)
- sh4_gpreg_noarg
- miasm2.core.cpu.reg_noarg
- __builtin__.object
Class variables
var parser
var reg_info
Methods
def check_fbits(
self, v)
def check_fbits(self, v): return v & self.fmask == self.fbits
def decode(
self, v)
def decode(self, v): v = v & self.lmask if v >= len(self.reg_info.expr): return False self.expr = self.reg_info.expr[v] return True
def encode(
self)
def encode(self): if not self.expr in self.reg_info.expr: log.debug("cannot encode reg %r", self.expr) return False self.value = self.reg_info.expr.index(self.expr) if self.value > self.lmask: log.debug("cannot encode field value %x %x", self.value, self.lmask) return False return True
def fromstring(
self, text, loc_db, parser_result=None)
def fromstring(self, text, loc_db, parser_result=None): if parser_result: e, start, stop = parser_result[self.parser] self.expr = e return start, stop try: v, start, stop = self.parser.scanString(text).next() except StopIteration: return None, None arg = v[0] expr = self.parses_to_expr(arg, loc_db) self.expr = expr return start, stop
class sh4_imm
class sh4_imm(imm_noarg, sh4_arg): parser = base_expr pass
Ancestors (in MRO)
Class variables
var intmask
var intsize
var parser
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_arg
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def decode(
self, v)
def decode(self, v): v = v & self.lmask v = self.decodeval(v) e = self.int2expr(v) if not e: return False self.expr = e return True
def decodeval(
self, v)
def decodeval(self, v): return v
def encode(
self)
def encode(self): v = self.expr2int(self.expr) if v is None: return False v = self.encodeval(v) if v is False: return False if v > self.lmask: return False self.value = v return True
def encodeval(
self, v)
def encodeval(self, v): if v > self.lmask: return False return v
def expr2int(
self, e)
def expr2int(self, e): if not isinstance(e, m2_expr.ExprInt): return None v = int(e) if v & ~self.intmask != 0: return None return v
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_arg
.fromstring
def fromstring(self, text, loc_db, parser_result=None): if parser_result: e, start, stop = parser_result[self.parser] else: try: e, start, stop = self.parser.scanString(text).next() except StopIteration: return None, None if e == [None]: return None, None assert(isinstance(e, m2_expr.Expr)) if isinstance(e, tuple): self.expr = self.int2expr(e[1]) elif isinstance(e, m2_expr.Expr): self.expr = e else: raise TypeError('zarb expr') if self.expr is None: log.debug('cannot fromstring int %r', text) return None, None return start, stop
def int2expr(
self, v)
def int2expr(self, v): if (v & ~self.intmask) != 0: return None return m2_expr.ExprInt(v, self.intsize)
class sh4_pc32imm
class sh4_pc32imm(sh4_arg): parser = pcdisp def decode(self, v): self.expr = (PC & ExprInt(0xfffffffc, 32)) + ExprInt(v * 4 + 4, 32) return True def encode(self): res = match_expr(self.expr, (PC & ExprInt(0xfffffffc, 32)) + jra, [jra]) if not res: return False if not isinstance(res[jra], ExprInt): return False v = (int(res[jra]) - 4) / 4 if v is None: return False self.value = v return True
Ancestors (in MRO)
- sh4_pc32imm
- sh4_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
var parser
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_arg
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def decode(
self, v)
def decode(self, v): self.expr = (PC & ExprInt(0xfffffffc, 32)) + ExprInt(v * 4 + 4, 32) return True
def encode(
self)
def encode(self): res = match_expr(self.expr, (PC & ExprInt(0xfffffffc, 32)) + jra, [jra]) if not res: return False if not isinstance(res[jra], ExprInt): return False v = (int(res[jra]) - 4) / 4 if v is None: return False self.value = v return True
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_arg
.fromstring
def fromstring(self, text, loc_db, parser_result=None): if parser_result: e, start, stop = parser_result[self.parser] self.expr = e return start, stop try: v, start, stop = self.parser.scanString(text).next() except StopIteration: return None, None arg = v[0] expr = self.asm_ast_to_expr(arg, loc_db) self.expr = expr return start, stop
class sh4_reg
class sh4_reg(reg_noarg, sh4_arg): pass
Ancestors (in MRO)
Class variables
var parser
var reg_info
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_arg
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def check_fbits(
self, v)
def check_fbits(self, v): return v & self.fmask == self.fbits
def decode(
self, v)
def decode(self, v): v = v & self.lmask if v >= len(self.reg_info.expr): return False self.expr = self.reg_info.expr[v] return True
def encode(
self)
def encode(self): if not self.expr in self.reg_info.expr: log.debug("cannot encode reg %r", self.expr) return False self.value = self.reg_info.expr.index(self.expr) if self.value > self.lmask: log.debug("cannot encode field value %x %x", self.value, self.lmask) return False return True
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_arg
.fromstring
def fromstring(self, text, loc_db, parser_result=None): if parser_result: e, start, stop = parser_result[self.parser] self.expr = e return start, stop try: v, start, stop = self.parser.scanString(text).next() except StopIteration: return None, None arg = v[0] expr = self.parses_to_expr(arg, loc_db) self.expr = expr return start, stop
class sh4_simm
class sh4_simm(sh4_imm): parser = base_expr def decode(self, v): v = sign_ext(v, self.l, 32) v = self.decodeval(v) self.expr = ExprInt(v, 32) return True def encode(self): if not isinstance(self.expr, ExprInt): return False v = int(self.expr) if (1 << (self.l - 1)) & v: v = -((0xffffffff ^ v) + 1) v = self.encodeval(v) self.value = (v & 0xffffffff) & self.lmask return True
Ancestors (in MRO)
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
sh4_imm
.asm_ast_to_expr
def asm_ast_to_expr(self, arg, loc_db): if isinstance(arg, AstId): if isinstance(arg.name, ExprId): return arg.name if arg.name in gpregs.str: return None loc_key = loc_db.get_or_create_name_location(arg.name) return ExprLoc(loc_key, 32) if isinstance(arg, AstOp): args = [self.asm_ast_to_expr(tmp, loc_db) for tmp in arg.args] if None in args: return None return ExprOp(arg.op, *args) if isinstance(arg, AstInt): return ExprInt(arg.value, 32) if isinstance(arg, AstMem): ptr = self.asm_ast_to_expr(arg.ptr, loc_db) if ptr is None: return None return ExprMem(ptr, arg.size) return None
def decode(
self, v)
def decode(self, v): v = sign_ext(v, self.l, 32) v = self.decodeval(v) self.expr = ExprInt(v, 32) return True
def encode(
self)
def encode(self): if not isinstance(self.expr, ExprInt): return False v = int(self.expr) if (1 << (self.l - 1)) & v: v = -((0xffffffff ^ v) + 1) v = self.encodeval(v) self.value = (v & 0xffffffff) & self.lmask return True
def encodeval(
self, v)
Inheritance:
sh4_imm
.encodeval
def encodeval(self, v): if v > self.lmask: return False return v
def expr2int(
self, e)
def expr2int(self, e): if not isinstance(e, m2_expr.ExprInt): return None v = int(e) if v & ~self.intmask != 0: return None return v
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
sh4_imm
.fromstring
def fromstring(self, text, loc_db, parser_result=None): if parser_result: e, start, stop = parser_result[self.parser] else: try: e, start, stop = self.parser.scanString(text).next() except StopIteration: return None, None if e == [None]: return None, None assert(isinstance(e, m2_expr.Expr)) if isinstance(e, tuple): self.expr = self.int2expr(e[1]) elif isinstance(e, m2_expr.Expr): self.expr = e else: raise TypeError('zarb expr') if self.expr is None: log.debug('cannot fromstring int %r', text) return None, None return start, stop
def int2expr(
self, v)
def int2expr(self, v): if (v & ~self.intmask) != 0: return None return m2_expr.ExprInt(v, self.intsize)