disinst support

--HG--
branch : pmacs2
This commit is contained in:
moculus 2008-04-11 16:04:00 +00:00
parent 9fd4ae328b
commit 4fb18e31b4
1 changed files with 33 additions and 5 deletions

View File

@ -1,4 +1,5 @@
import string, struct import re, string, struct
from subprocess import Popen, PIPE, STDOUT
import color, mode import color, mode
from lex import Grammar, PatternRule, RegionRule from lex import Grammar, PatternRule, RegionRule
from method import Method, Argument from method import Method, Argument
@ -6,6 +7,9 @@ from point import Point
class Hex(mode.Fundamental): class Hex(mode.Fundamental):
modename = 'Hex' modename = 'Hex'
config = {
'hex.disinst': 'disinst',
}
lmargin = 12 lmargin = 12
rmargin = 18 rmargin = 18
_ctrans = ['.'] * 256 _ctrans = ['.'] * 256
@ -88,6 +92,7 @@ class Hex(mode.Fundamental):
self.add_action_and_bindings(HexReadAligned('double', 'd'), ('C-c d',)) self.add_action_and_bindings(HexReadAligned('double', 'd'), ('C-c d',))
self.add_action_and_bindings(ShowAddress(), ('C-c a',)) self.add_action_and_bindings(ShowAddress(), ('C-c a',))
self.add_action_and_bindings(ShowX86Instruction(), ('C-c x',))
self.add_action_and_bindings(GotoAddress(), ('C-c M-g',)) self.add_action_and_bindings(GotoAddress(), ('C-c M-g',))
# create all the insert actions for the basic text input # create all the insert actions for the basic text input
@ -129,15 +134,16 @@ class Hex(mode.Fundamental):
else: else:
return ((0, s, self.cgreen),) return ((0, s, self.cgreen),)
def read_data(self, cy, ix, fmt, size): def read_data(self, cy, ix, size):
b = self.window.buffer b = self.window.buffer
s = b.rawdata[cy][ix:] s = b.rawdata[cy][ix:]
if len(s) < size: if len(s) < size:
if cy < len(b.rawdata) - 1: if cy < len(b.rawdata) - 1:
s += b.rawdata[cy + 1] s += b.rawdata[cy + 1]
else:
return None
s = s[:size] s = s[:size]
return s
def read_struct(self, cy, ix, fmt, size):
s = self.read_data(cy, ix, size)
return struct.unpack(fmt, s)[0] return struct.unpack(fmt, s)[0]
class HexForward(Method): class HexForward(Method):
@ -194,7 +200,7 @@ class HexRead(Method):
ix = self._get_ix(b, cy, cx) ix = self._get_ix(b, cy, cx)
addr = b.get_address(cy, 0) + ix addr = b.get_address(cy, 0) + ix
try: try:
v = w.mode.read_data(cy, ix, self.fmt, self.size) v = w.mode.read_struct(cy, ix, self.fmt, self.size)
if v is None: if v is None:
w.set_error("not enough data to read %s" % self.type_) w.set_error("not enough data to read %s" % self.type_)
else: else:
@ -228,6 +234,27 @@ class HexOverwriteChar(Method):
while w.cursor_char().isspace() and w.cursor < end: while w.cursor_char().isspace() and w.cursor < end:
w.forward() w.forward()
class ShowX86Instruction(Method):
''''''
size_re = re.compile(r'X86 insn \((\d+) bytes\):')
def _execute(self, w, **vargs):
disinst = w.application.config.get('hex.disinst')
(cx, cy) = w.cursor.xy()
ix = w.buffer.cursorx_to_datax(cy, cx)
data = w.mode.read_data(cy, ix, 13)
data = ''.join(['%02x' % ord(c) for c in data])
try:
p = Popen((disinst, data), stdout=PIPE, stderr=STDOUT)
lines = [l.strip() for l in p.stdout.readlines()]
result = p.wait()
m = self.size_re.match(lines[0])
assert m
size = int(m.group(1))
data = data[:size]
w.set_error("%s %s" % (data, lines[1]))
except Exception, e:
w.set_error("there was an error")
class GotoAddress(Method): class GotoAddress(Method):
'''Jump to the specified line number''' '''Jump to the specified line number'''
args = [Argument("address", type=type(0), prompt="Goto address: ")] args = [Argument("address", type=type(0), prompt="Goto address: ")]
@ -241,6 +268,7 @@ class GotoAddress(Method):
cy = addr // (b.groupsize * b.numgroups) cy = addr // (b.groupsize * b.numgroups)
w.goto(Point(cx, cy)) w.goto(Point(cx, cy))
w.set_error("Goto 0x%08x (%r, %r)" % (addr, cx, cy)) w.set_error("Goto 0x%08x (%r, %r)" % (addr, cx, cy))
class ShowAddress(Method): class ShowAddress(Method):
'''Show the cursor's address in the current buffer''' '''Show the cursor's address in the current buffer'''
def _execute(self, w, **vargs): def _execute(self, w, **vargs):