miasm2.arch.ppc.arch module
mport logging rom pyparsing import * rom miasm2.expression.expression import * rom miasm2.core.cpu import * rom collections import defaultdict rom miasm2.core.bin_stream import bin_stream mport miasm2.arch.ppc.regs as regs_module rom miasm2.arch.ppc.regs import * rom miasm2.core.asm_ast import AstInt, AstId, AstMem, AstOp og = logging.getLogger("ppcdis") onsole_handler = logging.StreamHandler() onsole_handler.setFormatter(logging.Formatter("%(levelname)-5s: %(message)s")) og.addHandler(console_handler) og.setLevel(logging.DEBUG) PARENTHESIS = Suppress(Literal("(")) PARENTHESIS = Suppress(Literal(")")) ef cb_deref_imm_reg(tokens): if len(tokens) == 1: return AstMem(tokens[0], 32) elif len(tokens) == 2: return AstMem(tokens[1] + tokens[0], 32) else: raise NotImplementedError('len(tokens) > 2') eref_reg_disp = (Optional(base_expr) + LPARENTHESIS + gpregs.parser + RPARENTHESIS).setParseAction(cb_deref_imm_reg) eref_reg = (LPARENTHESIS + gpregs.parser + RPARENTHESIS).setParseAction(cb_deref_imm_reg) eref = deref_reg | deref_reg_disp lass ppc_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 lass additional_info: def __init__(self): self.except_on_instr = False self.bo_bi_are_defined = False self.bi = 0 self.bo = 0 lass instruction_ppc(instruction): delayslot = 0 def __init__(self, *args, **kargs): super(instruction_ppc, self).__init__(*args, **kargs) @staticmethod def arg2str(e, pos = None, loc_db=None): if isinstance(e, ExprId) or isinstance(e, ExprInt): return str(e) elif isinstance(e, ExprMem): addr = e.arg if isinstance(addr, ExprInt) or isinstance(addr, ExprId): out = '(%s)'%addr elif isinstance(addr, ExprOp): if len(addr.args) == 1: out = '(%s)'%addr elif len(addr.args) == 2: out = '%s(%s)'%(addr.args[1], addr.args[0]) else: raise NotImplementedError('More than two args to ExprOp of address') else: raise NotImplementedError('Invalid memory expression') return out return str(e) @staticmethod def is_conditional_jump(s): return (s[0] == 'B' and s[1:3] in { 'DN', 'DZ', 'LT', 'GT', 'EQ', 'SO', 'GE', 'LE', 'NE', 'NS' }) def dstflow(self): name = self.name if name[-1] == '+' or name[-1] == '-': name = name[:-1] return (name[0] == 'B' and name[-2:] != 'LR' and name[-3:] != 'LRL' and name[-3:] != 'CTR' and name[-4:] != 'CTRL') def dstflow2label(self, loc_db): name = self.name if name[-1] == '+' or name[-1] == '-': name = name[:-1] if name[-1] == 'L': name = name[:-1] elif name[-2:] == 'LA': name = name[:-2] + 'A' if name[-2:] != 'LR' and name[-3:] != 'CTR': if len(self.args) == 2: address_index = 1 else: address_index = 0 e = self.args[address_index] if not isinstance(e, ExprInt): return if name[-1] != 'A': ad = e.arg + self.offset else: ad = e.arg loc_key = loc_db.get_or_create_offset_location(ad) s = ExprLoc(loc_key, e.size) self.args[address_index] = s def breakflow(self): return self.name[0] == 'B' def is_subcall(self): name = self.name if name[-1] == '+' or name[-1] == '-': name = name[0:-1] return name[0] == 'B' and (name[-1] == 'L' or name[-2:-1] == 'LA') def getdstflow(self, loc_db): if 'LR' in self.name: return [ LR ] elif 'CTR' in self.name: return [ CTR ] elif len(self.args) == 2: address_index = 1 else: address_index = 0 return [ self.args[address_index] ] def splitflow(self): ret = False if self.is_conditional_jump(self.name): if self.additional_info.bo & 0b10100 != 0b10100: ret = True ret = ret or self.is_subcall() return ret def get_symbol_size(self, symbol, loc_db): return 32 def fixDstOffset(self): e = self.args[0] if not isinstance(e, ExprInt): log.debug('Dynamic destination offset %r' % e) return if self.name[-1] != 'A': if self.offset is None: raise ValueError('symbol not resolved %s' % self.l) off = e.arg - (self.offset + self.l) if int(off % 4): raise ValueError('Offset %r must be a multiple of four' % off) else: off = e.arg self.args[0] = ExprInt(off, 32) def get_args_expr(self): args = [a for a in self.args] return args def get_asm_offset(self, x): return ExprInt_from(x, self.offset) lass mn_ppc(cls_mn): delayslot = 0 name = "ppc32" regs = regs_module bintree = {} num = 0 all_mn = [] all_mn_mode = defaultdict(list) all_mn_name = defaultdict(list) all_mn_inst = defaultdict(list) instruction = instruction_ppc max_instruction_len = 4 @classmethod def getpc(cls, attrib = None): return PC @classmethod def getsp(cls, attrib = None): return R1 def additional_info(self): info = additional_info() info.bo_bi_are_defined = False if hasattr(self, "bo"): info.bo_bi_are_defined = True info.bi = int(self.bi.strbits, 2) info.bo = int(self.bo.strbits, 2) 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 enough bits %r %r' % (n, len(bs.bin) * 8)) while n: offset = start / 8 n_offset = cls.endian_offset(attrib, offset) c = cls.getbytes(bs, n_offset, 1) 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 endian_offset(cls, attrib, offset): if attrib == "b": return offset else: raise NotImplementedError("bad attrib") @classmethod def check_mnemo(cls, fields): l = sum([x.l for x in fields]) assert l == 32, "len %r" % l @classmethod def getmn(cls, name): return name.upper() @classmethod def mod_fields(cls, fields): l = sum([x.l for x in fields]) return fields @classmethod def gen_modes(cls, subcls, name, bases, dct, fields): dct['mode'] = None return [(subcls, name, bases, dct, fields)] def post_dis(self): return self def value(self, mode): v = super(mn_ppc, self).value(mode) if mode == 'b': return [x for x in v] else: raise NotImplementedError("bad attrib") def get_symbol_size(self, symbol, loc_db, mode): return 32 lass ppc_reg(reg_noarg, ppc_arg): pass lass ppc_gpreg_noarg(reg_noarg): reg_info = gpregs parser = reg_info.parser lass ppc_gpreg_or_0_noarg(reg_noarg): reg_info = gpregs parser = reg_info.parser def decode(self, v): ret = super(ppc_gpreg_or_0_noarg, self).decode(v) if ret == False: return False reg = self.expr if reg == R0: self.expr = ExprInt(0, 32) return ret lass ppc_gpreg(ppc_reg): reg_info = gpregs parser = reg_info.parser lass ppc_gpreg_or_0(ppc_reg): reg_info = gpregs parser = reg_info.parser def decode(self, v): ret = super(ppc_reg, self).decode(v) if ret == False: return False reg = self.expr if reg == R0: self.expr = ExprInt(0, 32) return ret lass ppc_crfreg_noarg(reg_noarg): reg_info = crfregs parser = reg_info.parser lass ppc_crfreg(ppc_reg): reg_info = crfregs parser = reg_info.parser lass ppc_imm(imm_noarg, ppc_arg): parser = base_expr lass ppc_s14imm_branch(ppc_imm): def decode(self, v): v = sign_ext(v << 2, 16, 32) self.expr = ExprInt(v, 32) return True def encode(self): if not isinstance(self.expr, ExprInt): return False v = self.expr.arg.arg if v & 0x3: return False v = v >> 2 if sign_ext(v & self.lmask, 14, 32) != v: return False self.value = v & self.lmask return True lass ppc_s24imm_branch(ppc_imm): def decode(self, v): v = sign_ext(v << 2, 26, 32) self.expr = ExprInt(v, 32) return True def encode(self): if not isinstance(self.expr, ExprInt): return False v = self.expr.arg.arg if v & 0x3: return False v = v >> 2 if sign_ext(v & self.lmask, 24, 32) != v: return False self.value = v & self.lmask return True lass ppc_s16imm(ppc_imm): def decode(self, v): v = sign_ext(v, 16, 32) self.expr = ExprInt(v, 32) return True def encode(self): if not isinstance(self.expr, ExprInt): return False v = self.expr.arg.arg if sign_ext(v & self.lmask, 16, 32) != v: return False self.value = v & self.lmask return True lass ppc_u16imm(ppc_imm): def decode(self, v): if v & self.lmask != v: return False self.expr = ExprInt(v, 32) return True def encode(self): if not isinstance(self.expr, ExprInt): return False v = self.expr.arg.arg if v & self.lmask != v: return False self.value = v & self.lmask return True ef ppc_swap_10(v): return ((v & 0b11111) << 5) | ((v & 0b1111100000) >> 5) lass ppc_spr(ppc_imm): def decode(self, v): self.expr = ExprInt(ppc_swap_10(v), 32) return True def encode(self, e): if not isinstance(e, ExprInt): return False self.value = ppc_swap_10(e.arg) return True lass ppc_tbr(ppc_imm): def decode(self, v): self.expr = ExprInt(ppc_swap_10(v), 32) return True def encode(self, e): if not isinstance(e, ExprInt): return False self.value = ppc_swap_10(e.arg) return True lass ppc_u08imm(ppc_u16imm): pass lass ppc_u05imm(ppc_u16imm): pass lass ppc_u04imm(ppc_u16imm): pass lass ppc_u02imm_noarg(imm_noarg): pass ef ppc_bo_bi_to_mnemo(bo, bi, prefer_taken=True, default_taken=True): bo2mnemo = { 0: 'DNZF', 2: 'DZF', 4: 'F', 8: 'DNZT', 10: 'DZT', 12: 'T', 16: 'DNZ', 18: 'DZ', 20: '' } bi2cond = { 0b00: 'LT', 0b01: 'GT', 0b10: 'EQ', 0b11: 'SO' } bi2ncond = { 0b00: 'GE', 0b01: 'LE', 0b10: 'NE', 0b11: 'NS' } n = bo & 0b11110 if not n in bo2mnemo: raise NotImplementedError("Unknown BO field") mnem = 'B' + bo2mnemo[n] if mnem[-1] == 'T': mnem = mnem[:-1] + bi2cond[bi & 0b11] if mnem[-1] == 'F': mnem = mnem[:-1] + bi2ncond[bi & 0b11] if prefer_taken != default_taken: if prefer_taken: mnem += '+' else: mnem += '-' return mnem ef ppc_all_bo_bi(): for bo in [0, 2, 4, 8, 10, 12, 16, 18, 20]: for bi in xrange(4): yield bo, bi lass ppc_divert_conditional_branch(bs_divert): prio=3 def divert(self, i, candidates): out = [] for cls, _, bases, dct, fields in candidates: bi_i = getfieldindexby_name(fields, 'bi')[1] bo_i = getfieldindexby_name(fields, 'bo')[1] for bo, bi in ppc_all_bo_bi(): nfields = fields[:] nfields[bi_i] = bs(int2bin(bi, 2), fname="bi") nfields[bo_i] = bs(int2bin(bo, 5), fname="bo") ndct = dict(dct) ndct['name'] = ppc_bo_bi_to_mnemo(bo, bi) out.append((cls, ndct['name'], bases, ndct, nfields)) nfields = fields[:] nfields[bi_i] = bs(int2bin(bi, 2), fname="bi") nfields[bo_i] = bs(int2bin(bo+1, 5), fname="bo") ndct = dict(dct) ndct['name'] = ppc_bo_bi_to_mnemo(bo, bi) out.append((cls, ndct['name'], bases, ndct, nfields)) return out lass ppc_deref32(ppc_arg): parser = deref def decode(self, v): v = sign_ext(v, 16, 32) e = self.parent.ra.expr + ExprInt(v, 32) self.expr = ExprMem(e, size=32) return True def encode(self): e = self.expr if not isinstance(e, ExprMem): return False addr = e.arg if isinstance(addr, ExprId) or isinstance(addr, ExprInt): addr = addr + ExprInt(0, 32) elif not isinstance(addr, ExprOp): return False if addr.op != '+': return False if len(addr.args) != 2: return False reg, disp = addr.args[0], addr.args[1] v = int(disp.arg) if sign_ext(v & 0xFFFF, 16, 32) != v: return False v &= 0xFFFF self.value = v self.parent.ra.expr = reg return True ef ppcop(name, fields, args=None, alias=False): dct = {"fields": fields} dct["alias"] = alias if args is not None: dct['args'] = args type(name, (mn_ppc,), dct) d = bs(l=5, cls=(ppc_gpreg,)) a = bs(l=5, cls=(ppc_gpreg,)) a_or_0 = bs(l=5, cls=(ppc_gpreg_or_0,)) b = bs(l=5, cls=(ppc_gpreg,)) s = bs(l=5, cls=(ppc_gpreg,)) rfd = bs(l=3, cls=(ppc_crfreg,)) rfs = bs(l=3, cls=(ppc_crfreg,)) h = bs(l=5, cls=(ppc_u05imm,)) b = bs(l=5, cls=(ppc_u05imm,)) e = bs(l=5, cls=(ppc_u05imm,)) b = bs(l=5, cls=(ppc_u05imm,)) rm = bs(l=8, cls=(ppc_u08imm,)) r = bs(l=4, cls=(ppc_u04imm,)) pr = bs(l=10, cls=(ppc_spr,)) br = bs(l=10, cls=(ppc_tbr,)) 05imm = bs(l=5, cls=(ppc_u05imm,)) 24imm_branch = bs(l=24, cls=(ppc_s24imm_branch,), fname="imm") 14imm_branch = bs(l=14, cls=(ppc_s14imm_branch,), fname="imm") 16imm = bs(l=16, cls=(ppc_s16imm,), fname="imm") 16imm = bs(l=16, cls=(ppc_u16imm,), fname="imm") 08imm = bs(l=5, cls=(ppc_u08imm,), fname="imm") 02imm_noarg = bs(l=2, cls=(ppc_u02imm_noarg,), fname="imm") a_noarg = bs(l=5, cls=(ppc_gpreg_noarg,), fname="ra") a_or_0_noarg = bs(l=5, cls=(ppc_gpreg_or_0_noarg,), fname="ra") regimm = bs(l=16, cls=(ppc_deref32,)) c_mod = bs_mod_name(l=1, mn_mod=['', '.'], fname='rc') rith1_name = {"MULLI": 0b000111, "SUBFIC": 0b001000, "ADDIC": 0b001100, "ADDIC.": 0b001101 } ogic2_name = {"ORI": 0b011000, "XORI": 0b011010, "ANDI.": 0b011100 } logic2_name = {"ORIS": 0b011001, "XORIS": 0b011011, "ANDIS.": 0b011101 } rith3_name = {"SUBFC": 0b0000001000, "ADDC": 0b0000001010, "MULHWU": 0b0000001011, "SUBF": 0b0000101000, "MULHW": 0b0001001011, "SUBFE": 0b0010001000, "ADDE": 0b0010001010, "MULLW": 0b0011101011, "ADD": 0b0100001010, "DIVWU": 0b0111001011, "DIVW": 0b0111101011, "SUBFCO": 0b1000001000, "ADDCO": 0b1000001010, "SUBFO": 0b1000101000, "SUBFEO": 0b1010001000, "ADDEO": 0b1010001010, "MULLWO": 0b1011101011, "ADDO": 0b1100001010, "DIVWUO": 0b1111001011, "DIVWO": 0b1111101011 } or_name = { "EQV": 0b0100011100, "XOR": 0b0100111100 } rith4_name = {"NEG": 0b0001101000, "SUBFZE": 0b0011001000, "ADDZE": 0b0011001010, "SUBFME": 0b0011101000, "ADDME": 0b0011101010, "NEGO": 0b1001101000, "SUBFZEO": 0b1011001000, "ADDZEO": 0b1011001010, "SUBFMEO": 0b1011101000, "ADDMEO": 0b1011101010 } rith5_name = {"CNTLZW": 0b00000, "EXTSH": 0b11100, "EXTSB": 0b11101 } rlogic_name = {"CRAND": 0b1000, "CRANDC": 0b0100, "CREQV": 0b1001, "CRNAND": 0b0111, "CRNOR": 0b0001, "CROR": 0b1110, "CRORC": 0b1101, "CRXOR": 0b0110 } otins_name = {"RLWIMI": 0b010100, "RLWINM": 0b010101 } s_arith1_name = bs_name(l=6, name=arith1_name) oad1_name = {"LWARX": 0b0000010100, "LWZX": 0b0000010111, "LBZX": 0b0001010111, "LHZX": 0b0100010111, "ECIWX": 0b0100110110, "LHAX": 0b0101010111, "LSWX": 0b1000010101, "LWBRX": 0b1000010110, "LHBRX": 0b1100010110 } oad1_name_u = {"LWZUX": 0b0000110111, "LBZUX": 0b0001110111, "LHZUX": 0b0100110111, "LHAUX": 0b0101110111 } oad2_name = {"LWZ": 0b0000, "LBZ": 0b0010, "LHZ": 0b1000, "LHA": 0b1010, "LMW": 0b1110 } oad2_name_u = {"LWZU": 0b0001, "LBZU": 0b0011, "LHZU": 0b1001, "LHAU": 0b1011} tore1_name = { "STWCX.": 0b00100101101, "STWX": 0b00100101110, "STBX": 0b00110101110, "STHX": 0b01100101110, "ECOWX": 0b01101101100, "STSWX": 0b10100101010, "STWBRX": 0b10100101100, "STHBRX": 0b11100101100 } tore1_name_u = { "STWUX": 0b00101101110, "STBUX": 0b00111101110, "STHUX": 0b01101101110 } tore2_name = { "STW": 0b0100, "STB": 0b0110, "STH": 0b1100, "STMW": 0b1111 } tore2_name_u = { "STWU": 0b0101, "STBU": 0b0111, "STHU": 0b1101 } ogic1_name = {"SLW": 0b0000011000, "AND": 0b0000011100, "ANDC": 0b0000111100, "NOR": 0b0001111100, "ORC": 0b0110011100, "OR": 0b0110111100, "NAND": 0b0111011100, "SRW": 0b1000011000, "SRAW": 0b1100011000 } cb_name = {"DCBST": 0b00001, "DCBF": 0b00010, "DCBTST": 0b00111, "DCBT": 0b01000, "DCBI": 0b01110, "DCBA": 0b10111, "ICBI": 0b11110, "DCBZ": 0b11111 } lass bs_mod_name_prio4(bs_mod_name): prio = 4 lass bs_mod_name_prio5(bs_mod_name): prio = 5 lass bs_mod_name_prio6(bs_mod_name): prio = 6 ranch_to_reg = bs_mod_name_prio4(l=1, mn_mod=['LR', 'CTR'], fname='btoreg') ranch_lk = bs_mod_name_prio5(l=1, mn_mod=['', 'L'], fname='lk') ranch_aa = bs_mod_name_prio6(l=1, mn_mod=['', 'A'], fname='aa') pcop("arith1", [bs_arith1_name, rd, ra, s16imm]) pcop("ADDIS", [bs('001111'), rd, ra_or_0, u16imm]) pcop("ADDI", [bs('001110'), rd, ra_or_0, s16imm]) pcop("logic2", [bs_name(l=6, name=logic2_name), rs, ra, u16imm], [ra, rs, u16imm]) pcop("slogic2", [bs_name(l=6, name=slogic2_name), rs, ra, u16imm], [ra, rs, u16imm]) pcop("store1", [bs('011111'), rs, ra_or_0, rb, bs_name(l=11, name=store1_name)]) pcop("store1u", [bs('011111'), rs, ra, rb, bs_name(l=11, name=store1_name_u)]) pcop("store2", [bs('10'), bs_name(l=4, name=store2_name), rs, ra_noarg, dregimm]) pcop("store2u", [bs('10'), bs_name(l=4, name=store2_name_u), rs, ra_or_0_noarg, dregimm]) pcop("arith3", [bs('011111'), rd, ra, rb, bs_name(l=10, name=arith3_name), rc_mod]) pcop("xor", [bs('011111'), rs, ra, rb, bs_name(l=10, name=xor_name), rc_mod], [ra, rs, rb]) pcop("arith4", [bs('011111'), rd, ra, bs('00000'), bs_name(l=10, name=arith4_name), rc_mod]) pcop("arith5", [bs('011111'), rs, ra, bs('00000'), bs_name(l=5, name=arith5_name), bs('11010'), rc_mod], [ra, rs]) pcop("load1", [bs('011111'), rd, ra_or_0, rb, bs_name(l=10, name=load1_name), bs('0')]) pcop("load1u", [bs('011111'), rd, ra, rb, bs_name(l=10, name=load1_name_u), bs('0')]) pcop("load2", [bs('10'), bs_name(l=4, name=load2_name), rd, ra_or_0_noarg, dregimm]) pcop("load2u", [bs('10'), bs_name(l=4, name=load2_name_u), rd, ra_noarg, dregimm]) pcop("logic1", [bs('011111'), rs, ra, rb, bs_name(l=10, name=logic1_name), rc_mod], [ra, rs, rb]) pcop("TWI", [bs('000011'), u05imm, ra, s16imm]) pcop("TW", [bs('011111'), u05imm, ra, rb, bs('00000001000')]) pcop("CMPW", [bs('011111'), crfd, bs('00'), ra, rb, bs('00000000000')]) pcop("CMPLW", [bs('011111'), crfd, bs('00'), ra, rb, bs('00001000000')]) pcop("CMPLWI", [bs('001010'), crfd, bs('00'), ra, u16imm]) pcop("CMPWI", [bs('001011'), crfd, bs('00'), ra, s16imm]) pcop("BC", [bs('010000'), bs(l=5, cls=(ppc_u05imm,), fname='bo'), crfs, ppc_divert_conditional_branch(l=2, fname='bi'), s14imm_branch, branch_aa, branch_lk]) pcop("SC", [bs('01000100000000000000000000000010')]) pcop("B", [bs('010010'), s24imm_branch, branch_aa, branch_lk]) pcop("MCRF", [bs('010011'), crfd, bs('00'), crfs, bs('000000000000000000')]) pcop("BCXXX", [bs('010011'), bs(l=5, cls=(ppc_u05imm,), fname='bo'), crfs, ppc_divert_conditional_branch(l=2, fname='bi'), bs('00000'), branch_to_reg, bs('000010000'), branch_lk]) pcop("crlogic", [bs('010011'), bs(l=5, cls=(ppc_u05imm,), fname='crbd'), bs(l=5, cls=(ppc_u05imm,), fname='crba'), bs(l=5, cls=(ppc_u05imm,), fname='crbb'), bs('0'), bs_name(l=4, name=crlogic_name), bs('000010')]) pcop("rotins", [bs_name(l=6, name=rotins_name), rs, ra, sh, mb, me, rc_mod], [ ra, rs, sh, mb, me ]) pcop("RLWNM", [bs('010111'), rs, ra, rb, mb, me, rc_mod], [ ra, rs, rb, mb, me ]) pcop("MFXXX", [bs('011111'), rd, bs('0000000000'), bs('000'), bs_name(l=1, name={'MFCR':0, 'MFMSR':1}), bs('0100110')]) pcop("dcb", [bs('01111100000'), ra, rb, bs_name(l=5, name=dcb_name), bs('101100')]) pcop("MTCRF", [bs('011111'), rs, bs('0'), crm, bs('000100100000')], [crm, rs]) pcop("MTMSR", [bs('011111'), rs, bs('0000000000'), bs('00100100100')]) pcop("MTSR", [bs('011111'), rs, bs('0'), sr, bs('0000000110100100')], [sr, rs]) pcop("MTSRIN", [bs('011111'), rs, bs('00000'), rb, bs('00111100100')]) pcop("TLBIE", [bs('011111'), bs('0000000000'), rb, bs('01001100100')]) pcop("MFSPR", [bs('011111'), rd, spr, bs('01010100110')]) pcop("TLBIA", [bs('01111100000000000000001011100100')]) pcop("MFTB", [bs('011111'), rd, tbr, bs('01011100110')]) pcop("RFI", [bs('01001100000000000000000001100100')]) pcop("ISYNC", [bs('01001100000000000000000100101100')]) pcop("MTSPR", [bs('011111'), rs, spr, bs('01110100110')], [spr, rs]) pcop("MCRXR", [bs('011111'), crfd, bs('000000000000'), bs('10000000000')]) pcop("TLBSYNC", [bs('01111100000000000000010001101100')]) pcop("MFSR", [bs('011111'), rd, bs('0'), sr, bs('00000'), bs('10010100110')]) pcop("LSWI", [bs('011111'), rd, ra, nb, bs('10010101010')]) pcop("STSWI", [bs('011111'), rs, ra, nb, bs('10110101010')]) pcop("SYNC", [bs('011111'), bs('000000000000000'), bs('10010101100')]) pcop("MFSRIN", [bs('011111'), rd, bs('00000'), rb, bs('10100100110')]) pcop("SRAWI", [bs('011111'), rs, ra, sh, bs('1100111000'), rc_mod], [ra, rs, sh]) pcop("EIEIO", [bs('011111'), bs('000000000000000'), bs('11010101100')])
Module variables
var EXPRAFF
var EXPRCOMPOSE
var EXPRCOND
var EXPRID
var EXPRINT
var EXPRLOC
var EXPRMEM
var EXPROP
var EXPRSLICE
var EXPR_ORDER_DICT
var LPARENTHESIS
var PRIORITY_MAX
var RPARENTHESIS
var SPR_ACCESS_GPR_MASK
var SPR_ACCESS_GPR_OFF
var SPR_ACCESS_IS_WRITE
var SPR_ACCESS_SPR_MASK
var SPR_ACCESS_SPR_OFF
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 arith1_name
var arith3_name
var arith4_name
var arith5_name
var branch_aa
var branch_lk
var branch_to_reg
var bs_arith1_name
var console_handler
var crfbitregs_expr
var crfbitregs_init
var crfbitregs_str
var crfd
var crfregs_expr
var crfregs_init
var crfregs_str
var crfs
var crlogic_name
var crm
var dcb_name
var default_prio
var deref
var deref_reg
var deref_reg_disp
var dregimm
var field
var flag
var gpregs_expr
var gpregs_init
var gpregs_str
var hexnums
var i
var load1_name
var load1_name_u
var load2_name
var load2_name_u
var log
var logic1_name
var logic2_name
var mb
var me
var mod_size2uint
var nb
var nums
var otherregs_expr
var otherregs_init
var otherregs_str
var printables
var priorities
var priorities_list
var punc8bit
var ra
var ra_noarg
var ra_or_0
var ra_or_0_noarg
var rb
var rc_mod
var rd
var regs_flt_expr
var regs_init
var rotins_name
var rs
var s14imm_branch
var s16imm
var s24imm_branch
var sh
var size_to_IEEE754_info
var slogic2_name
var spr
var sr
var store1_name
var store1_name_u
var store2_name
var store2_name_u
var superregs_expr
var superregs_init
var superregs_str
var tbr
var total_scans
var u02imm_noarg
var u05imm
var u08imm
var u16imm
var xerbcreg_expr
var xerbcreg_init
var xerbcreg_str
var xerbitregs_expr
var xerbitregs_init
var xerbitregs_str
var xor_name
Functions
def cb_deref_imm_reg(
tokens)
def cb_deref_imm_reg(tokens): if len(tokens) == 1: return AstMem(tokens[0], 32) elif len(tokens) == 2: return AstMem(tokens[1] + tokens[0], 32) else: raise NotImplementedError('len(tokens) > 2')
def ppc_all_bo_bi(
)
def ppc_all_bo_bi(): for bo in [0, 2, 4, 8, 10, 12, 16, 18, 20]: for bi in xrange(4): yield bo, bi
def ppc_bo_bi_to_mnemo(
bo, bi, prefer_taken=True, default_taken=True)
def ppc_bo_bi_to_mnemo(bo, bi, prefer_taken=True, default_taken=True): bo2mnemo = { 0: 'DNZF', 2: 'DZF', 4: 'F', 8: 'DNZT', 10: 'DZT', 12: 'T', 16: 'DNZ', 18: 'DZ', 20: '' } bi2cond = { 0b00: 'LT', 0b01: 'GT', 0b10: 'EQ', 0b11: 'SO' } bi2ncond = { 0b00: 'GE', 0b01: 'LE', 0b10: 'NE', 0b11: 'NS' } n = bo & 0b11110 if not n in bo2mnemo: raise NotImplementedError("Unknown BO field") mnem = 'B' + bo2mnemo[n] if mnem[-1] == 'T': mnem = mnem[:-1] + bi2cond[bi & 0b11] if mnem[-1] == 'F': mnem = mnem[:-1] + bi2ncond[bi & 0b11] if prefer_taken != default_taken: if prefer_taken: mnem += '+' else: mnem += '-' return mnem
def ppc_swap_10(
v)
def ppc_swap_10(v): return ((v & 0b11111) << 5) | ((v & 0b1111100000) >> 5)
def ppcop(
name, fields, args=None, alias=False)
def ppcop(name, fields, args=None, alias=False): dct = {"fields": fields} dct["alias"] = alias if args is not None: dct['args'] = args type(name, (mn_ppc,), dct)
Classes
class additional_info
class additional_info: def __init__(self): self.except_on_instr = False self.bo_bi_are_defined = False self.bi = 0 self.bo = 0
Ancestors (in MRO)
Instance variables
var bi
var bo
var bo_bi_are_defined
var except_on_instr
Methods
def __init__(
self)
def __init__(self): self.except_on_instr = False self.bo_bi_are_defined = False self.bi = 0 self.bo = 0
class bs_mod_name_prio4
class bs_mod_name_prio4(bs_mod_name): prio = 4
Ancestors (in MRO)
- bs_mod_name_prio4
- miasm2.core.cpu.bs_mod_name
- miasm2.core.cpu.bs_divert
- __builtin__.object
Class variables
var prio
Methods
def __init__(
self, **kargs)
def __init__(self, **kargs): self.args = kargs
def divert(
self, i, candidates)
def divert(self, i, candidates): out = [] for cls, _, bases, dct, fields in candidates: tab = self.args['mn_mod'] if isinstance(tab, list): tmp = {} for j, v in enumerate(tab): tmp[j] = v tab = tmp for value, new_name in tab.iteritems(): nfields = fields[:] s = int2bin(value, self.args['l']) args = dict(self.args) args.update({'strbits': s}) f = bs(**args) nfields[i] = f ndct = dict(dct) ndct['name'] = self.modname(ndct['name'], value) out.append((cls, new_name, bases, ndct, nfields)) return out
def modname(
self, name, i)
def modname(self, name, i): return name + self.args['mn_mod'][i]
class bs_mod_name_prio5
class bs_mod_name_prio5(bs_mod_name): prio = 5
Ancestors (in MRO)
- bs_mod_name_prio5
- miasm2.core.cpu.bs_mod_name
- miasm2.core.cpu.bs_divert
- __builtin__.object
Class variables
var prio
Methods
def __init__(
self, **kargs)
def __init__(self, **kargs): self.args = kargs
def divert(
self, i, candidates)
def divert(self, i, candidates): out = [] for cls, _, bases, dct, fields in candidates: tab = self.args['mn_mod'] if isinstance(tab, list): tmp = {} for j, v in enumerate(tab): tmp[j] = v tab = tmp for value, new_name in tab.iteritems(): nfields = fields[:] s = int2bin(value, self.args['l']) args = dict(self.args) args.update({'strbits': s}) f = bs(**args) nfields[i] = f ndct = dict(dct) ndct['name'] = self.modname(ndct['name'], value) out.append((cls, new_name, bases, ndct, nfields)) return out
def modname(
self, name, i)
def modname(self, name, i): return name + self.args['mn_mod'][i]
class bs_mod_name_prio6
class bs_mod_name_prio6(bs_mod_name): prio = 6
Ancestors (in MRO)
- bs_mod_name_prio6
- miasm2.core.cpu.bs_mod_name
- miasm2.core.cpu.bs_divert
- __builtin__.object
Class variables
var prio
Methods
def __init__(
self, **kargs)
def __init__(self, **kargs): self.args = kargs
def divert(
self, i, candidates)
def divert(self, i, candidates): out = [] for cls, _, bases, dct, fields in candidates: tab = self.args['mn_mod'] if isinstance(tab, list): tmp = {} for j, v in enumerate(tab): tmp[j] = v tab = tmp for value, new_name in tab.iteritems(): nfields = fields[:] s = int2bin(value, self.args['l']) args = dict(self.args) args.update({'strbits': s}) f = bs(**args) nfields[i] = f ndct = dict(dct) ndct['name'] = self.modname(ndct['name'], value) out.append((cls, new_name, bases, ndct, nfields)) return out
def modname(
self, name, i)
def modname(self, name, i): return name + self.args['mn_mod'][i]
class instruction_ppc
class instruction_ppc(instruction): delayslot = 0 def __init__(self, *args, **kargs): super(instruction_ppc, self).__init__(*args, **kargs) @staticmethod def arg2str(e, pos = None, loc_db=None): if isinstance(e, ExprId) or isinstance(e, ExprInt): return str(e) elif isinstance(e, ExprMem): addr = e.arg if isinstance(addr, ExprInt) or isinstance(addr, ExprId): out = '(%s)'%addr elif isinstance(addr, ExprOp): if len(addr.args) == 1: out = '(%s)'%addr elif len(addr.args) == 2: out = '%s(%s)'%(addr.args[1], addr.args[0]) else: raise NotImplementedError('More than two args to ExprOp of address') else: raise NotImplementedError('Invalid memory expression') return out return str(e) @staticmethod def is_conditional_jump(s): return (s[0] == 'B' and s[1:3] in { 'DN', 'DZ', 'LT', 'GT', 'EQ', 'SO', 'GE', 'LE', 'NE', 'NS' }) def dstflow(self): name = self.name if name[-1] == '+' or name[-1] == '-': name = name[:-1] return (name[0] == 'B' and name[-2:] != 'LR' and name[-3:] != 'LRL' and name[-3:] != 'CTR' and name[-4:] != 'CTRL') def dstflow2label(self, loc_db): name = self.name if name[-1] == '+' or name[-1] == '-': name = name[:-1] if name[-1] == 'L': name = name[:-1] elif name[-2:] == 'LA': name = name[:-2] + 'A' if name[-2:] != 'LR' and name[-3:] != 'CTR': if len(self.args) == 2: address_index = 1 else: address_index = 0 e = self.args[address_index] if not isinstance(e, ExprInt): return if name[-1] != 'A': ad = e.arg + self.offset else: ad = e.arg loc_key = loc_db.get_or_create_offset_location(ad) s = ExprLoc(loc_key, e.size) self.args[address_index] = s def breakflow(self): return self.name[0] == 'B' def is_subcall(self): name = self.name if name[-1] == '+' or name[-1] == '-': name = name[0:-1] return name[0] == 'B' and (name[-1] == 'L' or name[-2:-1] == 'LA') def getdstflow(self, loc_db): if 'LR' in self.name: return [ LR ] elif 'CTR' in self.name: return [ CTR ] elif len(self.args) == 2: address_index = 1 else: address_index = 0 return [ self.args[address_index] ] def splitflow(self): ret = False if self.is_conditional_jump(self.name): if self.additional_info.bo & 0b10100 != 0b10100: ret = True ret = ret or self.is_subcall() return ret def get_symbol_size(self, symbol, loc_db): return 32 def fixDstOffset(self): e = self.args[0] if not isinstance(e, ExprInt): log.debug('Dynamic destination offset %r' % e) return if self.name[-1] != 'A': if self.offset is None: raise ValueError('symbol not resolved %s' % self.l) off = e.arg - (self.offset + self.l) if int(off % 4): raise ValueError('Offset %r must be a multiple of four' % off) else: off = e.arg self.args[0] = ExprInt(off, 32) def get_args_expr(self): args = [a for a in self.args] return args def get_asm_offset(self, x): return ExprInt_from(x, self.offset)
Ancestors (in MRO)
- instruction_ppc
- miasm2.core.cpu.instruction
- __builtin__.object
Class variables
var delayslot
Static methods
def arg2str(
e, pos=None, loc_db=None)
@staticmethod def arg2str(e, pos = None, loc_db=None): if isinstance(e, ExprId) or isinstance(e, ExprInt): return str(e) elif isinstance(e, ExprMem): addr = e.arg if isinstance(addr, ExprInt) or isinstance(addr, ExprId): out = '(%s)'%addr elif isinstance(addr, ExprOp): if len(addr.args) == 1: out = '(%s)'%addr elif len(addr.args) == 2: out = '%s(%s)'%(addr.args[1], addr.args[0]) else: raise NotImplementedError('More than two args to ExprOp of address') else: raise NotImplementedError('Invalid memory expression') return out return str(e)
def is_conditional_jump(
s)
@staticmethod def is_conditional_jump(s): return (s[0] == 'B' and s[1:3] in { 'DN', 'DZ', 'LT', 'GT', 'EQ', 'SO', 'GE', 'LE', 'NE', 'NS' })
Instance variables
var additional_info
var args
var b
var data
var delayslot
var l
var mode
var name
var offset
Methods
def __init__(
self, *args, **kargs)
def __init__(self, *args, **kargs): super(instruction_ppc, self).__init__(*args, **kargs)
def breakflow(
self)
def breakflow(self): return self.name[0] == 'B'
def dstflow(
self)
def dstflow(self): name = self.name if name[-1] == '+' or name[-1] == '-': name = name[:-1] return (name[0] == 'B' and name[-2:] != 'LR' and name[-3:] != 'LRL' and name[-3:] != 'CTR' and name[-4:] != 'CTRL')
def dstflow2label(
self, loc_db)
def dstflow2label(self, loc_db): name = self.name if name[-1] == '+' or name[-1] == '-': name = name[:-1] if name[-1] == 'L': name = name[:-1] elif name[-2:] == 'LA': name = name[:-2] + 'A' if name[-2:] != 'LR' and name[-3:] != 'CTR': if len(self.args) == 2: address_index = 1 else: address_index = 0 e = self.args[address_index] if not isinstance(e, ExprInt): return if name[-1] != 'A': ad = e.arg + self.offset else: ad = e.arg loc_key = loc_db.get_or_create_offset_location(ad) s = ExprLoc(loc_key, e.size) self.args[address_index] = s
def fixDstOffset(
self)
def fixDstOffset(self): e = self.args[0] if not isinstance(e, ExprInt): log.debug('Dynamic destination offset %r' % e) return if self.name[-1] != 'A': if self.offset is None: raise ValueError('symbol not resolved %s' % self.l) off = e.arg - (self.offset + self.l) if int(off % 4): raise ValueError('Offset %r must be a multiple of four' % off) else: off = e.arg self.args[0] = ExprInt(off, 32)
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, x)
def get_asm_offset(self, x): return ExprInt_from(x, self.offset)
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): if 'LR' in self.name: return [ LR ] elif 'CTR' in self.name: return [ CTR ] elif len(self.args) == 2: address_index = 1 else: address_index = 0 return [ self.args[address_index] ]
def is_subcall(
self)
def is_subcall(self): name = self.name if name[-1] == '+' or name[-1] == '-': name = name[0:-1] return name[0] == 'B' and (name[-1] == 'L' or name[-2:-1] == 'LA')
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): ret = False if self.is_conditional_jump(self.name): if self.additional_info.bo & 0b10100 != 0b10100: ret = True ret = ret or self.is_subcall() return ret
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_ppc
class mn_ppc(cls_mn): delayslot = 0 name = "ppc32" regs = regs_module bintree = {} num = 0 all_mn = [] all_mn_mode = defaultdict(list) all_mn_name = defaultdict(list) all_mn_inst = defaultdict(list) instruction = instruction_ppc max_instruction_len = 4 @classmethod def getpc(cls, attrib = None): return PC @classmethod def getsp(cls, attrib = None): return R1 def additional_info(self): info = additional_info() info.bo_bi_are_defined = False if hasattr(self, "bo"): info.bo_bi_are_defined = True info.bi = int(self.bi.strbits, 2) info.bo = int(self.bo.strbits, 2) 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 enough bits %r %r' % (n, len(bs.bin) * 8)) while n: offset = start / 8 n_offset = cls.endian_offset(attrib, offset) c = cls.getbytes(bs, n_offset, 1) 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 endian_offset(cls, attrib, offset): if attrib == "b": return offset else: raise NotImplementedError("bad attrib") @classmethod def check_mnemo(cls, fields): l = sum([x.l for x in fields]) assert l == 32, "len %r" % l @classmethod def getmn(cls, name): return name.upper() @classmethod def mod_fields(cls, fields): l = sum([x.l for x in fields]) return fields @classmethod def gen_modes(cls, subcls, name, bases, dct, fields): dct['mode'] = None return [(subcls, name, bases, dct, fields)] def post_dis(self): return self def value(self, mode): v = super(mn_ppc, self).value(mode) if mode == 'b': return [x for x in v] else: raise NotImplementedError("bad attrib") def get_symbol_size(self, symbol, loc_db, mode): return 32
Ancestors (in MRO)
- mn_ppc
- 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 max_instruction_len
var name
var num
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() info.bo_bi_are_defined = False if hasattr(self, "bo"): info.bo_bi_are_defined = True info.bi = int(self.bi.strbits, 2) info.bo = int(self.bo.strbits, 2) 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 == 32, "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 endian_offset(
cls, attrib, offset)
@classmethod def endian_offset(cls, attrib, offset): if attrib == "b": return offset else: raise NotImplementedError("bad attrib")
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 get_symbol_size(
self, symbol, loc_db, mode)
def get_symbol_size(self, symbol, loc_db, mode): return 32
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 enough bits %r %r' % (n, len(bs.bin) * 8)) while n: offset = start / 8 n_offset = cls.endian_offset(attrib, offset) c = cls.getbytes(bs, n_offset, 1) 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)
@classmethod def getbytes(cls, bs, offset, l): return bs.getbytes(offset, l)
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()
def getpc(
cls, attrib=None)
@classmethod def getpc(cls, attrib = None): return PC
def getsp(
cls, attrib=None)
@classmethod def getsp(cls, attrib = None): return R1
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): l = sum([x.l for x in 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_ppc, self).value(mode) if mode == 'b': return [x for x in v] else: raise NotImplementedError("bad attrib")
class ppc_arg
class ppc_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)
- ppc_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 ppc_crfreg
class ppc_crfreg(ppc_reg): reg_info = crfregs parser = reg_info.parser
Ancestors (in MRO)
- ppc_crfreg
- ppc_reg
- miasm2.core.cpu.reg_noarg
- ppc_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
ppc_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:
ppc_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:
ppc_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 ppc_crfreg_noarg
class ppc_crfreg_noarg(reg_noarg): reg_info = crfregs parser = reg_info.parser
Ancestors (in MRO)
- ppc_crfreg_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 ppc_deref32
class ppc_deref32(ppc_arg): parser = deref def decode(self, v): v = sign_ext(v, 16, 32) e = self.parent.ra.expr + ExprInt(v, 32) self.expr = ExprMem(e, size=32) return True def encode(self): e = self.expr if not isinstance(e, ExprMem): return False addr = e.arg if isinstance(addr, ExprId) or isinstance(addr, ExprInt): addr = addr + ExprInt(0, 32) elif not isinstance(addr, ExprOp): return False if addr.op != '+': return False if len(addr.args) != 2: return False reg, disp = addr.args[0], addr.args[1] v = int(disp.arg) if sign_ext(v & 0xFFFF, 16, 32) != v: return False v &= 0xFFFF self.value = v self.parent.ra.expr = reg return True
Ancestors (in MRO)
- ppc_deref32
- ppc_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
var parser
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
ppc_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 = sign_ext(v, 16, 32) e = self.parent.ra.expr + ExprInt(v, 32) self.expr = ExprMem(e, size=32) return True
def encode(
self)
def encode(self): e = self.expr if not isinstance(e, ExprMem): return False addr = e.arg if isinstance(addr, ExprId) or isinstance(addr, ExprInt): addr = addr + ExprInt(0, 32) elif not isinstance(addr, ExprOp): return False if addr.op != '+': return False if len(addr.args) != 2: return False reg, disp = addr.args[0], addr.args[1] v = int(disp.arg) if sign_ext(v & 0xFFFF, 16, 32) != v: return False v &= 0xFFFF self.value = v self.parent.ra.expr = reg return True
def fromstring(
self, text, loc_db, parser_result=None)
Inheritance:
ppc_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 ppc_divert_conditional_branch
class ppc_divert_conditional_branch(bs_divert): prio=3 def divert(self, i, candidates): out = [] for cls, _, bases, dct, fields in candidates: bi_i = getfieldindexby_name(fields, 'bi')[1] bo_i = getfieldindexby_name(fields, 'bo')[1] for bo, bi in ppc_all_bo_bi(): nfields = fields[:] nfields[bi_i] = bs(int2bin(bi, 2), fname="bi") nfields[bo_i] = bs(int2bin(bo, 5), fname="bo") ndct = dict(dct) ndct['name'] = ppc_bo_bi_to_mnemo(bo, bi) out.append((cls, ndct['name'], bases, ndct, nfields)) nfields = fields[:] nfields[bi_i] = bs(int2bin(bi, 2), fname="bi") nfields[bo_i] = bs(int2bin(bo+1, 5), fname="bo") ndct = dict(dct) ndct['name'] = ppc_bo_bi_to_mnemo(bo, bi) out.append((cls, ndct['name'], bases, ndct, nfields)) return out
Ancestors (in MRO)
- ppc_divert_conditional_branch
- miasm2.core.cpu.bs_divert
- __builtin__.object
Class variables
var prio
Methods
def __init__(
self, **kargs)
def __init__(self, **kargs): self.args = kargs
def divert(
self, i, candidates)
def divert(self, i, candidates): out = [] for cls, _, bases, dct, fields in candidates: bi_i = getfieldindexby_name(fields, 'bi')[1] bo_i = getfieldindexby_name(fields, 'bo')[1] for bo, bi in ppc_all_bo_bi(): nfields = fields[:] nfields[bi_i] = bs(int2bin(bi, 2), fname="bi") nfields[bo_i] = bs(int2bin(bo, 5), fname="bo") ndct = dict(dct) ndct['name'] = ppc_bo_bi_to_mnemo(bo, bi) out.append((cls, ndct['name'], bases, ndct, nfields)) nfields = fields[:] nfields[bi_i] = bs(int2bin(bi, 2), fname="bi") nfields[bo_i] = bs(int2bin(bo+1, 5), fname="bo") ndct = dict(dct) ndct['name'] = ppc_bo_bi_to_mnemo(bo, bi) out.append((cls, ndct['name'], bases, ndct, nfields)) return out
class ppc_gpreg
class ppc_gpreg(ppc_reg): reg_info = gpregs parser = reg_info.parser
Ancestors (in MRO)
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
ppc_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:
ppc_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:
ppc_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 ppc_gpreg_noarg
class ppc_gpreg_noarg(reg_noarg): reg_info = gpregs parser = reg_info.parser
Ancestors (in MRO)
- ppc_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 ppc_gpreg_or_0
class ppc_gpreg_or_0(ppc_reg): reg_info = gpregs parser = reg_info.parser def decode(self, v): ret = super(ppc_reg, self).decode(v) if ret == False: return False reg = self.expr if reg == R0: self.expr = ExprInt(0, 32) return ret
Ancestors (in MRO)
- ppc_gpreg_or_0
- ppc_reg
- miasm2.core.cpu.reg_noarg
- ppc_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
ppc_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:
ppc_reg
.check_fbits
def check_fbits(self, v): return v & self.fmask == self.fbits
def decode(
self, v)
def decode(self, v): ret = super(ppc_reg, self).decode(v) if ret == False: return False reg = self.expr if reg == R0: self.expr = ExprInt(0, 32) return ret
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:
ppc_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 ppc_gpreg_or_0_noarg
class ppc_gpreg_or_0_noarg(reg_noarg): reg_info = gpregs parser = reg_info.parser def decode(self, v): ret = super(ppc_gpreg_or_0_noarg, self).decode(v) if ret == False: return False reg = self.expr if reg == R0: self.expr = ExprInt(0, 32) return ret
Ancestors (in MRO)
- ppc_gpreg_or_0_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): ret = super(ppc_gpreg_or_0_noarg, self).decode(v) if ret == False: return False reg = self.expr if reg == R0: self.expr = ExprInt(0, 32) return ret
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 ppc_imm
class ppc_imm(imm_noarg, ppc_arg): parser = base_expr
Ancestors (in MRO)
Class variables
var intmask
var intsize
var parser
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
ppc_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:
ppc_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 ppc_reg
class ppc_reg(reg_noarg, ppc_arg): pass
Ancestors (in MRO)
Class variables
var parser
var reg_info
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
ppc_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:
ppc_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 ppc_s14imm_branch
class ppc_s14imm_branch(ppc_imm): def decode(self, v): v = sign_ext(v << 2, 16, 32) self.expr = ExprInt(v, 32) return True def encode(self): if not isinstance(self.expr, ExprInt): return False v = self.expr.arg.arg if v & 0x3: return False v = v >> 2 if sign_ext(v & self.lmask, 14, 32) != v: return False self.value = v & self.lmask return True
Ancestors (in MRO)
- ppc_s14imm_branch
- ppc_imm
- miasm2.core.cpu.imm_noarg
- ppc_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
ppc_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 << 2, 16, 32) self.expr = ExprInt(v, 32) return True
def encode(
self)
def encode(self): if not isinstance(self.expr, ExprInt): return False v = self.expr.arg.arg if v & 0x3: return False v = v >> 2 if sign_ext(v & self.lmask, 14, 32) != v: return False self.value = v & self.lmask return True
def encodeval(
self, v)
Inheritance:
ppc_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:
ppc_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)
class ppc_s16imm
class ppc_s16imm(ppc_imm): def decode(self, v): v = sign_ext(v, 16, 32) self.expr = ExprInt(v, 32) return True def encode(self): if not isinstance(self.expr, ExprInt): return False v = self.expr.arg.arg if sign_ext(v & self.lmask, 16, 32) != v: return False self.value = v & self.lmask return True
Ancestors (in MRO)
- ppc_s16imm
- ppc_imm
- miasm2.core.cpu.imm_noarg
- ppc_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
ppc_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, 16, 32) self.expr = ExprInt(v, 32) return True
def encode(
self)
def encode(self): if not isinstance(self.expr, ExprInt): return False v = self.expr.arg.arg if sign_ext(v & self.lmask, 16, 32) != v: return False self.value = v & self.lmask return True
def encodeval(
self, v)
Inheritance:
ppc_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:
ppc_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)
class ppc_s24imm_branch
class ppc_s24imm_branch(ppc_imm): def decode(self, v): v = sign_ext(v << 2, 26, 32) self.expr = ExprInt(v, 32) return True def encode(self): if not isinstance(self.expr, ExprInt): return False v = self.expr.arg.arg if v & 0x3: return False v = v >> 2 if sign_ext(v & self.lmask, 24, 32) != v: return False self.value = v & self.lmask return True
Ancestors (in MRO)
- ppc_s24imm_branch
- ppc_imm
- miasm2.core.cpu.imm_noarg
- ppc_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
ppc_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 << 2, 26, 32) self.expr = ExprInt(v, 32) return True
def encode(
self)
def encode(self): if not isinstance(self.expr, ExprInt): return False v = self.expr.arg.arg if v & 0x3: return False v = v >> 2 if sign_ext(v & self.lmask, 24, 32) != v: return False self.value = v & self.lmask return True
def encodeval(
self, v)
Inheritance:
ppc_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:
ppc_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)
class ppc_spr
class ppc_spr(ppc_imm): def decode(self, v): self.expr = ExprInt(ppc_swap_10(v), 32) return True def encode(self, e): if not isinstance(e, ExprInt): return False self.value = ppc_swap_10(e.arg) return True
Ancestors (in MRO)
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
ppc_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): self.expr = ExprInt(ppc_swap_10(v), 32) return True
def encode(
self, e)
def encode(self, e): if not isinstance(e, ExprInt): return False self.value = ppc_swap_10(e.arg) return True
def encodeval(
self, v)
Inheritance:
ppc_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:
ppc_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)
class ppc_tbr
class ppc_tbr(ppc_imm): def decode(self, v): self.expr = ExprInt(ppc_swap_10(v), 32) return True def encode(self, e): if not isinstance(e, ExprInt): return False self.value = ppc_swap_10(e.arg) return True
Ancestors (in MRO)
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
ppc_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): self.expr = ExprInt(ppc_swap_10(v), 32) return True
def encode(
self, e)
def encode(self, e): if not isinstance(e, ExprInt): return False self.value = ppc_swap_10(e.arg) return True
def encodeval(
self, v)
Inheritance:
ppc_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:
ppc_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)
class ppc_u02imm_noarg
class ppc_u02imm_noarg(imm_noarg): pass
Ancestors (in MRO)
- ppc_u02imm_noarg
- miasm2.core.cpu.imm_noarg
- __builtin__.object
Class variables
var intmask
var intsize
Methods
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)
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 ppc_u04imm
class ppc_u04imm(ppc_u16imm): pass
Ancestors (in MRO)
- ppc_u04imm
- ppc_u16imm
- ppc_imm
- miasm2.core.cpu.imm_noarg
- ppc_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
ppc_u16imm
.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:
ppc_u16imm
.decode
def decode(self, v): if v & self.lmask != v: return False self.expr = ExprInt(v, 32) return True
def encode(
self)
Inheritance:
ppc_u16imm
.encode
def encode(self): if not isinstance(self.expr, ExprInt): return False v = self.expr.arg.arg if v & self.lmask != v: return False self.value = v & self.lmask return True
def encodeval(
self, v)
Inheritance:
ppc_u16imm
.encodeval
def encodeval(self, v): if v > self.lmask: return False return v
def expr2int(
self, e)
Inheritance:
ppc_u16imm
.expr2int
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:
ppc_u16imm
.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)
Inheritance:
ppc_u16imm
.int2expr
def int2expr(self, v): if (v & ~self.intmask) != 0: return None return m2_expr.ExprInt(v, self.intsize)
class ppc_u05imm
class ppc_u05imm(ppc_u16imm): pass
Ancestors (in MRO)
- ppc_u05imm
- ppc_u16imm
- ppc_imm
- miasm2.core.cpu.imm_noarg
- ppc_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
ppc_u16imm
.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:
ppc_u16imm
.decode
def decode(self, v): if v & self.lmask != v: return False self.expr = ExprInt(v, 32) return True
def encode(
self)
Inheritance:
ppc_u16imm
.encode
def encode(self): if not isinstance(self.expr, ExprInt): return False v = self.expr.arg.arg if v & self.lmask != v: return False self.value = v & self.lmask return True
def encodeval(
self, v)
Inheritance:
ppc_u16imm
.encodeval
def encodeval(self, v): if v > self.lmask: return False return v
def expr2int(
self, e)
Inheritance:
ppc_u16imm
.expr2int
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:
ppc_u16imm
.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)
Inheritance:
ppc_u16imm
.int2expr
def int2expr(self, v): if (v & ~self.intmask) != 0: return None return m2_expr.ExprInt(v, self.intsize)
class ppc_u08imm
class ppc_u08imm(ppc_u16imm): pass
Ancestors (in MRO)
- ppc_u08imm
- ppc_u16imm
- ppc_imm
- miasm2.core.cpu.imm_noarg
- ppc_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
ppc_u16imm
.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:
ppc_u16imm
.decode
def decode(self, v): if v & self.lmask != v: return False self.expr = ExprInt(v, 32) return True
def encode(
self)
Inheritance:
ppc_u16imm
.encode
def encode(self): if not isinstance(self.expr, ExprInt): return False v = self.expr.arg.arg if v & self.lmask != v: return False self.value = v & self.lmask return True
def encodeval(
self, v)
Inheritance:
ppc_u16imm
.encodeval
def encodeval(self, v): if v > self.lmask: return False return v
def expr2int(
self, e)
Inheritance:
ppc_u16imm
.expr2int
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:
ppc_u16imm
.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)
Inheritance:
ppc_u16imm
.int2expr
def int2expr(self, v): if (v & ~self.intmask) != 0: return None return m2_expr.ExprInt(v, self.intsize)
class ppc_u16imm
class ppc_u16imm(ppc_imm): def decode(self, v): if v & self.lmask != v: return False self.expr = ExprInt(v, 32) return True def encode(self): if not isinstance(self.expr, ExprInt): return False v = self.expr.arg.arg if v & self.lmask != v: return False self.value = v & self.lmask return True
Ancestors (in MRO)
- ppc_u16imm
- ppc_imm
- miasm2.core.cpu.imm_noarg
- ppc_arg
- miasm2.core.cpu.m_arg
- __builtin__.object
Class variables
Methods
def asm_ast_to_expr(
self, arg, loc_db)
Inheritance:
ppc_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): if v & self.lmask != v: return False self.expr = ExprInt(v, 32) return True
def encode(
self)
def encode(self): if not isinstance(self.expr, ExprInt): return False v = self.expr.arg.arg if v & self.lmask != v: return False self.value = v & self.lmask return True
def encodeval(
self, v)
Inheritance:
ppc_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:
ppc_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)