def src_write_info(self, pc): fields = self._sdb.db.srcstable.colnames query = "(addrlo == 0x%x) & (addrhi == 0x%x)" % \ (utils.addr_lo(pc), utils.addr_hi(pc)) # query = "addr == 0x%x" % pc r = pytable_utils.get_unique_result(self._sdb.db.srcstable, query) return {f: r[f] for f in fields}
def mmap_var_loc(self, name): res = pytable_utils.get_unique_result(self._pdb.db.var_table, 'name == "%s"' % name) return (res['startaddr'], res['endaddr'])
def reloc_offset_and_mod_from_cardinal(self, cardinal): r = pytable_utils.get_unique_result(self._sdb.db.relocstable, 'cardinal == %s' % cardinal) return (r['reloffset'], r['relmod'])
def get_row_information(self): row = {} labels = WriteSearch.find_labels(labeltool.SkipLabel, "", self.stage, self.name) startaddr = -1 endaddr = -1 start = "" end = "" elf = self.stage.elf srcdir = Main.get_runtime_config("temp_target_src_dir") isfunc = False for l in labels: if not l.name == self.name: continue if l.value == "START": lineno = self.table._get_real_lineno(l, False) start = "%s:%d" % (l.filename, lineno) elif l.value == "END": lineno = self.table._get_real_lineno(l, True) end = "%s:%d" % (l.filename, lineno) elif l.value == "FUNC": isfunc = True lineno = self.table._get_real_lineno(l, False) start = "%s:%d" % (l.filename, lineno) startaddr = self.table._get_line_addr(start, True) f = pytable_utils.get_unique_result(self.table.funcstable, ( "(startaddrlo <= 0x%x) & (0x%x < endaddrlo) & (startaddrhi <= 0x%x) & (0x%x <= endaddrhi)" % (utils.addr_lo(startaddr), utils.addr_lo(startaddr), utils.addr_hi(startaddr), utils.addr_hi(startaddr)))) (startaddr, endaddr) = (f['startaddr'], f['endaddr']) r2.get(elf, "s 0x%x" % startaddr) thumb = False if self.table.thumbranges.overlaps_point(startaddr): thumb = True if thumb: r2.get(self.stage.elf, "e asm.bits=16") r2.gets(self.stage.elf, "ahb 16") else: r2.get(self.stage.elf, "e asm.bits=32") r2.gets(self.stage.elf, "ahb 32") disasm = r2.get(elf, "pd 2") disasm = r2.get(elf, "pdj 2") if disasm[0]["disasm"].startswith("push"): firstins = disasm[1] else: firstins = disasm[0] startaddr = firstins["offset"] #print "start %s,%x" % (startaddr, endaddr) elif l.value == "NEXT": lineno = self.table._get_real_lineno(l, False) start = "%s:%d" % (l.filename, lineno) end = "%s:%d" % (l.filename, lineno) if lineno == -1: return None if (startaddr < 0) and (endaddr < 0): # move startaddr after any push instructions startaddr = self.table._get_line_addr(start, True) endaddr = self.table._get_line_addr(end, False) r2.get(elf, "s 0x%x" % startaddr) thumb = False if self.table.thumbranges.overlaps_point(startaddr): thumb = True if thumb: r2.gets(self.stage.elf, "ahb 16") r2.get(self.stage.elf, "e asm.bits=16") else: r2.gets(self.stage.elf, "ahb 32") r2.get(self.stage.elf, "e asm.bits=32") disasm = r2.get(elf, "pd 2") disasm = r2.get(elf, "pdj 2") if "disasm" in disasm[0]: if (disasm[0][u"disasm"].startswith("push")): # don't include push instruction startins = disasm[1] else: startins = disasm[0] startaddr = startins["offset"] s = long(startaddr + self.adjuststart) e = long(endaddr + self.adjustend) if e < s: t = s s = e e = t row['pc'] = s row['pclo'] = utils.addr_lo(s) row['pchi'] = utils.addr_hi(s) row['resumepc'] = e row['resumepclo'] = utils.addr_lo(e) row['resumepchi'] = utils.addr_hi(e) row['isfunction'] = isfunc row['thumb'] = self.table.thumbranges.overlaps_point(row['pc']) return row