def trace_mem(self, mode, width, addr, val): # a possible trap? if mode == "R" and addr < self.lib_base and width == 1: # is it trapped? if val == self.op_reset: delta = self.lib_base - addr off = delta / 6 addon = "-%d [%d] " % (delta, off) addon += self._get_fd_str(delta) self.trace_mem_int(mode, width, addr, val, text="TRAP", level=logging.INFO, addon=addon) # return to caller after trap elif val == self.op_rts: self.trace_mem_int(mode, width, addr, val, text="T_RTS") # native lib jump elif val == self.op_jmp: delta = self.lib_base - addr addon = "-%d " % delta addon += self._get_fd_str(delta) self.trace_mem_int(mode, width, addr, val, text="JUMP", level=logging.INFO, addon=addon) # something strange else: self.trace_mem_int(mode, width, addr, val, text="LIB?!", level=logging.WARN) else: # no use regular access LabelStruct.trace_mem(self, mode, width, addr, val) return True
def __init__(self, name, addr, size, lib_base, struct, lib): LabelStruct.__init__(self, name, addr, struct, size=size, offset=lib_base - addr) self.lib_base = lib_base self.lib = lib
def alloc_struct(self, name, struct): size = struct.get_size() addr = self.alloc_mem(size) label = LabelStruct(name, addr, struct) self.label_mgr.add_label(label) access = AccessStruct(self.mem, struct, addr) mem = Memory(addr,size,label,access) log_mem_alloc.info("alloc struct: %s",mem) self.mem_objs[addr] = mem return mem
def trace_mem(self, mode, width, addr, val): # a possible trap? if mode == 'R' and addr < self.lib_base and width == 1: # is it trapped? if val & 0xa000 == 0xa000: delta = self.lib_base - addr off = delta / 6 addon = "-%d [%d] " % (delta, off) addon += self._get_fd_str(delta) self.trace_mem_int(mode, width, addr, val, text="TRAP", level=logging.INFO, addon=addon) # native lib jump elif val == self.op_jmp: delta = self.lib_base - addr addon = "-%d " % delta addon += self._get_fd_str(delta) self.trace_mem_int(mode, width, addr, val, text="JUMP", level=logging.INFO, addon=addon) # something inside jump table else: self.trace_mem_int(mode, width, addr, val, text="LIB?!", level=logging.WARN) else: # no use regular access LabelStruct.trace_mem(self, mode, width, addr, val) return True
def trace_mem(self, mode, width, addr, val): # a possible trap? if mode == 'R' and addr < self.lib_base and width == 1: # is it trapped? if val == self.op_reset: delta = self.lib_base - addr off = delta / 6 addon = "-%d [%d]" % (delta,off) self.trace_mem_int(mode, width, addr, val, text="TRAP", level=logging.INFO, addon=addon) # return to caller after trap elif val == self.op_rts: self.trace_mem_int(mode, width, addr, val, text="T_RTS") # native lib jump elif val == self.op_jmp: delta = self.lib_base - addr addon = "-%d" % delta self.trace_mem_int(mode, width, addr, val, text="JUMP", level=logging.INFO, addon=addon) # something strange else: self.trace_mem_int(mode, width, addr, val, text="LIB?!", level=logging.WARN) else: # no use regular access LabelStruct.trace_mem(self, mode, width, addr, val) return True
def __str__(self): return "%s base=%06x" % (LabelStruct.__str__(self), self.lib_base)
def __init__(self, name, addr, size, lib_base, struct): LabelStruct.__init__(self, name, addr, struct, size=size, offset=lib_base - addr) self.lib_base = lib_base