diff --git a/linux-ramdump-parser-v2/parser_util.py b/linux-ramdump-parser-v2/parser_util.py index ae2449b31156740f6911cd3b3713696be84e554e..040f37418e116da83abeade63978f4d05c4ce20c 100644 --- a/linux-ramdump-parser-v2/parser_util.py +++ b/linux-ramdump-parser-v2/parser_util.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013, The Linux Foundation. All rights reserved. +# Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 and @@ -14,6 +14,7 @@ import platform import glob import re import string +import sys _parsers = [] @@ -160,3 +161,47 @@ def get_system_type(): return 'Linux' if plat == 'Darwin': return 'Darwin' + +def _get_printable(n, fillchar='.'): + if n is None: + return + c = chr(n) + if c in string.printable[:string.printable.index(' ') + 1]: + return c + return fillchar + +def _xxd_line(addr, data): + printable = [_get_printable(d) for d in data] + data = ['{:02x}'.format(d) for d in data] + printable += [' '] * (16 - len(printable)) + data += [' '] * (16 - len(data)) + return "{:08x}: {:}{:} {:}{:} {:}{:} {:}{:} {:}{:} {:}{:} {:}{:} {:}{:} {:}{:}{:}{:}{:}{:}{:}{:}{:}{:}{:}{:}{:}{:}{:}{:}\n".format( + addr, *(data + printable) + ) + +def xxd(address, data, file_object=None): + """Dumps data to stdout, in the format of `xxd'. data should be a list + of integers. + + >>> xxd(0x1000, [0xde, 0xad, 0xbe, 0xef, 112, 105, 122, 122, 97, 0, 0, 42, 43, 44, 45, 90]) + 00001000: dead beef 7069 7a7a 6100 002a 2b2c 2d5a ....pizza..*+,-Z + + """ + f = file_object or sys.stdout + bb = [] + n = 0 + for i in data: + bb.append(i) + if n == 15: + f.write(_xxd_line(address, bb)) + bb = [] + n = 0 + address += 16 + else: + n += 1 + if len(bb): + f.write(_xxd_line(address, bb)) + +if __name__ == "__main__": + import doctest + doctest.testmod() diff --git a/linux-ramdump-parser-v2/ramdump.py b/linux-ramdump-parser-v2/ramdump.py index a24d364ca00b3c8ee945ae96e832810f458c0106..8410eff25ca39f2c1bf1c00d090e3efc3da8704d 100644 --- a/linux-ramdump-parser-v2/ramdump.py +++ b/linux-ramdump-parser-v2/ramdump.py @@ -22,7 +22,7 @@ from tempfile import NamedTemporaryFile import gdbmi from print_out import print_out_str from mmu import Armv7MMU, Armv7LPAEMMU, Armv8MMU -from parser_util import cleanupString +import parser_util FP = 11 SP = 13 @@ -975,7 +975,7 @@ class RamDump(): ebi[0].seek(offset) a = ebi[0].read(length) if trace: - print_out_str('result = {0}'.format(cleanupString(a))) + print_out_str('result = {0}'.format(parser_util.cleanupString(a))) print_out_str('lenght = {0}'.format(len(a))) return a @@ -1089,6 +1089,18 @@ class RamDump(): return None return struct.unpack(format_string, s) + def hexdump(self, address, length, virtual=True, file_object=None): + """Does a hexdump (in the format of `xxd'). `length' is in bytes. If + given, will write to `file_object', otherwise will write to + stdout. + + """ + parser_util.xxd( + address, + [self.read_byte(address + i, virtual=virtual) or 0 + for i in xrange(length)], + file_object=file_object) + def per_cpu_offset(self, cpu): per_cpu_offset_addr = self.addr_lookup('__per_cpu_offset') if per_cpu_offset_addr is None: