| #from imgtec import codescape | |
| import sys | |
| import time | |
| import os | |
| import gdb | |
| import Tkinter, tkFileDialog | |
| import ctypes | |
| import re | |
| #MD Side | |
| AP_REG_BASE=0xC0000000 | |
| MD_REG_BASE=0xA0000000 | |
| #AP side | |
| #AP_REG_BASE=0x10000000 | |
| #MD_REG_BASE=0x20000000 | |
| def memory_write( mem_addr, set_value ): | |
| gdb_cmd = 'set *' + str(mem_addr) + '=' + str(set_value) | |
| gdb.execute(gdb_cmd) | |
| def memory_read(mem_addr): | |
| gdb_cmd = 'x/x ' + str(mem_addr) | |
| mem_value = gdb.execute(gdb_cmd, to_string=True) | |
| mem_value = mem_value[12:23] | |
| hex_int = int(mem_value, 16) | |
| return hex_int | |
| def bus_dump_mem( file_name, start_addr, end_addr): | |
| gdb_cmds = [ | |
| 'monitor mips bus_read on', | |
| 'dump memory ' + str(file_name) + ' ' + str(start_addr) + ' ' + str(end_addr), | |
| 'monitor mips bus_read off' | |
| ] | |
| for cmd in gdb_cmds: | |
| retval = gdb.execute(cmd, to_string=True) | |
| def core_dump_mem( file_name, start_addr, end_addr): | |
| gdb_cmds = [ | |
| 'monitor mips bus_read off', | |
| 'dump binary memory ' + str(file_name) + ' ' + str(start_addr) + ' ' + str(end_addr), | |
| ] | |
| for cmd in gdb_cmds: | |
| retval = gdb.execute(cmd, to_string=True) | |
| def symbol_read(symbol): | |
| gdb_cmd = 'p ' + symbol | |
| mem_value = gdb.execute(gdb_cmd, to_string=True) | |
| return mem_value | |
| def dump_sys_mem(): | |
| result = symbol_read('SysMemoryInfo') | |
| # $2 = {16384, 4103412, 79691776, 0, ... } | |
| m = re.search(r'{(.+?)}', result) | |
| sys_mem_arr = m.group(1).split(',') | |
| print 'total regions: ', len(sys_mem_arr)/2 | |
| print sys_mem_arr | |
| for i in range(2, len(sys_mem_arr), 2): | |
| addr = int(sys_mem_arr[i],10) | |
| size = int(sys_mem_arr[i+1],10) | |
| print i,"start to dump", format(addr, '#010x'), format(size, '#x') | |
| if size != 0 and size != 0xFFFFFFFF: | |
| #seg_size = 102400 | |
| #for j in range(addr, addr+size-seg_size, seg_size): | |
| # print " start to dump segment", format(j, '#010x'), format(seg_size, '#x') | |
| # core_dump_mem('sys_mem_'+format(j, '#010x')+'.bin', j, j+seg_size) | |
| core_dump_mem('sys_mem_'+format(addr, '#010x')+'.bin', addr, addr+size) | |
| if __name__ == "__main__": | |
| print "=== Start Dump Mem ===" | |
| tStart = time.time() | |
| dump_sys_mem() | |
| tEnd = time.time() | |
| print "=== End Dump Mem ===" | |
| print "elapsed time %f sec" % (tEnd - tStart) | |
| # tStart = time.time() | |
| # bus_dump_mem('a.bin', 0x0, 0x2000) | |
| # tEnd = time.time() | |
| # print "bus_dump_mem cost %f sec" % (tEnd - tStart) | |
| # tStart = time.time() | |
| # core_dump_mem('b.bin', 0x0, 0x2000) | |
| # tEnd = time.time() | |
| # print "core_dump_mem cost %f sec" % (tEnd - tStart) | |
| # |