def __init__(self, ii, eosz_nts, easz_nts, imm_nts, disp_nts, brdisp_nts, mode_space, state_space): self.ptrn = ii.ipattern_input self.ptrn_wrds = self.ptrn.split() self.iclass = ii.iclass self.legal = True self.category = ii.category #FIXME: remove all members of ii stored directly as members self.ii = ii #incomplete_opcode is used for expanding opcodes that have registers #embedded in them self.incomplete_opcode = False #number of missing bits in incomplete opcode. usually 0 or 3 self.missing_bits = 0 self.insn_map = None self.opcode = None self.space = None # LEGACY|VEX|EVEX self.has_modrm = False self.imm_nt_seq = None self.disp_nt_seq = None #modrm.reg bits value, set only when it is explicitly #e.g. bounded: REG[010] self.ext_opcode = None #all legal values for MODE operand in this pattern self.mode = None #an ordered string of EOSZ setting NTs in the pattern #we will use it to create the eosz lookup table for the pattern self.eosz_nt_seq = None #same for EASZ self.easz_nt_seq = None #operand deciders of the pattern self.constraints = None self._set_constraints(ii, state_space) self.vv = None # vexvalid, integer self._set_vexvalid() self.encspace = None self._set_encoding_space() mi,insn_map,opcode = self._get_map_opcode() self.map_info = mi self.insn_map = insn_map self.opcode = opcode self.has_modrm = ild_modrm.get_hasmodrm(self.ptrn) self.set_ext_opcode() self.set_mode(ii, mode_space) self.eosz_nt_seq = ild_eosz.get_eosz_nt_seq(self.ptrn_wrds, eosz_nts) self.easz_nt_seq = ild_easz.get_easz_nt_seq(self.ptrn_wrds, easz_nts) self.imm_nt_seq = ild_imm.get_imm_nt_seq(self.ptrn_wrds, imm_nts) self.disp_nt_seq = ild_disp.get_disp_nt_seq(self.ptrn_wrds, disp_nts.union(brdisp_nts)) self.actions = [actions.gen_return_action(ii.inum)]
def __init__(self, ii, is_3dnow, eosz_nts, easz_nts, imm_nts, disp_nts, brdisp_nts, mode_space, state_space): # FIXME 2012-06-19 MJC: is there a better way to do complex # init of class attributes? if pattern_t.first: pattern_t.first = False self._setup_phys_map(is_3dnow) self.ptrn = ii.ipattern_input self.ptrn_wrds = self.ptrn.split() self.iclass = ii.iclass self.legal = True #amd 3dnow instructions have nasty 0f 0f ... opcode pattern #in which second 0f is not an opcode! This should be treated #in a special way self.amd3dnow_build = is_3dnow #this one is NOT used DELETE IT ??? self.category = ii.category #FIXME: remove all members of ii stored directly as members self.ii = ii #incomplete_opcode is used for expanding opcodes that have registers #embedded in them self.incomplete_opcode = False #number of missing bits in incomplete opcode. usually 0 or 3 self.missing_bits = 0 self.insn_map = None self.opcode = None self.space = None # LEGACY|VEX|EVEX self.has_modrm = False self.imm_nt_seq = None self.disp_nt_seq = None #modrm.reg bits value, set only when it is explicitly #e.g. bounded: REG[010] self.ext_opcode = None #all legal values for MODE operand in this pattern self.mode = None #an ordered string of EOSZ setting NTs in the pattern #we will use it to create the eosz lookup table for the pattern self.eosz_nt_seq = None #same for EASZ self.easz_nt_seq = None #operand deciders of the pattern #FIXME: not finished yet self.constraints = collections.defaultdict(dict) insn_map, opcode = self.get_map_opcode() self.insn_map = insn_map self.opcode = opcode self.has_modrm = ild_modrm.get_hasmodrm(self.ptrn) self.set_ext_opcode() self.set_mode(ii, mode_space) self.eosz_nt_seq = ild_eosz.get_eosz_nt_seq(self.ptrn_wrds, eosz_nts) self.easz_nt_seq = ild_easz.get_easz_nt_seq(self.ptrn_wrds, easz_nts) self.imm_nt_seq = ild_imm.get_imm_nt_seq(self.ptrn_wrds, imm_nts) self.disp_nt_seq = ild_disp.get_disp_nt_seq(self.ptrn_wrds, disp_nts.union(brdisp_nts)) self.set_constraints(ii, state_space) self.actions = [actions.gen_return_action(ii.inum)] #Not implementing this yet. #Will implement after code review for has_modrm #self.set_hasimm() #self.set_pfx_table() #FIXME: for anaisys only if self.is_3dnow(): if not self.has_modrm: _msg('3DNOW with no MODRM: %s\n' % self)