Top

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)

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)

Class variables

var parser

Inheritance: ppc_reg.parser

var reg_info

Inheritance: ppc_reg.reg_info

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)

Inheritance: ppc_reg.decode

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)

Inheritance: ppc_reg.encode

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)

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)

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)

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

var parser

Inheritance: ppc_reg.parser

var reg_info

Inheritance: ppc_reg.reg_info

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)

Inheritance: ppc_reg.decode

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)

Inheritance: ppc_reg.encode

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)

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)

Class variables

var parser

Inheritance: ppc_reg.parser

var reg_info

Inheritance: ppc_reg.reg_info

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)

Inheritance: ppc_reg.decode

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)

Inheritance: ppc_reg.encode

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)

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)

  • ppc_imm
  • miasm2.core.cpu.imm_noarg
  • ppc_arg
  • miasm2.core.cpu.m_arg
  • __builtin__.object

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)

  • ppc_reg
  • miasm2.core.cpu.reg_noarg
  • ppc_arg
  • miasm2.core.cpu.m_arg
  • __builtin__.object

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)

Class variables

var intmask

Inheritance: ppc_imm.intmask

var intsize

Inheritance: ppc_imm.intsize

var parser

Inheritance: ppc_imm.parser

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)

Inheritance: ppc_imm.decode

def decode(self, v):
    v = sign_ext(v << 2, 16, 32)
    self.expr = ExprInt(v, 32)
    return True

def decodeval(

self, v)

Inheritance: ppc_imm.decodeval

def decodeval(self, v):
    return v

def encode(

self)

Inheritance: ppc_imm.encode

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)

Inheritance: ppc_imm.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_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)

Inheritance: ppc_imm.int2expr

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)

Class variables

var intmask

Inheritance: ppc_imm.intmask

var intsize

Inheritance: ppc_imm.intsize

var parser

Inheritance: ppc_imm.parser

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)

Inheritance: ppc_imm.decode

def decode(self, v):
    v = sign_ext(v, 16, 32)
    self.expr = ExprInt(v, 32)
    return True

def decodeval(

self, v)

Inheritance: ppc_imm.decodeval

def decodeval(self, v):
    return v

def encode(

self)

Inheritance: ppc_imm.encode

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)

Inheritance: ppc_imm.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_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)

Inheritance: ppc_imm.int2expr

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)

Class variables

var intmask

Inheritance: ppc_imm.intmask

var intsize

Inheritance: ppc_imm.intsize

var parser

Inheritance: ppc_imm.parser

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)

Inheritance: ppc_imm.decode

def decode(self, v):
    v = sign_ext(v << 2, 26, 32)
    self.expr = ExprInt(v, 32)
    return True

def decodeval(

self, v)

Inheritance: ppc_imm.decodeval

def decodeval(self, v):
    return v

def encode(

self)

Inheritance: ppc_imm.encode

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)

Inheritance: ppc_imm.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_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)

Inheritance: ppc_imm.int2expr

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

var intmask

Inheritance: ppc_imm.intmask

var intsize

Inheritance: ppc_imm.intsize

var parser

Inheritance: ppc_imm.parser

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)

Inheritance: ppc_imm.decode

def decode(self, v):
    self.expr = ExprInt(ppc_swap_10(v), 32)
    return True

def decodeval(

self, v)

Inheritance: ppc_imm.decodeval

def decodeval(self, v):
    return v

def encode(

self, e)

Inheritance: ppc_imm.encode

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)

Inheritance: ppc_imm.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_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)

Inheritance: ppc_imm.int2expr

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

var intmask

Inheritance: ppc_imm.intmask

var intsize

Inheritance: ppc_imm.intsize

var parser

Inheritance: ppc_imm.parser

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)

Inheritance: ppc_imm.decode

def decode(self, v):
    self.expr = ExprInt(ppc_swap_10(v), 32)
    return True

def decodeval(

self, v)

Inheritance: ppc_imm.decodeval

def decodeval(self, v):
    return v

def encode(

self, e)

Inheritance: ppc_imm.encode

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)

Inheritance: ppc_imm.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_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)

Inheritance: ppc_imm.int2expr

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)

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)

Class variables

var intmask

Inheritance: ppc_u16imm.intmask

var intsize

Inheritance: ppc_u16imm.intsize

var parser

Inheritance: ppc_u16imm.parser

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 decodeval(

self, v)

Inheritance: ppc_u16imm.decodeval

def decodeval(self, v):
    return v

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)

Class variables

var intmask

Inheritance: ppc_u16imm.intmask

var intsize

Inheritance: ppc_u16imm.intsize

var parser

Inheritance: ppc_u16imm.parser

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 decodeval(

self, v)

Inheritance: ppc_u16imm.decodeval

def decodeval(self, v):
    return v

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)

Class variables

var intmask

Inheritance: ppc_u16imm.intmask

var intsize

Inheritance: ppc_u16imm.intsize

var parser

Inheritance: ppc_u16imm.parser

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 decodeval(

self, v)

Inheritance: ppc_u16imm.decodeval

def decodeval(self, v):
    return v

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)

Class variables

var intmask

Inheritance: ppc_imm.intmask

var intsize

Inheritance: ppc_imm.intsize

var parser

Inheritance: ppc_imm.parser

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)

Inheritance: ppc_imm.decode

def decode(self, v):
    if v & self.lmask != v:
        return False
    self.expr = ExprInt(v, 32)
    return True

def decodeval(

self, v)

Inheritance: ppc_imm.decodeval

def decodeval(self, v):
    return v

def encode(

self)

Inheritance: ppc_imm.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_imm.encodeval

def encodeval(self, v):
    if v > self.lmask:
        return False
    return v

def expr2int(

self, e)

Inheritance: ppc_imm.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_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)

Inheritance: ppc_imm.int2expr

def int2expr(self, v):
    if (v & ~self.intmask) != 0:
        return None
    return m2_expr.ExprInt(v, self.intsize)