|
@@ -16,6 +16,7 @@ from linux import constants
|
|
from linux import utils
|
|
from linux import utils
|
|
from linux import tasks
|
|
from linux import tasks
|
|
from linux import lists
|
|
from linux import lists
|
|
|
|
+from struct import *
|
|
|
|
|
|
|
|
|
|
class LxCmdLine(gdb.Command):
|
|
class LxCmdLine(gdb.Command):
|
|
@@ -195,3 +196,75 @@ values of that process namespace"""
|
|
info_opts(MNT_INFO, m_flags)))
|
|
info_opts(MNT_INFO, m_flags)))
|
|
|
|
|
|
LxMounts()
|
|
LxMounts()
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+class LxFdtDump(gdb.Command):
|
|
|
|
+ """Output Flattened Device Tree header and dump FDT blob to the filename
|
|
|
|
+ specified as the command argument. Equivalent to
|
|
|
|
+ 'cat /proc/fdt > fdtdump.dtb' on a running target"""
|
|
|
|
+
|
|
|
|
+ def __init__(self):
|
|
|
|
+ super(LxFdtDump, self).__init__("lx-fdtdump", gdb.COMMAND_DATA,
|
|
|
|
+ gdb.COMPLETE_FILENAME)
|
|
|
|
+
|
|
|
|
+ def fdthdr_to_cpu(self, fdt_header):
|
|
|
|
+
|
|
|
|
+ fdt_header_be = ">IIIIIII"
|
|
|
|
+ fdt_header_le = "<IIIIIII"
|
|
|
|
+
|
|
|
|
+ if utils.get_target_endianness() == 1:
|
|
|
|
+ output_fmt = fdt_header_le
|
|
|
|
+ else:
|
|
|
|
+ output_fmt = fdt_header_be
|
|
|
|
+
|
|
|
|
+ return unpack(output_fmt, pack(fdt_header_be,
|
|
|
|
+ fdt_header['magic'],
|
|
|
|
+ fdt_header['totalsize'],
|
|
|
|
+ fdt_header['off_dt_struct'],
|
|
|
|
+ fdt_header['off_dt_strings'],
|
|
|
|
+ fdt_header['off_mem_rsvmap'],
|
|
|
|
+ fdt_header['version'],
|
|
|
|
+ fdt_header['last_comp_version']))
|
|
|
|
+
|
|
|
|
+ def invoke(self, arg, from_tty):
|
|
|
|
+
|
|
|
|
+ if not constants.LX_CONFIG_OF:
|
|
|
|
+ raise gdb.GdbError("Kernel not compiled with CONFIG_OF\n")
|
|
|
|
+
|
|
|
|
+ if len(arg) == 0:
|
|
|
|
+ filename = "fdtdump.dtb"
|
|
|
|
+ else:
|
|
|
|
+ filename = arg
|
|
|
|
+
|
|
|
|
+ py_fdt_header_ptr = gdb.parse_and_eval(
|
|
|
|
+ "(const struct fdt_header *) initial_boot_params")
|
|
|
|
+ py_fdt_header = py_fdt_header_ptr.dereference()
|
|
|
|
+
|
|
|
|
+ fdt_header = self.fdthdr_to_cpu(py_fdt_header)
|
|
|
|
+
|
|
|
|
+ if fdt_header[0] != constants.LX_OF_DT_HEADER:
|
|
|
|
+ raise gdb.GdbError("No flattened device tree magic found\n")
|
|
|
|
+
|
|
|
|
+ gdb.write("fdt_magic: 0x{:02X}\n".format(fdt_header[0]))
|
|
|
|
+ gdb.write("fdt_totalsize: 0x{:02X}\n".format(fdt_header[1]))
|
|
|
|
+ gdb.write("off_dt_struct: 0x{:02X}\n".format(fdt_header[2]))
|
|
|
|
+ gdb.write("off_dt_strings: 0x{:02X}\n".format(fdt_header[3]))
|
|
|
|
+ gdb.write("off_mem_rsvmap: 0x{:02X}\n".format(fdt_header[4]))
|
|
|
|
+ gdb.write("version: {}\n".format(fdt_header[5]))
|
|
|
|
+ gdb.write("last_comp_version: {}\n".format(fdt_header[6]))
|
|
|
|
+
|
|
|
|
+ inf = gdb.inferiors()[0]
|
|
|
|
+ fdt_buf = utils.read_memoryview(inf, py_fdt_header_ptr,
|
|
|
|
+ fdt_header[1]).tobytes()
|
|
|
|
+
|
|
|
|
+ try:
|
|
|
|
+ f = open(filename, 'wb')
|
|
|
|
+ except:
|
|
|
|
+ raise gdb.GdbError("Could not open file to dump fdt")
|
|
|
|
+
|
|
|
|
+ f.write(fdt_buf)
|
|
|
|
+ f.close()
|
|
|
|
+
|
|
|
|
+ gdb.write("Dumped fdt blob to " + filename + "\n")
|
|
|
|
+
|
|
|
|
+LxFdtDump()
|